ZGlmZiAtLWdpdCBhL0RvYy9BQ0tTIGIvRG9jL0FDS1MKaW5kZXggYmJiMzI0MS4uM2MyNjYyZCAxMDA2NDQKLS0tIGEvRG9jL0FDS1MKKysrIGIvRG9jL0FDS1MKQEAgLTE5MCw2ICsxOTAsNyBAQAogTWF0cyBXaWNobWFubgogR2VycnkgV2llbmVyCiBUaW1vdGh5IFdpbGQKK0NvbGxpbiBXaW50ZXIKIEJsYWtlIFdpbnRvbgogRGFuIFdvbGZlCiBTdGV2ZW4gV29yawpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlIGIvRG9jL01ha2VmaWxlCmluZGV4IDBkMzkxYWYuLmE0MzVmMTEgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZQorKysgYi9Eb2MvTWFrZWZpbGUKQEAgLTY5MSw3ICs2OTEsNyBAQAogIyBUaGUgc21hbGwgYW1vdW50IG9mIGFkZGl0aW9uYWwgd29yayBpcyBhIHNtYWxsIHByaWNlIHRvIHBheSBmb3Igbm90CiAjIGhhdmluZyB0byByZW1lbWJlciB3aGljaCBvcmRlciB0byBkbyBpdCBpbi4gOykKIHBhcGVyZGlzdDoJZGlzdHBkZiBkaXN0cHMgcGtnbGlzdAotZWRpc3Q6CQlkaXN0aHRtbCBkaXN0aW5mbyB6aXBpc2lsbyBwa2dsaXN0CitlZGlzdDoJCWRpc3RodG1sIHBrZ2xpc3QKIAogIyBUaGUgcGtnbGlzdC5odG1sIGZpbGUgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBkb3dubG9hZC5odG1sIHBhZ2Ugb24KICMgcHl0aG9uLm9yZzsgaXQgaXMgbm90IHVzZWQgYXMgaW50ZXJtZWRpYXRlIGlucHV0IGhlcmUgb3IgYXMgcGFydCBvZgpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlLmRlcHMgYi9Eb2MvTWFrZWZpbGUuZGVwcwppbmRleCAyZmMzMjUwLi5mODI4ZTFiIDEwMDY0NAotLS0gYS9Eb2MvTWFrZWZpbGUuZGVwcworKysgYi9Eb2MvTWFrZWZpbGUuZGVwcwpAQCAtMjcwLDYgKzI3MCw3IEBACiAJbGliL3htbHNheGhhbmRsZXIudGV4IFwKIAlsaWIveG1sc2F4dXRpbHMudGV4IFwKIAlsaWIveG1sc2F4cmVhZGVyLnRleCBcCisJbGliL2xpYmV0cmVlLnRleCBcCiAJbGliL2xpYnF1ZXVlLnRleCBcCiAJbGliL2xpYmxvY2FsZS50ZXggXAogCWxpYi9saWJnZXR0ZXh0LnRleCBcCmRpZmYgLS1naXQgYS9Eb2MvYXBpL2FwaS50ZXggYi9Eb2MvYXBpL2FwaS50ZXgKaW5kZXggNmZhOGM0MS4uY2YyOGY1YiAxMDA2NDQKLS0tIGEvRG9jL2FwaS9hcGkudGV4CisrKyBiL0RvYy9hcGkvYXBpLnRleApAQCAtNDgsMTEgKzQ4LDYgQEAKIFxpbnB1dHtuZXd0eXBlc30KIAogCi0lIFxjaGFwdGVye0RlYnVnZ2luZyBcbGFiZWx7ZGVidWdnaW5nfX0KLSUKLSUgWFhYIEV4cGxhaW4gUHlfREVCVUcsIFB5X1RSQUNFX1JFRlMsIFB5X1JFRl9ERUJVRy4KLQotCiBcYXBwZW5kaXgKIFxjaGFwdGVye1JlcG9ydGluZyBCdWdzfQogXGlucHV0e3JlcG9ydGluZ2J1Z3N9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2NvbmNyZXRlLnRleCBiL0RvYy9hcGkvY29uY3JldGUudGV4CmluZGV4IDEwMjQ3YWIuLjRjNzQ4N2MgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvY29uY3JldGUudGV4CisrKyBiL0RvYy9hcGkvY29uY3JldGUudGV4CkBAIC0zMSw3ICszMSw3IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlPYmplY3QqfXtQeVR5cGVfVHlwZX0KICAgVGhpcyBpcyB0aGUgdHlwZSBvYmplY3QgZm9yIHR5cGUgb2JqZWN0czsgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzCi0gIFxjb2Rle3R5cGVzLlR5cGVUeXBlfSBpbiB0aGUgUHl0aG9uIGxheWVyLgorICBcY29kZXt0eXBlfSBhbmQgXGNvZGV7dHlwZXMuVHlwZVR5cGV9IGluIHRoZSBQeXRob24gbGF5ZXIuCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHlwZVR5cGV9fQogXGVuZHtjdmFyZGVzY30KIApAQCAtMTE3LDcgKzExNyw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUludF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBwbGFpbgotICBpbnRlZ2VyIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5JbnRUeXBlfS4KKyAgaW50ZWdlciB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7aW50fSBhbmQKKyAgXGNvZGV7dHlwZXMuSW50VHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0ludFR5cGV9fQogXGVuZHtjdmFyZGVzY30KIApAQCAtMjYwLDcgKzI2MSw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUxvbmdfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gbG9uZwotICBpbnRlZ2VyIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5Mb25nVHlwZX0uCisgIGludGVnZXIgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle2xvbmd9IGFuZAorICBcY29kZXt0eXBlcy5Mb25nVHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0xvbmdUeXBlfX0KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTM3Niw3ICszNzgsNyBAQAogICBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7Y2Z1bmNkZXNjfQogCi1cYmVnaW57Y2Z1bmNkZXNjfXt1bnNpZ25lZCBsb25nfXtQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFza317UHlPYmplY3QgKmlvfQorXGJlZ2lue2NmdW5jZGVzY317dW5zaWduZWQgUFlfTE9OR19MT05HfXtQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFza317UHlPYmplY3QgKmlvfQogICBSZXR1cm4gYSBDIFxjdHlwZXt1bnNpZ25lZCBsb25nIGxvbmd9IGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLCB3aXRob3V0CiAgIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KICAgXHZlcnNpb25hZGRlZHsyLjN9CkBAIC00MTEsNyArNDEzLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5RmxvYXRfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gZmxvYXRpbmcKLSAgcG9pbnQgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle3R5cGVzLkZsb2F0VHlwZX0uCisgIHBvaW50IHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtmbG9hdH0gYW5kCisgIFxjb2Rle3R5cGVzLkZsb2F0VHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0Zsb2F0VHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCkBAIC01MjAsNyArNTIzLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5Q29tcGxleF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBjb21wbGV4Ci0gIG51bWJlciB0eXBlLgorICBudW1iZXIgdHlwZS4gSXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle2NvbXBsZXh9IGFuZAorICBcY29kZXt0eXBlcy5Db21wbGV4VHlwZX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5Q29tcGxleF9DaGVja317UHlPYmplY3QgKnB9CkBAIC01ODAsOCArNTg0LDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5U3RyaW5nX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIHN0cmluZwotICB0eXBlOyBpdCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7dHlwZXMuVHlwZVR5cGV9IGluIHRoZSBQeXRob24KLSAgbGF5ZXIuCisgIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtzdHJ9IGFuZCBcY29kZXt0eXBlcy5TdHJpbmdUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e1N0cmluZ1R5cGV9fS4KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTg1MCw3ICs4NTQsOCBAQAogCiBcYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlVbmljb2RlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIFVuaWNvZGUKLSAgdHlwZS4KKyAgdHlwZS4gIEl0IGlzIGV4cG9zZWQgdG8gUHl0aG9uIGNvZGUgYXMgXGNvZGV7dW5pY29kZX0gYW5kCisgIFxjb2Rle3R5cGVzLlVuaWNvZGVUeXBlfS4KIFxlbmR7Y3ZhcmRlc2N9CiAKIFRoZSBmb2xsb3dpbmcgQVBJcyBhcmUgcmVhbGx5IEMgbWFjcm9zIGFuZCBjYW4gYmUgdXNlZCB0byBkbyBmYXN0CkBAIC0xMDAxLDIxICsxMDA2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9CiAgIENvZXJjZSBhbiBlbmNvZGVkIG9iamVjdCBcdmFye29ian0gdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhCiAgIHJlZmVyZW5jZSB3aXRoIGluY3JlbWVudGVkIHJlZmNvdW50LgorICAKKyAgU3RyaW5nIGFuZCBvdGhlciBjaGFyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgYXJlIGRlY29kZWQKKyAgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nCisgIGRlZmluZWQgYnkgZXJyb3JzLiAgQm90aCBjYW4gYmUgXE5VTEx7fSB0byBoYXZlIHRoZSBpbnRlcmZhY2UKKyAgdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyAoc2VlIHRoZSBuZXh0IHNlY3Rpb24gZm9yIGRldGFpbHMpLgogCi0gIENvZXJjaW9uIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSAgVW5pY29kZSBvYmplY3RzIGFyZSBwYXNzZWQgYmFjayBhcy1pcyB3aXRoIGluY3JlbWVudGVkCi0gICAgICAgcmVmY291bnQuIFxub3Rle1RoZXNlIGNhbm5vdCBiZSBkZWNvZGVkOyBwYXNzaW5nIGEgbm9uLVxOVUxMe30KLSAgICAgICB2YWx1ZSBmb3IgZW5jb2Rpbmcgd2lsbCByZXN1bHQgaW4gYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0ufQotCi1caXRlbSBTdHJpbmcgYW5kIG90aGVyIGNoYXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgZGVjb2RlZAotICAgICAgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nCi0gICAgICBkZWZpbmVkIGJ5IGVycm9ycy4gIEJvdGggY2FuIGJlIFxOVUxMe30gdG8gaGF2ZSB0aGUgaW50ZXJmYWNlCi0gICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIChzZWUgdGhlIG5leHQgc2VjdGlvbiBmb3IgZGV0YWlscykuCi0KLVxpdGVtIEFsbCBvdGhlciBvYmplY3RzIGNhdXNlIGFuIGV4Y2VwdGlvbi4KLVxlbmR7ZW51bWVyYXRlfQorICBBbGwgb3RoZXIgb2JqZWN0cywgaW5jbHVkaW5nIFVuaWNvZGUgb2JqZWN0cywgY2F1c2UgYQorICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gdG8gYmUgc2V0LgogCiAgIFRoZSBBUEkgcmV0dXJucyBcTlVMTHt9IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gIFRoZSBjYWxsZXIgaXMKICAgcmVzcG9uc2libGUgZm9yIGRlY3JlZidpbmcgdGhlIHJldHVybmVkIG9iamVjdHMuCkBAIC0xNDMxLDYgKzE0MjksMTggQEAKICAgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIFxlbmR7Y2Z1bmNkZXNjfQogCitcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWx9e2NvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3VtZWR9CisgIElmIFx2YXJ7Y29uc3VtZWR9IGlzIFxOVUxMe30sIGJlaGF2ZSBsaWtlCisgIFxjZnVuY3Rpb257UHlVbmljb2RlX0RlY29kZU1CQ1MoKX0uIElmIFx2YXJ7Y29uc3VtZWR9IGlzIG5vdCBcTlVMTHt9LAorICBcY2Z1bmN0aW9ue1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwoKX0gd2lsbCBub3QgZGVjb2RlIHRyYWlsaW5nIGxlYWQKKyAgYnl0ZSBhbmQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluCisgIFx2YXJ7Y29uc3VtZWR9LgorICBcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2Z1bmNkZXNjfQorCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVNQkNTfXtjb25zdCBQeV9VTklDT0RFICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KQEAgLTE2MTgsOCArMTYyOCw5IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUJ1ZmZlcl9UeXBlfQogICBUaGUgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gd2hpY2ggcmVwcmVzZW50cyB0aGUgUHl0aG9uCi0gIGJ1ZmZlciB0eXBlOyBpdCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7dHlwZXMuQnVmZmVyVHlwZX0gaW4gdGhlCi0gIFB5dGhvbiBsYXllci5cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e0J1ZmZlclR5cGV9fS4KKyAgYnVmZmVyIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtidWZmZXJ9IGFuZCAKKyAgXGNvZGV7dHlwZXMuQnVmZmVyVHlwZX0gaW4gdGhlIFB5dGhvbiBsYXllci4KKyAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtCdWZmZXJUeXBlfX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y3ZhcmRlc2N9e2ludH17UHlfRU5EX09GX0JVRkZFUn0KQEAgLTE2OTMsOCArMTcwNCw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVR1cGxlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIHR1cGxlCi0gIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5UdXBsZVR5cGV9IGluIHRoZSBQeXRob24KLSAgbGF5ZXIuXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtUdXBsZVR5cGV9fS4KKyAgdHlwZTsgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle3R1cGxlfSBhbmQgXGNvZGV7dHlwZXMuVHVwbGVUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLlx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHVwbGVUeXBlfX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHVwbGVfQ2hlY2t9e1B5T2JqZWN0ICpwfQpAQCAtMTc5MCw4ICsxODAxLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5TGlzdF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBsaXN0Ci0gIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5MaXN0VHlwZX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7TGlzdFR5cGV9fQorICB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7bGlzdH0gYW5kIFxjb2Rle3R5cGVzLkxpc3RUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLlx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7TGlzdFR5cGV9fQogXGVuZHtjdmFyZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUxpc3RfQ2hlY2t9e1B5T2JqZWN0ICpwfQpAQCAtMTkxOSw3ICsxOTMwLDcgQEAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeURpY3RfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24KICAgZGljdGlvbmFyeSB0eXBlLiAgVGhpcyBpcyBleHBvc2VkIHRvIFB5dGhvbiBwcm9ncmFtcyBhcwotICBcY29kZXt0eXBlcy5EaWN0VHlwZX0gYW5kIFxjb2Rle3R5cGVzLkRpY3Rpb25hcnlUeXBlfS4KKyAgXGNvZGV7ZGljdH0gYW5kIFxjb2Rle3R5cGVzLkRpY3RUeXBlfS4KICAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtEaWN0VHlwZX1cdHRpbmRleHtEaWN0aW9uYXJ5VHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCkBAIC0yMTM0LDcgKzIxNDUsOCBAQAogCiBcYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlGaWxlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIGZpbGUKLSAgdHlwZS4gIFRoaXMgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgXGNvZGV7dHlwZXMuRmlsZVR5cGV9LgorICB0eXBlLiAgVGhpcyBpcyBleHBvc2VkIHRvIFB5dGhvbiBwcm9ncmFtcyBhcyBcY29kZXtmaWxlfSBhbmQKKyAgXGNvZGV7dHlwZXMuRmlsZVR5cGV9LgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e0ZpbGVUeXBlfX0KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTI1ODMsNyArMjU5NSw3IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVNsaWNlX1R5cGV9CiAgIFRoZSB0eXBlIG9iamVjdCBmb3Igc2xpY2Ugb2JqZWN0cy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKLSAgXGNvZGV7dHlwZXMuU2xpY2VUeXBlfS4KKyAgXGNvZGV7c2xpY2V9IGFuZCBcY29kZXt0eXBlcy5TbGljZVR5cGV9LgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e1NsaWNlVHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCmRpZmYgLS1naXQgYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4IGIvRG9jL2FwaS9leGNlcHRpb25zLnRleAppbmRleCA2ZGJlODE4Li4yYTlkYjU0IDEwMDY0NAotLS0gYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4CisrKyBiL0RvYy9hcGkvZXhjZXB0aW9ucy50ZXgKQEAgLTI1NiwxMCArMjU2LDE0IEBACiAgIGFyZ3VtZW50LiAgSXQgaXMgbW9zdGx5IGZvciBpbnRlcm5hbCB1c2UuCiBcZW5ke2NmdW5jZGVzY30KIAotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUVycl9XYXJufXtQeU9iamVjdCAqY2F0ZWdvcnksIGNoYXIgKm1lc3NhZ2V9CitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX1dhcm5FeH17UHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICptZXNzYWdlLCBpbnQgc3RhY2tsZXZlbH0KICAgSXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgXHZhcntjYXRlZ29yeX0gYXJndW1lbnQgaXMgYSB3YXJuaW5nCiAgIGNhdGVnb3J5IChzZWUgYmVsb3cpIG9yIFxOVUxMOyB0aGUgXHZhcnttZXNzYWdlfSBhcmd1bWVudCBpcyBhCi0gIG1lc3NhZ2Ugc3RyaW5nLgorICBtZXNzYWdlIHN0cmluZy4gIFx2YXJ7c3RhY2tsZXZlbH0gaXMgYSBwb3NpdGl2ZSBudW1iZXIgZ2l2aW5nIGEKKyAgbnVtYmVyIG9mIHN0YWNrIGZyYW1lczsgdGhlIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgZnJvbSB0aGUgCisgIGN1cnJlbnRseSBleGVjdXRpbmcgbGluZSBvZiBjb2RlIGluIHRoYXQgc3RhY2sgZnJhbWUuICBBIFx2YXJ7c3RhY2tsZXZlbH0KKyAgb2YgMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyAKKyAgdGhlIGZ1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4KIAogICBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSB0byBcdmFye3N5cy5zdGRlcnJ9OwogICBob3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0CkBAIC0yOTEsNiArMjk1LDE2IEBACiAgIGNvbW1hbmQgbGluZSBkb2N1bWVudGF0aW9uLiAgVGhlcmUgaXMgbm8gQyBBUEkgZm9yIHdhcm5pbmcgY29udHJvbC4KIFxlbmR7Y2Z1bmNkZXNjfQogCitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX1dhcm59e1B5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZX0KKyAgSXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgXHZhcntjYXRlZ29yeX0gYXJndW1lbnQgaXMgYSB3YXJuaW5nCisgIGNhdGVnb3J5IChzZWUgYmVsb3cpIG9yIFxOVUxMOyB0aGUgXHZhcnttZXNzYWdlfSBhcmd1bWVudCBpcyBhCisgIG1lc3NhZ2Ugc3RyaW5nLiAgVGhlIHdhcm5pbmcgd2lsbCBhcHBlYXIgdG8gYmUgaXNzdWVkIGZyb20gdGhlIGZ1bmN0aW9uCisgIGNhbGxpbmcgXGNmdW5jdGlvbntQeUVycl9XYXJuKCl9LCBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgXGNmdW5jdGlvbntQeUVycl9XYXJuRXgoKX0gd2l0aCBhIFx2YXJ7c3RhY2tsZXZlbH0gb2YgMS4KKyAgCisgIERlcHJlY2F0ZWQ7IHVzZSBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSBpbnN0ZWFkLgorXGVuZHtjZnVuY2Rlc2N9CisKIFxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlFcnJfV2FybkV4cGxpY2l0fXtQeU9iamVjdCAqY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnl9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2ludHJvLnRleCBiL0RvYy9hcGkvaW50cm8udGV4CmluZGV4IDk2ZjE4ZWMuLmMyYzNmZWMgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvaW50cm8udGV4CisrKyBiL0RvYy9hcGkvaW50cm8udGV4CkBAIC01NzcsMyArNTc3LDU5IEBACiBOb3RpY2UgdGhhdCBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplfSBkb2VzIFxlbXBoe25vdH0gZnJlZSBhbGwgbWVtb3J5CiBhbGxvY2F0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgZS5nLiBtZW1vcnkgYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbgogbW9kdWxlcyBjdXJyZW50bHkgY2Fubm90IGJlIHJlbGVhc2VkLgorCisKK1xzZWN0aW9ue0RlYnVnZ2luZyBCdWlsZHMgXGxhYmVse2RlYnVnZ2luZ319CisKK1B5dGhvbiBjYW4gYmUgYnVpbHQgd2l0aCBzZXZlcmFsIG1hY3JvcyB0byBlbmFibGUgZXh0cmEgY2hlY2tzIG9mIHRoZQoraW50ZXJwcmV0ZXIgYW5kIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhlc2UgY2hlY2tzIHRlbmQgdG8gYWRkIGEgbGFyZ2UKK2Ftb3VudCBvZiBvdmVyaGVhZCB0byB0aGUgcnVudGltZSBzbyB0aGV5IGFyZSBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCitBIGZ1bGwgbGlzdCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBkZWJ1Z2dpbmcgYnVpbGRzIGlzIGluIHRoZSBmaWxlCitcZmlsZXtNaXNjL1NwZWNpYWxCdWlsZHMudHh0fSBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uCitCdWlsZHMgYXJlIGF2YWlsYWJsZSB0aGF0IHN1cHBvcnQgdHJhY2luZyBvZiByZWZlcmVuY2UgY291bnRzLAorZGVidWdnaW5nIHRoZSBtZW1vcnkgYWxsb2NhdG9yLCBvciBsb3ctbGV2ZWwgcHJvZmlsaW5nIG9mIHRoZSBtYWluCitpbnRlcnByZXRlciBsb29wLiAgT25seSB0aGUgbW9zdCBmcmVxdWVudGx5LXVzZWQgYnVpbGRzIHdpbGwgYmUKK2Rlc2NyaWJlZCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgc2VjdGlvbi4KKworQ29tcGlsaW5nIHRoZSBpbnRlcnByZXRlciB3aXRoIHRoZSBcY3NpbXBsZW1hY3Jve1B5X0RFQlVHfSBtYWNybworZGVmaW5lZCBwcm9kdWNlcyB3aGF0IGlzIGdlbmVyYWxseSBtZWFudCBieSAiYSBkZWJ1ZyBidWlsZCIgb2YgUHl0aG9uLgorXGNzaW1wbGVtYWNyb3tQeV9ERUJVR30gaXMgZW5hYmxlZCBpbiB0aGUgXFVOSVh7fSBidWlsZCBieSBhZGRpbmcKK1xsb25ncHJvZ3JhbW9wdHt3aXRoLXB5ZGVidWd9IHRvIHRoZSBcZmlsZXtjb25maWd1cmV9IGNvbW1hbmQuICBJdCBpcyBhbHNvCitpbXBsaWVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgbm90LVB5dGhvbi1zcGVjaWZpYworXGNzaW1wbGVtYWNyb3tfREVCVUd9IG1hY3JvLiAgV2hlbiBcY3NpbXBsZW1hY3Jve1B5X0RFQlVHfSBpcyBlbmFibGVkCitpbiB0aGUgXFVOSVh7fSBidWlsZCwgY29tcGlsZXIgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcmVmZXJlbmNlIGNvdW50IGRlYnVnZ2luZyBkZXNjcmliZWQgYmVsb3csIHRoZQorZm9sbG93aW5nIGV4dHJhIGNoZWNrcyBhcmUgcGVyZm9ybWVkOgorCitcYmVnaW57aXRlbWl6ZX0KKyAgICAgIFxpdGVtIEV4dHJhIGNoZWNrcyBhcmUgYWRkZWQgdG8gdGhlIG9iamVjdCBhbGxvY2F0b3IuCisgICAgICBcaXRlbSBFeHRyYSBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBwYXJzZXIgYW5kIGNvbXBpbGVyLgorICAgICAgXGl0ZW0gRG93bmNhc3RzIGZyb20gd2lkZSB0eXBlcyB0byBuYXJyb3cgdHlwZXMgYXJlIGNoZWNrZWQgZm9yCisgICAgICAgICAgICBsb3NzIG9mIGluZm9ybWF0aW9uLgorICAgICAgXGl0ZW0gQSBudW1iZXIgb2YgYXNzZXJ0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgYW5kIHNldAorICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLiAgSW4gYWRkaXRpb24sIHRoZSBzZXQgb2JqZWN0IGFjcXVpcmVzIGEKKyAgICAgICAgICAgIFxtZXRob2R7dGVzdF9jX2FwaX0gbWV0aG9kLgorICAgICAgXGl0ZW0gU2FuaXR5IGNoZWNrcyBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIGFyZSBhZGRlZCB0byBmcmFtZQorICAgICAgICAgICAgY3JlYXRpb24uIAorICAgICAgXGl0ZW0gVGhlIHN0b3JhZ2UgZm9yIGxvbmcgaW50cyBpcyBpbml0aWFsaXplZCB3aXRoIGEga25vd24KKyAgICAgICAgICAgIGludmFsaWQgcGF0dGVybiB0byBjYXRjaCByZWZlcmVuY2UgdG8gdW5pbml0aWFsaXplZAorICAgICAgICAgICAgZGlnaXRzLiAKKyAgICAgIFxpdGVtIExvdy1sZXZlbCB0cmFjaW5nIGFuZCBleHRyYSBleGNlcHRpb24gY2hlY2tpbmcgYXJlIGFkZGVkCisgICAgICAgICAgICB0byB0aGUgcnVudGltZSB2aXJ0dWFsIG1hY2hpbmUuCisgICAgICBcaXRlbSBFeHRyYSBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBtZW1vcnkgYXJlbmEgaW1wbGVtZW50YXRpb24uCisgICAgICBcaXRlbSBFeHRyYSBkZWJ1Z2dpbmcgaXMgYWRkZWQgdG8gdGhlIHRocmVhZCBtb2R1bGUuCitcZW5ke2l0ZW1pemV9CisKK1RoZXJlIG1heSBiZSBhZGRpdGlvbmFsIGNoZWNrcyBub3QgbWVudGlvbmVkIGhlcmUuCisKK0RlZmluaW5nIFxjc2ltcGxlbWFjcm97UHlfVFJBQ0VfUkVGU30gZW5hYmxlcyByZWZlcmVuY2UgdHJhY2luZy4gIFdoZW4KK2RlZmluZWQsIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBvYmplY3RzIGlzIG1haW50YWluZWQKK2J5IGFkZGluZyB0d28gZXh0cmEgZmllbGRzIHRvIGV2ZXJ5IFxjdHlwZXtQeU9iamVjdH0uICBUb3RhbAorYWxsb2NhdGlvbnMgYXJlIHRyYWNrZWQgYXMgd2VsbC4gIFVwb24gZXhpdCwgYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMKK2FyZSBwcmludGVkLiAgKEluIGludGVyYWN0aXZlIG1vZGUgdGhpcyBoYXBwZW5zIGFmdGVyIGV2ZXJ5IHN0YXRlbWVudAorcnVuIGJ5IHRoZSBpbnRlcnByZXRlci4pICBJbXBsaWVkIGJ5IFxjc2ltcGxlbWFjcm97UHlfREVCVUd9LgorCitQbGVhc2UgcmVmZXIgdG8gXGZpbGV7TWlzYy9TcGVjaWFsQnVpbGRzLnR4dH0gaW4gdGhlIFB5dGhvbiBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvcmVmY291bnRzLmRhdCBiL0RvYy9hcGkvcmVmY291bnRzLmRhdAppbmRleCBhYjZkODY1Li5iOGFhYWQ1IDEwMDY0NAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2FwaS9yZWZjb3VudHMuZGF0CkBAIC0zMDMsNiArMzAzLDExIEBACiBQeUVycl9XYXJuOlB5T2JqZWN0KjpjYXRlZ29yeTowOgogUHlFcnJfV2FybjpjaGFyKjptZXNzYWdlOjoKIAorUHlFcnJfV2FybkV4OmludDo6OgorUHlFcnJfV2FybkV4OlB5T2JqZWN0KjpjYXRlZ29yeTowOgorUHlFcnJfV2FybkV4OmNvbnN0IGNoYXIqOm1lc3NhZ2U6OgorUHlFcnJfV2FybkV4OlB5X3NzaXplX3Q6c3RhY2tfbGV2ZWw6OgorCiBQeUV2YWxfQWNxdWlyZUxvY2s6dm9pZDo6OgogCiBQeUV2YWxfQWNxdWlyZVRocmVhZDp2b2lkOjo6CmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleCBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CmluZGV4IGI0YzlmNDguLjk3NDk0MzIgMTAwNjQ0Ci0tLSBhL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CisrKyBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CkBAIC01LDUgKzUsNSBAQAogCUVtYWlsOiBcZW1haWx7ZG9jc0BweXRob24ub3JnfQogfQogCi1cZGF0ZXtcdG9kYXl9CQkJJSBYWFggdXBkYXRlIGJlZm9yZSBmaW5hbCByZWxlYXNlIQorXGRhdGV7M3JkIEF1Z3VzdCwgMjAwNn0JCQklIFhYWCB1cGRhdGUgYmVmb3JlIGZpbmFsIHJlbGVhc2UhCiBcaW5wdXR7cGF0Y2hsZXZlbH0JCSUgaW5jbHVkZSBQeXRob24gdmVyc2lvbiBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3QvZGlzdC50ZXggYi9Eb2MvZGlzdC9kaXN0LnRleAppbmRleCBlOTVjMGQzLi5jMWI3MmFkIDEwMDY0NAotLS0gYS9Eb2MvZGlzdC9kaXN0LnRleAorKysgYi9Eb2MvZGlzdC9kaXN0LnRleApAQCAtNTMwLDcgKzUzMCw3IEBACiB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gYQogY29uc2lzdGVudCB3YXkgYnkgdGhlIERpc3R1dGlscyBcY29tbWFuZHtpbnN0YWxsXF9oZWFkZXJ9IGNvbW1hbmQuICBGb3IKIGV4YW1wbGUsIHRoZSBOdW1lcmljYWwgUHl0aG9uIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvbiBhIHN0YW5kYXJkCi1Vbml4IGluc3RhbGxhdGlvbikgdG8gXGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNS9OdW1lcmljYWx9LgorXFVOSVh7fSBpbnN0YWxsYXRpb24pIHRvIFxmaWxley91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjUvTnVtZXJpY2FsfS4KIChUaGUgZXhhY3QgbG9jYXRpb24gd2lsbCBkaWZmZXIgYWNjb3JkaW5nIHRvIHlvdXIgcGxhdGZvcm0gYW5kIFB5dGhvbgogaW5zdGFsbGF0aW9uLikgIFNpbmNlIHRoZSBQeXRob24gaW5jbHVkZQogZGlyZWN0b3J5LS0tXGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNX0gaW4gdGhpcyBjYXNlLS0taXMgYWx3YXlzCkBAIC0yMzE3LDcgKzIzMTcsNyBAQAogXGxpbmVpaWl7bmFtZX17dGhlIGZ1bGwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgYW55IHBhY2thZ2VzCiAtLS0gaWUuIFxlbXBoe25vdH0gYSBmaWxlbmFtZSBvciBwYXRobmFtZSwgYnV0IFB5dGhvbiBkb3R0ZWQgbmFtZX17c3RyaW5nfQogXGxpbmVpaWl7c291cmNlc317bGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzLCByZWxhdGl2ZSB0byB0aGUgZGlzdHJpYnV0aW9uCi1yb290ICh3aGVyZSB0aGUgc2V0dXAgc2NyaXB0IGxpdmVzKSwgaW4gVW5peCBmb3JtIChzbGFzaC1zZXBhcmF0ZWQpIGZvcgorcm9vdCAod2hlcmUgdGhlIHNldHVwIHNjcmlwdCBsaXZlcyksIGluIFxVTklYe30gZm9ybSAoc2xhc2gtc2VwYXJhdGVkKSBmb3IKIHBvcnRhYmlsaXR5LiBTb3VyY2UgZmlsZXMgbWF5IGJlIEMsIFxDcHAsIFNXSUcgKC5pKSwgcGxhdGZvcm0tc3BlY2lmaWMKIHJlc291cmNlIGZpbGVzLCBvciB3aGF0ZXZlciBlbHNlIGlzIHJlY29nbml6ZWQgYnkgdGhlIFxjb21tYW5ke2J1aWxkX2V4dH0KIGNvbW1hbmQgYXMgc291cmNlIGZvciBhIFB5dGhvbiBleHRlbnNpb24ufXtzdHJpbmd9CkBAIC0yODczLDkgKzI4NzMsMjAgQEAKIFxtb2R1bGVzeW5vcHNpc3tNaWNyb3NvZnQgQ29tcGlsZXJ9CiAKIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFxjbGFzc3tNU1ZDQ29tcGlsZXJ9LCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgCi1cY2xhc3N7Q0NvbXBpbGVyfSBjbGFzcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uIEl0IHNob3VsZCBhbHNvIHdvcmsgdXNpbmcKLXRoZSBmcmVlbHkgYXZhaWxhYmxlIGNvbXBpbGVyIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhlIC5OZXQgU0RLIGRvd25sb2FkLiBYWFgKLWRvd25sb2FkIGxpbmsuCitcY2xhc3N7Q0NvbXBpbGVyfSBjbGFzcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uIFR5cGljYWxseSwgZXh0ZW5zaW9uCittb2R1bGVzIG5lZWQgdG8gYmUgY29tcGlsZWQgd2l0aCB0aGUgc2FtZSBjb21waWxlciB0aGF0IHdhcyB1c2VkIHRvIGNvbXBpbGUKK1B5dGhvbi4gRm9yIFB5dGhvbiAyLjMgYW5kIGVhcmxpZXIsIHRoZSBjb21waWxlciB3YXMgVmlzdWFsIFN0dWRpbyA2LiBGb3IKK1B5dGhvbiAyLjQgYW5kIDIuNSwgdGhlIGNvbXBpbGVyIGlzIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzLiBUaGUgQU1ENjQKK2FuZCBJdGFuaXVtIGJpbmFyaWVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBQbGF0Zm9ybSBTREsuCisKK1xjbGFzc3tNU1ZDQ29tcGlsZXJ9IHdpbGwgbm9ybWFsbHkgY2hvb3NlIHRoZSByaWdodCBjb21waWxlciwgbGlua2VyIGV0Yy4KK29uIGl0cyBvd24uIFRvIG92ZXJyaWRlIHRoaXMgY2hvaWNlLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCitcdmFye0RJU1RVVElMU1xfVVNFXF9TREt9IGFuZCBcdmFye01TU2RrfSBtdXN0IGJlIGJvdGggc2V0LiBcdmFye01TU2RrfQoraW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gc2V0dXAgYnkgdGhlIFNESydzCitcY29kZXtTZXRFbnYuQ21kfSBzY3JpcHQsIG9yIHRoYXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYWQgYmVlbgorcmVnaXN0ZXJlZCB3aGVuIHRoZSBTREsgd2FzIGluc3RhbGxlZDsgXHZhcntESVNUVVRJTFNcX1VTRVxfU0RLfSBpbmRpY2F0ZXMKK3RoYXQgdGhlIGRpc3R1dGlscyB1c2VyIGhhcyBtYWRlIGFuIGV4cGxpY2l0IGNob2ljZSB0byBvdmVycmlkZSB0aGUKK2NvbXBpbGVyIHNlbGVjdGlvbiBieSBcY2xhc3N7TVNWQ0NvbXBpbGVyfS4KIAogXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuYmNwcGNvbXBpbGVyfSAtLS0gQm9ybGFuZCBDb21waWxlcn0KIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuYmNwcGNvbXBpbGVyfQpAQCAtMzA4OCw3ICszMDk5LDcgQEAKIE1vdmUgZmlsZSBcdmFye3NyY30gdG8gXHZhcntkc3R9LiBJZiBcdmFye2RzdH0gaXMgYSBkaXJlY3RvcnksIHRoZSBmaWxlIHdpbGwKIGJlIG1vdmVkIGludG8gaXQgd2l0aCB0aGUgc2FtZSBuYW1lOyBvdGhlcndpc2UsIFx2YXJ7c3JjfSBpcyBqdXN0IHJlbmFtZWQKIHRvIFx2YXJ7ZHN0fS4gIFJldHVybnMgdGhlIG5ldyBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuCi1cd2FybmluZ3tIYW5kbGVzIGNyb3NzLWRldmljZSBtb3ZlcyBvbiBVbml4IHVzaW5nIFxmdW5jdGlvbntjb3B5X2ZpbGUoKX0uICAKK1x3YXJuaW5ne0hhbmRsZXMgY3Jvc3MtZGV2aWNlIG1vdmVzIG9uIFxVTklYe30gdXNpbmcgXGZ1bmN0aW9ue2NvcHlfZmlsZSgpfS4gIAogV2hhdCBhYm91dCBvdGhlciBzeXN0ZW1zPz8/fQogXGVuZHtmdW5jZGVzY30KIApAQCAtMzEzMSw3ICszMTQyLDcgQEAKIFJldHVybiAncGF0aG5hbWUnIGFzIGEgbmFtZSB0aGF0IHdpbGwgd29yayBvbiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0sCiBpLmUuIHNwbGl0IGl0IG9uICcvJyBhbmQgcHV0IGl0IGJhY2sgdG9nZXRoZXIgYWdhaW4gdXNpbmcgdGhlIGN1cnJlbnQKIGRpcmVjdG9yeSBzZXBhcmF0b3IuICBOZWVkZWQgYmVjYXVzZSBmaWxlbmFtZXMgaW4gdGhlIHNldHVwIHNjcmlwdCBhcmUKLWFsd2F5cyBzdXBwbGllZCBpbiBVbml4IHN0eWxlLCBhbmQgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGxvY2FsCithbHdheXMgc3VwcGxpZWQgaW4gXFVOSVh7fSBzdHlsZSwgYW5kIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIHRoZSBsb2NhbAogY29udmVudGlvbiBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGVtIGluIHRoZSBmaWxlc3lzdGVtLiAgUmFpc2VzCiBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IG9uIG5vbi1cVU5JWC1pc2ggc3lzdGVtcyBpZiBcdmFye3BhdGhuYW1lfSBlaXRoZXIgCiBzdGFydHMgb3IgZW5kcyB3aXRoIGEgc2xhc2guCkBAIC0zMTgwLDcgKzMxOTEsNyBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdF9xdW90ZWR9e3N9Ci1TcGxpdCBhIHN0cmluZyB1cCBhY2NvcmRpbmcgdG8gVW5peCBzaGVsbC1saWtlIHJ1bGVzIGZvciBxdW90ZXMgYW5kCitTcGxpdCBhIHN0cmluZyB1cCBhY2NvcmRpbmcgdG8gXFVOSVh7fSBzaGVsbC1saWtlIHJ1bGVzIGZvciBxdW90ZXMgYW5kCiBiYWNrc2xhc2hlcy4gIEluIHNob3J0OiB3b3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHNwYWNlcywgYXMgbG9uZyBhcyB0aG9zZQogc3BhY2VzIGFyZSBub3QgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgb3IgaW5zaWRlIGEgcXVvdGVkIHN0cmluZy4KIFNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhcmUgZXF1aXZhbGVudCwgYW5kIHRoZSBxdW90ZSBjaGFyYWN0ZXJzIGNhbgpkaWZmIC0tZ2l0IGEvRG9jL2RvYy9kb2MudGV4IGIvRG9jL2RvYy9kb2MudGV4CmluZGV4IGU0YjkxYWMuLjFkMGYyNzkgMTAwNjQ0Ci0tLSBhL0RvYy9kb2MvZG9jLnRleAorKysgYi9Eb2MvZG9jL2RvYy50ZXgKQEAgLTE4Nyw2ICsxODcsMjAgQEAKICAgVG9waWNzIHdoaWNoIGFyZSBub3QgY292ZXJlZCBpbiB0aGUgQXBwbGUncyBzdHlsZSBndWlkZSB3aWxsIGJlCiAgIGRpc2N1c3NlZCBpbiB0aGlzIGRvY3VtZW50IGlmIG5lY2Vzc2FyeS4KIAorICBGb290bm90ZXMgYXJlIGdlbmVyYWxseSBkaXNjb3VyYWdlZCBkdWUgdG8gdGhlIHBhaW4gb2YgdXNpbmcKKyAgZm9vdG5vdGVzIGluIHRoZSBIVE1MIGNvbnZlcnNpb24gb2YgZG9jdW1lbnRzLiAgRm9vdG5vdGVzIG1heSBiZQorICB1c2VkIHdoZW4gdGhleSBhcmUgdGhlIGJlc3Qgd2F5IHRvIHByZXNlbnQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIFdoZW4gYSBmb290bm90ZSByZWZlcmVuY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2VudGVuY2UsIGl0CisgIHNob3VsZCBmb2xsb3cgdGhlIHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbi4gIFRoZSBcTGFUZVh7fSBtYXJrdXAKKyAgc2hvdWxkIGFwcGVhciBzb21ldGhpbmcgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19CitUaGlzIHNlbnRlbmNlIGhhcyBhIGZvb3Rub3RlIHJlZmVyZW5jZS4lCisgIFxmb290bm90ZXtUaGlzIGlzIHRoZSBmb290bm90ZSB0ZXh0Ln0KK1xlbmR7dmVyYmF0aW19CisKKyAgRm9vdG5vdGVzIG1heSBhcHBlYXIgaW4gdGhlIG1pZGRsZSBvZiBzZW50ZW5jZXMgd2hlcmUgYXBwcm9wcmlhdGUuCisKICAgTWFueSBzcGVjaWFsIG5hbWVzIGFyZSB1c2VkIGluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCiAgIHRoZSBuYW1lcyBvZiBvcGVyYXRpbmcgc3lzdGVtcywgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBzdGFuZGFyZHMKICAgYm9kaWVzLCBhbmQgdGhlIGxpa2UuICBNYW55IG9mIHRoZXNlIHdlcmUgYXNzaWduZWQgXExhVGVYe30gbWFjcm9zCkBAIC0yODEsMTAgKzI5NSwxMCBAQAogICAgIHRvIGtub3cgYWJvdXQgXExhVGVYe30gc3ludGF4LgogCiAgICAgQSBcZGZue2NvbW1lbnR9IGlzIHN0YXJ0ZWQgYnkgdGhlIGBgcGVyY2VudCcnIGNoYXJhY3RlcgotICAgIChcY2hhcmFjdGVye1wlfSkgYW5kIGNvbnRpbnVlcyB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIGxpbmUgYW5kIGFsbAotICAgIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiB0aGUgZm9sbG93aW5nIGxpbmUuICBUaGlzIGlzIGEgbGl0dGxlCi0gICAgZGlmZmVyZW50IGZyb20gYW55IHByb2dyYW1taW5nIGxhbmd1YWdlIEkga25vdyBvZiwgc28gYW4gZXhhbXBsZQotICAgIGlzIGluIG9yZGVyOgorICAgIChcY2hhcmFjdGVye1wlfSkgYW5kIGNvbnRpbnVlcyB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIGxpbmUKKyAgICBcZW1waHthbmQgYWxsIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiB0aGUgZm9sbG93aW5nIGxpbmV9LiAgVGhpcyBpcworICAgIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIGFueSBwcm9ncmFtbWluZyBsYW5ndWFnZSBJIGtub3cgb2YsIHNvIGFuCisgICAgZXhhbXBsZSBpcyBpbiBvcmRlcjoKIAogXGJlZ2lue3ZlcmJhdGltfQogVGhpcyBpcyB0ZXh0LiUgY29tbWVudApkaWZmIC0tZ2l0IGEvRG9jL2V4dC9uZXd0eXBlcy50ZXggYi9Eb2MvZXh0L25ld3R5cGVzLnRleAppbmRleCBjZDJjMDQ1Li5hNDg1YTE1IDEwMDY0NAotLS0gYS9Eb2MvZXh0L25ld3R5cGVzLnRleAorKysgYi9Eb2MvZXh0L25ld3R5cGVzLnRleApAQCAtMTYsOCArMTYsOSBAQAogVGhlIHdheSBuZXcgdHlwZXMgYXJlIGRlZmluZWQgY2hhbmdlZCBkcmFtYXRpY2FsbHkgKGFuZCBmb3IgdGhlCiBiZXR0ZXIpIGluIFB5dGhvbiAyLjIuICBUaGlzIGRvY3VtZW50IGRvY3VtZW50cyBob3cgdG8gZGVmaW5lIG5ldwogdHlwZXMgZm9yIFB5dGhvbiAyLjIgYW5kIGxhdGVyLiAgSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBvbGRlcgotdmVyc2lvbnMgb2YgUHl0aG9uLCB5b3Ugd2lsbCBuZWVkIHRvIHJlZmVyIHRvIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMKLWRvY3VtZW50YXRpb24uCit2ZXJzaW9ucyBvZiBQeXRob24sIHlvdSB3aWxsIG5lZWQgdG8gcmVmZXIgdG8KK1x1bGlua3tvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50YXRpb259CisgICAgICB7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy92ZXJzaW9ucy99LgogXGVuZHtub3RpY2V9CiAKIFxzZWN0aW9ue1RoZSBCYXNpY3MKQEAgLTQ3OSw3ICs0ODAsNyBAQAogICAxCiBcaXRlbSB3aGVuIHdlIGtub3cgdGhhdCBkZWFsbG9jYXRpb24gb2YgdGhlIG9iamVjdFxmb290bm90ZXtUaGlzIGlzCiAgIHRydWUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIG9iamVjdCBpcyBhIGJhc2ljIHR5cGUsIGxpa2UgYSBzdHJpbmcgb3IKLSAgYSBmbG9hdH0gd2lsbCBub3QgY2F1c2UgYW55CisgIGEgZmxvYXQufSB3aWxsIG5vdCBjYXVzZSBhbnkKICAgY2FsbHMgYmFjayBpbnRvIG91ciB0eXBlJ3MgY29kZQogXGl0ZW0gd2hlbiBkZWNyZW1lbnRpbmcgYSByZWZlcmVuY2UgY291bnQgaW4gYSBcbWVtYmVye3RwX2RlYWxsb2N9CiAgIGhhbmRsZXIgd2hlbiBnYXJiYWdlLWNvbGxlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWRcZm9vdG5vdGV7V2UgcmVsaWVkCkBAIC03OTEsOSArNzkyLDkgQEAKIAogSW4gdGhlIHNlY29uZCB2ZXJzaW9uIG9mIHRoZSBcY2xhc3N7Tm9kZHl9IGV4YW1wbGUsIHdlIGFsbG93ZWQgYW55CiBraW5kIG9mIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIFxtZW1iZXJ7Zmlyc3R9IG9yIFxtZW1iZXJ7bGFzdH0KLWF0dHJpYnV0ZXNcZm9vdG5vdGV7RXZlbiBpbiB0aGUgdGhpcmQgdmVyc2lvbiwgd2UgYXJlbid0IGd1YXJhbnRlZWQgdG8KK2F0dHJpYnV0ZXMuXGZvb3Rub3Rle0V2ZW4gaW4gdGhlIHRoaXJkIHZlcnNpb24sIHdlIGFyZW4ndCBndWFyYW50ZWVkIHRvCiBhdm9pZCBjeWNsZXMuICBJbnN0YW5jZXMgb2Ygc3RyaW5nIHN1YmNsYXNzZXMgYXJlIGFsbG93ZWQgYW5kIHN0cmluZwotc3ViY2xhc3NlcyBjb3VsZCBhbGxvdyBjeWNsZXMgZXZlbiBpZiBub3JtYWwgc3RyaW5ncyBkb24ndC59LiBUaGlzCitzdWJjbGFzc2VzIGNvdWxkIGFsbG93IGN5Y2xlcyBldmVuIGlmIG5vcm1hbCBzdHJpbmdzIGRvbid0Ln0gVGhpcwogbWVhbnMgdGhhdCBcY2xhc3N7Tm9kZHl9IG9iamVjdHMgY2FuIHBhcnRpY2lwYXRlIGluIGN5Y2xlczoKIAogXGJlZ2lue3ZlcmJhdGltfQpAQCAtMTU2Myw2ICsxNTY0LDg1IEBACiBhdm9pZGluZyB0aGUgZXhjZXB0aW9uIGNhbiB5aWVsZCBzbGlnaHRseSBiZXR0ZXIgcGVyZm9ybWFuY2UuICBJZiBhbgogYWN0dWFsIGVycm9yIG9jY3VycywgaXQgc2hvdWxkIHNldCBhbiBleGNlcHRpb24gYW5kIHJldHVybiBcTlVMTC4KIAorCitcc3Vic2VjdGlvbntXZWFrIFJlZmVyZW5jZSBTdXBwb3J0XGxhYmVse3dlYWtyZWYtc3VwcG9ydH19CisKK09uZSBvZiB0aGUgZ29hbHMgb2YgUHl0aG9uJ3Mgd2Vhay1yZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgdG8gYWxsb3cKK2FueSB0eXBlIHRvIHBhcnRpY2lwYXRlIGluIHRoZSB3ZWFrIHJlZmVyZW5jZSBtZWNoYW5pc20gd2l0aG91dAoraW5jdXJyaW5nIHRoZSBvdmVyaGVhZCBvbiB0aG9zZSBvYmplY3RzIHdoaWNoIGRvIG5vdCBiZW5lZml0IGJ5IHdlYWsKK3JlZmVyZW5jaW5nIChzdWNoIGFzIG51bWJlcnMpLgorCitGb3IgYW4gb2JqZWN0IHRvIGJlIHdlYWtseSByZWZlcmVuY2FibGUsIHRoZSBleHRlbnNpb24gbXVzdCBpbmNsdWRlIGEKK1xjdHlwZXtQeU9iamVjdCp9IGZpZWxkIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIHRoZSB1c2Ugb2YgdGhlCit3ZWFrIHJlZmVyZW5jZSBtZWNoYW5pc207IGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gXE5VTEx7fSBieSB0aGUKK29iamVjdCdzIGNvbnN0cnVjdG9yLiAgSXQgbXVzdCBhbHNvIHNldCB0aGUgXG1lbWJlcnt0cF93ZWFrbGlzdG9mZnNldH0KK2ZpZWxkIG9mIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgb2JqZWN0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIGZpZWxkLgorRm9yIGV4YW1wbGUsIHRoZSBpbnN0YW5jZSB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nCitzdHJ1Y3R1cmU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlDbGFzc09iamVjdCAqaW5fY2xhc3M7ICAgICAgIC8qIFRoZSBjbGFzcyBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAgICAgICppbl9kaWN0OyAgICAgICAgLyogQSBkaWN0aW9uYXJ5ICovCisgICAgUHlPYmplY3QgICAgICAqaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9IFB5SW5zdGFuY2VPYmplY3Q7CitcZW5ke3ZlcmJhdGltfQorCitUaGUgc3RhdGljYWxseS1kZWNsYXJlZCB0eXBlIG9iamVjdCBmb3IgaW5zdGFuY2VzIGlzIGRlZmluZWQgdGhpcyB3YXk6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK1B5VHlwZU9iamVjdCBQeUluc3RhbmNlX1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLAorICAgICJtb2R1bGUuaW5zdGFuY2UiLAorCisgICAgLyogTG90cyBvZiBzdHVmZiBvbWl0dGVkIGZvciBicmV2aXR5Li4uICovCisKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCit9OworXGVuZHt2ZXJiYXRpbX0KKworVGhlIHR5cGUgY29uc3RydWN0b3IgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgd2VhayByZWZlcmVuY2UKK2xpc3QgdG8gXE5VTEw6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3N0YXRpYyBQeU9iamVjdCAqCitpbnN0YW5jZV9uZXcoKSB7CisgICAgLyogT3RoZXIgaW5pdGlhbGl6YXRpb24gc3R1ZmYgb21pdHRlZCBmb3IgYnJldml0eSAqLworCisgICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIG9ubHkgZnVydGhlciBhZGRpdGlvbiBpcyB0aGF0IHRoZSBkZXN0cnVjdG9yIG5lZWRzIHRvIGNhbGwgdGhlCit3ZWFrIHJlZmVyZW5jZSBtYW5hZ2VyIHRvIGNsZWFyIGFueSB3ZWFrIHJlZmVyZW5jZXMuICBUaGlzIHNob3VsZCBiZQorZG9uZSBiZWZvcmUgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBkZXN0cnVjdGlvbiBoYXZlIG9jY3VycmVkLCBidXQgaXMKK29ubHkgcmVxdWlyZWQgaWYgdGhlIHdlYWsgcmVmZXJlbmNlIGxpc3QgaXMgbm9uLVxOVUxMOgorCitcYmVnaW57dmVyYmF0aW19CitzdGF0aWMgdm9pZAoraW5zdGFuY2VfZGVhbGxvYyhQeUluc3RhbmNlT2JqZWN0ICppbnN0KQoreworICAgIC8qIEFsbG9jYXRlIHRlbXBvcmFyaWVzIGlmIG5lZWRlZCwgYnV0IGRvIG5vdCBiZWdpbgorICAgICAgIGRlc3RydWN0aW9uIGp1c3QgeWV0LgorICAgICAqLworCisgICAgaWYgKGluc3QtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGluc3QpOworCisgICAgLyogUHJvY2VlZCB3aXRoIG9iamVjdCBkZXN0cnVjdGlvbiBub3JtYWxseS4gKi8KK30KK1xlbmR7dmVyYmF0aW19CisKKwogXHN1YnNlY3Rpb257TW9yZSBTdWdnZXN0aW9uc30KIAogUmVtZW1iZXIgdGhhdCB5b3UgY2FuIG9taXQgbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMsIGluIHdoaWNoIGNhc2UgeW91CmRpZmYgLS1naXQgYS9Eb2MvZXh0L3dpbmRvd3MudGV4IGIvRG9jL2V4dC93aW5kb3dzLnRleAppbmRleCBjYTE4YTFlLi5mOWRlNTQ4IDEwMDY0NAotLS0gYS9Eb2MvZXh0L3dpbmRvd3MudGV4CisrKyBiL0RvYy9leHQvd2luZG93cy50ZXgKQEAgLTI4LDEzICsyOCwxNSBAQAogXHNlY3Rpb257QSBDb29rYm9vayBBcHByb2FjaCBcbGFiZWx7d2luLWNvb2tib29rfX0KIAogVGhlcmUgYXJlIHR3byBhcHByb2FjaGVzIHRvIGJ1aWxkaW5nIGV4dGVuc2lvbiBtb2R1bGVzIG9uIFdpbmRvd3MsCi1qdXN0IGFzIHRoZXJlIGFyZSBvbiBcVU5JWDogdXNlIHRoZSBccmVmbW9kdWxle2Rpc3R1dGlsc30gcGFja2FnZSB0bworanVzdCBhcyB0aGVyZSBhcmUgb24gXFVOSVg6IHVzZSB0aGUKK1x1bGlua3tcbW9kdWxle2Rpc3R1dGlsc319ey4uL2xpYi9tb2R1bGUtZGlzdHV0aWxzLmh0bWx9IHBhY2thZ2UgdG8KIGNvbnRyb2wgdGhlIGJ1aWxkIHByb2Nlc3MsIG9yIGRvIHRoaW5ncyBtYW51YWxseS4gIFRoZSBkaXN0dXRpbHMKIGFwcHJvYWNoIHdvcmtzIHdlbGwgZm9yIG1vc3QgZXh0ZW5zaW9uczsgZG9jdW1lbnRhdGlvbiBvbiB1c2luZwotXHJlZm1vZHVsZXtkaXN0dXRpbHN9IHRvIGJ1aWxkIGFuZCBwYWNrYWdlIGV4dGVuc2lvbiBtb2R1bGVzIGlzCi1hdmFpbGFibGUgaW4gXGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbgotTW9kdWxlc30uICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYW51YWwgYXBwcm9hY2ggdG8gYnVpbGRpbmcKLVB5dGhvbiBleHRlbnNpb25zIHdyaXR0ZW4gaW4gQyBvciBcQ3BwLgorXHVsaW5re1xtb2R1bGV7ZGlzdHV0aWxzfX17Li4vbGliL21vZHVsZS1kaXN0dXRpbHMuaHRtbH0gdG8gYnVpbGQgYW5kCitwYWNrYWdlIGV4dGVuc2lvbiBtb2R1bGVzIGlzIGF2YWlsYWJsZSBpbgorXGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzfS4gIFRoaXMKK3NlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYW51YWwgYXBwcm9hY2ggdG8gYnVpbGRpbmcgUHl0aG9uIGV4dGVuc2lvbnMKK3dyaXR0ZW4gaW4gQyBvciBcQ3BwLgogCiBUbyBidWlsZCBleHRlbnNpb25zIHVzaW5nIHRoZXNlIGluc3RydWN0aW9ucywgeW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkKIG9mIHRoZSBQeXRob24gc291cmNlcyBvZiB0aGUgc2FtZSB2ZXJzaW9uIGFzIHlvdXIgaW5zdGFsbGVkIFB5dGhvbi4KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9NYWtlZmlsZSBiL0RvYy9ob3d0by9NYWtlZmlsZQppbmRleCAxOTcwMWM2Li4xODExMGEyIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vTWFrZWZpbGUKKysrIGIvRG9jL2hvd3RvL01ha2VmaWxlCkBAIC0xLDg4ICsxLDg0IEBACisjIE1ha2VmaWxlIGZvciB0aGUgSE9XVE8gZGlyZWN0b3J5CisjIExhVGVYIEhPV1RPcyBjYW4gYmUgdHVybmVkIGludG8gSFRNTCwgUERGLCBQUywgRFZJIG9yIHBsYWluIHRleHQgb3V0cHV0LgorIyByZVNUIEhPV1RPcyBjYW4gb25seSBiZSB0dXJuZWQgaW50byBIVE1MLgorCisjIFZhcmlhYmxlcyB0byBjaGFuZ2UKKworIyBQYXBlciBzaXplIGZvciBub24tSFRNTCBmb3JtYXRzIChsZXR0ZXIgb3IgYTQpCitQQVBFUj1sZXR0ZXIKKworIyBBcmd1bWVudHMgdG8gcnN0Mmh0bWwucHksIGFuZCBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0CitSU1RBUkdTID0gLS1pbnB1dC1lbmNvZGluZz11dGYtOAorUlNUMkhUTUwgPSByc3QyaHRtbC5weQorCisjIExpc3Qgb2YgSE9XVE9zIHRoYXQgYXJlbid0IHRvIGJlIHByb2Nlc3NlZC4gIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlCisjIGJhc2UgbmFtZSBvZiB0aGUgSE9XVE8gd2l0aG91dCBhbnkgZXh0ZW5zaW9uIChlLmcuICdhZHZvY2FjeScsCisjICd1bmljb2RlJykuCitSRU1PVkVfSE9XVE9TID0KIAogTUtIT1dUTz0uLi90b29scy9ta2hvd3RvCiBXRUJESVI9LgotUlNUQVJHUyA9IC0taW5wdXQtZW5jb2Rpbmc9dXRmLTgKLVZQQVRIPS46ZHZpOnBkZjpwczp0eHQKLQotIyBMaXN0IG9mIEhPV1RPcyB0aGF0IGFyZW4ndCB0byBiZSBwcm9jZXNzZWQKLQotUkVNT1ZFX0hPV1RPID0KK1BBUEVSRElSPS4uL3BhcGVyLSQoUEFQRVIpCitIVE1MRElSPS4uL2h0bWwKIAogIyBEZXRlcm1pbmUgbGlzdCBvZiBmaWxlcyB0byBiZSBidWlsdAorVEVYX1NPVVJDRVMgPSAkKHdpbGRjYXJkICoudGV4KQorUlNUX1NPVVJDRVMgPSAkKHdpbGRjYXJkICoucnN0KQorVEVYX05BTUVTID0gJChmaWx0ZXItb3V0ICQoUkVNT1ZFX0hPV1RPUyksJChwYXRzdWJzdCAlLnRleCwlLCQoVEVYX1NPVVJDRVMpKSkKIAotSE9XVE89JChmaWx0ZXItb3V0ICQoUkVNT1ZFX0hPV1RPKSwkKHdpbGRjYXJkICoudGV4KSkKLVJTVF9TT1VSQ0VTID0JJChzaGVsbCBlY2hvICoucnN0KQotRFZJICA9JChwYXRzdWJzdCAlLnRleCwlLmR2aSwkKEhPV1RPKSkKLVBERiAgPSQocGF0c3Vic3QgJS50ZXgsJS5wZGYsJChIT1dUTykpCi1QUyAgID0kKHBhdHN1YnN0ICUudGV4LCUucHMsJChIT1dUTykpCi1UWFQgID0kKHBhdHN1YnN0ICUudGV4LCUudHh0LCQoSE9XVE8pKQotSFRNTCA9JChwYXRzdWJzdCAlLnRleCwlLCQoSE9XVE8pKQorUEFQRVJfUEFUSFM9JChhZGRwcmVmaXggJChQQVBFUkRJUikvLCQoVEVYX05BTUVTKSkKK0RWSSAgPSQoYWRkc3VmZml4IC5kdmksJChQQVBFUl9QQVRIUykpCitQREYgID0kKGFkZHN1ZmZpeCAucGRmLCQoUEFQRVJfUEFUSFMpKQorUFMgICA9JChhZGRzdWZmaXggLnBzLCQoUEFQRVJfUEFUSFMpKQorCitBTExfSE9XVE9fTkFNRVMgPSAkKFRFWF9OQU1FUykgJChwYXRzdWJzdCAlLnJzdCwlLCQoUlNUX1NPVVJDRVMpKQorSE9XVE9fTkFNRVMgPSAkKGZpbHRlci1vdXQgJChSRU1PVkVfSE9XVE9TKSwkKEFMTF9IT1dUT19OQU1FUykpCitIVE1MID0gJChhZGRwcmVmaXggJChIVE1MRElSKS8sJChIT1dUT19OQU1FUykpCiAKICMgUnVsZXMgZm9yIGJ1aWxkaW5nIHZhcmlvdXMgZm9ybWF0cwotJS5kdmkgOiAlLnRleAorCisjIHJlU1QgdG8gSFRNTAorJChIVE1MRElSKS8lOiAlLnJzdAorCWlmIFsgISAtZCAkQCBdIDsgdGhlbiBta2RpciAkQCA7IGZpCisJJChSU1QySFRNTCkgJChSU1RBUkdTKSAkPCA+JEAvaW5kZXguaHRtbAorCisjIExhVGVYIHRvIHZhcmlvdXMgb3V0cHV0IGZvcm1hdHMKKyQoUEFQRVJESVIpLyUuZHZpIDogJS50ZXgKIAkkKE1LSE9XVE8pIC0tZHZpICQ8Ci0JbXYgJEAgZHZpCisJbXYgJCouZHZpICRACiAKLSUucGRmIDogJS50ZXgKKyQoUEFQRVJESVIpLyUucGRmIDogJS50ZXgKIAkkKE1LSE9XVE8pIC0tcGRmICQ8Ci0JbXYgJEAgcGRmCisJbXYgJCoucGRmICRACiAKLSUucHMgOiAlLnRleAorJChQQVBFUkRJUikvJS5wcyA6ICUudGV4CiAJJChNS0hPV1RPKSAtLXBzICQ8Ci0JbXYgJEAgcHMKKwltdiAkKi5wcyAkQAogCi0lLnR4dCA6ICUudGV4CiskKEhUTUxESVIpLyUgOiAlLnRleAorCSQoTUtIT1dUTykgLS1odG1sIC0taWNvbnNlcnZlcj0iLiIgLS1kaXIgJEAgJDwKKworIyBSdWxlIHRoYXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCAtLSB3ZSBubyBsb25nZXIgc3VwcG9ydCB0aGUgJ3R4dCcgdGFyZ2V0LgorJChQQVBFUkRJUikvJS50eHQgOiAlLnRleAogCSQoTUtIT1dUTykgLS10ZXh0ICQ8CiAJbXYgJEAgdHh0CiAKLSUgOiAlLnRleAotCSQoTUtIT1dUTykgLS1odG1sIC0taWNvbnNlcnZlcj0iLiIgJDwKLQl0YXIgLXpjdmYgaHRtbC8kKi50Z3ogJCoKLQkjemlwIC1yIGh0bWwvJCouemlwICQqCi0KIGRlZmF1bHQ6CiAJQGVjaG8gIidhbGwnICAgIC0tIGJ1aWxkIGFsbCBmaWxlcyIKLQlAZWNobyAiJ2R2aScsICdwZGYnLCAncHMnLCAndHh0JywgJ2h0bWwnIC0tIGJ1aWxkIG9uZSBmb3JtYXQiCisJQGVjaG8gIidkdmknLCAncGRmJywgJ3BzJywgJ2h0bWwnIC0tIGJ1aWxkIG9uZSBmb3JtYXQiCiAKLWFsbDogJChIVE1MKQorYWxsOiBkdmkgcGRmIHBzIGh0bWwKIAotLlBIT05ZIDogZHZpIHBkZiBwcyB0eHQgaHRtbCByc3QKLWR2aTogJChEVkkpCi0KLXBkZjogJChQREYpCi1wczogICQoUFMpCi10eHQ6ICQoVFhUKQotaHRtbDokKEhUTUwpCi0KLSMgUnVsZSB0byBidWlsZCBjb2xsZWN0ZWQgdGFyIGZpbGVzCi1kaXN0OiAjYWxsCi0JZm9yIGkgaW4gZHZpIHBkZiBwcyB0eHQgOyBkbyBcCi0JICAgIGNkICQkaSA7IFwKLQkgICAgdGFyIC16Y2YgQWxsLnRneiAqLiQkaSA7XAotCSAgICBjZCAuLiA7XAotCWRvbmUKLQotIyBSdWxlIHRvIGNvcHkgZmlsZXMgdG8gdGhlIFdlYiB0cmVlIG9uIEFNSydzIG1hY2hpbmUKLXdlYjogZGlzdAotCWNwIGR2aS8qICQoV0VCRElSKS9kdmkKLQljcCBwcy8qICQoV0VCRElSKS9wcwotCWNwIHBkZi8qICQoV0VCRElSKS9wZGYKLQljcCB0eHQvKiAkKFdFQkRJUikvdHh0Ci0JZm9yIGRpciBpbiAkKEhUTUwpIDsgZG8gY3AgLXJwICQkZGlyICQoV0VCRElSKSA7IGRvbmUKLQlmb3IgbHR4IGluICQoSE9XVE8pIDsgZG8gY3AgLXAgJCRsdHggJChXRUJESVIpL2xhdGV4IDsgZG9uZQotCi1yc3Q6IHVuaWNvZGUuaHRtbAotCi0lLmh0bWw6ICUucnN0Ci0JcnN0Mmh0bWwgJChSU1RBUkdTKSAkPCA+JEAKKy5QSE9OWSA6IGR2aSBwZGYgcHMgaHRtbAorZHZpOiAgJChEVkkpCitwZGY6ICAkKFBERikKK3BzOiAgICQoUFMpCitodG1sOiAkKEhUTUwpCiAKIGNsZWFuOgotCXJtIC1mICp+ICoubG9nICouaW5kICoubDJoICouYXV4ICoudG9jICouaG93Ci0Jcm0gLWYgKi5kdmkgKi5wcyAqLnBkZiAqLmJrbQotCXJtIC1mIHVuaWNvZGUuaHRtbAorCXJtIC1mICp+ICoubG9nICouaW5kICoubDJoICouYXV4ICoudG9jICouaG93ICouYmttCisJcm0gLWYgKi5kdmkgKi5wZGYgKi5wcwogCiBjbG9iYmVyOgotCXJtIGR2aS8qIHBzLyogcGRmLyogdHh0LyogaHRtbC8qCi0KLQotCisJcm0gLXJmICQoSFRNTCkKKwlybSAtcmYgJChEVkkpICQoUERGKSAkKFBTKQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2RvYW5kZG9udC50ZXggYi9Eb2MvaG93dG8vZG9hbmRkb250LnRleAppbmRleCBhZGJkZTY2Li5hMTA1Y2ExIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vZG9hbmRkb250LnRleAorKysgYi9Eb2MvaG93dG8vZG9hbmRkb250LnRleApAQCAtMjg4LDggKzI4OCw5IEBACiBUaGVyZSBhcmUgYWxzbyBtYW55IHVzZWZ1bCBidWlsdGluIGZ1bmN0aW9ucyBwZW9wbGUgc2VlbSBub3QgdG8gYmUKIGF3YXJlIG9mIGZvciBzb21lIHJlYXNvbjogXGZ1bmN0aW9ue21pbigpfSBhbmQgXGZ1bmN0aW9ue21heCgpfSBjYW4KIGZpbmQgdGhlIG1pbmltdW0vbWF4aW11bSBvZiBhbnkgc2VxdWVuY2Ugd2l0aCBjb21wYXJhYmxlIHNlbWFudGljcywKLWZvciBleGFtcGxlLCB5ZXQgbWFueSBwZW9wbGUgd3JpdGUgdGhleSBvd24gbWF4L21pbi4gQW5vdGhlciBoaWdobHkKLXVzZWZ1bCBmdW5jdGlvbiBpcyBcZnVuY3Rpb257cmVkdWNlKCl9LiBDbGFzc2ljYWwgdXNlIG9mIFxmdW5jdGlvbntyZWR1Y2UoKX0KK2ZvciBleGFtcGxlLCB5ZXQgbWFueSBwZW9wbGUgd3JpdGUgdGhlaXIgb3duCitcZnVuY3Rpb257bWF4KCl9L1xmdW5jdGlvbnttaW4oKX0uIEFub3RoZXIgaGlnaGx5IHVzZWZ1bCBmdW5jdGlvbiBpcworXGZ1bmN0aW9ue3JlZHVjZSgpfS4gQSBjbGFzc2ljYWwgdXNlIG9mIFxmdW5jdGlvbntyZWR1Y2UoKX0KIGlzIHNvbWV0aGluZyBsaWtlCiAKIFxiZWdpbnt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9zb2NrZXRzLnRleCBiL0RvYy9ob3d0by9zb2NrZXRzLnRleAppbmRleCA0ZGE5MmE4Li4wY2VjYmI5IDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vc29ja2V0cy50ZXgKKysrIGIvRG9jL2hvd3RvL3NvY2tldHMudGV4CkBAIC0yMTMsMzQgKzIxMywzOSBAQAogaXMgYSBmaXhlZCBsZW5ndGggbWVzc2FnZToKIAogXGJlZ2lue3ZlcmJhdGltfQotICAgIGNsYXNzIG15c29ja2V0OgotICAgICAgICAnJydkZW1vbnN0cmF0aW9uIGNsYXNzIG9ubHkgCi0gICAgICAgICAgLSBjb2RlZCBmb3IgY2xhcml0eSwgbm90IGVmZmljaWVuY3knJycKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBzb2NrIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldCgKLSAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawotICAgICAgICBkZWYgY29ubmVjdChob3N0LCBwb3J0KToKLSAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KChob3N0LCBwb3J0KSkKLSAgICAgICAgZGVmIG15c2VuZChtc2cpOgotICAgICAgICAgICAgdG90YWxzZW50ID0gMAotICAgICAgICAgICAgd2hpbGUgdG90YWxzZW50IDwgTVNHTEVOOgotICAgICAgICAgICAgICAgIHNlbnQgPSBzZWxmLnNvY2suc2VuZChtc2dbdG90YWxzZW50Ol0pCi0gICAgICAgICAgICAgICAgaWYgc2VudCA9PSAwOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFxcCi0gICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgotICAgICAgICAgICAgICAgIHRvdGFsc2VudCA9IHRvdGFsc2VudCArIHNlbnQKLSAgICAgICAgZGVmIG15cmVjZWl2ZSgpOgotICAgICAgICAgICAgbXNnID0gJycKLSAgICAgICAgICAgIHdoaWxlIGxlbihtc2cpIDwgTVNHTEVOOgotICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5zb2NrLnJlY3YoTVNHTEVOLWxlbihtc2cpKQotICAgICAgICAgICAgICAgIGlmIGNodW5rID09ICcnOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFxcCi0gICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgotICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArIGNodW5rCi0gICAgICAgICAgICByZXR1cm4gbXNnCitjbGFzcyBteXNvY2tldDoKKyAgICAnJydkZW1vbnN0cmF0aW9uIGNsYXNzIG9ubHkgCisgICAgICAtIGNvZGVkIGZvciBjbGFyaXR5LCBub3QgZWZmaWNpZW5jeQorICAgICcnJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSk6CisJaWYgc29jayBpcyBOb25lOgorCSAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KAorCQlzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorCWVsc2U6CisJICAgIHNlbGYuc29jayA9IHNvY2sKKworICAgIGRlZiBjb25uZWN0KHNlbGYsIGhvc3QsIHBvcnQpOgorCXNlbGYuc29jay5jb25uZWN0KChob3N0LCBwb3J0KSkKKworICAgIGRlZiBteXNlbmQoc2VsZiwgbXNnKToKKwl0b3RhbHNlbnQgPSAwCisJd2hpbGUgdG90YWxzZW50IDwgTVNHTEVOOgorCSAgICBzZW50ID0gc2VsZi5zb2NrLnNlbmQobXNnW3RvdGFsc2VudDpdKQorCSAgICBpZiBzZW50ID09IDA6CisJCXJhaXNlIFJ1bnRpbWVFcnJvciwgXFwKKwkJICAgICJzb2NrZXQgY29ubmVjdGlvbiBicm9rZW4iCisJICAgIHRvdGFsc2VudCA9IHRvdGFsc2VudCArIHNlbnQKKworICAgIGRlZiBteXJlY2VpdmUoc2VsZik6CisJbXNnID0gJycKKwl3aGlsZSBsZW4obXNnKSA8IE1TR0xFTjoKKwkgICAgY2h1bmsgPSBzZWxmLnNvY2sucmVjdihNU0dMRU4tbGVuKG1zZykpCisJICAgIGlmIGNodW5rID09ICcnOgorCQlyYWlzZSBSdW50aW1lRXJyb3IsIFxcCisJCSAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgorCSAgICBtc2cgPSBtc2cgKyBjaHVuaworCXJldHVybiBtc2cKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBzZW5kaW5nIGNvZGUgaGVyZSBpcyB1c2FibGUgZm9yIGFsbW9zdCBhbnkgbWVzc2FnaW5nIHNjaGVtZSAtIGluCmRpZmYgLS1naXQgYS9Eb2MvaW5zdC9pbnN0LnRleCBiL0RvYy9pbnN0L2luc3QudGV4CmluZGV4IDY3NmY4YWUuLmRmN2M2NTYgMTAwNjQ0Ci0tLSBhL0RvYy9pbnN0L2luc3QudGV4CisrKyBiL0RvYy9pbnN0L2luc3QudGV4CkBAIC0yNjIsNyArMjYyLDcgQEAKIFxjb2Rle3NldHVwLnB5IGluc3RhbGx9LS0tdGhlbiB0aGUgXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCBpbnN0YWxscyB0bwogdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGlyZC1wYXJ0eSBQeXRob24gbW9kdWxlcy4gIFRoaXMgbG9jYXRpb24KIHZhcmllcyBieSBwbGF0Zm9ybSBhbmQgYnkgaG93IHlvdSBidWlsdC9pbnN0YWxsZWQgUHl0aG9uIGl0c2VsZi4gIE9uCi1cVU5JWHt9IChhbmQgTWFjIE9TIFgsIHdoaWNoIGlzIGFsc28gVW5peC1iYXNlZCksCitcVU5JWHt9IChhbmQgTWFjIE9TIFgsIHdoaWNoIGlzIGFsc28gXFVOSVgtYmFzZWQpLAogaXQgYWxzbyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24KIGJlaW5nIGluc3RhbGxlZCBpcyBwdXJlIFB5dGhvbiBvciBjb250YWlucyBleHRlbnNpb25zIChgYG5vbi1wdXJlJycpOgogXGJlZ2lue3RhYmxlaXZ9e2x8bHxsfGN9e3RleHRybX0lCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLnRleCBiL0RvYy9saWIvZW1haWwudGV4CmluZGV4IDY4NTMzMjUuLmVhMTI3MDUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWwudGV4CisrKyBiL0RvYy9saWIvZW1haWwudGV4CkBAIC0xMDUsNyArMTA1LDcgQEAKIFxsaW5laWlpezQuMH17UHl0aG9uIDIuNX17UHl0aG9uIDIuMyB0byAyLjV9CiBcZW5ke3RhYmxlaWlpfQogCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBcbW9kdWxle2VtYWlsfSB2ZXJzb24gNCBhbmQgdmVyc2lvbiAzOgorSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiA0IGFuZCB2ZXJzaW9uIDM6CiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gQWxsIG1vZHVsZXMgaGF2ZSBiZWVuIHJlbmFtZWQgYWNjb3JkaW5nIHRvIFxwZXB7OH0gc3RhbmRhcmRzLiAgRm9yCkBAIC0xMjYsNiArMTI2LDE1IEBACiBcaXRlbSBNZXRob2RzIHRoYXQgd2VyZSBkZXByZWNhdGVkIGluIHZlcnNpb24gMyBoYXZlIGJlZW4gcmVtb3ZlZC4gIFRoZXNlCiAgICAgICBpbmNsdWRlIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9LCBcbWV0aG9ke01lc3NhZ2UuZ2V0X3R5cGUoKX0sCiAgICAgICBcbWV0aG9ke01lc3NhZ2UuZ2V0X21haW5fdHlwZSgpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF9zdWJ0eXBlKCl9LgorCitcaXRlbSBGaXhlcyBoYXZlIGJlZW4gYWRkZWQgZm9yIFxyZmN7MjIzMX0gc3VwcG9ydCB3aGljaCBjYW4gY2hhbmdlIHNvbWUgb2YKKyAgICAgIHRoZSByZXR1cm4gdHlwZXMgZm9yIFxmdW5jdGlvbntNZXNzYWdlLmdldF9wYXJhbSgpfSBhbmQgZnJpZW5kcy4gIFVuZGVyCisgICAgICBzb21lIGNpcmN1bXN0YW5jZXMsIHZhbHVlcyB3aGljaCB1c2VkIHRvIHJldHVybiBhIDMtdHVwbGUgbm93IHJldHVybgorICAgICAgc2ltcGxlIHN0cmluZ3MgKHNwZWNpZmljYWxseSwgaWYgYWxsIGV4dGVuZGVkIHBhcmFtZXRlciBzZWdtZW50cyB3ZXJlCisgICAgICB1bmVuY29kZWQsIHRoZXJlIGlzIG5vIGxhbmd1YWdlIGFuZCBjaGFyc2V0IGRlc2lnbmF0aW9uIGV4cGVjdGVkLCBzbyB0aGUKKyAgICAgIHJldHVybiB0eXBlIGlzIG5vdyBhIHNpbXBsZSBzdHJpbmcpLiAgQWxzbywgXCUtZGVjb2RpbmcgdXNlZCB0byBiZSBkb25lCisgICAgICBmb3IgYm90aCBlbmNvZGVkIGFuZCB1bmVuY29kZWQgc2VnbWVudHM7IHRoaXMgZGVjb2RpbmcgaXMgbm93IGRvbmUgb25seQorICAgICAgZm9yIGVuY29kZWQgc2VnbWVudHMuCiBcZW5ke2l0ZW1pemV9CiAKIEhlcmUgYXJlIHRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMyBhbmQgdmVyc2lvbiAyOgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbGdlbmVyYXRvci50ZXggYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAppbmRleCAzNDE1NDQyLi5iMjM2NjczIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAorKysgYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleApAQCAtMzEsMTEgKzMxLDExIEBACiBcc2FtcHs+fSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgYW55IGxpbmUgaW4gdGhlIGJvZHkgdGhhdCBzdGFydHMgZXhhY3RseSBhcwogXHNhbXB7RnJvbSB9LCBpLmUuIFxjb2Rle0Zyb219IGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKIGxpbmUuICBUaGlzIGlzIHRoZSBvbmx5IGd1YXJhbnRlZWQgcG9ydGFibGUgd2F5IHRvIGF2b2lkIGhhdmluZyBzdWNoCi1saW5lcyBiZSBtaXN0YWtlbiBmb3IgYSBVbml4IG1haWxib3ggZm9ybWF0IGVudmVsb3BlIGhlYWRlciBzZXBhcmF0b3IgKHNlZQorbGluZXMgYmUgbWlzdGFrZW4gZm9yIGEgXFVOSVh7fSBtYWlsYm94IGZvcm1hdCBlbnZlbG9wZSBoZWFkZXIgc2VwYXJhdG9yIChzZWUKIFx1bGlua3tXSFkgVEhFIENPTlRFTlQtTEVOR1RIIEZPUk1BVCBJUyBCQUR9CiB7aHR0cDovL2hvbWUubmV0c2NhcGUuY29tL2VuZy9tb3ppbGxhLzIuMC9yZWxub3Rlcy9kZW1vL2NvbnRlbnQtbGVuZ3RoLmh0bWx9CiBmb3IgZGV0YWlscykuICBcdmFye21hbmdsZV9mcm9tX30gZGVmYXVsdHMgdG8gXGNvZGV7VHJ1ZX0sIGJ1dCB5b3UKLW1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gXGNvZGV7RmFsc2V9IGlmIHlvdSBhcmUgbm90IHdyaXRpbmcgVW5peAorbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0byBcY29kZXtGYWxzZX0gaWYgeW91IGFyZSBub3Qgd3JpdGluZyBcVU5JWHt9CiBtYWlsYm94IGZvcm1hdCBmaWxlcy4KIAogT3B0aW9uYWwgXHZhcnttYXhoZWFkZXJsZW59IHNwZWNpZmllcyB0aGUgbG9uZ2VzdCBsZW5ndGggZm9yIGEKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCAwNjkxMTc5Li44MzdjNzU5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC03MSwxMiArNzEsMTIgQEAKICUgQlVJTFQtSU5zCiAlID09PT09PT09PT09PT0KIAotXGlucHV0e2xpYm9ianN9ICAgICAgICAgICAgICAgICAlIEJ1aWx0LWluIFR5cGVzLCBFeGNlcHRpb25zIGFuZCBGdW5jdGlvbnMKK1xpbnB1dHtsaWJvYmpzfSAgICAgICAgICAgICAgICAgJSBCdWlsdC1pbiBFeGNlcHRpb25zIGFuZCBGdW5jdGlvbnMKIFxpbnB1dHtsaWJmdW5jc30KLVxpbnB1dHtsaWJzdGR0eXBlc30KIFxpbnB1dHtsaWJleGNzfQogXGlucHV0e2xpYmNvbnN0c30KIAorXGlucHV0e2xpYnN0ZHR5cGVzfSAgICAgICAgICAgICAlIEJ1aWx0LWluIHR5cGVzCiAKIAogJSA9PT09PT09PT09PT09CkBAIC0xNTQsOCArMTU0LDggQEAKIAogJSBlbmNvZGluZyBzdHVmZgogXGlucHV0e2xpYmJhc2U2NH0KLVxpbnB1dHtsaWJiaW5hc2NpaX0KIFxpbnB1dHtsaWJiaW5oZXh9CitcaW5wdXR7bGliYmluYXNjaWl9CiBcaW5wdXR7bGlicXVvcHJpfQogXGlucHV0e2xpYnV1fQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIFxpbnB1dHt4bWxzYXhoYW5kbGVyfQogXGlucHV0e3htbHNheHV0aWxzfQogXGlucHV0e3htbHNheHJlYWRlcn0KK1xpbnB1dHtsaWJldHJlZX0KICUgXGlucHV0e2xpYnhtbGxpYn0KIAogXGlucHV0e2ZpbGVmb3JtYXRzfQkJJSBNaXNjZWxsYW5lb3VzIGZpbGUgZm9ybWF0cwpAQCAtMjQ1LDcgKzI0Niw2IEBACiBcaW5wdXR7bGlicGxhdGZvcm19CiBcaW5wdXR7bGliZXJybm99CiBcaW5wdXR7bGliY3R5cGVzfQotXGlucHV0e2xpYmN0eXBlc3JlZn0KIAogXGlucHV0e2xpYnNvbWVvc30gICAgICAgICAgICAgICAlIE9wdGlvbmFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMKIFxpbnB1dHtsaWJzZWxlY3R9CkBAIC0yOTIsNiArMjkyLDcgQEAKIFxpbnB1dHtsaWJ3ZWJicm93c2VyfQogXGlucHV0e2xpYmNnaX0KIFxpbnB1dHtsaWJjZ2l0Yn0KK1xpbnB1dHtsaWJ3c2dpcmVmfQogXGlucHV0e2xpYnVybGxpYn0KIFxpbnB1dHtsaWJ1cmxsaWIyfQogXGlucHV0e2xpYmh0dHBsaWJ9CkBAIC0zMDMsNiArMzA0LDcgQEAKIFxpbnB1dHtsaWJzbXRwbGlifQogXGlucHV0e2xpYnNtdHBkfQogXGlucHV0e2xpYnRlbG5ldGxpYn0KK1xpbnB1dHtsaWJ1dWlkfQogXGlucHV0e2xpYnVybHBhcnNlfQogXGlucHV0e2xpYnNvY2tzdnJ9CiBcaW5wdXR7bGliYmFzZWh0dHB9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmFueWRibS50ZXggYi9Eb2MvbGliL2xpYmFueWRibS50ZXgKaW5kZXggMTcyMjhkZC4uYmFkYzZlYyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJhbnlkYm0udGV4CisrKyBiL0RvYy9saWIvbGliYW55ZGJtLnRleApAQCAtNDYsNiArNDYsMzIgQEAKIFxtZXRob2R7a2V5cygpfSBtZXRob2RzIGFyZSBhdmFpbGFibGUuICBLZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbHdheXMgYmUKIHN0cmluZ3MuCiAKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWNvcmRzIHNvbWUgaG9zdG5hbWVzIGFuZCBhIGNvcnJlc3BvbmRpbmcgdGl0bGUsIAorYW5kIHRoZW4gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgYW55ZGJtCisKKyMgT3BlbiBkYXRhYmFzZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorZGIgPSBhbnlkYm0ub3BlbignY2FjaGUnLCAnYycpCisKKyMgUmVjb3JkIHNvbWUgdmFsdWVzCitkYlsnd3d3LnB5dGhvbi5vcmcnXSA9ICdQeXRob24gV2Vic2l0ZScKK2RiWyd3d3cuY25uLmNvbSddID0gJ0NhYmxlIE5ld3MgTmV0d29yaycKKworIyBMb29wIHRocm91Z2ggY29udGVudHMuICBPdGhlciBkaWN0aW9uYXJ5IG1ldGhvZHMKKyMgc3VjaCBhcyAua2V5cygpLCAudmFsdWVzKCkgYWxzbyB3b3JrLgorZm9yIGssIHYgaW4gZGIuaXRlcml0ZW1zKCk6CisgICAgcHJpbnQgaywgJ1x0JywgdgorCisjIFN0b3JpbmcgYSBub24tc3RyaW5nIGtleSBvciB2YWx1ZSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiAobW9zdAorIyBsaWtlbHkgYSBUeXBlRXJyb3IpLgorZGJbJ3d3dy55YWhvby5jb20nXSA9IDQKKworIyBDbG9zZSB3aGVuIGRvbmUuCitkYi5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCiAKIFxiZWdpbntzZWVhbHNvfQogICBcc2VlbW9kdWxle2RiaGFzaH17QlNEIFxjb2Rle2RifSBkYXRhYmFzZSBpbnRlcmZhY2UufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiYXNlNjQudGV4IGIvRG9jL2xpYi9saWJiYXNlNjQudGV4CmluZGV4IDc0N2Q4MzcuLjAwMzljODQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliYmFzZTY0LnRleAorKysgYi9Eb2MvbGliL2xpYmJhc2U2NC50ZXgKQEAgLTE0Niw2ICsxNDYsMTggQEAKIGFsd2F5cyBpbmNsdWRpbmcgYW4gZXh0cmEgdHJhaWxpbmcgbmV3bGluZSAoXGNvZGV7J1xlIG4nfSkuCiBcZW5ke2Z1bmNkZXNjfQogCitBbiBleGFtcGxlIHVzYWdlIG9mIHRoZSBtb2R1bGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBpbXBvcnQgYmFzZTY0Cis+Pj4gZW5jb2RlZCA9IGJhc2U2NC5iNjRlbmNvZGUoJ2RhdGEgdG8gYmUgZW5jb2RlZCcpCis+Pj4gZW5jb2RlZAorJ1pHRjBZU0IwYnlCaVpTQmxibU52WkdWaycKKz4+PiBkYXRhID0gYmFzZTY0LmI2NGRlY29kZShlbmNvZGVkKQorPj4+IGRhdGEKKydkYXRhIHRvIGJlIGVuY29kZWQnCitcZW5ke3ZlcmJhdGltfQorCiBcYmVnaW57c2VlYWxzb30KICAgXHNlZW1vZHVsZXtiaW5hc2NpaX17U3VwcG9ydCBtb2R1bGUgY29udGFpbmluZyBcQVNDSUktdG8tYmluYXJ5CiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBiaW5hcnktdG8tXEFTQ0lJe30gY29udmVyc2lvbnMufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiaW5hc2NpaS50ZXggYi9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleAppbmRleCBiMjQ0YjEwLi44NGQyOWM2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleAorKysgYi9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleApAQCAtOSwxMCArOSwxMSBAQAogVGhlIFxtb2R1bGV7YmluYXNjaWl9IG1vZHVsZSBjb250YWlucyBhIG51bWJlciBvZiBtZXRob2RzIHRvIGNvbnZlcnQKIGJldHdlZW4gYmluYXJ5IGFuZCB2YXJpb3VzIFxBU0NJSS1lbmNvZGVkIGJpbmFyeQogcmVwcmVzZW50YXRpb25zLiBOb3JtYWxseSwgeW91IHdpbGwgbm90IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkKLWJ1dCB1c2Ugd3JhcHBlciBtb2R1bGVzIGxpa2UgXHJlZm1vZHVsZXt1dX1ccmVmc3Rtb2RpbmRleHt1dX0gb3IKLVxyZWZtb2R1bGV7YmluaGV4fVxyZWZzdG1vZGluZGV4e2JpbmhleH0gaW5zdGVhZCwgdGhpcyBtb2R1bGUgc29sZWx5Ci1leGlzdHMgYmVjYXVzZSBiaXQtbWFuaXB1bGF0aW9uIG9mIGxhcmdlIGFtb3VudHMgb2YgZGF0YSBpcyBzbG93IGluCi1QeXRob24uCitidXQgdXNlIHdyYXBwZXIgbW9kdWxlcyBsaWtlIFxyZWZtb2R1bGV7dXV9XHJlZnN0bW9kaW5kZXh7dXV9LAorXHJlZm1vZHVsZXtiYXNlNjR9XHJlZnN0bW9kaW5kZXh7YmFzZTY0fSwgb3IKK1xyZWZtb2R1bGV7YmluaGV4fVxyZWZzdG1vZGluZGV4e2JpbmhleH0gaW5zdGVhZC4gVGhlIFxtb2R1bGV7YmluYXNjaWl9IG1vZHVsZQorY29udGFpbnMgbG93LWxldmVsIGZ1bmN0aW9ucyB3cml0dGVuIGluIEMgZm9yIGdyZWF0ZXIgc3BlZWQKK3RoYXQgYXJlIHVzZWQgYnkgdGhlIGhpZ2hlci1sZXZlbCBtb2R1bGVzLgogCiBUaGUgXG1vZHVsZXtiaW5hc2NpaX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYnNkZGIudGV4IGIvRG9jL2xpYi9saWJic2RkYi50ZXgKaW5kZXggYTVjZGE2ZC4uNDRiOTE2OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJic2RkYi50ZXgKKysrIGIvRG9jL2xpYi9saWJic2RkYi50ZXgKQEAgLTEzLDIzICsxMywyOSBAQAogZGljdGlvbmFyaWVzLiAgS2V5cyBhbmQgdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgaG93ZXZlciwgc28gdG8gdXNlCiBvdGhlciBvYmplY3RzIGFzIGtleXMgb3IgdG8gc3RvcmUgb3RoZXIga2luZHMgb2Ygb2JqZWN0cyB0aGUgdXNlciBtdXN0CiBzZXJpYWxpemUgdGhlbSBzb21laG93LCB0eXBpY2FsbHkgdXNpbmcgXGZ1bmN0aW9ue21hcnNoYWwuZHVtcHMoKX0gb3IgCi1cZnVuY3Rpb257cGlja2xlLmR1bXBzfS4KK1xmdW5jdGlvbntwaWNrbGUuZHVtcHMoKX0uCiAKIFRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgcmVxdWlyZXMgYSBCZXJrZWxleSBEQiBsaWJyYXJ5IHZlcnNpb24gZnJvbQogMy4zIHRocnUgNC40LgogCiBcYmVnaW57c2VlYWxzb30KLSAgXHNlZXVybHtodHRwOi8vcHlic2RkYi5zb3VyY2Vmb3JnZS5uZXQvfXtXZWJzaXRlIHdpdGggZG9jdW1lbnRhdGlvbgotICBmb3IgdGhlIG5ldyBweXRob24gQmVya2VsZXkgREIgaW50ZXJmYWNlIHRoYXQgY2xvc2VseSBtaXJyb3JzIHRoZSAKLSAgc2xlZXB5Y2F0IG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgcHJvdmlkZWQgaW4gQmVya2VsZXkgREIgMyBhbmQgNC59CisgIFxzZWV1cmx7aHR0cDovL3B5YnNkZGIuc291cmNlZm9yZ2UubmV0L317VGhlIHdlYnNpdGUgd2l0aCBkb2N1bWVudGF0aW9uCisgIGZvciB0aGUgXG1vZHVsZXtic2RkYi5kYn0gcHl0aG9uIEJlcmtlbGV5IERCIGludGVyZmFjZSB0aGF0IGNsb3NlbHkgbWlycm9ycworICB0aGUgU2xlZXB5Y2F0IG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgcHJvdmlkZWQgaW4gQmVya2VsZXkgREIgMyBhbmQgNC59CiAgIFxzZWV1cmx7aHR0cDovL3d3dy5zbGVlcHljYXQuY29tL317U2xlZXB5Y2F0IFNvZnR3YXJlIHByb2R1Y2VzIHRoZQotICBtb2Rlcm4gQmVya2VsZXkgREIgbGlicmFyeS59CisgIEJlcmtlbGV5IERCIGxpYnJhcnkufQogXGVuZHtzZWVhbHNvfQogCitBIG1vcmUgbW9kZXJuIERCLCBEQkVudiBhbmQgREJTZXF1ZW5jZSBvYmplY3QgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUKK1xtb2R1bGV7YnNkZGIuZGJ9IG1vZHVsZSB3aGljaCBjbG9zZWx5IG1hdGNoZXMgdGhlIFNsZWVweWNhdCBCZXJrZWxleSBEQiBDIEFQSQorZG9jdW1lbnRlZCBhdCB0aGUgYWJvdmUgVVJMcy4gIEFkZGl0aW9uYWwgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlCitcbW9kdWxle2JzZGRiLmRifSBBUEkgaW5jbHVkZSBmaW5lIHR1bmluZywgdHJhbnNhY3Rpb25zLCBsb2dnaW5nLCBhbmQKK211bHRpcHJvY2VzcyBjb25jdXJyZW50IGRhdGFiYXNlIGFjY2Vzcy4KKwogVGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsZWdhY3kgXG1vZHVsZXtic2RkYn0gaW50ZXJmYWNlCi1jb21wYXRpYmxlIHdpdGggdGhlIG9sZCBweXRob24gYnNkZGIgbW9kdWxlLiAgRm9yIGRldGFpbHMgYWJvdXQgdGhlIG1vcmUKLW1vZGVybiBEYiBhbmQgRGJFbnYgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBzZWUgdGhlIGFib3ZlIG1lbnRpb25lZAotcHlic2RkYiBVUkwuCitjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBweXRob24gYnNkZGIgbW9kdWxlLiAgU3RhcnRpbmcgaW4gUHl0aG9uIDIuNSB0aGlzCitpbnRlcmZhY2Ugc2hvdWxkIGJlIHNhZmUgZm9yIG11bHRpdGhyZWFkZWQgYWNjZXNzLiAgVGhlIFxtb2R1bGV7YnNkZGIuZGJ9CitBUEkgaXMgcmVjb21tZW5kZWQgZm9yIHRocmVhZGluZyB1c2VycyBhcyBpdCBwcm92aWRlcyBiZXR0ZXIgY29udHJvbC4KIAogVGhlIFxtb2R1bGV7YnNkZGJ9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRoYXQgY3JlYXRlCiBvYmplY3RzIHRoYXQgYWNjZXNzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIEJlcmtlbGV5IERCIGZpbGUuICBUaGUKQEAgLTg4LDcgKzk0LDcgQEAKIAogCiBcYmVnaW57bm90aWNlfQotQmVnaW5uaW5nIGluIDIuMyBzb21lIFVuaXggdmVyc2lvbnMgb2YgUHl0aG9uIG1heSBoYXZlIGEgXG1vZHVsZXtic2RkYjE4NX0KK0JlZ2lubmluZyBpbiAyLjMgc29tZSBcVU5JWHt9IHZlcnNpb25zIG9mIFB5dGhvbiBtYXkgaGF2ZSBhIFxtb2R1bGV7YnNkZGIxODV9CiBtb2R1bGUuICBUaGlzIGlzIHByZXNlbnQgXGVtcGh7b25seX0gdG8gYWxsb3cgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAogc3lzdGVtcyB3aGljaCBzaGlwIHdpdGggdGhlIG9sZCBCZXJrZWxleSBEQiAxLjg1IGRhdGFiYXNlIGxpYnJhcnkuICBUaGUKIFxtb2R1bGV7YnNkZGIxODV9IG1vZHVsZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseSBpbiBuZXcgY29kZS4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29tcGlsZWFsbC50ZXggYi9Eb2MvbGliL2xpYmNvbXBpbGVhbGwudGV4CmluZGV4IGQzOWE1NDguLjNlOTY2N2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29tcGlsZWFsbC50ZXgKKysrIGIvRG9jL2xpYi9saWJjb21waWxlYWxsLnRleApAQCAtNDQsNiArNDQsMTkgQEAKICAgXGZ1bmN0aW9ue2NvbXBpbGVfZGlyKCl9IGZ1bmN0aW9uLgogXGVuZHtmdW5jZGVzY30KIAorVG8gZm9yY2UgYSByZWNvbXBpbGUgb2YgYWxsIHRoZSBcZmlsZXsucHl9IGZpbGVzIGluIHRoZSBcZmlsZXtMaWIvfQorc3ViZGlyZWN0b3J5IGFuZCBhbGwgaXRzIHN1YmRpcmVjdG9yaWVzOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgY29tcGlsZWFsbAorCitjb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgZm9yY2U9VHJ1ZSkKKworIyBQZXJmb3JtIHNhbWUgY29tcGlsYXRpb24sIGV4Y2x1ZGluZyBmaWxlcyBpbiAuc3ZuIGRpcmVjdG9yaWVzLgoraW1wb3J0IHJlCitjb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgcng9cmUuY29tcGlsZSgnL1suXXN2bicpLCBmb3JjZT1UcnVlKQorXGVuZHt2ZXJiYXRpbX0KKwogCiBcYmVnaW57c2VlYWxzb30KICAgXHNlZW1vZHVsZVtweWNvbXBpbGVde3B5X2NvbXBpbGV9e0J5dGUtY29tcGlsZSBhIHNpbmdsZSBzb3VyY2UgZmlsZS59CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXggYi9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXgKaW5kZXggZWYyZDgzMy4uMDFmMjUzOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4CisrKyBiL0RvYy9saWIvbGliY29va2llbGliLnRleApAQCAtMjQsNyArMjQsNyBAQAogdGhlIGRlLWZhY3RvIE5ldHNjYXBlIGNvb2tpZSBwcm90b2NvbCAod2hpY2ggZGlmZmVycyBzdWJzdGFudGlhbGx5CiBmcm9tIHRoYXQgc2V0IG91dCBpbiB0aGUgb3JpZ2luYWwgTmV0c2NhcGUgc3BlY2lmaWNhdGlvbiksIGluY2x1ZGluZwogdGFraW5nIG5vdGUgb2YgdGhlIFxjb2Rle21heC1hZ2V9IGFuZCBcY29kZXtwb3J0fSBjb29raWUtYXR0cmlidXRlcwotaW50cm9kdWNlZCB3aXRoIFJGQyAyMTA5LiAgXG5vdGV7VGhlIHZhcmlvdXMgbmFtZWQgcGFyYW1ldGVycyBmb3VuZCBpbgoraW50cm9kdWNlZCB3aXRoIFJGQyAyOTY1LiAgXG5vdGV7VGhlIHZhcmlvdXMgbmFtZWQgcGFyYW1ldGVycyBmb3VuZCBpbgogXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0gYW5kIFxtYWlsaGVhZGVye1NldC1Db29raWUyfSBoZWFkZXJzCiAoZWcuIFxjb2Rle2RvbWFpbn0gYW5kIFxjb2Rle2V4cGlyZXN9KSBhcmUgY29udmVudGlvbmFsbHkgcmVmZXJyZWQgdG8KIGFzIFxkZm57YXR0cmlidXRlc30uICBUbyBkaXN0aW5ndWlzaCB0aGVtIGZyb20gUHl0aG9uIGF0dHJpYnV0ZXMsIHRoZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjc3YudGV4IGIvRG9jL2xpYi9saWJjc3YudGV4CmluZGV4IDY1MDUzYzcuLjhlMTBjY2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY3N2LnRleAorKysgYi9Eb2MvbGliL2xpYmNzdi50ZXgKQEAgLTU1LDcgKzU1LDcgQEAKIFJldHVybiBhIHJlYWRlciBvYmplY3Qgd2hpY2ggd2lsbCBpdGVyYXRlIG92ZXIgbGluZXMgaW4gdGhlIGdpdmVuCiB7fVx2YXJ7Y3N2ZmlsZX0uICBcdmFye2NzdmZpbGV9IGNhbiBiZSBhbnkgb2JqZWN0IHdoaWNoIHN1cHBvcnRzIHRoZQogaXRlcmF0b3IgcHJvdG9jb2wgYW5kIHJldHVybnMgYSBzdHJpbmcgZWFjaCB0aW1lIGl0cyBcbWV0aG9ke25leHR9Ci1tZXRob2QgaXMgY2FsbGVkIC0gZmlsZSBvYmplY3RzIGFuZCBsaXN0IG9iamVjdHMgYXJlIGJvdGggc3VpdGFibGUuICAKK21ldGhvZCBpcyBjYWxsZWQgLS0tIGZpbGUgb2JqZWN0cyBhbmQgbGlzdCBvYmplY3RzIGFyZSBib3RoIHN1aXRhYmxlLiAgCiBJZiBcdmFye2NzdmZpbGV9IGlzIGEgZmlsZSBvYmplY3QsIGl0IG11c3QgYmUgb3BlbmVkIHdpdGgKIHRoZSAnYicgZmxhZyBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2UuICBBbiBvcHRpb25hbAoge31cdmFye2RpYWxlY3R9IHBhcmFtZXRlciBjYW4gYmUgZ2l2ZW4KQEAgLTcwLDYgKzcwLDE4IEBACiAKIEFsbCBkYXRhIHJlYWQgYXJlIHJldHVybmVkIGFzIHN0cmluZ3MuICBObyBhdXRvbWF0aWMgZGF0YSB0eXBlCiBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZC4KKworXHZlcnNpb25jaGFuZ2VkWworVGhlIHBhcnNlciBpcyBub3cgc3RyaWN0ZXIgd2l0aCByZXNwZWN0IHRvIG11bHRpLWxpbmUgcXVvdGVkCitmaWVsZHMuIFByZXZpb3VzbHksIGlmIGEgbGluZSBlbmRlZCB3aXRoaW4gYSBxdW90ZWQgZmllbGQgd2l0aG91dCBhCit0ZXJtaW5hdGluZyBuZXdsaW5lIGNoYXJhY3RlciwgYSBuZXdsaW5lIHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCityZXR1cm5lZCBmaWVsZC4gVGhpcyBiZWhhdmlvciBjYXVzZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIGZpbGVzCit3aGljaCBjb250YWluZWQgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcnMgd2l0aGluIGZpZWxkcy4gIFRoZQorYmVoYXZpb3Igd2FzIGNoYW5nZWQgdG8gcmV0dXJuIHRoZSBmaWVsZCB3aXRob3V0IGluc2VydGluZyBuZXdsaW5lcy4gQXMKK2EgY29uc2VxdWVuY2UsIGlmIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMgYXJlIGltcG9ydGFudCwgdGhlCitpbnB1dCBzaG91bGQgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB3aGljaCBwcmVzZXJ2ZXMgdGhlIG5ld2xpbmUKK2NoYXJhY3RlcnNdezIuNX0KKwogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXt3cml0ZXJ9e2NzdmZpbGVcb3B0aW9uYWx7LApAQCAtNDA0LDcgKzQxNiw3IEBACiByZWFkZXIgPSBjc3YucmVhZGVyKG9wZW4oInBhc3N3ZCIsICJyYiIpLCAndW5peHB3ZCcpCiBcZW5ke3ZlcmJhdGltfQogCi1BIHNsaWdodGx5IG1vcmUgYWR2YW5jZWQgdXNlIG9mIHRoZSByZWFkZXIgLSBjYXRjaGluZyBhbmQgcmVwb3J0aW5nIGVycm9yczoKK0Egc2xpZ2h0bHkgbW9yZSBhZHZhbmNlZCB1c2Ugb2YgdGhlIHJlYWRlciAtLS0gY2F0Y2hpbmcgYW5kIHJlcG9ydGluZyBlcnJvcnM6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCBjc3YsIHN5cwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjdHlwZXMudGV4IGIvRG9jL2xpYi9saWJjdHlwZXMudGV4CmluZGV4IGRjMzc3NDkuLjYyMDZiOGMgMTAwNzU1Ci0tLSBhL0RvYy9saWIvbGliY3R5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYmN0eXBlcy50ZXgKQEAgLTEsNCArMSw0IEBACi1cbmV3bGVuZ3Roe1xsb2NhbGxpbmV3aWR0aH0KK1xpZnhcbG9jYWxsaW5ld2lkdGhcdW5kZWZpbmVkXG5ld2xlbmd0aHtcbG9jYWxsaW5ld2lkdGh9XGZpCiBcc2V0bGVuZ3Roe1xsb2NhbGxpbmV3aWR0aH17XGxpbmV3aWR0aH0KIFxzZWN0aW9ue1xtb2R1bGV7Y3R5cGVzfSAtLS0gQSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi59CiBcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y3R5cGVzfQpAQCAtNiwxMyArNiwxMyBAQAogXG1vZHVsZXN5bm9wc2lze0EgZm9yZWlnbiBmdW5jdGlvbiBsaWJyYXJ5IGZvciBQeXRob24ufQogXHZlcnNpb25hZGRlZHsyLjV9CiAKLVxjb2Rle2N0eXBlc30gaXMgYSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi4KK1xjb2Rle2N0eXBlc30gaXMgYSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi4gIEl0IHByb3ZpZGVzIEMKK2NvbXBhdGlibGUgZGF0YSB0eXBlcywgYW5kIGFsbG93cyB0byBjYWxsIGZ1bmN0aW9ucyBpbiBkbGxzL3NoYXJlZAorbGlicmFyaWVzLiAgSXQgY2FuIGJlIHVzZWQgdG8gd3JhcCB0aGVzZSBsaWJyYXJpZXMgaW4gcHVyZSBQeXRob24uCiAKIAogXHN1YnNlY3Rpb257Y3R5cGVzIHR1dG9yaWFsXGxhYmVse2N0eXBlcy1jdHlwZXMtdHV0b3JpYWx9fQogCi1UaGlzIHR1dG9yaWFsIGRlc2NyaWJlcyB2ZXJzaW9uIDAuOS45IG9mIFxjb2Rle2N0eXBlc30uCi0KIE5vdGU6IFRoZSBjb2RlIHNhbXBsZXMgaW4gdGhpcyB0dXRvcmlhbCB1c2VzIFxjb2Rle2RvY3Rlc3R9IHRvIG1ha2Ugc3VyZQogdGhhdCB0aGV5IGFjdHVhbGx5IHdvcmsuICBTaW5jZSBzb21lIGNvZGUgc2FtcGxlcyBiZWhhdmUgZGlmZmVyZW50bHkKIHVuZGVyIExpbnV4LCBXaW5kb3dzLCBvciBNYWMgT1MgWCwgdGhleSBjb250YWluIGRvY3Rlc3QgZGlyZWN0aXZlcyBpbgpAQCAtNjYsOCArNjYsNyBAQAogPENETEwgJ2xpYmMuc28uNicsIGhhbmRsZSAuLi4gYXQgLi4uPgogPj4+CiBcZW5ke3ZlcmJhdGltfQotCi1YWFggQWRkIHNlY3Rpb24gZm9yIE1hYyBPUyBYLgorJSBYWFggQWRkIHNlY3Rpb24gZm9yIE1hYyBPUyBYLiAKIAogCiBcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgZnVuY3Rpb25zIGZyb20gbG9hZGVkIGRsbHNcbGFiZWx7Y3R5cGVzLWFjY2Vzc2luZy1mdW5jdGlvbnMtZnJvbS1sb2FkZWQtZGxsc319CkBAIC0xMTksNyArMTE4LDcgQEAKIAogT24gV2luZG93cywgc29tZSBkbGxzIGV4cG9ydCBmdW5jdGlvbnMgbm90IGJ5IG5hbWUgYnV0IGJ5IG9yZGluYWwuCiBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IGluZGV4aW5nIHRoZSBkbGwgb2JqZWN0IHdpdGggdGhlCi1vZGluYWwgbnVtYmVyOgorb3JkaW5hbCBudW1iZXI6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gY2RsbC5rZXJuZWwzMlsxXSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA8X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgpAQCAtMTQzLDE2ICsxNDIsMTggQEAKIFRoaXMgZXhhbXBsZSBjYWxscyBib3RoIGZ1bmN0aW9ucyB3aXRoIGEgTlVMTCBwb2ludGVyIChcY29kZXtOb25lfSBzaG91bGQKIGJlIHVzZWQgYXMgdGhlIE5VTEwgcG9pbnRlcik6CiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgbGliYy50aW1lKE5vbmUpCi0xMTQuLi4KKz4+PiBwcmludCBsaWJjLnRpbWUoTm9uZSkgIyBkb2N0ZXN0OiArU0tJUAorMTE1MDY0MDc5MgogPj4+IHByaW50IGhleCh3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQShOb25lKSkgIyBkb2N0ZXN0OiArV0lORE9XUwogMHgxZDAwMDAwMAogPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBcY29kZXtjdHlwZXN9IHRyaWVzIHRvIHByb3RlY3QgeW91IGZyb20gY2FsbGluZyBmdW5jdGlvbnMgd2l0aCB0aGUgd3JvbmcKLW51bWJlciBvZiBhcmd1bWVudHMuICBVbmZvcnR1bmF0ZWx5IHRoaXMgb25seSB3b3JrcyBvbiBXaW5kb3dzLiAgSXQKLWRvZXMgdGhpcyBieSBleGFtaW5pbmcgdGhlIHN0YWNrIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zOgorbnVtYmVyIG9mIGFyZ3VtZW50cyBvciB0aGUgd3JvbmcgY2FsbGluZyBjb252ZW50aW9uLiAgVW5mb3J0dW5hdGVseQordGhpcyBvbmx5IHdvcmtzIG9uIFdpbmRvd3MuICBJdCBkb2VzIHRoaXMgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBhZnRlcgordGhlIGZ1bmN0aW9uIHJldHVybnMsIHNvIGFsdGhvdWdoIGFuIGVycm9yIGlzIHJhaXNlZCB0aGUgZnVuY3Rpb24KK1xlbXBoe2hhc30gYmVlbiBjYWxsZWQ6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CkBAIC0xNjUsNiArMTY2LDI1IEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKK1RoZSBzYW1lIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB5b3UgY2FsbCBhbiBcY29kZXtzdGRjYWxsfSBmdW5jdGlvbgord2l0aCB0aGUgXGNvZGV7Y2RlY2x9IGNhbGxpbmcgY29udmVudGlvbiwgb3IgdmljZSB2ZXJzYToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkgIyBkb2N0ZXN0OiArV0lORE9XUworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMgKDQgYnl0ZXMgbWlzc2luZykKKz4+PgorCis+Pj4gd2luZGxsLm1zdmNydC5wcmludGYoInNwYW0iKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KK1ZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSBhcmd1bWVudHMgKDQgYnl0ZXMgaW4gZXhjZXNzKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitUbyBmaW5kIG91dCB0aGUgY29ycmVjdCBjYWxsaW5nIGNvbnZlbnRpb24geW91IGhhdmUgdG8gbG9vayBpbnRvIHRoZSBDCitoZWFkZXIgZmlsZSBvciB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHlvdSB3YW50IHRvIGNhbGwuCisKIE9uIFdpbmRvd3MsIFxjb2Rle2N0eXBlc30gdXNlcyB3aW4zMiBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyB0bwogcHJldmVudCBjcmFzaGVzIGZyb20gZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0cyB3aGVuIGZ1bmN0aW9ucyBhcmUKIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnQgdmFsdWVzOgpAQCAtMTg2LDE1OCArMjA2LDE3MiBAQAogaGF2ZSB0byBsZWFybiBtb3JlIGFib3V0IFxjb2Rle2N0eXBlc30gZGF0YSB0eXBlcy4KIAogCi1cc3Vic3Vic2VjdGlvbntTaW1wbGUgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtc2ltcGxlLWRhdGEtdHlwZXN9fQorXHN1YnN1YnNlY3Rpb257RnVuZGFtZW50YWwgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtZnVuZGFtZW50YWwtZGF0YS10eXBlc319CiAKIFxjb2Rle2N0eXBlc30gZGVmaW5lcyBhIG51bWJlciBvZiBwcmltaXRpdmUgQyBjb21wYXRpYmxlIGRhdGEgdHlwZXMgOgogXGJlZ2lue3F1b3RlfQotCi1cYmVnaW57bG9uZ3RhYmxlfVtjXXt8cHswLjE5XGxvY2FsbGluZXdpZHRofXxwezAuMjhcbG9jYWxsaW5ld2lkdGh9fHB7MC4xNFxsb2NhbGxpbmV3aWR0aH18fQotXGhsaW5lCi1cdGV4dGJmeworXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dGV4dHJtfQorewogY3R5cGVzIHR5cGUKLX0gJiBcdGV4dGJmeworfQorewogQyB0eXBlCi19ICYgXHRleHRiZnsKK30KK3sKIFB5dGhvbiB0eXBlCi19IFxcCi1caGxpbmUKLVxlbmRoZWFkCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99Y2hhcn0KLSAmIAorfQorewogXGNvZGV7Y2hhcn0KLSAmIAorfQorewogY2hhcmFjdGVyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWJ5dGV9Ci0gJiAKK30KK3sKIFxjb2Rle2NoYXJ9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWJ5dGV9Ci0gJiAKK30KK3sKIFxjb2Rle3Vuc2lnbmVkIGNoYXJ9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99c2hvcnR9Ci0gJiAKK30KK3sKIFxjb2Rle3Nob3J0fQotICYgCit9Cit7CiBpbnRlZ2VyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffXVzaG9ydH0KLSAmIAorfQorewogXGNvZGV7dW5zaWduZWQgc2hvcnR9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99aW50fQotICYgCit9Cit7CiBcY29kZXtpbnR9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWludH0KLSAmIAorfQorewogXGNvZGV7dW5zaWduZWQgaW50fQotICYgCit9Cit7CiBpbnRlZ2VyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWxvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle2xvbmd9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWxvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle3Vuc2lnbmVkIGxvbmd9Ci0gJiAKK30KK3sKIGxvbmcKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99bG9uZ2xvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle3tcX317XF99aW50NjR9IG9yCiBcY29kZXtsb25nIGxvbmd9Ci0gJiAKK30KK3sKIGxvbmcKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWxvbmdsb25nfQotICYgCit9Cit7CiBcY29kZXt1bnNpZ25lZCB7XF99e1xffWludDY0fSBvcgogXGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfQotICYgCit9Cit7CiBsb25nCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWZsb2F0fQotICYgCit9Cit7CiBcY29kZXtmbG9hdH0KLSAmIAorfQorewogZmxvYXQKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99ZG91YmxlfQotICYgCit9Cit7CiBcY29kZXtkb3VibGV9Ci0gJiAKK30KK3sKIGZsb2F0Ci0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWNoYXJ7XF99cH0KLSAmIAorfQorewogXGNvZGV7Y2hhciAqfQogKE5VTCB0ZXJtaW5hdGVkKQotICYgCit9Cit7CiBzdHJpbmcgb3IKIFxjb2Rle05vbmV9Ci0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffXdjaGFye1xffXB9Ci0gJiAKK30KK3sKIFxjb2Rle3djaGFye1xffXQgKn0KIChOVUwgdGVybWluYXRlZCkKLSAmIAorfQorewogdW5pY29kZSBvcgogXGNvZGV7Tm9uZX0KLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dm9pZHtcX31wfQotICYgCit9Cit7CiBcY29kZXt2b2lkICp9Ci0gJiAKK30KK3sKIGludGVnZXIgb3IKIFxjb2Rle05vbmV9Ci0gXFwKLVxobGluZQotXGVuZHtsb25ndGFibGV9Cit9CitcZW5ke3RhYmxlaWlpfQogXGVuZHtxdW90ZX0KIAogQWxsIHRoZXNlIHR5cGVzIGNhbiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlbSB3aXRoIGFuIG9wdGlvbmFsCkBAIC0zODAsNiArNDE0LDcgQEAKIGNfY2hhcl9wKCdIaSwgdGhlcmUnKQogPj4+IHByaW50IHMgICAgICAgICAgICAgICAgICMgZmlyc3Qgc3RyaW5nIGlzIHVuY2hhbmdlZAogSGVsbG8sIFdvcmxkCis+Pj4KIFxlbmR7dmVyYmF0aW19CiAKIFlvdSBzaG91bGQgYmUgY2FyZWZ1bCwgaG93ZXZlciwgbm90IHRvIHBhc3MgdGhlbSB0byBmdW5jdGlvbnMKQEAgLTU1NywxMyArNTkyLDEyIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVhYWCBNZW50aW9uIHRoZSBcbWVtYmVye2VycmNoZWNrfSBwcm90b2NvbC4uLgotCiBZb3UgY2FuIGFsc28gdXNlIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCAoYSBmdW5jdGlvbiBvciBhIGNsYXNzIGZvcgotZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLiAgSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLVxjb2Rle2ludGVnZXJ9IHRoZSBDIGZ1bmN0aW9uIHJldHVybnMsIGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbCB3aWxsCi1iZSB1c2VkIGFzIHRoZSByZXN1bHQgb2YgeW91ciBmdW5jdGlvbiBjYWxsLiBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjawotZm9yIGVycm9yIHJldHVybiB2YWx1ZXMgYW5kIGF1dG9tYXRpY2FsbHkgcmFpc2UgYW4gZXhjZXB0aW9uOgorZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLCBpZiB0aGUgZm9yZWlnbiBmdW5jdGlvbiByZXR1cm5zCithbiBpbnRlZ2VyLiAgVGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIFxjb2Rle2ludGVnZXJ9IHRoZSBDCitmdW5jdGlvbiByZXR1cm5zLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgd2lsbCBiZSB1c2VkIGFzIHRoZQorcmVzdWx0IG9mIHlvdXIgZnVuY3Rpb24gY2FsbC4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgZm9yIGVycm9yIHJldHVybgordmFsdWVzIGFuZCBhdXRvbWF0aWNhbGx5IHJhaXNlIGFuIGV4Y2VwdGlvbjoKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiBHZXRNb2R1bGVIYW5kbGUgPSB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA+Pj4gZGVmIFZhbGlkSGFuZGxlKHZhbHVlKToKQEAgLTU3NSw3ICs2MDksNyBAQAogPj4+IEdldE1vZHVsZUhhbmRsZS5yZXN0eXBlID0gVmFsaWRIYW5kbGUgIyBkb2N0ZXN0OiArV0lORE9XUwogPj4+IEdldE1vZHVsZUhhbmRsZShOb25lKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA0ODY1MzkyNjQKLT4+PiBHZXRNb2R1bGVIYW5kbGUoInNvbWV0aGluZyBzaWxseSIpICMgZG9jdGVzdDogK1dJTkRPV1MgK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCis+Pj4gR2V0TW9kdWxlSGFuZGxlKCJzb21ldGhpbmcgc2lsbHkiKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMywgaW4gVmFsaWRIYW5kbGUKQEAgLTU4OCw2ICs2MjIsMTAgQEAKIGFuIGV4Y2VwdGlvbi4gIFxjb2Rle1dpbkVycm9yfSB0YWtlcyBhbiBvcHRpb25hbCBlcnJvciBjb2RlIHBhcmFtZXRlciwgaWYKIG5vIG9uZSBpcyB1c2VkLCBpdCBjYWxscyBcZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9IHRvIHJldHJpZXZlIGl0LgogCitQbGVhc2Ugbm90ZSB0aGF0IGEgbXVjaCBtb3JlIHBvd2VyZnVsIGVycm9yIGNoZWNraW5nIG1lY2hhbmlzbSBpcworYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxtZW1iZXJ7ZXJyY2hlY2t9IGF0dHJpYnV0ZTsgc2VlIHRoZSByZWZlcmVuY2UgbWFudWFsCitmb3IgZGV0YWlscy4KKwogCiBcc3Vic3Vic2VjdGlvbntQYXNzaW5nIHBvaW50ZXJzIChvcjogcGFzc2luZyBwYXJhbWV0ZXJzIGJ5IHJlZmVyZW5jZSlcbGFiZWx7Y3R5cGVzLXBhc3NpbmctcG9pbnRlcnN9fQogCkBAIC03NDQsNiArNzgyLDcgQEAKID4+PgogPj4+IHByaW50IGxlbihNeVN0cnVjdCgpLnBvaW50X2FycmF5KQogNAorPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBJbnN0YW5jZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHVzdWFsIHdheSwgYnkgY2FsbGluZyB0aGUgY2xhc3M6CkBAIC03ODEsMjEgKzgyMCwzMSBAQAogPj4+CiBcZW5ke3ZlcmJhdGltfQogCi1YWFggWFhYIE5vdCBjb3JyZWN0OiB1c2UgaW5kZXhpbmcsIG5vdCB0aGUgY29udGVudHMgYXRyaWJ1dGUKLQogUG9pbnRlciBpbnN0YW5jZXMgaGF2ZSBhIFxjb2Rle2NvbnRlbnRzfSBhdHRyaWJ1dGUgd2hpY2ggcmV0dXJucyB0aGUKLWN0eXBlcycgdHlwZSBwb2ludGVkIHRvLCB0aGUgXGNvZGV7Y3tcX31pbnQoNDIpfSBpbiB0aGUgYWJvdmUgY2FzZToKK29iamVjdCB0byB3aGljaCB0aGUgcG9pbnRlciBwb2ludHMsIHRoZSBcY29kZXtpfSBvYmplY3QgYWJvdmU6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gcGkuY29udGVudHMKIGNfbG9uZyg0MikKID4+PgogXGVuZHt2ZXJiYXRpbX0KIAorTm90ZSB0aGF0IFxjb2Rle2N0eXBlc30gZG9lcyBub3QgaGF2ZSBPT1IgKG9yaWdpbmFsIG9iamVjdCByZXR1cm4pLCBpdAorY29uc3RydWN0cyBhIG5ldywgZXF1aXZhbGVudCBvYmplY3QgZWFjaCB0aW1lIHlvdSByZXRyaWV2ZSBhbgorYXR0cmlidXRlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHBpLmNvbnRlbnRzIGlzIGkKK0ZhbHNlCis+Pj4gcGkuY29udGVudHMgaXMgcGkuY29udGVudHMKK0ZhbHNlCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKIEFzc2lnbmluZyBhbm90aGVyIFxjbGFzc3tje1xffWludH0gaW5zdGFuY2UgdG8gdGhlIHBvaW50ZXIncyBjb250ZW50cwogYXR0cmlidXRlIHdvdWxkIGNhdXNlIHRoZSBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBtZW1vcnkgbG9jYXRpb24KIHdoZXJlIHRoaXMgaXMgc3RvcmVkOgogXGJlZ2lue3ZlcmJhdGltfQotPj4+IHBpLmNvbnRlbnRzID0gY19pbnQoOTkpCis+Pj4gaSA9IGNfaW50KDk5KQorPj4+IHBpLmNvbnRlbnRzID0gaQogPj4+IHBpLmNvbnRlbnRzCiBjX2xvbmcoOTkpCiA+Pj4KQEAgLTgwOCwyNiArODU3LDIxIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVhYWCBXaGF0IGlzIHRoaXM/Pz8KIEFzc2lnbmluZyB0byBhbiBpbnRlZ2VyIGluZGV4IGNoYW5nZXMgdGhlIHBvaW50ZWQgdG8gdmFsdWU6CiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gaTIgPSBwaVswXQotPj4+IGkyCi05OQorPj4+IHByaW50IGkKK2NfbG9uZyg5OSkKID4+PiBwaVswXSA9IDIyCi0+Pj4gaTIKLTk5Cis+Pj4gcHJpbnQgaQorY19sb25nKDIyKQogPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBpbmRleGVzIGRpZmZlcmVudCBmcm9tIDAsIGJ1dCB5b3UgbXVzdCBrbm93Ci13aGF0IHlvdSdyZSBkb2luZyB3aGVuIHlvdSB1c2UgdGhpczogWW91IGFjY2VzcyBvciBjaGFuZ2UgYXJiaXRyYXJ5Ci1tZW1vcnkgbG9jYXRpb25zIHdoZW4geW91IGRvIHRoaXMuIEdlbmVyYWxseSB5b3Ugb25seSB1c2UgdGhpcyBmZWF0dXJlCi1pZiB5b3UgcmVjZWl2ZSBhIHBvaW50ZXIgZnJvbSBhIEMgZnVuY3Rpb24sIGFuZCB5b3UgXGVtcGh7a25vd30gdGhhdCB0aGUKLXBvaW50ZXIgYWN0dWFsbHkgcG9pbnRzIHRvIGFuIGFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgaXRlbS4KLQotCi1cc3Vic3Vic2VjdGlvbntQb2ludGVyIGNsYXNzZXMvdHlwZXNcbGFiZWx7Y3R5cGVzLXBvaW50ZXItY2xhc3Nlc3R5cGVzfX0KK3doYXQgeW91J3JlIGRvaW5nLCBqdXN0IGFzIGluIEM6IFlvdSBjYW4gYWNjZXNzIG9yIGNoYW5nZSBhcmJpdHJhcnkKK21lbW9yeSBsb2NhdGlvbnMuIEdlbmVyYWxseSB5b3Ugb25seSB1c2UgdGhpcyBmZWF0dXJlIGlmIHlvdSByZWNlaXZlIGEKK3BvaW50ZXIgZnJvbSBhIEMgZnVuY3Rpb24sIGFuZCB5b3UgXGVtcGh7a25vd30gdGhhdCB0aGUgcG9pbnRlciBhY3R1YWxseQorcG9pbnRzIHRvIGFuIGFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgaXRlbS4KIAogQmVoaW5kIHRoZSBzY2VuZXMsIHRoZSBcY29kZXtwb2ludGVyfSBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBzaW1wbHkKIGNyZWF0ZSBwb2ludGVyIGluc3RhbmNlcywgaXQgaGFzIHRvIGNyZWF0ZSBwb2ludGVyIFxlbXBoe3R5cGVzfSBmaXJzdC4KQEAgLTgzNyw3ICs4ODEsNyBAQAogPj4+IFBJID0gUE9JTlRFUihjX2ludCkKID4+PiBQSQogPGNsYXNzICdjdHlwZXMuTFBfY19sb25nJz4KLT4+PiBQSSg0MikgIyBkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKz4+PiBQSSg0MikKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwogVHlwZUVycm9yOiBleHBlY3RlZCBjX2xvbmcgaW5zdGVhZCBvZiBpbnQKQEAgLTg0Niw2ICs4OTAsMTAzIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKK0NhbGxpbmcgdGhlIHBvaW50ZXIgdHlwZSB3aXRob3V0IGFuIGFyZ3VtZW50IGNyZWF0ZXMgYSBcY29kZXtOVUxMfQorcG9pbnRlci4gIFxjb2Rle05VTEx9IHBvaW50ZXJzIGhhdmUgYSBcY29kZXtGYWxzZX0gYm9vbGVhbiB2YWx1ZToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBudWxsX3B0ciA9IFBPSU5URVIoY19pbnQpKCkKKz4+PiBwcmludCBib29sKG51bGxfcHRyKQorRmFsc2UKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworXGNvZGV7Y3R5cGVzfSBjaGVja3MgZm9yIFxjb2Rle05VTEx9IHdoZW4gZGVyZWZlcmVuY2luZyBwb2ludGVycyAoYnV0CitkZXJlZmVyZW5jaW5nIG5vbi1cY29kZXtOVUxMfSBwb2ludGVycyB3b3VsZCBjcmFzaCBQeXRob24pOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IG51bGxfcHRyWzBdCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uLgorVmFsdWVFcnJvcjogTlVMTCBwb2ludGVyIGFjY2VzcworPj4+CisKKz4+PiBudWxsX3B0clswXSA9IDEyMzQKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4uCitWYWx1ZUVycm9yOiBOVUxMIHBvaW50ZXIgYWNjZXNzCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnN1YnNlY3Rpb257VHlwZSBjb252ZXJzaW9uc1xsYWJlbHtjdHlwZXMtdHlwZS1jb252ZXJzaW9uc319CisKK1VzdWFsbHksIGN0eXBlcyBkb2VzIHN0cmljdCB0eXBlIGNoZWNraW5nLiAgVGhpcyBtZWFucywgaWYgeW91IGhhdmUKK1xjb2Rle1BPSU5URVIoY3tcX31pbnQpfSBpbiB0aGUgXG1lbWJlcnthcmd0eXBlc30gbGlzdCBvZiBhIGZ1bmN0aW9uIG9yIGFzIHRoZQordHlwZSBvZiBhIG1lbWJlciBmaWVsZCBpbiBhIHN0cnVjdHVyZSBkZWZpbml0aW9uLCBvbmx5IGluc3RhbmNlcyBvZgorZXhhY3RseSB0aGUgc2FtZSB0eXBlIGFyZSBhY2NlcHRlZC4gIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhpcworcnVsZSwgd2hlcmUgY3R5cGVzIGFjY2VwdHMgb3RoZXIgb2JqZWN0cy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHBhc3MKK2NvbXBhdGlibGUgYXJyYXkgaW5zdGFuY2VzIGluc3RlYWQgb2YgcG9pbnRlciB0eXBlcy4gIFNvLCBmb3IKK1xjb2Rle1BPSU5URVIoY3tcX31pbnQpfSwgY3R5cGVzIGFjY2VwdHMgYW4gYXJyYXkgb2YgY3tcX31pbnQ6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gY2xhc3MgQmFyKFN0cnVjdHVyZSk6CisuLi4gICAgIF9maWVsZHNfID0gWygiY291bnQiLCBjX2ludCksICgidmFsdWVzIiwgUE9JTlRFUihjX2ludCkpXQorLi4uCis+Pj4gYmFyID0gQmFyKCkKKz4+PiBiYXIudmFsdWVzID0gKGNfaW50ICogMykoMSwgMiwgMykKKz4+PiBiYXIuY291bnQgPSAzCis+Pj4gZm9yIGkgaW4gcmFuZ2UoYmFyLmNvdW50KToKKy4uLiAgICAgcHJpbnQgYmFyLnZhbHVlc1tpXQorLi4uCisxCisyCiszCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1RvIHNldCBhIFBPSU5URVIgdHlwZSBmaWVsZCB0byBcY29kZXtOVUxMfSwgeW91IGNhbiBhc3NpZ24gXGNvZGV7Tm9uZX06CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gYmFyLnZhbHVlcyA9IE5vbmUKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworWFhYIGxpc3Qgb3RoZXIgY29udmVyc2lvbnMuLi4KKworU29tZXRpbWVzIHlvdSBoYXZlIGluc3RhbmNlcyBvZiBpbmNvbXBhdGlibGUgdHlwZXMuICBJbiBcY29kZXtDfSwgeW91IGNhbgorY2FzdCBvbmUgdHlwZSBpbnRvIGFub3RoZXIgdHlwZS4gIFxjb2Rle2N0eXBlc30gcHJvdmlkZXMgYSBcY29kZXtjYXN0fQorZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LiAgVGhlIFxjb2Rle0Jhcn0gc3RydWN0dXJlCitkZWZpbmVkIGFib3ZlIGFjY2VwdHMgXGNvZGV7UE9JTlRFUihje1xffWludCl9IHBvaW50ZXJzIG9yIFxjbGFzc3tje1xffWludH0gYXJyYXlzCitmb3IgaXRzIFxjb2Rle3ZhbHVlc30gZmllbGQsIGJ1dCBub3QgaW5zdGFuY2VzIG9mIG90aGVyIHR5cGVzOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGJhci52YWx1ZXMgPSAoY19ieXRlICogNCkoKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitUeXBlRXJyb3I6IGluY29tcGF0aWJsZSB0eXBlcywgY19ieXRlX0FycmF5XzQgaW5zdGFuY2UgaW5zdGVhZCBvZiBMUF9jX2xvbmcgaW5zdGFuY2UKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworRm9yIHRoZXNlIGNhc2VzLCB0aGUgXGNvZGV7Y2FzdH0gZnVuY3Rpb24gaXMgaGFuZHkuCisKK1RoZSBcY29kZXtjYXN0fSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjYXN0IGEgY3R5cGVzIGluc3RhbmNlIGludG8gYQorcG9pbnRlciB0byBhIGRpZmZlcmVudCBjdHlwZXMgZGF0YSB0eXBlLiAgXGNvZGV7Y2FzdH0gdGFrZXMgdHdvCitwYXJhbWV0ZXJzLCBhIGN0eXBlcyBvYmplY3QgdGhhdCBpcyBvciBjYW4gYmUgY29udmVydGVkIHRvIGEgcG9pbnRlcgorb2Ygc29tZSBraW5kLCBhbmQgYSBjdHlwZXMgcG9pbnRlciB0eXBlLiAgSXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZgordGhlIHNlY29uZCBhcmd1bWVudCwgd2hpY2ggcmVmZXJlbmNlcyB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYXMgdGhlCitmaXJzdCBhcmd1bWVudDoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBhID0gKGNfYnl0ZSAqIDQpKCkKKz4+PiBjYXN0KGEsIFBPSU5URVIoY19pbnQpKQorPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IC4uLj4KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworU28sIFxjb2Rle2Nhc3R9IGNhbiBiZSB1c2VkIHRvIGFzc2lnbiB0byB0aGUgXGNvZGV7dmFsdWVzfSBmaWVsZCBvZiBcY29kZXtCYXJ9Cit0aGUgc3RydWN0dXJlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGJhciA9IEJhcigpCis+Pj4gYmFyLnZhbHVlcyA9IGNhc3QoKGNfYnl0ZSAqIDQpKCksIFBPSU5URVIoY19pbnQpKQorPj4+IHByaW50IGJhci52YWx1ZXNbMF0KKzAKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKwogCiBcc3Vic3Vic2VjdGlvbntJbmNvbXBsZXRlIFR5cGVzXGxhYmVse2N0eXBlcy1pbmNvbXBsZXRlLXR5cGVzfX0KIApAQCAtMTA1OSw3ICsxMjAwLDEwIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVNvLCBvdXIgYXJyYXkgc29ydGVkIG5vdzoKK0l0IGlzIHF1aXRlIGludGVyZXN0aW5nIHRvIHNlZSB0aGF0IHRoZSBXaW5kb3dzIFxmdW5jdGlvbntxc29ydH0gZnVuY3Rpb24KK25lZWRzIG1vcmUgY29tcGFyaXNvbnMgdGhhbiB0aGUgbGludXggdmVyc2lvbiEKKworQXMgd2UgY2FuIGVhc2lseSBjaGVjaywgb3VyIGFycmF5IHNvcnRlZCBub3c6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gZm9yIGkgaW4gaWE6IHByaW50IGksCiAuLi4KQEAgLTEwNzAsMTQgKzEyMTQsMTQgQEAKIFx0ZXh0YmZ7SW1wb3J0YW50IG5vdGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uczp9CiAKIE1ha2Ugc3VyZSB5b3Uga2VlcCByZWZlcmVuY2VzIHRvIENGVU5DVFlQRSBvYmplY3RzIGFzIGxvbmcgYXMgdGhleSBhcmUKLXVzZWQgZnJvbSBDIGNvZGUuIGN0eXBlcyBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQordXNlZCBmcm9tIEMgY29kZS4gXGNvZGV7Y3R5cGVzfSBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQogZ2FyYmFnZSBjb2xsZWN0ZWQsIGNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KIAogCiBcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgdmFsdWVzIGV4cG9ydGVkIGZyb20gZGxsc1xsYWJlbHtjdHlwZXMtYWNjZXNzaW5nLXZhbHVlcy1leHBvcnRlZC1mcm9tLWRsbHN9fQogCiBTb21ldGltZXMsIGEgZGxsIG5vdCBvbmx5IGV4cG9ydHMgZnVuY3Rpb25zLCBpdCBhbHNvIGV4cG9ydHMKLXZhbHVlcy4gQW4gZXhhbXBsZSBpbiB0aGUgUHl0aG9uIGxpYnJhcnkgaXRzZWxmIGlzIHRoZQordmFyaWFibGVzLiBBbiBleGFtcGxlIGluIHRoZSBQeXRob24gbGlicmFyeSBpdHNlbGYgaXMgdGhlCiBcY29kZXtQeXtcX31PcHRpbWl6ZUZsYWd9LCBhbiBpbnRlZ2VyIHNldCB0byAwLCAxLCBvciAyLCBkZXBlbmRpbmcgb24gdGhlCiBccHJvZ3JhbW9wdHstT30gb3IgXHByb2dyYW1vcHR7LU9PfSBmbGFnIGdpdmVuIG9uIHN0YXJ0dXAuCiAKQEAgLTExNDgsOSArMTI5Miw2IEBACiAoaW5kaWNhdGVkIGJ5IHRoZSBuZWdhdGl2ZSBzaXplIG1lbWJlcikgaXMgbm90IHdlbGxrbm93biwgaXQgaXMgb25seQogdXNlZCBmb3IgdGVzdGluZy4gVHJ5IGl0IG91dCB3aXRoIFxjb2Rle2ltcG9ydCB7XF99e1xffWhlbGxve1xffXtcX319IGZvciBleGFtcGxlLgogCi1YWFggRGVzY3JpYmUgaG93IHRvIGFjY2VzcyB0aGUgXHZhcntjb2RlfSBtZW1iZXIgZmllbGRzLCB3aGljaCBjb250YWluCi10aGUgYnl0ZSBjb2RlIGZvciB0aGUgbW9kdWxlcy4KLQogCiBcc3Vic3Vic2VjdGlvbntTdXJwcmlzZXNcbGFiZWx7Y3R5cGVzLXN1cnByaXNlc319CiAKQEAgLTExNzUsNiArMTMxNiw3IEBACiA+Pj4gcmMuYSwgcmMuYiA9IHJjLmIsIHJjLmEKID4+PiBwcmludCByYy5hLngsIHJjLmEueSwgcmMuYi54LCByYy5iLnkKIDMgNCAzIDQKKz4+PgogXGVuZHt2ZXJiYXRpbX0KIAogSG0uIFdlIGNlcnRhaW5seSBleHBlY3RlZCB0aGUgbGFzdCBzdGF0ZW1lbnQgdG8gcHJpbnQgXGNvZGV7MyA0IDEgMn0uCkBAIC0xMTg0LDYgKzEzMjYsNyBAQAogPj4+IHRlbXAwLCB0ZW1wMSA9IHJjLmIsIHJjLmEKID4+PiByYy5hID0gdGVtcDAKID4+PiByYy5iID0gdGVtcDEKKz4+PgogXGVuZHt2ZXJiYXRpbX0KIAogTm90ZSB0aGF0IFxjb2Rle3RlbXAwfSBhbmQgXGNvZGV7dGVtcDF9IGFyZSBvYmplY3RzIHN0aWxsIHVzaW5nIHRoZSBpbnRlcm5hbApAQCAtMTIxNCw2ICsxMzU3LDUxIEBACiBBY2Nlc3NpbmcgdGhlIGNvbnRlbnRzIGFnYWluIGNvbnN0cnVjdHMgYSBuZXcgUHl0aG9uIGVhY2ggdGltZSEKIAogCitcc3Vic3Vic2VjdGlvbntWYXJpYWJsZS1zaXplZCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy12YXJpYWJsZS1zaXplZC1kYXRhLXR5cGVzfX0KKworXGNvZGV7Y3R5cGVzfSBwcm92aWRlcyBzb21lIHN1cHBvcnQgZm9yIHZhcmlhYmxlLXNpemVkIGFycmF5cyBhbmQKK3N0cnVjdHVyZXMgKHRoaXMgd2FzIGFkZGVkIGluIHZlcnNpb24gMC45LjkuNykuCisKK1RoZSBcY29kZXtyZXNpemV9IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2l6ZSB0aGUgbWVtb3J5IGJ1ZmZlciBvZiBhbgorZXhpc3RpbmcgY3R5cGVzIG9iamVjdC4gIFRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgb2JqZWN0IGFzIGZpcnN0Cithcmd1bWVudCwgYW5kIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiAgVGhlCittZW1vcnkgYmxvY2sgY2Fubm90IGJlIG1hZGUgc21hbGxlciB0aGFuIHRoZSBuYXR1cmFsIG1lbW9yeSBibG9jaworc3BlY2lmaWVkIGJ5IHRoZSBvYmplY3RzIHR5cGUsIGEgXGNvZGV7VmFsdWVFcnJvcn0gaXMgcmFpc2VkIGlmIHRoaXMgaXMKK3RyaWVkOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHNob3J0X2FycmF5ID0gKGNfc2hvcnQgKiA0KSgpCis+Pj4gcHJpbnQgc2l6ZW9mKHNob3J0X2FycmF5KQorOAorPj4+IHJlc2l6ZShzaG9ydF9hcnJheSwgNCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KK1ZhbHVlRXJyb3I6IG1pbmltdW0gc2l6ZSBpcyA4Cis+Pj4gcmVzaXplKHNob3J0X2FycmF5LCAzMikKKz4+PiBzaXplb2Yoc2hvcnRfYXJyYXkpCiszMgorPj4+IHNpemVvZih0eXBlKHNob3J0X2FycmF5KSkKKzgKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworVGhpcyBpcyBuaWNlIGFuZCBmaW5lLCBidXQgaG93IHdvdWxkIG9uZSBhY2Nlc3MgdGhlIGFkZGl0aW9uYWwKK2VsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIGFycmF5PyAgU2luY2UgdGhlIHR5cGUgc3RpbGwgb25seSBrbm93cworYWJvdXQgNCBlbGVtZW50cywgd2UgZ2V0IGVycm9ycyBhY2Nlc3Npbmcgb3RoZXIgZWxlbWVudHM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gc2hvcnRfYXJyYXlbOl0KK1swLCAwLCAwLCAwXQorPj4+IHNob3J0X2FycmF5WzddCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uCitJbmRleEVycm9yOiBpbnZhbGlkIGluZGV4Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0Fub3RoZXIgd2F5IHRvIHVzZSB2YXJpYWJsZS1zaXplZCBkYXRhIHR5cGVzIHdpdGggXGNvZGV7Y3R5cGVzfSBpcyB0byB1c2UKK3RoZSBkeW5hbWljIG5hdHVyZSBvZiBQeXRob24sIGFuZCAocmUtKWRlZmluZSB0aGUgZGF0YSB0eXBlIGFmdGVyIHRoZQorcmVxdWlyZWQgc2l6ZSBpcyBhbHJlYWR5IGtub3duLCBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcy4KKworCiBcc3Vic3Vic2VjdGlvbntCdWdzLCBUb0RvIGFuZCBub24taW1wbGVtZW50ZWQgdGhpbmdzXGxhYmVse2N0eXBlcy1idWdzLXRvZG8tbm9uLWltcGxlbWVudGVkLXRoaW5nc319CiAKIEVudW1lcmF0aW9uIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuIFlvdSBjYW4gZG8gaXQgZWFzaWx5IHlvdXJzZWxmLApAQCAtMTIyNCwzICsxNDEyLDEwMTQgQEAKICUgY29tcGlsZS1jb21tYW5kOiAibWFrZS5iYXQiCiAlIEVuZDogCiAKKworXHN1YnNlY3Rpb257Y3R5cGVzIHJlZmVyZW5jZVxsYWJlbHtjdHlwZXMtY3R5cGVzLXJlZmVyZW5jZX19CisKKworXHN1YnN1YnNlY3Rpb257RmluZGluZyBzaGFyZWQgbGlicmFyaWVzXGxhYmVse2N0eXBlcy1maW5kaW5nLXNoYXJlZC1saWJyYXJpZXN9fQorCitXaGVuIHByb2dyYW1taW5nIGluIGEgY29tcGlsZWQgbGFuZ3VhZ2UsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGFjY2Vzc2VkCit3aGVuIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwgYW5kIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgorCitUaGUgcHVycG9zZSBvZiB0aGUgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBmdW5jdGlvbiBpcyB0byBsb2NhdGUgYSBsaWJyYXJ5IGluCithIHdheSBzaW1pbGFyIHRvIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgKG9uIHBsYXRmb3JtcyB3aXRoIHNldmVyYWwKK3ZlcnNpb25zIG9mIGEgc2hhcmVkIGxpYnJhcnkgdGhlIG1vc3QgcmVjZW50IHNob3VsZCBiZSBsb2FkZWQpLCB3aGlsZQordGhlIGN0eXBlcyBsaWJyYXJ5IGxvYWRlcnMgYWN0IGxpa2Ugd2hlbiBhIHByb2dyYW0gaXMgcnVuLCBhbmQgY2FsbAordGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5LgorCitUaGUgXGNvZGV7Y3R5cGVzLnV0aWx9IG1vZHVsZSBwcm92aWRlcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBoZWxwIHRvCitkZXRlcm1pbmUgdGhlIGxpYnJhcnkgdG8gbG9hZC4KKworXGJlZ2lue2RhdGFkZXNjbml9e2ZpbmRfbGlicmFyeShuYW1lKX0KK1RyeSB0byBmaW5kIGEgbGlicmFyeSBhbmQgcmV0dXJuIGEgcGF0aG5hbWUuICBcdmFye25hbWV9IGlzIHRoZQorbGlicmFyeSBuYW1lIHdpdGhvdXQgYW55IHByZWZpeCBsaWtlIFx2YXJ7bGlifSwgc3VmZml4IGxpa2UgXGNvZGV7LnNvfSwKK1xjb2Rley5keWxpYn0gb3IgdmVyc2lvbiBudW1iZXIgKHRoaXMgaXMgdGhlIGZvcm0gdXNlZCBmb3IgdGhlIHBvc2l4CitsaW5rZXIgb3B0aW9uIFxwcm9ncmFtb3B0ey1sfSkuICBJZiBubyBsaWJyYXJ5IGNhbiBiZSBmb3VuZCwgcmV0dXJucworXGNvZGV7Tm9uZX0uCitcZW5ke2RhdGFkZXNjbml9CisKK1RoZSBleGFjdCBmdW5jdGlvbmFsaXR5IGlzIHN5c3RlbSBkZXBlbmRlbmQuCisKK09uIExpbnV4LCBcY29kZXtmaW5ke1xffWxpYnJhcnl9IHRyaWVzIHRvIHJ1biBleHRlcm5hbCBwcm9ncmFtcworKC9zYmluL2xkY29uZmlnLCBnY2MsIGFuZCBvYmpkdW1wKSB0byBmaW5kIHRoZSBsaWJyYXJ5IGZpbGUuICBJdAorcmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZS4gIEhlcmUgYXJlIHNvbmUgZXhhbXBsZXM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Cis+Pj4gZmluZF9saWJyYXJ5KCJtIikKKydsaWJtLnNvLjYnCis+Pj4gZmluZF9saWJyYXJ5KCJjIikKKydsaWJjLnNvLjYnCis+Pj4gZmluZF9saWJyYXJ5KCJiejIiKQorJ2xpYmJ6Mi5zby4xLjAnCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK09uIE9TIFgsIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdHJpZXMgc2V2ZXJhbCBwcmVkZWZpbmVkIG5hbWluZyBzY2hlbWVzIGFuZAorcGF0aHMgdG8gbG9jYXRlIHRoZSBsaWJyYXJ5LCBhbmQgcmV0dXJucyBhIGZ1bGwgcGF0aG5hbWUgaWYgc3VjY2Vzc2Z1bGw6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Cis+Pj4gZmluZF9saWJyYXJ5KCJjIikKKycvdXNyL2xpYi9saWJjLmR5bGliJworPj4+IGZpbmRfbGlicmFyeSgibSIpCisnL3Vzci9saWIvbGlibS5keWxpYicKKz4+PiBmaW5kX2xpYnJhcnkoImJ6MiIpCisnL3Vzci9saWIvbGliYnoyLmR5bGliJworPj4+IGZpbmRfbGlicmFyeSgiQUdMIikKKycvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BR0wuZnJhbWV3b3JrL0FHTCcKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworT24gV2luZG93cywgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBzZWFyY2hlcyBhbG9uZyB0aGUgc3lzdGVtIHNlYXJjaCBwYXRoLAorYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aG5hbWUsIGJ1dCBzaW5jZSB0aGVyZSBpcyBubyBwcmVkZWZpbmVkIG5hbWluZworc2NoZW1lIGEgY2FsbCBsaWtlIFxjb2Rle2ZpbmR7XF99bGlicmFyeSgiYyIpfSB3aWxsIGZhaWwgYW5kIHJldHVybgorXGNvZGV7Tm9uZX0uCisKK0lmIHdyYXBwaW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBcY29kZXtjdHlwZXN9LCBpdCBcZW1waHttYXl9IGJlIGJldHRlciB0bworZGV0ZXJtaW5lIHRoZSBzaGFyZWQgbGlicmFyeSBuYW1lIGF0IGRldmVsb3BtZW50IHR5cGUsIGFuZCBoYXJkY29kZQordGhhdCBpbnRvIHRoZSB3cmFwcGVyIG1vZHVsZSBpbnN0ZWFkIG9mIHVzaW5nIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdG8KK2xvY2F0ZSB0aGUgbGlicmFyeSBhdCBydW50aW1lLgorCisKK1xzdWJzdWJzZWN0aW9ue0xvYWRpbmcgc2hhcmVkIGxpYnJhcmllc1xsYWJlbHtjdHlwZXMtbG9hZGluZy1zaGFyZWQtbGlicmFyaWVzfX0KKworVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcyBpbnRvIHRoZSBQeXRob24KK3Byb2Nlc3MuICBPbmUgd2F5IGlzIHRvIGluc3RhbnRpYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisKK1xiZWdpbntjbGFzc2Rlc2N9e0NETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KK0luc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcy4KK0Z1bmN0aW9ucyBpbiB0aGVzZSBsaWJyYXJpZXMgdXNlIHRoZSBzdGFuZGFyZCBDIGNhbGxpbmcKK2NvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gXGNvZGV7aW50fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtPbGVETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KK1dpbmRvd3Mgb25seTogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGxvYWRlZCBzaGFyZWQKK2xpYnJhcmllcywgZnVuY3Rpb25zIGluIHRoZXNlIGxpYnJhcmllcyB1c2UgdGhlIFxjb2Rle3N0ZGNhbGx9CitjYWxsaW5nIGNvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gdGhlIHdpbmRvd3Mgc3BlY2lmaWMKK1xjbGFzc3tIUkVTVUxUfSBjb2RlLiAgXGNsYXNze0hSRVNVTFR9IHZhbHVlcyBjb250YWluIGluZm9ybWF0aW9uCitzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGNhbGwgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgdG9nZXRoZXIKK3dpdGggYWRkaXRpb25hbCBlcnJvciBjb2RlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBzaWduYWxzIGEKK2ZhaWx1cmUsIGFuIFxjbGFzc3tXaW5kb3dzRXJyb3J9IGlzIGF1dG9tYXRpY2FsbHkgcmFpc2VkLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e1dpbkRMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQorV2luZG93cyBvbmx5OiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgbG9hZGVkIHNoYXJlZAorbGlicmFyaWVzLCBmdW5jdGlvbnMgaW4gdGhlc2UgbGlicmFyaWVzIHVzZSB0aGUgXGNvZGV7c3RkY2FsbH0KK2NhbGxpbmcgY29udmVudGlvbiwgYW5kIGFyZSBhc3N1bWVkIHRvIHJldHVybiBcY29kZXtpbnR9IGJ5IGRlZmF1bHQuCisKK09uIFdpbmRvd3MgQ0Ugb25seSB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uIGlzIHVzZWQsIGZvcgorY29udmVuaWVuY2UgdGhlIFxjbGFzc3tXaW5ETEx9IGFuZCBcY2xhc3N7T2xlRExMfSB1c2UgdGhlIHN0YW5kYXJkIGNhbGxpbmcKK2NvbnZlbnRpb24gb24gdGhpcyBwbGF0Zm9ybS4KK1xlbmR7Y2xhc3NkZXNjfQorCitUaGUgUHl0aG9uIEdJTCBpcyByZWxlYXNlZCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb24gZXhwb3J0ZWQgYnkKK3RoZXNlIGxpYnJhcmllcywgYW5kIHJlYXF1aXJlZCBhZnRlcndhcmRzLgorCitcYmVnaW57Y2xhc3NkZXNjfXtQeURMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQorSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYmVoYXZlIGxpa2UgXGNsYXNze0NETEx9IGluc3RhbmNlcywgZXhjZXB0Cit0aGF0IHRoZSBQeXRob24gR0lMIGlzIFxlbXBoe25vdH0gcmVsZWFzZWQgZHVyaW5nIHRoZSBmdW5jdGlvbiBjYWxsLAorYW5kIGFmdGVyIHRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGhlIFB5dGhvbiBlcnJvciBmbGFnIGlzIGNoZWNrZWQuCitJZiB0aGUgZXJyb3IgZmxhZyBpcyBzZXQsIGEgUHl0aG9uIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisKK1RodXMsIHRoaXMgaXMgb25seSB1c2VmdWwgdG8gY2FsbCBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGRpcmVjdGx5LgorXGVuZHtjbGFzc2Rlc2N9CisKK0FsbCB0aGVzZSBjbGFzc2VzIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgY2FsbGluZyB0aGVtIHdpdGggYXQgbGVhc3QKK29uZSBhcmd1bWVudCwgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gIElmIHlvdSBoYXZlIGFuCitleGlzdGluZyBoYW5kbGUgdG8gYW4gYWxyZWFkeSBsb2FkZWQgc2hhcmQgbGlicmFyeSwgaXQgY2FuIGJlIHBhc3NlZAorYXMgdGhlIFxjb2Rle2hhbmRsZX0gbmFtZWQgcGFyYW1ldGVyLCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm1zCitcY29kZXtkbG9wZW59IG9yIFxtZXRob2R7TG9hZExpYnJhcnl9IGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCB0aGUgbGlicmFyeQoraW50byB0aGUgcHJvY2VzcywgYW5kIHRvIGdldCBhIGhhbmRsZSB0byBpdC4KKworVGhlIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgaG93IHRoZSBsaWJyYXJ5IGlzCitsb2FkZWQuICBGb3IgZGV0YWlscywgY29uc3VsdCB0aGUgXGNvZGV7ZGxvcGVuKDMpfSBtYW5wYWdlLCBvbiBXaW5kb3dzLAorXHZhcnttb2RlfSBpcyBpZ25vcmVkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UlRMRF9HTE9CQUx9CitGbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGZsYWcKK2lzIG5vdCBhdmFpbGFibGUsIGl0IGlzIGRlZmluZWQgYXMgdGhlIGludGVnZXIgemVyby4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e1JUTERfTE9DQUx9CitGbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdAorYXZhaWxhYmxlLCBpdCBpcyB0aGUgc2FtZSBhcyBcdmFye1JUTER7XF99R0xPQkFMfS4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e0RFRkFVTFRfTU9ERX0KK1RoZSBkZWZhdWx0IG1vZGUgd2hpY2ggaXMgdXNlZCB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMuICBPbiBPU1gKKzEwLjMsIHRoaXMgaXMgXHZhcntSVExEe1xffUdMT0JBTH0sIG90aGVyd2lzZSBpdCBpcyB0aGUgc2FtZSBhcworXHZhcntSVExEe1xffUxPQ0FMfS4KK1xlbmR7ZGF0YWRlc2NuaX0KKworSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgaGF2ZSBubyBwdWJsaWMgbWV0aG9kcywgaG93ZXZlcgorXG1ldGhvZHt7XF99e1xffWdldGF0dHJ7XF99e1xffX0gYW5kIFxtZXRob2R7e1xffXtcX31nZXRpdGVte1xffXtcX319IGhhdmUgc3BlY2lhbCBiZWhhdmlvdXI6IGZ1bmN0aW9ucworZXhwb3J0ZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBiZSBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIG9mIGJ5CitpbmRleC4gIFBsZWFzZSBub3RlIHRoYXQgYm90aCBcbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBhbmQgXG1ldGhvZHt7XF99e1xffWdldGl0ZW17XF99e1xffX0KK2NhY2hlIHRoZWlyIHJlc3VsdCwgc28gY2FsbGluZyB0aGVtIHJlcGVhdGVkbHkgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKK2VhY2ggdGltZS4KKworVGhlIGZvbGxvd2luZyBwdWJsaWMgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLCB0aGVpciBuYW1lIHN0YXJ0cyB3aXRoCithbiB1bmRlcnNjb3JlIHRvIG5vdCBjbGFzaCB3aXRoIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzOgorCitcYmVnaW57bWVtYmVyZGVzY317X2hhbmRsZX0KK1RoZSBzeXN0ZW0gaGFuZGxlIHVzZWQgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317X25hbWV9CitUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSBwYXNzZWQgaW4gdGhlIGNvbnRydWN0b3IuCitcZW5ke21lbWJlcmRlc2N9CisKK1NoYXJlZCBsaWJyYXJpZXMgY2FuIGFsc28gYmUgbG9hZGVkIGJ5IHVzaW5nIG9uZSBvZiB0aGUgcHJlZmFicmljYXRlZAorb2JqZWN0cywgd2hpY2ggYXJlIGluc3RhbmNlcyBvZiB0aGUgXGNsYXNze0xpYnJhcnlMb2FkZXJ9IGNsYXNzLCBlaXRoZXIgYnkKK2NhbGxpbmcgdGhlIFxtZXRob2R7TG9hZExpYnJhcnl9IG1ldGhvZCwgb3IgYnkgcmV0cmlldmluZyB0aGUgbGlicmFyeSBhcworYXR0cmlidXRlIG9mIHRoZSBsb2FkZXIgaW5zdGFuY2UuCisKK1xiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9CitDbGFzcyB3aGljaCBsb2FkcyBzaGFyZWQgbGlicmFyaWVzLiAgXGNvZGV7ZGxsdHlwZX0gc2hvdWxkIGJlIG9uZQorb2YgdGhlIFxjbGFzc3tDRExMfSwgXGNsYXNze1B5RExMfSwgXGNsYXNze1dpbkRMTH0sIG9yIFxjbGFzc3tPbGVETEx9IHR5cGVzLgorCitcbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBoYXMgc3BlY2lhbCBiZWhhdmlvdXI6IEl0IGFsbG93cyB0byBsb2FkIGEgc2hhcmVkCitsaWJyYXJ5IGJ5IGFjY2Vzc2luZyBpdCBhcyBhdHRyaWJ1dGUgb2YgYSBsaWJyYXJ5IGxvYWRlcgoraW5zdGFuY2UuICBUaGUgcmVzdWx0IGlzIGNhY2hlZCwgc28gcmVwZWF0ZWQgYXR0cmlidXRlIGFjY2Vzc2VzCityZXR1cm4gdGhlIHNhbWUgbGlicmFyeSBlYWNoIHRpbWUuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e0xvYWRMaWJyYXJ5fXtuYW1lfQorTG9hZCBhIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIHByb2Nlc3MgYW5kIHJldHVybiBpdC4gIFRoaXMgbWV0aG9kCithbHdheXMgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS4KK1xlbmR7bWV0aG9kZGVzY30KKworVGhlc2UgcHJlZmFicmljYXRlZCBsaWJyYXJ5IGxvYWRlcnMgYXJlIGF2YWlsYWJsZToKKworXGJlZ2lue2RhdGFkZXNjbml9e2NkbGx9CitDcmVhdGVzIFxjbGFzc3tDRExMfSBpbnN0YW5jZXMuCitcZW5ke2RhdGFkZXNjbml9CisKK1xiZWdpbntkYXRhZGVzY25pfXt3aW5kbGx9CitXaW5kb3dzIG9ubHk6IENyZWF0ZXMgXGNsYXNze1dpbkRMTH0gaW5zdGFuY2VzLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17b2xlZGxsfQorV2luZG93cyBvbmx5OiBDcmVhdGVzIFxjbGFzc3tPbGVETEx9IGluc3RhbmNlcy4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e3B5ZGxsfQorQ3JlYXRlcyBcY2xhc3N7UHlETEx9IGluc3RhbmNlcy4KK1xlbmR7ZGF0YWRlc2NuaX0KKworRm9yIGFjY2Vzc2luZyB0aGUgQyBQeXRob24gYXBpIGRpcmVjdGx5LCBhIHJlYWR5LXRvLXVzZSBQeXRob24gc2hhcmVkCitsaWJyYXJ5IG9iamVjdCBpcyBhdmFpbGFibGU6CisKK1xiZWdpbntkYXRhZGVzY25pfXtweXRob25hcGl9CitBbiBpbnN0YW5jZSBvZiBcY2xhc3N7UHlETEx9IHRoYXQgZXhwb3NlcyBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGFzCithdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuCitpbnRlZ2Vycywgd2hpY2ggaXMgb2YgY291cnNlIG5vdCBhbHdheXMgdGhlIHRydXRoLCBzbyB5b3UgaGF2ZSB0bworYXNzaWduIHRoZSBjb3JyZWN0IFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMuCitcZW5ke2RhdGFkZXNjbml9CisKKworXHN1YnN1YnNlY3Rpb257Rm9yZWlnbiBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLWZvcmVpZ24tZnVuY3Rpb25zfX0KKworQXMgZXhwbGFpbmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBmb3JlaWduIGZ1bmN0aW9ucyBjYW4gYmUKK2FjY2Vzc2VkIGFzIGF0dHJpYnV0ZXMgb2YgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZnVuY3Rpb24KK29iamVjdHMgY3JlYXRlZCBpbiB0aGlzIHdheSBieSBkZWZhdWx0IGFjY2VwdCBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cywKK2FjY2VwdCBhbnkgY3R5cGVzIGRhdGEgaW5zdGFuY2VzIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiB0aGUgZGVmYXVsdAorcmVzdWx0IHR5cGUgc3BlY2lmaWVkIGJ5IHRoZSBsaWJyYXJ5IGxvYWRlci4gIFRoZXkgYXJlIGluc3RhbmNlcyBvZiBhCitwcml2YXRlIGNsYXNzOgorCitcYmVnaW57Y2xhc3NkZXNjKn17X0Z1bmNQdHJ9CitCYXNlIGNsYXNzIGZvciBDIGNhbGxhYmxlIGZvcmVpZ24gZnVuY3Rpb25zLgorXGVuZHtjbGFzc2Rlc2MqfQorCitJbnN0YW5jZXMgb2YgZm9yZWlnbiBmdW5jdGlvbnMgYXJlIGFsc28gQyBjb21wYXRpYmxlIGRhdGEgdHlwZXM7IHRoZXkKK3JlcHJlc2VudCBDIGZ1bmN0aW9uIHBvaW50ZXJzLgorCitUaGlzIGJlaGF2aW91ciBjYW4gYmUgY3VzdG9taXplZCBieSBhc3NpZ25pbmcgdG8gc3BlY2lhbCBhdHRyaWJ1dGVzIG9mCit0aGUgZm9yZWlnbiBmdW5jdGlvbiBvYmplY3QuCisKK1xiZWdpbnttZW1iZXJkZXNjfXtyZXN0eXBlfQorQXNzaWduIGEgY3R5cGVzIHR5cGUgdG8gc3BlY2lmeSB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIGZvcmVpZ24KK2Z1bmN0aW9uLiAgVXNlIFxjb2Rle05vbmV9IGZvciBcY29kZXt2b2lkfSBhIGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcKK2FueXRoaW5nLgorCitJdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0IHRoYXQgaXMgbm90IGEKK2N0eXBlcyB0eXBlLCBpbiB0aGlzIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gcmV0dXJuIGFuCitpbnRlZ2VyLCBhbmQgdGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhpcyBpbnRlZ2VyLAorYWxsb3dpbmcgdG8gZG8gZnVydGhlciBwcm9jZXNzaW5nIG9yIGVycm9yIGNoZWNraW5nLiAgVXNpbmcgdGhpcworaXMgZGVwcmVjYXRlZCwgZm9yIG1vcmUgZmxleGlibGUgcG9zdHByb2Nlc3Npbmcgb3IgZXJyb3IgY2hlY2tpbmcKK3VzZSBhIGN0eXBlcyBkYXRhIHR5cGUgYXMgXG1lbWJlcntyZXN0eXBlfSBhbmQgYXNzaWduIGEgY2FsbGFibGUgdG8gdGhlCitcbWVtYmVye2VycmNoZWNrfSBhdHRyaWJ1dGUuCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXthcmd0eXBlc30KK0Fzc2lnbiBhIHR1cGxlIG9mIGN0eXBlcyB0eXBlcyB0byBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyB0aGF0Cit0aGUgZnVuY3Rpb24gYWNjZXB0cy4gIEZ1bmN0aW9ucyB1c2luZyB0aGUgXGNvZGV7c3RkY2FsbH0gY2FsbGluZworY29udmVudGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzCit0aGUgbGVuZ3RoIG9mIHRoaXMgdHVwbGU7IGZ1bmN0aW9ucyB1c2luZyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24KK2FjY2VwdCBhZGRpdGlvbmFsLCB1bnNwZWNpZmllZCBhcmd1bWVudHMgYXMgd2VsbC4KKworV2hlbiBhIGZvcmVpZ24gZnVuY3Rpb24gaXMgY2FsbGVkLCBlYWNoIGFjdHVhbCBhcmd1bWVudCBpcyBwYXNzZWQKK3RvIHRoZSBcbWV0aG9ke2Zyb217XF99cGFyYW19IGNsYXNzIG1ldGhvZCBvZiB0aGUgaXRlbXMgaW4gdGhlCitcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZSwgdGhpcyBtZXRob2QgYWxsb3dzIHRvIGFkYXB0IHRoZSBhY3R1YWwKK2FyZ3VtZW50IHRvIGFuIG9iamVjdCB0aGF0IHRoZSBmb3JlaWduIGZ1bmN0aW9uIGFjY2VwdHMuICBGb3IKK2V4YW1wbGUsIGEgXGNsYXNze2N7XF99Y2hhcntcX31wfSBpdGVtIGluIHRoZSBcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZSB3aWxsCitjb252ZXJ0IGEgdW5pY29kZSBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IGludG8gYW4gYnl0ZSBzdHJpbmcKK3VzaW5nIGN0eXBlcyBjb252ZXJzaW9uIHJ1bGVzLgorCitOZXc6IEl0IGlzIG5vdyBwb3NzaWJsZSB0byBwdXQgaXRlbXMgaW4gYXJndHlwZXMgd2hpY2ggYXJlIG5vdAorY3R5cGVzIHR5cGVzLCBidXQgZWFjaCBpdGVtIG11c3QgaGF2ZSBhIFxtZXRob2R7ZnJvbXtcX31wYXJhbX0gbWV0aG9kCit3aGljaCByZXR1cm5zIGEgdmFsdWUgdXNhYmxlIGFzIGFyZ3VtZW50IChpbnRlZ2VyLCBzdHJpbmcsIGN0eXBlcworaW5zdGFuY2UpLiAgVGhpcyBhbGxvd3MgdG8gZGVmaW5lIGFkYXB0ZXJzIHRoYXQgY2FuIGFkYXB0IGN1c3RvbQorb2JqZWN0cyBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZXJyY2hlY2t9CitBc3NpZ24gYSBQeXRob24gZnVuY3Rpb24gb3IgYW5vdGhlciBjYWxsYWJsZSB0byB0aGlzIGF0dHJpYnV0ZS4KK1RoZSBjYWxsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aXRoIHRocmVlIG9yIG1vcmUgYXJndW1lbnRzOgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2NuaX17Y2FsbGFibGV9e3Jlc3VsdCwgZnVuYywgYXJndW1lbnRzfQorXGNvZGV7cmVzdWx0fSBpcyB3aGF0IHRoZSBmb3JlaWduIGZ1bmN0aW9uIHJldHVybnMsIGFzIHNwZWNpZmllZCBieSB0aGUKK1xtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLgorCitcY29kZXtmdW5jfSBpcyB0aGUgZm9yZWlnbiBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLCB0aGlzIGFsbG93cyB0bworcmV1c2UgdGhlIHNhbWUgY2FsbGFibGUgb2JqZWN0IHRvIGNoZWNrIG9yIHBvc3Rwcm9jZXNzIHRoZSByZXN1bHRzCitvZiBzZXZlcmFsIGZ1bmN0aW9ucy4KKworXGNvZGV7YXJndW1lbnRzfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgb3JpZ2luYWxseQorcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCB0aGlzIGFsbG93cyB0byBzcGVjaWFsaXplIHRoZQorYmVoYXZpb3VyIG9uIHRoZSBhcmd1bWVudHMgdXNlZC4KKworVGhlIG9iamVjdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlCitmb3JlaWduIGZ1bmN0aW9uIGNhbGwsIGJ1dCBpdCBjYW4gYWxzbyBjaGVjayB0aGUgcmVzdWx0IHZhbHVlIGFuZAorcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgZmFpbGVkLgorXGVuZHtmdW5jZGVzY25pfQorCitcYmVnaW57ZXhjZGVzY317QXJndW1lbnRFcnJvcigpfQorVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgY2Fubm90Citjb252ZXJ0IG9uZSBvZiB0aGUgcGFzc2VkIGFyZ3VtZW50cy4KK1xlbmR7ZXhjZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntGdW5jdGlvbiBwcm90b3R5cGVzXGxhYmVse2N0eXBlcy1mdW5jdGlvbi1wcm90b3R5cGVzfX0KKworRm9yZWlnbiBmdW5jdGlvbnMgY2FuIGFsc28gYmUgY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGZ1bmN0aW9uCitwcm90b3R5cGVzLiAgRnVuY3Rpb24gcHJvdG90eXBlcyBhcmUgc2ltaWxhciB0byBmdW5jdGlvbiBwcm90b3R5cGVzIGluCitDOyB0aGV5IGRlc2NyaWJlIGEgZnVuY3Rpb24gKHJldHVybiB0eXBlLCBhcmd1bWVudCB0eXBlcywgY2FsbGluZworY29udmVudGlvbikgd2l0aG91dCBkZWZpbmluZyBhbiBpbXBsZW1lbnRhdGlvbi4gIFRoZSBmYWN0b3J5CitmdW5jdGlvbnMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZGVzaXJlZCByZXN1bHQgdHlwZSBhbmQgdGhlIGFyZ3VtZW50Cit0eXBlcyBvZiB0aGUgZnVuY3Rpb24uCisKK1xiZWdpbntmdW5jZGVzY317Q0ZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9CitUaGUgcmV0dXJuZWQgZnVuY3Rpb24gcHJvdG90eXBlIGNyZWF0ZXMgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZQorc3RhbmRhcmQgQyBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGUgZnVuY3Rpb24gd2lsbCByZWxlYXNlIHRoZSBHSUwKK2R1cmluZyB0aGUgY2FsbC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317V0lORlVOQ1RZUEV9e3Jlc3R5cGUsICphcmd0eXBlc30KK1dpbmRvd3Mgb25seTogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHByb3RvdHlwZSBjcmVhdGVzIGZ1bmN0aW9ucwordGhhdCB1c2UgdGhlIFxjb2Rle3N0ZGNhbGx9IGNhbGxpbmcgY29udmVudGlvbiwgZXhjZXB0IG9uIFdpbmRvd3MgQ0UKK3doZXJlIFxmdW5jdGlvbntXSU5GVU5DVFlQRX0gaXMgdGhlIHNhbWUgYXMgXGZ1bmN0aW9ue0NGVU5DVFlQRX0uICBUaGUgZnVuY3Rpb24KK3dpbGwgcmVsZWFzZSB0aGUgR0lMIGR1cmluZyB0aGUgY2FsbC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317UFlGVU5DVFlQRX17cmVzdHlwZSwgKmFyZ3R5cGVzfQorVGhlIHJldHVybmVkIGZ1bmN0aW9uIHByb3RvdHlwZSBjcmVhdGVzIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUKK1B5dGhvbiBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGUgZnVuY3Rpb24gd2lsbCBcZW1waHtub3R9IHJlbGVhc2UgdGhlCitHSUwgZHVyaW5nIHRoZSBjYWxsLgorXGVuZHtmdW5jZGVzY30KKworRnVuY3Rpb24gcHJvdG90eXBlcyBjcmVhdGVkIGJ5IHRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBjYW4gYmUKK2luc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGFuZCBudW1iZXIgb2YKK3RoZSBwYXJhbWV0ZXJzIGluIHRoZSBjYWxsLgorCitcYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXthZGRyZXNzfQorUmV0dXJucyBhIGZvcmVpZ24gZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorXGVuZHtmdW5jZGVzY25pfQorCitcYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXtjYWxsYWJsZX0KK0NyZWF0ZSBhIEMgY2FsbGFibGUgZnVuY3Rpb24gKGEgY2FsbGJhY2sgZnVuY3Rpb24pIGZyb20gYSBQeXRob24KK1xjb2Rle2NhbGxhYmxlfS4KK1xlbmR7ZnVuY2Rlc2NuaX0KKworXGJlZ2lue2Z1bmNkZXNjbml9e3Byb3RvdHlwZX17ZnVuY19zcGVjXG9wdGlvbmFseywgcGFyYW1mbGFnc319CitSZXR1cm5zIGEgZm9yZWlnbiBmdW5jdGlvbiBleHBvcnRlZCBieSBhIHNoYXJlZCBsaWJyYXJ5LgorXGNvZGV7ZnVuY3tcX31zcGVjfSBtdXN0IGJlIGEgMi10dXBsZSBcY29kZXsobmFtZXtcX31vcntcX31vcmRpbmFsLCBsaWJyYXJ5KX0uCitUaGUgZmlyc3QgaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gYXMgc3RyaW5nLCBvcgordGhlIG9yZGluYWwgb2YgdGhlIGV4cG9ydGVkIGZ1bmN0aW9uIGFzIHNtYWxsIGludGVnZXIuICBUaGUgc2Vjb25kCitpdGVtIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBpbnN0YW5jZS4KK1xlbmR7ZnVuY2Rlc2NuaX0KKworXGJlZ2lue2Z1bmNkZXNjbml9e3Byb3RvdHlwZX17dnRibF9pbmRleCwgbmFtZVxvcHRpb25hbHssIHBhcmFtZmxhZ3Ncb3B0aW9uYWx7LCBpaWR9fX0KK1JldHVybnMgYSBmb3JlaWduIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGEgQ09NIG1ldGhvZC4KK1xjb2Rle3Z0Ymx7XF99aW5kZXh9IGlzIHRoZSBpbmRleCBpbnRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBhCitzbWFsbCBub25uZWdhdGl2ZSBpbnRlZ2VyLiBcdmFye25hbWV9IGlzIG5hbWUgb2YgdGhlIENPTSBtZXRob2QuCitcdmFye2lpZH0gaXMgYW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZXIgd2hpY2gKK2lzIHVzZWQgaW4gZXh0ZW5kZWQgZXJyb3IgcmVwb3J0aW5nLgorCitDT00gbWV0aG9kcyB1c2UgYSBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbjogVGhleSByZXF1aXJlIGEKK3BvaW50ZXIgdG8gdGhlIENPTSBpbnRlcmZhY2UgYXMgZmlyc3QgYXJndW1lbnQsIGluIGFkZGl0aW9uIHRvCit0aG9zZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgXG1lbWJlcnthcmd0eXBlc30gdHVwbGUuCitcZW5ke2Z1bmNkZXNjbml9CisKK1RoZSBvcHRpb25hbCBcdmFye3BhcmFtZmxhZ3N9IHBhcmFtZXRlciBjcmVhdGVzIGZvcmVpZ24gZnVuY3Rpb24KK3dyYXBwZXJzIHdpdGggbXVjaCBtb3JlIGZ1bmN0aW9uYWxpdHkgdGhhbiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkCithYm92ZS4KKworXHZhcntwYXJhbWZsYWdzfSBtdXN0IGJlIGEgdHVwbGUgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIFxtZW1iZXJ7YXJndHlwZXN9LgorCitFYWNoIGl0ZW0gaW4gdGhpcyB0dXBsZSBjb250YWlucyBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IGEKK3BhcmFtZXRlciwgaXQgbXVzdCBiZSBhIHR1cGxlIGNvbnRhaW5pbmcgMSwgMiwgb3IgMyBpdGVtcy4KKworVGhlIGZpcnN0IGl0ZW0gaXMgYW4gaW50ZWdlciBjb250YWluaW5nIGZsYWdzIGZvciB0aGUgcGFyYW1ldGVyOgorCitcYmVnaW57ZGF0YWRlc2NuaX17MX0KK1NwZWNpZmllcyBhbiBpbnB1dCBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17Mn0KK091dHB1dCBwYXJhbWV0ZXIuICBUaGUgZm9yZWlnbiBmdW5jdGlvbiBmaWxscyBpbiBhIHZhbHVlLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17NH0KK0lucHV0IHBhcmFtZXRlciB3aGljaCBkZWZhdWx0cyB0byB0aGUgaW50ZWdlciB6ZXJvLgorXGVuZHtkYXRhZGVzY25pfQorCitUaGUgb3B0aW9uYWwgc2Vjb25kIGl0ZW0gaXMgdGhlIHBhcmFtZXRlciBuYW1lIGFzIHN0cmluZy4gIElmIHRoaXMgaXMKK3NwZWNpZmllZCwgdGhlIGZvcmVpZ24gZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIG5hbWVkIHBhcmFtZXRlcnMuCisKK1RoZSBvcHRpb25hbCB0aGlyZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gd3JhcCB0aGUgV2luZG93cyBcY29kZXtNZXNzYWdlQm94QX0KK2Z1bmN0aW9uIHNvIHRoYXQgaXQgc3VwcG9ydHMgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBuYW1lZCBhcmd1bWVudHMuCitUaGUgQyBkZWNsYXJhdGlvbiBmcm9tIHRoZSB3aW5kb3dzIGhlYWRlciBmaWxlIGlzIHRoaXM6CitcYmVnaW57dmVyYmF0aW19CitXSU5VU0VSQVBJIGludCBXSU5BUEkKK01lc3NhZ2VCb3hBKAorICAgIEhXTkQgaFduZCAsCisgICAgTFBDU1RSIGxwVGV4dCwKKyAgICBMUENTVFIgbHBDYXB0aW9uLAorICAgIFVJTlQgdVR5cGUpOworXGVuZHt2ZXJiYXRpbX0KKworSGVyZSBpcyB0aGUgd3JhcHBpbmcgd2l0aCBcY29kZXtjdHlwZXN9OgorXGJlZ2lue3F1b3RlfQorXGJlZ2lue3ZlcmJhdGltfT4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgY19pbnQsIFdJTkZVTkNUWVBFLCB3aW5kbGwKKz4+PiBmcm9tIGN0eXBlcy53aW50eXBlcyBpbXBvcnQgSFdORCwgTFBDU1RSLCBVSU5UCis+Pj4gcHJvdG90eXBlID0gV0lORlVOQ1RZUEUoY19pbnQsIEhXTkQsIExQQ1NUUiwgTFBDU1RSLCBjX3VpbnQpCis+Pj4gcGFyYW1mbGFncyA9ICgxLCAiaHduZCIsIDApLCAoMSwgInRleHQiLCAiSGkiKSwgKDEsICJjYXB0aW9uIiwgTm9uZSksICgxLCAiZmxhZ3MiLCAwKQorPj4+IE1lc3NhZ2VCb3ggPSBwcm90b3R5cGUoKCJNZXNzYWdlQm94QSIsIHdpbmRsbC51c2VyMzIpLCBwYXJhbWZsYWdzKQorPj4+XGVuZHt2ZXJiYXRpbX0KK1xlbmR7cXVvdGV9CisKK1RoZSBNZXNzYWdlQm94IGZvcmVpZ24gZnVuY3Rpb24gY2FuIG5vdyBiZSBjYWxsZWQgaW4gdGhlc2Ugd2F5czoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBNZXNzYWdlQm94KCkKKz4+PiBNZXNzYWdlQm94KHRleHQ9IlNwYW0sIHNwYW0sIHNwYW0iKQorPj4+IE1lc3NhZ2VCb3goZmxhZ3M9MiwgdGV4dD0iZm9vIGJhciIpCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0Egc2Vjb25kIGV4YW1wbGUgZGVtb25zdHJhdGVzIG91dHB1dCBwYXJhbWV0ZXJzLiAgVGhlIHdpbjMyCitcY29kZXtHZXRXaW5kb3dSZWN0fSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSBzcGVjaWZpZWQKK3dpbmRvdyBieSBjb3B5aW5nIHRoZW0gaW50byBcY29kZXtSRUNUfSBzdHJ1Y3R1cmUgdGhhdCB0aGUgY2FsbGVyIGhhcyB0bworc3VwcGx5LiAgSGVyZSBpcyB0aGUgQyBkZWNsYXJhdGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KK1dJTlVTRVJBUEkgQk9PTCBXSU5BUEkKK0dldFdpbmRvd1JlY3QoCisgICAgIEhXTkQgaFduZCwKKyAgICAgTFBSRUNUIGxwUmVjdCk7CitcZW5ke3ZlcmJhdGltfQorCitIZXJlIGlzIHRoZSB3cmFwcGluZyB3aXRoIFxjb2Rle2N0eXBlc306CitcYmVnaW57cXVvdGV9CitcYmVnaW57dmVyYmF0aW19Pj4+IGZyb20gY3R5cGVzIGltcG9ydCBQT0lOVEVSLCBXSU5GVU5DVFlQRSwgd2luZGxsCis+Pj4gZnJvbSBjdHlwZXMud2ludHlwZXMgaW1wb3J0IEJPT0wsIEhXTkQsIFJFQ1QKKz4+PiBwcm90b3R5cGUgPSBXSU5GVU5DVFlQRShCT09MLCBIV05ELCBQT0lOVEVSKFJFQ1QpKQorPj4+IHBhcmFtZmxhZ3MgPSAoMSwgImh3bmQiKSwgKDIsICJscHJlY3QiKQorPj4+IEdldFdpbmRvd1JlY3QgPSBwcm90b3R5cGUoKCJHZXRXaW5kb3dSZWN0Iiwgd2luZGxsLnVzZXIzMiksIHBhcmFtZmxhZ3MpCis+Pj5cZW5ke3ZlcmJhdGltfQorXGVuZHtxdW90ZX0KKworRnVuY3Rpb25zIHdpdGggb3V0cHV0IHBhcmFtZXRlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiB0aGUgb3V0cHV0CitwYXJhbWV0ZXIgdmFsdWUgaWYgdGhlcmUgaXMgYSBzaW5nbGUgb25lLCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCitvdXRwdXQgcGFyYW1ldGVyIHZhbHVlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lLCBzbyB0aGUKK0dldFdpbmRvd1JlY3QgZnVuY3Rpb24gbm93IHJldHVybnMgYSBSRUNUIGluc3RhbmNlLCB3aGVuIGNhbGxlZC4KKworT3V0cHV0IHBhcmFtZXRlcnMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIFxtZW1iZXJ7ZXJyY2hlY2t9IHByb3RvY29sIHRvIGRvCitmdXJ0aGVyIG91dHB1dCBwcm9jZXNzaW5nIGFuZCBlcnJvciBjaGVja2luZy4gIFRoZSB3aW4zMgorXGNvZGV7R2V0V2luZG93UmVjdH0gYXBpIGZ1bmN0aW9uIHJldHVybnMgYSBcY29kZXtCT09MfSB0byBzaWduYWwgc3VjY2VzcyBvcgorZmFpbHVyZSwgc28gdGhpcyBmdW5jdGlvbiBjb3VsZCBkbyB0aGUgZXJyb3IgY2hlY2tpbmcsIGFuZCByYWlzZXMgYW4KK2V4Y2VwdGlvbiB3aGVuIHRoZSBhcGkgY2FsbCBmYWlsZWQ6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZGVmIGVycmNoZWNrKHJlc3VsdCwgZnVuYywgYXJncyk6CisuLi4gICAgIGlmIG5vdCByZXN1bHQ6CisuLi4gICAgICAgICByYWlzZSBXaW5FcnJvcigpCisuLi4gICAgIHJldHVybiBhcmdzCis+Pj4gR2V0V2luZG93UmVjdC5lcnJjaGVjayA9IGVycmNoZWNrCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0lmIHRoZSBcbWVtYmVye2VycmNoZWNrfSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhcmd1bWVudCB0dXBsZSBpdCByZWNlaXZlcwordW5jaGFuZ2VkLCBcY29kZXtjdHlwZXN9IGNvbnRpbnVlcyB0aGUgbm9ybWFsIHByb2Nlc3NpbmcgaXQgZG9lcyBvbiB0aGUKK291dHB1dCBwYXJhbWV0ZXJzLiAgSWYgeW91IHdhbnQgdG8gcmV0dXJuIGEgdHVwbGUgb2Ygd2luZG93Citjb29yZGluYXRlcyBpbnN0ZWFkIG9mIGEgXGNvZGV7UkVDVH0gaW5zdGFuY2UsIHlvdSBjYW4gcmV0cmlldmUgdGhlCitmaWVsZHMgaW4gdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gdGhlbSBpbnN0ZWFkLCB0aGUgbm9ybWFsIHByb2Nlc3NpbmcKK3dpbGwgbm8gbG9uZ2VyIHRha2UgcGxhY2U6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZGVmIGVycmNoZWNrKHJlc3VsdCwgZnVuYywgYXJncyk6CisuLi4gICAgIGlmIG5vdCByZXN1bHQ6CisuLi4gICAgICAgICByYWlzZSBXaW5FcnJvcigpCisuLi4gICAgIHJjID0gYXJnc1sxXQorLi4uICAgICByZXR1cm4gcmMubGVmdCwgcmMudG9wLCByYy5ib3R0b20sIHJjLnJpZ2h0Cis+Pj4KKz4+PiBHZXRXaW5kb3dSZWN0LmVycmNoZWNrID0gZXJyY2hlY2sKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworCitcc3Vic3Vic2VjdGlvbntVdGlsaXR5IGZ1bmN0aW9uc1xsYWJlbHtjdHlwZXMtdXRpbGl0eS1mdW5jdGlvbnN9fQorCitcYmVnaW57ZnVuY2Rlc2N9e2FkZHJlc3NvZn17b2JqfQorUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBpbnRlZ2VyLiAgXGNvZGV7b2JqfSBtdXN0CitiZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthbGlnbm1lbnR9e29ial9vcl90eXBlfQorUmV0dXJucyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIGN0eXBlcyB0eXBlLgorXGNvZGV7b2Jqe1xffW9ye1xffXR5cGV9IG11c3QgYmUgYSBjdHlwZXMgdHlwZSBvciBpbnN0YW5jZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317YnlyZWZ9e29ian0KK1JldHVybnMgYSBsaWdodC13ZWlnaHQgcG9pbnRlciB0byBcY29kZXtvYmp9LCB3aGljaCBtdXN0IGJlIGFuCitpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLiBUaGUgcmV0dXJuZWQgb2JqZWN0IGNhbiBvbmx5IGJlIHVzZWQgYXMKK2EgZm9yZWlnbiBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlci4gSXQgYmVoYXZlcyBzaW1pbGFyIHRvCitcY29kZXtwb2ludGVyKG9iail9LCBidXQgdGhlIGNvbnN0cnVjdGlvbiBpcyBhIGxvdCBmYXN0ZXIuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2Nhc3R9e29iaiwgdHlwZX0KK1RoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgY2FzdCBvcGVyYXRvciBpbiBDLiBJdCByZXR1cm5zIGEKK25ldyBpbnN0YW5jZSBvZiBcY29kZXt0eXBlfSB3aGljaCBwb2ludHMgdG8gdGhlIHNhbWUgbWVtb3J5IGJsb2NrIGFzCitcY29kZXtvYmp9LiBcY29kZXt0eXBlfSBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBhbmQgXGNvZGV7b2JqfSBtdXN0IGJlIGFuCitvYmplY3QgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBwb2ludGVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtjcmVhdGVfc3RyaW5nX2J1ZmZlcn17aW5pdF9vcl9zaXplXG9wdGlvbmFseywgc2l6ZX19CitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtdXRhYmxlIGNoYXJhY3RlciBidWZmZXIuIFRoZSByZXR1cm5lZAorb2JqZWN0IGlzIGEgY3R5cGVzIGFycmF5IG9mIFxjbGFzc3tje1xffWNoYXJ9LgorCitcY29kZXtpbml0e1xffW9ye1xffXNpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YKK3RoZSBhcnJheSwgb3IgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5CitpdGVtcy4KKworSWYgYSBzdHJpbmcgaXMgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50LCB0aGUgYnVmZmVyIGlzIG1hZGUgb25lCitpdGVtIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRoZSBsYXN0IGVsZW1lbnQKK2luIHRoZSBhcnJheSBpcyBhIE5VTCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuIEFuIGludGVnZXIgY2FuIGJlCitwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZQorYXJyYXkgaWYgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KKworSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHVuaWNvZGUgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50bworYW4gOC1iaXQgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Y3JlYXRlX3VuaWNvZGVfYnVmZmVyfXtpbml0X29yX3NpemVcb3B0aW9uYWx7LCBzaXplfX0KK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG11dGFibGUgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyLiBUaGUKK3JldHVybmVkIG9iamVjdCBpcyBhIGN0eXBlcyBhcnJheSBvZiBcY2xhc3N7Y3tcX313Y2hhcn0uCisKK1xjb2Rle2luaXR7XF99b3J7XF99c2l6ZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIHdoaWNoIHNwZWNpZmllcyB0aGUgc2l6ZSBvZgordGhlIGFycmF5LCBvciBhIHVuaWNvZGUgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplCit0aGUgYXJyYXkgaXRlbXMuCisKK0lmIGEgdW5pY29kZSBzdHJpbmcgaXMgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50LCB0aGUgYnVmZmVyIGlzCittYWRlIG9uZSBpdGVtIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRoZQorbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBhIE5VTCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuIEFuCitpbnRlZ2VyIGNhbiBiZSBwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5Cit0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaWYgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUKK3VzZWQuCisKK0lmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSA4LWJpdCBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGFuCit1bmljb2RlIHN0cmluZyBhY2NvcmRpbmcgdG8gY3R5cGVzIGNvbnZlcnNpb24gcnVsZXMuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e0RsbENhblVubG9hZE5vd317fQorV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50CitpbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQorRGxsQ2FuVW5sb2FkTm93IGZ1bmN0aW9uIHRoYXQgdGhlIHtcX31jdHlwZXMgZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtEbGxHZXRDbGFzc09iamVjdH17fQorV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50CitpbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQorRGxsR2V0Q2xhc3NPYmplY3QgZnVuY3Rpb24gdGhhdCB0aGUgXGNvZGV7e1xffWN0eXBlc30gZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtGb3JtYXRFcnJvcn17XG9wdGlvbmFse2NvZGV9fQorV2luZG93cyBvbmx5OiBSZXR1cm5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gSWYKK25vIGVycm9yIGNvZGUgaXMgc3BlY2lmaWVkLCB0aGUgbGFzdCBlcnJvciBjb2RlIGlzIHVzZWQgYnkgY2FsbGluZwordGhlIFdpbmRvd3MgYXBpIGZ1bmN0aW9uIEdldExhc3RFcnJvci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317R2V0TGFzdEVycm9yfXt9CitXaW5kb3dzIG9ubHk6IFJldHVybnMgdGhlIGxhc3QgZXJyb3IgY29kZSBzZXQgYnkgV2luZG93cyBpbiB0aGUKK2NhbGxpbmcgdGhyZWFkLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXttZW1tb3ZlfXtkc3QsIHNyYywgY291bnR9CitTYW1lIGFzIHRoZSBzdGFuZGFyZCBDIG1lbW1vdmUgbGlicmFyeSBmdW5jdGlvbjogY29waWVzIFx2YXJ7Y291bnR9CitieXRlcyBmcm9tIFxjb2Rle3NyY30gdG8gXHZhcntkc3R9LiBcdmFye2RzdH0gYW5kIFxjb2Rle3NyY30gbXVzdCBiZQoraW50ZWdlcnMgb3IgY3R5cGVzIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e21lbXNldH17ZHN0LCBjLCBjb3VudH0KK1NhbWUgYXMgdGhlIHN0YW5kYXJkIEMgbWVtc2V0IGxpYnJhcnkgZnVuY3Rpb246IGZpbGxzIHRoZSBtZW1vcnkKK2Jsb2NrIGF0IGFkZHJlc3MgXHZhcntkc3R9IHdpdGggXHZhcntjb3VudH0gYnl0ZXMgb2YgdmFsdWUKK1x2YXJ7Y30uIFx2YXJ7ZHN0fSBtdXN0IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyBhbiBhZGRyZXNzLCBvciBhCitjdHlwZXMgaW5zdGFuY2UuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1BPSU5URVJ9e3R5cGV9CitUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjdHlwZXMgcG9pbnRlcgordHlwZS4gUG9pbnRlciB0eXBlcyBhcmUgY2FjaGVkIGFuIHJldXNlZCBpbnRlcm5hbGx5LCBzbyBjYWxsaW5nCit0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkgaXMgY2hlYXAuIHR5cGUgbXVzdCBiZSBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtwb2ludGVyfXtvYmp9CitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcG9pbnRlciBpbnN0YW5jZSwgcG9pbnRpbmcgdG8KK1xjb2Rle29ian0uIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgb2YgdGhlIHR5cGUgUE9JTlRFUih0eXBlKG9iaikpLgorCitOb3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBhIGZvcmVpZ24KK2Z1bmN0aW9uIGNhbGwsIHlvdSBzaG91bGQgdXNlIFxjb2Rle2J5cmVmKG9iail9IHdoaWNoIGlzIG11Y2ggZmFzdGVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtyZXNpemV9e29iaiwgc2l6ZX0KK1RoaXMgZnVuY3Rpb24gcmVzaXplcyB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBvZiBvYmosIHdoaWNoCittdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgY3R5cGVzIHR5cGUuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlCit0aGUgYnVmZmVyIHNtYWxsZXIgdGhhbiB0aGUgbmF0aXZlIHNpemUgb2YgdGhlIG9iamVjdHMgdHlwZSwgYXMKK2dpdmVuIGJ5IHNpemVvZih0eXBlKG9iaikpLCBidXQgaXQgaXMgcG9zc2libGUgdG8gZW5sYXJnZSB0aGUKK2J1ZmZlci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0X2NvbnZlcnNpb25fbW9kZX17ZW5jb2RpbmcsIGVycm9yc30KK1RoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcnVsZXMgdGhhdCBjdHlwZXMgb2JqZWN0cyB1c2Ugd2hlbgorY29udmVydGluZyBiZXR3ZWVuIDgtYml0IHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5ncy4gZW5jb2RpbmcKK211c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyBhbiBlbmNvZGluZywgbGlrZSBcY29kZXsndXRmLTgnfSBvcgorXGNvZGV7J21iY3MnfSwgZXJyb3JzIG11c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcKK29uIGVuY29kaW5nL2RlY29kaW5nIGVycm9ycy4gRXhhbXBsZXMgb2YgcG9zc2libGUgdmFsdWVzIGFyZQorXGNvZGV7InN0cmljdCJ9LCBcY29kZXsicmVwbGFjZSJ9LCBvciBcY29kZXsiaWdub3JlIn0uCisKK1xjb2Rle3NldHtcX31jb252ZXJzaW9ue1xffW1vZGV9IHJldHVybnMgYSAyLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHByZXZpb3VzCitjb252ZXJzaW9uIHJ1bGVzLiBPbiB3aW5kb3dzLCB0aGUgaW5pdGlhbCBjb252ZXJzaW9uIHJ1bGVzIGFyZQorXGNvZGV7KCdtYmNzJywgJ2lnbm9yZScpfSwgb24gb3RoZXIgc3lzdGVtcyBcY29kZXsoJ2FzY2lpJywgJ3N0cmljdCcpfS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2l6ZW9mfXtvYmpfb3JfdHlwZX0KK1JldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBjdHlwZXMgdHlwZSBvciBpbnN0YW5jZSBtZW1vcnkKK2J1ZmZlci4gRG9lcyB0aGUgc2FtZSBhcyB0aGUgQyBcY29kZXtzaXplb2YoKX0gZnVuY3Rpb24uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3N0cmluZ19hdH17YWRkcmVzc1xvcHRpb25hbHssIHNpemV9fQorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgbWVtb3J5IGFkZHJlc3MKK2FkZHJlc3MuIElmIHNpemUgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHNpemUsIG90aGVyd2lzZSB0aGUKK3N0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317V2luRXJyb3J9e2NvZGU9Tm9uZSwgZGVzY3I9Tm9uZX0KK1dpbmRvd3Mgb25seTogdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgd29yc3QtbmFtZWQgdGhpbmcgaW4KK2N0eXBlcy4gSXQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBXaW5kb3dzRXJyb3IuIElmIFx2YXJ7Y29kZX0gaXMgbm90CitzcGVjaWZpZWQsIFxjb2Rle0dldExhc3RFcnJvcn0gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKK2NvZGUuIElmIFxjb2Rle2Rlc2NyfSBpcyBub3Qgc3BjaWZpZWQsIFxmdW5jdGlvbntGb3JtYXRFcnJvcn0gaXMgY2FsbGVkIHRvCitnZXQgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317d3N0cmluZ19hdH17YWRkcmVzc30KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIHN0YXJ0aW5nIGF0IG1lbW9yeQorYWRkcmVzcyBcY29kZXthZGRyZXNzfSBhcyB1bmljb2RlIHN0cmluZy4gSWYgXGNvZGV7c2l6ZX0gaXMgc3BlY2lmaWVkLAoraXQgaXMgdXNlZCBhcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZywgb3RoZXJ3aXNlCit0aGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUgemVyby10ZXJtaW5hdGVkLgorXGVuZHtmdW5jZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntEYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1kYXRhLXR5cGVzfX0KKworXGJlZ2lue2NsYXNzZGVzYyp9e19DRGF0YX0KK1RoaXMgbm9uLXB1YmxpYyBjbGFzcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgb2YgYWxsIGN0eXBlcyBkYXRhCit0eXBlcy4gIEFtb25nIG90aGVyIHRoaW5ncywgYWxsIGN0eXBlcyB0eXBlIGluc3RhbmNlcyBjb250YWluIGEKK21lbW9yeSBibG9jayB0aGF0IGhvbGQgQyBjb21wYXRpYmxlIGRhdGE7IHRoZSBhZGRyZXNzIG9mIHRoZQorbWVtb3J5IGJsb2NrIGlzIHJldHVybmVkIGJ5IHRoZSBcY29kZXthZGRyZXNzb2YoKX0gaGVscGVyIGZ1bmN0aW9uLgorQW5vdGhlciBpbnN0YW5jZSB2YXJpYWJsZSBpcyBleHBvc2VkIGFzIFxtZW1iZXJ7e1xffW9iamVjdHN9OyB0aGlzCitjb250YWlucyBvdGhlciBQeXRob24gb2JqZWN0cyB0aGF0IG5lZWQgdG8gYmUga2VwdCBhbGl2ZSBpbiBjYXNlCit0aGUgbWVtb3J5IGJsb2NrIGNvbnRhaW5zIHBvaW50ZXJzLgorXGVuZHtjbGFzc2Rlc2MqfQorCitDb21tb24gbWV0aG9kcyBvZiBjdHlwZXMgZGF0YSB0eXBlcywgdGhlc2UgYXJlIGFsbCBjbGFzcyBtZXRob2RzICh0bworYmUgZXhhY3QsIHRoZXkgYXJlIG1ldGhvZHMgb2YgdGhlIG1ldGFjbGFzcyk6CisKK1xiZWdpbnttZXRob2RkZXNjfXtmcm9tX2FkZHJlc3N9e2FkZHJlc3N9CitUaGlzIG1ldGhvZCByZXR1cm5zIGEgY3R5cGVzIHR5cGUgaW5zdGFuY2UgdXNpbmcgdGhlIG1lbW9yeQorc3BlY2lmaWVkIGJ5IGFkZHJlc3Mgd2hpY2ggbXVzdCBiZSBhbiBpbnRlZ2VyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZnJvbV9wYXJhbX17b2JqfQorVGhpcyBtZXRob2QgYWRhcHRzIG9iaiB0byBhIGN0eXBlcyB0eXBlLiAgSXQgaXMgY2FsbGVkIHdpdGggdGhlCithY3R1YWwgb2JqZWN0IHVzZWQgaW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwsIHdoZW4gdGhlIHR5cGUgaXMKK3ByZXNlbnQgaW4gdGhlIGZvcmVpZ24gZnVuY3Rpb25zIFxtZW1iZXJ7YXJndHlwZXN9IHR1cGxlOyBpdCBtdXN0CityZXR1cm4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuCisKK0FsbCBjdHlwZXMgZGF0YSB0eXBlcyBoYXZlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCitjbGFzc21ldGhvZCwgbm9ybWFsbHkgaXQgcmV0dXJucyBcY29kZXtvYmp9IGlmIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YKK3RoZSB0eXBlLiAgU29tZSB0eXBlcyBhY2NlcHQgb3RoZXIgb2JqZWN0cyBhcyB3ZWxsLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aW5fZGxsfXtuYW1lLCBsaWJyYXJ5fQorVGhpcyBtZXRob2QgcmV0dXJucyBhIGN0eXBlcyB0eXBlIGluc3RhbmNlIGV4cG9ydGVkIGJ5IGEgc2hhcmVkCitsaWJyYXJ5LiBcdmFye25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCBleHBvcnRzIHRoZSBkYXRhLAorXGNvZGV7bGlicmFyeX0gaXMgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyeS4KK1xlbmR7bWV0aG9kZGVzY30KKworQ29tbW9uIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBjdHlwZXMgZGF0YSB0eXBlczoKKworXGJlZ2lue21lbWJlcmRlc2N9e19iX2Jhc2VffQorU29tZXRpbWVzIGN0eXBlcyBkYXRhIGluc3RhbmNlcyBkbyBub3Qgb3duIHRoZSBtZW1vcnkgYmxvY2sgdGhleQorY29udGFpbiwgaW5zdGVhZCB0aGV5IHNoYXJlIHBhcnQgb2YgdGhlIG1lbW9yeSBibG9jayBvZiBhIGJhc2UKK29iamVjdC4gIFRoZSBcbWVtYmVye3tcX31ie1xffWJhc2V7XF99fSByZWFkb25seSBtZW1iZXIgaXMgdGhlIHJvb3QgY3R5cGVzCitvYmplY3QgdGhhdCBvd25zIHRoZSBtZW1vcnkgYmxvY2suCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtfYl9uZWVkc2ZyZWVffQorVGhpcyByZWFkb25seSB2YXJpYWJsZSBpcyB0cnVlIHdoZW4gdGhlIGN0eXBlcyBkYXRhIGluc3RhbmNlIGhhcworYWxsb2NhdGVkIHRoZSBtZW1vcnkgYmxvY2sgaXRzZWxmLCBmYWxzZSBvdGhlcndpc2UuCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtfb2JqZWN0c30KK1RoaXMgbWVtYmVyIGlzIGVpdGhlciBcY29kZXtOb25lfSBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBQeXRob24KK29iamVjdHMgdGhhdCBuZWVkIHRvIGJlIGtlcHQgYWxpdmUgc28gdGhhdCB0aGUgbWVtb3J5IGJsb2NrCitjb250ZW50cyBpcyBrZXB0IHZhbGlkLiAgVGhpcyBvYmplY3QgaXMgb25seSBleHBvc2VkIGZvcgorZGVidWdnaW5nOyBuZXZlciBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeS4KK1xlbmR7bWVtYmVyZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntGdW5kYW1lbnRhbCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1mdW5kYW1lbnRhbC1kYXRhLXR5cGVzfX0KKworXGJlZ2lue2NsYXNzZGVzYyp9e19TaW1wbGVDRGF0YX0KK1RoaXMgbm9uLXB1YmxpYyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgZnVuZGFtZW50YWwgY3R5cGVzCitkYXRhIHR5cGVzLiBJdCBpcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24KK2F0dHJpYnV0ZXMgb2YgdGhlIGZ1bmRhbWVudGFsIGN0eXBlcyBkYXRhIHR5cGVzLiAgXGNvZGV7e1xffVNpbXBsZUNEYXRhfQoraXMgYSBzdWJjbGFzcyBvZiBcY29kZXt7XF99Q0RhdGF9LCBzbyBpdCBpbmhlcml0cyB0aGVpciBtZXRob2RzIGFuZAorYXR0cmlidXRlcy4KK1xlbmR7Y2xhc3NkZXNjKn0KKworSW5zdGFuY2VzIGhhdmUgYSBzaW5nbGUgYXR0cmlidXRlOgorCitcYmVnaW57bWVtYmVyZGVzY317dmFsdWV9CitUaGlzIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBpbnN0YW5jZS4gRm9yCitpbnRlZ2VyIGFuZCBwb2ludGVyIHR5cGVzLCBpdCBpcyBhbiBpbnRlZ2VyLCBmb3IgY2hhcmFjdGVyIHR5cGVzLAoraXQgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZywgZm9yIGNoYXJhY3RlciBwb2ludGVyIHR5cGVzIGl0CitpcyBhIFB5dGhvbiBzdHJpbmcgb3IgdW5pY29kZSBzdHJpbmcuCisKK1doZW4gdGhlIFxjb2Rle3ZhbHVlfSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb20gYSBjdHlwZXMgaW5zdGFuY2UsCit1c3VhbGx5IGEgbmV3IG9iamVjdCBpcyByZXR1cm5lZCBlYWNoIHRpbWUuICBcY29kZXtjdHlwZXN9IGRvZXMgXGVtcGh7bm90fQoraW1wbGVtZW50IG9yaWdpbmFsIG9iamVjdCByZXR1cm4sIGFsd2F5cyBhIG5ldyBvYmplY3QgaXMKK2NvbnN0cnVjdGVkLiAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgYWxsIG90aGVyIGN0eXBlcyBvYmplY3QKK2luc3RhbmNlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworRnVuZGFtZW50YWwgZGF0YSB0eXBlcywgd2hlbiByZXR1cm5lZCBhcyBmb3JlaWduIGZ1bmN0aW9uIGNhbGwKK3Jlc3VsdHMsIG9yLCBmb3IgZXhhbXBsZSwgYnkgcmV0cmlldmluZyBzdHJ1Y3R1cmUgZmllbGQgbWVtYmVycyBvcgorYXJyYXkgaXRlbXMsIGFyZSB0cmFuc3BhcmVudGx5IGNvbnZlcnRlZCB0byBuYXRpdmUgUHl0aG9uIHR5cGVzLiAgSW4KK290aGVyIHdvcmRzLCBpZiBhIGZvcmVpZ24gZnVuY3Rpb24gaGFzIGEgXG1lbWJlcntyZXN0eXBlfSBvZiBcY2xhc3N7Y3tcX31jaGFye1xffXB9LAoreW91IHdpbGwgYWx3YXlzIHJlY2VpdmUgYSBQeXRob24gc3RyaW5nLCBcZW1waHtub3R9IGEgXGNsYXNze2N7XF99Y2hhcntcX31wfQoraW5zdGFuY2UuCisKK1N1YmNsYXNzZXMgb2YgZnVuZGFtZW50YWwgZGF0YSB0eXBlcyBkbyBcZW1waHtub3R9IGluaGVyaXQgdGhpcyBiZWhhdmlvdXIuCitTbywgaWYgYSBmb3JlaWduIGZ1bmN0aW9ucyBcbWVtYmVye3Jlc3R5cGV9IGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze2N7XF99dm9pZHtcX31wfSwKK3lvdSB3aWxsIHJlY2VpdmUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdWJjbGFzcyBmcm9tIHRoZSBmdW5jdGlvbiBjYWxsLgorT2YgY291cnNlLCB5b3UgY2FuIGdldCB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgYnkgYWNjZXNzaW5nIHRoZQorXGNvZGV7dmFsdWV9IGF0dHJpYnV0ZS4KKworVGhlc2UgYXJlIHRoZSBmdW5kYW1lbnRhbCBjdHlwZXMgZGF0YSB0eXBlczoKKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfYnl0ZX0KK1JlcHJlc2VudHMgdGhlIEMgc2lnbmVkIGNoYXIgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcworc21hbGwgaW50ZWdlci4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlcgoraW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2NoYXJ9CitSZXByZXNlbnRzIHRoZSBDIGNoYXIgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhIHNpbmdsZQorY2hhcmFjdGVyLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBzdHJpbmcgaW5pdGlhbGl6ZXIsCit0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2NoYXJfcH0KK1JlcHJlc2VudHMgdGhlIEMgY2hhciAqIGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCit6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBpbnRlZ2VyCithZGRyZXNzLCBvciBhIHN0cmluZy4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfZG91YmxlfQorUmVwcmVzZW50cyB0aGUgQyBkb3VibGUgZGF0YXR5cGUuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBmbG9hdCBpbml0aWFsaXplci4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfZmxvYXR9CitSZXByZXNlbnRzIHRoZSBDIGRvdWJsZSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnR9CitSZXByZXNlbnRzIHRoZSBDIHNpZ25lZCBpbnQgZGF0YXR5cGUuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLiBPbgorcGxhdGZvcm1zIHdoZXJlIFxjb2Rle3NpemVvZihpbnQpID09IHNpemVvZihsb25nKX0gaXQgaXMgYW4gYWxpYXMgdG8KK1xjbGFzc3tje1xffWxvbmd9LgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnQ4fQorUmVwcmVzZW50cyB0aGUgQyA4LWJpdCBcY29kZXtzaWduZWQgaW50fSBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffWJ5dGV9LgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnQxNn0KK1JlcHJlc2VudHMgdGhlIEMgMTYtYml0IHNpZ25lZCBpbnQgZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMgZm9yCitcY2xhc3N7Y3tcX31zaG9ydH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDMyfQorUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffWludH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDY0fQorUmVwcmVzZW50cyB0aGUgQyA2NC1iaXQgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMKK2ZvciBcY2xhc3N7Y3tcX31sb25nbG9uZ30uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2xvbmd9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3NpZ25lZCBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2xvbmdsb25nfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaWduZWQgbG9uZyBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMKK2FuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Nob3J0fQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaWduZWQgc2hvcnR9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgorb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2Nfc2l6ZV90fQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaXple1xffXR9IGRhdGF0eXBlLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y191Ynl0ZX0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgY2hhcn0gZGF0YXR5cGUsIGl0IGludGVycHJldHMgdGhlCit2YWx1ZSBhcyBzbWFsbCBpbnRlZ2VyLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbAoraW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludH0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgaW50fSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuIE9uCitwbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBpdCBpcyBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVsb25nfS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDh9CitSZXByZXNlbnRzIHRoZSBDIDgtYml0IHVuc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVieXRlfS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDE2fQorUmVwcmVzZW50cyB0aGUgQyAxNi1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgorXGNsYXNze2N7XF99dXNob3J0fS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDMyfQorUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgorXGNsYXNze2N7XF99dWludH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3VpbnQ2NH0KK1JlcHJlc2VudHMgdGhlIEMgNjQtYml0IHVuc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVsb25nbG9uZ30uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Vsb25nfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXt1bnNpZ25lZCBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Vsb25nbG9uZ30KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yCithY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzCitkb25lLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y191c2hvcnR9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3Vuc2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3ZvaWRfcH0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dm9pZCAqfSB0eXBlLiBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMKK2ludGVnZXIuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3djaGFyfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXt3Y2hhcntcX310fSBkYXRhdHlwZSwgYW5kIGludGVycHJldHMgdGhlIHZhbHVlIGFzIGEKK3NpbmdsZSBjaGFyYWN0ZXIgdW5pY29kZSBzdHJpbmcuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBzdHJpbmcgaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlCitleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3djaGFyX3B9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3djaGFye1xffXQgKn0gZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvCithIHplcm8tdGVybWluYXRlZCB3aWRlIGNoYXJhY3RlciBzdHJpbmcuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCithbiBpbnRlZ2VyIGFkZHJlc3MsIG9yIGEgc3RyaW5nLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17SFJFU1VMVH0KK1dpbmRvd3Mgb25seTogUmVwcmVzZW50cyBhIFxjbGFzc3tIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMgc3VjY2Vzcworb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtweV9vYmplY3R9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle1B5T2JqZWN0ICp9IGRhdGF0eXBlLgorXGVuZHtjbGFzc2Rlc2MqfQorCitUaGUgXGNvZGV7Y3R5cGVzLndpbnR5cGVzfSBtb2R1bGUgcHJvdmlkZXMgcXVpdGUgc29tZSBvdGhlciBXaW5kb3dzCitzcGVjaWZpYyBkYXRhIHR5cGVzLCBmb3IgZXhhbXBsZSBcY29kZXtIV05EfSwgXGNvZGV7V1BBUkFNfSwgb3IgXGNvZGV7RFdPUkR9LgorU29tZSB1c2VmdWwgc3RydWN0dXJlcyBsaWtlIFxjb2Rle01TR30gb3IgXGNvZGV7UkVDVH0gYXJlIGFsc28gZGVmaW5lZC4KKworCitcc3Vic3Vic2VjdGlvbntTdHJ1Y3R1cmVkIGRhdGEgdHlwZXNcbGFiZWx7Y3R5cGVzLXN0cnVjdHVyZWQtZGF0YS10eXBlc319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXsqYXJncywgKiprd30KK0Fic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVuaW9ucyBpbiBuYXRpdmUgYnl0ZSBvcmRlci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtCaWdFbmRpYW5TdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQorQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtiaWcgZW5kaWFufSBieXRlIG9yZGVyLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0xpdHRsZUVuZGlhblN0cnVjdHVyZX17KmFyZ3MsICoqa3d9CitBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdHJ1Y3R1cmVzIGluIFxlbXBoe2xpdHRsZSBlbmRpYW59IGJ5dGUgb3JkZXIuCitcZW5ke2NsYXNzZGVzY30KKworU3RydWN0dXJlcyB3aXRoIG5vbi1uYXRpdmUgYnl0ZSBvcmRlciBjYW5ub3QgY29udGFpbiBwb2ludGVyIHR5cGUKK2ZpZWxkcywgb3IgYW55IG90aGVyIGRhdGEgdHlwZXMgY29udGFpbmluZyBwb2ludGVyIHR5cGUgZmllbGRzLgorCitcYmVnaW57Y2xhc3NkZXNjfXtTdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQorQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtuYXRpdmV9IGJ5dGUgb3JkZXIuCitcZW5ke2NsYXNzZGVzY30KKworQ29uY3JldGUgc3RydWN0dXJlIGFuZCB1bmlvbiB0eXBlcyBtdXN0IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Npbmcgb25lCitvZiB0aGVzZSB0eXBlcywgYW5kIGF0IGxlYXN0IGRlZmluZSBhIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGNsYXNzIHZhcmlhYmxlLgorXGNvZGV7Y3R5cGVzfSB3aWxsIGNyZWF0ZSBkZXNjcmlwdG9ycyB3aGljaCBhbGxvdyByZWFkaW5nIGFuZCB3cml0aW5nIHRoZQorZmllbGRzIGJ5IGRpcmVjdCBhdHRyaWJ1dGUgYWNjZXNzZXMuICBUaGVzZSBhcmUgdGhlCisKK1xiZWdpbnttZW1iZXJkZXNjfXtfZmllbGRzX30KK0Egc2VxdWVuY2UgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBmaWVsZHMuICBUaGUgaXRlbXMgbXVzdCBiZQorMi10dXBsZXMgb3IgMy10dXBsZXMuICBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsCit0aGUgc2Vjb25kIGl0ZW0gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZDsgaXQgY2FuIGJlIGFueQorY3R5cGVzIGRhdGEgdHlwZS4KKworRm9yIGludGVnZXIgdHlwZSBmaWVsZHMsIGEgdGhpcmQgb3B0aW9uYWwgaXRlbSBjYW4gYmUgZ2l2ZW4uICBJdAorbXVzdCBiZSBhIHNtYWxsIHBvc2l0aXZlIGludGVnZXIgZGVmaW5pbmcgdGhlIGJpdCB3aWR0aCBvZiB0aGUKK2ZpZWxkLgorCitGaWVsZCBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gb25lIHN0cnVjdHVyZSBvciB1bmlvbi4gIFRoaXMgaXMKK25vdCBjaGVja2VkLCBvbmx5IG9uZSBmaWVsZCBjYW4gYmUgYWNjZXNzZWQgd2hlbiBuYW1lcyBhcmUKK3JlcGVhdGVkLgorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGNsYXNzIHZhcmlhYmxlIFxlbXBoe2FmdGVyfQordGhlIGNsYXNzIHN0YXRlbWVudCB0aGF0IGRlZmluZXMgdGhlIFN0cnVjdHVyZSBzdWJjbGFzcywgdGhpcworYWxsb3dzIHRvIGNyZWF0ZSBkYXRhIHR5cGVzIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSByZWZlcmVuY2UKK3RoZW1zZWx2ZXM6CitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBMaXN0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTGlzdC5fZmllbGRzXyA9IFsoInBuZXh0IiwgUE9JTlRFUihMaXN0KSksCisgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgIF0KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSBjbGFzcyB2YXJpYWJsZSBtdXN0LCBob3dldmVyLCBiZSBkZWZpbmVkIGJlZm9yZQordGhlIHR5cGUgaXMgZmlyc3QgdXNlZCAoYW4gaW5zdGFuY2UgaXMgY3JlYXRlZCwgXGNvZGV7c2l6ZW9mKCl9IGlzCitjYWxsZWQgb24gaXQsIGFuZCBzbyBvbikuICBMYXRlciBhc3NpZ25tZW50cyB0byB0aGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0KK2NsYXNzIHZhcmlhYmxlIHdpbGwgcmFpc2UgYW4gQXR0cmlidXRlRXJyb3IuCisKK1N0cnVjdHVyZSBhbmQgdW5pb24gc3ViY2xhc3MgY29uc3RydWN0b3JzIGFjY2VwdCBib3RoIHBvc2l0aW9uYWwKK2FuZCBuYW1lZCBhcmd1bWVudHMuICBQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplCit0aGUgZmllbGRzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fQorZGVmaW5pdGlvbiwgbmFtZWQgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcyB3aXRoCit0aGUgY29ycmVzcG9uZGluZyBuYW1lLgorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmVkIHN1Yi1zdWJjbGFzc2VzIG9mIHN0cnVjdHVyZSB0eXBlcywgdGhleQoraW5oZXJpdCB0aGUgZmllbGRzIG9mIHRoZSBiYXNlIGNsYXNzIHBsdXMgdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGRlZmluZWQKK2luIHRoZSBzdWItc3ViY2xhc3MsIGlmIGFueS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e19wYWNrX30KK0FuIG9wdGlvbmFsIHNtYWxsIGludGVnZXIgdGhhdCBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGFsaWdubWVudCBvZgorc3RydWN0dXJlIGZpZWxkcyBpbiB0aGUgaW5zdGFuY2UuICBcbWVtYmVye3tcX31wYWNre1xffX0gbXVzdCBhbHJlYWR5IGJlCitkZWZpbmVkIHdoZW4gXG1lbWJlcnt7XF99ZmllbGRze1xffX0gaXMgYXNzaWduZWQsIG90aGVyd2lzZSBpdCB3aWxsIGhhdmUgbm8KK2VmZmVjdC4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e19hbm9ueW1vdXNffQorQW4gb3B0aW9uYWwgc2VxdWVuY2UgdGhhdCBsaXN0cyB0aGUgbmFtZXMgb2YgdW5uYW1lZCAoYW5vbnltb3VzKQorZmllbGRzLiAgXGNvZGV7e1xffWFub255bW91c3tcX319IG11c3QgYmUgYWxyZWFkeSBkZWZpbmVkIHdoZW4gXG1lbWJlcnt7XF99ZmllbGRze1xffX0KK2lzIGFzc2lnbmVkLCBvdGhlcndpc2UgaXQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKworVGhlIGZpZWxkcyBsaXN0ZWQgaW4gdGhpcyB2YXJpYWJsZSBtdXN0IGJlIHN0cnVjdHVyZSBvciB1bmlvbiB0eXBlCitmaWVsZHMuICBcY29kZXtjdHlwZXN9IHdpbGwgY3JlYXRlIGRlc2NyaXB0b3JzIGluIHRoZSBzdHJ1Y3R1cmUgdHlwZQordGhhdCBhbGxvd3MgdG8gYWNjZXNzIHRoZSBuZXN0ZWQgZmllbGRzIGRpcmVjdGx5LCB3aXRob3V0IHRoZSBuZWVkCit0byBjcmVhdGUgdGhlIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZC4KKworSGVyZSBpcyBhbiBleGFtcGxlIHR5cGUgKFdpbmRvd3MpOgorXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgX1UoVW5pb24pOgorICAgIF9maWVsZHNfID0gWygibHB0ZGVzYyIsIFBPSU5URVIoVFlQRURFU0MpKSwKKyAgICAgICAgICAgICAgICAoImxwYWRlc2MiLCBQT0lOVEVSKEFSUkFZREVTQykpLAorICAgICAgICAgICAgICAgICgiaHJlZnR5cGUiLCBIUkVGVFlQRSldCisKK2NsYXNzIFRZUEVERVNDKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ1IiwgX1UpLAorICAgICAgICAgICAgICAgICgidnQiLCBWQVJUWVBFKV0KKworICAgIF9hbm9ueW1vdXNfID0gKCJ1IiwpCitcZW5ke3ZlcmJhdGltfQorCitUaGUgXGNvZGV7VFlQRURFU0N9IHN0cnVjdHVyZSBkZXNjcmliZXMgYSBDT00gZGF0YSB0eXBlLCB0aGUgXGNvZGV7dnR9CitmaWVsZCBzcGVjaWZpZXMgd2hpY2ggb25lIG9mIHRoZSB1bmlvbiBmaWVsZHMgaXMgdmFsaWQuICBTaW5jZSB0aGUKK1xjb2Rle3V9IGZpZWxkIGlzIGRlZmluZWQgYXMgYW5vbnltb3VzIGZpZWxkLCBpdCBpcyBub3cgcG9zc2libGUgdG8KK2FjY2VzcyB0aGUgbWVtYmVycyBkaXJlY3RseSBvZmYgdGhlIFRZUEVERVNDIGluc3RhbmNlLgorXGNvZGV7dGQubHB0ZGVzY30gYW5kIFxjb2Rle3RkLnUubHB0ZGVzY30gYXJlIGVxdWl2YWxlbnQsIGJ1dCB0aGUgZm9ybWVyCitpcyBmYXN0ZXIgc2luY2UgaXQgZG9lcyBub3QgbmVlZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgdW5pb24KK2luc3RhbmNlOgorXGJlZ2lue3ZlcmJhdGltfQordGQgPSBUWVBFREVTQygpCit0ZC52dCA9IFZUX1BUUgordGQubHB0ZGVzYyA9IFBPSU5URVIoc29tZV90eXBlKQordGQudS5scHRkZXNjID0gUE9JTlRFUihzb21lX3R5cGUpCitcZW5ke3ZlcmJhdGltfQorXGVuZHttZW1iZXJkZXNjfQorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmVkIHN1Yi1zdWJjbGFzc2VzIG9mIHN0cnVjdHVyZXMsIHRoZXkgaW5oZXJpdAordGhlIGZpZWxkcyBvZiB0aGUgYmFzZSBjbGFzcy4gIElmIHRoZSBzdWJjbGFzcyBkZWZpbml0aW9uIGhhcyBhCitzZXBhcmF0ZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSB2YXJpYWJsZSwgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gdGhpcyBhcmUKK2FwcGVuZGVkIHRvIHRoZSBmaWVsZHMgb2YgdGhlIGJhc2UgY2xhc3MuCisKK1N0cnVjdHVyZSBhbmQgdW5pb24gY29uc3RydWN0b3JzIGFjY2VwdCBib3RoIHBvc2l0aW9uYWwgYW5kCitrZXl3b3JkIGFyZ3VtZW50cy4gIFBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgbWVtYmVyCitmaWVsZHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgYXBwZWFyIGluIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319LiAgS2V5d29yZAorYXJndW1lbnRzIGluIHRoZSBjb25zdHJ1Y3RvciBhcmUgaW50ZXJwcmV0ZWQgYXMgYXR0cmlidXRlIGFzc2lnbm1lbnRzLAorc28gdGhleSB3aWxsIGluaXRpYWxpemUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gd2l0aCB0aGUgc2FtZSBuYW1lLCBvciBjcmVhdGUgbmV3CithdHRyaWJ1dGVzIGZvciBuYW1lcyBub3QgcHJlc2VudCBpbiBcbWVtYmVye3tcX31maWVsZHN7XF99fS4KKworCitcc3Vic3Vic2VjdGlvbntBcnJheXMgYW5kIHBvaW50ZXJzXGxhYmVse2N0eXBlcy1hcnJheXMtcG9pbnRlcnN9fQorCitYWFgKKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjdHlwZXNyZWYudGV4IGIvRG9jL2xpYi9saWJjdHlwZXNyZWYudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk1MGY0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY3R5cGVzcmVmLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi1cc3Vic2VjdGlvbntjdHlwZXMgcmVmZXJlbmNlXGxhYmVse2N0eXBlcy1yZWZlcmVuY2V9fQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGZ1bmN0aW9ucwotXHN1YnN1YnNlY3Rpb257Y3R5cGVzIGZ1bmN0aW9uc30KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGRyZXNzb2Z9e29ian0KLVJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgaW50ZWdlci4gIFx2YXJ7b2JqfSBtdXN0Ci1iZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthbGlnbm1lbnR9e29ial9vcl90eXBlfQotUmV0dXJucyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIGN0eXBlcyB0eXBlLgotXHZhcntvYmpfb3JfdHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlIG9yIGFuIGluc3RhbmNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2NsYXNzZGVzY317QXJndW1lbnRFcnJvcn17fQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgY2Fubm90IGNvbnZlcnQKLW9uZSBvZiB0aGUgcGFzc2VkIGFyZ3VtZW50cy4KLVxlbmR7ZXhjY2xhc3NkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2J5cmVmfXtvYmp9Ci1SZXR1cm5zIGEgbGlnaHQtd2VpZ2h0IHBvaW50ZXIgdG8gXHZhcntvYmp9LCB3aGljaCBtdXN0IGJlIGFuIGluc3RhbmNlCi1vZiBhIGN0eXBlcyB0eXBlLiAgVGhlIHJldHVybmVkIG9iamVjdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgZm9yZWlnbgotZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuICBJdCBiZWhhdmVzIHNpbWlsYXIgdG8gXGNvZGV7cG9pbnRlcihvYmopfSwKLWJ1dCB0aGUgY29uc3RydWN0aW9uIGlzIGEgbG90IGZhc3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2FzdH17b2JqLCB0eXBlfQotVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBjYXN0IG9wZXJhdG9yIGluIEMuICBJdCByZXR1cm5zIGEgbmV3Ci1pbnN0YW5jZSBvZiBcdmFye3R5cGV9IHdoaWNoIHBvaW50cyB0byB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYXMKLVxjb2Rle29ian0uICBcY29kZXt0eXBlfSBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBhbmQgXGNvZGV7b2JqfQotIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcG9pbnRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSUgWFhYIHNlcGFyYXRlIHNlY3Rpb24gZm9yIENGVU5DVFlQRSwgV0lORlVOQ1RZUEUsIFBZRlVOQ1RZUEU/Ci0KLVxiZWdpbntmdW5jZGVzY317Q0ZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1UaGlzIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiBwcm90b3R5cGUuICBUaGUKLWZ1bmN0aW9uIHByb3RvdHlwZSBkZXNjcmliZXMgYSBmdW5jdGlvbiB0aGF0IGhhcyBhIHJlc3VsdCB0eXBlIG9mCi1cY29kZXtyZXN0eXBlfSwgYW5kIGFjY2VwdHMgYXJndW1lbnRzIGFzIHNwZWNpZmllZCBieSBcY29kZXthcmd0eXBlc30uCi1UaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBzZXZlcmFsIGtpbmRzIG9mCi1mdW5jdGlvbnMsIGRlcGVuZGluZyBvbiBob3cgdGhlIHByb3RvdHlwZSBpcyBjYWxsZWQuCi0KLVRoZSBwcm90b3R5cGVzIHJldHVybmVkIGJ5IFxjb2Rle0NGVU5DVFlQRX0gb3IgXGNvZGV7UFlGVU5DVFlQRX0KLWNyZWF0ZSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIHN0YW5kYXJkIEMgY2FsbGluZyBjb252ZW50aW9uLAotcHJvdG90eXBlcyByZXR1cm5lZCBmcm9tIFxjb2Rle1dJTkZVTkNUWVBFfSAob24gV2luZG93cykgdXNlIHRoZQotXGNvZGV7X19zdGRjYWxsfSBjYWxsaW5nIGNvbnZlbnRpb24uCi0KLUZ1bmN0aW9ucyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIFxjb2Rle0NGVU5DVFlQRX0gYW5kCi1cY29kZXtXSU5GVU5DVFlQRX0gcHJvdG90eXBlcyByZWxlYXNlIHRoZSBQeXRob24gR0lMCi1iZWZvcmUgZW50ZXJpbmcgdGhlIGZvcmVpZ24gZnVuY3Rpb24sIGFuZCBhY3F1aXJlIGl0IGJhY2sgYWZ0ZXIKLWxlYXZpbmcgdGhlIGZ1bmN0aW9uIGNvZGUuCi0KLSUgWFhYIGRpZmZlcmVuY2VzIGJldHdlZW4gQ0ZVTkNUWVBFIC8gV0lORlVOQ1RZUEUgLyBQWUZVTkNUWVBFCi0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3N0cmluZ19idWZmZXJ9e2luaXRfb3Jfc2l6ZVxvcHRpb25hbHssIHNpemV9fQotVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbXV0YWJsZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlIHJldHVybmVkIG9iamVjdAotaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y19jaGFyfS4KLQotXHZhcntpbml0X29yX3NpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlCi1hcnJheSwgb3IgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5IGl0ZW1zLgotCi1JZiBhIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZSBvbmUKLWl0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpbgotdGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCBhcwotc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZiB0aGUKLWxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KLQotSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHVuaWNvZGUgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhbgotOC1iaXQgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3VuaWNvZGVfYnVmZmVyfXtpbml0X29yX3NpemVcb3B0aW9uYWx7LCBzaXplfX0KLVRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG11dGFibGUgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlCi1yZXR1cm5lZCBvYmplY3QgaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y193Y2hhcn0uCi0KLVx2YXJ7aW5pdF9vcl9zaXplfSBtdXN0IGJlIGFuIGludGVnZXIgd2hpY2ggc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZQotYXJyYXksIG9yIGEgdW5pY29kZSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5Ci1pdGVtcy4KLQotSWYgYSB1bmljb2RlIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZQotb25lIGl0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudAotaW4gdGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZAotYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZgotdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KLQotSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIDgtYml0IHN0cmluZywgaXQgaXMgY29udmVydGVkIGludG8gYW4KLXVuaWNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RGxsQ2FuVW5sb2FkTm93fXt9Ci1XaW5kb3dzIG9ubHk6IFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIHdoaWNoIGFsbG93cyB0byBpbXBsZW1lbnQKLWlucHJvY2VzcyBDT00gc2VydmVycyB3aXRoIGN0eXBlcy4gIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQotXGNvZGV7RGxsQ2FuVW5sb2FkTm93fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQotZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtEbGxHZXRDbGFzc09iamVjdH17fQotV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50Ci1pbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuICBJdCBpcyBjYWxsZWQgZnJvbSB0aGUKLVxjb2Rle0RsbEdldENsYXNzT2JqZWN0fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQotZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtGb3JtYXRFcnJvcn17XG9wdGlvbmFse2NvZGV9fQotV2luZG93cyBvbmx5OiBSZXR1cm5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gIElmIG5vCi1lcnJvciBjb2RlIGlzIHNwZWNpZmllZCwgdGhlIGxhc3QgZXJyb3IgY29kZSBpcyB1c2VkIGJ5IGNhbGxpbmcgdGhlCi1XaW5kb3dzIGFwaSBmdW5jdGlvbiBcY29kZXtHZXRMYXN0RXJyb3J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtHZXRMYXN0RXJyb3J9e30KLVdpbmRvd3Mgb25seTogUmV0dXJucyB0aGUgbGFzdCBlcnJvciBjb2RlIHNldCBieSBXaW5kb3dzIGluIHRoZQotY2FsbGluZyB0aHJlYWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21lbW1vdmV9e2RzdCwgc3JjLCBjb3VudH0KLVNhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtbW92ZX0gbGlicmFyeSBmdW5jdGlvbjogY29waWVzCi1cdmFye2NvdW50fSBieXRlcyBmcm9tIFxjb2Rle3NyY30gdG8gXGNvZGV7ZHN0fS4gIFxjb2Rle2RzdH0gYW5kCi1cY29kZXtzcmN9IG11c3QgYmUgaW50ZWdlcnMgb3IgY3R5cGVzIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21lbXNldH17ZHN0LCBjLCBjb3VudH0KLVNhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtc2V0fSBsaWJyYXJ5IGZ1bmN0aW9uOiBmaWxscyB0aGUKLW1lbW9yeSBjbG9jayBhdCBhZGRyZXNzIFxjb2Rle2RzdH0gd2l0aCBcdmFye2NvdW50fSBieXRlcyBvZiB2YWx1ZQotXHZhcntjfS4gIFx2YXJ7ZHN0fSBtdXN0IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyBhbiBhZGRyZXNzLCBvciBhIGN0eXBlcyBpbnN0YW5jZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317UE9JTlRFUn17dHlwZX0KLVRoaXMgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGN0eXBlcyBwb2ludGVyIHR5cGUuCi1Qb2ludGVyIHR5cGVzIGFyZSBjYWNoZWQgYW4gcmV1c2VkIGludGVybmFsbHksIHNvIGNhbGxpbmcgdGhpcwotZnVuY3Rpb24gcmVwZWF0ZWRseSBpcyBjaGVhcC4gIFx2YXJ7dHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb2ludGVyfXtvYmp9Ci1UaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcG9pbnRlciBpbnN0YW5jZSwgcG9pbnRpbmcgdG8gXHZhcntvYmp9LgotVGhlIHJldHVybmVkIG9iamVjdCBpcyBvZiB0aGUgdHlwZSBcY29kZXtQT0lOVEVSKHR5cGUob2JqKSl9LgotCi1Ob3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBhIGZvcmVpZ24KLWZ1bmN0aW9uIGNhbGwsIHlvdSBzaG91bGQgdXNlIFxjb2Rle2J5cmVmKG9iail9IHdoaWNoIGlzIG11Y2ggZmFzdGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtQWUZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbmFwaX17fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXNpemV9e29iaiwgc2l6ZX0KLVRoaXMgZnVuY3Rpb24gcmVzaXplcyB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBvZiBcdmFye29ian0sIHdoaWNoCi1tdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgY3R5cGVzIHR5cGUuICBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFrZSB0aGUKLWJ1ZmZlciBzbWFsbGVyIHRoYW4gdGhlIG5hdGl2ZSBzaXplIG9mIHRoZSBvYmplY3RzIHR5cGUsIGFzIGdpdmVuIGJ5Ci1cY29kZXtzaXplb2YodHlwZShvYmopKX0sIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBlbmxhcmdlIHRoZSBidWZmZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9jb252ZXJzaW9uX21vZGV9e2VuY29kaW5nLCBlcnJvcnN9Ci1UaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJ1bGVzIHRoYXQgY3R5cGVzIG9iamVjdHMgdXNlIHdoZW4gY29udmVydGluZwotYmV0d2VlbiA4LWJpdCBzdHJpbmdzIGFuZCB1bmljb2RlIHN0cmluZ3MuICBcdmFye2VuY29kaW5nfSBtdXN0IGJlIGEKLXN0cmluZyBzcGVjaWZ5aW5nIGFuIGVuY29kaW5nLCBsaWtlICd1dGYtOCcgb3IgJ21iY3MnLCBcdmFye2Vycm9yc30KLW11c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgb24gZW5jb2RpbmcvZGVjb2RpbmcKLWVycm9ycy4gIEV4YW1wbGVzIG9mIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBzdHJpY3QnJywgYGByZXBsYWNlJycsIG9yCi1gYGlnbm9yZScnLgotCi1cY29kZXtzZXRfY29udmVyc2lvbl9tb2RlfSByZXR1cm5zIGEgMi10dXBsZSBjb250YWluaW5nIHRoZSBwcmV2aW91cwotY29udmVyc2lvbiBydWxlcy4gIE9uIHdpbmRvd3MsIHRoZSBpbml0aWFsIGNvbnZlcnNpb24gcnVsZXMgYXJlCi1cY29kZXsoJ21iY3MnLCAnaWdub3JlJyl9LCBvbiBvdGhlciBzeXN0ZW1zIFxjb2RleygnYXNjaWknLCAnc3RyaWN0Jyl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaXplb2Z9e29ial9vcl90eXBlfQotUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIGN0eXBlcyB0eXBlIG9yIGluc3RhbmNlIG1lbW9yeSBidWZmZXIuCi1Eb2VzIHRoZSBzYW1lIGFzIHRoZSBDIHNpemVvZigpIGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdHJpbmdfYXR9e2FkZHJlc3Ncb3B0aW9uYWx7c2l6ZX19Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkgYWRkcmVzcwotXHZhcnthZGRyZXNzfS4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHNpemUsCi1vdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317V2luRXJyb3J9e2NvZGU9Tm9uZSwgZGVzY3I9Tm9uZX0KLVdpbmRvd3Mgb25seTogdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgd29yc3QtbmFtZWQgdGhpbmcgaW4KLWN0eXBlcy4gIEl0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7V2luZG93c0Vycm9yfS4gIElmIFx2YXJ7Y29kZX0KLWlzIG5vdCBzcGVjaWZpZWQsIFxjb2Rle0dldExhc3RFcnJvcn0gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKLWNvZGUuICBJZiBcdmFye2Rlc2NyfSBpcyBub3Qgc3BjaWZpZWQsIFx2YXJ7Rm9ybWF0RXJyb3J9IGlzIGNhbGxlZCB0bwotZ2V0IGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJTkZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dzdHJpbmdfYXR9e2FkZHJlc3N9Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkKLWFkZHJlc3MgXHZhcnthZGRyZXNzfSBhcyB1bmljb2RlIHN0cmluZy4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLAotaXQgaXMgdXNlZCBhcyBzaXplLCBvdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlCi16ZXJvLXRlcm1pbmF0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue2RhdGEgdHlwZXN9Ci0KLWN0eXBlcyBkZWZpbmVzIGEgbG90IG9mIEMgY29tcGF0aWJsZSBkYXRhdHlwZXMsIGFuZCBhbHNvIGFsbG93cyB0bwotZGVmaW5lIHlvdXIgb3duIHR5cGVzLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCBhIGN0eXBlcyB0eXBlIGluc3RhbmNlCi1ob2xkcyBhIG1lbW9yeSBibG9jayB0aGF0IGNvbnRhaW5zIEMgY29tcGF0aWJsZSBkYXRhLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9DRGF0YX17fQotVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0Ci1pcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gbWV0aG9kcyBvZiB0aGUgY3R5cGVzCi1kYXRhIHR5cGVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUNvbW1vbiBtZXRob2RzIG9mIGN0eXBlcyBkYXRhIHR5cGVzLCB0aGVzZSBhcmUgYWxsIGNsYXNzIG1ldGhvZHMgKHRvCi1iZSBleGFjdCwgdGhleSBhcmUgbWV0aG9kcyBvZiB0aGUgbWV0YWNsYXNzKToKLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21fYWRkcmVzc317YWRkcmVzc30KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSB1c2luZyB0aGUgbWVtb3J5IHNwZWNpZmllZAotYnkgXGNvZGV7YWRkcmVzc30uIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbV9wYXJhbX17b2JqfQotVGhpcyBtZXRob2QgYWRhcHRzIFxjb2Rle29ian0gdG8gYSBjdHlwZXMgdHlwZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2luX2RsbH17bmFtZSwgbGlicmFyeX0KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSBleHBvcnRlZCBieSBhIHNoYXJlZAotbGlicmFyeS4gIFx2YXJ7bmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IGV4cG9ydHMgdGhlIGRhdGEsCi1cdmFye2xpYnJhcnl9IGlzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLSUgc2ltcGxlIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue3NpbXBsZSBkYXRhIHR5cGVzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9TaW1wbGVDRGF0YX17fQotVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0Ci1pcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gYXR0cmlidXRlcyBvZiB0aGUKLWN0eXBlcyBkYXRhIHR5cGVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt2YWx1ZX0KLVRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGluc3RhbmNlLiAgRm9yIGludGVnZXIKLXR5cGVzLCBpdCBpcyBhbiBpbnRlZ2VyLgotXGVuZHttZW1iZXJkZXNjfQotCi1IZXJlIGFyZSB0aGUgc2ltcGxlIGN0eXBlcyBkYXRhIHR5cGVzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2J5dGV9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQotYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKLWluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfY2hhcn17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXJ9IGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMgYQotc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIHN0cmluZwotaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2NoYXJfcH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXIgKn0gZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvIGEKLXplcm8tdGVybWluYXRlZCBzdHJpbmcuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBpbnRlZ2VyIGFkZHJlc3MsCi1vciBhIHN0cmluZy4KLSUgWFhYIEV4cGxhaW4gdGhlIGRpZmZlcmVuY2UgdG8gUE9JTlRFUihjX2NoYXIpCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317Y19kb3VibGV9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfZmxvYXR9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCi1wbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgotYWxpYXMgdG8gXHZhcntjX2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50MTZ9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyAxNi1iaXQgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXHZhcntjX3Nob3J0fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2ludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfaW50fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2ludDY0fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgNjQtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfbG9uZ2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50OH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIDgtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IgXGNvZGV7Y19ieXRlfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmd9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmdsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKLWFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Nob3J0fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCi1hbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2Nfc2l6ZV90fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2l6ZV90fSBkYXRhdHlwZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VieXRlfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQotYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKLWluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCi1wbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgotYWxpYXMgdG8gXHZhcntjX2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludDE2fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMTYtYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXGNvZGV7Y191c2hvcnR9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXGNvZGV7Y191aW50fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ2NH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIDY0LWJpdCBcY29kZXt1bnNpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfdWxvbmdsb25nfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ4fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgOC1iaXQgXGNvZGV7dW5zaWduZWQgaW50fSBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMKLWZvciBcY29kZXtjX3VieXRlfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nbG9uZ317XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKLWFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VzaG9ydH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCi1hbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2Nfdm9pZF9wfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dm9pZCAqfSB0eXBlLiAgVGhlIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzCi1pbnRlZ2VyLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7d2NoYXJfdH0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhCi1zaW5nbGUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwKLXN0cmluZyBpbml0aWFsaXplciwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG11c3QgYmUgZXhhY3RseSBvbmUKLWNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyX3B9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXt3Y2hhcl90ICp9IGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCi16ZXJvLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLWludGVnZXIgYWRkcmVzcywgb3IgYSBzdHJpbmcuCi0lIFhYWCBFeHBsYWluIHRoZSBkaWZmZXJlbmNlIHRvIFBPSU5URVIoY193Y2hhcikKLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIUkVTVUxUfXt9Ci1XaW5kb3dzIG9ubHk6IFJlcHJlc2VudHMgYSBcY29kZXtIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMKLXN1Y2Nlc3Mgb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCi1cZW5ke2NsYXNzZGVzY30KLQotJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotJSBzdHJ1Y3R1cmVkIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue3N0cnVjdHVyZWQgZGF0YSB0eXBlc30KLQotXGJlZ2lue2NsYXNzZGVzY317QmlnRW5kaWFuU3RydWN0dXJlfXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TGl0dGxlRW5kaWFuU3RydWN0dXJlfXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317U3RydWN0dXJlfXt9Ci1CYXNlIGNsYXNzIGZvciBTdHJ1Y3R1cmUgZGF0YSB0eXBlcy4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGxpYnJhcmllcwotXHN1YnN1YnNlY3Rpb257bGlicmFyaWVzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDRExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y2RsbH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtMb2FkTGlicmFyeX17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e09sZURMTH17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e29sZWRsbH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e3B5X29iamVjdH17fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1B5RExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cHlkbGx9e30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UlRMRF9HTE9CQUx9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JUTERfTE9DQUx9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtXaW5ETEx9e25hbWUsIG1vZGU9UlRMRF9MT0NBTCwgaGFuZGxlPU5vbmV9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt3aW5kbGx9Ci1cZW5ke2RhdGFkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRpZmZsaWIudGV4IGIvRG9jL2xpYi9saWJkaWZmbGliLnRleAppbmRleCA3NjVhY2NjLi5hY2I1ZWQxIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmRpZmZsaWIudGV4CisrKyBiL0RvYy9saWIvbGliZGlmZmxpYi50ZXgKQEAgLTQxOSw2ICs0MTksMTYgQEAKICAgbGVuKFx2YXJ7Yn0pLCAwKX0uICBJdCBpcyB0aGUgb25seSB0cmlwbGUgd2l0aCBcY29kZXtcdmFye259ID09IDB9LgogICAlIEV4cGxhaW4gd2h5IGEgZHVtbXkgaXMgdXNlZCEKIAorICBJZgorICBcY29kZXsoXHZhcntpfSwgXHZhcntqfSwgXHZhcntufSl9IGFuZAorICBcY29kZXsoXHZhcntpJ30sIFx2YXJ7aid9LCBcdmFye24nfSl9IGFyZSBhZGphY2VudCB0cmlwbGVzIGluIHRoZSBsaXN0LAorICBhbmQgdGhlIHNlY29uZCBpcyBub3QgdGhlIGxhc3QgdHJpcGxlIGluIHRoZSBsaXN0LCB0aGVuCisgIFxjb2Rle1x2YXJ7aX0rXHZhcntufSAhPSBcdmFye2knfX0gb3IKKyAgXGNvZGV7XHZhcntqfStcdmFye259ICE9IFx2YXJ7aid9fTsgaW4gb3RoZXIgd29yZHMsIGFkamFjZW50IHRyaXBsZXMKKyAgYWx3YXlzIGRlc2NyaWJlIG5vbi1hZGphY2VudCBlcXVhbCBibG9ja3MuCisgIFx2ZXJzaW9uY2hhbmdlZFtUaGUgZ3VhcmFudGVlIHRoYXQgYWRqYWNlbnQgdHJpcGxlcyBhbHdheXMgZGVzY3JpYmUKKyAgICAgICAgICAgICAgICAgIG5vbi1hZGphY2VudCBibG9ja3Mgd2FzIGltcGxlbWVudGVkXXsyLjV9CisKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYnhjZCIsICJhYmNkIikKID4+PiBzLmdldF9tYXRjaGluZ19ibG9ja3MoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJldHJlZS50ZXggYi9Eb2MvbGliL2xpYmV0cmVlLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI5ODg3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJldHJlZS50ZXgKQEAgLTAsMCArMSwzNjcgQEAKK1xzZWN0aW9ue1xtb2R1bGV7ZWxlbWVudHRyZWV9IC0tLSBUaGUgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIE1vZHVsZX0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbGVtZW50dHJlZX0KK1xtb2R1bGVhdXRob3J7RnJlZHJpayBMdW5kaH17ZnJlZHJpa0BweXRob253YXJlLmNvbX0KK1xtb2R1bGVzeW5vcHNpc3tUaGlzIG1vZHVsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMKK29mIHRoZSBFbGVtZW50IGFuZCBFbGVtZW50VHJlZSB0eXBlcywgcGx1cyBzdXBwb3J0IGNsYXNzZXMuCisKK0EgQyB2ZXJzaW9uIG9mIHRoaXMgQVBJIGlzIGF2YWlsYWJsZSBhcyB4bWwuZXRyZWUuY0VsZW1lbnRUcmVlLn0KK1x2ZXJzaW9uYWRkZWR7Mi41fQorCisKK1xzdWJzZWN0aW9ue092ZXJ2aWV3XGxhYmVse2VsZW1lbnR0cmVlLW92ZXJ2aWV3fX0KKworVGhlIEVsZW1lbnQgdHlwZSBpcyBhIGZsZXhpYmxlIGNvbnRhaW5lciBvYmplY3QsIGRlc2lnbmVkIHRvIHN0b3JlCitoaWVyYXJjaGljYWwgZGF0YSBzdHJ1Y3R1cmVzIGluIG1lbW9yeS4gVGhlIHR5cGUgY2FuIGJlIGRlc2NyaWJlZCBhcyBhCitjcm9zcyBiZXR3ZWVuIGEgbGlzdCBhbmQgYSBkaWN0aW9uYXJ5LgorCitFYWNoIGVsZW1lbnQgaGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0OgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSB7fSAKK2EgdGFnIHdoaWNoIGlzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhCit0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyAodGhlIGVsZW1lbnQgdHlwZSwgaW4gb3RoZXIgd29yZHMpLgorCitcaXRlbSB7fSAKK2EgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIHN0b3JlZCBpbiBhIFB5dGhvbiBkaWN0aW9uYXJ5LgorCitcaXRlbSB7fSAKK2EgdGV4dCBzdHJpbmcuCisKK1xpdGVtIHt9IAorYW4gb3B0aW9uYWwgdGFpbCBzdHJpbmcuCisKK1xpdGVtIHt9IAorYSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMsIHN0b3JlZCBpbiBhIFB5dGhvbiBzZXF1ZW5jZQorCitcZW5ke2l0ZW1pemV9CisKK1RvIGNyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlLCB1c2UgdGhlIEVsZW1lbnQgb3IgU3ViRWxlbWVudCBmYWN0b3J5CitmdW5jdGlvbnMuCisKK1RoZSBFbGVtZW50VHJlZSBjbGFzcyBjYW4gYmUgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQKK3N0cnVjdHVyZSwgYW5kIGNvbnZlcnQgaXQgZnJvbSBhbmQgdG8gWE1MLgorCisKK1xzdWJzZWN0aW9ue0Z1bmN0aW9uc1xsYWJlbHtlbGVtZW50dHJlZS1mdW5jdGlvbnN9fQorCitcYmVnaW57ZnVuY2Rlc2N9e0NvbW1lbnR9e1xvcHRpb25hbHt0ZXh0fX0KK0NvbW1lbnQgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBzcGVjaWFsCitlbGVtZW50IHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBjb21tZW50LgorVGhlIGNvbW1lbnQgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYW4gOC1iaXQgQVNDSUkgc3RyaW5nIG9yIGEgVW5pY29kZQorc3RyaW5nLgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50IHN0cmluZy4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gZWxlbWVudCBpbnN0YW5jZSwgcmVwcmVzZW50aW5nIGEgY29tbWVudC4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317ZHVtcH17ZWxlbX0KK1dyaXRlcyBhbiBlbGVtZW50IHRyZWUgb3IgZWxlbWVudCBzdHJ1Y3R1cmUgdG8gc3lzLnN0ZG91dC4gIFRoaXMKK2Z1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKworVGhlIGV4YWN0IG91dHB1dCBmb3JtYXQgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgSW4gdGhpcwordmVyc2lvbiwgaXQncyB3cml0dGVuIGFzIGFuIG9yZGluYXJ5IFhNTCBmaWxlLgorCitcdmFye2VsZW19IGlzIGFuIGVsZW1lbnQgdHJlZSBvciBhbiBpbmRpdmlkdWFsIGVsZW1lbnQuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e0VsZW1lbnR9e3RhZ1xvcHRpb25hbHssIGF0dHJpYn1cb3B0aW9uYWx7LCAqKmV4dHJhfX0KK0VsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZQorc3RhbmRhcmQgRWxlbWVudCBpbnRlcmZhY2UuICBUaGUgZXhhY3QgY2xhc3Mgb3IgdHlwZSBvZiB0aGF0IG9iamVjdAoraXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LCBidXQgaXQgd2lsbCBhbHdheXMgYmUgY29tcGF0aWJsZSB3aXRoCit0aGUge1xffUVsZW1lbnRJbnRlcmZhY2UgY2xhc3MgaW4gdGhpcyBtb2R1bGUuCisKK1RoZSBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCitlaXRoZXIgOC1iaXQgQVNDSUkgc3RyaW5ncyBvciBVbmljb2RlIHN0cmluZ3MuCitcdmFye3RhZ30gaXMgdGhlIGVsZW1lbnQgbmFtZS4KK1x2YXJ7YXR0cmlifSBpcyBhbiBvcHRpb25hbCBkaWN0aW9uYXJ5LCBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KK1x2YXJ7ZXh0cmF9IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2Zyb21zdHJpbmd9e3RleHR9CitQYXJzZXMgYW4gWE1MIHNlY3Rpb24gZnJvbSBhIHN0cmluZyBjb25zdGFudC4gIFNhbWUgYXMgWE1MLgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBFbGVtZW50IGluc3RhbmNlLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtpc2VsZW1lbnR9e2VsZW1lbnR9CitDaGVja3MgaWYgYW4gb2JqZWN0IGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBlbGVtZW50IG9iamVjdC4KK1x2YXJ7ZWxlbWVudH0gaXMgYW4gZWxlbWVudCBpbnN0YW5jZS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQSB0cnVlIHZhbHVlIGlmIHRoaXMgaXMgYW4gZWxlbWVudCBvYmplY3QuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2l0ZXJwYXJzZX17c291cmNlXG9wdGlvbmFseywgZXZlbnRzfX0KK1BhcnNlcyBhbiBYTUwgc2VjdGlvbiBpbnRvIGFuIGVsZW1lbnQgdHJlZSBpbmNyZW1lbnRhbGx5LCBhbmQgcmVwb3J0cword2hhdCdzIGdvaW5nIG9uIHRvIHRoZSB1c2VyLgorXHZhcntzb3VyY2V9IGlzIGEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwgZGF0YS4KK1x2YXJ7ZXZlbnRzfSBpcyBhIGxpc3Qgb2YgZXZlbnRzIHRvIHJlcG9ydCBiYWNrLiAgSWYgb21pdHRlZCwgb25seSBgYGVuZCcnCitldmVudHMgYXJlIHJlcG9ydGVkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBIChldmVudCwgZWxlbSkgaXRlcmF0b3IuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3BhcnNlfXtzb3VyY2Vcb3B0aW9uYWx7LCBwYXJzZXJ9fQorUGFyc2VzIGFuIFhNTCBzZWN0aW9uIGludG8gYW4gZWxlbWVudCB0cmVlLgorXHZhcntzb3VyY2V9IGlzIGEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwgZGF0YS4KK1x2YXJ7cGFyc2VyfSBpcyBhbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorc3RhbmRhcmQgWE1MVHJlZUJ1aWxkZXIgcGFyc2VyIGlzIHVzZWQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIEVsZW1lbnRUcmVlIGluc3RhbmNlCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1Byb2Nlc3NpbmdJbnN0cnVjdGlvbn17dGFyZ2V0XG9wdGlvbmFseywgdGV4dH19CitQSSBlbGVtZW50IGZhY3RvcnkuICBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlcyBhIHNwZWNpYWwgZWxlbWVudAordGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCitcdmFye3RhcmdldH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgUEkgdGFyZ2V0LgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBQSSBjb250ZW50cywgaWYgZ2l2ZW4uCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIFBJLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtTdWJFbGVtZW50fXtwYXJlbnQsIHRhZ1xvcHRpb25hbHssIGF0dHJpYn0gXG9wdGlvbmFseywgKipleHRyYX19CitTdWJlbGVtZW50IGZhY3RvcnkuICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZWxlbWVudCBpbnN0YW5jZSwgYW5kCithcHBlbmRzIGl0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuCisKK1RoZSBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCitlaXRoZXIgOC1iaXQgQVNDSUkgc3RyaW5ncyBvciBVbmljb2RlIHN0cmluZ3MuCitcdmFye3BhcmVudH0gaXMgdGhlIHBhcmVudCBlbGVtZW50LgorXHZhcnt0YWd9IGlzIHRoZSBzdWJlbGVtZW50IG5hbWUuCitcdmFye2F0dHJpYn0gaXMgYW4gb3B0aW9uYWwgZGljdGlvbmFyeSwgY29udGFpbmluZyBlbGVtZW50IGF0dHJpYnV0ZXMuCitcdmFye2V4dHJhfSBjb250YWlucyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGdpdmVuIGFzIGtleXdvcmQgYXJndW1lbnRzLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBlbGVtZW50IGluc3RhbmNlLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt0b3N0cmluZ317ZWxlbWVudFxvcHRpb25hbHssIGVuY29kaW5nfX0KK0dlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgZWxlbWVudCwgaW5jbHVkaW5nIGFsbAorc3ViZWxlbWVudHMuCitcdmFye2VsZW1lbnR9IGlzIGFuIEVsZW1lbnQgaW5zdGFuY2UuCitcdmFye2VuY29kaW5nfSBpcyB0aGUgb3V0cHV0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gZW5jb2RlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIGRhdGEuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1hNTH17dGV4dH0KK1BhcnNlcyBhbiBYTUwgc2VjdGlvbiBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LiAgVGhpcyBmdW5jdGlvbiBjYW4KK2JlIHVzZWQgdG8gZW1iZWQgYGBYTUwgbGl0ZXJhbHMnJyBpbiBQeXRob24gY29kZS4KK1x2YXJ7dGV4dH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBYTUwgZGF0YS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gRWxlbWVudCBpbnN0YW5jZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317WE1MSUR9e3RleHR9CitQYXJzZXMgYW4gWE1MIHNlY3Rpb24gZnJvbSBhIHN0cmluZyBjb25zdGFudCwgYW5kIGFsc28gcmV0dXJucworYSBkaWN0aW9uYXJ5IHdoaWNoIG1hcHMgZnJvbSBlbGVtZW50IGlkOnMgdG8gZWxlbWVudHMuCitcdmFye3RleHR9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgWE1MIGRhdGEuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0EgdHVwbGUgY29udGFpbmluZyBhbiBFbGVtZW50IGluc3RhbmNlIGFuZCBhIGRpY3Rpb25hcnkuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCisKK1xzdWJzZWN0aW9ue0VsZW1lbnRUcmVlIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtZWxlbWVudHRyZWUtb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e0VsZW1lbnRUcmVlfXtcb3B0aW9uYWx7ZWxlbWVudCx9IFxvcHRpb25hbHtmaWxlfX0KK0VsZW1lbnRUcmVlIHdyYXBwZXIgY2xhc3MuICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZW50aXJlIGVsZW1lbnQKK2hpZXJhcmNoeSwgYW5kIGFkZHMgc29tZSBleHRyYSBzdXBwb3J0IGZvciBzZXJpYWxpemF0aW9uIHRvIGFuZCBmcm9tCitzdGFuZGFyZCBYTUwuCisKK1x2YXJ7ZWxlbWVudH0gaXMgdGhlIHJvb3QgZWxlbWVudC4KK1RoZSB0cmVlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUwgXHZhcntmaWxlfSBpZiBnaXZlbi4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317X3NldHJvb3R9e2VsZW1lbnR9CitSZXBsYWNlcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGlzIHRyZWUuICBUaGlzIGRpc2NhcmRzIHRoZQorY3VycmVudCBjb250ZW50cyBvZiB0aGUgdHJlZSwgYW5kIHJlcGxhY2VzIGl0IHdpdGggdGhlIGdpdmVuCitlbGVtZW50LiAgVXNlIHdpdGggY2FyZS4KK1x2YXJ7ZWxlbWVudH0gaXMgYW4gZWxlbWVudCBpbnN0YW5jZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmR9e3BhdGh9CitGaW5kcyB0aGUgZmlyc3QgdG9wbGV2ZWwgZWxlbWVudCB3aXRoIGdpdmVuIHRhZy4KK1NhbWUgYXMgZ2V0cm9vdCgpLmZpbmQocGF0aCkuCitcdmFye3BhdGh9IGlzIHRoZSBlbGVtZW50IHRvIGxvb2sgZm9yLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgTm9uZSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmRhbGx9e3BhdGh9CitGaW5kcyBhbGwgdG9wbGV2ZWwgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gdGFnLgorU2FtZSBhcyBnZXRyb290KCkuZmluZGFsbChwYXRoKS4KK1x2YXJ7cGF0aH0gaXMgdGhlIGVsZW1lbnQgdG8gbG9vayBmb3IuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0EgbGlzdCBvciBpdGVyYXRvciBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywKK2luIHNlY3Rpb24gb3JkZXIuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmaW5kdGV4dH17cGF0aFxvcHRpb25hbHssIGRlZmF1bHR9fQorRmluZHMgdGhlIGVsZW1lbnQgdGV4dCBmb3IgdGhlIGZpcnN0IHRvcGxldmVsIGVsZW1lbnQgd2l0aCBnaXZlbgordGFnLiAgU2FtZSBhcyBnZXRyb290KCkuZmluZHRleHQocGF0aCkuCitcdmFye3BhdGh9IGlzIHRoZSB0b3BsZXZlbCBlbGVtZW50IHRvIGxvb2sgZm9yLgorXHZhcntkZWZhdWx0fSBpcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK1RoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIHRoZQorZGVmYXVsdCB2YWx1ZSBubyBlbGVtZW50IHdhcyBmb3VuZC4gIE5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudAoraGFzIGlzIGZvdW5kLCBidXQgaGFzIG5vIHRleHQgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgorZW1wdHkgc3RyaW5nLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0aXRlcmF0b3J9e1xvcHRpb25hbHt0YWd9fQorQ3JlYXRlcyBhIHRyZWUgaXRlcmF0b3IgZm9yIHRoZSByb290IGVsZW1lbnQuICBUaGUgaXRlcmF0b3IgbG9vcHMKK292ZXIgYWxsIGVsZW1lbnRzIGluIHRoaXMgdHJlZSwgaW4gc2VjdGlvbiBvcmRlci4KK1x2YXJ7dGFnfSBpcyB0aGUgdGFnIHRvIGxvb2sgZm9yIChkZWZhdWx0IGlzIHRvIHJldHVybiBhbGwgZWxlbWVudHMpCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGl0ZXJhdG9yLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0cm9vdH17fQorR2V0cyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGlzIHRyZWUuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtwYXJzZX17c291cmNlXG9wdGlvbmFseywgcGFyc2VyfX0KK0xvYWRzIGFuIGV4dGVybmFsIFhNTCBzZWN0aW9uIGludG8gdGhpcyBlbGVtZW50IHRyZWUuCitcdmFye3NvdXJjZX0gaXMgYSBmaWxlIG5hbWUgb3IgZmlsZSBvYmplY3QuCitcdmFye3BhcnNlcn0gaXMgYW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKK3N0YW5kYXJkIFhNTFRyZWVCdWlsZGVyIHBhcnNlciBpcyB1c2VkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgc2VjdGlvbiByb290IGVsZW1lbnQuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXt3cml0ZX17ZmlsZVxvcHRpb25hbHssIGVuY29kaW5nfX0KK1dyaXRlcyB0aGUgZWxlbWVudCB0cmVlIHRvIGEgZmlsZSwgYXMgWE1MLgorXHZhcntmaWxlfSBpcyBhIGZpbGUgbmFtZSwgb3IgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHdyaXRpbmcuCitcdmFye2VuY29kaW5nfSBpcyB0aGUgb3V0cHV0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcc3Vic2VjdGlvbntRTmFtZSBPYmplY3RzXGxhYmVse2VsZW1lbnR0cmVlLXFuYW1lLW9iamVjdHN9fQorCitcYmVnaW57Y2xhc3NkZXNjfXtRTmFtZX17dGV4dF9vcl91cmlcb3B0aW9uYWx7LCB0YWd9fQorUU5hbWUgd3JhcHBlci4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JhcCBhIFFOYW1lIGF0dHJpYnV0ZSB2YWx1ZSwgaW4KK29yZGVyIHRvIGdldCBwcm9wZXIgbmFtZXNwYWNlIGhhbmRsaW5nIG9uIG91dHB1dC4KK1x2YXJ7dGV4dF9vcl91cml9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFFOYW1lIHZhbHVlLAoraW4gdGhlIGZvcm0ge1x7fXVyaXtcfX1sb2NhbCwgb3IsIGlmIHRoZSB0YWcgYXJndW1lbnQgaXMgZ2l2ZW4sCit0aGUgVVJJIHBhcnQgb2YgYSBRTmFtZS4KK0lmIFx2YXJ7dGFnfSBpcyBnaXZlbiwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzCithbiBVUkksIGFuZCB0aGlzIGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIGEgbG9jYWwgbmFtZS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gb3BhcXVlIG9iamVjdCwgcmVwcmVzZW50aW5nIHRoZSBRTmFtZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7Y2xhc3NkZXNjfQorCisKK1xzdWJzZWN0aW9ue1RyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtdHJlZWJ1aWxkZXItb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1RyZWVCdWlsZGVyfXtcb3B0aW9uYWx7ZWxlbWVudF9mYWN0b3J5fX0KK0dlbmVyaWMgZWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlci4gIFRoaXMgYnVpbGRlciBjb252ZXJ0cyBhIHNlcXVlbmNlCitvZiBzdGFydCwgZGF0YSwgYW5kIGVuZCBtZXRob2QgY2FsbHMgdG8gYSB3ZWxsLWZvcm1lZCBlbGVtZW50IHN0cnVjdHVyZS4KK1lvdSBjYW4gdXNlIHRoaXMgY2xhc3MgdG8gYnVpbGQgYW4gZWxlbWVudCBzdHJ1Y3R1cmUgdXNpbmcgYSBjdXN0b20gWE1MCitwYXJzZXIsIG9yIGEgcGFyc2VyIGZvciBzb21lIG90aGVyIFhNTC1saWtlIGZvcm1hdC4KK1RoZSBcdmFye2VsZW1lbnRfZmFjdG9yeX0gaXMgY2FsbGVkIHRvIGNyZWF0ZSBuZXcgRWxlbWVudCBpbnN0YW5jZXMgd2hlbgorZ2l2ZW4uCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9CitGbHVzaGVzIHRoZSBwYXJzZXIgYnVmZmVycywgYW5kIHJldHVybnMgdGhlIHRvcGxldmVsIGRvY3VtZW4KK2VsZW1lbnQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIEVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtkYXRhfXtkYXRhfQorQWRkcyB0ZXh0IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuCitcdmFye2RhdGF9IGlzIGEgc3RyaW5nLiAgVGhpcyBzaG91bGQgYmUgZWl0aGVyIGFuIDgtYml0IHN0cmluZworY29udGFpbmluZyBBU0NJSSB0ZXh0LCBvciBhIFVuaWNvZGUgc3RyaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZW5kfXt0YWd9CitDbG9zZXMgdGhlIGN1cnJlbnQgZWxlbWVudC4KK1x2YXJ7dGFnfSBpcyB0aGUgZWxlbWVudCBuYW1lLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgY2xvc2VkIGVsZW1lbnQuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzdGFydH17dGFnLCBhdHRyc30KK09wZW5zIGEgbmV3IGVsZW1lbnQuCitcdmFye3RhZ30gaXMgdGhlIGVsZW1lbnQgbmFtZS4KK1x2YXJ7YXR0cnN9IGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorVGhlIG9wZW5lZCBlbGVtZW50LgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCisKK1xzdWJzZWN0aW9ue1hNTFRyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUteG1sdHJlZWJ1aWxkZXItb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1hNTFRyZWVCdWlsZGVyfXtcb3B0aW9uYWx7aHRtbCx9IFxvcHRpb25hbHt0YXJnZXR9fQorRWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlciBmb3IgWE1MIHNvdXJjZSBkYXRhLCBiYXNlZCBvbiB0aGUKK2V4cGF0IHBhcnNlci4KK1x2YXJ7aHRtbH0gYXJlIHByZWRlZmluZWQgSFRNTCBlbnRpdGllcy4gIFRoaXMgZmxhZyBpcyBub3Qgc3VwcG9ydGVkCitieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KK1x2YXJ7dGFyZ2V0fSBpcyB0aGUgdGFyZ2V0IG9iamVjdC4gIElmIG9taXR0ZWQsIHRoZSBidWlsZGVyIHVzZXMgYW4KK2luc3RhbmNlIG9mIHRoZSBzdGFuZGFyZCBUcmVlQnVpbGRlciBjbGFzcy4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KK0ZpbmlzaGVzIGZlZWRpbmcgZGF0YSB0byB0aGUgcGFyc2VyLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBlbGVtZW50IHN0cnVjdHVyZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2RvY3R5cGV9e25hbWUsIHB1YmlkLCBzeXN0ZW19CitIYW5kbGVzIGEgZG9jdHlwZSBkZWNsYXJhdGlvbi4KK1x2YXJ7bmFtZX0gaXMgdGhlIGRvY3R5cGUgbmFtZS4KK1x2YXJ7cHViaWR9IGlzIHRoZSBwdWJsaWMgaWRlbnRpZmllci4KK1x2YXJ7c3lzdGVtfSBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmZWVkfXtkYXRhfQorRmVlZHMgZGF0YSB0byB0aGUgcGFyc2VyLgorCitcdmFye2RhdGF9IGlzIGVuY29kZWQgZGF0YS4KK1xlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnVuY3MudGV4IGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKaW5kZXggODkwNGQ1Zi4uNjViMGJmNSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJmdW5jcy50ZXgKKysrIGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKQEAgLTQwMSw3NyArNDAxLDI3IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2ZpbGV9e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGJ1ZnNpemV9fX0KLSAgUmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IChkZXNjcmliZWQgaW4KLSAgc2VjdGlvbn5ccmVme2JsdGluLWZpbGUtb2JqZWN0c30sIGBgXHVsaW5re0ZpbGUKLSAgT2JqZWN0c317Ymx0aW4tZmlsZS1vYmplY3RzLmh0bWx9JycpLgotICBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIFxjb2Rle3N0ZGlvfSdzCi0gIFxjZnVuY3Rpb257Zm9wZW4oKX06IFx2YXJ7ZmlsZW5hbWV9IGlzIHRoZSBmaWxlIG5hbWUgdG8gYmUgb3BlbmVkLAotICBcdmFye21vZGV9IGluZGljYXRlcyBob3cgdGhlIGZpbGUgaXMgdG8gYmUgb3BlbmVkOiBcY29kZXsncid9IGZvcgotICByZWFkaW5nLCBcY29kZXsndyd9IGZvciB3cml0aW5nICh0cnVuY2F0aW5nIGFuIGV4aXN0aW5nIGZpbGUpLCBhbmQKLSAgXGNvZGV7J2EnfSBvcGVucyBpdCBmb3IgYXBwZW5kaW5nICh3aGljaCBvbiBcZW1waHtzb21lfSBcVU5JWHt9Ci0gIHN5c3RlbXMgbWVhbnMgdGhhdCBcZW1waHthbGx9IHdyaXRlcyBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwKLSAgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uKS4KKyAgQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBcY2xhc3N7ZmlsZX0gdHlwZSwgZGVzY3JpYmVkIGZ1cnRoZXIgCisgIGluIHNlY3Rpb25+XHJlZntibHRpbi1maWxlLW9iamVjdHN9LCBgYFx1bGlua3tGaWxlCisgIE9iamVjdHN9e2JsdGluLWZpbGUtb2JqZWN0cy5odG1sfScnLiAgVGhlIGNvbnN0cnVjdG9yJ3MgYXJndW1lbnRzCisgIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUgXGZ1bmN0aW9ue29wZW4oKX0gYnVpbHQtaW4gZnVuY3Rpb24KKyAgZGVzY3JpYmVkIGJlbG93LgogCi0gIE1vZGVzIFxjb2RleydyKyd9LCBcY29kZXsndysnfSBhbmQgXGNvZGV7J2ErJ30gb3BlbiB0aGUgZmlsZSBmb3IKLSAgdXBkYXRpbmcgKG5vdGUgdGhhdCBcY29kZXsndysnfSB0cnVuY2F0ZXMgdGhlIGZpbGUpLiAgQXBwZW5kCi0gIFxjb2RleydiJ30gdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgb24gc3lzdGVtcwotICB0aGF0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBiaW5hcnkgYW5kIHRleHQgZmlsZXMgKGVsc2UgaXQgaXMKLSAgaWdub3JlZCkuICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzCi0gIHJhaXNlZC4KLSAgCi0gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBcY2Z1bmN0aW9ue2ZvcGVuKCl9IHZhbHVlcyBcdmFye21vZGV9Ci0gIG1heSBiZSBcY29kZXsnVSd9IG9yIFxjb2RleydyVSd9LiBJZiBQeXRob24gaXMgYnVpbHQgd2l0aCB1bml2ZXJzYWwKLSAgbmV3bGluZSBzdXBwb3J0ICh0aGUgZGVmYXVsdCkgdGhlIGZpbGUgaXMgb3BlbmVkIGFzIGEgdGV4dCBmaWxlLCBidXQKLSAgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIFxjb2RleydcZSBuJ30sIHRoZSBVbml4IGVuZC1vZi1saW5lCi0gIGNvbnZlbnRpb24sCi0gIFxjb2RleydcZSByJ30sIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBvciBcY29kZXsnXGUgclxlIG4nfSwgdGhlIFdpbmRvd3MKLSAgY29udmVudGlvbi4gQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcwotICBcY29kZXsnXGUgbid9Ci0gIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4gSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAotICBcdmFye21vZGV9IFxjb2RleydVJ30gaXMgdGhlIHNhbWUgYXMgbm9ybWFsIHRleHQgbW9kZS4gIE5vdGUgdGhhdAotICBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZSBhbiBhdHRyaWJ1dGUgY2FsbGVkCi0gIFxtZW1iZXJ7bmV3bGluZXN9IHdoaWNoIGhhcyBhIHZhbHVlIG9mIFxjb2Rle05vbmV9IChpZiBubyBuZXdsaW5lcwotICBoYXZlIHlldCBiZWVuIHNlZW4pLCBcY29kZXsnXGUgbid9LCBcY29kZXsnXGUgcid9LCBcY29kZXsnXGUgclxlIG4nfSwKLSAgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLgotCi0gIFB5dGhvbiBlbmZvcmNlcyB0aGF0IHRoZSBtb2RlLCBhZnRlciBzdHJpcHBpbmcgXGNvZGV7J1UnfSwgYmVnaW5zIHdpdGgKLSAgXGNvZGV7J3InfSwgXGNvZGV7J3cnfSBvciBcY29kZXsnYSd9LgotCi0gIElmIFx2YXJ7bW9kZX0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gXGNvZGV7J3InfS4gIFdoZW4gb3BlbmluZyBhCi0gIGJpbmFyeSBmaWxlLCB5b3Ugc2hvdWxkIGFwcGVuZCBcY29kZXsnYid9IHRvIHRoZSBcdmFye21vZGV9IHZhbHVlCi0gIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eS4gIChJdCdzIHVzZWZ1bCBldmVuIG9uIHN5c3RlbXMgd2hpY2ggZG9uJ3QKLSAgdHJlYXQgYmluYXJ5IGFuZCB0ZXh0IGZpbGVzIGRpZmZlcmVudGx5LCB3aGVyZSBpdCBzZXJ2ZXMgYXMKLSAgZG9jdW1lbnRhdGlvbi4pCi0gIFxpbmRleHtsaW5lLWJ1ZmZlcmVkIEkvT31caW5kZXh7dW5idWZmZXJlZCBJL099XGluZGV4e2J1ZmZlciBzaXplLCBJL099Ci0gIFxpbmRleHtJL08gY29udHJvbCFidWZmZXJpbmd9Ci0gIFRoZSBvcHRpb25hbCBcdmFye2J1ZnNpemV9IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUKLSAgZmlsZSdzIGRlc2lyZWQgYnVmZmVyIHNpemU6IDAgbWVhbnMgdW5idWZmZXJlZCwgMSBtZWFucyBsaW5lCi0gIGJ1ZmZlcmVkLCBhbnkgb3RoZXIgcG9zaXRpdmUgdmFsdWUgbWVhbnMgdXNlIGEgYnVmZmVyIG9mCi0gIChhcHByb3hpbWF0ZWx5KSB0aGF0IHNpemUuICBBIG5lZ2F0aXZlIFx2YXJ7YnVmc2l6ZX0gbWVhbnMgdG8gdXNlCi0gIHRoZSBzeXN0ZW0gZGVmYXVsdCwgd2hpY2ggaXMgdXN1YWxseSBsaW5lIGJ1ZmZlcmVkIGZvciB0dHkKLSAgZGV2aWNlcyBhbmQgZnVsbHkgYnVmZmVyZWQgZm9yIG90aGVyIGZpbGVzLiAgSWYgb21pdHRlZCwgdGhlIHN5c3RlbQotICBkZWZhdWx0IGlzIHVzZWQuXGZvb3Rub3RlewotICAgIFNwZWNpZnlpbmcgYSBidWZmZXIgc2l6ZSBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCBvbiBzeXN0ZW1zIHRoYXQKLSAgICBkb24ndCBoYXZlIFxjZnVuY3Rpb257c2V0dmJ1ZigpfS4gIFRoZSBpbnRlcmZhY2UgdG8gc3BlY2lmeSB0aGUKLSAgICBidWZmZXIgc2l6ZSBpcyBub3QgZG9uZSB1c2luZyBhIG1ldGhvZCB0aGF0IGNhbGxzCi0gICAgXGNmdW5jdGlvbntzZXR2YnVmKCl9LCBiZWNhdXNlIHRoYXQgbWF5IGR1bXAgY29yZSB3aGVuIGNhbGxlZAotICAgIGFmdGVyIGFueSBJL08gaGFzIGJlZW4gcGVyZm9ybWVkLCBhbmQgdGhlcmUncyBubyByZWxpYWJsZSB3YXkgdG8KLSAgICBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlLn0KKyAgV2hlbiBvcGVuaW5nIGEgZmlsZSwgaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBcZnVuY3Rpb257b3BlbigpfSBpbnN0ZWFkIG9mIAorICBpbnZva2luZyB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiAgXGNsYXNze2ZpbGV9IGlzIG1vcmUgc3VpdGVkIHRvCisgIHR5cGUgdGVzdGluZyAoZm9yIGV4YW1wbGUsIHdyaXRpbmcgXHNhbXB7aXNpbnN0YW5jZShmLCBmaWxlKX0pLgogCiAgIFx2ZXJzaW9uYWRkZWR7Mi4yfQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtSZXN0cmljdGlvbiBvbiBmaXJzdCBsZXR0ZXIgb2YgbW9kZSBzdHJpbmcKLSAgICAgICAgICAgICAgICAgIGludHJvZHVjZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317ZmlsdGVyfXtmdW5jdGlvbiwgbGlzdH0KICAgQ29uc3RydWN0IGEgbGlzdCBmcm9tIHRob3NlIGVsZW1lbnRzIG9mIFx2YXJ7bGlzdH0gZm9yIHdoaWNoCiAgIFx2YXJ7ZnVuY3Rpb259IHJldHVybnMgdHJ1ZS4gIFx2YXJ7bGlzdH0gbWF5IGJlIGVpdGhlciBhIHNlcXVlbmNlLCBhCiAgIGNvbnRhaW5lciB3aGljaCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yLCAgSWYgXHZhcntsaXN0fQotICBpcyBhIHN0cmluZyBvciBhIHR1cGxlLCB0aGUgcmVzdWx0IGFsc28gaGFzIHRoYXQgdHlwZTsgb3RoZXJ3aXNlIGl0Ci0gIGlzIGFsd2F5cyBhIGxpc3QuICBJZiBcdmFye2Z1bmN0aW9ufSBpcyBcY29kZXtOb25lfSwgdGhlIGlkZW50aXR5Ci0gIGZ1bmN0aW9uIGlzIGFzc3VtZWQsIHRoYXQgaXMsIGFsbCBlbGVtZW50cyBvZiBcdmFye2xpc3R9IHRoYXQgYXJlIGZhbHNlCi0gICh6ZXJvIG9yIGVtcHR5KSBhcmUgcmVtb3ZlZC4KKyAgaXMgYSBzdHJpbmcgb3IgYSB0dXBsZSwgdGhlIHJlc3VsdAorICBhbHNvIGhhcyB0aGF0IHR5cGU7IG90aGVyd2lzZSBpdCBpcyBhbHdheXMgYSBsaXN0LiAgSWYgXHZhcntmdW5jdGlvbn0gaXMKKyAgXGNvZGV7Tm9uZX0sIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBpcyBhc3N1bWVkLCB0aGF0IGlzLCBhbGwgZWxlbWVudHMgb2YKKyAgXHZhcntsaXN0fSB0aGF0IGFyZSBmYWxzZSBhcmUgcmVtb3ZlZC4KIAogICBOb3RlIHRoYXQgXGNvZGV7ZmlsdGVyKGZ1bmN0aW9uLCBcdmFye2xpc3R9KX0gaXMgZXF1aXZhbGVudCB0bwogICBcY29kZXtbaXRlbSBmb3IgaXRlbSBpbiBcdmFye2xpc3R9IGlmIGZ1bmN0aW9uKGl0ZW0pXX0gaWYgZnVuY3Rpb24gaXMKQEAgLTcwOSwxMCArNjU5LDcxIEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGJ1ZnNpemV9fX0KLSAgQSB3cmFwcGVyIGZvciB0aGUgXGZ1bmN0aW9ue2ZpbGUoKX0gZnVuY3Rpb24gYWJvdmUuICBUaGUgaW50ZW50IGlzCi0gIGZvciBcZnVuY3Rpb257b3BlbigpfSB0byBiZSBwcmVmZXJyZWQgZm9yIHVzZSBhcyBhIGZhY3RvcnkgZnVuY3Rpb24KLSAgcmV0dXJuaW5nIGEgbmV3IFxjbGFzc3tmaWxlfSBvYmplY3QuICBcY2xhc3N7ZmlsZX0gaXMgbW9yZSBzdWl0ZWQgdG8KLSAgdHlwZSB0ZXN0aW5nIChmb3IgZXhhbXBsZSwgd3JpdGluZyBcc2FtcHtpc2luc3RhbmNlKGYsIGZpbGUpfSkuCisgIE9wZW4gYSBmaWxlLCByZXR1cm5pbmcgYW4gb2JqZWN0IG9mIHRoZSBcY2xhc3N7ZmlsZX0gdHlwZSBkZXNjcmliZWQKKyAgaW4gc2VjdGlvbn5ccmVme2JsdGluLWZpbGUtb2JqZWN0c30sIGBgXHVsaW5re0ZpbGUKKyAgT2JqZWN0c317Ymx0aW4tZmlsZS1vYmplY3RzLmh0bWx9JycuICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLAorICBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzIHJhaXNlZC4gIFdoZW4gb3BlbmluZyBhIGZpbGUsIGl0J3MKKyAgcHJlZmVyYWJsZSB0byB1c2UgXGZ1bmN0aW9ue29wZW4oKX0gaW5zdGVhZCBvZiBpbnZva2luZyB0aGUKKyAgXGNsYXNze2ZpbGV9IGNvbnN0cnVjdG9yIGRpcmVjdGx5LgorCisgIFRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgXGNvZGV7c3RkaW99J3MKKyAgXGNmdW5jdGlvbntmb3BlbigpfTogXHZhcntmaWxlbmFtZX0gaXMgdGhlIGZpbGUgbmFtZSB0byBiZSBvcGVuZWQsCisgIGFuZCBcdmFye21vZGV9IGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSBmaWxlIGlzIHRvIGJlIG9wZW5lZC4KKworICBUaGUgbW9zdCBjb21tb25seS11c2VkIHZhbHVlcyBvZiBcdmFye21vZGV9IGFyZSBcY29kZXsncid9IGZvcgorICByZWFkaW5nLCBcY29kZXsndyd9IGZvciB3cml0aW5nICh0cnVuY2F0aW5nIHRoZSBmaWxlIGlmIGl0IGFscmVhZHkKKyAgZXhpc3RzKSwgYW5kIFxjb2RleydhJ30gZm9yIGFwcGVuZGluZyAod2hpY2ggb24gXGVtcGh7c29tZX0gXFVOSVh7fQorICBzeXN0ZW1zIG1lYW5zIHRoYXQgXGVtcGh7YWxsfSB3cml0ZXMgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUKKyAgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uKS4gIElmIFx2YXJ7bW9kZX0gaXMgb21pdHRlZCwKKyAgaXQgZGVmYXVsdHMgdG8gXGNvZGV7J3InfS4gIFdoZW4gb3BlbmluZyBhIGJpbmFyeSBmaWxlLCB5b3Ugc2hvdWxkCisgIGFwcGVuZCBcY29kZXsnYid9IHRvIHRoZSBcdmFye21vZGV9IHZhbHVlIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5CisgIG1vZGUsIHdoaWNoIHdpbGwgaW1wcm92ZSBwb3J0YWJpbGl0eS4gIChBcHBlbmRpbmcgXGNvZGV7J2InfSBpcworICB1c2VmdWwgZXZlbiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgdHJlYXQgYmluYXJ5IGFuZCB0ZXh0IGZpbGVzCisgIGRpZmZlcmVudGx5LCB3aGVyZSBpdCBzZXJ2ZXMgYXMgZG9jdW1lbnRhdGlvbi4pICBTZWUgYmVsb3cgZm9yIG1vcmUKKyAgcG9zc2libGUgdmFsdWVzIG9mIFx2YXJ7bW9kZX0uCisKKyAgXGluZGV4e2xpbmUtYnVmZmVyZWQgSS9PfVxpbmRleHt1bmJ1ZmZlcmVkIEkvT31caW5kZXh7YnVmZmVyIHNpemUsIEkvT30KKyAgXGluZGV4e0kvTyBjb250cm9sIWJ1ZmZlcmluZ30KKyAgVGhlIG9wdGlvbmFsIFx2YXJ7YnVmc2l6ZX0gYXJndW1lbnQgc3BlY2lmaWVzIHRoZQorICBmaWxlJ3MgZGVzaXJlZCBidWZmZXIgc2l6ZTogMCBtZWFucyB1bmJ1ZmZlcmVkLCAxIG1lYW5zIGxpbmUKKyAgYnVmZmVyZWQsIGFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBtZWFucyB1c2UgYSBidWZmZXIgb2YKKyAgKGFwcHJveGltYXRlbHkpIHRoYXQgc2l6ZS4gIEEgbmVnYXRpdmUgXHZhcntidWZzaXplfSBtZWFucyB0byB1c2UKKyAgdGhlIHN5c3RlbSBkZWZhdWx0LCB3aGljaCBpcyB1c3VhbGx5IGxpbmUgYnVmZmVyZWQgZm9yIHR0eQorICBkZXZpY2VzIGFuZCBmdWxseSBidWZmZXJlZCBmb3Igb3RoZXIgZmlsZXMuICBJZiBvbWl0dGVkLCB0aGUgc3lzdGVtCisgIGRlZmF1bHQgaXMgdXNlZC5cZm9vdG5vdGV7CisgICAgU3BlY2lmeWluZyBhIGJ1ZmZlciBzaXplIGN1cnJlbnRseSBoYXMgbm8gZWZmZWN0IG9uIHN5c3RlbXMgdGhhdAorICAgIGRvbid0IGhhdmUgXGNmdW5jdGlvbntzZXR2YnVmKCl9LiAgVGhlIGludGVyZmFjZSB0byBzcGVjaWZ5IHRoZQorICAgIGJ1ZmZlciBzaXplIGlzIG5vdCBkb25lIHVzaW5nIGEgbWV0aG9kIHRoYXQgY2FsbHMKKyAgICBcY2Z1bmN0aW9ue3NldHZidWYoKX0sIGJlY2F1c2UgdGhhdCBtYXkgZHVtcCBjb3JlIHdoZW4gY2FsbGVkCisgICAgYWZ0ZXIgYW55IEkvTyBoYXMgYmVlbiBwZXJmb3JtZWQsIGFuZCB0aGVyZSdzIG5vIHJlbGlhYmxlIHdheSB0bworICAgIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGNhc2UufQorCisgIE1vZGVzIFxjb2RleydyKyd9LCBcY29kZXsndysnfSBhbmQgXGNvZGV7J2ErJ30gb3BlbiB0aGUgZmlsZSBmb3IKKyAgdXBkYXRpbmcgKG5vdGUgdGhhdCBcY29kZXsndysnfSB0cnVuY2F0ZXMgdGhlIGZpbGUpLiAgQXBwZW5kCisgIFxjb2RleydiJ30gdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgb24gc3lzdGVtcworICB0aGF0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBiaW5hcnkgYW5kIHRleHQgZmlsZXM7IG9uIHN5c3RlbXMKKyAgdGhhdCBkb24ndCBoYXZlIHRoaXMgZGlzdGluY3Rpb24sIGFkZGluZyB0aGUgXGNvZGV7J2InfSBoYXMgbm8gZWZmZWN0LgorICAKKyAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFxjZnVuY3Rpb257Zm9wZW4oKX0gdmFsdWVzIFx2YXJ7bW9kZX0KKyAgbWF5IGJlIFxjb2RleydVJ30gb3IgXGNvZGV7J3JVJ30uICBQeXRob24gaXMgdXN1YWxseSBidWlsdCB3aXRoIHVuaXZlcnNhbAorICBuZXdsaW5lIHN1cHBvcnQ7IHN1cHBseWluZyBcY29kZXsnVSd9IG9wZW5zIHRoZSBmaWxlIGFzIGEgdGV4dCBmaWxlLCBidXQKKyAgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIHRoZSBmb2xsb3dpbmc6IHRoZSBcVU5JWHt9IGVuZC1vZi1saW5lCisgIGNvbnZlbnRpb24gXGNvZGV7J1xlIG4nfSwgCisgIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBcY29kZXsnXGUgcid9LCBvciB0aGUgV2luZG93cworICBjb252ZW50aW9uIFxjb2RleydcZSByXGUgbid9LiBBbGwgb2YgdGhlc2UgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zIGFyZSBzZWVuIGFzCisgIFxjb2RleydcZSBuJ30KKyAgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLiBJZiBQeXRob24gaXMgYnVpbHQgd2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0CisgIGEgXHZhcnttb2RlfSB3aXRoIFxjb2RleydVJ30gaXMgdGhlIHNhbWUgYXMgbm9ybWFsIHRleHQgbW9kZS4gIE5vdGUgdGhhdAorICBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZSBhbiBhdHRyaWJ1dGUgY2FsbGVkCisgIFxtZW1iZXJ7bmV3bGluZXN9IHdoaWNoIGhhcyBhIHZhbHVlIG9mIFxjb2Rle05vbmV9IChpZiBubyBuZXdsaW5lcworICBoYXZlIHlldCBiZWVuIHNlZW4pLCBcY29kZXsnXGUgbid9LCBcY29kZXsnXGUgcid9LCBcY29kZXsnXGUgclxlIG4nfSwKKyAgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLgorCisgIFB5dGhvbiBlbmZvcmNlcyB0aGF0IHRoZSBtb2RlLCBhZnRlciBzdHJpcHBpbmcgXGNvZGV7J1UnfSwgYmVnaW5zIHdpdGgKKyAgXGNvZGV7J3InfSwgXGNvZGV7J3cnfSBvciBcY29kZXsnYSd9LgorCisgIFx2ZXJzaW9uY2hhbmdlZFtSZXN0cmljdGlvbiBvbiBmaXJzdCBsZXR0ZXIgb2YgbW9kZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgIGludHJvZHVjZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317b3JkfXtjfQpAQCAtNzY0LDE1ICs3NzUsMzAgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KIGNsYXNzIEMob2JqZWN0KToKICAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuX194ID0gTm9uZQotICAgIGRlZiBnZXR4KHNlbGYpOiByZXR1cm4gc2VsZi5fX3gKLSAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX194ID0gdmFsdWUKLSAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX194CisgICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94CisgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWUKKyAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX3gKICAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgIkknbSB0aGUgJ3gnIHByb3BlcnR5LiIpCiBcZW5ke3ZlcmJhdGltfQogCiAgIElmIGdpdmVuLCBcdmFye2RvY30gd2lsbCBiZSB0aGUgZG9jc3RyaW5nIG9mIHRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUuCiAgIE90aGVyd2lzZSwgdGhlIHByb3BlcnR5IHdpbGwgY29weSBcdmFye2ZnZXR9J3MgZG9jc3RyaW5nIChpZiBpdAotICBleGlzdHMpLgorICBleGlzdHMpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjcmVhdGUgcmVhZC1vbmx5IHByb3BlcnRpZXMKKyAgZWFzaWx5IHVzaW5nIFxmdW5jdGlvbntwcm9wZXJ0eSgpfSBhcyBhIGRlY29yYXRvcjoKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgUGFycm90KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl92b2x0YWdlID0gMTAwMDAwCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdm9sdGFnZShzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IHZvbHRhZ2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl92b2x0YWdlCitcZW5ke3ZlcmJhdGltfQorCisgIHR1cm5zIHRoZSBcbWV0aG9ke3ZvbHRhZ2UoKX0gbWV0aG9kIGludG8gYSBgYGdldHRlcicnIGZvciBhIHJlYWQtb25seQorICBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lLgogCiAgIFx2ZXJzaW9uYWRkZWR7Mi4yfQogICBcdmVyc2lvbmNoYW5nZWRbVXNlIFx2YXJ7ZmdldH0ncyBkb2NzdHJpbmcgaWYgbm8gXHZhcntkb2N9IGdpdmVuXXsyLjV9CkBAIC05NTgsOCArOTg0LDMwIEBACiBcYmVnaW57ZnVuY2Rlc2N9e3NvcnRlZH17aXRlcmFibGVcb3B0aW9uYWx7LCBjbXBcb3B0aW9uYWx7LAogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxvcHRpb25hbHssIHJldmVyc2V9fX19CiAgIFJldHVybiBhIG5ldyBzb3J0ZWQgbGlzdCBmcm9tIHRoZSBpdGVtcyBpbiBcdmFye2l0ZXJhYmxlfS4KLSAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBcdmFye2NtcH0sIFx2YXJ7a2V5fSwgYW5kIFx2YXJ7cmV2ZXJzZX0KLSAgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRob3NlIGZvciB0aGUgXG1ldGhvZHtsaXN0LnNvcnQoKX0gbWV0aG9kLgorCisgIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgXHZhcntjbXB9LCBcdmFye2tleX0sIGFuZCBcdmFye3JldmVyc2V9IGhhdmUKKyAgdGhlIHNhbWUgbWVhbmluZyBhcyB0aG9zZSBmb3IgdGhlIFxtZXRob2R7bGlzdC5zb3J0KCl9IG1ldGhvZAorICAoZGVzY3JpYmVkIGluIHNlY3Rpb25+XHJlZnt0eXBlc3NlcS1tdXRhYmxlfSkuCisKKyAgXHZhcntjbXB9IHNwZWNpZmllcyBhIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMKKyAgKGl0ZXJhYmxlIGVsZW1lbnRzKSB3aGljaCBzaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUsIHplcm8gb3IgcG9zaXRpdmUKKyAgbnVtYmVyIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIKKyAgdGhhbiwgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6CisgIFxzYW1we1x2YXJ7Y21wfT1ca2V5d29yZHtsYW1iZGF9IFx2YXJ7eH0sXHZhcnt5fToKKyAgXGZ1bmN0aW9ue2NtcH0oeC5sb3dlcigpLCB5Lmxvd2VyKCkpfQorICAgICAKKyAgXHZhcntrZXl9IHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG8KKyAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQ6CisgICAgIFxzYW1we1x2YXJ7a2V5fT1cZnVuY3Rpb257c3RyLmxvd2VyfX0KKworICBcdmFye3JldmVyc2V9IGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBcY29kZXtUcnVlfSwgdGhlbiB0aGUKKyAgICAgbGlzdCBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLgorCisgIEluIGdlbmVyYWwsIHRoZSBcdmFye2tleX0gYW5kIFx2YXJ7cmV2ZXJzZX0gY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlCisgIG11Y2ggZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50IFx2YXJ7Y21wfSBmdW5jdGlvbi4gIFRoaXMgaXMKKyAgYmVjYXVzZSBcdmFye2NtcH0gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGxpc3QgZWxlbWVudCB3aGlsZQorICBcdmFye2tleX0gYW5kIFx2YXJ7cmV2ZXJzZX0gdG91Y2ggZWFjaCBlbGVtZW50IG9ubHkgb25jZS4KKwogICBcdmVyc2lvbmFkZGVkezIuNH0KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2V0dGV4dC50ZXggYi9Eb2MvbGliL2xpYmdldHRleHQudGV4CmluZGV4IGU0MWY4YmYuLjVjN2M2YjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZ2V0dGV4dC50ZXgKKysrIGIvRG9jL2xpYi9saWJnZXR0ZXh0LnRleApAQCAtNTQ5LDcgKzU0OSw3IEBACiB3cml0dGVuIGEgcHJvZ3JhbSBjYWxsZWQKIFxwcm9ncmFte3hwb3R9IHdoaWNoIGRvZXMgYSBzaW1pbGFyIGpvYi4gIEl0IGlzIGF2YWlsYWJsZSBhcyBwYXJ0IG9mCiBoaXMgXHByb2dyYW17cG8tdXRpbHN9IHBhY2thZ2UgYXQKLVx1cmx7aHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8tdXRpbHMvSFRNTC99Ln0gcHJvZ3JhbQorXHVybHtodHRwOi8vcG8tdXRpbHMucHJvZ2ljaWVscy1icGkuY2EvfS59IHByb2dyYW0KIHNjYW5zIGFsbCB5b3VyIFB5dGhvbiBzb3VyY2UgY29kZSBsb29raW5nIGZvciB0aGUgc3RyaW5ncyB5b3UKIHByZXZpb3VzbHkgbWFya2VkIGFzIHRyYW5zbGF0YWJsZS4gIEl0IGlzIHNpbWlsYXIgdG8gdGhlIEdOVQogXHByb2dyYW17Z2V0dGV4dH0gcHJvZ3JhbSBleGNlcHQgdGhhdCBpdCB1bmRlcnN0YW5kcyBhbGwgdGhlCkBAIC01ODUsOCArNTg1LDggQEAKIHRyYW5zbGF0aW9uIHByb2Nlc3NpbmcgZHVyaW5nIHJ1bi10aW1lLgogCiBIb3cgeW91IHVzZSB0aGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgaW4geW91ciBjb2RlIGRlcGVuZHMgb24KLXdoZXRoZXIgeW91IGFyZSBpbnRlcm5hdGlvbmFsaXppbmcgeW91ciBlbnRpcmUgYXBwbGljYXRpb24gb3IgYSBzaW5nbGUKLW1vZHVsZS4KK3doZXRoZXIgeW91IGFyZSBpbnRlcm5hdGlvbmFsaXppbmcgYSBzaW5nbGUgbW9kdWxlIG9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLgorVGhlIG5leHQgdHdvIHNlY3Rpb25zIHdpbGwgZGlzY3VzcyBlYWNoIGNhc2UuCiAKIFxzdWJzdWJzZWN0aW9ue0xvY2FsaXppbmcgeW91ciBtb2R1bGV9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaW1wLnRleCBiL0RvYy9saWIvbGliaW1wLnRleAppbmRleCBlMGE3NzVjLi41OThkMzUxIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmltcC50ZXgKKysrIGIvRG9jL2xpYi9saWJpbXAudGV4CkBAIC0yMzIsNiArMjMyLDI0IEBACiBzb3VyY2UgZmlsZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntjbGFzc2Rlc2N9e051bGxJbXBvcnRlcn17cGF0aF9zdHJpbmd9CitUaGUgXGNsYXNze051bGxJbXBvcnRlcn0gdHlwZSBpcyBhIFxwZXB7MzAyfSBpbXBvcnQgaG9vayB0aGF0IGhhbmRsZXMKK25vbi1kaXJlY3RvcnkgcGF0aCBzdHJpbmdzIGJ5IGZhaWxpbmcgdG8gZmluZCBhbnkgbW9kdWxlcy4gIENhbGxpbmcgdGhpcwordHlwZSB3aXRoIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBvciBlbXB0eSBzdHJpbmcgcmFpc2VzCitcZXhjZXB0aW9ue0ltcG9ydEVycm9yfS4gIE90aGVyd2lzZSwgYSBcY2xhc3N7TnVsbEltcG9ydGVyfSBpbnN0YW5jZSBpcworcmV0dXJuZWQuCisKK1B5dGhvbiBhZGRzIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgdG8gXGNvZGV7c3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGV9IGZvcgorYW55IHBhdGggZW50cmllcyB0aGF0IGFyZSBub3QgZGlyZWN0b3JpZXMgYW5kIGFyZSBub3QgaGFuZGxlZCBieSBhbnkgb3RoZXIKK3BhdGggaG9va3Mgb24gXGNvZGV7c3lzLnBhdGhfaG9va3N9LiAgSW5zdGFuY2VzIGhhdmUgb25seSBvbmUgbWV0aG9kOgorCitcYmVnaW57bWV0aG9kZGVzY317ZmluZF9tb2R1bGV9e2Z1bGxuYW1lIFxvcHRpb25hbHssIHBhdGh9fQorVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgXGNvZGV7Tm9uZX0sIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkCittb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLgorXGVuZHttZXRob2RkZXNjfQorCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2xhc3NkZXNjfQogCiBcc3Vic2VjdGlvbntFeGFtcGxlc30KIFxsYWJlbHtleGFtcGxlcy1pbXB9CkBAIC0yNTcsNyArMjc1LDcgQEAKICAgICAjIHRoZXJlJ3MgYSBwcm9ibGVtIHdlIGNhbid0IGhhbmRsZSAtLSBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQuCiAKICAgICBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKG5hbWUpCi0gICAgCisKICAgICB0cnk6CiAgICAgICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleCBiL0RvYy9saWIvbGliaW5zcGVjdC50ZXgKaW5kZXggNWNhYmI4MC4uODU2NTFmMCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleAorKysgYi9Eb2MvbGliL2xpYmluc3BlY3QudGV4CkBAIC0xODAsMTMgKzE4MCwzMiBAQAogICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGF0YSBkZXNjcmlwdG9yLgogCiAgIERhdGEgZGVzY3JpcHRvcnMgaGF2ZSBib3RoIGEgX19nZXRfXyBhbmQgYSBfX3NldF9fIGF0dHJpYnV0ZS4gIEV4YW1wbGVzIGFyZQotICBwcm9wZXJ0aWVzIChkZWZpbmVkIGluIFB5dGhvbikgYW5kIGdldHNldHMgYW5kIG1lbWJlcnMgKGRlZmluZWQgaW4gQykuCi0gIFR5cGljYWxseSwgZGF0YSBkZXNjcmlwdG9ycyB3aWxsIGFsc28gaGF2ZSBfX25hbWVfXyBhbmQgX19kb2NfXyBhdHRyaWJ1dGVzIAotICAocHJvcGVydGllcywgZ2V0c2V0cywgYW5kIG1lbWJlcnMgaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMpLCBidXQgdGhpcyAKLSAgaXMgbm90IGd1YXJhbnRlZWQuCisgIHByb3BlcnRpZXMgKGRlZmluZWQgaW4gUHl0aG9uKSwgZ2V0c2V0cywgYW5kIG1lbWJlcnMuICBUaGUgbGF0dGVyIHR3byBhcmUKKyAgZGVmaW5lZCBpbiBDIGFuZCB0aGVyZSBhcmUgbW9yZSBzcGVjaWZpYyB0ZXN0cyBhdmFpbGFibGUgZm9yIHRob3NlIHR5cGVzLAorICB3aGljaCBpcyByb2J1c3QgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMuICBUeXBpY2FsbHksIGRhdGEgZGVzY3JpcHRvcnMKKyAgd2lsbCBhbHNvIGhhdmUgX19uYW1lX18gYW5kIF9fZG9jX18gYXR0cmlidXRlcyAocHJvcGVydGllcywgZ2V0c2V0cywgYW5kCisgIG1lbWJlcnMgaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMpLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtpc2dldHNldGRlc2NyaXB0b3J9e29iamVjdH0KKyAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdldHNldCBkZXNjcmlwdG9yLgorCisgIGdldHNldHMgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB2aWEgXGNvZGV7UHlHZXRTZXREZWZ9CisgIHN0cnVjdHVyZXMuICBGb3IgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHN1Y2ggdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwKKyAgYWx3YXlzIHJldHVybiBcY29kZXtGYWxzZX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317aXNtZW1iZXJkZXNjcmlwdG9yfXtvYmplY3R9CisgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB2aWEKKyAgXGNvZGV7UHlNZW1iZXJEZWZ9IHN0cnVjdHVyZXMuICBGb3IgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHN1Y2gKKyAgdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBcY29kZXtGYWxzZX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxzdWJzZWN0aW9ue1JldHJpZXZpbmcgc291cmNlIGNvZGUKICAgICAgICAgICAgIFxsYWJlbHtpbnNwZWN0LXNvdXJjZX19CiAKQEAgLTI3MiwxOCArMjkxLDE4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdGFyZ3NwZWN9e2FyZ3Ncb3B0aW9uYWx7LCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsCi0gICAgICBhcmdmb3JtYXQsIHZhcmFyZ3Nmb3JtYXQsIHZhcmt3Zm9ybWF0LCBkZWZhdWx0Zm9ybWF0fX0KKyAgICAgIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBqb2lufX0KIAogICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSBmb3VyIHZhbHVlcyByZXR1cm5lZCBieQotICBcZnVuY3Rpb257Z2V0YXJnc3BlYygpfS4gIFRoZSBvdGhlciBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlCisgIFxmdW5jdGlvbntnZXRhcmdzcGVjKCl9LiAgVGhlIGZvcm1hdCogYXJndW1lbnRzIGFyZSB0aGUKICAgY29ycmVzcG9uZGluZyBvcHRpb25hbCBmb3JtYXR0aW5nIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdG8gdHVybgogICBuYW1lcyBhbmQgdmFsdWVzIGludG8gc3RyaW5ncy4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Zm9ybWF0YXJndmFsdWVzfXthcmdzXG9wdGlvbmFseywgdmFyYXJncywgdmFya3csIGxvY2FscywKLSAgICAgIGFyZ2Zvcm1hdCwgdmFyYXJnc2Zvcm1hdCwgdmFya3dmb3JtYXQsIHZhbHVlZm9ybWF0fX0KKyAgICAgIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBqb2lufX0KICAgRm9ybWF0IGEgcHJldHR5IGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgZm91ciB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgXGZ1bmN0aW9ue2dldGFyZ3ZhbHVlcygpfS4gIFRoZSBvdGhlciBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlCisgIFxmdW5jdGlvbntnZXRhcmd2YWx1ZXMoKX0uICBUaGUgZm9ybWF0KiBhcmd1bWVudHMgYXJlIHRoZQogICBjb3JyZXNwb25kaW5nIG9wdGlvbmFsIGZvcm1hdHRpbmcgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB0byB0dXJuCiAgIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBzdHJpbmdzLgogXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibGluZWNhY2hlLnRleCBiL0RvYy9saWIvbGlibGluZWNhY2hlLnRleAppbmRleCAxNDc3ZDNjLi43MmM3NzQzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmxpbmVjYWNoZS50ZXgKKysrIGIvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4CkBAIC0zOCw3ICszOCw3IEBACiBcYmVnaW57ZnVuY2Rlc2N9e2NoZWNrY2FjaGV9e1xvcHRpb25hbHtmaWxlbmFtZX19CiBDaGVjayB0aGUgY2FjaGUgZm9yIHZhbGlkaXR5LiAgVXNlIHRoaXMgZnVuY3Rpb24gaWYgZmlsZXMgaW4gdGhlIGNhY2hlIAogbWF5IGhhdmUgY2hhbmdlZCBvbiBkaXNrLCBhbmQgeW91IHJlcXVpcmUgdGhlIHVwZGF0ZWQgdmVyc2lvbi4gIElmCi1cdmFye2ZpbGVuYW1lfSBpcyBvbWl0dGVkLCBpdCB3aWxsIGNoZWNrIHRoZSB3aG9sZSBjYWNoZSBlbnRyaWVzLgorXHZhcntmaWxlbmFtZX0gaXMgb21pdHRlZCwgaXQgd2lsbCBjaGVjayBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGNhY2hlLgogXGVuZHtmdW5jZGVzY30KIAogRXhhbXBsZToKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibG9nZ2luZy50ZXggYi9Eb2MvbGliL2xpYmxvZ2dpbmcudGV4CmluZGV4IDU3NmUyZTcuLmNjNDQyOTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibG9nZ2luZy50ZXgKKysrIGIvRG9jL2xpYi9saWJsb2dnaW5nLnRleApAQCAtMTA2OCwxMyArMTA2OCwxMSBAQAogXGVuZHt0YWJsZWlpfQogCiBJZiBcdmFye2JhY2t1cENvdW50fSBpcyBub24temVybywgdGhlIHN5c3RlbSB3aWxsIHNhdmUgb2xkIGxvZyBmaWxlcyBieQotYXBwZW5kaW5nIHRoZSBleHRlbnNpb25zICIuMSIsICIuMiIgZXRjLiwgdG8gdGhlIGZpbGVuYW1lLiBGb3IgZXhhbXBsZSwKLXdpdGggYSBcdmFye2JhY2t1cENvdW50fSBvZiA1IGFuZCBhIGJhc2UgZmlsZSBuYW1lIG9mIFxmaWxle2FwcC5sb2d9LAoteW91IHdvdWxkIGdldCBcZmlsZXthcHAubG9nfSwgXGZpbGV7YXBwLmxvZy4xfSwgXGZpbGV7YXBwLmxvZy4yfSwgdXAgdG8KLVxmaWxle2FwcC5sb2cuNX0uIFRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8gaXMgYWx3YXlzIFxmaWxle2FwcC5sb2d9LgotV2hlbiB0aGlzIGZpbGUgaXMgZmlsbGVkLCBpdCBpcyBjbG9zZWQgYW5kIHJlbmFtZWQgdG8gXGZpbGV7YXBwLmxvZy4xfSwKLWFuZCBpZiBmaWxlcyBcZmlsZXthcHAubG9nLjF9LCBcZmlsZXthcHAubG9nLjJ9LCBldGMuIGV4aXN0LCB0aGVuIHRoZXkKLWFyZSByZW5hbWVkIHRvIFxmaWxle2FwcC5sb2cuMn0sIFxmaWxle2FwcC5sb2cuM30gZXRjLiByZXNwZWN0aXZlbHkuCithcHBlbmRpbmcgZXh0ZW5zaW9ucyB0byB0aGUgZmlsZW5hbWUuIFRoZSBleHRlbnNpb25zIGFyZSBkYXRlLWFuZC10aW1lCitiYXNlZCwgdXNpbmcgdGhlIHN0cmZ0aW1lIGZvcm1hdCBcY29kZXtcJVktXCVtLVwlZF9cJUgtXCVNLVwlU30gb3IgYSBsZWFkaW5nCitwb3J0aW9uIHRoZXJlb2YsIGRlcGVuZGluZyBvbiB0aGUgcm9sbG92ZXIgaW50ZXJ2YWwuIEF0IG1vc3QgXHZhcntiYWNrdXBDb3VudH0KK2ZpbGVzIHdpbGwgYmUga2VwdCwgYW5kIGlmIG1vcmUgd291bGQgYmUgY3JlYXRlZCB3aGVuIHJvbGxvdmVyIG9jY3VycywgdGhlCitvbGRlc3Qgb25lIGlzIGRlbGV0ZWQuCiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2RvUm9sbG92ZXJ9e30KQEAgLTE1MzksNyArMTUzNyw3IEBACiBUbyBzdG9wIHRoZSBzZXJ2ZXIsIGNhbGwgXGZ1bmN0aW9ue3N0b3BMaXN0ZW5pbmcoKX0uIFRvIHNlbmQgYSBjb25maWd1cmF0aW9uCiB0byB0aGUgc29ja2V0LCByZWFkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNlbmQgaXQgdG8gdGhlIHNvY2tldAogYXMgYSBzdHJpbmcgb2YgYnl0ZXMgcHJlY2VkZWQgYnkgYSBmb3VyLWJ5dGUgbGVuZ3RoIHBhY2tlZCBpbiBiaW5hcnkgdXNpbmcKLXN0cnVjdC5cY29kZXtwYWNrKCI+TCIsIG4pfS4KK3N0cnVjdC5cY29kZXtwYWNrKCc+TCcsIG4pfS4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317c3RvcExpc3RlbmluZ317fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtYWlsYm94LnRleCBiL0RvYy9saWIvbGlibWFpbGJveC50ZXgKaW5kZXggMGExZjc5Mi4uNzVlYTdlMSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJtYWlsYm94LnRleAorKysgYi9Eb2MvbGliL2xpYm1haWxib3gudGV4CkBAIC0xMzY3LDkgKzEzNjcsOCBAQAogICAgICAgICBwcmludCBzdWJqZWN0CiBcZW5ke3ZlcmJhdGltfQogCi1BIChzdXJwcmlzaW5nbHkpIHNpbXBsZSBleGFtcGxlIG9mIGNvcHlpbmcgYWxsIG1haWwgZnJvbSBhIEJhYnlsIG1haWxib3ggdG8gYW4KLU1IIG1haWxib3gsIGNvbnZlcnRpbmcgYWxsIG9mIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUKLWNvbnZlcnRlZDoKK1RvIGNvcHkgYWxsIG1haWwgZnJvbSBhIEJhYnlsIG1haWxib3ggdG8gYW4gTUggbWFpbGJveCwgY29udmVydGluZyBhbGwKK29mIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgY29udmVydGVkOgogCiBcYmVnaW57dmVyYmF0aW19CiBpbXBvcnQgbWFpbGJveApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtaW1ldHlwZXMudGV4IGIvRG9jL2xpYi9saWJtaW1ldHlwZXMudGV4CmluZGV4IDhlMDc3NjguLjZjNDZkNmYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibWltZXR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYm1pbWV0eXBlcy50ZXgKQEAgLTE1OCw2ICsxNTgsMjAgQEAKICAgXHZlcnNpb25hZGRlZHsyLjJ9CiBcZW5ke2NsYXNzZGVzY30KIAorQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgbW9kdWxlOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gaW1wb3J0IG1pbWV0eXBlcworPj4+IG1pbWV0eXBlcy5pbml0KCkKKz4+PiBtaW1ldHlwZXMua25vd25maWxlcworWycvZXRjL21pbWUudHlwZXMnLCAnL2V0Yy9odHRwZC9taW1lLnR5cGVzJywgLi4uIF0KKz4+PiBtaW1ldHlwZXMuc3VmZml4X21hcFsnLnRneiddCisnLnRhci5neicKKz4+PiBtaW1ldHlwZXMuZW5jb2RpbmdzX21hcFsnLmd6J10KKydnemlwJworPj4+IG1pbWV0eXBlcy50eXBlc19tYXBbJy50Z3onXQorJ2FwcGxpY2F0aW9uL3gtdGFyLWd6JworXGVuZHt2ZXJiYXRpbX0KIAogXHN1YnNlY3Rpb257TWltZVR5cGVzIE9iamVjdHMgXGxhYmVse21pbWV0eXBlcy1vYmplY3RzfX0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJuZXcudGV4IGIvRG9jL2xpYi9saWJuZXcudGV4CmluZGV4IGUzZjJhNDkuLjE4MTYyZGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibmV3LnRleAorKysgYi9Eb2MvbGliL2xpYm5ldy50ZXgKQEAgLTIyLDEzICsyMiwxNiBAQAogY2FsbGFibGUuCiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e2Z1bmN0aW9ufXtjb2RlLCBnbG9iYWxzXG9wdGlvbmFseywgbmFtZVxvcHRpb25hbHssIGFyZ2RlZnN9fX0KK1xiZWdpbntmdW5jZGVzY317ZnVuY3Rpb259e2NvZGUsIGdsb2JhbHNcb3B0aW9uYWx7LCBuYW1lXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2RlZnNcb3B0aW9uYWx7LCBjbG9zdXJlfX19fQogUmV0dXJucyBhIChQeXRob24pIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGNvZGUgYW5kIGdsb2JhbHMuIElmCiBcdmFye25hbWV9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgc3RyaW5nIG9yIFxjb2Rle05vbmV9LiAgSWYgaXQgaXMgYQogc3RyaW5nLCB0aGUgZnVuY3Rpb24gd2lsbCBoYXZlIHRoZSBnaXZlbiBuYW1lLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uCiBuYW1lIHdpbGwgYmUgdGFrZW4gZnJvbSBcY29kZXtcdmFye2NvZGV9LmNvX25hbWV9LiAgSWYKIFx2YXJ7YXJnZGVmc30gaXMgZ2l2ZW4sIGl0IG11c3QgYmUgYSB0dXBsZSBhbmQgd2lsbCBiZSB1c2VkIHRvCi1kZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCitkZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuICBJZiBcdmFye2Nsb3N1cmV9IGlzIGdpdmVuLAoraXQgbXVzdCBiZSBcY29kZXtOb25lfSBvciBhIHR1cGxlIG9mIGNlbGwgb2JqZWN0cyBjb250YWluaW5nIG9iamVjdHMKK3RvIGJpbmQgdG8gdGhlIG5hbWVzIGluIFxjb2Rle1x2YXJ7Y29kZX0uY29fZnJlZXZhcnN9LgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtjb2RlfXthcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3B0cGFyc2UudGV4IGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKaW5kZXggZWM0M2UzZC4uZGY5NmRkNCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKKysrIGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKQEAgLTEsMyArMSw1IEBACislIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCEgIERPIE5PVCBFRElUIQorJSAoWW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdCB0aGUgbmV4dCB0aW1lIGl0IGlzIGdlbmVyYXRlZC4pCiBcc2VjdGlvbntcbW9kdWxle29wdHBhcnNlfSAtLS0gTW9yZSBwb3dlcmZ1bCBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNlcn0KIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtvcHRwYXJzZX0KIFxtb2R1bGVhdXRob3J7R3JlZyBXYXJkfXtnd2FyZEBweXRob24ubmV0fQpAQCAtMzA2LDcgKzMwOCw3IEBACiAKIEFjdGlvbnMgdGVsbCBcbW9kdWxle29wdHBhcnNlfSB3aGF0IHRvIGRvIHdoZW4gaXQgZW5jb3VudGVycyBhbiBvcHRpb24gb24gdGhlCiBjb21tYW5kIGxpbmUuICBUaGVyZSBpcyBhIGZpeGVkIHNldCBvZiBhY3Rpb25zIGhhcmQtY29kZWQgaW50byBcbW9kdWxle29wdHBhcnNlfTsKLWFkZGluZyBuZXcgYWN0aW9ucyBpcyBhbiBhZHZhbmNlZCB0b3BpYyBjb3ZlcmVkIGluIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1leHRlbmRpbmd9LCBFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX0uCithZGRpbmcgbmV3IGFjdGlvbnMgaXMgYW4gYWR2YW5jZWQgdG9waWMgY292ZXJlZCBpbiBzZWN0aW9uflxyZWZ7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfSwgRXh0ZW5kaW5nIFxtb2R1bGV7b3B0cGFyc2V9LgogTW9zdCBhY3Rpb25zIHRlbGwgXG1vZHVsZXtvcHRwYXJzZX0gdG8gc3RvcmUgYSB2YWx1ZSBpbiBzb21lIHZhcmlhYmxley0tLX1mb3IKIGV4YW1wbGUsIHRha2UgYSBzdHJpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZCBzdG9yZSBpdCBpbiBhbgogYXR0cmlidXRlIG9mIFxjb2Rle29wdGlvbnN9LgpAQCAtMzcxLDcgKzM3Myw3IEBACiBzdHJpbmc6IHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGZvciBcY29kZXsiLWYifSBpcyBcY29kZXtmfS4KIAogXG1vZHVsZXtvcHRwYXJzZX0gYWxzbyBpbmNsdWRlcyBidWlsdC1pbiBcY29kZXtsb25nfSBhbmQgXGNvZGV7Y29tcGxleH0gdHlwZXMuICBBZGRpbmcKLXR5cGVzIGlzIGNvdmVyZWQgaW4gc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZ30sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KK3R5cGVzIGlzIGNvdmVyZWQgaW4gc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZy1vcHRwYXJzZX0sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KIAogCiBcc3Vic3Vic2VjdGlvbntIYW5kbGluZyBib29sZWFuIChmbGFnKSBvcHRpb25zXGxhYmVse29wdHBhcnNlLWhhbmRsaW5nLWJvb2xlYW4tb3B0aW9uc319CkBAIC01NjYsNyArNTY4LDcgQEAKIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgWy1mXSBbLXFdIiwgdmVyc2lvbj0iJXByb2cgMS4wIikKIFxlbmR7dmVyYmF0aW19CiAKLU5vdGUgdGhhdCBcY29kZXsie1wlfXByb2cifSBpcyBleHBhbmRlZCBqdXN0IGxpa2UgaXQgaXMgaW4gXGNvZGV7dXNhZ2V9LiAgQXBhcnQKK1xjb2RleyJ7XCV9cHJvZyJ9IGlzIGV4cGFuZGVkIGp1c3QgbGlrZSBpdCBpcyBpbiBcY29kZXt1c2FnZX0uICBBcGFydAogZnJvbSB0aGF0LCBcY29kZXt2ZXJzaW9ufSBjYW4gY29udGFpbiBhbnl0aGluZyB5b3UgbGlrZS4gIFdoZW4geW91IHN1cHBseQogaXQsIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxjb2RleyIte30tdmVyc2lvbiJ9IG9wdGlvbiB0byB5b3VyIHBhcnNlci4KIElmIGl0IGVuY291bnRlcnMgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgZXhwYW5kcyB5b3VyCkBAIC02NTksNyArNjYxLDcgQEAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgbWFpbigpCiBcZW5ke3ZlcmJhdGltfQotJSAkSWQ6IHR1dG9yaWFsLnR4dCA1MDUgMjAwNS0wNy0yMiAwMTo1Mjo0MFogZ3dhcmQgJCAKKyUgJElkOiB0dXRvcmlhbC50eHQgNTE1IDIwMDYtMDYtMTAgMTU6Mzc6NDVaIGd3YXJkICQgCiAKIAogXHN1YnNlY3Rpb257UmVmZXJlbmNlIEd1aWRlXGxhYmVse29wdHBhcnNlLXJlZmVyZW5jZS1ndWlkZX19CkBAIC0xMTQ2LDcgKzExNDgsNyBAQAogCiBcbW9kdWxle29wdHBhcnNlfSBoYXMgc2l4IGJ1aWx0LWluIG9wdGlvbiB0eXBlczogXGNvZGV7c3RyaW5nfSwgXGNvZGV7aW50fSwgXGNvZGV7bG9uZ30sCiBcY29kZXtjaG9pY2V9LCBcY29kZXtmbG9hdH0gYW5kIFxjb2Rle2NvbXBsZXh9LiAgSWYgeW91IG5lZWQgdG8gYWRkIG5ldyBvcHRpb24KLXR5cGVzLCBzZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZ30sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KK3R5cGVzLCBzZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZy1vcHRwYXJzZX0sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KIAogQXJndW1lbnRzIHRvIHN0cmluZyBvcHRpb25zIGFyZSBub3QgY2hlY2tlZCBvciBjb252ZXJ0ZWQgaW4gYW55IHdheTogdGhlCiB0ZXh0IG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgc3RvcmVkIGluIHRoZSBkZXN0aW5hdGlvbiAob3IgcGFzc2VkIHRvIHRoZQpAQCAtMTE5NSwxNiArMTE5NywxNiBAQAogd2hlcmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlCiBcYmVnaW57ZGVzY3JpcHRpb259CiBcaXRlbVtcY29kZXthcmdzfV0KLXRoZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwcm9jZXNzIChcY29kZXtzeXMuYXJndntbfTE6XX0gYnkgZGVmYXVsdCkKK3RoZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwcm9jZXNzIChkZWZhdWx0OiBcY29kZXtzeXMuYXJndntbfTE6XX0pCiBcaXRlbVtcY29kZXtvcHRpb25zfV0KLW9iamVjdCB0byBzdG9yZSBvcHRpb24gYXJndW1lbnRzIGluIChhIG5ldyBpbnN0YW5jZSBvZgotb3B0cGFyc2UuVmFsdWVzIGJ5IGRlZmF1bHQpCitvYmplY3QgdG8gc3RvcmUgb3B0aW9uIGFyZ3VtZW50cyBpbiAoZGVmYXVsdDogYSBuZXcgaW5zdGFuY2Ugb2YKK29wdHBhcnNlLlZhbHVlcykKIFxlbmR7ZGVzY3JpcHRpb259CiAKIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUKIFxiZWdpbntkZXNjcmlwdGlvbn0KIFxpdGVtW1xjb2Rle29wdGlvbnN9XQotdGhlIHNhbWUgb2JqZWN0IGFzIHdhcyBwYXNzZWQgaW4gYXMgXGNvZGV7b3B0aW9uc30sIG9yIHRoZSBuZXcKK3RoZSBzYW1lIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgaW4gYXMgXGNvZGV7b3B0aW9uc30sIG9yIHRoZQogb3B0cGFyc2UuVmFsdWVzIGluc3RhbmNlIGNyZWF0ZWQgYnkgXG1vZHVsZXtvcHRwYXJzZX0KIFxpdGVtW1xjb2Rle2FyZ3N9XQogdGhlIGxlZnRvdmVyIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFmdGVyIGFsbCBvcHRpb25zIGhhdmUgYmVlbgpAQCAtMTIxMiw5ICsxMjE0LDkgQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIFRoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyB0byBzdXBwbHkgbmVpdGhlciBrZXl3b3JkIGFyZ3VtZW50LiAgSWYgeW91Ci1zdXBwbHkgYSBcY29kZXt2YWx1ZXN9IG9iamVjdCwgaXQgd2lsbCBiZSByZXBlYXRlZGx5IG1vZGlmaWVkIHdpdGggYQotXGNvZGV7c2V0YXR0cigpfSBjYWxsIGZvciBldmVyeSBvcHRpb24gYXJndW1lbnQgd3JpdHRlbiB0byBhbiBvcHRpb24KLWRlc3RpbmF0aW9uLCBhbmQgZmluYWxseSByZXR1cm5lZCBieSBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0uCitzdXBwbHkgXGNvZGV7b3B0aW9uc30sIGl0IHdpbGwgYmUgbW9kaWZpZWQgd2l0aCByZXBlYXRlZCBcY29kZXtzZXRhdHRyKCl9CitjYWxscyAocm91Z2hseSBvbmUgZm9yIGV2ZXJ5IG9wdGlvbiBhcmd1bWVudCBzdG9yZWQgdG8gYW4gb3B0aW9uCitkZXN0aW5hdGlvbikgYW5kIHJldHVybmVkIGJ5IFxtZXRob2R7cGFyc2V7XF99YXJncygpfS4KIAogSWYgXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9IGVuY291bnRlcnMgYW55IGVycm9ycyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgaXQgY2FsbHMKIHRoZSBPcHRpb25QYXJzZXIncyBcbWV0aG9ke2Vycm9yKCl9IG1ldGhvZCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVuZC11c2VyIGVycm9yCkBAIC0xMzg4LDcgKzEzOTAsNyBAQAogXGVuZHt2ZXJiYXRpbX0KIAogXGVuZHtpdGVtaXplfQotJSAkSWQ6IHJlZmVyZW5jZS50eHQgNTA1IDIwMDUtMDctMjIgMDE6NTI6NDBaIGd3YXJkICQgCislICRJZDogcmVmZXJlbmNlLnR4dCA1MTkgMjAwNi0wNi0xMSAxNDozOToxMVogZ3dhcmQgJCAKIAogCiBcc3Vic2VjdGlvbntPcHRpb24gQ2FsbGJhY2tzXGxhYmVse29wdHBhcnNlLW9wdGlvbi1jYWxsYmFja3N9fQpAQCAtMTY4MSwzICsxNjgzLDIwNiBAQAogXGNvZGV7Ii1jIn0uICBGaXhpbmcgdGhpcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgogJSAkSWQ6IGNhbGxiYWNrcy50eHQgNDE1IDIwMDQtMDktMzAgMDI6MjY6MTdaIGdyZWcgJCAKIAorCitcc3Vic2VjdGlvbntFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX1cbGFiZWx7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfX0KKworU2luY2UgdGhlIHR3byBtYWpvciBjb250cm9sbGluZyBmYWN0b3JzIGluIGhvdyBcbW9kdWxle29wdHBhcnNlfSBpbnRlcnByZXRzCitjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgdGhlIGFjdGlvbiBhbmQgdHlwZSBvZiBlYWNoIG9wdGlvbiwgdGhlIG1vc3QKK2xpa2VseSBkaXJlY3Rpb24gb2YgZXh0ZW5zaW9uIGlzIHRvIGFkZCBuZXcgYWN0aW9ucyBhbmQgbmV3IHR5cGVzLgorCisKK1xzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgdHlwZXNcbGFiZWx7b3B0cGFyc2UtYWRkaW5nLW5ldy10eXBlc319CisKK1RvIGFkZCBuZXcgdHlwZXMsIHlvdSBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBzdWJjbGFzcyBvZiBcbW9kdWxle29wdHBhcnNlfSdzIE9wdGlvbgorY2xhc3MuICBUaGlzIGNsYXNzIGhhcyBhIGNvdXBsZSBvZiBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIFxtb2R1bGV7b3B0cGFyc2V9J3MgdHlwZXM6CitcbWVtYmVye1RZUEVTfSBhbmQgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9LgorCitcbWVtYmVye1RZUEVTfSBpcyBhIHR1cGxlIG9mIHR5cGUgbmFtZXM7IGluIHlvdXIgc3ViY2xhc3MsIHNpbXBseSBkZWZpbmUgYSBuZXcKK3R1cGxlIFxtZW1iZXJ7VFlQRVN9IHRoYXQgYnVpbGRzIG9uIHRoZSBzdGFuZGFyZCBvbmUuCisKK1xtZW1iZXJ7VFlQRXtcX31DSEVDS0VSfSBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyB0eXBlIG5hbWVzIHRvIHR5cGUtY2hlY2tpbmcKK2Z1bmN0aW9ucy4gIEEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CitcYmVnaW57dmVyYmF0aW19CitkZWYgY2hlY2tfbXl0eXBlKG9wdGlvbiwgb3B0LCB2YWx1ZSkKK1xlbmR7dmVyYmF0aW19CisKK3doZXJlIFxjb2Rle29wdGlvbn0gaXMgYW4gXGNsYXNze09wdGlvbn0gaW5zdGFuY2UsIFxjb2Rle29wdH0gaXMgYW4gb3B0aW9uIHN0cmluZworKGUuZy4sIFxjb2RleyItZiJ9KSwgYW5kIFxjb2Rle3ZhbHVlfSBpcyB0aGUgc3RyaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0aGF0CittdXN0IGJlIGNoZWNrZWQgYW5kIGNvbnZlcnRlZCB0byB5b3VyIGRlc2lyZWQgdHlwZS4gIFxjb2Rle2NoZWNre1xffW15dHlwZSgpfQorc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGh5cG90aGV0aWNhbCB0eXBlIFxjb2Rle215dHlwZX0uICBUaGUgdmFsdWUKK3JldHVybmVkIGJ5IGEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiB3aWxsIHdpbmQgdXAgaW4gdGhlIE9wdGlvblZhbHVlcworaW5zdGFuY2UgcmV0dXJuZWQgYnkgXG1ldGhvZHtPcHRpb25QYXJzZXIucGFyc2V7XF99YXJncygpfSwgb3IgYmUgcGFzc2VkIHRvIGEKK2NhbGxiYWNrIGFzIHRoZSBcY29kZXt2YWx1ZX0gcGFyYW1ldGVyLgorCitZb3VyIHR5cGUtY2hlY2tpbmcgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IgaWYgaXQKK2VuY291bnRlcnMgYW55IHByb2JsZW1zLiAgT3B0aW9uVmFsdWVFcnJvciB0YWtlcyBhIHNpbmdsZSBzdHJpbmcKK2FyZ3VtZW50LCB3aGljaCBpcyBwYXNzZWQgYXMtaXMgdG8gT3B0aW9uUGFyc2VyJ3MgXG1ldGhvZHtlcnJvcigpfSBtZXRob2QsCit3aGljaCBpbiB0dXJuIHByZXBlbmRzIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHRoZSBzdHJpbmcgXGNvZGV7ImVycm9yOiJ9IGFuZAorcHJpbnRzIGV2ZXJ5dGhpbmcgdG8gc3RkZXJyIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgcHJvY2Vzcy4KKworSGVyZSdzIGEgc2lsbHkgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBhZGRpbmcgYSBcY29kZXtjb21wbGV4fSBvcHRpb24KK3R5cGUgdG8gcGFyc2UgUHl0aG9uLXN0eWxlIGNvbXBsZXggbnVtYmVycyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKFRoaXMKK2lzIGV2ZW4gc2lsbGllciB0aGFuIGl0IHVzZWQgdG8gYmUsIGJlY2F1c2UgXG1vZHVsZXtvcHRwYXJzZX0gMS4zIGFkZGVkIGJ1aWx0LWluCitzdXBwb3J0IGZvciBjb21wbGV4IG51bWJlcnMsIGJ1dCBuZXZlciBtaW5kLikKKworRmlyc3QsIHRoZSBuZWNlc3NhcnkgaW1wb3J0czoKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gY29weSBpbXBvcnQgY29weQorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uLCBPcHRpb25WYWx1ZUVycm9yCitcZW5ke3ZlcmJhdGltfQorCitZb3UgbmVlZCB0byBkZWZpbmUgeW91ciB0eXBlLWNoZWNrZXIgZmlyc3QsIHNpbmNlIGl0J3MgcmVmZXJyZWQgdG8gbGF0ZXIKKyhpbiB0aGUgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9IGNsYXNzIGF0dHJpYnV0ZSBvZiB5b3VyIE9wdGlvbiBzdWJjbGFzcyk6CitcYmVnaW57dmVyYmF0aW19CitkZWYgY2hlY2tfY29tcGxleChvcHRpb24sIG9wdCwgdmFsdWUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNvbXBsZXgodmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uICVzOiBpbnZhbGlkIGNvbXBsZXggdmFsdWU6ICVyIiAlIChvcHQsIHZhbHVlKSkKK1xlbmR7dmVyYmF0aW19CisKK0ZpbmFsbHksIHRoZSBPcHRpb24gc3ViY2xhc3M6CitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBNeU9wdGlvbiAoT3B0aW9uKToKKyAgICBUWVBFUyA9IE9wdGlvbi5UWVBFUyArICgiY29tcGxleCIsKQorICAgIFRZUEVfQ0hFQ0tFUiA9IGNvcHkoT3B0aW9uLlRZUEVfQ0hFQ0tFUikKKyAgICBUWVBFX0NIRUNLRVJbImNvbXBsZXgiXSA9IGNoZWNrX2NvbXBsZXgKK1xlbmR7dmVyYmF0aW19CisKKyhJZiB3ZSBkaWRuJ3QgbWFrZSBhIFxmdW5jdGlvbntjb3B5KCl9IG9mIFxtZW1iZXJ7T3B0aW9uLlRZUEV7XF99Q0hFQ0tFUn0sIHdlIHdvdWxkIGVuZAordXAgbW9kaWZ5aW5nIHRoZSBcbWVtYmVye1RZUEV7XF99Q0hFQ0tFUn0gYXR0cmlidXRlIG9mIFxtb2R1bGV7b3B0cGFyc2V9J3MgT3B0aW9uIGNsYXNzLgorVGhpcyBiZWluZyBQeXRob24sIG5vdGhpbmcgc3RvcHMgeW91IGZyb20gZG9pbmcgdGhhdCBleGNlcHQgZ29vZCBtYW5uZXJzCithbmQgY29tbW9uIHNlbnNlLikKKworVGhhdCdzIGl0ISAgTm93IHlvdSBjYW4gd3JpdGUgYSBzY3JpcHQgdGhhdCB1c2VzIHRoZSBuZXcgb3B0aW9uIHR5cGUKK2p1c3QgbGlrZSBhbnkgb3RoZXIgXG1vZHVsZXtvcHRwYXJzZX0tYmFzZWQgc2NyaXB0LCBleGNlcHQgeW91IGhhdmUgdG8gaW5zdHJ1Y3QgeW91cgorT3B0aW9uUGFyc2VyIHRvIHVzZSBNeU9wdGlvbiBpbnN0ZWFkIG9mIE9wdGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KK3BhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fY2xhc3M9TXlPcHRpb24pCitwYXJzZXIuYWRkX29wdGlvbigiLWMiLCB0eXBlPSJjb21wbGV4IikKK1xlbmR7dmVyYmF0aW19CisKK0FsdGVybmF0ZWx5LCB5b3UgY2FuIGJ1aWxkIHlvdXIgb3duIG9wdGlvbiBsaXN0IGFuZCBwYXNzIGl0IHRvCitPcHRpb25QYXJzZXI7IGlmIHlvdSBkb24ndCB1c2UgXG1ldGhvZHthZGR7XF99b3B0aW9uKCl9IGluIHRoZSBhYm92ZSB3YXksIHlvdQorZG9uJ3QgbmVlZCB0byB0ZWxsIE9wdGlvblBhcnNlciB3aGljaCBvcHRpb24gY2xhc3MgdG8gdXNlOgorXGJlZ2lue3ZlcmJhdGltfQorb3B0aW9uX2xpc3QgPSBbTXlPcHRpb24oIi1jIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9ImNvbXBsZXgiLCBkZXN0PSJjIildCitwYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpCitcZW5ke3ZlcmJhdGltfQorCisKK1xzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgYWN0aW9uc1xsYWJlbHtvcHRwYXJzZS1hZGRpbmctbmV3LWFjdGlvbnN9fQorCitBZGRpbmcgbmV3IGFjdGlvbnMgaXMgYSBiaXQgdHJpY2tpZXIsIGJlY2F1c2UgeW91IGhhdmUgdG8gdW5kZXJzdGFuZAordGhhdCBcbW9kdWxle29wdHBhcnNlfSBoYXMgYSBjb3VwbGUgb2YgY2xhc3NpZmljYXRpb25zIGZvciBhY3Rpb25zOgorXGJlZ2lue2Rlc2NyaXB0aW9ufQorXGl0ZW1bYGBzdG9yZScnIGFjdGlvbnNdCithY3Rpb25zIHRoYXQgcmVzdWx0IGluIFxtb2R1bGV7b3B0cGFyc2V9IHN0b3JpbmcgYSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCitjdXJyZW50IE9wdGlvblZhbHVlcyBpbnN0YW5jZTsgdGhlc2Ugb3B0aW9ucyByZXF1aXJlIGEgXG1lbWJlcntkZXN0fQorYXR0cmlidXRlIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBPcHRpb24gY29uc3RydWN0b3IKK1xpdGVtW2BgdHlwZWQnJyBhY3Rpb25zXQorYWN0aW9ucyB0aGF0IHRha2UgYSB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIGV4cGVjdCBpdCB0byBiZQorb2YgYSBjZXJ0YWluIHR5cGU7IG9yIHJhdGhlciwgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEKK2NlcnRhaW4gdHlwZS4gIFRoZXNlIG9wdGlvbnMgcmVxdWlyZSBhIFxtZW1iZXJ7dHlwZX0gYXR0cmlidXRlIHRvIHRoZQorT3B0aW9uIGNvbnN0cnVjdG9yLgorXGVuZHtkZXNjcmlwdGlvbn0KKworVGhlc2UgYXJlIG92ZXJsYXBwaW5nIHNldHM6IHNvbWUgZGVmYXVsdCBgYHN0b3JlJycgYWN0aW9ucyBhcmUgXGNvZGV7c3RvcmV9LAorXGNvZGV7c3RvcmV7XF99Y29uc3R9LCBcY29kZXthcHBlbmR9LCBhbmQgXGNvZGV7Y291bnR9LCB3aGlsZSB0aGUgZGVmYXVsdCBgYHR5cGVkJycKK2FjdGlvbnMgYXJlIFxjb2Rle3N0b3JlfSwgXGNvZGV7YXBwZW5kfSwgYW5kIFxjb2Rle2NhbGxiYWNrfS4KKworV2hlbiB5b3UgYWRkIGFuIGFjdGlvbiwgeW91IG5lZWQgdG8gY2F0ZWdvcml6ZSBpdCBieSBsaXN0aW5nIGl0IGluIGF0CitsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzcyBhdHRyaWJ1dGVzIG9mIE9wdGlvbiAoYWxsIGFyZSBsaXN0cyBvZgorc3RyaW5ncyk6CitcYmVnaW57ZGVzY3JpcHRpb259CitcaXRlbVtcbWVtYmVye0FDVElPTlN9XQorYWxsIGFjdGlvbnMgbXVzdCBiZSBsaXN0ZWQgaW4gQUNUSU9OUworXGl0ZW1bXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfV0KK2Bgc3RvcmUnJyBhY3Rpb25zIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUKK1xpdGVtW1xtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU31dCitgYHR5cGVkJycgYWN0aW9ucyBhcmUgYWRkaXRpb25hbGx5IGxpc3RlZCBoZXJlCitcaXRlbVtcY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU31dCithY3Rpb25zIHRoYXQgYWx3YXlzIHRha2UgYSB0eXBlIChpLmUuIHdob3NlIG9wdGlvbnMgYWx3YXlzIHRha2UgYQordmFsdWUpIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUuICBUaGUgb25seSBlZmZlY3Qgb2YgdGhpcyBpcwordGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUsIFxjb2Rle3N0cmluZ30sIHRvIG9wdGlvbnMgd2l0aCBubworZXhwbGljaXQgdHlwZSB3aG9zZSBhY3Rpb24gaXMgbGlzdGVkIGluIFxjb2Rle0FMV0FZU3tcX31UWVBFRHtcX31BQ1RJT05TfS4KK1xlbmR7ZGVzY3JpcHRpb259CisKK0luIG9yZGVyIHRvIGFjdHVhbGx5IGltcGxlbWVudCB5b3VyIG5ldyBhY3Rpb24sIHlvdSBtdXN0IG92ZXJyaWRlCitPcHRpb24ncyBcbWV0aG9ke3Rha2V7XF99YWN0aW9uKCl9IG1ldGhvZCBhbmQgYWRkIGEgY2FzZSB0aGF0IHJlY29nbml6ZXMgeW91cgorYWN0aW9uLgorCitGb3IgZXhhbXBsZSwgbGV0J3MgYWRkIGFuIFxjb2Rle2V4dGVuZH0gYWN0aW9uLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZQorc3RhbmRhcmQgXGNvZGV7YXBwZW5kfSBhY3Rpb24sIGJ1dCBpbnN0ZWFkIG9mIHRha2luZyBhIHNpbmdsZSB2YWx1ZSBmcm9tCit0aGUgY29tbWFuZC1saW5lIGFuZCBhcHBlbmRpbmcgaXQgdG8gYW4gZXhpc3RpbmcgbGlzdCwgXGNvZGV7ZXh0ZW5kfSB3aWxsCit0YWtlIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLCBhbmQgZXh0ZW5kIGFuCitleGlzdGluZyBsaXN0IHdpdGggdGhlbS4gIFRoYXQgaXMsIGlmIFxjb2RleyIte30tbmFtZXMifSBpcyBhbiBcY29kZXtleHRlbmR9CitvcHRpb24gb2YgdHlwZSBcY29kZXtzdHJpbmd9LCB0aGUgY29tbWFuZCBsaW5lCitcYmVnaW57dmVyYmF0aW19CistLW5hbWVzPWZvbyxiYXIgLS1uYW1lcyBibGFoIC0tbmFtZXMgZGluZyxkb25nCitcZW5ke3ZlcmJhdGltfQorCit3b3VsZCByZXN1bHQgaW4gYSBsaXN0CitcYmVnaW57dmVyYmF0aW19CitbImZvbyIsICJiYXIiLCAiYmxhaCIsICJkaW5nIiwgImRvbmciXQorXGVuZHt2ZXJiYXRpbX0KKworQWdhaW4gd2UgZGVmaW5lIGEgc3ViY2xhc3Mgb2YgT3B0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgTXlPcHRpb24gKE9wdGlvbik6CisKKyAgICBBQ1RJT05TID0gT3B0aW9uLkFDVElPTlMgKyAoImV4dGVuZCIsKQorICAgIFNUT1JFX0FDVElPTlMgPSBPcHRpb24uU1RPUkVfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisgICAgVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5UWVBFRF9BQ1RJT05TICsgKCJleHRlbmQiLCkKKyAgICBBTFdBWVNfVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5BTFdBWVNfVFlQRURfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisKKyAgICBkZWYgdGFrZV9hY3Rpb24oc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6CisgICAgICAgIGlmIGFjdGlvbiA9PSAiZXh0ZW5kIjoKKyAgICAgICAgICAgIGx2YWx1ZSA9IHZhbHVlLnNwbGl0KCIsIikKKyAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmV4dGVuZChsdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBPcHRpb24udGFrZV9hY3Rpb24oCisgICAgICAgICAgICAgICAgc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcikKK1xlbmR7dmVyYmF0aW19CisKK0ZlYXR1cmVzIG9mIG5vdGU6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHt9IAorXGNvZGV7ZXh0ZW5kfSBib3RoIGV4cGVjdHMgYSB2YWx1ZSBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCBzdG9yZXMgdGhhdAordmFsdWUgc29tZXdoZXJlLCBzbyBpdCBnb2VzIGluIGJvdGggXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfSBhbmQKK1xtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU30KKworXGl0ZW0ge30gCit0byBlbnN1cmUgdGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUgb2YgXGNvZGV7c3RyaW5nfSB0bworXGNvZGV7ZXh0ZW5kfSBhY3Rpb25zLCB3ZSBwdXQgdGhlIFxjb2Rle2V4dGVuZH0gYWN0aW9uIGluCitcY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU30gYXMgd2VsbAorCitcaXRlbSB7fSAKK1xtZXRob2R7TXlPcHRpb24udGFrZXtcX31hY3Rpb24oKX0gaW1wbGVtZW50cyBqdXN0IHRoaXMgb25lIG5ldyBhY3Rpb24sIGFuZAorcGFzc2VzIGNvbnRyb2wgYmFjayB0byBcbWV0aG9ke09wdGlvbi50YWtle1xffWFjdGlvbigpfSBmb3IgdGhlIHN0YW5kYXJkCitcbW9kdWxle29wdHBhcnNlfSBhY3Rpb25zCisKK1xpdGVtIHt9IAorXGNvZGV7dmFsdWVzfSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgb3B0cGFyc2V7XF99cGFyc2VyLlZhbHVlcyBjbGFzcywKK3doaWNoIHByb3ZpZGVzIHRoZSB2ZXJ5IHVzZWZ1bCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBtZXRob2QuCitcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBpcyBlc3NlbnRpYWxseSBcZnVuY3Rpb257Z2V0YXR0cigpfSB3aXRoIGEgc2FmZXR5IHZhbHZlOworaXQgaXMgY2FsbGVkIGFzCitcYmVnaW57dmVyYmF0aW19Cit2YWx1ZXMuZW5zdXJlX3ZhbHVlKGF0dHIsIHZhbHVlKQorXGVuZHt2ZXJiYXRpbX0KKworSWYgdGhlIFxjb2Rle2F0dHJ9IGF0dHJpYnV0ZSBvZiBcY29kZXt2YWx1ZXN9IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgTm9uZSwgdGhlbgorZW5zdXJle1xffXZhbHVlKCkgZmlyc3Qgc2V0cyBpdCB0byBcY29kZXt2YWx1ZX0sIGFuZCB0aGVuIHJldHVybnMgJ3ZhbHVlLgorVGhpcyBpcyB2ZXJ5IGhhbmR5IGZvciBhY3Rpb25zIGxpa2UgXGNvZGV7ZXh0ZW5kfSwgXGNvZGV7YXBwZW5kfSwgYW5kCitcY29kZXtjb3VudH0sIGFsbCBvZiB3aGljaCBhY2N1bXVsYXRlIGRhdGEgaW4gYSB2YXJpYWJsZSBhbmQgZXhwZWN0IHRoYXQKK3ZhcmlhYmxlIHRvIGJlIG9mIGEgY2VydGFpbiB0eXBlIChhIGxpc3QgZm9yIHRoZSBmaXJzdCB0d28sIGFuIGludGVnZXIKK2ZvciB0aGUgbGF0dGVyKS4gIFVzaW5nIFxtZXRob2R7ZW5zdXJle1xffXZhbHVlKCl9IG1lYW5zIHRoYXQgc2NyaXB0cyB1c2luZworeW91ciBhY3Rpb24gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCitvcHRpb24gZGVzdGluYXRpb25zIGluIHF1ZXN0aW9uOyB0aGV5IGNhbiBqdXN0IGxlYXZlIHRoZSBkZWZhdWx0IGFzCitOb25lIGFuZCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSB3aWxsIHRha2UgY2FyZSBvZiBnZXR0aW5nIGl0IHJpZ2h0IHdoZW4KK2l0J3MgbmVlZGVkLgorCitcZW5ke2l0ZW1pemV9CislICRJZDogZXh0ZW5kaW5nLnR4dCA1MTcgMjAwNi0wNi0xMCAxNjoxODoxMVogZ3dhcmQgJCAKKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXggYi9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleAppbmRleCAyMjNjZjI4Li40YzE5YWFmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleAorKysgYi9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleApAQCAtNjgsNyArNjgsNyBAQAogT3BlbiBhbiBhdWRpbyBkZXZpY2UgYW5kIHJldHVybiBhbiBPU1MgYXVkaW8gZGV2aWNlIG9iamVjdC4gIFRoaXMKIG9iamVjdCBzdXBwb3J0cyBtYW55IGZpbGUtbGlrZSBtZXRob2RzLCBzdWNoIGFzIFxtZXRob2R7cmVhZCgpfSwKIFxtZXRob2R7d3JpdGUoKX0sIGFuZCBcbWV0aG9ke2ZpbGVubygpfSAoYWx0aG91Z2ggdGhlcmUgYXJlIHN1YnRsZQotZGlmZmVyZW5jZXMgYmV0d2VlbiBjb252ZW50aW9uYWwgVW5peCByZWFkL3dyaXRlIHNlbWFudGljcyBhbmQgdGhvc2Ugb2YKK2RpZmZlcmVuY2VzIGJldHdlZW4gY29udmVudGlvbmFsIFxVTklYe30gcmVhZC93cml0ZSBzZW1hbnRpY3MgYW5kIHRob3NlIG9mCiBPU1MgYXVkaW8gZGV2aWNlcykuICBJdCBhbHNvIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGF1ZGlvLXNwZWNpZmljCiBtZXRob2RzOyBzZWUgYmVsb3cgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1ldGhvZHMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGlja2xlLnRleCBiL0RvYy9saWIvbGlicGlja2xlLnRleAppbmRleCA0NWU4MGI4Li5hOGFiMzllIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBpY2tsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJwaWNrbGUudGV4CkBAIC03MjUsNyArNzI1LDUwIEBACiAKIFxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3BpY2tsZS1leGFtcGxlfX0KIAotSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYQorRm9yIHRoZSBzaW1wbGVzdCBjb2RlLCB1c2UgdGhlIFxmdW5jdGlvbntkdW1wKCl9IGFuZCBcZnVuY3Rpb257bG9hZCgpfQorZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGEgc2VsZi1yZWZlcmVuY2luZyBsaXN0IGlzIHBpY2tsZWQgYW5kIHJlc3RvcmVkCitjb3JyZWN0bHkuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBwaWNrbGUKKworZGF0YTEgPSB7J2EnOiBbMSwgMi4wLCAzLCA0KzZqXSwKKyAgICAgICAgICdiJzogKCdzdHJpbmcnLCB1J1VuaWNvZGUgc3RyaW5nJyksCisgICAgICAgICAnYyc6IE5vbmV9CisKK3NlbGZyZWZfbGlzdCA9IFsxLCAyLCAzXQorc2VsZnJlZl9saXN0LmFwcGVuZChzZWxmcmVmX2xpc3QpCisKK291dHB1dCA9IG9wZW4oJ2RhdGEucGtsJywgJ3diJykKKworIyBQaWNrbGUgZGljdGlvbmFyeSB1c2luZyBwcm90b2NvbCAwLgorcGlja2xlLmR1bXAoZGF0YTEsIG91dHB1dCkKKworIyBQaWNrbGUgdGhlIGxpc3QgdXNpbmcgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgYXZhaWxhYmxlLgorcGlja2xlLmR1bXAoc2VsZnJlZl9saXN0LCBvdXRwdXQsIC0xKQorCitvdXRwdXQuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlYWRzIHRoZSByZXN1bHRpbmcgcGlja2xlZCBkYXRhLiAgV2hlbiByZWFkaW5nCithIHBpY2tsZS1jb250YWluaW5nIGZpbGUsIHlvdSBzaG91bGQgb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQorYmVjYXVzZSB5b3UgY2FuJ3QgYmUgc3VyZSBpZiB0aGUgQVNDSUkgb3IgYmluYXJ5IGZvcm1hdCB3YXMgdXNlZC4KKworXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IHBwcmludCwgcGlja2xlCisKK3BrbF9maWxlID0gb3BlbignZGF0YS5wa2wnLCAncmInKQorCitkYXRhMSA9IHBpY2tsZS5sb2FkKHBrbF9maWxlKQorcHByaW50LnBwcmludChkYXRhMSkKKworZGF0YTIgPSBwaWNrbGUubG9hZChwa2xfZmlsZSkKK3BwcmludC5wcHJpbnQoZGF0YTIpCisKK3BrbF9maWxlLmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKK0hlcmUncyBhIGxhcmdlciBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYQogY2xhc3MuICBUaGUgXGNsYXNze1RleHRSZWFkZXJ9IGNsYXNzIG9wZW5zIGEgdGV4dCBmaWxlLCBhbmQgcmV0dXJucwogdGhlIGxpbmUgbnVtYmVyIGFuZCBsaW5lIGNvbnRlbnRzIGVhY2ggdGltZSBpdHMgXG1ldGhvZHtyZWFkbGluZSgpfQogbWV0aG9kIGlzIGNhbGxlZC4gSWYgYSBcY2xhc3N7VGV4dFJlYWRlcn0gaW5zdGFuY2UgaXMgcGlja2xlZCwgYWxsCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnBrZ3V0aWwudGV4IGIvRG9jL2xpYi9saWJwa2d1dGlsLnRleAppbmRleCAxNWQ4NjZiLi5hMjg2ZjAwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBrZ3V0aWwudGV4CisrKyBiL0RvYy9saWIvbGlicGtndXRpbC50ZXgKQEAgLTMwLDcgKzMwLDcgQEAKICAgd2l0aCBcY29kZXtpbXBvcnR9LiAgQSBcZmlsZXsqLnBrZ30gZmlsZSBpcyB0cnVzdGVkIGF0IGZhY2UgdmFsdWU6CiAgIGFwYXJ0IGZyb20gY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMsIGFsbCBlbnRyaWVzIGZvdW5kIGluIGEKICAgXGZpbGV7Ki5wa2d9IGZpbGUgYXJlIGFkZGVkIHRvIHRoZSBwYXRoLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleQotICBleGlzdCB0aGUgZmlsZXN5c3RlbS4gIChUaGlzIGlzIGEgZmVhdHVyZS4pCisgIGV4aXN0IG9uIHRoZSBmaWxlc3lzdGVtLiAgKFRoaXMgaXMgYSBmZWF0dXJlLikKIAogICBJZiB0aGUgaW5wdXQgcGF0aCBpcyBub3QgYSBsaXN0IChhcyBpcyB0aGUgY2FzZSBmb3IgZnJvemVuCiAgIHBhY2thZ2VzKSBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuICBUaGUgaW5wdXQgcGF0aCBpcyBub3QKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleCBiL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleAppbmRleCA5ZjBkZTFmLi4wYjJkYTY2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBvc2l4cGF0aC50ZXgKKysrIGIvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4CkBAIC00Miw4ICs0MiwxMSBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtleGlzdHN9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcGF0aC4KLVJldHVybnMgXGNvZGV7RmFsc2V9IGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MuCitSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcGF0aC4gIFJldHVybnMKK1xjb2Rle0ZhbHNlfSBmb3IgYnJva2VuIHN5bWJvbGljIGxpbmtzLiBPbiBzb21lIHBsYXRmb3JtcywgdGhpcworZnVuY3Rpb24gbWF5IHJldHVybiBcY29kZXtGYWxzZX0gaWYgcGVybWlzc2lvbiBpcyBub3QgZ3JhbnRlZCB0bworZXhlY3V0ZSBcZnVuY3Rpb257b3Muc3RhdCgpfSBvbiB0aGUgcmVxdWVzdGVkIGZpbGUsIGV2ZW4gaWYgdGhlCitcdmFye3BhdGh9IHBoeXNpY2FsbHkgZXhpc3RzLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtsZXhpc3RzfXtwYXRofQpAQCAtMTkwLDkgKzE5Myw4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3NhbWVvcGVuZmlsZX17ZnAxLCBmcDJ9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIGZpbGUgb2JqZWN0cyBcdmFye2ZwMX0gYW5kIFx2YXJ7ZnAyfSByZWZlciB0byB0aGUKLXNhbWUgZmlsZS4gIFRoZSB0d28gZmlsZSBvYmplY3RzIG1heSByZXByZXNlbnQgZGlmZmVyZW50IGZpbGUKLWRlc2NyaXB0b3JzLgorUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBmaWxlIGRlc2NyaXB0b3JzIFx2YXJ7ZnAxfSBhbmQgXHZhcntmcDJ9IHJlZmVyCit0byB0aGUgc2FtZSBmaWxlLgogQXZhaWxhYmlsaXR5OiAgTWFjaW50b3NoLCBcVU5JWC4KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmFuZG9tLnRleCBiL0RvYy9saWIvbGlicmFuZG9tLnRleAppbmRleCA2YzJmNzEwLi5jNmI4ODQ2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnJhbmRvbS50ZXgKKysrIGIvRG9jL2xpYi9saWJyYW5kb20udGV4CkBAIC0yMzYsNyArMjM2LDcgQEAKICAgXHZhcntiZXRhfSBpcyB0aGUgc2hhcGUgcGFyYW1ldGVyLgogXGVuZHtmdW5jZGVzY30KIAotQWx0ZXJuYXRpdmUgR2VuZXJhdG9ycworQWx0ZXJuYXRpdmUgR2VuZXJhdG9yczoKIAogXGJlZ2lue2NsYXNzZGVzY317V2ljaG1hbm5IaWxsfXtcb3B0aW9uYWx7c2VlZH19CiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFdpY2htYW5uLUhpbGwgYWxnb3JpdGhtIGFzIHRoZSBjb3JlIGdlbmVyYXRvci4KQEAgLTI2Nyw2ICsyNjcsMzAgQEAKIFx2ZXJzaW9uYWRkZWR7Mi40fQogXGVuZHtjbGFzc2Rlc2N9CiAKK0V4YW1wbGVzIG9mIGJhc2ljIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcmFuZG9tLnJhbmRvbSgpICAgICAgICAjIFJhbmRvbSBmbG9hdCB4LCAwLjAgPD0geCA8IDEuMAorMC4zNzQ0NDg4NzE3NTY0NjY0NgorPj4+IHJhbmRvbS51bmlmb3JtKDEsIDEwKSAgIyBSYW5kb20gZmxvYXQgeCwgMS4wIDw9IHggPCAxMC4wCisxLjE4MDAxNDYwNzMxMTc1MjMKKz4+PiByYW5kb20ucmFuZGludCgxLCAxMCkgICMgSW50ZWdlciBmcm9tIDEgdG8gMTAsIGVuZHBvaW50cyBpbmNsdWRlZAorNworPj4+IHJhbmRvbS5yYW5kcmFuZ2UoMCwgMTAxLCAyKSAgIyBFdmVuIGludGVnZXIgZnJvbSAwIHRvIDEwMAorMjYKKz4+PiByYW5kb20uY2hvaWNlKCdhYmNkZWZnaGlqJykgICMgQ2hvb3NlIGEgcmFuZG9tIGVsZW1lbnQKKydjJworCis+Pj4gaXRlbXMgPSBbMSwgMiwgMywgNCwgNSwgNiwgN10KKz4+PiByYW5kb20uc2h1ZmZsZShpdGVtcykKKz4+PiBpdGVtcworWzcsIDMsIDIsIDUsIDYsIDQsIDFdCisKKz4+PiByYW5kb20uc2FtcGxlKFsxLCAyLCAzLCA0LCA1XSwgIDMpICAjIENob29zZSAzIGVsZW1lbnRzCitbNCwgMSwgNV0KKworXGVuZHt2ZXJiYXRpbX0KKwogXGJlZ2lue3NlZWFsc299CiAgIFxzZWV0ZXh0e00uIE1hdHN1bW90byBhbmQgVC4gTmlzaGltdXJhLCBgYE1lcnNlbm5lIFR3aXN0ZXI6IEEKIAkgICA2MjMtZGltZW5zaW9uYWxseSBlcXVpZGlzdHJpYnV0ZWQgdW5pZm9ybSBwc2V1ZG9yYW5kb20KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmUudGV4IGIvRG9jL2xpYi9saWJyZS50ZXgKaW5kZXggMTQwNGUwOS4uODRlMzgyZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJyZS50ZXgKKysrIGIvRG9jL2xpYi9saWJyZS50ZXgKQEAgLTg5Nyw3ICs4OTcsNyBAQAogICBcbGluZWlpe1xjb2Rle1wlZH19CiAgICAgICAgICB7XHJlZ2V4cHtbLStdP1xlIGQrfX0KICAgXGxpbmVpaXtcY29kZXtcJWV9LCBcY29kZXtcJUV9LCBcY29kZXtcJWZ9LCBcY29kZXtcJWd9fQotICAgICAgICAge1xyZWdleHB7Wy0rXT8oXGUgZCsoXGUuXGUgZCopP3xcZSBkKlxlLlxlIGQrKShbZUVdWy0rXT9cZSBkKyk/fX0KKyAgICAgICAgIHtccmVnZXhwe1stK10/KFxlIGQrKFxlLlxlIGQqKT98XGUuXGUgZCspKFtlRV1bLStdP1xlIGQrKT99fQogICBcbGluZWlpe1xjb2Rle1wlaX19CiAgICAgICAgICB7XHJlZ2V4cHtbLStdPygwW3hYXVtcZSBkQS1GYS1mXSt8MFswLTddKnxcZSBkKyl9fQogICBcbGluZWlpe1xjb2Rle1wlb319CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlYWRsaW5lLnRleCBiL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CmluZGV4IGFjOGUyM2YuLmRlYzM3YjYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CisrKyBiL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CkBAIC03LDEwICs3LDEzIEBACiBcbW9kdWxlc3lub3BzaXN7R05VIHJlYWRsaW5lIHN1cHBvcnQgZm9yIFB5dGhvbi59CiAKIAotVGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB1c2VkIGVpdGhlcgotZGlyZWN0bHkgb3IgZnJvbSB0aGUgXHJlZm1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIHRvIGZhY2lsaXRhdGUKLWNvbXBsZXRpb24gYW5kIGhpc3RvcnkgZmlsZSByZWFkIGFuZCB3cml0ZSBmcm9tIHRoZSBQeXRob24KLWludGVycHJldGVyLgorVGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0bworZmFjaWxpdGF0ZSBjb21wbGV0aW9uIGFuZCByZWFkaW5nL3dyaXRpbmcgb2YgaGlzdG9yeSBmaWxlcyBmcm9tIHRoZQorUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgZGlyZWN0bHkgb3IgdmlhIHRoZQorXHJlZm1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlLiAgU2V0dGluZ3MgbWFkZSB1c2luZyAKK3RoaXMgbW9kdWxlIGFmZmVjdCB0aGUgYmVoYXZpb3VyIG9mIGJvdGggdGhlIGludGVycHJldGVyJ3MgaW50ZXJhY3RpdmUgcHJvbXB0IAorYW5kIHRoZSBwcm9tcHRzIG9mZmVyZWQgYnkgdGhlIFxmdW5jdGlvbntyYXdfaW5wdXQoKX0gYW5kIFxmdW5jdGlvbntpbnB1dCgpfQorYnVpbHQtaW4gZnVuY3Rpb25zLgogCiBUaGUgXG1vZHVsZXtyZWFkbGluZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXggYi9Eb2MvbGliL2xpYnNnbWxsaWIudGV4CmluZGV4IDNlYzEwMTguLjFmZTBkNjMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJzZ21sbGliLnRleApAQCAtMTMyLDI3ICsxMzIsNTkgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jaGFycmVmfXtyZWZ9CiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGNoYXJhY3RlciByZWZlcmVuY2Ugb2YgdGhlIGZvcm0KLVxzYW1we1wmXCNcdmFye3JlZn07fS4gIEluIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCBcdmFye3JlZn0gbXVzdAotYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUKLXJhbmdlIDAtMjU1LiAgSXQgdHJhbnNsYXRlcyB0aGUgY2hhcmFjdGVyIHRvIFxBU0NJSXt9IGFuZCBjYWxscyB0aGUKLW1ldGhvZCBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9IHdpdGggdGhlIGNoYXJhY3RlciBhcyBhcmd1bWVudC4gIElmCi1cdmFye3JlZn0gaXMgaW52YWxpZCBvciBvdXQgb2YgcmFuZ2UsIHRoZSBtZXRob2QKLVxjb2Rle3Vua25vd25fY2hhcnJlZihcdmFye3JlZn0pfSBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvci4gIEEKLXN1YmNsYXNzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBuYW1lZAotY2hhcmFjdGVyIGVudGl0aWVzLgorXHNhbXB7XCZcI1x2YXJ7cmVmfTt9LiAgVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdXNlcworXG1ldGhvZHtjb252ZXJ0X2NoYXJyZWYoKX0gdG8gY29udmVydCB0aGUgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLiAgSWYKK3RoYXQgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcsIGl0IGlzIHBhc3NlZCB0byBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9LAorb3RoZXJ3aXNlIFxtZXRob2R7dW5rbm93bl9jaGFycmVmKFx2YXJ7cmVmfSl9IGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlCitlcnJvci4KK1x2ZXJzaW9uY2hhbmdlZFtVc2UgXG1ldGhvZHtjb252ZXJ0X2NoYXJyZWYoKX0gaW5zdGVhZCBvZiBoYXJkLWNvZGluZwordGhlIGNvbnZlcnNpb25dezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2NvbnZlcnRfY2hhcnJlZn17cmVmfQorQ29udmVydCBhIGNoYXJhY3RlciByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIG9yIFxjb2Rle05vbmV9LiAgXHZhcntyZWZ9CitpcyB0aGUgcmVmZXJlbmNlIHBhc3NlZCBpbiBhcyBhIHN0cmluZy4gIEluIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLAorXHZhcntyZWZ9IG11c3QgYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUgcmFuZ2UgMC0yNTUuICBJdCBjb252ZXJ0cwordGhlIGNvZGUgcG9pbnQgZm91bmQgdXNpbmcgdGhlIFxtZXRob2R7Y29udmVydF9jb2RlcG9pbnQoKX0gbWV0aG9kLgorSWYgXHZhcntyZWZ9IGlzIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlLCB0aGlzIG1ldGhvZCByZXR1cm5zCitcY29kZXtOb25lfS4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdAorXG1ldGhvZHtoYW5kbGVfY2hhcnJlZigpfSBpbXBsZW1lbnRhdGlvbiBhbmQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorcGFyc2VyLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjb252ZXJ0X2NvZGVwb2ludH17Y29kZXBvaW50fQorQ29udmVydCBhIGNvZGVwb2ludCB0byBhIFxjbGFzc3tzdHJ9IHZhbHVlLiAgRW5jb2RpbmdzIGNhbiBiZSBoYW5kbGVkCitoZXJlIGlmIGFwcHJvcHJpYXRlLCB0aG91Z2ggdGhlIHJlc3Qgb2YgXG1vZHVsZXtzZ21sbGlifSBpcyBvYmxpdmlvdXMKK29uIHRoaXMgbWF0dGVyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfZW50aXR5cmVmfXtyZWZ9CiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGdlbmVyYWwgZW50aXR5IHJlZmVyZW5jZSBvZiB0aGUKIGZvcm0gXHNhbXB7XCZcdmFye3JlZn07fSB3aGVyZSBcdmFye3JlZn0gaXMgYW4gZ2VuZXJhbCBlbnRpdHkKLXJlZmVyZW5jZS4gIEl0IGxvb2tzIGZvciBcdmFye3JlZn0gaW4gdGhlIGluc3RhbmNlIChvciBjbGFzcykKLXZhcmlhYmxlIFxtZW1iZXJ7ZW50aXR5ZGVmc30gd2hpY2ggc2hvdWxkIGJlIGEgbWFwcGluZyBmcm9tIGVudGl0eQotbmFtZXMgdG8gY29ycmVzcG9uZGluZyB0cmFuc2xhdGlvbnMuICBJZiBhIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCBpdAorcmVmZXJlbmNlLiAgSXQgY29udmVydHMgXHZhcntyZWZ9IGJ5IHBhc3NpbmcgaXQgdG8KK1xtZXRob2R7Y29udmVydF9lbnRpdHlyZWYoKX0uICBJZiBhIHRyYW5zbGF0aW9uIGlzIHJldHVybmVkLCBpdAogY2FsbHMgdGhlIG1ldGhvZCBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9IHdpdGggdGhlIHRyYW5zbGF0aW9uOwogb3RoZXJ3aXNlLCBpdCBjYWxscyB0aGUgbWV0aG9kIFxjb2Rle3Vua25vd25fZW50aXR5cmVmKFx2YXJ7cmVmfSl9LgogVGhlIGRlZmF1bHQgXG1lbWJlcntlbnRpdHlkZWZzfSBkZWZpbmVzIHRyYW5zbGF0aW9ucyBmb3IKIFxjb2Rle1wmYW1wO30sIFxjb2Rle1wmYXBvc30sIFxjb2Rle1wmZ3Q7fSwgXGNvZGV7XCZsdDt9LCBhbmQKIFxjb2Rle1wmcXVvdDt9LgorXHZlcnNpb25jaGFuZ2VkW1VzZSBcbWV0aG9ke2NvbnZlcnRfZW50aXR5cmVmKCl9IGluc3RlYWQgb2YgaGFyZC1jb2RpbmcKK3RoZSBjb252ZXJzaW9uXXsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjb252ZXJ0X2VudGl0eXJlZn17cmVmfQorQ29udmVydCBhIG5hbWVkIGVudGl0eSByZWZlcmVuY2UgdG8gYSBcY2xhc3N7c3RyfSB2YWx1ZSwgb3IKK1xjb2Rle05vbmV9LiAgVGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIG5vdCBiZSBwYXJzZWQuICBcdmFye3JlZn0gd2lsbAorYmUgb25seSB0aGUgbmFtZSBvZiB0aGUgZW50aXR5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yCitcdmFye3JlZn0gaW4gdGhlIGluc3RhbmNlIChvciBjbGFzcykgdmFyaWFibGUgXG1lbWJlcntlbnRpdHlkZWZzfQord2hpY2ggc2hvdWxkIGJlIGEgbWFwcGluZyBmcm9tIGVudGl0eSBuYW1lcyB0byBjb3JyZXNwb25kaW5nCit0cmFuc2xhdGlvbnMuICBJZiBubyB0cmFuc2xhdGlvbiBpcyBhdmFpbGFibGUgZm9yIFx2YXJ7cmVmfSwgdGhpcworbWV0aG9kIHJldHVybnMgXGNvZGV7Tm9uZX0uICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQKK1xtZXRob2R7aGFuZGxlX2VudGl0eXJlZigpfSBpbXBsZW1lbnRhdGlvbiBhbmQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorcGFyc2VyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfY29tbWVudH17Y29tbWVudH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2hlbHZlLnRleCBiL0RvYy9saWIvbGlic2hlbHZlLnRleAppbmRleCA4YmQyMDRlLi42Y2EzNTc2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNoZWx2ZS50ZXgKKysrIGIvRG9jL2xpYi9saWJzaGVsdmUudGV4CkBAIC0xNDMsMTUgKzE0MywxNyBAQAogZGVsIGRba2V5XSAgICAgICMgZGVsZXRlIGRhdGEgc3RvcmVkIGF0IGtleSAocmFpc2VzIEtleUVycm9yCiAgICAgICAgICAgICAgICAgIyBpZiBubyBzdWNoIGtleSkKIGZsYWcgPSBkLmhhc19rZXkoa2V5KSAgICMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cwotbGlzdCA9IGQua2V5cygpICMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBrZXlzIChzbG93ISkKK2tsaXN0ID0gZC5rZXlzKCkgIyBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGtleXMgKHNsb3chKQogCiAjIGFzIGQgd2FzIG9wZW5lZCBXSVRIT1VUIHdyaXRlYmFjaz1UcnVlLCBiZXdhcmU6CiBkWyd4eCddID0gcmFuZ2UoNCkgICMgdGhpcyB3b3JrcyBhcyBleHBlY3RlZCwgYnV0Li4uCiBkWyd4eCddLmFwcGVuZCg1KSAgICMgKnRoaXMgZG9lc24ndCEqIC0tIGRbJ3h4J10gaXMgU1RJTEwgcmFuZ2UoNCkhISEKKwogIyBoYXZpbmcgb3BlbmVkIGQgd2l0aG91dCB3cml0ZWJhY2s9VHJ1ZSwgeW91IG5lZWQgdG8gY29kZSBjYXJlZnVsbHk6CiB0ZW1wID0gZFsneHgnXSAgICAgICMgZXh0cmFjdHMgdGhlIGNvcHkKIHRlbXAuYXBwZW5kKDUpICAgICAgIyBtdXRhdGVzIHRoZSBjb3B5CiBkWyd4eCddID0gdGVtcCAgICAgICMgc3RvcmVzIHRoZSBjb3B5IHJpZ2h0IGJhY2ssIHRvIHBlcnNpc3QgaXQKKwogIyBvciwgZD1zaGVsdmUub3BlbihmaWxlbmFtZSx3cml0ZWJhY2s9VHJ1ZSkgd291bGQgbGV0IHlvdSBqdXN0IGNvZGUKICMgZFsneHgnXS5hcHBlbmQoNSkgYW5kIGhhdmUgaXQgd29yayBhcyBleHBlY3RlZCwgQlVUIGl0IHdvdWxkIGFsc28KICMgY29uc3VtZSBtb3JlIG1lbW9yeSBhbmQgbWFrZSB0aGUgZC5jbG9zZSgpIG9wZXJhdGlvbiBzbG93ZXIuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNpdGUudGV4IGIvRG9jL2xpYi9saWJzaXRlLnRleAppbmRleCA0M2I4ZGIyLi5jMDc5NzkwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNpdGUudGV4CisrKyBiL0RvYy9saWIvbGlic2l0ZS50ZXgKQEAgLTE2LDEyICsxNiwxMyBAQAogSXQgc3RhcnRzIGJ5IGNvbnN0cnVjdGluZyB1cCB0byBmb3VyIGRpcmVjdG9yaWVzIGZyb20gYSBoZWFkIGFuZCBhCiB0YWlsIHBhcnQuICBGb3IgdGhlIGhlYWQgcGFydCwgaXQgdXNlcyBcY29kZXtzeXMucHJlZml4fSBhbmQKIFxjb2Rle3N5cy5leGVjX3ByZWZpeH07IGVtcHR5IGhlYWRzIGFyZSBza2lwcGVkLiAgRm9yCi10aGUgdGFpbCBwYXJ0LCBpdCB1c2VzIHRoZSBlbXB0eSBzdHJpbmcgKG9uIFdpbmRvd3MpIG9yCi1cZmlsZXtsaWIvcHl0aG9uXHNob3J0dmVyc2lvbi9zaXRlLXBhY2thZ2VzfSAob24gXFVOSVh7fSBhbmQgTWFjaW50b3NoKQotYW5kIHRoZW4gXGZpbGV7bGliL3NpdGUtcHl0aG9ufS4gIEZvciBlYWNoIG9mIHRoZSBkaXN0aW5jdAotaGVhZC10YWlsIGNvbWJpbmF0aW9ucywgaXQgc2VlcyBpZiBpdCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LAotYW5kIGlmIHNvLCBhZGRzIGl0IHRvIFxjb2Rle3N5cy5wYXRofSBhbmQgYWxzbyBpbnNwZWN0cyB0aGUgbmV3bHkgYWRkZWQgCi1wYXRoIGZvciBjb25maWd1cmF0aW9uIGZpbGVzLgordGhlIHRhaWwgcGFydCwgaXQgdXNlcyB0aGUgZW1wdHkgc3RyaW5nIGFuZCB0aGVuCitcZmlsZXtsaWIvc2l0ZS1wYWNrYWdlc30gKG9uIFdpbmRvd3MpIG9yCitcZmlsZXtsaWIvcHl0aG9uXHNob3J0dmVyc2lvbi9zaXRlLXBhY2thZ2VzfSBhbmQgdGhlbgorXGZpbGV7bGliL3NpdGUtcHl0aG9ufSAob24gXFVOSVh7fSBhbmQgTWFjaW50b3NoKS4gIEZvciBlYWNoIG9mIHRoZQorZGlzdGluY3QgaGVhZC10YWlsIGNvbWJpbmF0aW9ucywgaXQgc2VlcyBpZiBpdCByZWZlcnMgdG8gYW4gZXhpc3RpbmcKK2RpcmVjdG9yeSwgYW5kIGlmIHNvLCBhZGRzIGl0IHRvIFxjb2Rle3N5cy5wYXRofSBhbmQgYWxzbyBpbnNwZWN0cwordGhlIG5ld2x5IGFkZGVkIHBhdGggZm9yIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiBcaW5kZXhpaXtzaXRlLXB5dGhvbn17ZGlyZWN0b3J5fQogXGluZGV4aWl7c2l0ZS1wYWNrYWdlc317ZGlyZWN0b3J5fQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNvY2tldC50ZXggYi9Eb2MvbGliL2xpYnNvY2tldC50ZXgKaW5kZXggODA2NjUyOC4uYWE3NWVjOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzb2NrZXQudGV4CisrKyBiL0RvYy9saWIvbGlic29ja2V0LnRleApAQCAtNzExLDYgKzcxMSwxNyBAQAogcmVhZCB1bnRpbCBFT0YuIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgb2YgdGhlIGJ5dGVzIHJlYWQuCiBcZW5ke21ldGhvZGRlc2N9CiAKK1xiZWdpbnttZXRob2RkZXNjfXtzZXJ2ZXJ9e30KK1JldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgQVNOLjEgZGlzdGluZ3Vpc2hlZCBuYW1lIGlkZW50aWZ5aW5nIHRoZSAKK3NlcnZlcidzIGNlcnRpZmljYXRlLiAgKFNlZSBiZWxvdyBmb3IgYW4gZXhhbXBsZQorc2hvd2luZyB3aGF0IGRpc3Rpbmd1aXNoZWQgbmFtZXMgbG9vayBsaWtlLikKK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2lzc3Vlcn17fQorUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBBU04uMSBkaXN0aW5ndWlzaGVkIG5hbWUgaWRlbnRpZnlpbmcgdGhlCitpc3N1ZXIgb2YgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLgorXGVuZHttZXRob2RkZXNjfQorCiBcc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtzb2NrZXQtZXhhbXBsZX19CiAKIEhlcmUgYXJlIGZvdXIgbWluaW1hbCBleGFtcGxlIHByb2dyYW1zIHVzaW5nIHRoZSBUQ1AvSVAgcHJvdG9jb2w6XCBhCkBAIC04MzMsMyArODQ0LDQ0IEBACiBzLmNsb3NlKCkKIHByaW50ICdSZWNlaXZlZCcsIHJlcHIoZGF0YSkKIFxlbmR7dmVyYmF0aW19CisKK1RoaXMgZXhhbXBsZSBjb25uZWN0cyB0byBhbiBTU0wgc2VydmVyLCBwcmludHMgdGhlIAorc2VydmVyIGFuZCBpc3N1ZXIncyBkaXN0aW5ndWlzaGVkIG5hbWVzLCBzZW5kcyBzb21lIGJ5dGVzLAorYW5kIHJlYWRzIHBhcnQgb2YgdGhlIHJlc3BvbnNlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgc29ja2V0CisKK3MgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCitzLmNvbm5lY3QoKCd3d3cudmVyaXNpZ24uY29tJywgNDQzKSkKKworc3NsX3NvY2sgPSBzb2NrZXQuc3NsKHMpCisKK3ByaW50IHJlcHIoc3NsX3NvY2suc2VydmVyKCkpCitwcmludCByZXByKHNzbF9zb2NrLmlzc3VlcigpKQorCisjIFNldCBhIHNpbXBsZSBIVFRQIHJlcXVlc3QgLS0gdXNlIGh0dHBsaWIgaW4gYWN0dWFsIGNvZGUuCitzc2xfc29jay53cml0ZSgiIiJHRVQgLyBIVFRQLzEuMFxyCitIb3N0OiB3d3cudmVyaXNpZ24uY29tXHJcblxyXG4iIiIpCisKKyMgUmVhZCBhIGNodW5rIG9mIGRhdGEuICBXaWxsIG5vdCBuZWNlc3NhcmlseQorIyByZWFkIGFsbCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyLgorZGF0YSA9IHNzbF9zb2NrLnJlYWQoKQorCisjIE5vdGUgdGhhdCB5b3UgbmVlZCB0byBjbG9zZSB0aGUgdW5kZXJseWluZyBzb2NrZXQsIG5vdCB0aGUgU1NMIG9iamVjdC4KK2RlbCBzc2xfc29jaworcy5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCitBdCB0aGlzIHdyaXRpbmcsIHRoaXMgU1NMIGV4YW1wbGUgcHJpbnRzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IChsaW5lCiticmVha3MgaW5zZXJ0ZWQgZm9yIHJlYWRhYmlsaXR5KToKKworXGJlZ2lue3ZlcmJhdGltfQorJy9DPVVTL1NUPUNhbGlmb3JuaWEvTD1Nb3VudGFpbiBWaWV3LworIE89VmVyaVNpZ24sIEluYy4vT1U9UHJvZHVjdGlvbiBTZXJ2aWNlcy8KKyBPVT1UZXJtcyBvZiB1c2UgYXQgd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMDAvCisgQ049d3d3LnZlcmlzaWduLmNvbScKKycvTz1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrL09VPVZlcmlTaWduLCBJbmMuLworIE9VPVZlcmlTaWduIEludGVybmF0aW9uYWwgU2VydmVyIENBIC0gQ2xhc3MgMy8KKyBPVT13d3cudmVyaXNpZ24uY29tL0NQUyBJbmNvcnAuYnkgUmVmLiBMSUFCSUxJVFkgTFRELihjKTk3IFZlcmlTaWduJworXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic29ja3N2ci50ZXggYi9Eb2MvbGliL2xpYnNvY2tzdnIudGV4CmluZGV4IGIyMWU4MDQuLmM3YjI4ZWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic29ja3N2ci50ZXgKKysrIGIvRG9jL2xpYi9saWJzb2Nrc3ZyLnRleApAQCAtNzQsOSArNzQsOSBAQAogXGVuZHt2ZXJiYXRpbX0KIAogTm90ZSB0aGF0IFxjbGFzc3tVbml4RGF0YWdyYW1TZXJ2ZXJ9IGRlcml2ZXMgZnJvbSBcY2xhc3N7VURQU2VydmVyfSwgbm90Ci1mcm9tIFxjbGFzc3tVbml4U3RyZWFtU2VydmVyfSAtLSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gSVAgYW5kIGEKLVVuaXggc3RyZWFtIHNlcnZlciBpcyB0aGUgYWRkcmVzcyBmYW1pbHksIHdoaWNoIGlzIHNpbXBseSByZXBlYXRlZCBpbiBib3RoCi11bml4IHNlcnZlciBjbGFzc2VzLgorZnJvbSBcY2xhc3N7VW5peFN0cmVhbVNlcnZlcn0gLS0tIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBJUCBhbmQgYQorXFVOSVh7fSBzdHJlYW0gc2VydmVyIGlzIHRoZSBhZGRyZXNzIGZhbWlseSwgd2hpY2ggaXMgc2ltcGx5IHJlcGVhdGVkIGluIGJvdGgKK1xVTklYe30gc2VydmVyIGNsYXNzZXMuCiAKIEZvcmtpbmcgYW5kIHRocmVhZGluZyB2ZXJzaW9ucyBvZiBlYWNoIHR5cGUgb2Ygc2VydmVyIGNhbiBiZSBjcmVhdGVkIHVzaW5nCiB0aGUgXGNsYXNze0ZvcmtpbmdNaXhJbn0gYW5kIFxjbGFzc3tUaHJlYWRpbmdNaXhJbn0gbWl4LWluIGNsYXNzZXMuICBGb3IKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXggYi9Eb2MvbGliL2xpYnNxbGl0ZTMudGV4CmluZGV4IGRiMTVjMDAuLmQ4N2UwNjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXgKKysrIGIvRG9jL2xpYi9saWJzcWxpdGUzLnRleApAQCAtMTk1LDYgKzE5NSwxNCBAQAogICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5fQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXt9ZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3N7ZmxhZ30KK0J5IGRlZmF1bHQgeW91IHdpbGwgbm90IGdldCBhbnkgdHJhY2ViYWNrcyBpbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLAorYWdncmVnYXRlcywgY29udmVydGVycywgYXV0aG9yaXplciBjYWxsYmFja3MgZXRjLiBJZiB5b3Ugd2FudCB0byBkZWJ1ZyB0aGVtLAoreW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBcdmFye2ZsYWd9IGFzIFRydWUuIEFmdGVyd2FyZHMsIHlvdSB3aWxsIGdldAordHJhY2ViYWNrcyBmcm9tIGNhbGxiYWNrcyBvbiBcY29kZXtzeXMuc3RkZXJyfS4gVXNlIFxjb25zdGFudHtGYWxzZX0gdG8gZGlzYWJsZQordGhlIGZlYXR1cmUgYWdhaW4uCitcZW5ke2Z1bmNkZXNjfQorCiBcc3Vic2VjdGlvbntDb25uZWN0aW9uIE9iamVjdHMgXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1PYmplY3RzfX0KIAogQSBcY2xhc3N7Q29ubmVjdGlvbn0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKQEAgLTIzNyw4ICsyNDUsNyBAQAogY2FsbGVkIGFzIFNRTCBmdW5jdGlvbi4KIAogVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYW55IG9mIHRoZSB0eXBlcyBzdXBwb3J0ZWQgYnkgU1FMaXRlOiB1bmljb2RlLCBzdHIsCi1pbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuICBFeGNlcHRpb25zIGluIHRoZSBmdW5jdGlvbiBhcmUgaWdub3JlZCBhbmQKLXRoZXkgYXJlIGhhbmRsZWQgYXMgaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIE5vbmUuCitpbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuCiAKIEV4YW1wbGU6CiAKQEAgLTI1NCw3ICsyNjEsNyBAQAogd2lsbCByZXR1cm4gdGhlIGZpbmFsIHJlc3VsdCBvZiB0aGUgYWdncmVnYXRlLgogCiBUaGUgXGNvZGV7ZmluYWxpemV9IG1ldGhvZCBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZToKLXVuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLiBBbnkgZXhjZXB0aW9ucyBhcmUgaWdub3JlZC4KK3VuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLgogCiBFeGFtcGxlOgogCkBAIC0yODMsNiArMjkwLDM0IEBACiBcZW5ke3ZlcmJhdGltfQogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY317aW50ZXJydXB0fXt9CisKK1lvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0byBhYm9ydCBhbnkgcXVlcmllcyB0aGF0CittaWdodCBiZSBleGVjdXRpbmcgb24gdGhlIGNvbm5lY3Rpb24uIFRoZSBxdWVyeSB3aWxsIHRoZW4gYWJvcnQgYW5kIHRoZSBjYWxsZXIKK3dpbGwgZ2V0IGFuIGV4Y2VwdGlvbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9hdXRob3JpemVyfXthdXRob3JpemVyX2NhbGxiYWNrfQorCitUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBlYWNoIGF0dGVtcHQgdG8KK2FjY2VzcyBhIGNvbHVtbiBvZiBhIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4KK1xjb25zdGFudHtTUUxJVEVfT0t9IGlmIGFjY2VzcyBpcyBhbGxvd2VkLCBcY29uc3RhbnR7U1FMSVRFX0RFTll9IGlmIHRoZSBlbnRpcmUKK1NRTCBzdGF0ZW1lbnQgc2hvdWxkIGJlIGFib3J0ZWQgd2l0aCBhbiBlcnJvciBhbmQgXGNvbnN0YW50e1NRTElURV9JR05PUkV9IGlmCit0aGUgY29sdW1uIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgTlVMTCB2YWx1ZS4gVGhlc2UgY29uc3RhbnRzIGFyZSBhdmFpbGFibGUgaW4KK3RoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZS4KKworVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjayBzaWduaWZpZXMgd2hhdCBraW5kIG9mIG9wZXJhdGlvbiBpcyB0byBiZQorYXV0aG9yaXplZC4gVGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgd2lsbCBiZSBhcmd1bWVudHMgb3IgXGNvbnN0YW50e05vbmV9CitkZXBlbmRpbmcgb24gdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGUgNHRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZQorKCJtYWluIiwgInRlbXAiLCBldGMuKSBpZiBhcHBsaWNhYmxlLiBUaGUgNXRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZQoraW5uZXItbW9zdCB0cmlnZ2VyIG9yIHZpZXcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGFjY2VzcyBhdHRlbXB0IG9yCitcY29uc3RhbnR7Tm9uZX0gaWYgdGhpcyBhY2Nlc3MgYXR0ZW1wdCBpcyBkaXJlY3RseSBmcm9tIGlucHV0IFNRTCBjb2RlLgorCitQbGVhc2UgY29uc3VsdCB0aGUgU1FMaXRlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpcnN0Cithcmd1bWVudCBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgZGVwZW5kaW5nIG9uIHRoZQorZmlyc3Qgb25lLiBBbGwgbmVjZXNzYXJ5IGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZSBcbW9kdWxle3NxbGl0ZTN9Cittb2R1bGUuCitcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfXtyb3dfZmFjdG9yeX0KICAgWW91IGNhbiBjaGFuZ2UgdGhpcyBhdHRyaWJ1dGUgdG8gYSBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgdGhlIGN1cnNvciBhbmQKQEAgLTQ3NywxMCArNTEyLDEwIEBACiBcY2xhc3N7b2JqZWN0fSBhcyBvbmUgb2YgaXRzIGJhc2VzLgogXGVuZHtub3RpY2V9CiAKLVRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBoYXMgdHdvIGRlZmF1bHQgYWRhcHRlcnMgZm9yIFB5dGhvbidzIGJ1aWx0aW4KLVxjbGFzc3tkYXRldGltZS5kYXRlfSBhbmQgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSB0eXBlcy4gTm93IGxldCdzIHN1cHBvc2Ugd2UKLXdhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sIGJ1dAotYXMgVW5peCB0aW1lc3RhbXAuCitUaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgaGFzIHR3byBkZWZhdWx0IGFkYXB0ZXJzIGZvciBQeXRob24ncyBidWlsdC1pbgorXGNsYXNze2RhdGV0aW1lLmRhdGV9IGFuZCBcY2xhc3N7ZGF0ZXRpbWUuZGF0ZXRpbWV9IHR5cGVzLiAgTm93IGxldCdzIHN1cHBvc2UKK3dlIHdhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sCitidXQgYXMgYSBcVU5JWHt9IHRpbWVzdGFtcC4KIAogICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weX0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleAppbmRleCBmNDQzNjBiLi45NWIwNmY4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleApAQCAtMSw0ICsxLDQgQEAKLVxzZWN0aW9ue0J1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc319CitcY2hhcHRlcntCdWlsdC1pbiBUeXBlcyBcbGFiZWx7dHlwZXN9fQogCiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIHRoZSBzdGFuZGFyZCB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvCiB0aGUgaW50ZXJwcmV0ZXIuCkBAIC03LDE0ICs3LDE0IEBACiB0aGUgYnVpbHQtaW4gdHlwZXMgYXMgdGhlIGJhc2lzIGZvciBvYmplY3Qtb3JpZW50ZWQgaW5oZXJpdGFuY2UuCiBUaGlzIGxpbWl0YXRpb24gZG9lcyBub3QgZXhpc3QgYW55IGxvbmdlci59CiAKLVRoZSBwcmluY2lwYWwgYnVpbHQtaW4gdHlwZXMgYXJlIG51bWVyaWNzLCBzZXF1ZW5jZXMsIG1hcHBpbmdzLCBmaWxlcworVGhlIHByaW5jaXBhbCBidWlsdC1pbiB0eXBlcyBhcmUgbnVtZXJpY3MsIHNlcXVlbmNlcywgbWFwcGluZ3MsIGZpbGVzLAogY2xhc3NlcywgaW5zdGFuY2VzIGFuZCBleGNlcHRpb25zLgogXGluZGV4aWl7YnVpbHQtaW59e3R5cGVzfQogCiBTb21lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBzZXZlcmFsIG9iamVjdCB0eXBlczsgaW4gcGFydGljdWxhciwKIHByYWN0aWNhbGx5IGFsbCBvYmplY3RzIGNhbiBiZSBjb21wYXJlZCwgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwKLWFuZCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgKHdpdGggdGhlIFxjb2Rle2BcdGV4dHJte1xsZG90c31gfSBub3RhdGlvbiwKLXRoZSBlcXVpdmFsZW50IFxmdW5jdGlvbntyZXByKCl9IGZ1bmN0aW9uLCBvciB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50CithbmQgY29udmVydGVkIHRvIGEgc3RyaW5nICh3aXRoCit0aGUgXGZ1bmN0aW9ue3JlcHIoKX0gZnVuY3Rpb24gb3IgdGhlIHNsaWdodGx5IGRpZmZlcmVudAogXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbikuICBUaGUgbGF0dGVyCiBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IHVzZWQgd2hlbiBhbiBvYmplY3QgaXMgd3JpdHRlbiBieSB0aGUKIFxrZXl3b3Jke3ByaW50fVxzdGluZGV4e3ByaW50fSBzdGF0ZW1lbnQuCkBAIC0yNCw3ICsyNCw3IEBACiBcY2l0ZXRpdGxlWy4uL3R1dC90dXQuaHRtbF17UHl0aG9uIFR1dG9yaWFsfS4pCiAKIAotXHN1YnNlY3Rpb257VHJ1dGggVmFsdWUgVGVzdGluZ1xsYWJlbHt0cnV0aH19Citcc2VjdGlvbntUcnV0aCBWYWx1ZSBUZXN0aW5nXGxhYmVse3RydXRofX0KIAogQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiBca2V5d29yZHtpZn0gb3IKIFxrZXl3b3Jke3doaWxlfSBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LgpAQCAtNzEsNyArNzEsNyBAQAogXGluZGV4e0ZhbHNlfQogXGluZGV4e1RydWV9CiAKLVxzdWJzZWN0aW9ue0Jvb2xlYW4gT3BlcmF0aW9ucyAtLS0KK1xzZWN0aW9ue0Jvb2xlYW4gT3BlcmF0aW9ucyAtLS0KIAkgICAgXGtleXdvcmR7YW5kfSwgXGtleXdvcmR7b3J9LCBca2V5d29yZHtub3R9CiAJICAgIFxsYWJlbHtib29sZWFufX0KIApAQCAtMTA3LDcgKzEwNyw3IEBACiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAKLVxzdWJzZWN0aW9ue0NvbXBhcmlzb25zIFxsYWJlbHtjb21wYXJpc29uc319Citcc2VjdGlvbntDb21wYXJpc29ucyBcbGFiZWx7Y29tcGFyaXNvbnN9fQogCiBDb21wYXJpc29uIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBhbGwgb2JqZWN0cy4gIFRoZXkgYWxsIGhhdmUgdGhlCiBzYW1lIHByaW9yaXR5ICh3aGljaCBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMpLgpAQCAtMTc0LDcgKzE3NCw3IEBACiBvbmx5IGJ5IHNlcXVlbmNlIHR5cGVzIChiZWxvdykuCiAKIAotXHN1YnNlY3Rpb257TnVtZXJpYyBUeXBlcyAtLS0KK1xzZWN0aW9ue051bWVyaWMgVHlwZXMgLS0tCiAJICAgIFxjbGFzc3tpbnR9LCBcY2xhc3N7ZmxvYXR9LCBcY2xhc3N7bG9uZ30sIFxjbGFzc3tjb21wbGV4fQogCSAgICBcbGFiZWx7dHlwZXNudW1lcmljfX0KIApAQCAtMzA3LDcgKzMwNyw3IEBACiBcZW5ke2Rlc2NyaXB0aW9ufQogJSBYWFhKSCBleGNlcHRpb25zOiBvdmVyZmxvdyAod2hlbj8gd2hhdCBvcGVyYXRpb25zPykgemVyb2RpdmlzaW9uCiAKLVxzdWJzdWJzZWN0aW9ue0JpdC1zdHJpbmcgT3BlcmF0aW9ucyBvbiBJbnRlZ2VyIFR5cGVzIFxsYWJlbHtiaXRzdHJpbmctb3BzfX0KK1xzdWJzZWN0aW9ue0JpdC1zdHJpbmcgT3BlcmF0aW9ucyBvbiBJbnRlZ2VyIFR5cGVzIFxsYWJlbHtiaXRzdHJpbmctb3BzfX0KIFxub2RlbmFtZXtCaXQtc3RyaW5nIE9wZXJhdGlvbnN9CiAKIFBsYWluIGFuZCBsb25nIGludGVnZXIgdHlwZXMgc3VwcG9ydCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdGhhdCBtYWtlCkBAIC0zNTAsNyArMzUwLDcgQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIAotXHN1YnNlY3Rpb257SXRlcmF0b3IgVHlwZXMgXGxhYmVse3R5cGVpdGVyfX0KK1xzZWN0aW9ue0l0ZXJhdG9yIFR5cGVzIFxsYWJlbHt0eXBlaXRlcn19CiAKIFx2ZXJzaW9uYWRkZWR7Mi4yfQogXGluZGV4e2l0ZXJhdG9yIHByb3RvY29sfQpAQCAtNDE0LDcgKzQxNCw3IEBACiBzdXBwbHlpbmcgdGhlIFxtZXRob2R7X19pdGVyX18oKX0gYW5kIFxtZXRob2R7bmV4dCgpfSBtZXRob2RzLgogCiAKLVxzdWJzZWN0aW9ue1NlcXVlbmNlIFR5cGVzIC0tLQorXHNlY3Rpb257U2VxdWVuY2UgVHlwZXMgLS0tCiAJICAgIFxjbGFzc3tzdHJ9LCBcY2xhc3N7dW5pY29kZX0sIFxjbGFzc3tsaXN0fSwKIAkgICAgXGNsYXNze3R1cGxlfSwgXGNsYXNze2J1ZmZlcn0sIFxjbGFzc3t4cmFuZ2V9CiAJICAgIFxsYWJlbHt0eXBlc3NlcX19CkBAIC01NjYsNyArNTY2LDggQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIAotXHN1YnN1YnNlY3Rpb257U3RyaW5nIE1ldGhvZHMgXGxhYmVse3N0cmluZy1tZXRob2RzfX0KK1xzdWJzZWN0aW9ue1N0cmluZyBNZXRob2RzIFxsYWJlbHtzdHJpbmctbWV0aG9kc319CitcaW5kZXhpaXtzdHJpbmd9e21ldGhvZHN9CiAKIFRoZXNlIGFyZSB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZCBVbmljb2RlCiBvYmplY3RzIHN1cHBvcnQ6CkBAIC02MTgsOCArNjE5LDExIEBACiAKIFxiZWdpbnttZXRob2RkZXNjfVtzdHJpbmdde2VuZHN3aXRofXtzdWZmaXhcb3B0aW9uYWx7LCBzdGFydFxvcHRpb25hbHssIGVuZH19fQogUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgXHZhcntzdWZmaXh9LAotb3RoZXJ3aXNlIHJldHVybiBcY29kZXtGYWxzZX0uICBXaXRoIG9wdGlvbmFsIFx2YXJ7c3RhcnR9LCB0ZXN0IGJlZ2lubmluZyBhdAorb3RoZXJ3aXNlIHJldHVybiBcY29kZXtGYWxzZX0uICBcdmFye3N1ZmZpeH0gY2FuIGFsc28gYmUgYSB0dXBsZSBvZgorc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsIFx2YXJ7c3RhcnR9LCB0ZXN0IGJlZ2lubmluZyBhdAogdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgXHZhcntlbmR9LCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0IHBvc2l0aW9uLgorCitcdmVyc2lvbmNoYW5nZWRbQWNjZXB0IHR1cGxlcyBhcyBcdmFye3N1ZmZpeH1dezIuNX0KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W3N0cmluZ117ZXhwYW5kdGFic317XG9wdGlvbmFse3RhYnNpemV9fQpAQCAtODI5LDkgKzgzMywxMiBAQAogXGJlZ2lue21ldGhvZGRlc2N9W3N0cmluZ117c3RhcnRzd2l0aH17cHJlZml4XG9wdGlvbmFseywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19CiBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBcdmFye3ByZWZpeH0sIG90aGVyd2lzZQotcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdAorcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFx2YXJ7cHJlZml4fSBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mCitzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdAogdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgXHZhcntlbmR9LCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdAogcG9zaXRpb24uCisKK1x2ZXJzaW9uY2hhbmdlZFtBY2NlcHQgdHVwbGVzIGFzIFx2YXJ7cHJlZml4fV17Mi41fQogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bc3RyaW5nXXtzdHJpcH17XG9wdGlvbmFse2NoYXJzfX0KQEAgLTg5NCw3ICs5MDEsNyBAQAogXGVuZHttZXRob2RkZXNjfQogCiAKLVxzdWJzdWJzZWN0aW9ue1N0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMgXGxhYmVse3R5cGVzc2VxLXN0cmluZ3N9fQorXHN1YnNlY3Rpb257U3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyBcbGFiZWx7dHlwZXNzZXEtc3RyaW5nc319CiAKIFxpbmRleHtmb3JtYXR0aW5nLCBzdHJpbmcgKFwle30pfQogXGluZGV4e2ludGVycG9sYXRpb24sIHN0cmluZyAoXCV7fSl9CkBAIC0xMDY1LDcgKzEwNzIsNyBAQAogXHJlZm1vZHVsZXtyZX0uXHJlZnN0bW9kaW5kZXh7cmV9CiAKIAotXHN1YnN1YnNlY3Rpb257WFJhbmdlIFR5cGUgXGxhYmVse3R5cGVzc2VxLXhyYW5nZX19Citcc3Vic2VjdGlvbntYUmFuZ2UgVHlwZSBcbGFiZWx7dHlwZXNzZXEteHJhbmdlfX0KIAogVGhlIFxjbGFzc3t4cmFuZ2V9XG9iaW5kZXh7eHJhbmdlfSB0eXBlIGlzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB3aGljaAogaXMgY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZy4gIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIFxjbGFzc3t4cmFuZ2V9CkBAIC0xMDc3LDcgKzEwODQsNyBAQAogaXRlcmF0aW9uLCBhbmQgdGhlIFxmdW5jdGlvbntsZW4oKX0gZnVuY3Rpb24uCiAKIAotXHN1YnN1YnNlY3Rpb257TXV0YWJsZSBTZXF1ZW5jZSBUeXBlcyBcbGFiZWx7dHlwZXNzZXEtbXV0YWJsZX19Citcc3Vic2VjdGlvbntNdXRhYmxlIFNlcXVlbmNlIFR5cGVzIFxsYWJlbHt0eXBlc3NlcS1tdXRhYmxlfX0KIAogTGlzdCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXQgYWxsb3cgaW4tcGxhY2UKIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LgpAQCAtMTA5NCw3ICsxMTAxLDggQEAKICAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9XSA9IFx2YXJ7eH19CiAJe2l0ZW0gXHZhcntpfSBvZiBcdmFye3N9IGlzIHJlcGxhY2VkIGJ5IFx2YXJ7eH19e30KICAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gXHZhcnt0fX0KLSAgCXtzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IGlzIHJlcGxhY2VkIGJ5IFx2YXJ7dH19e30KKyAgCXtzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IAorICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBpdGVyYWJsZSBcdmFye3R9fXt9CiAgIFxsaW5laWlpe2RlbCBcdmFye3N9W1x2YXJ7aX06XHZhcntqfV19CiAJe3NhbWUgYXMgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gW119fXt9CiAgIFxsaW5laWlpe1x2YXJ7c31bXHZhcntpfTpcdmFye2p9Olx2YXJ7a31dID0gXHZhcnt0fX0KQEAgLTEyMDgsNyArMTIxNiw3IEBACiAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LgogXGVuZHtkZXNjcmlwdGlvbn0KIAotXHN1YnNlY3Rpb257U2V0IFR5cGVzIC0tLQorXHNlY3Rpb257U2V0IFR5cGVzIC0tLQogCSAgICBcY2xhc3N7c2V0fSwgXGNsYXNze2Zyb3plbnNldH0KIAkgICAgXGxhYmVse3R5cGVzLXNldH19CiBcb2JpbmRleHtzZXR9CkBAIC0xMzQ3LDcgKzEzNTUsNyBAQAogXGVuZHtzZWVhbHNvfQogICAgICAKIAotXHN1YnNlY3Rpb257TWFwcGluZyBUeXBlcyAtLS0gXGNsYXNze2RpY3R9IFxsYWJlbHt0eXBlc21hcHBpbmd9fQorXHNlY3Rpb257TWFwcGluZyBUeXBlcyAtLS0gXGNsYXNze2RpY3R9IFxsYWJlbHt0eXBlc21hcHBpbmd9fQogXG9iaW5kZXh7bWFwcGluZ30KIFxvYmluZGV4e2RpY3Rpb25hcnl9CiAKQEAgLTE1MTAsNyArMTUxOCw3IEBACiAKIFxlbmR7ZGVzY3JpcHRpb259CiAKLVxzdWJzZWN0aW9ue0ZpbGUgT2JqZWN0cworXHNlY3Rpb257RmlsZSBPYmplY3RzCiAgICAgICAgICAgICBcbGFiZWx7Ymx0aW4tZmlsZS1vYmplY3RzfX0KIAogRmlsZSBvYmplY3RzXG9iaW5kZXh7ZmlsZX0gYXJlIGltcGxlbWVudGVkIHVzaW5nIEMncyBcY29kZXtzdGRpb30KQEAgLTE3ODMsNyArMTc5MSw3IEBACiBcZW5ke21lbWJlcmRlc2N9CiAKIAotXHN1YnNlY3Rpb257Q29udGV4dCBNYW5hZ2VyIFR5cGVzIFxsYWJlbHt0eXBlY29udGV4dG1hbmFnZXJ9fQorXHNlY3Rpb257Q29udGV4dCBNYW5hZ2VyIFR5cGVzIFxsYWJlbHt0eXBlY29udGV4dG1hbmFnZXJ9fQogCiBcdmVyc2lvbmFkZGVkezIuNX0KIFxpbmRleHtjb250ZXh0IG1hbmFnZXJ9CkBAIC0xODY0LDEzICsxODcyLDEzIEBACiBpcyBuZWdsaWdpYmxlLgogCiAKLVxzdWJzZWN0aW9ue090aGVyIEJ1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc290aGVyfX0KK1xzZWN0aW9ue090aGVyIEJ1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc290aGVyfX0KIAogVGhlIGludGVycHJldGVyIHN1cHBvcnRzIHNldmVyYWwgb3RoZXIga2luZHMgb2Ygb2JqZWN0cy4KIE1vc3Qgb2YgdGhlc2Ugc3VwcG9ydCBvbmx5IG9uZSBvciB0d28gb3BlcmF0aW9ucy4KIAogCi1cc3Vic3Vic2VjdGlvbntNb2R1bGVzIFxsYWJlbHt0eXBlc21vZHVsZXN9fQorXHN1YnNlY3Rpb257TW9kdWxlcyBcbGFiZWx7dHlwZXNtb2R1bGVzfX0KIAogVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczoKIFxjb2Rle1x2YXJ7bX0uXHZhcntuYW1lfX0sIHdoZXJlIFx2YXJ7bX0gaXMgYSBtb2R1bGUgYW5kIFx2YXJ7bmFtZX0KQEAgLTE4OTYsMTQgKzE5MDQsMTQgQEAKICcvdXNyL2xvY2FsL2xpYi9weXRob25cc2hvcnR2ZXJzaW9uL29zLnB5Yyc+fS4KIAogCi1cc3Vic3Vic2VjdGlvbntDbGFzc2VzIGFuZCBDbGFzcyBJbnN0YW5jZXMgXGxhYmVse3R5cGVzb2JqZWN0c319Citcc3Vic2VjdGlvbntDbGFzc2VzIGFuZCBDbGFzcyBJbnN0YW5jZXMgXGxhYmVse3R5cGVzb2JqZWN0c319CiBcbm9kZW5hbWV7Q2xhc3NlcyBhbmQgSW5zdGFuY2VzfQogCiBTZWUgY2hhcHRlcnMgMyBhbmQgNyBvZiB0aGUgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbgogUmVmZXJlbmNlIE1hbnVhbH0gZm9yIHRoZXNlLgogCiAKLVxzdWJzdWJzZWN0aW9ue0Z1bmN0aW9ucyBcbGFiZWx7dHlwZXNmdW5jdGlvbnN9fQorXHN1YnNlY3Rpb257RnVuY3Rpb25zIFxsYWJlbHt0eXBlc2Z1bmN0aW9uc319CiAKIEZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seQogb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6CkBAIC0xOTE3LDcgKzE5MjUsNyBAQAogU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBtb3JlCiBpbmZvcm1hdGlvbi4KIAotXHN1YnN1YnNlY3Rpb257TWV0aG9kcyBcbGFiZWx7dHlwZXNtZXRob2RzfX0KK1xzdWJzZWN0aW9ue01ldGhvZHMgXGxhYmVse3R5cGVzbWV0aG9kc319CiBcb2JpbmRleHttZXRob2R9CiAKIE1ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbi4KQEAgLTE5NjIsNyArMTk3MCw3IEBACiBpbmZvcm1hdGlvbi4KIAogCi1cc3Vic3Vic2VjdGlvbntDb2RlIE9iamVjdHMgXGxhYmVse2JsdGluLWNvZGUtb2JqZWN0c319Citcc3Vic2VjdGlvbntDb2RlIE9iamVjdHMgXGxhYmVse2JsdGluLWNvZGUtb2JqZWN0c319CiBcb2JpbmRleHtjb2RlfQogCiBDb2RlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIHJlcHJlc2VudApAQCAtMTk4NSw3ICsxOTkzLDcgQEAKIGluZm9ybWF0aW9uLgogCiAKLVxzdWJzdWJzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7Ymx0aW4tdHlwZS1vYmplY3RzfX0KK1xzdWJzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7Ymx0aW4tdHlwZS1vYmplY3RzfX0KIAogVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3QncyB0eXBlIGlzCiBhY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue3R5cGUoKX0uICBUaGVyZSBhcmUgbm8gc3BlY2lhbApAQCAtMTk5Nyw3ICsyMDA1LDcgQEAKIFR5cGVzIGFyZSB3cml0dGVuIGxpa2UgdGhpczogXGNvZGV7PHR5cGUgJ2ludCc+fS4KIAogCi1cc3Vic3Vic2VjdGlvbntUaGUgTnVsbCBPYmplY3QgXGxhYmVse2JsdGluLW51bGwtb2JqZWN0fX0KK1xzdWJzZWN0aW9ue1RoZSBOdWxsIE9iamVjdCBcbGFiZWx7Ymx0aW4tbnVsbC1vYmplY3R9fQogCiBUaGlzIG9iamVjdCBpcyByZXR1cm5lZCBieSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHJldHVybiBhCiB2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGwKQEAgLTIwMDYsNyArMjAxNCw3IEBACiBJdCBpcyB3cml0dGVuIGFzIFxjb2Rle05vbmV9LgogCiAKLVxzdWJzdWJzZWN0aW9ue1RoZSBFbGxpcHNpcyBPYmplY3QgXGxhYmVse2JsdGluLWVsbGlwc2lzLW9iamVjdH19Citcc3Vic2VjdGlvbntUaGUgRWxsaXBzaXMgT2JqZWN0IFxsYWJlbHtibHRpbi1lbGxpcHNpcy1vYmplY3R9fQogCiBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uIChzZWUgdGhlCiBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9KS4gIEl0IHN1cHBvcnRzIG5vCkBAIC0yMDE1LDcgKzIwMjMsNyBAQAogCiBJdCBpcyB3cml0dGVuIGFzIFxjb2Rle0VsbGlwc2lzfS4KIAotXHN1YnN1YnNlY3Rpb257Qm9vbGVhbiBWYWx1ZXN9Citcc3Vic2VjdGlvbntCb29sZWFuIFZhbHVlc30KIAogQm9vbGVhbiB2YWx1ZXMgYXJlIHRoZSB0d28gY29uc3RhbnQgb2JqZWN0cyBcY29kZXtGYWxzZX0gYW5kCiBcY29kZXtUcnVlfS4gIFRoZXkgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRydXRoIHZhbHVlcyAoYWx0aG91Z2ggb3RoZXIKQEAgLTIwMzIsMTQgKzIwNDAsMTQgQEAKIFxpbmRleGlpe0Jvb2xlYW59e3ZhbHVlc30KIAogCi1cc3Vic3Vic2VjdGlvbntJbnRlcm5hbCBPYmplY3RzIFxsYWJlbHt0eXBlc2ludGVybmFsfX0KK1xzdWJzZWN0aW9ue0ludGVybmFsIE9iamVjdHMgXGxhYmVse3R5cGVzaW50ZXJuYWx9fQogCiBTZWUgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0gZm9yIHRoaXMKIGluZm9ybWF0aW9uLiAgSXQgZGVzY3JpYmVzIHN0YWNrIGZyYW1lIG9iamVjdHMsIHRyYWNlYmFjayBvYmplY3RzLCBhbmQKIHNsaWNlIG9iamVjdHMuCiAKIAotXHN1YnNlY3Rpb257U3BlY2lhbCBBdHRyaWJ1dGVzIFxsYWJlbHtzcGVjaWFsYXR0cnN9fQorXHNlY3Rpb257U3BlY2lhbCBBdHRyaWJ1dGVzIFxsYWJlbHtzcGVjaWFsYXR0cnN9fQogCiBUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWwKIG9iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSBub3QgcmVwb3J0ZWQKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RyaW5naW8udGV4IGIvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKaW5kZXggMzk5MmU0My4uMjQzMTI1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKKysrIGIvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKQEAgLTM3LDYgKzM3LDI0IEBACiBGcmVlIHRoZSBtZW1vcnkgYnVmZmVyLgogXGVuZHttZXRob2RkZXNjfQogCitFeGFtcGxlIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgU3RyaW5nSU8KKworb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorb3V0cHV0LndyaXRlKCdGaXJzdCBsaW5lLlxuJykKK3ByaW50ID4+b3V0cHV0LCAnU2Vjb25kIGxpbmUuJworCisjIFJldHJpZXZlIGZpbGUgY29udGVudHMgLS0gdGhpcyB3aWxsIGJlCisjICdGaXJzdCBsaW5lLlxuU2Vjb25kIGxpbmUuXG4nCitjb250ZW50cyA9IG91dHB1dC5nZXR2YWx1ZSgpCisKKyMgQ2xvc2Ugb2JqZWN0IGFuZCBkaXNjYXJkIG1lbW9yeSBidWZmZXIgLS0gCisjIC5nZXR2YWx1ZSgpIHdpbGwgbm93IHJhaXNlIGFuIGV4Y2VwdGlvbi4KK291dHB1dC5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCiAKIFxzZWN0aW9ue1xtb2R1bGV7Y1N0cmluZ0lPfSAtLS0KICAgICAgICAgIEZhc3RlciB2ZXJzaW9uIG9mIFxtb2R1bGV7U3RyaW5nSU99fQpAQCAtODIsMyArMTAwLDIyIEBACiAKIFRoZXJlIGlzIGEgQyBBUEkgdG8gdGhlIG1vZHVsZSBhcyB3ZWxsOyByZWZlciB0byB0aGUgbW9kdWxlIHNvdXJjZSBmb3IgCiBtb3JlIGluZm9ybWF0aW9uLgorCitFeGFtcGxlIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgY1N0cmluZ0lPCisKK291dHB1dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCitvdXRwdXQud3JpdGUoJ0ZpcnN0IGxpbmUuXG4nKQorcHJpbnQgPj5vdXRwdXQsICdTZWNvbmQgbGluZS4nCisKKyMgUmV0cmlldmUgZmlsZSBjb250ZW50cyAtLSB0aGlzIHdpbGwgYmUKKyMgJ0ZpcnN0IGxpbmUuXG5TZWNvbmQgbGluZS5cbicKK2NvbnRlbnRzID0gb3V0cHV0LmdldHZhbHVlKCkKKworIyBDbG9zZSBvYmplY3QgYW5kIGRpc2NhcmQgbWVtb3J5IGJ1ZmZlciAtLSAKKyMgLmdldHZhbHVlKCkgd2lsbCBub3cgcmFpc2UgYW4gZXhjZXB0aW9uLgorb3V0cHV0LmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXggYi9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CmluZGV4IGJkZTkyZWIuLjAzMDcyZjcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdWJwcm9jZXNzLnRleApAQCAtMTA3LDcgKzEwNyw3IEBACiAKIElmIFx2YXJ7dW5pdmVyc2FsX25ld2xpbmVzfSBpcyBcY29uc3RhbnR7VHJ1ZX0sIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0CiBhbmQgc3RkZXJyIGFyZSBvcGVuZWQgYXMgdGV4dCBmaWxlcywgYnV0IGxpbmVzIG1heSBiZSB0ZXJtaW5hdGVkIGJ5Ci1hbnkgb2YgXGNvZGV7J1xlIG4nfSwgdGhlIFVuaXggZW5kLW9mLWxpbmUgY29udmVudGlvbiwgXGNvZGV7J1xlIHInfSwKK2FueSBvZiBcY29kZXsnXGUgbid9LCB0aGUgXFVOSVh7fSBlbmQtb2YtbGluZSBjb252ZW50aW9uLCBcY29kZXsnXGUgcid9LAogdGhlIE1hY2ludG9zaCBjb252ZW50aW9uIG9yIFxjb2RleydcZSByXGUgbid9LCB0aGUgV2luZG93cyBjb252ZW50aW9uLgogQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcyBcY29kZXsnXGUgbid9IGJ5IHRoZQogUHl0aG9uIHByb2dyYW0uICBcbm90ZXtUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgaWYgUHl0aG9uIGlzIGJ1aWx0CkBAIC0xNDAsNyArMTQwLDcgQEAKIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gSWYgdGhlIGV4aXQKIGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZSBcZXhjZXB0aW9ue0NhbGxlZFByb2Nlc3NFcnJvci59CiBUaGUgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3J9IG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQotXG1lbWJlcntlcnJub30gYXR0cmlidXRlLgorXG1lbWJlcntyZXR1cm5jb2RlfSBhdHRyaWJ1dGUuCiAKIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgogCkBAIC0xNjQsOSArMTY0LDggQEAKIEEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aWxsIGJlIHJhaXNlZCBpZiBcY2xhc3N7UG9wZW59IGlzIGNhbGxlZAogd2l0aCBpbnZhbGlkIGFyZ3VtZW50cy4KIAotY2hlY2tfY2FsbCgpIHdpbGwgcmFpc2UgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3J9LCB3aGljaCBpcyBhCi1zdWJjbGFzcyBvZiBcZXhjZXB0aW9ue09TRXJyb3J9LCBpZiB0aGUgY2FsbGVkIHByb2Nlc3MgcmV0dXJucyBhCi1ub24temVybyByZXR1cm4gY29kZS4KK2NoZWNrX2NhbGwoKSB3aWxsIHJhaXNlIFxleGNlcHRpb257Q2FsbGVkUHJvY2Vzc0Vycm9yfSwgaWYgdGhlIGNhbGxlZAorcHJvY2VzcyByZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCiAKIAogXHN1YnN1YnNlY3Rpb257U2VjdXJpdHl9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN5cy50ZXggYi9Eb2MvbGliL2xpYnN5cy50ZXgKaW5kZXggNmI1Yjc1NS4uNzAyNDI3YSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzeXMudGV4CisrKyBiL0RvYy9saWIvbGlic3lzLnRleApAQCAtMjEsNyArMjEsNyBAQAogCiBcYmVnaW57ZGF0YWRlc2N9e2J5dGVvcmRlcn0KICAgQW4gaW5kaWNhdG9yIG9mIHRoZSBuYXRpdmUgYnl0ZSBvcmRlci4gIFRoaXMgd2lsbCBoYXZlIHRoZSB2YWx1ZQotICBcY29kZXsnYmlnJ30gb24gYmlnLWVuZGlhbiAobW9zdC1zaWduaWdpY2FudCBieXRlIGZpcnN0KSBwbGF0Zm9ybXMsCisgIFxjb2RleydiaWcnfSBvbiBiaWctZW5kaWFuIChtb3N0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QpIHBsYXRmb3JtcywKICAgYW5kIFxjb2RleydsaXR0bGUnfSBvbiBsaXR0bGUtZW5kaWFuIChsZWFzdC1zaWduaWZpY2FudCBieXRlIGZpcnN0KQogICBwbGF0Zm9ybXMuCiAgIFx2ZXJzaW9uYWRkZWR7Mi4wfQpAQCAtNDEsNyArNDEsNyBAQAogICBcY29kZXtJbmNsdWRlL3BhdGNobGV2ZWwuaH0gaWYgdGhlIGJyYW5jaCBpcyBhIHRhZy4gT3RoZXJ3aXNlLAogICBpdCBpcyBcY29kZXtOb25lfS4KICAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2RhdGFkZXNjfSAgCitcZW5ke2RhdGFkZXNjfQogCiBcYmVnaW57ZGF0YWRlc2N9e2J1aWx0aW5fbW9kdWxlX25hbWVzfQogICBBIHR1cGxlIG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBuYW1lcyBvZiBhbGwgbW9kdWxlcyB0aGF0IGFyZSBjb21waWxlZApAQCAtNTUsNiArNTUsMjMgQEAKICAgaW50ZXJwcmV0ZXIuCiBcZW5ke2RhdGFkZXNjfQogCitcYmVnaW57ZnVuY2Rlc2N9e19jdXJyZW50X2ZyYW1lc317fQorICBSZXR1cm4gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZWFjaCB0aHJlYWQncyBpZGVudGlmaWVyIHRvIHRoZSB0b3Btb3N0IHN0YWNrCisgIGZyYW1lIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhhdCB0aHJlYWQgYXQgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgTm90ZSB0aGF0IGZ1bmN0aW9ucyBpbiB0aGUgXHJlZm1vZHVsZXt0cmFjZWJhY2t9IG1vZHVsZSBjYW4gYnVpbGQgdGhlCisgIGNhbGwgc3RhY2sgZ2l2ZW4gc3VjaCBhIGZyYW1lLgorCisgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBkZWFkbG9jazogIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAgcmVxdWlyZSB0aGUgZGVhZGxvY2tlZCB0aHJlYWRzJyBjb29wZXJhdGlvbiwgYW5kIHN1Y2ggdGhyZWFkcycgY2FsbCBzdGFja3MKKyAgYXJlIGZyb3plbiBmb3IgYXMgbG9uZyBhcyB0aGV5IHJlbWFpbiBkZWFkbG9ja2VkLiAgVGhlIGZyYW1lIHJldHVybmVkCisgIGZvciBhIG5vbi1kZWFkbG9ja2VkIHRocmVhZCBtYXkgYmVhciBubyByZWxhdGlvbnNoaXAgdG8gdGhhdCB0aHJlYWQncworICBjdXJyZW50IGFjdGl2aXR5IGJ5IHRoZSB0aW1lIGNhbGxpbmcgY29kZSBleGFtaW5lcyB0aGUgZnJhbWUuCisKKyAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBmb3IgaW50ZXJuYWwgYW5kIHNwZWNpYWxpemVkIHB1cnBvc2VzCisgIG9ubHkuCisgIFx2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKwogXGJlZ2lue2RhdGFkZXNjfXtkbGxoYW5kbGV9CiAgIEludGVnZXIgc3BlY2lmeWluZyB0aGUgaGFuZGxlIG9mIHRoZSBQeXRob24gRExMLgogICBBdmFpbGFiaWxpdHk6IFdpbmRvd3MuCkBAIC0xNDIsNyArMTU5LDcgQEAKICAgZnVuY3Rpb24sIFxmdW5jdGlvbntleGNfaW5mbygpfSB3aWxsIHJldHVybiB0aHJlZSBcY29kZXtOb25lfSB2YWx1ZXMgdW50aWwKICAgYW5vdGhlciBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoZSBjdXJyZW50IHRocmVhZCBvciB0aGUgZXhlY3V0aW9uIHN0YWNrCiAgIHJldHVybnMgdG8gYSBmcmFtZSB3aGVyZSBhbm90aGVyIGV4Y2VwdGlvbiBpcyBiZWluZyBoYW5kbGVkLgotICAKKwogICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGluIG9ubHkgYSBmZXcgb2JzY3VyZSBzaXR1YXRpb25zLiAgVGhlc2UKICAgaW5jbHVkZSBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZyBzeXN0ZW1zIHRoYXQgcmVwb3J0IGluZm9ybWF0aW9uIG9uIHRoZQogICBsYXN0IG9yIGN1cnJlbnQgZXhjZXB0aW9uLiAgVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIHRyeSB0byBmcmVlCkBAIC0yNDEsMTQgKzI1OCwxNCBAQAogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbSBPbiBXaW5kb3dzIDl4LCB0aGUgZW5jb2RpbmcgaXMgYGBtYmNzJycuCiBcaXRlbSBPbiBNYWMgT1MgWCwgdGhlIGVuY29kaW5nIGlzIGBgdXRmLTgnJy4KLVxpdGVtIE9uIFVuaXgsIHRoZSBlbmNvZGluZyBpcyB0aGUgdXNlcidzIHByZWZlcmVuY2UgCi0gICAgICBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBubF9sYW5naW5mbyhDT0RFU0VUKSwgb3IgTm9uZSBpZgotICAgICAgdGhlIG5sX2xhbmdpbmZvKENPREVTRVQpIGZhaWxlZC4KK1xpdGVtIE9uIFxVTklYLCB0aGUgZW5jb2RpbmcgaXMgdGhlIHVzZXIncyBwcmVmZXJlbmNlCisgICAgICBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBubF9sYW5naW5mbyhDT0RFU0VUKSwgb3IgXGNvbnN0YW50e05vbmV9CisgICAgICBpZiB0aGUgXGNvZGV7bmxfbGFuZ2luZm8oQ09ERVNFVCl9IGZhaWxlZC4KIFxpdGVtIE9uIFdpbmRvd3MgTlQrLCBmaWxlIG5hbWVzIGFyZSBVbmljb2RlIG5hdGl2ZWx5LCBzbyBubyBjb252ZXJzaW9uCi0gICAgICBpcyBwZXJmb3JtZWQuIFxjb2Rle2dldGZpbGVzeXN0ZW1lbmNvZGluZ30gc3RpbGwgcmV0dXJucyBgYG1iY3MnJywKLSAgICAgIGFzIHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCB1c2Ugd2hlbiB0aGV5Ci0gICAgICBleHBsaWNpdGx5IHdhbnQgdG8gY29udmVydCBVbmljb2RlIHN0cmluZ3MgdG8gYnl0ZSBzdHJpbmdzIHRoYXQKLSAgICAgIGFyZSBlcXVpdmFsZW50IHdoZW4gdXNlZCBhcyBmaWxlIG5hbWVzLgorICAgICAgaXMgcGVyZm9ybWVkLiBcZnVuY3Rpb257Z2V0ZmlsZXN5c3RlbWVuY29kaW5nKCl9IHN0aWxsIHJldHVybnMKKyAgICAgIFxjb2RleydtYmNzJ30sIGFzIHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCB1c2UKKyAgICAgIHdoZW4gdGhleSBleHBsaWNpdGx5IHdhbnQgdG8gY29udmVydCBVbmljb2RlIHN0cmluZ3MgdG8gYnl0ZSBzdHJpbmdzCisgICAgICB0aGF0IGFyZSBlcXVpdmFsZW50IHdoZW4gdXNlZCBhcyBmaWxlIG5hbWVzLgogXGVuZHtpdGVtaXplfQogICBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7ZnVuY2Rlc2N9CkBAIC0yNzksOCArMjk2LDggQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Z2V0d2luZG93c3ZlcnNpb259e30KLSAgUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyBmaXZlIGNvbXBvbmVudHMsIGRlc2NyaWJpbmcgdGhlIFdpbmRvd3MgCi0gIHZlcnNpb24gY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgZWxlbWVudHMgYXJlIFx2YXJ7bWFqb3J9LCBcdmFye21pbm9yfSwgCisgIFJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgZml2ZSBjb21wb25lbnRzLCBkZXNjcmliaW5nIHRoZSBXaW5kb3dzCisgIHZlcnNpb24gY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgZWxlbWVudHMgYXJlIFx2YXJ7bWFqb3J9LCBcdmFye21pbm9yfSwKICAgXHZhcntidWlsZH0sIFx2YXJ7cGxhdGZvcm19LCBhbmQgXHZhcnt0ZXh0fS4gIFx2YXJ7dGV4dH0gY29udGFpbnMKICAgYSBzdHJpbmcgd2hpbGUgYWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZWdlcnMuCiAKQEAgLTQ5MSw3ICs1MDgsNyBAQAogICBiZSByZWdpc3RlcmVkIHVzaW5nIFxmdW5jdGlvbntzZXR0cmFjZSgpfSBmb3IgZWFjaCB0aHJlYWQgYmVpbmcKICAgZGVidWdnZWQuICBcbm90ZXtUaGUgXGZ1bmN0aW9ue3NldHRyYWNlKCl9IGZ1bmN0aW9uIGlzIGludGVuZGVkIG9ubHkKICAgZm9yIGltcGxlbWVudGluZyBkZWJ1Z2dlcnMsIHByb2ZpbGVycywgY292ZXJhZ2UgdG9vbHMgYW5kIHRoZSBsaWtlLgotICBJdHMgYmVoYXZpb3IgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0sIHJhdGhlciB0aGFuIAorICBJdHMgYmVoYXZpb3IgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0sIHJhdGhlciB0aGFuCiAgIHBhcnQgb2YgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24sIGFuZCB0aHVzIG1heSBub3QgYmUgYXZhaWxhYmxlIGluCiAgIGFsbCBQeXRob24gaW1wbGVtZW50YXRpb25zLn0KIFxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRleHR3cmFwLnRleCBiL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CmluZGV4IDlmYjA4MTYuLjM4ZjliMDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CisrKyBiL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CkBAIC00NywxMiArNDcsMTcgQEAKIGxlZnQgb2YgdGhlIHRleHQuCiAKIFxiZWdpbntmdW5jZGVzY317ZGVkZW50fXt0ZXh0fSAKLVJlbW92ZSBhbnkgd2hpdGVzcGFjZSB0aGF0IGNhbiBiZSB1bmlmb3JtbHkgcmVtb3ZlZCBmcm9tIHRoZSBsZWZ0Ci1vZiBldmVyeSBsaW5lIGluIFx2YXJ7dGV4dH0uCitSZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIFx2YXJ7dGV4dH0uCiAKLVRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoCi10aGUgbGVmdCBlZGdlIG9mIHNjcmVlbi93aGF0ZXZlciwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyBpdCBpbiB0aGUKLXNvdXJjZSBjb2RlIGluIGluZGVudGVkIGZvcm0uIAorVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBsaW5lIHVwIHdpdGggdGhlIGxlZnQKK2VkZ2Ugb2YgdGhlIGRpc3BsYXksIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgdGhlbSBpbiB0aGUgc291cmNlIGNvZGUKK2luIGluZGVudGVkIGZvcm0uCisKK05vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleSBhcmUKK25vdCBlcXVhbDogdGhlIGxpbmVzIFxjb2RleyIge30gaGVsbG8ifSBhbmQgXGNvZGV7Ilx0ZXh0YmFja3NsYXNoe310aGVsbG8ifQorYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLiAgKFRoaXMgYmVoYXZpb3VyIGlzCituZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkgZXhwYW5kZWQKK3RhYnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS4pCiAKIEZvciBleGFtcGxlOgogXGJlZ2lue3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aHJlYWQudGV4IGIvRG9jL2xpYi9saWJ0aHJlYWQudGV4CmluZGV4IDk1NzNhYjMuLmQwMDdlZWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGhyZWFkLnRleAorKysgYi9Eb2MvbGliL2xpYnRocmVhZC50ZXgKQEAgLTc0LDYgKzc0LDI2IEBACiBhbm90aGVyIHRocmVhZCBpcyBjcmVhdGVkLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzdGFja19zaXplfXtcb3B0aW9uYWx7c2l6ZX19CitSZXR1cm4gdGhlIHRocmVhZCBzdGFjayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGhyZWFkcy4gIFRoZQorb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHN0YWNrIHNpemUgdG8gYmUgdXNlZCBmb3IKK3N1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvcgorY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmtCKS4KK0lmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBcZXhjZXB0aW9ue1RocmVhZEVycm9yfQoraXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzdGFjayBzaXplIGlzIGludmFsaWQsIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQoraXMgcmFpc2VkIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrQiBpcyBjdXJyZW50bHkgdGhlIG1pbmltdW0KK3N1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZSBzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUKK2ludGVycHJldGVyIGl0c2VsZi4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBtYXkgaGF2ZSBwYXJ0aWN1bGFyCityZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvciB0aGUgc3RhY2sgc2l6ZSwgc3VjaCBhcyByZXF1aXJpbmcgYSBtaW5pbXVtCitzdGFjayBzaXplID4gMzJrQiBvciByZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbQorbWVtb3J5IHBhZ2Ugc2l6ZSAtIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvcgorbW9yZSBpbmZvcm1hdGlvbiAoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvcgordGhlIHN0YWNrIHNpemUgaXMgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlCitzcGVjaWZpYyBpbmZvcm1hdGlvbikuCitBdmFpbGFiaWxpdHk6IFdpbmRvd3MsIHN5c3RlbXMgd2l0aCBcUE9TSVh7fSB0aHJlYWRzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiAKIExvY2sgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4IGIvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4CmluZGV4IDhmYjMxMzcuLjAzMzQ3NTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleAorKysgYi9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXgKQEAgLTEyNSw2ICsxMjUsMjYgQEAKIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzdGFja19zaXplfXtcb3B0aW9uYWx7c2l6ZX19CitSZXR1cm4gdGhlIHRocmVhZCBzdGFjayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGhyZWFkcy4gIFRoZQorb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHN0YWNrIHNpemUgdG8gYmUgdXNlZCBmb3IKK3N1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvcgorY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmtCKS4KK0lmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBcZXhjZXB0aW9ue1RocmVhZEVycm9yfQoraXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzdGFjayBzaXplIGlzIGludmFsaWQsIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQoraXMgcmFpc2VkIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrQiBpcyBjdXJyZW50bHkgdGhlIG1pbmltdW0KK3N1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZSBzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUKK2ludGVycHJldGVyIGl0c2VsZi4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBtYXkgaGF2ZSBwYXJ0aWN1bGFyCityZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvciB0aGUgc3RhY2sgc2l6ZSwgc3VjaCBhcyByZXF1aXJpbmcgYSBtaW5pbXVtCitzdGFjayBzaXplID4gMzJrQiBvciByZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbQorbWVtb3J5IHBhZ2Ugc2l6ZSAtIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvcgorbW9yZSBpbmZvcm1hdGlvbiAoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvcgordGhlIHN0YWNrIHNpemUgaXMgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlCitzcGVjaWZpYyBpbmZvcm1hdGlvbikuCitBdmFpbGFiaWxpdHk6IFdpbmRvd3MsIHN5c3RlbXMgd2l0aCBcUE9TSVh7fSB0aHJlYWRzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiBEZXRhaWxlZCBpbnRlcmZhY2VzIGZvciB0aGUgb2JqZWN0cyBhcmUgZG9jdW1lbnRlZCBiZWxvdy4gIAogCiBUaGUgZGVzaWduIG9mIHRoaXMgbW9kdWxlIGlzIGxvb3NlbHkgYmFzZWQgb24gSmF2YSdzIHRocmVhZGluZyBtb2RlbC4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGltZS50ZXggYi9Eb2MvbGliL2xpYnRpbWUudGV4CmluZGV4IGIzOWI2NTAuLmY0MDgzOGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGltZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0aW1lLnRleApAQCAtMjI2LDYgKzIyNiw4IEBACiBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3R9IHRvIGJlIG9taXR0ZWRdezIuMX0KIFx2ZXJzaW9uY2hhbmdlZFtcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHJhaXNlZCBpZiBhIGZpZWxkIGluIFx2YXJ7dH0gaXMKIG91dCBvZiByYW5nZV17Mi40fQorXHZlcnNpb25jaGFuZ2VkWzAgaXMgbm93IGEgbGVnYWwgYXJndW1lbnQgZm9yIGFueSBwb3NpdGlvbiBpbiB0aGUgdGltZSB0dXBsZTsKK2lmIGl0IGlzIG5vcm1hbGx5IGlsbGVnYWwgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBhIGNvcnJlY3Qgb25lLl17Mi41fQogCiAKIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcuCkBAIC00MjUsNyArNDI3LDcgQEAKICcxNjowODoxMiAwNS8wOC8wMyBBRVNUJwogXGVuZHt2ZXJiYXRpbX0KIAotT24gbWFueSBVbml4IHN5c3RlbXMgKGluY2x1ZGluZyAqQlNELCBMaW51eCwgU29sYXJpcywgYW5kIERhcndpbiksIGl0CitPbiBtYW55IFxVTklYe30gc3lzdGVtcyAoaW5jbHVkaW5nICpCU0QsIExpbnV4LCBTb2xhcmlzLCBhbmQgRGFyd2luKSwgaXQKIGlzIG1vcmUgY29udmVuaWVudCB0byB1c2UgdGhlIHN5c3RlbSdzIHpvbmVpbmZvIChcbWFucGFnZXt0emZpbGV9ezV9KSAKIGRhdGFiYXNlIHRvIHNwZWNpZnkgdGhlIHRpbWV6b25lIHJ1bGVzLiBUbyBkbyB0aGlzLCBzZXQgdGhlIAogXGVudnZhcntUWn0gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIHBhdGggb2YgdGhlIHJlcXVpcmVkIHRpbWV6b25lIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0dXJ0bGUudGV4IGIvRG9jL2xpYi9saWJ0dXJ0bGUudGV4CmluZGV4IDYzOGJjMDcuLjYxNjFjZDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidHVydGxlLnRleAorKysgYi9Eb2MvbGliL2xpYnR1cnRsZS50ZXgKQEAgLTI3LDYgKzI3LDQ1IEBACiBTZXQgYW5nbGUgbWVhc3VyZW1lbnQgdW5pdHMgdG8gcmFkaWFucy4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317c2V0dXB9eyoqa3dhcmdzfQorU2V0cyB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIG1haW4gd2luZG93LiAgS2V5d29yZHMgYXJlOgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIFxjb2Rle3dpZHRofTogZWl0aGVyIGEgc2l6ZSBpbiBwaXhlbHMgb3IgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgorICAgVGhlIGRlZmF1bHQgaXMgNTBcJSBvZiB0aGUgc2NyZWVuLgorICBcaXRlbSBcY29kZXtoZWlnaHR9OiBlaXRoZXIgYSBzaXplIGluIHBpeGVscyBvciBhIGZyYWN0aW9uIG9mIHRoZSBzY3JlZW4uCisgICBUaGUgZGVmYXVsdCBpcyA1MFwlIG9mIHRoZSBzY3JlZW4uCisgIFxpdGVtIFxjb2Rle3N0YXJ0eH06IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2UKKyAgICAgIG9mIHRoZSBzY3JlZW4uIFxjb2Rle05vbmV9IGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCAKKyAgICAgIGNlbnRlcnMgdGhlIHdpbmRvdyBob3Jpem9udGFsbHkgb24gc2NyZWVuLgorICBcaXRlbSBcY29kZXtzdGFydHl9OiBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIGVkZ2UKKyAgICAgIG9mIHRoZSBzY3JlZW4uIFxjb2Rle05vbmV9IGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCAKKyAgICAgIGNlbnRlcnMgdGhlIHdpbmRvdyB2ZXJ0aWNhbGx5IG9uIHNjcmVlbi4KK1xlbmR7aXRlbWl6ZX0KKworICAgRXhhbXBsZXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyMgVXNlcyBkZWZhdWx0IGdlb21ldHJ5OiA1MCUgeCA1MCUgb2Ygc2NyZWVuLCBjZW50ZXJlZC4KK3NldHVwKCkgIAorCisjIFNldHMgd2luZG93IHRvIDIwMHgyMDAgcGl4ZWxzLCBpbiB1cHBlciBsZWZ0IG9mIHNjcmVlbgorc2V0dXAgKHdpZHRoPTIwMCwgaGVpZ2h0PTIwMCwgc3RhcnR4PTAsIHN0YXJ0eT0wKQorCisjIFNldHMgd2luZG93IHRvIDc1JSBvZiBzY3JlZW4gYnkgNTAlIG9mIHNjcmVlbiwgYW5kIGNlbnRlcnMgaXQuCitzZXR1cCh3aWR0aD0uNzUsIGhlaWdodD0wLjUsIHN0YXJ0eD1Ob25lLCBzdGFydHk9Tm9uZSkKK1xlbmR7dmVyYmF0aW19CisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317dGl0bGV9e3RpdGxlX3N0cn0KK1NldCB0aGUgd2luZG93J3MgdGl0bGUgdG8gXHZhcnt0aXRsZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2RvbmV9e30KK0VudGVycyB0aGUgVGsgbWFpbiBsb29wLiAgVGhlIHdpbmRvdyB3aWxsIGNvbnRpbnVlIHRvIAorYmUgZGlzcGxheWVkIHVudGlsIHRoZSB1c2VyIGNsb3NlcyBpdCBvciB0aGUgcHJvY2VzcyBpcyBraWxsZWQuCitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e3Jlc2V0fXt9CiBDbGVhciB0aGUgc2NyZWVuLCByZS1jZW50ZXIgdGhlIHBlbiwgYW5kIHNldCB2YXJpYWJsZXMgdG8gdGhlIGRlZmF1bHQKIHZhbHVlcy4KQEAgLTQyLDYgKzgxLDE5IEBACiBsaW5lLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzcGVlZH17c3BlZWR9CitTZXQgdGhlIHNwZWVkIG9mIHRoZSB0dXJ0bGUuIFZhbGlkIHZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcgorXHZhcntzcGVlZH0gYXJlIFxjb2RleydmYXN0ZXN0J30gKG5vIGRlbGF5KSwgXGNvZGV7J2Zhc3QnfSwKKyhkZWxheSA1bXMpLCBcY29kZXsnbm9ybWFsJ30gKGRlbGF5IDEwbXMpLCBcY29kZXsnc2xvdyd9CisoZGVsYXkgMTVtcyksIGFuZCBcY29kZXsnc2xvd2VzdCd9IChkZWxheSAyMG1zKS4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtkZWxheX17ZGVsYXl9CitTZXQgdGhlIHNwZWVkIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcntkZWxheX0sIHdoaWNoIGlzIGdpdmVuCitpbiBtcy4gXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e2ZvcndhcmR9e2Rpc3RhbmNlfQogR28gZm9yd2FyZCBcdmFye2Rpc3RhbmNlfSBzdGVwcy4KIFxlbmR7ZnVuY2Rlc2N9CkBAIC05NCw2ICsxNDYsMTggQEAKIGFuZCBjYWxsIFxjb2Rle2ZpbGwoMCl9IHdoZW4geW91IGZpbmlzaCB0byBkcmF3IHRoZSBwYXRoLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtiZWdpblxfZmlsbH17fQorU3dpdGNoIHR1cnRsZSBpbnRvIGZpbGxpbmcgbW9kZTsgCitNdXN0IGV2ZW50dWFsbHkgYmUgZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIGVuZF9maWxsKCkgY2FsbC4KK090aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317ZW5kXF9maWxsfXt9CitFbmQgZmlsbGluZyBtb2RlLCBhbmQgZmlsbCB0aGUgc2hhcGU7IGVxdWl2YWxlbnQgdG8gXGNvZGV7ZmlsbCgwKX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxiZWdpbntmdW5jZGVzY317Y2lyY2xlfXtyYWRpdXNcb3B0aW9uYWx7LCBleHRlbnR9fQogRHJhdyBhIGNpcmNsZSB3aXRoIHJhZGl1cyBcdmFye3JhZGl1c30gd2hvc2UgY2VudGVyLXBvaW50IGlzCiBcdmFye3JhZGl1c30gdW5pdHMgbGVmdCBvZiB0aGUgdHVydGxlLgpAQCAtMTEzLDYgKzE3Nyw0OSBAQAogc3BlY2lmaWVkIGVpdGhlciBhcyB0d28gc2VwYXJhdGUgYXJndW1lbnRzIG9yIGFzIGEgMi10dXBsZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317dG93YXJkc317eCwgeX0KK1JldHVybiB0aGUgYW5nbGUgb2YgdGhlIGxpbmUgZnJvbSB0aGUgdHVydGxlJ3MgcG9zaXRpb24KK3RvIHRoZSBwb2ludCBcdmFye3h9LCBcdmFye3l9LiBUaGUgY28tb3JkaW5hdGVzIG1heSBiZQorc3BlY2lmaWVkIGVpdGhlciBhcyB0d28gc2VwYXJhdGUgYXJndW1lbnRzLCBhcyBhIDItdHVwbGUsCitvciBhcyBhbm90aGVyIHBlbiBvYmplY3QuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317aGVhZGluZ317fQorUmV0dXJuIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUuCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0aGVhZGluZ317YW5nbGV9CitTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcnthbmdsZX0uCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317cG9zaXRpb259e30KK1JldHVybiB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgdHVydGxlIGFzIGFuIFxjb2Rleyh4LHkpfSBwYWlyLgorXHZlcnNpb25hZGRlZHsyLjN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3NldHh9e3h9CitTZXQgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdHVydGxlIHRvIFx2YXJ7eH0uCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0eX17eX0KK1NldCB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcnt5fS4KK1x2ZXJzaW9uYWRkZWR7Mi4zfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt3aW5kb3dcX3dpZHRofXt9CitSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBjYW52YXMgd2luZG93LgorXHZlcnNpb25hZGRlZHsyLjN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3dpbmRvd1xfaGVpZ2h0fXt9CitSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgY2FudmFzIHdpbmRvdy4KK1x2ZXJzaW9uYWRkZWR7Mi4zfQorXGVuZHtmdW5jZGVzY30KKwogVGhpcyBtb2R1bGUgYWxzbyBkb2VzIFxjb2Rle2Zyb20gbWF0aCBpbXBvcnQgKn0sIHNvIHNlZSB0aGUKIGRvY3VtZW50YXRpb24gZm9yIHRoZSBccmVmbW9kdWxle21hdGh9IG1vZHVsZSBmb3IgYWRkaXRpb25hbCBjb25zdGFudHMKIGFuZCBmdW5jdGlvbnMgdXNlZnVsIGZvciB0dXJ0bGUgZ3JhcGhpY3MuCkBAIC0xMzQsMTkgKzI0MSwyNSBAQAogcGVuLiBUaGUgY29uc3RydWN0b3IgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgY2FudmFzIGRvIGJlIGRyYXduIG9uLgogXGVuZHtjbGFzc2Rlc2N9CiAKK1xiZWdpbntjbGFzc2Rlc2N9e1R1cnRsZX17fQorRGVmaW5lIGEgcGVuLiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgc3lub255bSBmb3IgXGNvZGV7UGVuKCl9OworXGNsYXNze1R1cnRsZX0gaXMgYW4gZW1wdHkgc3ViY2xhc3Mgb2YgXGNsYXNze1Blbn0uCitcZW5ke2NsYXNzZGVzY30KKwogXGJlZ2lue2NsYXNzZGVzY317UmF3UGVufXtjYW52YXN9CiBEZWZpbmUgYSBwZW4gd2hpY2ggZHJhd3Mgb24gYSBjYW52YXMgXHZhcntjYW52YXN9LiBUaGlzIGlzIHVzZWZ1bCBpZiAKIHlvdSB3YW50IHRvIHVzZSB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBncmFwaGljcyBpbiBhIGBgcmVhbCcnIHByb2dyYW0uCiBcZW5ke2NsYXNzZGVzY30KIAotXHN1YnNlY3Rpb257UGVuIGFuZCBSYXdQZW4gT2JqZWN0cyBcbGFiZWx7cGVuLXJhd3Blbi1vYmplY3RzfX0KK1xzdWJzZWN0aW9ue1R1cnRsZSwgUGVuIGFuZCBSYXdQZW4gT2JqZWN0cyBcbGFiZWx7cGVuLXJhd3Blbi1vYmplY3RzfX0KIAotXGNsYXNze1Blbn0gYW5kIFxjbGFzc3tSYXdQZW59IG9iamVjdHMgaGF2ZSBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMKLWRlc2NyaWJlZCBhYm92ZSwgZXhjZXB0IGZvciBcZnVuY3Rpb257ZGVtbygpfSBhcyBtZXRob2RzLCB3aGljaAotbWFuaXB1bGF0ZSB0aGUgZ2l2ZW4gcGVuLgorTW9zdCBvZiB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIG1vZHVsZSBhcmUgYWxzbworYXZhaWxhYmxlIGFzIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tUdXJ0bGV9LCBcY2xhc3N7UGVufSBhbmQKK1xjbGFzc3tSYXdQZW59IGNsYXNzZXMsIGFmZmVjdGluZyBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcGVuLgogCiBUaGUgb25seSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBwb3dlcmZ1bCBhcyBhIG1ldGhvZCBpcwotXGZ1bmN0aW9ue2RlZ3JlZXMoKX0uCitcZnVuY3Rpb257ZGVncmVlcygpfSwgd2hpY2ggdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgbGV0dGluZyAKK3lvdSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdW5pdHMgY29ycmVzcG9uZGluZyB0byBhIGZ1bGwgY2lyY2xlOgogCiBcYmVnaW57bWV0aG9kZGVzY317ZGVncmVlc317XG9wdGlvbmFse2Z1bGxjaXJjbGV9fQogXHZhcntmdWxsY2lyY2xlfSBpcyBieSBkZWZhdWx0IDM2MC4gVGhpcyBjYW4gY2F1c2UgdGhlIHBlbiB0byBoYXZlIGFueQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnR5cGVzLnRleAppbmRleCBmOGY1NTdkLi5jODBhODdhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYnR5cGVzLnRleApAQCAtMTc2LDYgKzE3NiwzMCBAQAogXGZ1bmN0aW9ue2J1ZmZlcigpfVxiaWZ1bmNpbmRleHtidWZmZXJ9IGZ1bmN0aW9uLgogXGVuZHtkYXRhZGVzY30KIAorXGJlZ2lue2RhdGFkZXNjfXtEaWN0UHJveHlUeXBlfQorVGhlIHR5cGUgb2YgZGljdCBwcm94aWVzLCBzdWNoIGFzIFxjb2Rle1R5cGVUeXBlLl9fZGljdF9ffS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317Tm90SW1wbGVtZW50ZWRUeXBlfQorVGhlIHR5cGUgb2YgXGNvZGV7Tm90SW1wbGVtZW50ZWR9CitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e0dldFNldERlc2NyaXB0b3JUeXBlfQorVGhlIHR5cGUgb2Ygb2JqZWN0cyBkZWZpbmVkIGluIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggXGNvZGV7UHlHZXRTZXREZWZ9LCBzdWNoCithcyBcY29kZXtGcmFtZVR5cGUuZl9sb2NhbHN9IG9yIFxjb2Rle2FycmF5LmFycmF5LnR5cGVjb2RlfS4gIFRoaXMgY29uc3RhbnQgaXMKK25vdCBkZWZpbmVkIGluIGltcGxlbWVudGF0aW9ucyBvZiBQeXRob24gdGhhdCBkbyBub3QgaGF2ZSBzdWNoIGV4dGVuc2lvbgordHlwZXMsIHNvIGZvciBwb3J0YWJsZSBjb2RlIHVzZSBcY29kZXtoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TWVtYmVyRGVzY3JpcHRvclR5cGV9CitUaGUgdHlwZSBvZiBvYmplY3RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcY29kZXtQeU1lbWJlckRlZn0sIHN1Y2gKK2FzIFxjb2RlIHtkYXRldGltZS50aW1lZGVsdGEuZGF5c30uICBUaGlzIGNvbnN0YW50IGlzIG5vdCBkZWZpbmVkIGluCitpbXBsZW1lbnRhdGlvbnMgb2YgUHl0aG9uIHRoYXQgZG8gbm90IGhhdmUgc3VjaCBleHRlbnNpb24gdHlwZXMsIHNvIGZvcgorcG9ydGFibGUgY29kZSB1c2UgXGNvZGV7aGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyl9LgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2RhdGFkZXNjfQorCiBcYmVnaW57ZGF0YWRlc2N9e1N0cmluZ1R5cGVzfQogQSBzZXF1ZW5jZSBjb250YWluaW5nIFxjb2Rle1N0cmluZ1R5cGV9IGFuZCBcY29kZXtVbmljb2RlVHlwZX0gdXNlZCB0bwogZmFjaWxpdGF0ZSBlYXNpZXIgY2hlY2tpbmcgZm9yIGFueSBzdHJpbmcgb2JqZWN0LiAgVXNpbmcgdGhpcyBpcyBtb3JlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuZG9jLnRleCBiL0RvYy9saWIvbGlidW5kb2MudGV4CmluZGV4IGRmNzgxNTIuLmU3ZDM4OGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5kb2MudGV4CisrKyBiL0RvYy9saWIvbGlidW5kb2MudGV4CkBAIC00OSw3ICs0OSw3IEBACiAKIFxpdGVtW1xtb2R1bGV7YnNkZGIxODV9XQogLS0tIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZHVsZSBmb3Igc3lzdGVtcyB3aGljaCBzdGlsbCB1c2UgdGhlIEJlcmtlbGV5Ci0gICAgREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBVbml4LWJhc2VkCisgICAgREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBcVU5JWC1iYXNlZAogICAgIHN5c3RlbXMuICBJdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidW5pY29kZWRhdGEudGV4IGIvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKaW5kZXggZGNiZGE3Ny4uNDM1NDY2YSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKKysrIGIvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKQEAgLTE0LDExICsxNCwxMSBAQAogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSB3aGljaAogZGVmaW5lcyBjaGFyYWN0ZXIgcHJvcGVydGllcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycy4gVGhlIGRhdGEgaW4KIHRoaXMgZGF0YWJhc2UgaXMgYmFzZWQgb24gdGhlIFxmaWxle1VuaWNvZGVEYXRhLnR4dH0gZmlsZSB2ZXJzaW9uCi00LjEuMCB3aGljaCBpcyBwdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIFx1cmx7ZnRwOi8vZnRwLnVuaWNvZGUub3JnL30uCis0LjEuMCB3aGljaCBpcyBwdWJsaWNseSBhdmFpbGFibGUgZnJvbSBcdXJse2Z0cDovL2Z0cC51bmljb2RlLm9yZy99LgogCiBUaGUgbW9kdWxlIHVzZXMgdGhlIHNhbWUgbmFtZXMgYW5kIHN5bWJvbHMgYXMgZGVmaW5lZCBieSB0aGUKIFVuaWNvZGVEYXRhIEZpbGUgRm9ybWF0IDQuMS4wIChzZWUKLVx1cmx7aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvNC4xLVVwZGF0ZS9Vbmljb2RlRGF0YS00LjEuMC5odG1sfSkuICBJdAorXHVybHtodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy80LjEuMC91Y2QvVUNELmh0bWx9KS4gIEl0CiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCiBcYmVnaW57ZnVuY2Rlc2N9e2xvb2t1cH17bmFtZX0KQEAgLTEwOCw3ICsxMDgsNyBAQAogTm9ybWFsIGZvcm0gQyAoTkZDKSBmaXJzdCBhcHBsaWVzIGEgY2Fub25pY2FsIGRlY29tcG9zaXRpb24sIHRoZW4KIGNvbXBvc2VzIHByZS1jb21iaW5lZCBjaGFyYWN0ZXJzIGFnYWluLgogCi1JbiBhZGRpdGlvbiB0byB0aGVzZSB0d28gZm9ybXMsIHRoZXJlIHR3byBhZGRpdGlvbmFsIG5vcm1hbCBmb3JtcworSW4gYWRkaXRpb24gdG8gdGhlc2UgdHdvIGZvcm1zLCB0aGVyZSBhcmUgdHdvIGFkZGl0aW9uYWwgbm9ybWFsIGZvcm1zCiBiYXNlZCBvbiBjb21wYXRpYmlsaXR5IGVxdWl2YWxlbmNlLiBJbiBVbmljb2RlLCBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlCiBzdXBwb3J0ZWQgd2hpY2ggbm9ybWFsbHkgd291bGQgYmUgdW5pZmllZCB3aXRoIG90aGVyIGNoYXJhY3RlcnMuIEZvcgogZXhhbXBsZSwgVSsyMTYwIChST01BTiBOVU1FUkFMIE9ORSkgaXMgcmVhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIFUrMDA0OQpAQCAtMTM5LDMgKzEzOSwyMiBAQAogCiBcdmVyc2lvbmFkZGVkezIuNX0KIFxlbmR7ZGF0YWRlc2N9CisKK0V4YW1wbGVzOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gdW5pY29kZWRhdGEubG9va3VwKCdMRUZUIENVUkxZIEJSQUNLRVQnKQordSd7JworPj4+IHVuaWNvZGVkYXRhLm5hbWUodScvJykKKydTT0xJRFVTJworPj4+IHVuaWNvZGVkYXRhLmRlY2ltYWwodSc5JykKKzkKKz4+PiB1bmljb2RlZGF0YS5kZWNpbWFsKHUnYScpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KK1ZhbHVlRXJyb3I6IG5vdCBhIGRlY2ltYWwKKz4+PiB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKSAgIyAnTCdldHRlciwgJ3UncHBlcmNhc2UKKydMdScgICAKKz4+PiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKHUnXHUwNjYwJykgIyAnQSdyYWJpYywgJ04ndW1iZXIKKydBTicKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuaXR0ZXN0LnRleCBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CmluZGV4IDUxYjMyMWUuLmY0MDQ5M2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CisrKyBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CkBAIC0xMCwxOSArMTAsMTkgQEAKIAogXHZlcnNpb25hZGRlZHsyLjF9CiAKLVRoZSBQeXRob24gdW5pdCB0ZXN0aW5nIGZyYW1ld29yaywgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYGBQeVVuaXQsJycgaXMKK1RoZSBQeXRob24gdW5pdCB0ZXN0aW5nIGZyYW1ld29yaywgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGBgUHlVbml0LCcnIGlzCiBhIFB5dGhvbiBsYW5ndWFnZSB2ZXJzaW9uIG9mIEpVbml0LCBieSBLZW50IEJlY2sgYW5kIEVyaWNoIEdhbW1hLgogSlVuaXQgaXMsIGluIHR1cm4sIGEgSmF2YSB2ZXJzaW9uIG9mIEtlbnQncyBTbWFsbHRhbGsgdGVzdGluZwogZnJhbWV3b3JrLiAgRWFjaCBpcyB0aGUgZGUgZmFjdG8gc3RhbmRhcmQgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBmb3IKIGl0cyByZXNwZWN0aXZlIGxhbmd1YWdlLgogCi1QeVVuaXQgc3VwcG9ydHMgdGVzdCBhdXRvbWF0aW9uLCBzaGFyaW5nIG9mIHNldHVwIGFuZCBzaHV0ZG93biBjb2RlCi1mb3IgdGVzdHMsIGFnZ3JlZ2F0aW9uIG9mIHRlc3RzIGludG8gY29sbGVjdGlvbnMsIGFuZCBpbmRlcGVuZGVuY2Ugb2YKK1xtb2R1bGV7dW5pdHRlc3R9IHN1cHBvcnRzIHRlc3QgYXV0b21hdGlvbiwgc2hhcmluZyBvZiBzZXR1cCBhbmQgc2h1dGRvd24KK2NvZGUgZm9yIHRlc3RzLCBhZ2dyZWdhdGlvbiBvZiB0ZXN0cyBpbnRvIGNvbGxlY3Rpb25zLCBhbmQgaW5kZXBlbmRlbmNlIG9mCiB0aGUgdGVzdHMgZnJvbSB0aGUgcmVwb3J0aW5nIGZyYW1ld29yay4gIFRoZSBcbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUKIHByb3ZpZGVzIGNsYXNzZXMgdGhhdCBtYWtlIGl0IGVhc3kgdG8gc3VwcG9ydCB0aGVzZSBxdWFsaXRpZXMgZm9yIGEKIHNldCBvZiB0ZXN0cy4KIAotVG8gYWNoaWV2ZSB0aGlzLCBQeVVuaXQgc3VwcG9ydHMgc29tZSBpbXBvcnRhbnQgY29uY2VwdHM6CitUbyBhY2hpZXZlIHRoaXMsIFxtb2R1bGV7dW5pdHRlc3R9IHN1cHBvcnRzIHNvbWUgaW1wb3J0YW50IGNvbmNlcHRzOgogCiBcYmVnaW57ZGVmaW5pdGlvbnN9CiBcdGVybXt0ZXN0IGZpeHR1cmV9CkBAIC0zMywxMCArMzMsOSBAQAogCiBcdGVybXt0ZXN0IGNhc2V9CiBBIFxkZm57dGVzdCBjYXNlfSBpcyB0aGUgc21hbGxlc3QgdW5pdCBvZiB0ZXN0aW5nLiAgSXQgY2hlY2tzIGZvciBhCi1zcGVjaWZpYyByZXNwb25zZSB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIGlucHV0cy4gIFB5VW5pdCBwcm92aWRlcyBhCi1iYXNlIGNsYXNzLCBcY2xhc3N7VGVzdENhc2V9LCB3aGljaCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgbmV3IHRlc3QKLWNhc2VzLiBZb3UgbWF5IHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBzdWJjbGFzcwotZnJvbSBcY2xhc3N7VGVzdENhc2V9LCBvZiBjb3Vyc2UuCitzcGVjaWZpYyByZXNwb25zZSB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIGlucHV0cy4gIFxtb2R1bGV7dW5pdHRlc3R9Citwcm92aWRlcyBhIGJhc2UgY2xhc3MsIFxjbGFzc3tUZXN0Q2FzZX0sIHdoaWNoIG1heSBiZSB1c2VkIHRvIGNyZWF0ZQorbmV3IHRlc3QgY2FzZXMuCiAKIFx0ZXJte3Rlc3Qgc3VpdGV9CiBBIFxkZm57dGVzdCBzdWl0ZX0gaXMgYSBjb2xsZWN0aW9uIG9mIHRlc3QgY2FzZXMsIHRlc3Qgc3VpdGVzLCBvcgpAQCAtNTQsOCArNTMsOCBAQAogVGhlIHRlc3QgY2FzZSBhbmQgdGVzdCBmaXh0dXJlIGNvbmNlcHRzIGFyZSBzdXBwb3J0ZWQgdGhyb3VnaCB0aGUKIFxjbGFzc3tUZXN0Q2FzZX0gYW5kIFxjbGFzc3tGdW5jdGlvblRlc3RDYXNlfSBjbGFzc2VzOyB0aGUgZm9ybWVyCiBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB0ZXN0cywgYW5kIHRoZSBsYXR0ZXIgY2FuIGJlIHVzZWQgd2hlbgotaW50ZWdyYXRpbmcgZXhpc3RpbmcgdGVzdCBjb2RlIHdpdGggYSBQeVVuaXQtZHJpdmVuIGZyYW1ld29yay4gIFdoZW4KLWJ1aWxkaW5nIHRlc3QgZml4dHVyZXMgdXNpbmcgXGNsYXNze1Rlc3RDYXNlfSwgdGhlIFxtZXRob2R7c2V0VXAoKX0KK2ludGVncmF0aW5nIGV4aXN0aW5nIHRlc3QgY29kZSB3aXRoIGEgXG1vZHVsZXt1bml0dGVzdH0tZHJpdmVuIGZyYW1ld29yay4KK1doZW4gYnVpbGRpbmcgdGVzdCBmaXh0dXJlcyB1c2luZyBcY2xhc3N7VGVzdENhc2V9LCB0aGUgXG1ldGhvZHtzZXRVcCgpfQogYW5kIFxtZXRob2R7dGVhckRvd24oKX0gbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlCiBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmb3IgdGhlIGZpeHR1cmUuICBXaXRoCiBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0sIGV4aXN0aW5nIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHRoZQpAQCAtNzQsMTkgKzczLDE3IEBACiBBIHRlc3QgcnVubmVyIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlIG1ldGhvZCwKIFxtZXRob2R7cnVuKCl9LCB3aGljaCBhY2NlcHRzIGEgXGNsYXNze1Rlc3RDYXNlfSBvciBcY2xhc3N7VGVzdFN1aXRlfQogb2JqZWN0IGFzIGEgcGFyYW1ldGVyLCBhbmQgcmV0dXJucyBhIHJlc3VsdCBvYmplY3QuICBUaGUgY2xhc3MKLVxjbGFzc3tUZXN0UmVzdWx0fSBpcyBwcm92aWRlZCBmb3IgdXNlIGFzIHRoZSByZXN1bHQgb2JqZWN0LiAgUHlVbml0Ci1wcm92aWRlIHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGFzIGFuIGV4YW1wbGUgdGVzdCBydW5uZXIgd2hpY2gKLXJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYnkgZGVmYXVsdC4KLUFsdGVybmF0ZSBydW5uZXJzIGNhbiBiZSBpbXBsZW1lbnRlZCBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIChzdWNoIGFzCi1ncmFwaGljYWwgZW52aXJvbm1lbnRzKSB3aXRob3V0IGFueSBuZWVkIHRvIGRlcml2ZSBmcm9tIGEgc3BlY2lmaWMKLWNsYXNzLgorXGNsYXNze1Rlc3RSZXN1bHR9IGlzIHByb3ZpZGVkIGZvciB1c2UgYXMgdGhlIHJlc3VsdCBvYmplY3QuCitcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyB0aGUgXGNsYXNze1RleHRUZXN0UnVubmVyfSBhcyBhbiBleGFtcGxlCit0ZXN0IHJ1bm5lciB3aGljaCByZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGJ5CitkZWZhdWx0LiAgQWx0ZXJuYXRlIHJ1bm5lcnMgY2FuIGJlIGltcGxlbWVudGVkIGZvciBvdGhlciBlbnZpcm9ubWVudHMKKyhzdWNoIGFzIGdyYXBoaWNhbCBlbnZpcm9ubWVudHMpIHdpdGhvdXQgYW55IG5lZWQgdG8gZGVyaXZlIGZyb20gYQorc3BlY2lmaWMgY2xhc3MuCiAKIAogXGJlZ2lue3NlZWFsc299CiAgIFxzZWVtb2R1bGV7ZG9jdGVzdH17QW5vdGhlciB0ZXN0LXN1cHBvcnQgbW9kdWxlIHdpdGggYSB2ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYXZvci59Ci0gIFxzZWV0aXRsZVtodHRwOi8vcHl1bml0LnNvdXJjZWZvcmdlLm5ldC9de1B5VW5pdCBXZWIgU2l0ZX17VGhlCi0gICAgICAgICAgICBzb3VyY2UgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gUHlVbml0Ln0KICAgXHNlZXRpdGxlW2h0dHA6Ly93d3cuWFByb2dyYW1taW5nLmNvbS90ZXN0ZnJhbS5odG1de1NpbXBsZSBTbWFsbHRhbGsKICAgICAgICAgICAgIFRlc3Rpbmc6IFdpdGggUGF0dGVybnN9e0tlbnQgQmVjaydzIG9yaWdpbmFsIHBhcGVyIG9uCiAgICAgICAgICAgICB0ZXN0aW5nIGZyYW1ld29ya3MgdXNpbmcgdGhlIHBhdHRlcm4gc2hhcmVkIGJ5CkBAIC0xNjYsNyArMTYzLDcgQEAKIHdpdGg6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLXN1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRlc3RTZXF1ZW5jZUZ1bmN0aW9ucykKK3N1aXRlID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0U2VxdWVuY2VGdW5jdGlvbnMpCiB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikucnVuKHN1aXRlKQogXGVuZHt2ZXJiYXRpbX0KIApAQCAtMTk0LDggKzE5MSw4IEBACiAKIFRoZSBiYXNpYyBidWlsZGluZyBibG9ja3Mgb2YgdW5pdCB0ZXN0aW5nIGFyZSBcZGZue3Rlc3QgY2FzZXN9IC0tLQogc2luZ2xlIHNjZW5hcmlvcyB0aGF0IG11c3QgYmUgc2V0IHVwIGFuZCBjaGVja2VkIGZvciBjb3JyZWN0bmVzcy4gIEluCi1QeVVuaXQsIHRlc3QgY2FzZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGluc3RhbmNlcyBvZiB0aGUKLVxjbGFzc3tUZXN0Q2FzZX0gY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZS4gVG8gbWFrZQorXG1vZHVsZXt1bml0dGVzdH0sIHRlc3QgY2FzZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGluc3RhbmNlcyBvZgorXG1vZHVsZXt1bml0dGVzdH0ncyBcY2xhc3N7VGVzdENhc2V9IGNsYXNzLiBUbyBtYWtlCiB5b3VyIG93biB0ZXN0IGNhc2VzIHlvdSBtdXN0IHdyaXRlIHN1YmNsYXNzZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSwgb3IKIHVzZSBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0uCiAKQEAgLTIwNyw3ICsyMDQsNyBAQAogc2VsZiBjb250YWluZWQsIHN1Y2ggdGhhdCBpdCBjYW4gYmUgcnVuIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4KIGFyYml0cmFyeSBjb21iaW5hdGlvbiB3aXRoIGFueSBudW1iZXIgb2Ygb3RoZXIgdGVzdCBjYXNlcy4KIAotVGhlIHNpbXBsZXN0IHRlc3QgY2FzZSBzdWJjbGFzcyB3aWxsIHNpbXBseSBvdmVycmlkZSB0aGUKK1RoZSBzaW1wbGVzdCBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzIHdpbGwgc2ltcGx5IG92ZXJyaWRlIHRoZQogXG1ldGhvZHtydW5UZXN0KCl9IG1ldGhvZCBpbiBvcmRlciB0byBwZXJmb3JtIHNwZWNpZmljIHRlc3RpbmcgY29kZToKIAogXGJlZ2lue3ZlcmJhdGltfQpAQCAtMjIxLDEyICsyMTgsMTMgQEAKIAogTm90ZSB0aGF0IGluIG9yZGVyIHRvIHRlc3Qgc29tZXRoaW5nLCB3ZSB1c2UgdGhlIG9uZSBvZiB0aGUKIFxtZXRob2R7YXNzZXJ0KigpfSBvciBcbWV0aG9ke2ZhaWwqKCl9IG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlCi1cY2xhc3N7VGVzdENhc2V9IGJhc2UgY2xhc3MuICBJZiB0aGUgdGVzdCBmYWlscyB3aGVuIHRoZSB0ZXN0IGNhc2UKLXJ1bnMsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCwgYW5kIHRoZSB0ZXN0aW5nIGZyYW1ld29yayB3aWxsCi1pZGVudGlmeSB0aGUgdGVzdCBjYXNlIGFzIGEgXGRmbntmYWlsdXJlfS4gIE90aGVyIGV4Y2VwdGlvbnMgdGhhdCBkbwotbm90IGFyaXNlIGZyb20gY2hlY2tzIG1hZGUgdGhyb3VnaCB0aGUgXG1ldGhvZHthc3NlcnQqKCl9IGFuZAotXG1ldGhvZHtmYWlsKigpfSBtZXRob2RzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSB0ZXN0aW5nIGZyYW1ld29yayBhcwotXGRmbntlcnJvcnN9LgorXGNsYXNze1Rlc3RDYXNlfSBiYXNlIGNsYXNzLiAgSWYgdGhlIHRlc3QgZmFpbHMsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCityYWlzZWQsIGFuZCBcbW9kdWxle3VuaXR0ZXN0fSB3aWxsIGlkZW50aWZ5IHRoZSB0ZXN0IGNhc2UgYXMgYQorXGRmbntmYWlsdXJlfS4gIEFueSBvdGhlciBleGNlcHRpb25zIHdpbGwgYmUgdHJlYXRlZCBhcyBcZGZue2Vycm9yc30uCitUaGlzIGhlbHBzIHlvdSBpZGVudGlmeSB3aGVyZSB0aGUgcHJvYmxlbSBpczogXGRmbntmYWlsdXJlc30gYXJlIGNhdXNlZCBieQoraW5jb3JyZWN0IHJlc3VsdHMgLSBhIDUgd2hlcmUgeW91IGV4cGVjdGVkIGEgNi4gXGRmbntFcnJvcnN9IGFyZSBjYXVzZWQgYnkKK2luY29ycmVjdCBjb2RlIC0gZS5nLiwgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gY2F1c2VkIGJ5IGFuIGluY29ycmVjdAorZnVuY3Rpb24gY2FsbC4KIAogVGhlIHdheSB0byBydW4gYSB0ZXN0IGNhc2Ugd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIuICBGb3Igbm93LCBub3RlCiB0aGF0IHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBzdWNoIGEgdGVzdCBjYXNlLCB3ZSBjYWxsIGl0cwpAQCAtMjM3LDcgKzIzNSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBOb3csIHN1Y2ggdGVzdCBjYXNlcyBjYW4gYmUgbnVtZXJvdXMsIGFuZCB0aGVpciBzZXQtdXAgY2FuIGJlCi1yZXBldGl0aXZlLiAgSW4gdGhlIGFib3ZlIGNhc2UsIGNvbnN0cnVjdGluZyBhIGBgV2lkZ2V0JycgaW4gZWFjaCBvZgorcmVwZXRpdGl2ZS4gIEluIHRoZSBhYm92ZSBjYXNlLCBjb25zdHJ1Y3RpbmcgYSBcY2xhc3N7V2lkZ2V0fSBpbiBlYWNoIG9mCiAxMDAgV2lkZ2V0IHRlc3QgY2FzZSBzdWJjbGFzc2VzIHdvdWxkIG1lYW4gdW5zaWdodGx5IGR1cGxpY2F0aW9uLgogCiBMdWNraWx5LCB3ZSBjYW4gZmFjdG9yIG91dCBzdWNoIHNldC11cCBjb2RlIGJ5IGltcGxlbWVudGluZyBhIG1ldGhvZApAQCAtMjgzLDcgKzI4MSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBJZiBcbWV0aG9ke3NldFVwKCl9IHN1Y2NlZWRlZCwgdGhlIFxtZXRob2R7dGVhckRvd24oKX0gbWV0aG9kIHdpbGwgYmUKLXJ1biByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IFxtZXRob2R7cnVuVGVzdCgpfSBzdWNjZWVkZWQuCitydW4gd2hldGhlciBcbWV0aG9ke3J1blRlc3QoKX0gc3VjY2VlZGVkIG9yIG5vdC4KIAogU3VjaCBhIHdvcmtpbmcgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0aW5nIGNvZGUgaXMgY2FsbGVkIGEKIFxkZm57Zml4dHVyZX0uCkBAIC0yOTIsOCArMjkwLDggQEAKIHdlIHdvdWxkIGVuZCB1cCBzdWJjbGFzc2luZyBcY2xhc3N7U2ltcGxlV2lkZ2V0VGVzdENhc2V9IGludG8gbWFueQogc21hbGwgb25lLW1ldGhvZCBjbGFzc2VzIHN1Y2ggYXMKIFxjbGFzc3tEZWZhdWx0V2lkZ2V0U2l6ZVRlc3RDYXNlfS4gIFRoaXMgaXMgdGltZS1jb25zdW1pbmcgYW5kCi1kaXNjb3VyYWdpbmcsIHNvIGluIHRoZSBzYW1lIHZlaW4gYXMgSlVuaXQsIFB5VW5pdCBwcm92aWRlcyBhIHNpbXBsZXIKLW1lY2hhbmlzbToKK2Rpc2NvdXJhZ2luZywgc28gaW4gdGhlIHNhbWUgdmVpbiBhcyBKVW5pdCwgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMKK2Egc2ltcGxlciBtZWNoYW5pc206CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCB1bml0dGVzdApAQCAtMzI5LDkgKzMyNyw5IEBACiBcZW5ke3ZlcmJhdGltfQogCiBUZXN0IGNhc2UgaW5zdGFuY2VzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGFjY29yZGluZyB0byB0aGUgZmVhdHVyZXMKLXRoZXkgdGVzdC4gIFB5VW5pdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgdGhpczogdGhlIFxjbGFzc3t0ZXN0Ci1zdWl0ZX0sIHJlcHJlc2VudGVkIGJ5IHRoZSBjbGFzcyBcY2xhc3N7VGVzdFN1aXRlfSBpbiB0aGUKLVxyZWZtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZToKK3RoZXkgdGVzdC4gIFxtb2R1bGV7dW5pdHRlc3R9IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB0aGlzOiB0aGUKK1xkZm57dGVzdCBzdWl0ZX0sIHJlcHJlc2VudGVkIGJ5IFxtb2R1bGV7dW5pdHRlc3R9J3MgXGNsYXNze1Rlc3RTdWl0ZX0KK2NsYXNzOgogCiBcYmVnaW57dmVyYmF0aW19CiB3aWRnZXRUZXN0U3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQpAQCAtMzU0LDI4ICszNTIsMzAgQEAKIG9yIGV2ZW46CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIFdpZGdldFRlc3RTdWl0ZSh1bml0dGVzdC5UZXN0U3VpdGUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgdW5pdHRlc3QuVGVzdFN1aXRlLl9faW5pdF9fKHNlbGYsbWFwKFdpZGdldFRlc3RDYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidGVzdERlZmF1bHRTaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RSZXNpemUiKSkpCi1cZW5ke3ZlcmJhdGltfQorZGVmIHN1aXRlKCk6CisgICAgdGVzdHMgPSBbInRlc3REZWZhdWx0U2l6ZSIsICJ0ZXN0UmVzaXplIl0KIAotKFRoZSBsYXR0ZXIgaXMgYWRtaXR0ZWRseSBub3QgZm9yIHRoZSBmYWludC1oZWFydGVkISkKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKG1hcChXaWRnZXRUZXN0Q2FzZSwgdGVzdHMpKQorXGVuZHt2ZXJiYXRpbX0KIAogU2luY2UgaXQgaXMgYSBjb21tb24gcGF0dGVybiB0byBjcmVhdGUgYSBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzCi13aXRoIG1hbnkgc2ltaWxhcmx5IG5hbWVkIHRlc3QgZnVuY3Rpb25zLCB0aGVyZSBpcyBhIGNvbnZlbmllbmNlCi1mdW5jdGlvbiBjYWxsZWQgXGZ1bmN0aW9ue21ha2VTdWl0ZSgpfSB0aGF0IGNvbnN0cnVjdHMgYSB0ZXN0IHN1aXRlCi10aGF0IGNvbXByaXNlcyBhbGwgb2YgdGhlIHRlc3QgY2FzZXMgaW4gYSB0ZXN0IGNhc2UgY2xhc3M6Cit3aXRoIG1hbnkgc2ltaWxhcmx5IG5hbWVkIHRlc3QgZnVuY3Rpb25zLCBcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyBhCitcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZgorY3JlYXRpbmcgYSB0ZXN0IHN1aXRlIGFuZCBwb3B1bGF0aW5nIGl0IHdpdGggaW5kaXZpZHVhbCB0ZXN0cy4KK0ZvciBleGFtcGxlLAogCiBcYmVnaW57dmVyYmF0aW19Ci1zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShXaWRnZXRUZXN0Q2FzZSkKK3N1aXRlID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShXaWRnZXRUZXN0Q2FzZSkKIFxlbmR7dmVyYmF0aW19CiAKLU5vdGUgdGhhdCB3aGVuIHVzaW5nIHRoZSBcZnVuY3Rpb257bWFrZVN1aXRlKCl9IGZ1bmN0aW9uLCB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZSB2YXJpb3VzIHRlc3QgY2FzZXMgd2lsbCBiZSBydW4gYnkgdGhlIHRlc3Qgc3VpdGUgaXMgdGhlCi1vcmRlciBkZXRlcm1pbmVkIGJ5IHNvcnRpbmcgdGhlIHRlc3QgZnVuY3Rpb24gbmFtZXMgdXNpbmcgdGhlCi1cZnVuY3Rpb257Y21wKCl9IGJ1aWx0LWluIGZ1bmN0aW9uLgord2lsbCBjcmVhdGUgYSB0ZXN0IHN1aXRlIHRoYXQgd2lsbCBydW4KK1xjb2Rle1dpZGdldFRlc3RDYXNlLnRlc3REZWZhdWx0U2l6ZSgpfSBhbmQgXGNvZGV7V2lkZ2V0VGVzdENhc2UudGVzdFJlc2l6ZX0uCitcY2xhc3N7VGVzdExvYWRlcn0gdXNlcyB0aGUgXGNvZGV7J3Rlc3QnfSBtZXRob2QgbmFtZSBwcmVmaXggdG8gaWRlbnRpZnkKK3Rlc3QgbWV0aG9kcyBhdXRvbWF0aWNhbGx5LgorCitOb3RlIHRoYXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSB2YXJpb3VzIHRlc3QgY2FzZXMgd2lsbCBiZSBydW4gaXMKK2RldGVybWluZWQgYnkgc29ydGluZyB0aGUgdGVzdCBmdW5jdGlvbiBuYW1lcyB3aXRoIHRoZSBidWlsdC1pbgorXGZ1bmN0aW9ue2NtcCgpfSBmdW5jdGlvbi4KIAogT2Z0ZW4gaXQgaXMgZGVzaXJhYmxlIHRvIGdyb3VwIHN1aXRlcyBvZiB0ZXN0IGNhc2VzIHRvZ2V0aGVyLCBzbyBhcyB0bwogcnVuIHRlc3RzIGZvciB0aGUgd2hvbGUgc3lzdGVtIGF0IG9uY2UuICBUaGlzIGlzIGVhc3ksIHNpbmNlCkBAIC0zODUsMTMgKzM4NSwxMyBAQAogXGJlZ2lue3ZlcmJhdGltfQogc3VpdGUxID0gbW9kdWxlMS5UaGVUZXN0U3VpdGUoKQogc3VpdGUyID0gbW9kdWxlMi5UaGVUZXN0U3VpdGUoKQotYWxsdGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKHN1aXRlMSwgc3VpdGUyKSkKK2FsbHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtzdWl0ZTEsIHN1aXRlMl0pCiBcZW5ke3ZlcmJhdGltfQogCiBZb3UgY2FuIHBsYWNlIHRoZSBkZWZpbml0aW9ucyBvZiB0ZXN0IGNhc2VzIGFuZCB0ZXN0IHN1aXRlcyBpbiB0aGUKIHNhbWUgbW9kdWxlcyBhcyB0aGUgY29kZSB0aGV5IGFyZSB0byB0ZXN0IChzdWNoIGFzIFxmaWxle3dpZGdldC5weX0pLAogYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGFkdmFudGFnZXMgdG8gcGxhY2luZyB0aGUgdGVzdCBjb2RlIGluIGEKLXNlcGFyYXRlIG1vZHVsZSwgc3VjaCBhcyBcZmlsZXt3aWRnZXR0ZXN0cy5weX06CitzZXBhcmF0ZSBtb2R1bGUsIHN1Y2ggYXMgXGZpbGV7dGVzdF93aWRnZXQucHl9OgogCiBcYmVnaW57aXRlbWl6ZX0KICAgXGl0ZW0gVGhlIHRlc3QgbW9kdWxlIGNhbiBiZSBydW4gc3RhbmRhbG9uZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCkBAIC00MTIsMTMgKzQxMiwxMiBAQAogICAgICAgICAgICAgXGxhYmVse2xlZ2FjeS11bml0LXRlc3RzfX0KIAogU29tZSB1c2VycyB3aWxsIGZpbmQgdGhhdCB0aGV5IGhhdmUgZXhpc3RpbmcgdGVzdCBjb2RlIHRoYXQgdGhleSB3b3VsZAotbGlrZSB0byBydW4gZnJvbSBQeVVuaXQsIHdpdGhvdXQgY29udmVydGluZyBldmVyeSBvbGQgdGVzdCBmdW5jdGlvbiB0bwotYSBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzLgorbGlrZSB0byBydW4gZnJvbSBcbW9kdWxle3VuaXR0ZXN0fSwgd2l0aG91dCBjb252ZXJ0aW5nIGV2ZXJ5IG9sZCB0ZXN0CitmdW5jdGlvbiB0byBhIFxjbGFzc3tUZXN0Q2FzZX0gc3ViY2xhc3MuCiAKLUZvciB0aGlzIHJlYXNvbiwgUHlVbml0IHByb3ZpZGVzIGEgXGNsYXNze0Z1bmN0aW9uVGVzdENhc2V9IGNsYXNzLgotVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7VGVzdENhc2V9IGNhbiBiZSB1c2VkIHRvIHdyYXAgYW4gZXhpc3RpbmcgdGVzdAotZnVuY3Rpb24uICBTZXQtdXAgYW5kIHRlYXItZG93biBmdW5jdGlvbnMgY2FuIGFsc28gb3B0aW9uYWxseSBiZQotd3JhcHBlZC4KK0ZvciB0aGlzIHJlYXNvbiwgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMgYSBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0KK2NsYXNzLiAgVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7VGVzdENhc2V9IGNhbiBiZSB1c2VkIHRvIHdyYXAgYW4gZXhpc3RpbmcKK3Rlc3QgZnVuY3Rpb24uICBTZXQtdXAgYW5kIHRlYXItZG93biBmdW5jdGlvbnMgY2FuIGFsc28gYmUgcHJvdmlkZWQuCiAKIEdpdmVuIHRoZSBmb2xsb3dpbmcgdGVzdCBmdW5jdGlvbjoKIApAQCAtNDM2LDcgKzQzNSw4IEBACiBcZW5ke3ZlcmJhdGltfQogCiBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBzZXQtdXAgYW5kIHRlYXItZG93biBtZXRob2RzIHRoYXQgc2hvdWxkIGJlCi1jYWxsZWQgYXMgcGFydCBvZiB0aGUgdGVzdCBjYXNlJ3Mgb3BlcmF0aW9uLCB0aGV5IGNhbiBhbHNvIGJlIHByb3ZpZGVkOgorY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSdzIG9wZXJhdGlvbiwgdGhleSBjYW4gYWxzbyBiZSBwcm92aWRlZAorbGlrZSBzbzoKIAogXGJlZ2lue3ZlcmJhdGltfQogdGVzdGNhc2UgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3RTb21ldGhpbmcsCkBAIC00NDQsOSArNDQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd249ZGVsZXRlU29tZXRoaW5nREIpCiBcZW5ke3ZlcmJhdGltfQogCi1cbm90ZXtQeVVuaXQgc3VwcG9ydHMgdGhlIHVzZSBvZiBcZXhjZXB0aW9ue0Fzc2VydGlvbkVycm9yfQotYXMgYW4gaW5kaWNhdG9yIG9mIHRlc3QgZmFpbHVyZSwgYnV0IGRvZXMgbm90IHJlY29tbWVuZCBpdC4gIEZ1dHVyZQotdmVyc2lvbnMgbWF5IHRyZWF0IFxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9IGRpZmZlcmVudGx5Ln0KK1RvIG1ha2UgbWlncmF0aW5nIGV4aXN0aW5nIHRlc3Qgc3VpdGVzIGVhc2llciwgXG1vZHVsZXt1bml0dGVzdH0KK3N1cHBvcnRzIHRlc3RzIHJhaXNpbmcgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0gdG8gaW5kaWNhdGUgdGVzdCBmYWlsdXJlLgorSG93ZXZlciwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBleHBsaWNpdAorXG1ldGhvZHtUZXN0Q2FzZS5mYWlsKigpfSBhbmQgXG1ldGhvZHtUZXN0Q2FzZS5hc3NlcnQqKCl9IG1ldGhvZHMgaW5zdGVhZCwKK2FzIGZ1dHVyZSB2ZXJzaW9ucyBvZiBcbW9kdWxle3VuaXR0ZXN0fSBtYXkgdHJlYXQgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0KK2RpZmZlcmVudGx5LgorCitcbm90ZXtFdmVuIHRob3VnaCBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb252ZXJ0CithbiBleGlzdGluZyB0ZXN0IGJhc2Ugb3ZlciB0byBhIFxtb2R1bGV7dW5pdHRlc3R9LWJhc2VkIHN5c3RlbSwgdGhpcworYXBwcm9hY2ggaXMgbm90IHJlY29tbWVuZGVkLiAgVGFraW5nIHRoZSB0aW1lIHRvIHNldCB1cCBwcm9wZXIKK1xjbGFzc3tUZXN0Q2FzZX0gc3ViY2xhc3NlcyB3aWxsIG1ha2UgZnV0dXJlIHRlc3QgcmVmYWN0b3JpbmdzIGluZmluaXRlbHkKK2Vhc2llci59CisKIAogCiBcc3Vic2VjdGlvbntDbGFzc2VzIGFuZCBmdW5jdGlvbnMKQEAgLTQ1NCwxMSArNDY0LDEyIEBACiAKIFxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RDYXNlfXt9CiAgIEluc3RhbmNlcyBvZiB0aGUgXGNsYXNze1Rlc3RDYXNlfSBjbGFzcyByZXByZXNlbnQgdGhlIHNtYWxsZXN0Ci0gIHRlc3RhYmxlIHVuaXRzIGluIGEgc2V0IG9mIHRlc3RzLiAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCi0gIGFzIGEgYmFzZSBjbGFzcywgd2l0aCBzcGVjaWZpYyB0ZXN0cyBiZWluZyBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICBzdWJjbGFzc2VzLiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgbmVlZGVkIGJ5IHRoZSB0ZXN0Ci0gIHJ1bm5lciB0byBhbGxvdyBpdCB0byBkcml2ZSB0aGUgdGVzdCwgYW5kIG1ldGhvZHMgdGhhdCB0aGUgdGVzdCBjb2RlCi0gIGNhbiB1c2UgdG8gY2hlY2sgZm9yIGFuZCByZXBvcnQgdmFyaW91cyBraW5kcyBvZiBmYWlsdXJlcy4KKyAgdGVzdGFibGUgdW5pdHMgaW4gdGhlIFxtb2R1bGV7dW5pdHRlc3R9IHVuaXZlcnNlLiAgVGhpcyBjbGFzcyBpcworICBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcywgd2l0aCBzcGVjaWZpYyB0ZXN0cyBiZWluZworICBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSBzdWJjbGFzc2VzLiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZQorICBpbnRlcmZhY2UgbmVlZGVkIGJ5IHRoZSB0ZXN0IHJ1bm5lciB0byBhbGxvdyBpdCB0byBkcml2ZSB0aGUKKyAgdGVzdCwgYW5kIG1ldGhvZHMgdGhhdCB0aGUgdGVzdCBjb2RlIGNhbiB1c2UgdG8gY2hlY2sgZm9yIGFuZAorICByZXBvcnQgdmFyaW91cyBraW5kcyBvZiBmYWlsdXJlLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e0Z1bmN0aW9uVGVzdENhc2V9e3Rlc3RGdW5jXG9wdGlvbmFseywKQEAgLTQ3NCwzMyArNDg1LDMzIEBACiBcYmVnaW57Y2xhc3NkZXNjfXtUZXN0U3VpdGV9e1xvcHRpb25hbHt0ZXN0c319CiAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGlvbiBvZiBpbmRpdmlkdWFsIHRlc3RzIGNhc2VzIGFuZAogICB0ZXN0IHN1aXRlcy4gIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgaW50ZXJmYWNlIG5lZWRlZCBieSB0aGUgdGVzdAotICBydW5uZXIgdG8gYWxsb3cgaXQgdG8gYmUgcnVuIGFzIGFueSBvdGhlciB0ZXN0IGNhc2UsIGJ1dCBhbGwgdGhlCi0gIGNvbnRhaW5lZCB0ZXN0cyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGV4ZWN1dGVkLiAgQWRkaXRpb25hbCBtZXRob2RzCi0gIGFyZSBwcm92aWRlZCB0byBhZGQgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZSBhZ2dyZWdhdGlvbi4gIElmCi0gIFx2YXJ7dGVzdHN9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgaW5kaXZpZHVhbCB0ZXN0cyB0aGF0Ci0gIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHN1aXRlLgorICBydW5uZXIgdG8gYWxsb3cgaXQgdG8gYmUgcnVuIGFzIGFueSBvdGhlciB0ZXN0IGNhc2UuICBSdW5uaW5nIGEKKyAgXGNsYXNze1Rlc3RTdWl0ZX0gaW5zdGFuY2UgaXMgdGhlIHNhbWUgYXMgaXRlcmF0aW5nIG92ZXIgdGhlIHN1aXRlLAorICBydW5uaW5nIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkuCisgIAorICBJZiBcdmFye3Rlc3RzfSBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgb3IKKyAgb3RoZXIgdGVzdCBzdWl0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHN1aXRlIGluaXRpYWxseS4KKyAgQWRkaXRpb25hbCBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBhZGQgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZQorICBjb2xsZWN0aW9uIGxhdGVyIG9uLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RMb2FkZXJ9e30KICAgVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0ZXN0cyBhY2NvcmRpbmcgdG8gdmFyaW91cwogICBjcml0ZXJpYSBhbmQgcmV0dXJuaW5nIHRoZW0gd3JhcHBlZCBpbiBhIFxjbGFzc3tUZXN0U3VpdGV9LgogICBJdCBjYW4gbG9hZCBhbGwgdGVzdHMgd2l0aGluIGEgZ2l2ZW4gbW9kdWxlIG9yIFxjbGFzc3tUZXN0Q2FzZX0KLSAgY2xhc3MuICBXaGVuIGxvYWRpbmcgZnJvbSBhIG1vZHVsZSwgaXQgY29uc2lkZXJzIGFsbAotICBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3Nlcy4gIEZvciBlYWNoIHN1Y2ggY2xhc3MsIGl0IGNyZWF0ZXMKLSAgYW4gaW5zdGFuY2UgZm9yIGVhY2ggbWV0aG9kIHdpdGggYSBuYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcKLSAgXHNhbXB7dGVzdH0uCisgIHN1YmNsYXNzLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntkYXRhZGVzY317ZGVmYXVsdFRlc3RMb2FkZXJ9Ci0gIEluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3Mgd2hpY2ggY2FuIGJlIHNoYXJlZC4gIElmIG5vCisgIEluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgaW50ZW5kZWQgdG8gYmUgc2hhcmVkLiAgSWYgbm8KICAgY3VzdG9taXphdGlvbiBvZiB0aGUgXGNsYXNze1Rlc3RMb2FkZXJ9IGlzIG5lZWRlZCwgdGhpcyBpbnN0YW5jZSBjYW4KLSAgYWx3YXlzIGJlIHVzZWQgaW5zdGVhZCBvZiBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLgorICBiZSB1c2VkIGluc3RlYWQgb2YgcmVwZWF0ZWRseSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLgogXGVuZHtkYXRhZGVzY30KIAogXGJlZ2lue2NsYXNzZGVzY317VGV4dFRlc3RSdW5uZXJ9e1xvcHRpb25hbHtzdHJlYW1cb3B0aW9uYWx7LAogICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25zXG9wdGlvbmFseywgdmVyYm9zaXR5fX19fQogICBBIGJhc2ljIHRlc3QgcnVubmVyIGltcGxlbWVudGF0aW9uIHdoaWNoIHByaW50cyByZXN1bHRzIG9uIHN0YW5kYXJkCi0gIG91dHB1dC4gIEl0IGhhcyBhIGZldyBjb25maWd1cmFibGUgcGFyYW1ldGVycywgYnV0IGlzIGVzc2VudGlhbGx5CisgIGVycm9yLiAgSXQgaGFzIGEgZmV3IGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzLCBidXQgaXMgZXNzZW50aWFsbHkKICAgdmVyeSBzaW1wbGUuICBHcmFwaGljYWwgYXBwbGljYXRpb25zIHdoaWNoIHJ1biB0ZXN0IHN1aXRlcyBzaG91bGQKICAgcHJvdmlkZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zLgogXGVuZHtjbGFzc2Rlc2N9CkBAIC01MTAsNyArNTIxLDggQEAKICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lclxvcHRpb25hbHssIHRlc3RSdW5uZXJ9fX19fX0KICAgQSBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzZXQgb2YgdGVzdHM7IHRoaXMgaXMgcHJpbWFyaWx5CiAgIGZvciBtYWtpbmcgdGVzdCBtb2R1bGVzIGNvbnZlbmllbnRseSBleGVjdXRhYmxlLiAgVGhlIHNpbXBsZXN0IHVzZQotICBmb3IgdGhpcyBmdW5jdGlvbiBpczoKKyAgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpbmUgYXQgdGhlIGVuZCBvZiBhCisgIHRlc3Qgc2NyaXB0OgogCiBcYmVnaW57dmVyYmF0aW19CiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpAQCAtNTE4LDEwICs1MzAsMTEgQEAKIFxlbmR7dmVyYmF0aW19CiBcZW5ke2Z1bmNkZXNjfQogCi1JbiBzb21lIGNhc2VzLCB0aGUgZXhpc3RpbmcgdGVzdHMgbWF5IGhhdmUgYmUgd3JpdHRlbiB1c2luZyB0aGUKK0luIHNvbWUgY2FzZXMsIHRoZSBleGlzdGluZyB0ZXN0cyBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gdXNpbmcgdGhlCiBccmVmbW9kdWxle2RvY3Rlc3R9IG1vZHVsZS4gIElmIHNvLCB0aGF0IG1vZHVsZSBwcm92aWRlcyBhIAogXGNsYXNze0RvY1Rlc3RTdWl0ZX0gY2xhc3MgdGhhdCBjYW4gYXV0b21hdGljYWxseSBidWlsZAotXGNsYXNze3VuaXR0ZXN0LlRlc3RTdWl0ZX0gaW5zdGFuY2VzIGZyb20gdGhlIGV4aXN0aW5nIHRlc3QgY29kZS4KK1xjbGFzc3t1bml0dGVzdC5UZXN0U3VpdGV9IGluc3RhbmNlcyBmcm9tIHRoZSBleGlzdGluZworXG1vZHVsZXtkb2N0ZXN0fS1iYXNlZCB0ZXN0cy4KIFx2ZXJzaW9uYWRkZWR7Mi4zfQogCiAKQEAgLTUzOCw3ICs1NTEsNyBAQAogY2hlY2sgY29uZGl0aW9ucyBhbmQgcmVwb3J0IGZhaWx1cmVzLCBhbmQgc29tZSBpbnF1aXJ5IG1ldGhvZHMKIGFsbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IGl0c2VsZiB0byBiZSBnYXRoZXJlZC4KIAotTWV0aG9kcyBpbiB0aGUgZmlyc3QgZ3JvdXAgYXJlOgorTWV0aG9kcyBpbiB0aGUgZmlyc3QgZ3JvdXAgKHJ1bm5pbmcgdGhlIHRlc3QpIGFyZToKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtzZXRVcH17fQogICBNZXRob2QgY2FsbGVkIHRvIHByZXBhcmUgdGhlIHRlc3QgZml4dHVyZS4gIFRoaXMgaXMgY2FsbGVkCkBAIC01NjIsOCArNTc1LDEwIEBACiAgIFJ1biB0aGUgdGVzdCwgY29sbGVjdGluZyB0aGUgcmVzdWx0IGludG8gdGhlIHRlc3QgcmVzdWx0IG9iamVjdAogICBwYXNzZWQgYXMgXHZhcntyZXN1bHR9LiAgSWYgXHZhcntyZXN1bHR9IGlzIG9taXR0ZWQgb3IgXGNvbnN0YW50e05vbmV9LAogICBhIHRlbXBvcmFyeSByZXN1bHQgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHVzZWQsIGJ1dCBpcyBub3QgbWFkZQotICBhdmFpbGFibGUgdG8gdGhlIGNhbGxlci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzaW1wbHkgY2FsbGluZyB0aGUKLSAgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZS4KKyAgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCisgIAorICBUaGUgc2FtZSBlZmZlY3QgbWF5IGJlIGhhZCBieSBzaW1wbHkgY2FsbGluZyB0aGUgXGNsYXNze1Rlc3RDYXNlfQorICBpbnN0YW5jZS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtkZWJ1Z317fQpAQCAtNjY0LDEwICs2NzksOCBAQAogaW5mb3JtYXRpb24gb24gdGhlIHRlc3Q6CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17Y291bnRUZXN0Q2FzZXN9e30KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuICBGb3IKLSAgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUgXGNvZGV7MX0sIGJ1dCB0aGlzCi0gIG1ldGhvZCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBcY2xhc3N7VGVzdFN1aXRlfSBjbGFzcywgd2hpY2ggY2FuCi0gIHJldHVybiBsYXJnZXIgdmFsdWVzLgorICBSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGlzIHRlc3Qgb2JqZWN0LiAgRm9yCisgIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIFxjb2RlezF9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2RlZmF1bHRUZXN0UmVzdWx0fXt9CkBAIC02NzgsNyArNjkxLDcgQEAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17aWR9e30KICAgUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2UuICBUaGlzIGlzIHVzdWFsbHkKICAgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QsIGluY2x1ZGluZyB0aGUgbW9kdWxlIGFuZCBjbGFzcwotICBuYW1lcy4KKyAgbmFtZS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtzaG9ydERlc2NyaXB0aW9ufXt9CkBAIC02OTQsMjEgKzcwNywyMyBAQAogCiBcY2xhc3N7VGVzdFN1aXRlfSBvYmplY3RzIGJlaGF2ZSBtdWNoIGxpa2UgXGNsYXNze1Rlc3RDYXNlfSBvYmplY3RzLAogZXhjZXB0IHRoZXkgZG8gbm90IGFjdHVhbGx5IGltcGxlbWVudCBhIHRlc3QuICBJbnN0ZWFkLCB0aGV5IGFyZSB1c2VkCi10byBhZ2dyZWdhdGUgdGVzdHMgaW50byBncm91cHMgdGhhdCBzaG91bGQgYmUgcnVuIHRvZ2V0aGVyLiAgU29tZQotYWRkaXRpb25hbCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gYWRkIHRlc3RzIHRvIFxjbGFzc3tUZXN0U3VpdGV9Cit0byBhZ2dyZWdhdGUgdGVzdHMgaW50byBncm91cHMgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgcnVuIHRvZ2V0aGVyLgorU29tZSBhZGRpdGlvbmFsIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBhZGQgdGVzdHMgdG8gXGNsYXNze1Rlc3RTdWl0ZX0KIGluc3RhbmNlczoKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17YWRkVGVzdH17dGVzdH0KLSAgQWRkIGEgXGNsYXNze1Rlc3RDYXNlfSBvciBcY2xhc3N7VGVzdFN1aXRlfSB0byB0aGUgc2V0IG9mIHRlc3RzIHRoYXQKLSAgbWFrZSB1cCB0aGUgc3VpdGUuCisgIEFkZCBhIFxjbGFzc3tUZXN0Q2FzZX0gb3IgXGNsYXNze1Rlc3RTdWl0ZX0gdG8gdGhlIHN1aXRlLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXthZGRUZXN0c317dGVzdHN9Ci0gIEFkZCBhbGwgdGhlIHRlc3RzIGZyb20gYSBzZXF1ZW5jZSBvZiBcY2xhc3N7VGVzdENhc2V9IGFuZAorICBBZGQgYWxsIHRoZSB0ZXN0cyBmcm9tIGFuIGl0ZXJhYmxlIG9mIFxjbGFzc3tUZXN0Q2FzZX0gYW5kCiAgIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlcyB0byB0aGlzIHRlc3Qgc3VpdGUuCisgIAorICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaXRlcmF0aW5nIG92ZXIgXHZhcnt0ZXN0c30sIGNhbGxpbmcKKyAgXG1ldGhvZHthZGRUZXN0KCl9IGZvciBlYWNoIGVsZW1lbnQuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVRoZSBcbWV0aG9ke3J1bigpfSBtZXRob2QgaXMgYWxzbyBzbGlnaHRseSBkaWZmZXJlbnQ6CitcY2xhc3N7VGVzdFN1aXRlfSBzaGFyZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHdpdGggXGNsYXNze1Rlc3RDYXNlfToKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17cnVufXtyZXN1bHR9CiAgIFJ1biB0aGUgdGVzdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VpdGUsIGNvbGxlY3RpbmcgdGhlIHJlc3VsdCBpbnRvCkBAIC03MTcsNiArNzMyLDE3IEBACiAgIHJlc3VsdCBvYmplY3QgdG8gYmUgcGFzc2VkIGluLgogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXtkZWJ1Z317fQorICBSdW4gdGhlIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1aXRlIHdpdGhvdXQgY29sbGVjdGluZyB0aGUgcmVzdWx0LgorICBUaGlzIGFsbG93cyBleGNlcHRpb25zIHJhaXNlZCBieSB0aGUgdGVzdCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIKKyAgYW5kIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgcnVubmluZyB0ZXN0cyB1bmRlciBhIGRlYnVnZ2VyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXtjb3VudFRlc3RDYXNlc317fQorICBSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGlzIHRlc3Qgb2JqZWN0LCBpbmNsdWRpbmcKKyAgYWxsIGluZGl2aWR1YWwgdGVzdHMgYW5kIHN1Yi1zdWl0ZXMuCitcZW5ke21ldGhvZGRlc2N9CisKIEluIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGEgXGNsYXNze1Rlc3RTdWl0ZX0gb2JqZWN0LCB0aGUgXG1ldGhvZHtydW4oKX0KIG1ldGhvZCBpcyBpbnZva2VkIGJ5IGEgXGNsYXNze1Rlc3RSdW5uZXJ9IHJhdGhlciB0aGFuIGJ5IHRoZSBlbmQtdXNlcgogdGVzdCBoYXJuZXNzLgpAQCAtNzI3LDcgKzc1Myw3IEBACiAKIEEgXGNsYXNze1Rlc3RSZXN1bHR9IG9iamVjdCBzdG9yZXMgdGhlIHJlc3VsdHMgb2YgYSBzZXQgb2YgdGVzdHMuICBUaGUKIFxjbGFzc3tUZXN0Q2FzZX0gYW5kIFxjbGFzc3tUZXN0U3VpdGV9IGNsYXNzZXMgZW5zdXJlIHRoYXQgcmVzdWx0cyBhcmUKLXByb3Blcmx5IHN0b3JlZDsgdGVzdCBhdXRob3JzIGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlY29yZGluZyB0aGUKK3Byb3Blcmx5IHJlY29yZGVkOyB0ZXN0IGF1dGhvcnMgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgcmVjb3JkaW5nIHRoZQogb3V0Y29tZSBvZiB0ZXN0cy4KIAogVGVzdGluZyBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBccmVmbW9kdWxle3VuaXR0ZXN0fSBtYXkgd2FudApAQCAtNzQ1LDI4ICs3NzEsNDEgQEAKIGJlIG9mIGludGVyZXN0IHdoZW4gaW5zcGVjdGluZyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGEgc2V0IG9mIHRlc3RzOgogCiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdFJlc3VsdF17ZXJyb3JzfQotICBBIGxpc3QgY29udGFpbmluZyBwYWlycyBvZiBcY2xhc3N7VGVzdENhc2V9IGluc3RhbmNlcyBhbmQgdGhlCi0gIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGZvciB0ZXN0cyB3aGljaCByYWlzZWQgYW4gZXhjZXB0aW9uIGJ1dCBkaWQgbm90Ci0gIHNpZ25hbCBhIHRlc3QgZmFpbHVyZS4KKyAgQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMgYW5kCisgIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoaWNoIHJhaXNlZCBhbgorICB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KICAgXHZlcnNpb25jaGFuZ2VkW0NvbnRhaW5zIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgIFxmdW5jdGlvbntzeXMuZXhjX2luZm8oKX0gcmVzdWx0c117Mi4yfQogXGVuZHttZW1iZXJkZXNjfQogCiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdFJlc3VsdF17ZmFpbHVyZXN9Ci0gIEEgbGlzdCBjb250YWluaW5nIHBhaXJzIG9mIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzIGFuZCB0aGUKLSAgZm9ybWF0dGVkIHRyYWNlYmFja3MgZm9yIHRlc3RzIHdoaWNoIHNpZ25hbGxlZCBhIGZhaWx1cmUgaW4gdGhlIGNvZGUKLSAgdW5kZXIgdGVzdC4KKyAgQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMgYW5kCisgIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoZXJlIGEgZmFpbHVyZQorICB3YXMgZXhwbGljaXRseSBzaWduYWxsZWQgdXNpbmcgdGhlIFxtZXRob2R7VGVzdENhc2UuZmFpbCooKX0gb3IKKyAgXG1ldGhvZHtUZXN0Q2FzZS5hc3NlcnQqKCl9IG1ldGhvZHMuCiAgIFx2ZXJzaW9uY2hhbmdlZFtDb250YWlucyBmb3JtYXR0ZWQgdHJhY2ViYWNrcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9IHJlc3VsdHNdezIuMn0KIFxlbmR7bWVtYmVyZGVzY30KIAogXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RSZXN1bHRde3Rlc3RzUnVufQotICBUaGUgbnVtYmVyIG9mIHRlc3RzIHdoaWNoIGhhdmUgYmVlbiBzdGFydGVkLgorICBUaGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHJ1biBzbyBmYXIuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0UmVzdWx0XXt3YXNTdWNjZXNzZnVsfXt9Ci0gIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgcnVuIHNvIGZhciBoYXZlIHBhc3NlZCwgb3RoZXJ3aXNlIHJldHVybnMKLSAgZmFsc2UuCisgIFJldHVybnMgXGNvbnN0YW50e1RydWV9IGlmIGFsbCB0ZXN0cyBydW4gc28gZmFyIGhhdmUgcGFzc2VkLAorICBvdGhlcndpc2UgcmV0dXJucyBcY29uc3RhbnR7RmFsc2V9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17c3RvcH17fQorICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXQgb2YgdGVzdHMgYmVpbmcgcnVuCisgIHNob3VsZCBiZSBhYm9ydGVkIGJ5IHNldHRpbmcgdGhlIFxjbGFzc3tUZXN0UmVzdWx0fSdzIFxjb2Rle3Nob3VsZFN0b3B9CisgIGF0dHJpYnV0ZSB0byBcY29uc3RhbnR7VHJ1ZX0uICBcY2xhc3N7VGVzdFJ1bm5lcn0gb2JqZWN0cyBzaG91bGQgcmVzcGVjdAorICB0aGlzIGZsYWcgYW5kIHJldHVybiB3aXRob3V0IHJ1bm5pbmcgYW55IGFkZGl0aW9uYWwgdGVzdHMuCisgIAorICBGb3IgZXhhbXBsZSwgdGhpcyBmZWF0dXJlIGlzIHVzZWQgYnkgdGhlIFxjbGFzc3tUZXh0VGVzdFJ1bm5lcn0gY2xhc3MKKyAgdG8gc3RvcCB0aGUgdGVzdCBmcmFtZXdvcmsgd2hlbiB0aGUgdXNlciBzaWduYWxzIGFuIGludGVycnVwdCBmcm9tCisgIHRoZSBrZXlib2FyZC4gIEludGVyYWN0aXZlIHRvb2xzIHdoaWNoIHByb3ZpZGUgXGNsYXNze1Rlc3RSdW5uZXJ9CisgIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIHRoaXMgaW4gYSBzaW1pbGFyIG1hbm5lci4KIFxlbmR7bWV0aG9kZGVzY30KIAogCkBAIC03ODYsMTAgKzgyNSw5IEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0UmVzdWx0XXthZGRFcnJvcn17dGVzdCwgZXJyfQotICBDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIFx2YXJ7dGVzdH0gcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aXRob3V0Ci0gIHNpZ25hbGxpbmcgYSB0ZXN0IGZhaWx1cmUuICBcdmFye2Vycn0gaXMgYSB0dXBsZSBvZiB0aGUgZm9ybQotICByZXR1cm5lZCBieSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9OiAgXGNvZGV7KFx2YXJ7dHlwZX0sCi0gIFx2YXJ7dmFsdWV9LCBcdmFye3RyYWNlYmFja30pfS4KKyAgQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSBcdmFye3Rlc3R9IHJhaXNlcyBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbgorICBcdmFye2Vycn0gaXMgYSB0dXBsZSBvZiB0aGUgZm9ybSByZXR1cm5lZCBieSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9OgorICBcY29kZXsoXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17YWRkRmFpbHVyZX17dGVzdCwgZXJyfQpAQCAtODAwLDIzICs4MzgsMTAgQEAKIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RSZXN1bHRde2FkZFN1Y2Nlc3N9e3Rlc3R9Ci0gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgYSB0ZXN0IHRoYXQgZG9lcyBub3QgZmFpbDsgXHZhcnt0ZXN0fSBpcwotICB0aGUgdGVzdCBjYXNlIG9iamVjdC4KKyAgQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSBcdmFye3Rlc3R9IHN1Y2NlZWRzLgogXGVuZHttZXRob2RkZXNjfQogCiAKLU9uZSBhZGRpdGlvbmFsIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIFxjbGFzc3tUZXN0UmVzdWx0fSBvYmplY3RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17c3RvcH17fQotICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXQgb2YgdGVzdHMgYmVpbmcgcnVuCi0gIHNob3VsZCBiZSBhYm9ydGVkLiAgT25jZSB0aGlzIGhhcyBiZWVuIGNhbGxlZCwgdGhlCi0gIFxjbGFzc3tUZXN0UnVubmVyfSBvYmplY3QgcmV0dXJuIHRvIGl0cyBjYWxsZXIgd2l0aG91dCBydW5uaW5nIGFueQotICBhZGRpdGlvbmFsIHRlc3RzLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGNsYXNzCi0gIHRvIHN0b3AgdGhlIHRlc3QgZnJhbWV3b3JrIHdoZW4gdGhlIHVzZXIgc2lnbmFscyBhbiBpbnRlcnJ1cHQgZnJvbQotICB0aGUga2V5Ym9hcmQuICBJbnRlcmFjdGl2ZSB0b29scyB3aGljaCBwcm92aWRlIHJ1bm5lcnMgY2FuIHVzZSB0aGlzCi0gIGluIGEgc2ltaWxhciBtYW5uZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KIAogXHN1YnNlY3Rpb257VGVzdExvYWRlciBPYmplY3RzCiAgICAgICAgICAgICBcbGFiZWx7dGVzdGxvYWRlci1vYmplY3RzfX0KQEAgLTgyNCwxNSArODQ5LDE1IEBACiBUaGUgXGNsYXNze1Rlc3RMb2FkZXJ9IGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHRlc3Qgc3VpdGVzIGZyb20KIGNsYXNzZXMgYW5kIG1vZHVsZXMuICBOb3JtYWxseSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2UKIG9mIHRoaXMgY2xhc3M7IHRoZSBccmVmbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUgcHJvdmlkZXMgYW4gaW5zdGFuY2UKLXRoYXQgY2FuIGJlIHNoYXJlZCBhcyB0aGUgXGNvZGV7ZGVmYXVsdFRlc3RMb2FkZXJ9IG1vZHVsZSBhdHRyaWJ1dGUuCi1Vc2luZyBhIHN1YmNsYXNzIG9yIGluc3RhbmNlIHdvdWxkIGFsbG93IGN1c3RvbWl6YXRpb24gb2Ygc29tZQordGhhdCBjYW4gYmUgc2hhcmVkIGFzIFxjb2Rle3VuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyfS4KK1VzaW5nIGEgc3ViY2xhc3Mgb3IgaW5zdGFuY2UsIGhvd2V2ZXIsIGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHNvbWUKIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzLgogCiBcY2xhc3N7VGVzdExvYWRlcn0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21UZXN0Q2FzZX17dGVzdENhc2VDbGFzc30KICAgUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUKLSAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIGNsYXNzIFxjbGFzc3t0ZXN0Q2FzZUNsYXNzfS4KKyAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIFxjbGFzc3t0ZXN0Q2FzZUNsYXNzfS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21Nb2R1bGV9e21vZHVsZX0KQEAgLTg0Miw3ICs4NjcsNyBAQAogICBtZXRob2QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzLgogCiAgIFx3YXJuaW5ne1doaWxlIHVzaW5nIGEgaGllcmFyY2h5IG9mCi0gIFxjbGFzc3tUZXN0Y2FzZX0tZGVyaXZlZCBjbGFzc2VzIGNhbiBiZSBjb252ZW5pZW50IGluIHNoYXJpbmcKKyAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIGNsYXNzZXMgY2FuIGJlIGNvbnZlbmllbnQgaW4gc2hhcmluZwogICBmaXh0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucywgZGVmaW5pbmcgdGVzdCBtZXRob2RzIG9uIGJhc2UgY2xhc3NlcwogICB0aGF0IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IGRvZXMgbm90IHBsYXkgd2VsbAogICB3aXRoIHRoaXMgbWV0aG9kLiAgRG9pbmcgc28sIGhvd2V2ZXIsIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUKQEAgLTg1MywyMSArODc4LDIzIEBACiAgIFJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBnaXZlbiBhIHN0cmluZyBzcGVjaWZpZXIuCiAKICAgVGhlIHNwZWNpZmllciBcdmFye25hbWV9IGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUKLSAgZWl0aGVyIHRvIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0Ci0gIGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBcY2xhc3N7VGVzdENhc2V9IG9yCi0gIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbW9kdWxlCi0gIFxtb2R1bGV7U2FtcGxlVGVzdHN9IGNvbnRhaW5pbmcgYSBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3MKLSAgXGNsYXNze1NhbXBsZVRlc3RDYXNlfSB3aXRoIHRocmVlIHRlc3QgbWV0aG9kcyAoXG1ldGhvZHt0ZXN0X29uZSgpfSwKLSAgXG1ldGhvZHt0ZXN0X3R3bygpfSwgYW5kIFxtZXRob2R7dGVzdF90aHJlZSgpfSksIHRoZSBzcGVjaWZpZXIKLSAgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlJ30gd291bGQgY2F1c2UgdGhpcyBtZXRob2QgdG8KLSAgcmV0dXJuIGEgc3VpdGUgd2hpY2ggd2lsbCBydW4gYWxsIHRocmVlIHRlc3QgbWV0aG9kcy4gIFVzaW5nIHRoZQotICBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlLnRlc3RfdHdvJ30gd291bGQgY2F1c2UKLSAgaXQgdG8gcmV0dXJuIGEgdGVzdCBzdWl0ZSB3aGljaCB3aWxsIHJ1biBvbmx5IHRoZQorICBlaXRoZXIgdG8gYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlLAorICBhIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2gKKyAgcmV0dXJucyBhIFxjbGFzc3tUZXN0Q2FzZX0gb3IgXGNsYXNze1Rlc3RTdWl0ZX0gaW5zdGFuY2UuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbW9kdWxlIFxtb2R1bGV7U2FtcGxlVGVzdHN9IGNvbnRhaW5pbmcgYQorICBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3MgXGNsYXNze1NhbXBsZVRlc3RDYXNlfSB3aXRoIHRocmVlIHRlc3QKKyAgbWV0aG9kcyAoXG1ldGhvZHt0ZXN0X29uZSgpfSwgXG1ldGhvZHt0ZXN0X3R3bygpfSwgYW5kCisgIFxtZXRob2R7dGVzdF90aHJlZSgpfSksIHRoZSBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlJ30KKyAgd291bGQgY2F1c2UgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgc3VpdGUgd2hpY2ggd2lsbCBydW4gYWxsIHRocmVlIHRlc3QKKyAgbWV0aG9kcy4gIFVzaW5nIHRoZSBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlLnRlc3RfdHdvJ30KKyAgd291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGEgdGVzdCBzdWl0ZSB3aGljaCB3aWxsIHJ1biBvbmx5IHRoZQogICBcbWV0aG9ke3Rlc3RfdHdvKCl9IHRlc3QgbWV0aG9kLiAgVGhlIHNwZWNpZmllciBjYW4gcmVmZXIgdG8gbW9kdWxlcwogICBhbmQgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbXBvcnRlZDsgdGhleSB3aWxsIGJlIGltcG9ydGVkIGFzCiAgIGEgc2lkZS1lZmZlY3QuCiAKLSAgVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIFx2YXJ7bmFtZX0gcmVsYXRpdmUgdG8gYSBnaXZlbiBtb2R1bGUuCisgIFRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBcdmFye25hbWV9IHJlbGF0aXZlIHRvIHRoZSBnaXZlbgorICBcdmFye21vZHVsZX0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0TG9hZGVyXXtsb2FkVGVzdHNGcm9tTmFtZXN9e25hbWVzXG9wdGlvbmFseywgbW9kdWxlfX0KQEAgLTg4OCwxNyArOTE1LDIyIEBACiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdExvYWRlcl17dGVzdE1ldGhvZFByZWZpeH0KICAgU3RyaW5nIGdpdmluZyB0aGUgcHJlZml4IG9mIG1ldGhvZCBuYW1lcyB3aGljaCB3aWxsIGJlIGludGVycHJldGVkCiAgIGFzIHRlc3QgbWV0aG9kcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxjb2Rleyd0ZXN0J30uCisgIAorICBUaGlzIGFmZmVjdHMgXG1ldGhvZHtnZXRUZXN0Q2FzZU5hbWVzKCl9IGFuZCBhbGwgdGhlCisgIFxtZXRob2R7bG9hZFRlc3RzRnJvbSooKX0gbWV0aG9kcy4KIFxlbmR7bWVtYmVyZGVzY30KIAogXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RMb2FkZXJde3NvcnRUZXN0TWV0aG9kc1VzaW5nfQogICBGdW5jdGlvbiB0byBiZSB1c2VkIHRvIGNvbXBhcmUgbWV0aG9kIG5hbWVzIHdoZW4gc29ydGluZyB0aGVtIGluCi0gIFxtZXRob2R7Z2V0VGVzdENhc2VOYW1lcygpfS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBidWlsdC1pbgotICBcZnVuY3Rpb257Y21wKCl9IGZ1bmN0aW9uOyBpdCBjYW4gYmUgc2V0IHRvIFxjb25zdGFudHtOb25lfSB0byBkaXNhYmxlCi0gIHRoZSBzb3J0LgorICBcbWV0aG9ke2dldFRlc3RDYXNlTmFtZXMoKX0gYW5kIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgorICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NtcCgpfSBmdW5jdGlvbjsgdGhlIGF0dHJpYnV0ZQorICBjYW4gYWxzbyBiZSBzZXQgdG8gXGNvbnN0YW50e05vbmV9IHRvIGRpc2FibGUgdGhlIHNvcnQuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfVtUZXN0TG9hZGVyXXtzdWl0ZUNsYXNzfQogICBDYWxsYWJsZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIGEgdGVzdCBzdWl0ZSBmcm9tIGEgbGlzdCBvZiB0ZXN0cy4KICAgTm8gbWV0aG9kcyBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCBhcmUgbmVlZGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKICAgdGhlIFxjbGFzc3tUZXN0U3VpdGV9IGNsYXNzLgorICAKKyAgVGhpcyBhZmZlY3RzIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgogXGVuZHttZW1iZXJkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxsaWIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIudGV4CmluZGV4IDBhODRjMWEuLjc1ZWUzMTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidXJsbGliLnRleAorKysgYi9Eb2MvbGliL2xpYnVybGxpYi50ZXgKQEAgLTI3MCwxMCArMjcwLDEwIEBACiBlbnZpcm9ubWVudGFsIHByb3h5IHNldHRpbmdzIHdpbGwgYmUgdXNlZCBpZiBwcmVzZW50LCBhcyBkaXNjdXNzZWQgaW4KIHRoZSBkZWZpbml0aW9uIG9mIFxmdW5jdGlvbnt1cmxvcGVuKCl9LCBhYm92ZS4KIAotQWRkaXRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMsIGNvbGxlY3RlZCBpbiBcdmFye3g1MDl9LCBhcmUgdXNlZCBmb3IKLWF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIFxmaWxle2h0dHBzOn0gc2NoZW1lLiAgVGhlIGtleXdvcmRzCi1cdmFye2tleV9maWxlfSBhbmQgXHZhcntjZXJ0X2ZpbGV9IGFyZSBzdXBwb3J0ZWQ7IGJvdGggYXJlIG5lZWRlZCB0bwotYWN0dWFsbHkgcmV0cmlldmUgYSByZXNvdXJjZSBhdCBhbiBcZmlsZXtodHRwczp9IFVSTC4KK0FkZGl0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXJzLCBjb2xsZWN0ZWQgaW4gXHZhcnt4NTA5fSwgbWF5IGJlIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbiBvZiB0aGUgY2xpZW50IHdoZW4gdXNpbmcgdGhlIFxmaWxle2h0dHBzOn0gc2NoZW1lLiAgVGhlIGtleXdvcmRzCitcdmFye2tleV9maWxlfSBhbmQgXHZhcntjZXJ0X2ZpbGV9IGFyZSBzdXBwb3J0ZWQgdG8gcHJvdmlkZSBhbiAKK1NTTCBrZXkgYW5kIGNlcnRpZmljYXRlOyBib3RoIGFyZSBuZWVkZWQgdG8gc3VwcG9ydCBjbGllbnQgYXV0aGVudGljYXRpb24uCiAKIFxjbGFzc3tVUkxvcGVuZXJ9IG9iamVjdHMgd2lsbCByYWlzZSBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9IGV4Y2VwdGlvbgogaWYgdGhlIHNlcnZlciByZXR1cm5zIGFuIGVycm9yIGNvZGUuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAppbmRleCBmNDM1MWMzLi41NDJhN2I4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4CisrKyBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKQEAgLTE5LDcgKzE5LDggQEAKIG9iamVjdC4KIAogXHZhcntkYXRhfSBtYXkgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gc2VuZCB0byB0aGUKLXNlcnZlci4gQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKK3NlcnZlciwgb3IgXGNvZGV7Tm9uZX0gaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gCitDdXJyZW50bHkgSFRUUCByZXF1ZXN0cyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSBcdmFye2RhdGF9OwogdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIGEgUE9TVCBpbnN0ZWFkIG9mIGEgR0VUIHdoZW4gdGhlIFx2YXJ7ZGF0YX0KIHBhcmFtZXRlciBpcyBwcm92aWRlZC4gIFx2YXJ7ZGF0YX0gc2hvdWxkIGJlIGEgYnVmZmVyIGluIHRoZSBzdGFuZGFyZAogXG1pbWV0eXBle2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZH0gZm9ybWF0LiAgVGhlCkBAIC05Nyw4ICs5OCwxNyBAQAogICAgIFxvcHRpb25hbHssIG9yaWdpbl9yZXFfaG9zdH1cb3B0aW9uYWx7LCB1bnZlcmlmaWFibGV9fQogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhIFVSTCByZXF1ZXN0LgogCi1cdmFye3VybH0gc2hvdWxkIGJlIGEgc3RyaW5nIHdoaWNoIGlzIGEgdmFsaWQgVVJMLiAgRm9yIGEgZGVzY3JpcHRpb24KLW9mIFx2YXJ7ZGF0YX0gc2VlIHRoZSBcbWV0aG9ke2FkZF9kYXRhKCl9IGRlc2NyaXB0aW9uLgorXHZhcnt1cmx9IHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmFsaWQgVVJMLiAgCisKK1x2YXJ7ZGF0YX0gbWF5IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgdG8gdGhlCitzZXJ2ZXIsIG9yIFxjb2Rle05vbmV9IGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIAorQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKK3RoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBcdmFye2RhdGF9CitwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuICBcdmFye2RhdGF9IHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQKK1xtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IGZvcm1hdC4gIFRoZQorXGZ1bmN0aW9ue3VybGxpYi51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlIG9mCisyLXR1cGxlcyBhbmQgcmV0dXJucyBhIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4KKwogXHZhcntoZWFkZXJzfSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmCiBcbWV0aG9ke2FkZF9oZWFkZXIoKX0gd2FzIGNhbGxlZCB3aXRoIGVhY2gga2V5IGFuZCB2YWx1ZSBhcyBhcmd1bWVudHMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXVpZC50ZXggYi9Eb2MvbGliL2xpYnV1aWQudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYnV1aWQudGV4CkBAIC0wLDAgKzEsMjM0IEBACitcc2VjdGlvbntcbW9kdWxle3V1aWR9IC0tLQorICAgICAgICAgVVVJRCBvYmplY3RzIGFjY29yZGluZyB0byBSRkMgNDEyMn0KK1xkZWNsYXJlbW9kdWxle2J1aWx0aW59e3V1aWR9CitcbW9kdWxlc3lub3BzaXN7VVVJRCBvYmplY3RzICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMpIGFjY29yZGluZyB0byBSRkMgNDEyMn0KK1xtb2R1bGVhdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAemVzdHkuY2F9Citcc2VjdGlvbmF1dGhvcntHZW9yZ2UgWW9zaGlkYX17cXVpdmVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGltbXV0YWJsZSBcY2xhc3N7VVVJRH0gb2JqZWN0cyAodGhlIFxjbGFzc3tVVUlEfSBjbGFzcykKK2FuZCB0aGUgZnVuY3Rpb25zIFxmdW5jdGlvbnt1dWlkMSgpfSwgXGZ1bmN0aW9ue3V1aWQzKCl9LAorXGZ1bmN0aW9ue3V1aWQ0KCl9LCBcZnVuY3Rpb257dXVpZDUoKX0gZm9yIGdlbmVyYXRpbmcgdmVyc2lvbiAxLCAzLCA0LAorYW5kIDUgVVVJRHMgYXMgc3BlY2lmaWVkIGluIFxyZmN7NDEyMn0uCisKK0lmIGFsbCB5b3Ugd2FudCBpcyBhIHVuaXF1ZSBJRCwgeW91IHNob3VsZCBwcm9iYWJseSBjYWxsCitcZnVuY3Rpb257dXVpZDEoKX0gb3IgXGZ1bmN0aW9ue3V1aWQ0KCl9LiAgTm90ZSB0aGF0IFxmdW5jdGlvbnt1dWlkMSgpfQorbWF5IGNvbXByb21pc2UgcHJpdmFjeSBzaW5jZSBpdCBjcmVhdGVzIGEgVVVJRCBjb250YWluaW5nIHRoZSBjb21wdXRlcidzCituZXR3b3JrIGFkZHJlc3MuICBcZnVuY3Rpb257dXVpZDQoKX0gY3JlYXRlcyBhIHJhbmRvbSBVVUlELgorCitcYmVnaW57Y2xhc3NkZXNjfXtVVUlEfXtcb3B0aW9uYWx7aGV4XG9wdGlvbmFseywgYnl0ZXNcb3B0aW9uYWx7LAorZmllbGRzXG9wdGlvbmFseywgaW50XG9wdGlvbmFseywgdmVyc2lvbn19fX19fQorCislSW5zdGFuY2VzIG9mIHRoZSBVVUlEIGNsYXNzIHJlcHJlc2VudCBVVUlEcyBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIuCislVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUsIGhhc2hhYmxlLCBhbmQgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KKyVDb252ZXJ0aW5nIGEgVVVJRCB0byBhIHN0cmluZyB3aXRoIHN0cigpIHlpZWxkcyBzb21ldGhpbmcgaW4gdGhlIGZvcm0KKyUnMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjJy4gIFRoZSBVVUlEIGNvbnN0cnVjdG9yIGFjY2VwdHMKKyVmb3VyIHBvc3NpYmxlIGZvcm1zOiBhIHNpbWlsYXIgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cywgb3IgYQorJXN0cmluZyBvZiAxNiByYXcgYnl0ZXMgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2J5dGVzJywgb3IgYSB0dXBsZSBvZgorJXNpeCBpbnRlZ2VyIGZpZWxkcyAod2l0aCAzMi1iaXQsIDE2LWJpdCwgMTYtYml0LCA4LWJpdCwgOC1iaXQsIGFuZAorJTQ4LWJpdCB2YWx1ZXMgcmVzcGVjdGl2ZWx5KSBhcyBhbiBhcmd1bWVudCBuYW1lZCAnZmllbGRzJywgb3IgYSBzaW5nbGUKKyUxMjgtYml0IGludGVnZXIgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2ludCcuCisKK0NyZWF0ZSBhIFVVSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb2YgMzIgaGV4YWRlY2ltYWwgZGlnaXRzLAorYSBzdHJpbmcgb2YgMTYgYnl0ZXMgYXMgdGhlIFx2YXJ7Ynl0ZXN9IGFyZ3VtZW50LCBhIHR1cGxlIG9mIHNpeAoraW50ZWdlcnMgKDMyLWJpdCBcdmFye3RpbWVfbG93fSwgMTYtYml0IFx2YXJ7dGltZV9taWR9LAorMTYtYml0IFx2YXJ7dGltZV9oaV92ZXJzaW9ufSwKKzgtYml0IFx2YXJ7Y2xvY2tfc2VxX2hpX3ZhcmlhbnR9LCA4LWJpdCBcdmFye2Nsb2NrX3NlcV9sb3d9LCA0OC1iaXQgXHZhcntub2RlfSkKK2FzIHRoZSBcdmFye2ZpZWxkc30gYXJndW1lbnQsIG9yIGEgc2luZ2xlIDEyOC1iaXQgaW50ZWdlciBhcyB0aGUgXHZhcntpbnR9Cithcmd1bWVudC4gIFdoZW4gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpcyBnaXZlbiwgY3VybHkgYnJhY2VzLAoraHlwaGVucywgYW5kIGEgVVJOIHByZWZpeCBhcmUgYWxsIG9wdGlvbmFsLiAgRm9yIGV4YW1wbGUsIHRoZXNlCitleHByZXNzaW9ucyBhbGwgeWllbGQgdGhlIHNhbWUgVVVJRDoKKworXGJlZ2lue3ZlcmJhdGltfQorVVVJRCgnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nKQorVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgnKQorVVVJRCgndXJuOnV1aWQ6MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JykKK1VVSUQoYnl0ZXM9J1x4MTJceDM0XHg1Nlx4NzgnKjQpCitVVUlEKGZpZWxkcz0oMHgxMjM0NTY3OCwgMHgxMjM0LCAweDU2NzgsIDB4MTIsIDB4MzQsIDB4NTY3ODEyMzQ1Njc4KSkKK1VVSUQoaW50PTB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgpCitcZW5ke3ZlcmJhdGltfQorCitFeGFjdGx5IG9uZSBvZiBcdmFye2hleH0sIFx2YXJ7Ynl0ZXN9LCBcdmFye2ZpZWxkc30sIG9yIFx2YXJ7aW50fSBtdXN0CitiZSBnaXZlbi4gIFRoZSBcdmFye3ZlcnNpb259IGFyZ3VtZW50IGlzIG9wdGlvbmFsOyBpZiBnaXZlbiwgdGhlCityZXN1bHRpbmcgVVVJRCB3aWxsIGhhdmUgaXRzIHZhcmlhbnQgYW5kIHZlcnNpb24gbnVtYmVyIHNldCBhY2NvcmRpbmcgdG8KK1JGQyA0MTIyLCBvdmVycmlkaW5nIGJpdHMgaW4gdGhlIGdpdmVuIFx2YXJ7aGV4fSwgXHZhcntieXRlc30sCitcdmFye2ZpZWxkc30sIG9yIFx2YXJ7aW50fS4KKworXGVuZHtjbGFzc2Rlc2N9CisKK1xjbGFzc3tVVUlEfSBpbnN0YW5jZXMgaGF2ZSB0aGVzZSByZWFkLW9ubHkgYXR0cmlidXRlczoKKworXGJlZ2lue21lbWJlcmRlc2N9e2J5dGVzfQorVGhlIFVVSUQgYXMgYSAxNi1ieXRlIHN0cmluZy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2ZpZWxkc30KK0EgdHVwbGUgb2YgdGhlIHNpeCBpbnRlZ2VyIGZpZWxkcyBvZiB0aGUgVVVJRCwgd2hpY2ggYXJlIGFsc28gYXZhaWxhYmxlCithcyBzaXggaW5kaXZpZHVhbCBhdHRyaWJ1dGVzIGFuZCB0d28gZGVyaXZlZCBhdHRyaWJ1dGVzOgorCitcYmVnaW57dGFibGVpaX17bHxsfXttZW1iZXJ9e0ZpZWxkfXtNZWFuaW5nfQorICBcbGluZWlpe3RpbWVfbG93fXt0aGUgZmlyc3QgMzIgYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lX21pZH17dGhlIG5leHQgMTYgYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lX2hpX3ZlcnNpb259e3RoZSBuZXh0IDE2IGJpdHMgb2YgdGhlIFVVSUR9CisgIFxsaW5laWl7Y2xvY2tfc2VxX2hpX3ZhcmlhbnR9e3RoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXtjbG9ja19zZXFfbG93fXt0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUR9CisgIFxsaW5laWl7bm9kZX17dGhlIGxhc3QgNDggYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lfXt0aGUgNjAtYml0IHRpbWVzdGFtcH0KKyAgXGxpbmVpaXtjbG9ja19zZXF9e3RoZSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyfQorXGVuZHt0YWJsZWlpfQorCisKK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2hleH0KK1RoZSBVVUlEIGFzIGEgMzItY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2ludH0KK1RoZSBVVUlEIGFzIGEgMTI4LWJpdCBpbnRlZ2VyLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dXJufQorVGhlIFVVSUQgYXMgYSBVUk4gYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dmFyaWFudH0KK1RoZSBVVUlEIHZhcmlhbnQsIHdoaWNoIGRldGVybWluZXMgdGhlIGludGVybmFsIGxheW91dCBvZiB0aGUgVVVJRC4KK1RoaXMgd2lsbCBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9uZSBvZiB0aGUgY29uc3RhbnRzCitcY29uc3RhbnR7UkVTRVJWRURfTkNTfSwKK1xjb25zdGFudHtSRkNfNDEyMn0sIFxjb25zdGFudHtSRVNFUlZFRF9NSUNST1NPRlR9LCBvcgorXGNvbnN0YW50e1JFU0VSVkVEX0ZVVFVSRX0pLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dmVyc2lvbn0KK1RoZSBVVUlEIHZlcnNpb24gbnVtYmVyICgxIHRocm91Z2ggNSwgbWVhbmluZ2Z1bCBvbmx5Cit3aGVuIHRoZSB2YXJpYW50IGlzIFxjb25zdGFudHtSRkNfNDEyMn0pLgorXGVuZHttZW1iZXJkZXNjfQorCitUaGUgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucworCitcYmVnaW57ZnVuY2Rlc2N9e2dldG5vZGV9e30KK0dldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcyBhIDQ4LWJpdCBwb3NpdGl2ZSBpbnRlZ2VyLiAgVGhlIGZpcnN0IHRpbWUgdGhpcworcnVucywgaXQgbWF5IGxhdW5jaCBhIHNlcGFyYXRlIHByb2dyYW0sIHdoaWNoIGNvdWxkIGJlIHF1aXRlIHNsb3cuICBJZiBhbGwKK2F0dGVtcHRzIHRvIG9idGFpbiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmYWlsLCB3ZSBjaG9vc2UgYSByYW5kb20gNDgtYml0CitudW1iZXIgd2l0aCBpdHMgZWlnaHRoIGJpdCBzZXQgdG8gMSBhcyByZWNvbW1lbmRlZCBpbiBSRkMgNDEyMi4gICJIYXJkd2FyZQorYWRkcmVzcyIgbWVhbnMgdGhlIE1BQyBhZGRyZXNzIG9mIGEgbmV0d29yayBpbnRlcmZhY2UsIGFuZCBvbiBhIG1hY2hpbmUKK3dpdGggbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzIHRoZSBNQUMgYWRkcmVzcyBvZiBhbnkgb25lIG9mIHRoZW0gbWF5CitiZSByZXR1cm5lZC4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7Z2V0bm9kZX0KKworXGJlZ2lue2Z1bmNkZXNjfXt1dWlkMX17XG9wdGlvbmFse25vZGVcb3B0aW9uYWx7LCBjbG9ja19zZXF9fX0KK0dlbmVyYXRlIGEgVVVJRCBmcm9tIGEgaG9zdCBJRCwgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGhlIGN1cnJlbnQgdGltZS4KK0lmIFx2YXJ7bm9kZX0gaXMgbm90IGdpdmVuLCBcZnVuY3Rpb257Z2V0bm9kZSgpfSBpcyB1c2VkIHRvIG9idGFpbiB0aGUKK2hhcmR3YXJlIGFkZHJlc3MuCitJZiBcdmFye2Nsb2NrX3NlcX0gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHNlcXVlbmNlIG51bWJlcjsKK290aGVyd2lzZSBhIHJhbmRvbSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyIGlzIGNob3Nlbi4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDF9CisKK1xiZWdpbntmdW5jZGVzY317dXVpZDN9e25hbWVzcGFjZSwgbmFtZX0KK0dlbmVyYXRlIGEgVVVJRCBiYXNlZCB1cG9uIGEgTUQ1IGhhc2ggb2YgdGhlIFx2YXJ7bmFtZX0gc3RyaW5nIHZhbHVlCitkcmF3biBmcm9tIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS4gICBcdmFye25hbWVzcGFjZX0KK211c3QgYmUgb25lIG9mIFxjb25zdGFudHtOQU1FU1BBQ0VfRE5TfSwKK1xjb25zdGFudHtOQU1FU1BBQ0VfVVJMfSwgXGNvbnN0YW50e05BTUVTUEFDRV9PSUR9LAorb3IgXGNvbnN0YW50e05BTUVTUEFDRV9YNTAwfS4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDN9CisKK1xiZWdpbntmdW5jZGVzY317dXVpZDR9e30KK0dlbmVyYXRlIGEgcmFuZG9tIFVVSUQuCitcZW5ke2Z1bmNkZXNjfQorXGluZGV4e3V1aWQ0fQorCitcYmVnaW57ZnVuY2Rlc2N9e3V1aWQ1fXtuYW1lc3BhY2UsIG5hbWV9CitHZW5lcmF0ZSBhIFVVSUQgYmFzZWQgdXBvbiBhIFNIQS0xIGhhc2ggb2YgdGhlIFx2YXJ7bmFtZX0gc3RyaW5nIHZhbHVlCitkcmF3biBmcm9tIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS4gICBcdmFye25hbWVzcGFjZX0KK211c3QgYmUgb25lIG9mIFxjb25zdGFudHtOQU1FU1BBQ0VfRE5TfSwKK1xjb25zdGFudHtOQU1FU1BBQ0VfVVJMfSwgXGNvbnN0YW50e05BTUVTUEFDRV9PSUR9LAorb3IgXGNvbnN0YW50e05BTUVTUEFDRV9YNTAwfS4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDV9CisKK1RoZSBcbW9kdWxle3V1aWR9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbmFtZXNwYWNlIGNvbnN0YW50cworZm9yIHVzZSB3aXRoIFxmdW5jdGlvbnt1dWlkMygpfSBvciBcZnVuY3Rpb257dXVpZDUoKX0uCisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX0ROU30KK0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSBuYW1lc3BhY2UgVVVJRC4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX1VSTH0KK1VSTCBuYW1lc3BhY2UgVVVJRC4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX09JRH0KK0lTTyBPSUQgbmFtZXNwYWNlIFVVSUQuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e05BTUVTUEFDRV9YNTAwfQorWC41MDAgRE4gbmFtZXNwYWNlIFVVSUQuCitcZW5ke2RhdGFkZXNjfQorCitUaGUgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIFxtZW1iZXJ7dmFyaWFudH0gYXR0cmlidXRlOgorCitcYmVnaW57ZGF0YWRlc2N9e1JFU0VSVkVEX05DU30KK1Jlc2VydmVkIGZvciBOQ1MgY29tcGF0aWJpbGl0eS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317UkZDXzQxMjJ9CitVc2VzIFVVSUQgbGF5b3V0IHNwZWNpZmllZCBpbiBccmZjezQxMjJ9LgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtSRVNFUlZFRF9NSUNST1NPRlR9CitSZXNlcnZlZCBmb3IgTWljcm9zb2Z0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1JFU0VSVkVEX0ZVVFVSRX0KK1Jlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbi4KK1xlbmR7ZGF0YWRlc2N9CisKKworXGJlZ2lue3NlZWFsc299CisgIFxzZWVyZmN7NDEyMn17QSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOIE5hbWVzcGFjZX17CisgICAgICAgICAgVGhpcyBzcGVjaWZpZXMgYSBVbmlmb3JtIFJlc291cmNlIE5hbWUgbmFtZXNwYWNlIGZvciBVVUlEcy59CitcZW5ke3NlZWFsc299CisKK1xzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3V1aWQtZXhhbXBsZX19CisKK0hlcmUgaXMgYSB0eXBpY2FsIHVzYWdlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGltcG9ydCB1dWlkCisKKyMgbWFrZSBhIFVVSUQgYmFzZWQgb24gdGhlIGhvc3QgSUQgYW5kIGN1cnJlbnQgdGltZQorPj4+IHV1aWQudXVpZDEoKQorVVVJRCgnYTgwOThjMWEtZjg2ZS0xMWRhLWJkMWEtMDAxMTI0NDRiZTFlJykKKworIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKz4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworIyBtYWtlIGEgcmFuZG9tIFVVSUQKKz4+PiB1dWlkLnV1aWQ0KCkKK1VVSUQoJzE2ZmQyNzA2LThiYWYtNDMzYi04MmViLThjN2ZhZGE4NDdkYScpCisKKyMgbWFrZSBhIFVVSUQgdXNpbmcgYSBTSEEtMSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQorPj4+IHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCitVVUlEKCc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKQorCisjIG1ha2UgYSBVVUlEIGZyb20gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyAoYnJhY2VzIGFuZCBoeXBoZW5zIGlnbm9yZWQpCis+Pj4geCA9IHV1aWQuVVVJRCgnezAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZn0nKQorCisjIGNvbnZlcnQgYSBVVUlEIHRvIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaW4gc3RhbmRhcmQgZm9ybQorPj4+IHN0cih4KQorJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicKKworIyBnZXQgdGhlIHJhdyAxNiBieXRlcyBvZiB0aGUgVVVJRAorPj4+IHguYnl0ZXMKKydceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuXHgwYlx4MGNcclx4MGVceDBmJworCisjIG1ha2UgYSBVVUlEIGZyb20gYSAxNi1ieXRlIHN0cmluZworPj4+IHV1aWQuVVVJRChieXRlcz14LmJ5dGVzKQorVVVJRCgnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJykKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndhcm5pbmdzLnRleCBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CmluZGV4IDdiODI5YTAuLjA4YzAzNDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlid2FybmluZ3MudGV4CisrKyBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CkBAIC03MSw2ICs3MSwxMSBAQAogXGxpbmVpaXtGdXR1cmVXYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBjb25zdHJ1Y3RzCiB0aGF0IHdpbGwgY2hhbmdlIHNlbWFudGljYWxseSBpbiB0aGUgZnV0dXJlLn0KIAorXGxpbmVpaXtQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dAorZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZSAoaWdub3JlZCBieSBkZWZhdWx0KS59CisKK1xsaW5laWl7SW1wb3J0V2FybmluZ317QmFzZSBjYXRlZ29yeSBmb3Igd2FybmluZ3MgdHJpZ2dlcmVkIGR1cmluZyB0aGUKK3Byb2Nlc3Mgb2YgaW1wb3J0aW5nIGEgbW9kdWxlIChpZ25vcmVkIGJ5IGRlZmF1bHQpLn0KIFxlbmR7dGFibGVpaX0KIAogV2hpbGUgdGhlc2UgYXJlIHRlY2huaWNhbGx5IGJ1aWx0LWluIGV4Y2VwdGlvbnMsIHRoZXkgYXJlIGRvY3VtZW50ZWQKQEAgLTE0Myw2ICsxNDgsMTcgQEAKIGl0IGlzIGZpcnN0IGltcG9ydGVkIChpbnZhbGlkIG9wdGlvbnMgYXJlIGlnbm9yZWQsIGFmdGVyIHByaW50aW5nIGEKIG1lc3NhZ2UgdG8gXGNvZGV7c3lzLnN0ZGVycn0pLgogCitUaGUgd2FybmluZ3MgdGhhdCBhcmUgaWdub3JlZCBieSBkZWZhdWx0IG1heSBiZSBlbmFibGVkIGJ5IHBhc3NpbmcKKyBccHJvZ3JhbW9wdHstV2R9IHRvIHRoZSBpbnRlcnByZXRlci4gVGhpcyBlbmFibGVzIGRlZmF1bHQgaGFuZGxpbmcKK2ZvciBhbGwgd2FybmluZ3MsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBub3JtYWxseSBpZ25vcmVkIGJ5CitkZWZhdWx0LiBUaGlzIGlzIHBhcnRpY3VsYXIgdXNlZnVsIGZvciBlbmFibGluZyBJbXBvcnRXYXJuaW5nIHdoZW4KK2RlYnVnZ2luZyBwcm9ibGVtcyBpbXBvcnRpbmcgYSBkZXZlbG9wZWQgcGFja2FnZS4gSW1wb3J0V2FybmluZyBjYW4KK2Fsc28gYmUgZW5hYmxlZCBleHBsaWNpdGx5IGluIFB5dGhvbiBjb2RlIHVzaW5nOgorCitcYmVnaW57dmVyYmF0aW19CisgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgSW1wb3J0V2FybmluZykKK1xlbmR7dmVyYmF0aW19CisKIAogXHN1YnNlY3Rpb257QXZhaWxhYmxlIEZ1bmN0aW9ucyBcbGFiZWx7d2FybmluZy1mdW5jdGlvbnN9fQogCkBAIC0yMDksMTQgKzIyNSwyNiBAQAogaW5zZXJ0ZWQgYXQgdGhlIGZyb250IGJ5IGRlZmF1bHQ7IGlmIFx2YXJ7YXBwZW5kfSBpcyB0cnVlLCBpdCBpcwogaW5zZXJ0ZWQgYXQgdGhlIGVuZC4KIFRoaXMgY2hlY2tzIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLCBjb21waWxlcyB0aGUgbWVzc2FnZSBhbmQKLW1vZHVsZSByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgaW5zZXJ0cyB0aGVtIGFzIGEgdHVwbGUgaW4gZnJvbnQKLW9mIHRoZSB3YXJuaW5ncyBmaWx0ZXIuICBFbnRyaWVzIGluc2VydGVkIGxhdGVyIG92ZXJyaWRlIGVudHJpZXMKLWluc2VydGVkIGVhcmxpZXIsIGlmIGJvdGggbWF0Y2ggYSBwYXJ0aWN1bGFyIHdhcm5pbmcuICBPbWl0dGVkCi1hcmd1bWVudHMgZGVmYXVsdCB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nLgorbW9kdWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFuZCBpbnNlcnRzIHRoZW0gYXMgYSB0dXBsZSBpbiB0aGUgCitsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMuICBFbnRyaWVzIGNsb3NlciB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKK292ZXJyaWRlIGVudHJpZXMgbGF0ZXIgaW4gdGhlIGxpc3QsIGlmIGJvdGggbWF0Y2ggYSBwYXJ0aWN1bGFyCit3YXJuaW5nLiAgT21pdHRlZCBhcmd1bWVudHMgZGVmYXVsdCB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcworZXZlcnl0aGluZy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2ltcGxlZmlsdGVyfXthY3Rpb25cb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICBjYXRlZ29yeVxvcHRpb25hbHssCisgICAgICAgICAgICAgICAgIGxpbmVub1xvcHRpb25hbHssIGFwcGVuZH19fX0KK0luc2VydCBhIHNpbXBsZSBlbnRyeSBpbnRvIHRoZSBsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMuIFRoZSBtZWFuaW5nCitvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBhcyBmb3IgXGZ1bmN0aW9ue2ZpbHRlcndhcm5pbmdzKCl9LCBidXQKK3JlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG5vdCBuZWVkZWQgYXMgdGhlIGZpbHRlciBpbnNlcnRlZCBhbHdheXMKK21hdGNoZXMgYW55IG1lc3NhZ2UgaW4gYW55IG1vZHVsZSBhcyBsb25nIGFzIHRoZSBjYXRlZ29yeSBhbmQgbGluZQorbnVtYmVyIG1hdGNoLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtyZXNldHdhcm5pbmdzfXt9CiBSZXNldCB0aGUgd2FybmluZ3MgZmlsdGVyLiAgVGhpcyBkaXNjYXJkcyB0aGUgZWZmZWN0IG9mIGFsbCBwcmV2aW91cwogY2FsbHMgdG8gXGZ1bmN0aW9ue2ZpbHRlcndhcm5pbmdzKCl9LCBpbmNsdWRpbmcgdGhhdCBvZiB0aGUKLVxwcm9ncmFtb3B0ey1XfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KK1xwcm9ncmFtb3B0ey1XfSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgY2FsbHMgdG8KK1xmdW5jdGlvbntzaW1wbGVmaWx0ZXIoKX0uCiBcZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleCBiL0RvYy9saWIvbGlid2Vha3JlZi50ZXgKaW5kZXggZmM5NDllNi4uNmY2NzZhMiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleAorKysgYi9Eb2MvbGliL2xpYndlYWtyZWYudGV4CkBAIC02NSwxMCArNjUsMTQgQEAKIG9iaiA9IERpY3QocmVkPTEsIGdyZWVuPTIsIGJsdWU9MykgICAjIHRoaXMgb2JqZWN0IGlzIHdlYWsgcmVmZXJlbmNhYmxlCiBcZW5ke3ZlcmJhdGltfQogCi1FeHRlbnNpb24gdHlwZXMgY2FuIGVhc2lseSBiZSBtYWRlIHRvIHN1cHBvcnQgd2VhayByZWZlcmVuY2VzOyBzZWUgc2VjdGlvbgotXHJlZnt3ZWFrcmVmLWV4dGVuc2lvbn0sIGBgV2VhayBSZWZlcmVuY2VzIGluIEV4dGVuc2lvbiBUeXBlcywnJyBmb3IgbW9yZQotaW5mb3JtYXRpb24uCi0KK0V4dGVuc2lvbiB0eXBlcyBjYW4gZWFzaWx5IGJlIG1hZGUgdG8gc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXM7IHNlZQorYGBcdWxpbmt7V2VhayBSZWZlcmVuY2UgU3VwcG9ydH17Li4vZXh0L3dlYWtyZWYtc3VwcG9ydC5odG1sfScnIGluCitcY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbgorSW50ZXJwcmV0ZXJ9LgorJSBUaGUgcmVmZXJlbmNlZCBzZWN0aW9uIHVzZWQgdG8gYXBwZWFyIGluIHRoaXMgZG9jdW1lbnQgd2l0aCB0aGUKKyUgXGxhYmVsIHdlYWtyZWYtZXh0ZW5zaW9uLiAgSXQgd291bGQgYmUgZ29vZCB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIGEKKyUgcmVkaXJlY3QgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgcGFnZSAod2Vha3JlZi1leHRlbnNpb24uaHRtbCkKKyUgZm9yIG9uLWxpbmUgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudC4KIAogXGJlZ2lue2NsYXNzZGVzY317cmVmfXtvYmplY3Rcb3B0aW9uYWx7LCBjYWxsYmFja319CiAgIFJldHVybiBhIHdlYWsgcmVmZXJlbmNlIHRvIFx2YXJ7b2JqZWN0fS4gIFRoZSBvcmlnaW5hbCBvYmplY3QgY2FuIGJlCkBAIC0zMzAsODMgKzMzNCwzIEBACiBkZWYgaWQyb2JqKG9pZCk6CiAgICAgcmV0dXJuIF9pZDJvYmpfZGljdFtvaWRdCiBcZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue1dlYWsgUmVmZXJlbmNlcyBpbiBFeHRlbnNpb24gVHlwZXMKLSAgICAgICAgICAgIFxsYWJlbHt3ZWFrcmVmLWV4dGVuc2lvbn19Ci0KLU9uZSBvZiB0aGUgZ29hbHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIHRvIGFsbG93IGFueSB0eXBlIHRvCi1wYXJ0aWNpcGF0ZSBpbiB0aGUgd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtIHdpdGhvdXQgaW5jdXJyaW5nIHRoZQotb3ZlcmhlYWQgb24gdGhvc2Ugb2JqZWN0cyB3aGljaCBkbyBub3QgYmVuZWZpdCBieSB3ZWFrIHJlZmVyZW5jaW5nCi0oc3VjaCBhcyBudW1iZXJzKS4KLQotRm9yIGFuIG9iamVjdCB0byBiZSB3ZWFrbHkgcmVmZXJlbmNhYmxlLCB0aGUgZXh0ZW5zaW9uIG11c3QgaW5jbHVkZSBhCi1cY3R5cGV7UHlPYmplY3QqfSBmaWVsZCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgdXNlIG9mIHRoZQotd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtOyBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIFxOVUxMe30gYnkgdGhlCi1vYmplY3QncyBjb25zdHJ1Y3Rvci4gIEl0IG11c3QgYWxzbyBzZXQgdGhlIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9Ci1maWVsZCBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIG9iamVjdCB0byB0aGUgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KLUFsc28sIGl0IG5lZWRzIHRvIGFkZCBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTfSB0byB0aGUKLXRwX2ZsYWdzIHNsb3QuICBGb3IgZXhhbXBsZSwgdGhlIGluc3RhbmNlIHR5cGUgaXMgZGVmaW5lZCB3aXRoIHRoZQotZm9sbG93aW5nIHN0cnVjdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeUNsYXNzT2JqZWN0ICppbl9jbGFzczsgICAgICAgLyogVGhlIGNsYXNzIG9iamVjdCAqLwotICAgIFB5T2JqZWN0ICAgICAgKmluX2RpY3Q7ICAgICAgICAvKiBBIGRpY3Rpb25hcnkgKi8KLSAgICBQeU9iamVjdCAgICAgICppbl93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KLX0gUHlJbnN0YW5jZU9iamVjdDsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzdGF0aWNhbGx5LWRlY2xhcmVkIHR5cGUgb2JqZWN0IGZvciBpbnN0YW5jZXMgaXMgZGVmaW5lZCB0aGlzIHdheToKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlUeXBlT2JqZWN0IFB5SW5zdGFuY2VfVHlwZSA9IHsKLSAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotICAgIDAsCi0gICAgIm1vZHVsZS5pbnN0YW5jZSIsCi0KLSAgICAvKiBMb3RzIG9mIHN0dWZmIG9taXR0ZWQgZm9yIGJyZXZpdHkuLi4gKi8KLQotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyAgIC8qIHRwX2ZsYWdzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHR5cGUgY29uc3RydWN0b3IgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgd2VhayByZWZlcmVuY2UKLWxpc3QgdG8gXE5VTEw6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU9iamVjdCAqCi1pbnN0YW5jZV9uZXcoKSB7Ci0gICAgLyogT3RoZXIgaW5pdGlhbGl6YXRpb24gc3R1ZmYgb21pdHRlZCBmb3IgYnJldml0eSAqLwotCi0gICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwotCi0gICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG9ubHkgZnVydGhlciBhZGRpdGlvbiBpcyB0aGF0IHRoZSBkZXN0cnVjdG9yIG5lZWRzIHRvIGNhbGwgdGhlCi13ZWFrIHJlZmVyZW5jZSBtYW5hZ2VyIHRvIGNsZWFyIGFueSB3ZWFrIHJlZmVyZW5jZXMuICBUaGlzIHNob3VsZCBiZQotZG9uZSBiZWZvcmUgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBkZXN0cnVjdGlvbiBoYXZlIG9jY3VycmVkLCBidXQgaXMKLW9ubHkgcmVxdWlyZWQgaWYgdGhlIHdlYWsgcmVmZXJlbmNlIGxpc3QgaXMgbm9uLVxOVUxMOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgdm9pZAotaW5zdGFuY2VfZGVhbGxvYyhQeUluc3RhbmNlT2JqZWN0ICppbnN0KQotewotICAgIC8qIEFsbG9jYXRlIHRlbXBvcmFyaWVzIGlmIG5lZWRlZCwgYnV0IGRvIG5vdCBiZWdpbgotICAgICAgIGRlc3RydWN0aW9uIGp1c3QgeWV0LgotICAgICAqLwotCi0gICAgaWYgKGluc3QtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCi0gICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGluc3QpOwotCi0gICAgLyogUHJvY2VlZCB3aXRoIG9iamVjdCBkZXN0cnVjdGlvbiBub3JtYWxseS4gKi8KLX0KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4IGIvRG9jL2xpYi9saWJ3ZWJicm93c2VyLnRleAppbmRleCBlODZiNTc4Li4xMWQ3N2ExIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4CisrKyBiL0RvYy9saWIvbGlid2ViYnJvd3Nlci50ZXgKQEAgLTEzNiw2ICsxMzYsMTggQEAKIE9ubHkgb24gTWFjT1MgWCBwbGF0Zm9ybS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKK0hlcmUgYXJlIHNvbWUgc2ltcGxlIGV4YW1wbGVzOgorCitcYmVnaW57dmVyYmF0aW19Cit1cmwgPSAnaHR0cDovL3d3dy5weXRob24ub3JnJworCisjIE9wZW4gVVJMIGluIGEgbmV3IHRhYiwgaWYgYSBicm93c2VyIHdpbmRvdyBpcyBhbHJlYWR5IG9wZW4uIAord2ViYnJvd3Nlci5vcGVuX25ld190YWIodXJsICsgJy9kb2MnKQorCisjIE9wZW4gVVJMIGluIG5ldyB3aW5kb3csIHJhaXNpbmcgdGhlIHdpbmRvdyBpZiBwb3NzaWJsZS4KK3dlYmJyb3dzZXIub3Blbl9uZXcodXJsKQorXGVuZHt2ZXJiYXRpbX0KKwogCiBcc3Vic2VjdGlvbntCcm93c2VyIENvbnRyb2xsZXIgT2JqZWN0cyBcbGFiZWx7YnJvd3Nlci1jb250cm9sbGVyc319CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlid3NnaXJlZi50ZXggYi9Eb2MvbGliL2xpYndzZ2lyZWYudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMTJlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYndzZ2lyZWYudGV4CkBAIC0wLDAgKzEsNzgxIEBACitcc2VjdGlvbntcbW9kdWxle3dzZ2lyZWZ9IC0tLSBXU0dJIFV0aWxpdGllcyBhbmQgUmVmZXJlbmNlCitJbXBsZW1lbnRhdGlvbn0KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZn0KK1xtb2R1bGVhdXRob3J7UGhpbGxpcCBKLiBFYnl9e3BqZUB0ZWxlY29tbXVuaXR5LmNvbX0KK1xzZWN0aW9uYXV0aG9ye1BoaWxsaXAgSi4gRWJ5fXtwamVAdGVsZWNvbW11bml0eS5jb219CitcbW9kdWxlc3lub3BzaXN7V1NHSSBVdGlsaXRpZXMgYW5kIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbn0KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoZSBXZWIgU2VydmVyIEdhdGV3YXkgSW50ZXJmYWNlIChXU0dJKSBpcyBhIHN0YW5kYXJkIGludGVyZmFjZQorYmV0d2VlbiB3ZWIgc2VydmVyIHNvZnR3YXJlIGFuZCB3ZWIgYXBwbGljYXRpb25zIHdyaXR0ZW4gaW4gUHl0aG9uLgorSGF2aW5nIGEgc3RhbmRhcmQgaW50ZXJmYWNlIG1ha2VzIGl0IGVhc3kgdG8gdXNlIGFuIGFwcGxpY2F0aW9uCit0aGF0IHN1cHBvcnRzIFdTR0kgd2l0aCBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2ViIHNlcnZlcnMuCisKK09ubHkgYXV0aG9ycyBvZiB3ZWIgc2VydmVycyBhbmQgcHJvZ3JhbW1pbmcgZnJhbWV3b3JrcyBuZWVkIHRvIGtub3cKK2V2ZXJ5IGRldGFpbCBhbmQgY29ybmVyIGNhc2Ugb2YgdGhlIFdTR0kgZGVzaWduLiAgWW91IGRvbid0IG5lZWQgdG8KK3VuZGVyc3RhbmQgZXZlcnkgZGV0YWlsIG9mIFdTR0kganVzdCB0byBpbnN0YWxsIGEgV1NHSSBhcHBsaWNhdGlvbiBvcgordG8gd3JpdGUgYSB3ZWIgYXBwbGljYXRpb24gdXNpbmcgYW4gZXhpc3RpbmcgZnJhbWV3b3JrLgorCitcbW9kdWxle3dzZ2lyZWZ9IGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0dJIHNwZWNpZmljYXRpb24KK3RoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIFdTR0kgc3VwcG9ydCB0byBhIHdlYiBzZXJ2ZXIgb3IgZnJhbWV3b3JrLiAgSXQKK3Byb3ZpZGVzIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIFdTR0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorcmVzcG9uc2UgaGVhZGVycywgYmFzZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgV1NHSSBzZXJ2ZXJzLCBhIGRlbW8KK0hUVFAgc2VydmVyIHRoYXQgc2VydmVzIFdTR0kgYXBwbGljYXRpb25zLCBhbmQgYSB2YWxpZGF0aW9uIHRvb2wgdGhhdAorY2hlY2tzIFdTR0kgc2VydmVycyBhbmQgYXBwbGljYXRpb25zIGZvciBjb25mb3JtYW5jZSB0byB0aGUKK1dTR0kgc3BlY2lmaWNhdGlvbiAoXHBlcHszMzN9KS4KKworJSBYWFggSWYgeW91J3JlIGp1c3QgdHJ5aW5nIHRvIHdyaXRlIGEgd2ViIGFwcGxpY2F0aW9uLi4uCislIFhYWCBzaG91bGQgY3JlYXRlIGEgVVJMIG9uIHB5dGhvbi5vcmcgdG8gcG9pbnQgcGVvcGxlIHRvLgorCisKKworCisKKworCisKKworCisKKworCisKK1xzdWJzZWN0aW9ue1xtb2R1bGV7d3NnaXJlZi51dGlsfSAtLSBXU0dJIGVudmlyb25tZW50IHV0aWxpdGllc30KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZi51dGlsfQorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHZhcmlldHkgb2YgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aAorV1NHSSBlbnZpcm9ubWVudHMuICBBIFdTR0kgZW52aXJvbm1lbnQgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcKK0hUVFAgcmVxdWVzdCB2YXJpYWJsZXMgYXMgZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIEFsbCBvZiB0aGUgZnVuY3Rpb25zCit0YWtpbmcgYW4gXHZhcntlbnZpcm9ufSBwYXJhbWV0ZXIgZXhwZWN0IGEgV1NHSS1jb21wbGlhbnQgZGljdGlvbmFyeSB0bworYmUgc3VwcGxpZWQ7IHBsZWFzZSBzZWUgXHBlcHszMzN9IGZvciBhIGRldGFpbGVkIHNwZWNpZmljYXRpb24uCisKK1xiZWdpbntmdW5jZGVzY317Z3Vlc3Nfc2NoZW1lfXtlbnZpcm9ufQorUmV0dXJuIGEgZ3Vlc3MgZm9yIHdoZXRoZXIgXGNvZGV7d3NnaS51cmxfc2NoZW1lfSBzaG91bGQgYmUgYGBodHRwJycgb3IKK2BgaHR0cHMnJywgYnkgY2hlY2tpbmcgZm9yIGEgXGNvZGV7SFRUUFN9IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZQorXHZhcntlbnZpcm9ufSBkaWN0aW9uYXJ5LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZy4KKworVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiBjcmVhdGluZyBhIGdhdGV3YXkgdGhhdCB3cmFwcyBDR0kgb3IgYQorQ0dJLWxpa2UgcHJvdG9jb2wgc3VjaCBhcyBGYXN0Q0dJLiAgVHlwaWNhbGx5LCBzZXJ2ZXJzIHByb3ZpZGluZyBzdWNoCitwcm90b2NvbHMgd2lsbCBpbmNsdWRlIGEgXGNvZGV7SFRUUFN9IHZhcmlhYmxlIHdpdGggYSB2YWx1ZSBvZiBgYDEnJworYGB5ZXMnJywgb3IgYGBvbicnIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIHZpYSBTU0wuICBTbywgdGhpcworZnVuY3Rpb24gcmV0dXJucyBgYGh0dHBzJycgaWYgc3VjaCBhIHZhbHVlIGlzIGZvdW5kLCBhbmQgYGBodHRwJycKK290aGVyd2lzZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317cmVxdWVzdF91cml9e2Vudmlyb24gXG9wdGlvbmFseywgaW5jbHVkZV9xdWVyeT0xfX0KK1JldHVybiB0aGUgZnVsbCByZXF1ZXN0IFVSSSwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHF1ZXJ5IHN0cmluZywKK3VzaW5nIHRoZSBhbGdvcml0aG0gZm91bmQgaW4gdGhlIGBgVVJMIFJlY29uc3RydWN0aW9uJycgc2VjdGlvbiBvZgorXHBlcHszMzN9LiAgSWYgXHZhcntpbmNsdWRlX3F1ZXJ5fSBpcyBmYWxzZSwgdGhlIHF1ZXJ5IHN0cmluZyBpcworbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgVVJJLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthcHBsaWNhdGlvbl91cml9e2Vudmlyb259CitTaW1pbGFyIHRvIFxmdW5jdGlvbntyZXF1ZXN0X3VyaX0sIGV4Y2VwdCB0aGF0IHRoZSBcY29kZXtQQVRIX0lORk99IGFuZAorXGNvZGV7UVVFUllfU1RSSU5HfSB2YXJpYWJsZXMgYXJlIGlnbm9yZWQuICBUaGUgcmVzdWx0IGlzIHRoZSBiYXNlIFVSSQorb2YgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBhZGRyZXNzZWQgYnkgdGhlIHJlcXVlc3QuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3NoaWZ0X3BhdGhfaW5mb317ZW52aXJvbn0KK1NoaWZ0IGEgc2luZ2xlIG5hbWUgZnJvbSBcY29kZXtQQVRIX0lORk99IHRvIFxjb2Rle1NDUklQVF9OQU1FfSBhbmQKK3JldHVybiB0aGUgbmFtZS4gIFRoZSBcdmFye2Vudmlyb259IGRpY3Rpb25hcnkgaXMgXGVtcGh7bW9kaWZpZWR9Citpbi1wbGFjZTsgdXNlIGEgY29weSBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBvcmlnaW5hbCBcY29kZXtQQVRIX0lORk99CitvciBcY29kZXtTQ1JJUFRfTkFNRX0gaW50YWN0LgorCitJZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHBhdGggc2VnbWVudHMgaW4gXGNvZGV7UEFUSF9JTkZPfSwgXGNvZGV7Tm9uZX0KK2lzIHJldHVybmVkLgorCitUeXBpY2FsbHksIHRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHByb2Nlc3MgZWFjaCBwb3J0aW9uIG9mIGEgcmVxdWVzdAorVVJJIHBhdGgsIGZvciBleGFtcGxlIHRvIHRyZWF0IHRoZSBwYXRoIGFzIGEgc2VyaWVzIG9mIGRpY3Rpb25hcnkga2V5cy4KK1RoaXMgcm91dGluZSBtb2RpZmllcyB0aGUgcGFzc2VkLWluIGVudmlyb25tZW50IHRvIG1ha2UgaXQgc3VpdGFibGUgZm9yCitpbnZva2luZyBhbm90aGVyIFdTR0kgYXBwbGljYXRpb24gdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSB0YXJnZXQgVVJJLgorRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGEgV1NHSSBhcHBsaWNhdGlvbiBhdCBcY29kZXsvZm9vfSwgYW5kIHRoZQorcmVxdWVzdCBVUkkgcGF0aCBpcyBcY29kZXsvZm9vL2Jhci9iYXp9LCBhbmQgdGhlIFdTR0kgYXBwbGljYXRpb24gYXQKK1xjb2Rley9mb299IGNhbGxzIFxmdW5jdGlvbntzaGlmdF9wYXRoX2luZm99LCBpdCB3aWxsIHJlY2VpdmUgdGhlIHN0cmluZworYGBiYXInJywgYW5kIHRoZSBlbnZpcm9ubWVudCB3aWxsIGJlIHVwZGF0ZWQgdG8gYmUgc3VpdGFibGUgZm9yIHBhc3NpbmcKK3RvIGEgV1NHSSBhcHBsaWNhdGlvbiBhdCBcY29kZXsvZm9vL2Jhcn0uICBUaGF0IGlzLCBcY29kZXtTQ1JJUFRfTkFNRX0KK3dpbGwgY2hhbmdlIGZyb20gXGNvZGV7L2Zvb30gdG8gXGNvZGV7L2Zvby9iYXJ9LCBhbmQgXGNvZGV7UEFUSF9JTkZPfQord2lsbCBjaGFuZ2UgZnJvbSBcY29kZXsvYmFyL2Jhen0gdG8gXGNvZGV7L2Jhen0uCisKK1doZW4gXGNvZGV7UEFUSF9JTkZPfSBpcyBqdXN0IGEgYGAvJycsIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVtcHR5CitzdHJpbmcgYW5kIGFwcGVuZHMgYSB0cmFpbGluZyBzbGFzaCB0byBcY29kZXtTQ1JJUFRfTkFNRX0sIGV2ZW4gdGhvdWdoCitlbXB0eSBwYXRoIHNlZ21lbnRzIGFyZSBub3JtYWxseSBpZ25vcmVkLCBhbmQgXGNvZGV7U0NSSVBUX05BTUV9IGRvZXNuJ3QKK25vcm1hbGx5IGVuZCBpbiBhIHNsYXNoLiAgVGhpcyBpcyBpbnRlbnRpb25hbCBiZWhhdmlvciwgdG8gZW5zdXJlIHRoYXQKK2FuIGFwcGxpY2F0aW9uIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gVVJJcyBlbmRpbmcgaW4gXGNvZGV7L3h9Citmcm9tIG9uZXMgZW5kaW5nIGluIFxjb2Rley94L30gd2hlbiB1c2luZyB0aGlzIHJvdXRpbmUgdG8gZG8gb2JqZWN0Cit0cmF2ZXJzYWwuCisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0dXBfdGVzdGluZ19kZWZhdWx0c317ZW52aXJvbn0KK1VwZGF0ZSBcdmFye2Vudmlyb259IHdpdGggdHJpdmlhbCBkZWZhdWx0cyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKworVGhpcyByb3V0aW5lIGFkZHMgdmFyaW91cyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBXU0dJLCBpbmNsdWRpbmcKK1xjb2Rle0hUVFBfSE9TVH0sIFxjb2Rle1NFUlZFUl9OQU1FfSwgXGNvZGV7U0VSVkVSX1BPUlR9LAorXGNvZGV7UkVRVUVTVF9NRVRIT0R9LCBcY29kZXtTQ1JJUFRfTkFNRX0sIFxjb2Rle1BBVEhfSU5GT30sIGFuZCBhbGwgb2YKK3RoZSBccGVwezMzM30tZGVmaW5lZCBcY29kZXt3c2dpLip9IHZhcmlhYmxlcy4gIEl0IG9ubHkgc3VwcGxpZXMgZGVmYXVsdAordmFsdWVzLCBhbmQgZG9lcyBub3QgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgc2V0dGluZ3MgZm9yIHRoZXNlIHZhcmlhYmxlcy4KKworVGhpcyByb3V0aW5lIGlzIGludGVuZGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB1bml0IHRlc3RzIG9mIFdTR0kKK3NlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyB0byBzZXQgdXAgZHVtbXkgZW52aXJvbm1lbnRzLiAgSXQgc2hvdWxkIE5PVAorYmUgdXNlZCBieSBhY3R1YWwgV1NHSSBzZXJ2ZXJzIG9yIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIGRhdGEgaXMgZmFrZSEKK1xlbmR7ZnVuY2Rlc2N9CisKKworCitJbiBhZGRpdGlvbiB0byB0aGUgZW52aXJvbm1lbnQgZnVuY3Rpb25zIGFib3ZlLCB0aGUKK1xtb2R1bGV7d3NnaXJlZi51dGlsfSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGVzZSBtaXNjZWxsYW5lb3VzCit1dGlsaXRpZXM6CisKK1xiZWdpbntmdW5jZGVzY317aXNfaG9wX2J5X2hvcH17aGVhZGVyX25hbWV9CitSZXR1cm4gdHJ1ZSBpZiAnaGVhZGVyX25hbWUnIGlzIGFuIEhUVFAvMS4xIGBgSG9wLWJ5LUhvcCcnIGhlYWRlciwgYXMKK2RlZmluZWQgYnkgXHJmY3syNjE2fS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0ZpbGVXcmFwcGVyfXtmaWxlbGlrZSBcb3B0aW9uYWx7LCBibGtzaXplPTgxOTJ9fQorQSB3cmFwcGVyIHRvIGNvbnZlcnQgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIGFuIGl0ZXJhdG9yLiAgVGhlIHJlc3VsdGluZworb2JqZWN0cyBzdXBwb3J0IGJvdGggXG1ldGhvZHtfX2dldGl0ZW1fX30gYW5kIFxtZXRob2R7X19pdGVyX199CitpdGVyYXRpb24gc3R5bGVzLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjEgYW5kIEp5dGhvbi4KK0FzIHRoZSBvYmplY3QgaXMgaXRlcmF0ZWQgb3ZlciwgdGhlIG9wdGlvbmFsIFx2YXJ7Ymxrc2l6ZX0gcGFyYW1ldGVyCit3aWxsIGJlIHJlcGVhdGVkbHkgcGFzc2VkIHRvIHRoZSBcdmFye2ZpbGVsaWtlfSBvYmplY3QncyBcbWV0aG9ke3JlYWQoKX0KK21ldGhvZCB0byBvYnRhaW4gc3RyaW5ncyB0byB5aWVsZC4gIFdoZW4gXG1ldGhvZHtyZWFkKCl9IHJldHVybnMgYW4KK2VtcHR5IHN0cmluZywgaXRlcmF0aW9uIGlzIGVuZGVkIGFuZCBpcyBub3QgcmVzdW1hYmxlLgorCitJZiBcdmFye2ZpbGVsaWtlfSBoYXMgYSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCwgdGhlIHJldHVybmVkIG9iamVjdAord2lsbCBhbHNvIGhhdmUgYSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCwgYW5kIGl0IHdpbGwgaW52b2tlIHRoZQorXHZhcntmaWxlbGlrZX0gb2JqZWN0J3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2Qgd2hlbiBjYWxsZWQuCitcZW5ke2NsYXNzZGVzY30KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLmhlYWRlcnN9IC0tIFdTR0kgcmVzcG9uc2UgaGVhZGVyIHRvb2xzfQorXGRlY2xhcmVtb2R1bGV7fXt3c2dpcmVmLmhlYWRlcnN9CisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2luZ2xlIGNsYXNzLCBcY2xhc3N7SGVhZGVyc30sIGZvciBjb252ZW5pZW50CittYW5pcHVsYXRpb24gb2YgV1NHSSByZXNwb25zZSBoZWFkZXJzIHVzaW5nIGEgbWFwcGluZy1saWtlIGludGVyZmFjZS4KKworXGJlZ2lue2NsYXNzZGVzY317SGVhZGVyc317aGVhZGVyc30KK0NyZWF0ZSBhIG1hcHBpbmctbGlrZSBvYmplY3Qgd3JhcHBpbmcgXHZhcntoZWFkZXJzfSwgd2hpY2ggbXVzdCBiZSBhCitsaXN0IG9mIGhlYWRlciBuYW1lL3ZhbHVlIHR1cGxlcyBhcyBkZXNjcmliZWQgaW4gXHBlcHszMzN9LiAgQW55IGNoYW5nZXMKK21hZGUgdG8gdGhlIG5ldyBcY2xhc3N7SGVhZGVyc30gb2JqZWN0IHdpbGwgZGlyZWN0bHkgdXBkYXRlIHRoZQorXHZhcntoZWFkZXJzfSBsaXN0IGl0IHdhcyBjcmVhdGVkIHdpdGguCisKK1xjbGFzc3tIZWFkZXJzfSBvYmplY3RzIHN1cHBvcnQgdHlwaWNhbCBtYXBwaW5nIG9wZXJhdGlvbnMgaW5jbHVkaW5nCitcbWV0aG9ke19fZ2V0aXRlbV9ffSwgXG1ldGhvZHtnZXR9LCBcbWV0aG9ke19fc2V0aXRlbV9ffSwKK1xtZXRob2R7c2V0ZGVmYXVsdH0sIFxtZXRob2R7X19kZWxpdGVtX199LCBcbWV0aG9ke19fY29udGFpbnNfX30gYW5kCitcbWV0aG9ke2hhc19rZXl9LiAgRm9yIGVhY2ggb2YgdGhlc2UgbWV0aG9kcywgdGhlIGtleSBpcyB0aGUgaGVhZGVyIG5hbWUKKyh0cmVhdGVkIGNhc2UtaW5zZW5zaXRpdmVseSksIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGZpcnN0IHZhbHVlCithc3NvY2lhdGVkIHdpdGggdGhhdCBoZWFkZXIgbmFtZS4gIFNldHRpbmcgYSBoZWFkZXIgZGVsZXRlcyBhbnkgZXhpc3RpbmcKK3ZhbHVlcyBmb3IgdGhhdCBoZWFkZXIsIHRoZW4gYWRkcyBhIG5ldyB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSB3cmFwcGVkCitoZWFkZXIgbGlzdC4gIEhlYWRlcnMnIGV4aXN0aW5nIG9yZGVyIGlzIGdlbmVyYWxseSBtYWludGFpbmVkLCB3aXRoIG5ldworaGVhZGVycyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3cmFwcGVkIGxpc3QuCisKK1VubGlrZSBhIGRpY3Rpb25hcnksIFxjbGFzc3tIZWFkZXJzfSBvYmplY3RzIGRvIG5vdCByYWlzZSBhbiBlcnJvciB3aGVuCit5b3UgdHJ5IHRvIGdldCBvciBkZWxldGUgYSBrZXkgdGhhdCBpc24ndCBpbiB0aGUgd3JhcHBlZCBoZWFkZXIgbGlzdC4KK0dldHRpbmcgYSBub25leGlzdGVudCBoZWFkZXIganVzdCByZXR1cm5zIFxjb2Rle05vbmV9LCBhbmQgZGVsZXRpbmcKK2Egbm9uZXhpc3RlbnQgaGVhZGVyIGRvZXMgbm90aGluZy4KKworXGNsYXNze0hlYWRlcnN9IG9iamVjdHMgYWxzbyBzdXBwb3J0IFxtZXRob2R7a2V5cygpfSwgXG1ldGhvZHt2YWx1ZXMoKX0sCithbmQgXG1ldGhvZHtpdGVtcygpfSBtZXRob2RzLiAgVGhlIGxpc3RzIHJldHVybmVkIGJ5IFxtZXRob2R7a2V5cygpfQorYW5kIFxtZXRob2R7aXRlbXMoKX0gY2FuIGluY2x1ZGUgdGhlIHNhbWUga2V5IG1vcmUgdGhhbiBvbmNlIGlmIHRoZXJlCitpcyBhIG11bHRpLXZhbHVlZCBoZWFkZXIuICBUaGUgXGNvZGV7bGVuKCl9IG9mIGEgXGNsYXNze0hlYWRlcnN9IG9iamVjdAoraXMgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiBpdHMgXG1ldGhvZHtpdGVtcygpfSwgd2hpY2ggaXMgdGhlIHNhbWUKK2FzIHRoZSBsZW5ndGggb2YgdGhlIHdyYXBwZWQgaGVhZGVyIGxpc3QuICBJbiBmYWN0LCB0aGUgXG1ldGhvZHtpdGVtcygpfQorbWV0aG9kIGp1c3QgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHdyYXBwZWQgaGVhZGVyIGxpc3QuCisKK0NhbGxpbmcgXGNvZGV7c3RyKCl9IG9uIGEgXGNsYXNze0hlYWRlcnN9IG9iamVjdCByZXR1cm5zIGEgZm9ybWF0dGVkCitzdHJpbmcgc3VpdGFibGUgZm9yIHRyYW5zbWlzc2lvbiBhcyBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuICBFYWNoIGhlYWRlcgoraXMgcGxhY2VkIG9uIGEgbGluZSB3aXRoIGl0cyB2YWx1ZSwgc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIGEgc3BhY2UuCitFYWNoIGxpbmUgaXMgdGVybWluYXRlZCBieSBhIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkLCBhbmQgdGhlCitzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgYmxhbmsgbGluZS4KKworSW4gYWRkaXRpb24gdG8gdGhlaXIgbWFwcGluZyBpbnRlcmZhY2UgYW5kIGZvcm1hdHRpbmcgZmVhdHVyZXMsCitcY2xhc3N7SGVhZGVyc30gb2JqZWN0cyBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzIGZvciBxdWVyeWluZworYW5kIGFkZGluZyBtdWx0aS12YWx1ZWQgaGVhZGVycywgYW5kIGZvciBhZGRpbmcgaGVhZGVycyB3aXRoIE1JTUUKK3BhcmFtZXRlcnM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfYWxsfXtuYW1lfQorUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGhlYWRlci4KKworVGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlCitvcmlnaW5hbCBoZWFkZXIgbGlzdCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbgorZHVwbGljYXRlcy4gIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0bwordGhlIGhlYWRlciBsaXN0LiAgSWYgbm8gZmllbGRzIGV4aXN0IHdpdGggdGhlIGdpdmVuIG5hbWUsIHJldHVybnMgYW4KK2VtcHR5IGxpc3QuCitcZW5ke21ldGhvZGRlc2N9CisKKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9oZWFkZXJ9e25hbWUsIHZhbHVlLCAqKl9wYXJhbXN9CitBZGQgYSAocG9zc2libHkgbXVsdGktdmFsdWVkKSBoZWFkZXIsIHdpdGggb3B0aW9uYWwgTUlNRSBwYXJhbWV0ZXJzCitzcGVjaWZpZWQgdmlhIGtleXdvcmQgYXJndW1lbnRzLgorCitcdmFye25hbWV9IGlzIHRoZSBoZWFkZXIgZmllbGQgdG8gYWRkLiAgS2V5d29yZCBhcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8KK3NldCBNSU1FIHBhcmFtZXRlcnMgZm9yIHRoZSBoZWFkZXIgZmllbGQuICBFYWNoIHBhcmFtZXRlciBtdXN0IGJlIGEKK3N0cmluZyBvciBcY29kZXtOb25lfS4gIFVuZGVyc2NvcmVzIGluIHBhcmFtZXRlciBuYW1lcyBhcmUgY29udmVydGVkIHRvCitkYXNoZXMsIHNpbmNlIGRhc2hlcyBhcmUgaWxsZWdhbCBpbiBQeXRob24gaWRlbnRpZmllcnMsIGJ1dCBtYW55IE1JTUUKK3BhcmFtZXRlciBuYW1lcyBpbmNsdWRlIGRhc2hlcy4gIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBzdHJpbmcsIGl0CitpcyBhZGRlZCB0byB0aGUgaGVhZGVyIHZhbHVlIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm0gXGNvZGV7bmFtZT0idmFsdWUifS4KK0lmIGl0IGlzIFxjb2Rle05vbmV9LCBvbmx5IHRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBhZGRlZC4gIChUaGlzIGlzIHVzZWQKK2ZvciBNSU1FIHBhcmFtZXRlcnMgd2l0aG91dCBhIHZhbHVlLikgIEV4YW1wbGUgdXNhZ2U6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2guYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGFib3ZlIHdpbGwgYWRkIGEgaGVhZGVyIHRoYXQgbG9va3MgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19CitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iYnVkLmdpZiIKK1xlbmR7dmVyYmF0aW19CitcZW5ke21ldGhvZGRlc2N9CitcZW5ke2NsYXNzZGVzY30KKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9IC0tIGEgc2ltcGxlIFdTR0kgSFRUUCBzZXJ2ZXJ9CitcZGVjbGFyZW1vZHVsZVt3c2dpcmVmLnNpbXBsZXNlcnZlcl17fXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9CisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBzaW1wbGUgSFRUUCBzZXJ2ZXIgKGJhc2VkIG9uCitcbW9kdWxle0Jhc2VIVFRQU2VydmVyfSkgdGhhdCBzZXJ2ZXMgV1NHSSBhcHBsaWNhdGlvbnMuICBFYWNoIHNlcnZlcgoraW5zdGFuY2Ugc2VydmVzIGEgc2luZ2xlIFdTR0kgYXBwbGljYXRpb24gb24gYSBnaXZlbiBob3N0IGFuZCBwb3J0LiAgSWYKK3lvdSB3YW50IHRvIHNlcnZlIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBvbiBhIHNpbmdsZSBob3N0IGFuZCBwb3J0LCB5b3UKK3Nob3VsZCBjcmVhdGUgYSBXU0dJIGFwcGxpY2F0aW9uIHRoYXQgcGFyc2VzIFxjb2Rle1BBVEhfSU5GT30gdG8gc2VsZWN0Cit3aGljaCBhcHBsaWNhdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggcmVxdWVzdC4gIChFLmcuLCB1c2luZyB0aGUKK1xmdW5jdGlvbntzaGlmdF9wYXRoX2luZm8oKX0gZnVuY3Rpb24gZnJvbSBcbW9kdWxle3dzZ2lyZWYudXRpbH0uKQorCisKK1xiZWdpbntmdW5jZGVzY317bWFrZV9zZXJ2ZXJ9e2hvc3QsIHBvcnQsIGFwcAorXG9wdGlvbmFseywgc2VydmVyX2NsYXNzPVxjbGFzc3tXU0dJU2VydmVyfSBcb3B0aW9uYWx7LAoraGFuZGxlcl9jbGFzcz1cY2xhc3N7V1NHSVJlcXVlc3RIYW5kbGVyfX19fQorQ3JlYXRlIGEgbmV3IFdTR0kgc2VydmVyIGxpc3RlbmluZyBvbiBcdmFye2hvc3R9IGFuZCBcdmFye3BvcnR9LAorYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGZvciBcdmFye2FwcH0uICBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mCit0aGUgc3VwcGxpZWQgXHZhcntzZXJ2ZXJfY2xhc3N9LCBhbmQgd2lsbCBwcm9jZXNzIHJlcXVlc3RzIHVzaW5nIHRoZQorc3BlY2lmaWVkIFx2YXJ7aGFuZGxlcl9jbGFzc30uICBcdmFye2FwcH0gbXVzdCBiZSBhIFdTR0kgYXBwbGljYXRpb24KK29iamVjdCwgYXMgZGVmaW5lZCBieSBccGVwezMzM30uCisKK0V4YW1wbGUgdXNhZ2U6CitcYmVnaW57dmVyYmF0aW19ZnJvbSB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIgaW1wb3J0IG1ha2Vfc2VydmVyLCBkZW1vX2FwcAorCitodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKK3ByaW50ICJTZXJ2aW5nIEhUVFAgb24gcG9ydCA4MDAwLi4uIgorCisjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKK2h0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorCisjIEFsdGVybmF0aXZlOiBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0CisjI2h0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKK1xlbmR7dmVyYmF0aW19CisKK1xlbmR7ZnVuY2Rlc2N9CisKKworCisKKworCitcYmVnaW57ZnVuY2Rlc2N9e2RlbW9fYXBwfXtlbnZpcm9uLCBzdGFydF9yZXNwb25zZX0KK1RoaXMgZnVuY3Rpb24gaXMgYSBzbWFsbCBidXQgY29tcGxldGUgV1NHSSBhcHBsaWNhdGlvbiB0aGF0CityZXR1cm5zIGEgdGV4dCBwYWdlIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgYGBIZWxsbyB3b3JsZCEnJworYW5kIGEgbGlzdCBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIHByb3ZpZGVkIGluIHRoZQorXHZhcntlbnZpcm9ufSBwYXJhbWV0ZXIuICBJdCdzIHVzZWZ1bCBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBXU0dJIHNlcnZlcgorKHN1Y2ggYXMgXG1vZHVsZXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9KSBpcyBhYmxlIHRvIHJ1biBhIHNpbXBsZSBXU0dJCithcHBsaWNhdGlvbiBjb3JyZWN0bHkuCitcZW5ke2Z1bmNkZXNjfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e1dTR0lTZXJ2ZXJ9e3NlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzfQorQ3JlYXRlIGEgXGNsYXNze1dTR0lTZXJ2ZXJ9IGluc3RhbmNlLiAgXHZhcntzZXJ2ZXJfYWRkcmVzc30gc2hvdWxkIGJlCithIFxjb2Rleyhob3N0LHBvcnQpfSB0dXBsZSwgYW5kIFx2YXJ7UmVxdWVzdEhhbmRsZXJDbGFzc30gc2hvdWxkIGJlCit0aGUgc3ViY2xhc3Mgb2YgXGNsYXNze0Jhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXJ9IHRoYXQgd2lsbAorYmUgdXNlZCB0byBwcm9jZXNzIHJlcXVlc3RzLgorCitZb3UgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gY2FsbCB0aGlzIGNvbnN0cnVjdG9yLCBhcyB0aGUKK1xmdW5jdGlvbnttYWtlX3NlcnZlcigpfSBmdW5jdGlvbiBjYW4gaGFuZGxlIGFsbCB0aGUgZGV0YWlscyBmb3IgeW91LgorCitcY2xhc3N7V1NHSVNlcnZlcn0gaXMgYSBzdWJjbGFzcworb2YgXGNsYXNze0Jhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXJ9LCBzbyBhbGwgb2YgaXRzIG1ldGhvZHMgKHN1Y2ggYXMKK1xtZXRob2R7c2VydmVfZm9yZXZlcigpfSBhbmQgXG1ldGhvZHtoYW5kbGVfcmVxdWVzdCgpfSkgYXJlIGF2YWlsYWJsZS4KK1xjbGFzc3tXU0dJU2VydmVyfSBhbHNvIHByb3ZpZGVzIHRoZXNlIFdTR0ktc3BlY2lmaWMgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9hcHB9e2FwcGxpY2F0aW9ufQorU2V0cyB0aGUgY2FsbGFibGUgXHZhcnthcHBsaWNhdGlvbn0gYXMgdGhlIFdTR0kgYXBwbGljYXRpb24gdGhhdCB3aWxsCityZWNlaXZlIHJlcXVlc3RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2FwcH17fQorUmV0dXJucyB0aGUgY3VycmVudGx5LXNldCBhcHBsaWNhdGlvbiBjYWxsYWJsZS4KK1xlbmR7bWV0aG9kZGVzY30KKworTm9ybWFsbHksIGhvd2V2ZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhlc2UgYWRkaXRpb25hbCBtZXRob2RzLCBhcworXG1ldGhvZHtzZXRfYXBwKCl9IGlzIG5vcm1hbGx5IGNhbGxlZCBieSBcZnVuY3Rpb257bWFrZV9zZXJ2ZXIoKX0sIGFuZAordGhlIFxtZXRob2R7Z2V0X2FwcCgpfSBleGlzdHMgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiByZXF1ZXN0IGhhbmRsZXIKK2luc3RhbmNlcy4KK1xlbmR7Y2xhc3NkZXNjfQorCisKKworXGJlZ2lue2NsYXNzZGVzY317V1NHSVJlcXVlc3RIYW5kbGVyfXtyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcywgc2VydmVyfQorQ3JlYXRlIGFuIEhUVFAgaGFuZGxlciBmb3IgdGhlIGdpdmVuIFx2YXJ7cmVxdWVzdH0gKGkuZS4gYSBzb2NrZXQpLAorXHZhcntjbGllbnRfYWRkcmVzc30gKGEgXGNvZGV7KFx2YXJ7aG9zdH0sXHZhcntwb3J0fSl9IHR1cGxlKSwgYW5kCitcdmFye3NlcnZlcn0gKFxjbGFzc3tXU0dJU2VydmVyfSBpbnN0YW5jZSkuCisKK1lvdSBkbyBub3QgbmVlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHRoZXkgYXJlCithdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXMgbmVlZGVkIGJ5IFxjbGFzc3tXU0dJU2VydmVyfSBvYmplY3RzLiAgWW91CitjYW4sIGhvd2V2ZXIsIHN1YmNsYXNzIHRoaXMgY2xhc3MgYW5kIHN1cHBseSBpdCBhcyBhIFx2YXJ7aGFuZGxlcl9jbGFzc30KK3RvIHRoZSBcZnVuY3Rpb257bWFrZV9zZXJ2ZXIoKX0gZnVuY3Rpb24uICBTb21lIHBvc3NpYmx5IHJlbGV2YW50CittZXRob2RzIGZvciBvdmVycmlkaW5nIGluIHN1YmNsYXNzZXM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZW52aXJvbn17fQorUmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgV1NHSSBlbnZpcm9ubWVudCBmb3IgYSByZXF1ZXN0LiAgVGhlCitkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIFxjbGFzc3tXU0dJU2VydmVyfQorb2JqZWN0J3MgXG1lbWJlcntiYXNlX2Vudmlyb259IGRpY3Rpb25hcnkgYXR0cmlidXRlIGFuZCB0aGVuIGFkZHMKK3ZhcmlvdXMgaGVhZGVycyBkZXJpdmVkIGZyb20gdGhlIEhUVFAgcmVxdWVzdC4gIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZAorc2hvdWxkIHJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSByZWxldmFudCBDR0kKK2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgaW4gXHBlcHszMzN9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0ZGVycn17fQorUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgXGNvZGV7d3NnaS5lcnJvcnN9IHN0cmVhbS4KK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBcY29kZXtzeXMuc3RkZXJyfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZX17fQorUHJvY2VzcyB0aGUgSFRUUCByZXF1ZXN0LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIGhhbmRsZXIKK2luc3RhbmNlIHVzaW5nIGEgXG1vZHVsZXt3c2dpcmVmLmhhbmRsZXJzfSBjbGFzcyB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbAorV1NHSSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UuCitcZW5ke21ldGhvZGRlc2N9CisKK1xlbmR7Y2xhc3NkZXNjfQorCisKKworCisKKworCisKKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLnZhbGlkYXRlfSAtLSBXU0dJIGNvbmZvcm1hbmNlIGNoZWNrZXJ9CitcZGVjbGFyZW1vZHVsZXt9e3dzZ2lyZWYudmFsaWRhdGV9CitXaGVuIGNyZWF0aW5nIG5ldyBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdHMsIGZyYW1ld29ya3MsIHNlcnZlcnMsIG9yCittaWRkbGV3YXJlLCBpdCBjYW4gYmUgdXNlZnVsIHRvIHZhbGlkYXRlIHRoZSBuZXcgY29kZSdzIGNvbmZvcm1hbmNlCit1c2luZyBcbW9kdWxle3dzZ2lyZWYudmFsaWRhdGV9LiAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmdW5jdGlvbiB0aGF0CitjcmVhdGVzIFdTR0kgYXBwbGljYXRpb24gb2JqZWN0cyB0aGF0IHZhbGlkYXRlIGNvbW11bmljYXRpb25zIGJldHdlZW4KK2EgV1NHSSBzZXJ2ZXIgb3IgZ2F0ZXdheSBhbmQgYSBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdCwgdG8gY2hlY2sgYm90aAorc2lkZXMgZm9yIHByb3RvY29sIGNvbmZvcm1hbmNlLgorCitOb3RlIHRoYXQgdGhpcyB1dGlsaXR5IGRvZXMgbm90IGd1YXJhbnRlZSBjb21wbGV0ZSBccGVwezMzM30gY29tcGxpYW5jZTsKK2FuIGFic2VuY2Ugb2YgZXJyb3JzIGZyb20gdGhpcyBtb2R1bGUgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0CitlcnJvcnMgZG8gbm90IGV4aXN0LiAgSG93ZXZlciwgaWYgdGhpcyBtb2R1bGUgZG9lcyBwcm9kdWNlIGFuIGVycm9yLAordGhlbiBpdCBpcyB2aXJ0dWFsbHkgY2VydGFpbiB0aGF0IGVpdGhlciB0aGUgc2VydmVyIG9yIGFwcGxpY2F0aW9uIGlzCitub3QgMTAwXCUgY29tcGxpYW50LgorCitUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgXG1vZHVsZXtwYXN0ZS5saW50fSBtb2R1bGUgZnJvbSBJYW4KK0JpY2tpbmcncyBgYFB5dGhvbiBQYXN0ZScnIGxpYnJhcnkuCisKK1xiZWdpbntmdW5jZGVzY317dmFsaWRhdG9yfXthcHBsaWNhdGlvbn0KK1dyYXAgXHZhcnthcHBsaWNhdGlvbn0gYW5kIHJldHVybiBhIG5ldyBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdC4gIFRoZQorcmV0dXJuZWQgYXBwbGljYXRpb24gd2lsbCBmb3J3YXJkIGFsbCByZXF1ZXN0cyB0byB0aGUgb3JpZ2luYWwKK1x2YXJ7YXBwbGljYXRpb259LCBhbmQgd2lsbCBjaGVjayB0aGF0IGJvdGggdGhlIFx2YXJ7YXBwbGljYXRpb259IGFuZAordGhlIHNlcnZlciBpbnZva2luZyBpdCBhcmUgY29uZm9ybWluZyB0byB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uIGFuZCB0bworUkZDIDI2MTYuCisKK0FueSBkZXRlY3RlZCBub25jb25mb3JtYW5jZSByZXN1bHRzIGluIGFuIFxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9CitiZWluZyByYWlzZWQ7IG5vdGUsIGhvd2V2ZXIsIHRoYXQgaG93IHRoZXNlIGVycm9ycyBhcmUgaGFuZGxlZCBpcworc2VydmVyLWRlcGVuZGVudC4gIEZvciBleGFtcGxlLCBcbW9kdWxle3dzZ2lyZWYuc2ltcGxlX3NlcnZlcn0gYW5kIG90aGVyCitzZXJ2ZXJzIGJhc2VkIG9uIFxtb2R1bGV7d3NnaXJlZi5oYW5kbGVyc30gKHRoYXQgZG9uJ3Qgb3ZlcnJpZGUgdGhlCitlcnJvciBoYW5kbGluZyBtZXRob2RzIHRvIGRvIHNvbWV0aGluZyBlbHNlKSB3aWxsIHNpbXBseSBvdXRwdXQgYQorbWVzc2FnZSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgYW5kIGR1bXAgdGhlIHRyYWNlYmFjayB0bworXGNvZGV7c3lzLnN0ZGVycn0gb3Igc29tZSBvdGhlciBlcnJvciBzdHJlYW0uCisKK1RoaXMgd3JhcHBlciBtYXkgYWxzbyBnZW5lcmF0ZSBvdXRwdXQgdXNpbmcgdGhlIFxtb2R1bGV7d2FybmluZ3N9IG1vZHVsZQordG8gaW5kaWNhdGUgYmVoYXZpb3JzIHRoYXQgYXJlIHF1ZXN0aW9uYWJsZSBidXQgd2hpY2ggbWF5IG5vdCBhY3R1YWxseQorYmUgcHJvaGliaXRlZCBieSBccGVwezMzM30uICBVbmxlc3MgdGhleSBhcmUgc3VwcHJlc3NlZCB1c2luZyBQeXRob24KK2NvbW1hbmQtbGluZSBvcHRpb25zIG9yIHRoZSBcbW9kdWxle3dhcm5pbmdzfSBBUEksIGFueSBzdWNoIHdhcm5pbmdzCit3aWxsIGJlIHdyaXR0ZW4gdG8gXGNvZGV7c3lzLnN0ZGVycn0gKFxlbXBoe25vdH0gXGNvZGV7d3NnaS5lcnJvcnN9LAordW5sZXNzIHRoZXkgaGFwcGVuIHRvIGJlIHRoZSBzYW1lIG9iamVjdCkuCitcZW5ke2Z1bmNkZXNjfQorCitcc3Vic2VjdGlvbntcbW9kdWxle3dzZ2lyZWYuaGFuZGxlcnN9IC0tIHNlcnZlci9nYXRld2F5IGJhc2UgY2xhc3Nlc30KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZi5oYW5kbGVyc30KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgYmFzZSBoYW5kbGVyIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBXU0dJIHNlcnZlcnMKK2FuZCBnYXRld2F5cy4gIFRoZXNlIGJhc2UgY2xhc3NlcyBoYW5kbGUgbW9zdCBvZiB0aGUgd29yayBvZgorY29tbXVuaWNhdGluZyB3aXRoIGEgV1NHSSBhcHBsaWNhdGlvbiwgYXMgbG9uZyBhcyB0aGV5IGFyZSBnaXZlbiBhCitDR0ktbGlrZSBlbnZpcm9ubWVudCwgYWxvbmcgd2l0aCBpbnB1dCwgb3V0cHV0LCBhbmQgZXJyb3Igc3RyZWFtcy4KKworCitcYmVnaW57Y2xhc3NkZXNjfXtDR0lIYW5kbGVyfXt9CitDR0ktYmFzZWQgaW52b2NhdGlvbiB2aWEgXGNvZGV7c3lzLnN0ZGlufSwgXGNvZGV7c3lzLnN0ZG91dH0sCitcY29kZXtzeXMuc3RkZXJyfSBhbmQgXGNvZGV7b3MuZW52aXJvbn0uICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCithIFdTR0kgYXBwbGljYXRpb24gYW5kIHdhbnQgdG8gcnVuIGl0IGFzIGEgQ0dJIHNjcmlwdC4gIFNpbXBseSBpbnZva2UKK1xjb2Rle0NHSUhhbmRsZXIoKS5ydW4oYXBwKX0sIHdoZXJlIFxjb2Rle2FwcH0gaXMgdGhlIFdTR0kgYXBwbGljYXRpb24KK29iamVjdCB5b3Ugd2lzaCB0byBpbnZva2UuCisKK1RoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9IHRoYXQgc2V0cworXGNvZGV7d3NnaS5ydW5fb25jZX0gdG8gdHJ1ZSwgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gdG8gZmFsc2UsIGFuZAorXGNvZGV7d3NnaS5tdWx0aXByb2Nlc3N9IHRvIHRydWUsIGFuZCBhbHdheXMgdXNlcyBcbW9kdWxle3N5c30gYW5kCitcbW9kdWxle29zfSB0byBvYnRhaW4gdGhlIG5lY2Vzc2FyeSBDR0kgc3RyZWFtcyBhbmQgZW52aXJvbm1lbnQuCitcZW5ke2NsYXNzZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtCYXNlQ0dJSGFuZGxlcn17c3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uCitcb3B0aW9uYWx7LCBtdWx0aXRocmVhZD1UcnVlIFxvcHRpb25hbHssIG11bHRpcHJvY2Vzcz1GYWxzZX19fQorCitTaW1pbGFyIHRvIFxjbGFzc3tDR0lIYW5kbGVyfSwgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIFxtb2R1bGV7c3lzfSBhbmQKK1xtb2R1bGV7b3N9IG1vZHVsZXMsIHRoZSBDR0kgZW52aXJvbm1lbnQgYW5kIEkvTyBzdHJlYW1zIGFyZSBzcGVjaWZpZWQKK2V4cGxpY2l0bHkuICBUaGUgXHZhcnttdWx0aXRocmVhZH0gYW5kIFx2YXJ7bXVsdGlwcm9jZXNzfSB2YWx1ZXMgYXJlCit1c2VkIHRvIHNldCB0aGUgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gYW5kIFxjb2Rle3dzZ2kubXVsdGlwcm9jZXNzfQorZmxhZ3MgZm9yIGFueSBhcHBsaWNhdGlvbnMgcnVuIGJ5IHRoZSBoYW5kbGVyIGluc3RhbmNlLgorCitUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze1NpbXBsZUhhbmRsZXJ9IGludGVuZGVkIGZvciB1c2Ugd2l0aAorc29mdHdhcmUgb3RoZXIgdGhhbiBIVFRQIGBgb3JpZ2luIHNlcnZlcnMnJy4gIElmIHlvdSBhcmUgd3JpdGluZyBhCitnYXRld2F5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIChzdWNoIGFzIENHSSwgRmFzdENHSSwgU0NHSSwgZXRjLikgdGhhdAordXNlcyBhIFxjb2Rle1N0YXR1czp9IGhlYWRlciB0byBzZW5kIGFuIEhUVFAgc3RhdHVzLCB5b3UgcHJvYmFibHkgd2FudAordG8gc3ViY2xhc3MgdGhpcyBpbnN0ZWFkIG9mIFxjbGFzc3tTaW1wbGVIYW5kbGVyfS4KK1xlbmR7Y2xhc3NkZXNjfQorCisKKworXGJlZ2lue2NsYXNzZGVzY317U2ltcGxlSGFuZGxlcn17c3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uCitcb3B0aW9uYWx7LG11bHRpdGhyZWFkPVRydWUgXG9wdGlvbmFseywgbXVsdGlwcm9jZXNzPUZhbHNlfX19CisKK1NpbWlsYXIgdG8gXGNsYXNze0Jhc2VDR0lIYW5kbGVyfSwgYnV0IGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBIVFRQIG9yaWdpbgorc2VydmVycy4gIElmIHlvdSBhcmUgd3JpdGluZyBhbiBIVFRQIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgeW91IHdpbGwKK3Byb2JhYmx5IHdhbnQgdG8gc3ViY2xhc3MgdGhpcyBpbnN0ZWFkIG9mIFxjbGFzc3tCYXNlQ0dJSGFuZGxlcn0KKworVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFxjbGFzc3tCYXNlSGFuZGxlcn0uICBJdCBvdmVycmlkZXMgdGhlCitcbWV0aG9ke19faW5pdF9fKCl9LCBcbWV0aG9ke2dldF9zdGRpbigpfSwgXG1ldGhvZHtnZXRfc3RkZXJyKCl9LAorXG1ldGhvZHthZGRfY2dpX3ZhcnMoKX0sIFxtZXRob2R7X3dyaXRlKCl9LCBhbmQgXG1ldGhvZHtfZmx1c2goKX0KK21ldGhvZHMgdG8gc3VwcG9ydCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IGFuZCBzdHJlYW1zIHZpYQordGhlIGNvbnN0cnVjdG9yLiAgVGhlIHN1cHBsaWVkIGVudmlyb25tZW50IGFuZCBzdHJlYW1zIGFyZSBzdG9yZWQgaW4KK3RoZSBcbWVtYmVye3N0ZGlufSwgXG1lbWJlcntzdGRvdXR9LCBcbWVtYmVye3N0ZGVycn0sIGFuZAorXG1lbWJlcntlbnZpcm9ufSBhdHRyaWJ1dGVzLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0Jhc2VIYW5kbGVyfXt9CitUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHJ1bm5pbmcgV1NHSSBhcHBsaWNhdGlvbnMuICBFYWNoCitpbnN0YW5jZSB3aWxsIGhhbmRsZSBhIHNpbmdsZSBIVFRQIHJlcXVlc3QsIGFsdGhvdWdoIGluIHByaW5jaXBsZSB5b3UKK2NvdWxkIGNyZWF0ZSBhIHN1YmNsYXNzIHRoYXQgd2FzIHJldXNhYmxlIGZvciBtdWx0aXBsZSByZXF1ZXN0cy4KKworXGNsYXNze0Jhc2VIYW5kbGVyfSBpbnN0YW5jZXMgaGF2ZSBvbmx5IG9uZSBtZXRob2QgaW50ZW5kZWQgZm9yIGV4dGVybmFsCit1c2U6CisKK1xiZWdpbnttZXRob2RkZXNjfXtydW59e2FwcH0KK1J1biB0aGUgc3BlY2lmaWVkIFdTR0kgYXBwbGljYXRpb24sIFx2YXJ7YXBwfS4KK1xlbmR7bWV0aG9kZGVzY30KKworQWxsIG9mIHRoZSBvdGhlciBcY2xhc3N7QmFzZUhhbmRsZXJ9IG1ldGhvZHMgYXJlIGludm9rZWQgYnkgdGhpcyBtZXRob2QKK2luIHRoZSBwcm9jZXNzIG9mIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGh1cyBleGlzdCBwcmltYXJpbHkgdG8KK2FsbG93IGN1c3RvbWl6aW5nIHRoZSBwcm9jZXNzLgorCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgTVVTVCBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3M6CisKK1xiZWdpbnttZXRob2RkZXNjfXtfd3JpdGV9e2RhdGF9CitCdWZmZXIgdGhlIHN0cmluZyBcdmFye2RhdGF9IGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGNsaWVudC4gIEl0J3Mgb2theQoraWYgdGhpcyBtZXRob2QgYWN0dWFsbHkgdHJhbnNtaXRzIHRoZSBkYXRhOyBcY2xhc3N7QmFzZUhhbmRsZXJ9CitqdXN0IHNlcGFyYXRlcyB3cml0ZSBhbmQgZmx1c2ggb3BlcmF0aW9ucyBmb3IgZ3JlYXRlciBlZmZpY2llbmN5Cit3aGVuIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBhY3R1YWxseSBoYXMgc3VjaCBhIGRpc3RpbmN0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317X2ZsdXNofXt9CitGb3JjZSBidWZmZXJlZCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBjbGllbnQuICBJdCdzIG9rYXkgaWYgdGhpcworbWV0aG9kIGlzIGEgbm8tb3AgKGkuZS4sIGlmIFxtZXRob2R7X3dyaXRlKCl9IGFjdHVhbGx5IHNlbmRzIHRoZSBkYXRhKS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zdGRpbn17fQorUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBvYmplY3Qgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgXGNvZGV7d3NnaS5pbnB1dH0KK29mIHRoZSByZXF1ZXN0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfc3RkZXJyfXt9CitSZXR1cm4gYW4gb3V0cHV0IHN0cmVhbSBvYmplY3Qgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUKK1xjb2Rle3dzZ2kuZXJyb3JzfSBvZiB0aGUgcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317YWRkX2NnaV92YXJzfXt9CitJbnNlcnQgQ0dJIHZhcmlhYmxlcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBpbnRvIHRoZSBcbWVtYmVye2Vudmlyb259CithdHRyaWJ1dGUuCitcZW5ke21ldGhvZGRlc2N9CisKK0hlcmUgYXJlIHNvbWUgb3RoZXIgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyB5b3UgbWF5IHdpc2ggdG8gb3ZlcnJpZGUuCitUaGlzIGxpc3QgaXMgb25seSBhIHN1bW1hcnksIGhvd2V2ZXIsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGV2ZXJ5IG1ldGhvZAordGhhdCBjYW4gYmUgb3ZlcnJpZGRlbi4gIFlvdSBzaG91bGQgY29uc3VsdCB0aGUgZG9jc3RyaW5ncyBhbmQgc291cmNlCitjb2RlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIGN1c3RvbWl6ZWQKK1xjbGFzc3tCYXNlSGFuZGxlcn0gc3ViY2xhc3MuCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0F0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgZm9yIGN1c3RvbWl6aW5nIHRoZSBXU0dJIGVudmlyb25tZW50OgorCitcYmVnaW57bWVtYmVyZGVzY317d3NnaV9tdWx0aXRocmVhZH0KK1RoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gZW52aXJvbm1lbnQKK3ZhcmlhYmxlLiAgSXQgZGVmYXVsdHMgdG8gdHJ1ZSBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQgbWF5IGhhdmUKK2EgZGlmZmVyZW50IGRlZmF1bHQgKG9yIGJlIHNldCBieSB0aGUgY29uc3RydWN0b3IpIGluIHRoZSBvdGhlcgorc3ViY2xhc3Nlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfbXVsdGlwcm9jZXNzfQorVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBcY29kZXt3c2dpLm11bHRpcHJvY2Vzc30gZW52aXJvbm1lbnQKK3ZhcmlhYmxlLiAgSXQgZGVmYXVsdHMgdG8gdHJ1ZSBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQgbWF5IGhhdmUKK2EgZGlmZmVyZW50IGRlZmF1bHQgKG9yIGJlIHNldCBieSB0aGUgY29uc3RydWN0b3IpIGluIHRoZSBvdGhlcgorc3ViY2xhc3Nlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfcnVuX29uY2V9CitUaGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIFxjb2Rle3dzZ2kucnVuX29uY2V9IGVudmlyb25tZW50Cit2YXJpYWJsZS4gIEl0IGRlZmF1bHRzIHRvIGZhbHNlIGluIFxjbGFzc3tCYXNlSGFuZGxlcn0sIGJ1dAorXGNsYXNze0NHSUhhbmRsZXJ9IHNldHMgaXQgdG8gdHJ1ZSBieSBkZWZhdWx0LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317b3NfZW52aXJvbn0KK1RoZSBkZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmNsdWRlZCBpbiBldmVyeSByZXF1ZXN0J3MKK1dTR0kgZW52aXJvbm1lbnQuICBCeSBkZWZhdWx0LCB0aGlzIGlzIGEgY29weSBvZiBcY29kZXtvcy5lbnZpcm9ufSBhdAordGhlIHRpbWUgdGhhdCBcbW9kdWxle3dzZ2lyZWYuaGFuZGxlcnN9IHdhcyBpbXBvcnRlZCwgYnV0IHN1YmNsYXNzZXMgY2FuCitlaXRoZXIgY3JlYXRlIHRoZWlyIG93biBhdCB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UgbGV2ZWwuICBOb3RlIHRoYXQgdGhlCitkaWN0aW9uYXJ5IHNob3VsZCBiZSBjb25zaWRlcmVkIHJlYWQtb25seSwgc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMKK3NoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGNsYXNzZXMgYW5kIGluc3RhbmNlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3NlcnZlcl9zb2Z0d2FyZX0KK0lmIHRoZSBcbWVtYmVye29yaWdpbl9zZXJ2ZXJ9IGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgYXR0cmlidXRlJ3MgdmFsdWUKK2lzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IFxjb2Rle1NFUlZFUl9TT0ZUV0FSRX0gV1NHSSBlbnZpcm9ubWVudAordmFyaWFibGUsIGFuZCBhbHNvIHRvIHNldCBhIGRlZmF1bHQgXGNvZGV7U2VydmVyOn0gaGVhZGVyIGluIEhUVFAKK3Jlc3BvbnNlcy4gIEl0IGlzIGlnbm9yZWQgZm9yIGhhbmRsZXJzIChzdWNoIGFzIFxjbGFzc3tCYXNlQ0dJSGFuZGxlcn0KK2FuZCBcY2xhc3N7Q0dJSGFuZGxlcn0pIHRoYXQgYXJlIG5vdCBIVFRQIG9yaWdpbiBzZXJ2ZXJzLgorXGVuZHttZW1iZXJkZXNjfQorCisKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zY2hlbWV9e30KK1JldHVybiB0aGUgVVJMIHNjaGVtZSBiZWluZyB1c2VkIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LiAgVGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFxmdW5jdGlvbntndWVzc19zY2hlbWUoKX0gZnVuY3Rpb24gZnJvbQorXG1vZHVsZXt3c2dpcmVmLnV0aWx9IHRvIGd1ZXNzIHdoZXRoZXIgdGhlIHNjaGVtZSBzaG91bGQgYmUgYGBodHRwJycgb3IKK2BgaHR0cHMnJywgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVxdWVzdCdzIFxtZW1iZXJ7ZW52aXJvbn0gdmFyaWFibGVzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0dXBfZW52aXJvbn17fQorU2V0IHRoZSBcbWVtYmVye2Vudmlyb259IGF0dHJpYnV0ZSB0byBhIGZ1bGx5LXBvcHVsYXRlZCBXU0dJCitlbnZpcm9ubWVudC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgYWxsIG9mIHRoZSBhYm92ZSBtZXRob2RzCithbmQgYXR0cmlidXRlcywgcGx1cyB0aGUgXG1ldGhvZHtnZXRfc3RkaW4oKX0sIFxtZXRob2R7Z2V0X3N0ZGVycigpfSwKK2FuZCBcbWV0aG9ke2FkZF9jZ2lfdmFycygpfSBtZXRob2RzIGFuZCB0aGUgXG1lbWJlcnt3c2dpX2ZpbGVfd3JhcHBlcn0KK2F0dHJpYnV0ZS4gIEl0IGFsc28gaW5zZXJ0cyBhIFxjb2Rle1NFUlZFUl9TT0ZUV0FSRX0ga2V5IGlmIG5vdCBwcmVzZW50LAorYXMgbG9uZyBhcyB0aGUgXG1lbWJlcntvcmlnaW5fc2VydmVyfSBhdHRyaWJ1dGUgaXMgYSB0cnVlIHZhbHVlIGFuZCB0aGUKK1xtZW1iZXJ7c2VydmVyX3NvZnR3YXJlfSBhdHRyaWJ1dGUgaXMgc2V0LgorXGVuZHttZXRob2RkZXNjfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIGZvciBjdXN0b21pemluZyBleGNlcHRpb24gaGFuZGxpbmc6CisKK1xiZWdpbnttZXRob2RkZXNjfXtsb2dfZXhjZXB0aW9ufXtleGNfaW5mb30KK0xvZyB0aGUgXHZhcntleGNfaW5mb30gdHVwbGUgaW4gdGhlIHNlcnZlciBsb2cuICBcdmFye2V4Y19pbmZvfSBpcyBhCitcY29kZXsoXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9IHR1cGxlLiAgVGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIHNpbXBseSB3cml0ZXMgdGhlIHRyYWNlYmFjayB0byB0aGUgcmVxdWVzdCdzCitcY29kZXt3c2dpLmVycm9yc30gc3RyZWFtIGFuZCBmbHVzaGVzIGl0LiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcworbWV0aG9kIHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9yIHJldGFyZ2V0IHRoZSBvdXRwdXQsIG1haWwgdGhlIHRyYWNlYmFjawordG8gYW4gYWRtaW5pc3RyYXRvciwgb3Igd2hhdGV2ZXIgb3RoZXIgYWN0aW9uIG1heSBiZSBkZWVtZWQgc3VpdGFibGUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXt0cmFjZWJhY2tfbGltaXR9CitUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGluY2x1ZGUgaW4gdHJhY2ViYWNrcyBvdXRwdXQgYnkgdGhlCitkZWZhdWx0IFxtZXRob2R7bG9nX2V4Y2VwdGlvbigpfSBtZXRob2QuICBJZiBcY29kZXtOb25lfSwgYWxsIGZyYW1lcworYXJlIGluY2x1ZGVkLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZXJyb3Jfb3V0cHV0fXtlbnZpcm9uLCBzdGFydF9yZXNwb25zZX0KK1RoaXMgbWV0aG9kIGlzIGEgV1NHSSBhcHBsaWNhdGlvbiB0byBnZW5lcmF0ZSBhbiBlcnJvciBwYWdlIGZvciB0aGUKK3VzZXIuICBJdCBpcyBvbmx5IGludm9rZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZSBoZWFkZXJzIGFyZSBzZW50Cit0byB0aGUgY2xpZW50LgorCitUaGlzIG1ldGhvZCBjYW4gYWNjZXNzIHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIHVzaW5nCitcY29kZXtzeXMuZXhjX2luZm8oKX0sIGFuZCBzaG91bGQgcGFzcyB0aGF0IGluZm9ybWF0aW9uIHRvCitcdmFye3N0YXJ0X3Jlc3BvbnNlfSB3aGVuIGNhbGxpbmcgaXQgKGFzIGRlc2NyaWJlZCBpbiB0aGUgYGBFcnJvcgorSGFuZGxpbmcnJyBzZWN0aW9uIG9mIFxwZXB7MzMzfSkuCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgdXNlcyB0aGUgXG1lbWJlcntlcnJvcl9zdGF0dXN9LAorXG1lbWJlcntlcnJvcl9oZWFkZXJzfSwgYW5kIFxtZW1iZXJ7ZXJyb3JfYm9keX0gYXR0cmlidXRlcyB0byBnZW5lcmF0ZQorYW4gb3V0cHV0IHBhZ2UuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHByb2R1Y2UgbW9yZSBkeW5hbWljCitlcnJvciBvdXRwdXQuCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgaXQncyBub3QgcmVjb21tZW5kZWQgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlIHRvCitzcGl0IG91dCBkaWFnbm9zdGljcyB0byBhbnkgb2xkIHVzZXI7IGlkZWFsbHksIHlvdSBzaG91bGQgaGF2ZSB0byBkbworc29tZXRoaW5nIHNwZWNpYWwgdG8gZW5hYmxlIGRpYWdub3N0aWMgb3V0cHV0LCB3aGljaCBpcyB3aHkgdGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaW5jbHVkZSBhbnkuCitcZW5ke21ldGhvZGRlc2N9CisKKworCisKK1xiZWdpbnttZW1iZXJkZXNjfXtlcnJvcl9zdGF0dXN9CitUaGUgSFRUUCBzdGF0dXMgdXNlZCBmb3IgZXJyb3IgcmVzcG9uc2VzLiAgVGhpcyBzaG91bGQgYmUgYSBzdGF0dXMKK3N0cmluZyBhcyBkZWZpbmVkIGluIFxwZXB7MzMzfTsgaXQgZGVmYXVsdHMgdG8gYSA1MDAgY29kZSBhbmQgbWVzc2FnZS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2Vycm9yX2hlYWRlcnN9CitUaGUgSFRUUCBoZWFkZXJzIHVzZWQgZm9yIGVycm9yIHJlc3BvbnNlcy4gIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCBvZgorV1NHSSByZXNwb25zZSBoZWFkZXJzIChcY29kZXsoXHZhcntuYW1lfSwgXHZhcnt2YWx1ZX0pfSB0dXBsZXMpLCBhcworZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIFRoZSBkZWZhdWx0IGxpc3QganVzdCBzZXRzIHRoZSBjb250ZW50IHR5cGUKK3RvIFxjb2Rle3RleHQvcGxhaW59LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZXJyb3JfYm9keX0KK1RoZSBlcnJvciByZXNwb25zZSBib2R5LiAgVGhpcyBzaG91bGQgYmUgYW4gSFRUUCByZXNwb25zZSBib2R5IHN0cmluZy4KK0l0IGRlZmF1bHRzIHRvIHRoZSBwbGFpbiB0ZXh0LCBgYEEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlCitjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicnCitcZW5ke21lbWJlcmRlc2N9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIGZvciBccGVwezMzM30ncyBgYE9wdGlvbmFsIFBsYXRmb3JtLVNwZWNpZmljIEZpbGUKK0hhbmRsaW5nJycgZmVhdHVyZToKKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfZmlsZV93cmFwcGVyfQorQSBcY29kZXt3c2dpLmZpbGVfd3JhcHBlcn0gZmFjdG9yeSwgb3IgXGNvZGV7Tm9uZX0uICBUaGUgZGVmYXVsdCB2YWx1ZQorb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdGhlIFxjbGFzc3tGaWxlV3JhcHBlcn0gY2xhc3MgZnJvbQorXG1vZHVsZXt3c2dpcmVmLnV0aWx9LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2VuZGZpbGV9e30KK092ZXJyaWRlIHRvIGltcGxlbWVudCBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIHRyYW5zbWlzc2lvbi4gIFRoaXMgbWV0aG9kCitpcyBjYWxsZWQgb25seSBpZiB0aGUgYXBwbGljYXRpb24ncyByZXR1cm4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YKK3RoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIFxtZW1iZXJ7d3NnaV9maWxlX3dyYXBwZXJ9IGF0dHJpYnV0ZS4gIEl0CitzaG91bGQgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBpdCB3YXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgdHJhbnNtaXQgdGhlCitmaWxlLCBzbyB0aGF0IHRoZSBkZWZhdWx0IHRyYW5zbWlzc2lvbiBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgorVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIGEgZmFsc2UgdmFsdWUuCitcZW5ke21ldGhvZGRlc2N9CisKKworTWlzY2VsbGFuZW91cyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorCitcYmVnaW57bWVtYmVyZGVzY317b3JpZ2luX3NlcnZlcn0KK1RoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gYSB0cnVlIHZhbHVlIGlmIHRoZSBoYW5kbGVyJ3MKK1xtZXRob2R7X3dyaXRlKCl9IGFuZCBcbWV0aG9ke19mbHVzaCgpfSBhcmUgYmVpbmcgdXNlZCB0byBjb21tdW5pY2F0ZQorZGlyZWN0bHkgdG8gdGhlIGNsaWVudCwgcmF0aGVyIHRoYW4gdmlhIGEgQ0dJLWxpa2UgZ2F0ZXdheSBwcm90b2NvbCB0aGF0Cit3YW50cyB0aGUgSFRUUCBzdGF0dXMgaW4gYSBzcGVjaWFsIFxjb2Rle1N0YXR1czp9IGhlYWRlci4KKworVGhpcyBhdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlIGlzIHRydWUgaW4gXGNsYXNze0Jhc2VIYW5kbGVyfSwgYnV0CitmYWxzZSBpbiBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9IGFuZCBcY2xhc3N7Q0dJSGFuZGxlcn0uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtodHRwX3ZlcnNpb259CitJZiBcbWVtYmVye29yaWdpbl9zZXJ2ZXJ9IGlzIHRydWUsIHRoaXMgc3RyaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvCitzZXQgdGhlIEhUVFAgdmVyc2lvbiBvZiB0aGUgcmVzcG9uc2Ugc2V0IHRvIHRoZSBjbGllbnQuICBJdCBkZWZhdWx0cyB0bworXGNvZGV7IjEuMCJ9LgorXGVuZHttZW1iZXJkZXNjfQorCisKKworCisKK1xlbmR7Y2xhc3NkZXNjfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4IGIvRG9jL2xpYi9saWJ6aXBmaWxlLnRleAppbmRleCA0ZTA2ZWY2Li4zZDgxZTUwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4CisrKyBiL0RvYy9saWIvbGliemlwZmlsZS50ZXgKQEAgLTEzLDExICsxMywxMiBAQAogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdG9vbHMgdG8gY3JlYXRlLCByZWFkLCB3cml0ZSwgYXBwZW5kLCBhbmQgbGlzdCBhCiBaSVAgZmlsZS4gIEFueSBhZHZhbmNlZCB1c2Ugb2YgdGhpcyBtb2R1bGUgd2lsbCByZXF1aXJlIGFuCiB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmb3JtYXQsIGFzIGRlZmluZWQgaW4KLVxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2FwcG5vdGUuaHRtbF17UEtaSVAgQXBwbGljYXRpb24KLU5vdGV9LgorXGNpdGV0aXRsZVtodHRwOi8vd3d3LnBrd2FyZS5jb20vYnVzaW5lc3NfYW5kX2RldmVsb3BlcnMvZGV2ZWxvcGVyL2FwcG5vdGUvXQore1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9LgogCiBUaGlzIG1vZHVsZSBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIFpJUCBmaWxlcyB3aGljaCBoYXZlIGFwcGVuZGVkCi1jb21tZW50cywgb3IgbXVsdGktZGlzayBaSVAgZmlsZXMuCitjb21tZW50cywgb3IgbXVsdGktZGlzayBaSVAgZmlsZXMuIEl0IGNhbiBoYW5kbGUgWklQIGZpbGVzIHRoYXQgdXNlIHRoZSAKK1pJUDY0IGV4dGVuc2lvbnMgKHRoYXQgaXMgWklQIGZpbGVzIHRoYXQgYXJlIG1vcmUgdGhhbiA0IEdCeXRlIGluIHNpemUpLgogCiBUaGUgYXZhaWxhYmxlIGF0dHJpYnV0ZXMgb2YgdGhpcyBtb2R1bGUgYXJlOgogCkBAIC0yNSw2ICsyNiwxMSBAQAogICBUaGUgZXJyb3IgcmFpc2VkIGZvciBiYWQgWklQIGZpbGVzLgogXGVuZHtleGNkZXNjfQogCitcYmVnaW57ZXhjZGVzY317TGFyZ2VaaXBGaWxlfQorICBUaGUgZXJyb3IgcmFpc2VkIHdoZW4gYSBaSVAgZmlsZSB3b3VsZCByZXF1aXJlIFpJUDY0IGZ1bmN0aW9uYWxpdHkgYnV0IHRoYXQKKyAgaGFzIG5vdCBiZWVuIGVuYWJsZWQuCitcZW5ke2V4Y2Rlc2N9CisKIFxiZWdpbntjbGFzc2Rlc2MqfXtaaXBGaWxlfQogICBUaGUgY2xhc3MgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgWklQIGZpbGVzLiAgU2VlCiAgIGBgXGNpdGV0aXRsZXtaaXBGaWxlIE9iamVjdHN9JycgKHNlY3Rpb24gXHJlZnt6aXBmaWxlLW9iamVjdHN9KSBmb3IKQEAgLTY1LDkgKzcxLDkgQEAKIAogCiBcYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9hcHBub3RlLmh0bWxde1BLWklQIEFwcGxpY2F0aW9uCi0gICAgICAgICAgICBOb3RlfXtEb2N1bWVudGF0aW9uIG9uIHRoZSBaSVAgZmlsZSBmb3JtYXQgYnkgUGhpbAotICAgICAgICAgICAgS2F0eiwgdGhlIGNyZWF0b3Igb2YgdGhlIGZvcm1hdCBhbmQgYWxnb3JpdGhtcyB1c2VkLn0KKyAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9idXNpbmVzc19hbmRfZGV2ZWxvcGVycy9kZXZlbG9wZXIvYXBwbm90ZS9dCisgICAgICAgICAgIHtQS1pJUCBBcHBsaWNhdGlvbiBOb3RlfXtEb2N1bWVudGF0aW9uIG9uIHRoZSBaSVAgZmlsZSBmb3JtYXQgYnkKKyAgICAgICAgICAgIFBoaWwgS2F0eiwgdGhlIGNyZWF0b3Igb2YgdGhlIGZvcm1hdCBhbmQgYWxnb3JpdGhtcyB1c2VkLn0KIAogICBcc2VldGl0bGVbaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvXXtJbmZvLVpJUCBIb21lIFBhZ2V9ewogICAgICAgICAgICAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIEluZm8tWklQIHByb2plY3QncyBaSVAgYXJjaGl2ZQpAQCAtNzcsNyArODMsNyBAQAogCiBcc3Vic2VjdGlvbntaaXBGaWxlIE9iamVjdHMgXGxhYmVse3ppcGZpbGUtb2JqZWN0c319CiAKLVxiZWdpbntjbGFzc2Rlc2N9e1ppcEZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgY29tcHJlc3Npb259fX0gCitcYmVnaW57Y2xhc3NkZXNjfXtaaXBGaWxlfXtmaWxlXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGNvbXByZXNzaW9uXG9wdGlvbmFseywgYWxsb3daaXA2NH19fX0gCiAgIE9wZW4gYSBaSVAgZmlsZSwgd2hlcmUgXHZhcntmaWxlfSBjYW4gYmUgZWl0aGVyIGEgcGF0aCB0byBhIGZpbGUKICAgKGEgc3RyaW5nKSBvciBhIGZpbGUtbGlrZSBvYmplY3QuICBUaGUgXHZhcnttb2RlfSBwYXJhbWV0ZXIKICAgc2hvdWxkIGJlIFxjb2RleydyJ30gdG8gcmVhZCBhbiBleGlzdGluZyBmaWxlLCBcY29kZXsndyd9IHRvCkBAIC0xMDAsNiArMTA2LDEyIEBACiAgIGlzIHNwZWNpZmllZCBidXQgdGhlIFxyZWZtb2R1bGV7emxpYn0gbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUsCiAgIFxleGNlcHRpb257UnVudGltZUVycm9yfSBpcyBhbHNvIHJhaXNlZC4gIFRoZSBkZWZhdWx0IGlzCiAgIFxjb25zdGFudHtaSVBfU1RPUkVEfS4gCisgIElmIFx2YXJ7YWxsb3daaXA2NH0gaXMgXGNvZGV7VHJ1ZX0gemlwZmlsZSB3aWxsIGNyZWF0ZSBaSVAgZmlsZXMgdGhhdCB1c2UKKyAgdGhlIFpJUDY0IGV4dGVuc2lvbnMgd2hlbiB0aGUgemlwZmlsZSBpcyBsYXJnZXIgdGhhbiAyIEdCLiBJZiBpdCBpcyAKKyAgZmFsc2UgKHRoZSBkZWZhdWx0KSBcbW9kdWxle3ppcGZpbGV9IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgIFpJUCBmaWxlIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucy4gWklQNjQgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkKKyAgZGVmYXVsdCBiZWNhdXNlIHRoZSBkZWZhdWx0IFxwcm9ncmFte3ppcH0gYW5kIFxwcm9ncmFte3VuemlwfSBjb21tYW5kcyBvbgorICBcVU5JWHt9ICh0aGUgSW5mb1pJUCB1dGlsaXRpZXMpIGRvbid0IHN1cHBvcnQgdGhlc2UgZXh0ZW5zaW9ucy4KIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KQEAgLTEzMiw4ICsxNDQsOCBAQAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317dGVzdHppcH17fQotICBSZWFkIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYW5kIGNoZWNrIHRoZWlyIENSQydzLiAgUmV0dXJuIHRoZQotICBuYW1lIG9mIHRoZSBmaXJzdCBiYWQgZmlsZSwgb3IgZWxzZSByZXR1cm4gXGNvZGV7Tm9uZX0uCisgIFJlYWQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhbmQgY2hlY2sgdGhlaXIgQ1JDJ3MgYW5kIGZpbGUKKyAgaGVhZGVycy4gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgYmFkIGZpbGUsIG9yIGVsc2UgcmV0dXJuIFxjb2Rle05vbmV9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317d3JpdGV9e2ZpbGVuYW1lXG9wdGlvbmFseywgYXJjbmFtZVxvcHRpb25hbHssCkBAIC0yNDMsOSArMjU1LDkgQEAKIAogXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de2V4dHJhfQogICBFeHBhbnNpb24gZmllbGQgZGF0YS4gIFRoZQotICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9hcHBub3RlLmh0bWxde1BLWklQIEFwcGxpY2F0aW9uCi0gIE5vdGV9IGNvbnRhaW5zIHNvbWUgY29tbWVudHMgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgZGF0YQotICBjb250YWluZWQgaW4gdGhpcyBzdHJpbmcuCisgIFxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KKyAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9IGNvbnRhaW5zIHNvbWUgY29tbWVudHMgb24gdGhlIGludGVybmFsCisgIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBzdHJpbmcuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtjcmVhdGVfc3lzdGVtfQpAQCAtMjg0LDEwICsyOTYsNiBAQAogICBCeXRlIG9mZnNldCB0byB0aGUgZmlsZSBoZWFkZXIuCiBcZW5ke21lbWJlcmRlc2N9CiAKLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtmaWxlX29mZnNldH0KLSAgQnl0ZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGRhdGEuCi1cZW5ke21lbWJlcmRlc2N9Ci0KIFxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtDUkN9CiAgIENSQy0zMiBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUuCiBcZW5ke21lbWJlcmRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXggYi9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXgKaW5kZXggNzcwZWEyMS4uMDk4ZTc4OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4CisrKyBiL0RvYy9saWIvbGliemlwaW1wb3J0LnRleApAQCAtNTAsOSArNTAsOSBAQAogCiAKIFxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2FwcG5vdGUuaHRtbF17UEtaSVAgQXBwbGljYXRpb24KLSAgICAgICAgICAgIE5vdGV9e0RvY3VtZW50YXRpb24gb24gdGhlIFpJUCBmaWxlIGZvcm1hdCBieSBQaGlsCi0gICAgICAgICAgICBLYXR6LCB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0IGFuZCBhbGdvcml0aG1zIHVzZWQufQorICBcc2VldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KKyAgICAgICAgICAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9e0RvY3VtZW50YXRpb24gb24gdGhlIFpJUCBmaWxlIGZvcm1hdCBieQorICAgICAgICAgICAgUGhpbCBLYXR6LCB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0IGFuZCBhbGdvcml0aG1zIHVzZWQufQogCiAgIFxzZWVwZXB7MDI3M317SW1wb3J0IE1vZHVsZXMgZnJvbSBaaXAgQXJjaGl2ZXN9e1dyaXR0ZW4gYnkgSmFtZXMgQy4KICAgICAgICAgICBBaGxzdHJvbSwgd2hvIGFsc28gcHJvdmlkZWQgYW4gaW1wbGVtZW50YXRpb24uIFB5dGhvbiAyLjMKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5CmluZGV4IDg5ZmMyNTAuLjIyNTI1ZTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkKKysrIGIvRG9jL2xpYi9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weQpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICAgICAgaWYgYnVmZmVyLmxzdHJpcCgpLnVwcGVyKCkuc3RhcnRzd2l0aCgiU0VMRUNUIik6CiAgICAgICAgICAgICAgICAgcHJpbnQgY3VyLmZldGNoYWxsKCkKICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuRXJyb3IsIGU6Ci0gICAgICAgICAgICBwcmludCAiQW4gZXJyb3Igb2NjdXJlZDoiLCBlLmFyZ3NbMF0KKyAgICAgICAgICAgIHByaW50ICJBbiBlcnJvciBvY2N1cnJlZDoiLCBlLmFyZ3NbMF0KICAgICAgICAgYnVmZmVyID0gIiIKIAogY29uLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvdGtpbnRlci50ZXggYi9Eb2MvbGliL3RraW50ZXIudGV4CmluZGV4IDQwNWYwNDEuLmRiNTJjYmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvdGtpbnRlci50ZXgKKysrIGIvRG9jL2xpYi90a2ludGVyLnRleApAQCAtMTgsMTAgKzE4LDkgQEAKIG1vZHVsZSBcbW9kdWxle1xfdGtpbnRlcn0gcHJvdmlkZXMgYSB0aHJlYWRzYWZlIG1lY2hhbmlzbSB3aGljaCBhbGxvd3MKIFB5dGhvbiBhbmQgVGNsIHRvIGludGVyYWN0LgogCi1UayBpcyBub3QgdGhlIG9ubHkgR1VJIGZvciBQeXRob24sIGJ1dCBpcyBob3dldmVyIHRoZSBtb3N0IGNvbW1vbmx5Ci11c2VkIG9uZTsgc2VlIHNlY3Rpb25+XHJlZntvdGhlci1ndWktbW9kdWxlc30sIGBgT3RoZXIgVXNlciBJbnRlcmZhY2UKLU1vZHVsZXMgYW5kIFBhY2thZ2VzLCcnIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG90aGVyIEdVSSB0b29sa2l0cyBmb3IKLVB5dGhvbi4KK1RrIGlzIG5vdCB0aGUgb25seSBHVUkgZm9yIFB5dGhvbjsgc2VlCitzZWN0aW9uflxyZWZ7b3RoZXItZ3VpLXBhY2thZ2VzfSwgYGBPdGhlciBVc2VyIEludGVyZmFjZSBNb2R1bGVzIGFuZAorUGFja2FnZXMsJycgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gb3RoZXIgR1VJIHRvb2xraXRzIGZvciBQeXRob24uCiAKICUgT3RoZXIgc2VjdGlvbnMgSSBoYXZlIGluIG1pbmQgYXJlCiAlIFRraW50ZXIgaW50ZXJuYWxzCkBAIC0xMDMsMTQgKzEwMiwxNCBAQAogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317VGNsfXtzY3JlZW5OYW1lPU5vbmUsIGJhc2VOYW1lPU5vbmUsIGNsYXNzTmFtZT0nVGsnLCB1c2VUaz0wfQotVGhlIFxmdW5jdGlvbntUY2x9IGZ1bmN0aW9uIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCBjcmVhdGVzIGFuIG9iamVjdAotbXVjaCBsaWtlIHRoYXQgY3JlYXRlZCBieSB0aGUgXGNsYXNze1RrfSBjbGFzcywgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QKLWluaXRpYWxpemUgdGhlIFRrIHN1YnN5c3RlbS4gIFRoaXMgaXMgbW9zdCBvZnRlbiB1c2VmdWwgd2hlbiBkcml2aW5nIHRoZSBUY2wKLWludGVycHJldGVyIGluIGFuIGVudmlyb25tZW50IHdoZXJlIG9uZSBkb2Vzbid0IHdhbnQgdG8gY3JlYXRlIGV4dHJhbmVvdXMKLXRvcGxldmVsIHdpbmRvd3MsIG9yIHdoZXJlIG9uZSBjYW5ub3QgKGkuZS4gVW5peC9MaW51eCBzeXN0ZW1zIHdpdGhvdXQgYW4gWAotc2VydmVyKS4gIEFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBcZnVuY3Rpb257VGNsfSBvYmplY3QgY2FuIGhhdmUgYSBUb3BsZXZlbAotd2luZG93IGNyZWF0ZWQgKGFuZCB0aGUgVGsgc3Vic3lzdGVtIGluaXRpYWxpemVkKSBieSBjYWxsaW5nIGl0cwotXG1ldGhvZHtsb2FkdGt9IG1ldGhvZC4KK1RoZSBcZnVuY3Rpb257VGNsfSBmdW5jdGlvbiBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbgorb2JqZWN0IG11Y2ggbGlrZSB0aGF0IGNyZWF0ZWQgYnkgdGhlIFxjbGFzc3tUa30gY2xhc3MsIGV4Y2VwdCB0aGF0IGl0Citkb2VzIG5vdCBpbml0aWFsaXplIHRoZSBUayBzdWJzeXN0ZW0uICBUaGlzIGlzIG1vc3Qgb2Z0ZW4gdXNlZnVsIHdoZW4KK2RyaXZpbmcgdGhlIFRjbCBpbnRlcnByZXRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBvbmUgZG9lc24ndCB3YW50Cit0byBjcmVhdGUgZXh0cmFuZW91cyB0b3BsZXZlbCB3aW5kb3dzLCBvciB3aGVyZSBvbmUgY2Fubm90IChzdWNoIGFzCitcVU5JWC9MaW51eCBzeXN0ZW1zIHdpdGhvdXQgYW4gWCBzZXJ2ZXIpLiAgQW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlCitcZnVuY3Rpb257VGNsfSBvYmplY3QgY2FuIGhhdmUgYSBUb3BsZXZlbCB3aW5kb3cgY3JlYXRlZCAoYW5kIHRoZSBUaworc3Vic3lzdGVtIGluaXRpYWxpemVkKSBieSBjYWxsaW5nIGl0cyBcbWV0aG9ke2xvYWR0a30gbWV0aG9kLgogXHZlcnNpb25hZGRlZHsyLjR9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC0zMTYsMTAgKzMxNSwxMCBAQAogcGVyaW9kcy4gIEZvciBleGFtcGxlLCBcY29kZXsubXlBcHAuY29udHJvbFBhbmVsLm9rQnV0dG9ufSBtaWdodCBiZQogdGhlIG5hbWUgb2YgYSB3aWRnZXQuCiAKLVxpdGVtW1x2YXJ7b3B0aW9uc30gXQorXGl0ZW1bXHZhcntvcHRpb25zfV0KIGNvbmZpZ3VyZSB0aGUgd2lkZ2V0J3MgYXBwZWFyYW5jZSBhbmQgaW4gc29tZSBjYXNlcywgaXRzCiBiZWhhdmlvci4gIFRoZSBvcHRpb25zIGNvbWUgaW4gdGhlIGZvcm0gb2YgYSBsaXN0IG9mIGZsYWdzIGFuZCB2YWx1ZXMuCi1GbGFncyBhcmUgcHJvY2VlZGVkIGJ5IGEgYC0nLCBsaWtlIHVuaXggc2hlbGwgY29tbWFuZCBmbGFncywgYW5kCitGbGFncyBhcmUgcHJvY2VlZGVkIGJ5IGEgYC0nLCBsaWtlIFxVTklYe30gc2hlbGwgY29tbWFuZCBmbGFncywgYW5kCiB2YWx1ZXMgYXJlIHB1dCBpbiBxdW90ZXMgaWYgdGhleSBhcmUgbW9yZSB0aGFuIG9uZSB3b3JkLgogXGVuZHtkZXNjcmlwdGlvbn0KIApAQCAtMTgwNiwyNCArMTgwNSwyOSBAQAogdGhyb3VnaCB0aGUgVGsvVGNsIGxheWVyLn0KIFxlbmR7c2VlYWxzbyp9CiAKLQotVGsgaXMgbm90IHRoZSBvbmx5IEdVSSBmb3IgUHl0aG9uLCBidXQgaXMgaG93ZXZlciB0aGUKLW1vc3QgY29tbW9ubHkgdXNlZCBvbmUuCitPdGhlciBHVUkgcGFja2FnZXMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBQeXRob246CiAKIFxiZWdpbntzZWVhbHNvKn0KLVxzZWV0aXRsZVtodHRwOi8vd3d3Lnd4d2luZG93cy5vcmdde3d4V2luZG93c317Ci1pcyBhIEdVSSB0b29sa2l0IHRoYXQgY29tYmluZXMgdGhlIG1vc3QgYXR0cmFjdGl2ZSBhdHRyaWJ1dGVzIG9mIFF0LAotVGssIE1vdGlmLCBhbmQgR1RLKyBpbiBvbmUgcG93ZXJmdWwgYW5kIGVmZmljaWVudCBwYWNrYWdlLiBJdCBpcwotaW1wbGVtZW50ZWQgaW4gXENwcC4gd3hXaW5kb3dzIHN1cHBvcnRzIHR3byBmbGF2b3JzIG9mIFxVTklYe30KLWltcGxlbWVudGF0aW9uOiBHVEsrIGFuZCBNb3RpZiwgYW5kIHVuZGVyIFdpbmRvd3MsIGl0IGhhcyBhIHN0YW5kYXJkCi1NaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzc2VzIChNRkMpIGFwcGVhcmFuY2UsIGJlY2F1c2UgaXQgdXNlcyBXaW4zMgotd2lkZ2V0cy4gIFRoZXJlIGlzIGEgUHl0aG9uIGNsYXNzIHdyYXBwZXIsIGluZGVwZW5kZW50IG9mIFRraW50ZXIuCi0KLXd4V2luZG93cyBpcyBtdWNoIHJpY2hlciBpbiB3aWRnZXRzIHRoYW4gXHJlZm1vZHVsZXtUa2ludGVyfSwgd2l0aCBpdHMKLWhlbHAgc3lzdGVtLCBzb3BoaXN0aWNhdGVkIEhUTUwgYW5kIGltYWdlIHZpZXdlcnMsIGFuZCBvdGhlcgotc3BlY2lhbGl6ZWQgd2lkZ2V0cywgZXh0ZW5zaXZlIGRvY3VtZW50YXRpb24sIGFuZCBwcmludGluZyBjYXBhYmlsaXRpZXMuCitcc2VldGl0bGVbaHR0cDovL3d3dy53eHB5dGhvbi5vcmdde3d4UHl0aG9ufXsKK3d4UHl0aG9uIGlzIGEgY3Jvc3MtcGxhdGZvcm0gR1VJIHRvb2xraXQgZm9yIFB5dGhvbiB0aGF0IGlzIGJ1aWx0Cithcm91bmQgdGhlIHBvcHVsYXIgXHVsaW5re3d4V2lkZ2V0c317aHR0cDovL3d3dy53eHdpZGdldHMub3JnL30gXENwcHt9Cit0b29sa2l0LiCgSXQgcHJvdmlkZXMgYSBuYXRpdmUgbG9vayBhbmQgZmVlbCBmb3IgYXBwbGljYXRpb25zIG9uCitXaW5kb3dzLCBNYWMgT1MgWCwgYW5kIFxVTklYe30gc3lzdGVtcyBieSB1c2luZyBlYWNoIHBsYXRmb3JtJ3MgbmF0aXZlCit3aWRnZXRzIHdoZXJlIGV2ZXIgcG9zc2libGUsIChHVEsrIG9uIFxVTklYLWxpa2Ugc3lzdGVtcykuIKBJbgorYWRkaXRpb24gdG8gYW4gZXh0ZW5zaXZlIHNldCBvZiB3aWRnZXRzLCB3eFB5dGhvbiBwcm92aWRlcyBjbGFzc2VzIGZvcgorb25saW5lIGRvY3VtZW50YXRpb24gYW5kIGNvbnRleHQgc2Vuc2l0aXZlIGhlbHAsIHByaW50aW5nLCBIVE1MCit2aWV3aW5nLCBsb3ctbGV2ZWwgZGV2aWNlIGNvbnRleHQgZHJhd2luZywgZHJhZyBhbmQgZHJvcCwgc3lzdGVtCitjbGlwYm9hcmQgYWNjZXNzLCBhbiBYTUwtYmFzZWQgcmVzb3VyY2UgZm9ybWF0IGFuZCBtb3JlLCBpbmNsdWRpbmcgYW4KK2V2ZXIgZ3Jvd2luZyBsaWJyYXJ5IG9mIHVzZXItY29udHJpYnV0ZWQgbW9kdWxlcy4goEJvdGggdGhlIHd4V2lkZ2V0cworYW5kIHd4UHl0aG9uIHByb2plY3RzIGFyZSB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQgYW5kIGNvbnRpbnVvdXMKK2ltcHJvdmVtZW50LCBhbmQgaGF2ZSBhY3RpdmUgYW5kIGhlbHBmdWwgdXNlciBhbmQgZGV2ZWxvcGVyCitjb21tdW5pdGllcy4KIH0KLVxzZWV0aXRsZVtde1B5UXR9eworXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzE5MzIzOTQ2MjFdCit7d3hQeXRob24gaW4gQWN0aW9ufXsKK1RoZSB3eFB5dGhvbiBib29rLCBieSBOb2VsIFJhcHBpbiBhbmQgUm9iaW4gRHVubi4KK30KK1xzZWV0aXRsZXtQeVF0fXsKIFB5UXQgaXMgYSBccHJvZ3JhbXtzaXB9LXdyYXBwZWQgYmluZGluZyB0byB0aGUgUXQgdG9vbGtpdC4gIFF0IGlzIGFuCiBleHRlbnNpdmUgXENwcHt9IEdVSSB0b29sa2l0IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBcVU5JWCwgV2luZG93cyBhbmQKIE1hYyBPUyBYLiAgXHByb2dyYW17c2lwfSBpcyBhIHRvb2wgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MgZm9yIFxDcHB7fQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJtYWNmcy50ZXggYi9Eb2MvbWFjL2xpYm1hY2ZzLnRleAppbmRleCA5NDRlYTFiLi4xMmE3Y2MzIDEwMDY0NAotLS0gYS9Eb2MvbWFjL2xpYm1hY2ZzLnRleAorKysgYi9Eb2MvbWFjL2xpYm1hY2ZzLnRleApAQCAtMjIsMTAgKzIyLDEwIEBACiBhcmd1bWVudCBjYW4gYmUgb25lIG9mIHRocmVlIHRoaW5nczpcICgxKSBhIGZ1bGwgb3IgcGFydGlhbCBNYWNpbnRvc2gKIHBhdGhuYW1lLCAoMikgYW4gXGNsYXNze0ZTU3BlY30gb2JqZWN0IG9yICgzKSBhIDMtdHVwbGUKIFxjb2RleyhcdmFye3dkUmVmTnVtfSwgXHZhcntwYXJJRH0sIFx2YXJ7bmFtZX0pfSBhcyBkZXNjcmliZWQgaW4KLVxjaXRldGl0bGV7SW5zaWRlIE1hY2ludG9zaDpcIEZpbGVzfS4gQW4gXGNsYXNze0ZTU3BlY30gY2FuIHBvaW50IHRvCitcY2l0ZXRpdGxle0luc2lkZSBNYWNpbnRvc2g6XCBGaWxlc30uICBBbiBcY2xhc3N7RlNTcGVjfSBjYW4gcG9pbnQgdG8KIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFzIGxvbmcgYXMgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBmaWxlIGV4aXN0cy4KLVVuZGVyIE1hY1B5dGhvbiB0aGUgc2FtZSBpcyB0cnVlIGZvciBhIHBhdGhuYW1lLCBidXQgbm90IHVuZGVyIHVuaXgtUHl0b24KLWJlY2F1c2Ugb2YgdGhlIHdheSBwYXRobmFtZXMgYW5kIEZTUmVmcyB3b3Jrcy4gU2VlIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbgorVW5kZXIgTWFjUHl0aG9uIHRoZSBzYW1lIGlzIHRydWUgZm9yIGEgcGF0aG5hbWUsIGJ1dCBub3QgdW5kZXIgXFVOSVgtUHl0aG9uCitiZWNhdXNlIG9mIHRoZSB3YXkgcGF0aG5hbWVzIGFuZCBGU1JlZnMgd29ya3MuICBTZWUgQXBwbGUncyBkb2N1bWVudGF0aW9uCiBmb3IgZGV0YWlscy4KIAogQSBkZXNjcmlwdGlvbiBvZiBhbGlhc2VzIGFuZCB0aGUKZGlmZiAtLWdpdCBhL0RvYy9tYWMvbGlibWFjb3MudGV4IGIvRG9jL21hYy9saWJtYWNvcy50ZXgKaW5kZXggYjIyYjM5Yy4uZTUwYjk5YiAxMDA2NDQKLS0tIGEvRG9jL21hYy9saWJtYWNvcy50ZXgKKysrIGIvRG9jL21hYy9saWJtYWNvcy50ZXgKQEAgLTI1LDcgKzI1LDcgQEAKIGluY29tcGF0aWJsZSBiZXR3ZWVuIGxpbmtpbmcgbW9kZWxzLCBwYWNrYWdlcyBjb3VsZCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBnaXZlCiBtb3JlIGRlY2VudCBlcnJvciBtZXNzYWdlcy4gVGhlIHZhbHVlIGlzIG9uZSBvZiBcY29kZXsnc3RhdGljJ30gZm9yIGEKIHN0YXRpY2FsbHkgbGlua2VkIFB5dGhvbiwgXGNvZGV7J2ZyYW1ld29yayd9IGZvciBQeXRob24gaW4gYSBNYWMgT1MgWCBmcmFtZXdvcmssCi1cY29kZXsnc2hhcmVkJ30gZm9yIFB5dGhvbiBpbiBhIHN0YW5kYXJkIHVuaXggc2hhcmVkIGxpYnJhcnkuCitcY29kZXsnc2hhcmVkJ30gZm9yIFB5dGhvbiBpbiBhIHN0YW5kYXJkIFxVTklYe30gc2hhcmVkIGxpYnJhcnkuCiBPbGRlciBQeXRob25zIGNvdWxkIGFsc28gaGF2ZSB0aGUgdmFsdWUKIFxjb2RleydjZm0nfSBmb3IgTWFjIE9TIDktY29tcGF0aWJsZSBQeXRob24uCiBcZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy91c2luZy50ZXggYi9Eb2MvbWFjL3VzaW5nLnRleAppbmRleCBiZmE0NzhlLi5iMjFhOThlIDEwMDY0NAotLS0gYS9Eb2MvbWFjL3VzaW5nLnRleAorKysgYi9Eb2MvbWFjL3VzaW5nLnRleApAQCAtNiw3ICs2LDcgQEAKIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIElERSBhbmQgdGhlIFBhY2thZ2UgTWFuYWdlciB0aGF0IGFyZSB3b3J0aCBwb2ludGluZyBvdXQuCiAKIFB5dGhvbiBvbiBNYWMgT1MgOSBvciBlYXJsaWVyIGNhbiBiZSBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBQeXRob24gb24KLVVuaXggb3IgV2luZG93cywgYnV0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwsIGFzIHRoYXQgcGxhdGZvcm0KK1xVTklYe30gb3IgV2luZG93cywgYnV0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwsIGFzIHRoYXQgcGxhdGZvcm0KIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNC4gU2VlCiBcdXJse2h0dHA6Ly93d3cuY3dpLm5sL1x0ZXh0YXNjaWl0aWxkZSBqYWNrL21hY3B5dGhvbn0gZm9yIGluc3RhbGxlcnMKIGZvciB0aGUgbGF0ZXN0IDIuMyByZWxlYXNlIGZvciBNYWMgT1MgOSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWYyLnRleCBiL0RvYy9yZWYvcmVmMi50ZXgKaW5kZXggMmVkOGE1ZC4uYmFkNDYwOSAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWYyLnRleAorKysgYi9Eb2MvcmVmL3JlZjIudGV4CkBAIC01Niw3ICs1Niw3IEBACiAKIEEgcGh5c2ljYWwgbGluZSBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGVybWluYXRlZCBieSBhbiBlbmQtb2YtbGluZQogc2VxdWVuY2UuICBJbiBzb3VyY2UgZmlsZXMsIGFueSBvZiB0aGUgc3RhbmRhcmQgcGxhdGZvcm0gbGluZQotdGVybWluYXRpb24gc2VxdWVuY2VzIGNhbiBiZSB1c2VkIC0gdGhlIFxVTklYIGZvcm0gdXNpbmcgXEFTQ0lJe30gTEYKK3Rlcm1pbmF0aW9uIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCAtIHRoZSBcVU5JWHt9IGZvcm0gdXNpbmcgXEFTQ0lJe30gTEYKIChsaW5lZmVlZCksIHRoZSBXaW5kb3dzIGZvcm0gdXNpbmcgdGhlIFxBU0NJSXt9IHNlcXVlbmNlIENSIExGIChyZXR1cm4KIGZvbGxvd2VkIGJ5IGxpbmVmZWVkKSwgb3IgdGhlIE1hY2ludG9zaCBmb3JtIHVzaW5nIHRoZSBcQVNDSUl7fSBDUgogKHJldHVybikgY2hhcmFjdGVyLiAgQWxsIG9mIHRoZXNlIGZvcm1zIGNhbiBiZSB1c2VkIGVxdWFsbHksIHJlZ2FyZGxlc3MKZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmMy50ZXggYi9Eb2MvcmVmL3JlZjMudGV4CmluZGV4IGQwYzhjY2YuLjE1ZmMxODggMTAwNjQ0Ci0tLSBhL0RvYy9yZWYvcmVmMy50ZXgKKysrIGIvRG9jL3JlZi9yZWYzLnRleApAQCAtMTMwNyw2ICsxMzA3LDExIEBACiBzaW5jZSB0aGUgZGljdGlvbmFyeSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IGEga2V5J3MgaGFzaCB2YWx1ZQogaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0J3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZQogd3JvbmcgaGFzaCBidWNrZXQpLgorCitcdmVyc2lvbmNoYW5nZWRbXG1ldGhvZHtfX2hhc2hfXygpfSBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZworaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaAorb2YgdGhhdCBvYmplY3RdezIuNX0KKwogXHdpdGhzdWJpdGVteyhvYmplY3QgbWV0aG9kKX17XHR0aW5kZXh7X19jbXBfXygpfX0KIFxlbmR7bWV0aG9kZGVzY30KIApAQCAtMTg4Niw2ICsxODkxLDkgQEAKIFxtZXRob2R7X19wb3dfXygpfSBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHQgYW4gb3B0aW9uYWwgdGhpcmQKIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluCiBcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30gZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLgorCitJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGUKK3N1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiBcY29kZXtOb3RJbXBsZW1lbnRlZH0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtudW1lcmljIG9iamVjdF17X19kaXZfX317c2VsZiwgb3RoZXJ9CkBAIC0xOTE4LDEzICsxOTI2LDI4IEBACiBcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PDx9LAogXGNvZGV7Pj59LCBcY29kZXtcJn0sIFxjb2Rle1xefSwgXGNvZGV7fH0pIHdpdGggcmVmbGVjdGVkCiAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0Ci1vcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uLiAgRm9yIGluc3RhbmNlLAotdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gXHZhcnt4fVxjb2Rley19XHZhcnt5fSwgd2hlcmUgXHZhcnt5fSBpcyBhbgotaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiBcbWV0aG9ke19fcnN1Yl9fKCl9IG1ldGhvZCwKLVxjb2Rle1x2YXJ7eX0uX19yc3ViX18oXHZhcnt4fSl9IGlzIGNhbGxlZC4gIE5vdGUgdGhhdCB0ZXJuYXJ5CitvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUKK29wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuXGZvb3Rub3RleworICAgIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlCisgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QgKHN1Y2ggYXMgXG1ldGhvZHtfX2FkZF9fKCl9KSBmYWlscyB0aGUKKyAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5IHRoZSByZWZsZWN0ZWQgbWV0aG9kCisgICAgaXMgbm90IGNhbGxlZC59IAorRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBcdmFye3h9XGNvZGV7LX1cdmFye3l9LAord2hlcmUgXHZhcnt5fSBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuCitcbWV0aG9ke19fcnN1Yl9fKCl9IG1ldGhvZCwgXGNvZGV7XHZhcnt5fS5fX3JzdWJfXyhcdmFye3h9KX0KK2lzIGNhbGxlZCBpZiBcY29kZXtcdmFye3h9Ll9fc3ViX18oXHZhcnt5fSl9IHJldHVybnMKK1x2YXJ7Tm90SW1wbGVtZW50ZWR9LgorCitOb3RlIHRoYXQgdGVybmFyeQogXGZ1bmN0aW9ue3BvdygpfVxiaWZ1bmNpbmRleHtwb3d9IHdpbGwgbm90IHRyeSBjYWxsaW5nCiBcbWV0aG9ke19fcnBvd19fKCl9ICh0aGUgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbwogY29tcGxpY2F0ZWQpLgorCitcbm90ZXtJZiB0aGUgcmlnaHQgb3BlcmFuZCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kJ3MKKyAgICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZQorICAgICAgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZCdzCisgICAgICBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXMgdG8KKyAgICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy59CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtudW1lcmljIG9iamVjdF17X19pYWRkX199e3NlbGYsIG90aGVyfQpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY0LnRleCBiL0RvYy9yZWYvcmVmNC50ZXgKaW5kZXggZGNkYzgyMy4uMTJhMmI5MiAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY0LnRleAorKysgYi9Eb2MvcmVmL3JlZjQudGV4CkBAIC05NywxMCArOTcsMjAgQEAKIFRoZSBidWlsdC1pbiBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrCiBpcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIFxjb2Rle19fYnVpbHRpbnNfX30gaW4gaXRzCiBnbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZQotbGF0dGVyIGNhc2UgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBOb3JtYWxseSwgdGhlCi1cY29kZXtfX2J1aWx0aW5zX199IG5hbWVzcGFjZSBpcyB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYnVpbHQtaW4gbW9kdWxlCi1cbW9kdWxle19fYnVpbHRpbl9ffSAobm90ZTogbm8gYHMnKS4gIElmIGl0IGlzbid0LCByZXN0cmljdGVkCi1leGVjdXRpb25caW5kZXhpaXtyZXN0cmljdGVkfXtleGVjdXRpb259IG1vZGUgaXMgaW4gZWZmZWN0LgorbGF0dGVyIGNhc2UgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZQorXG1vZHVsZXtfX21haW5fX30gbW9kdWxlLCBcY29kZXtfX2J1aWx0aW5zX199IGlzIHRoZSBidWlsdC1pbiBtb2R1bGUKK1xtb2R1bGV7X19idWlsdGluX199IChub3RlOiBubyBgcycpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsCitcY29kZXtfX2J1aWx0aW5zX199IGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUKK1xtb2R1bGV7X19idWlsdGluX199IG1vZHVsZSBpdHNlbGYuICBcY29kZXtfX2J1aWx0aW5zX199IGNhbiBiZSBzZXQKK3RvIGEgdXNlci1jcmVhdGVkIGRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQKK2V4ZWN1dGlvblxpbmRleGlpe3Jlc3RyaWN0ZWR9e2V4ZWN1dGlvbn0uCisKK1xiZWdpbntub3RpY2V9CisgIFVzZXJzIHNob3VsZCBub3QgdG91Y2ggXGNvZGV7X19idWlsdGluc19ffTsgaXQgaXMgc3RyaWN0bHkgYW4KKyAgaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnMgd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlCisgIGJ1aWx0LWluIG5hbWVzcGFjZSBzaG91bGQgXGtleXdvcmR7aW1wb3J0fSB0aGUgXG1vZHVsZXtfX2J1aWx0aW5fX30KKyAgKG5vIGBzJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS4KK1xlbmR7bm90aWNlfQogCiBUaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYQogbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjUudGV4IGIvRG9jL3JlZi9yZWY1LnRleAppbmRleCA4OWY5OTc3Li45MDllNWJiIDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjUudGV4CisrKyBiL0RvYy9yZWYvcmVmNS50ZXgKQEAgLTkwNyw3ICs5MDcsMTAgQEAKIHRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuCiBJZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwKIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIFxlbXBoe2Fsd2F5c30gY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlCi1vcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuCitvcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuICBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbgorYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHRpbiB0eXBlcyBieSBkZWZpbmluZyBhIFxjb2Rle19fY21wX199CittZXRob2Qgb3IgcmljaCBjb21wYXJpc29uIG1ldGhvZHMgbGlrZSBcY29kZXtfX2d0X199LCBkZXNjcmliZWQgaW4KK3NlY3Rpb25+XHJlZntzcGVjaWFsbmFtZXN9LgogCiAoVGhpcyB1bnVzdWFsIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiB3YXMgdXNlZCB0byBzaW1wbGlmeSB0aGUKIGRlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBsaWtlIHNvcnRpbmcgYW5kIHRoZSBca2V5d29yZHtpbn0gYW5kCkBAIC05NTIsNyArOTU1LDggQEAKICAgYSBkaWN0aW9uYXJ5IGZvciBlbXB0aW5lc3MgYnkgY29tcGFyaW5nIGl0IHRvIFxjb2Rle1x7XH19Ln0KIAogXGl0ZW0KLU1vc3Qgb3RoZXIgdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5IGFyZSB0aGUgc2FtZSBvYmplY3Q7CitNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHRpbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXkgYXJlCit0aGUgc2FtZSBvYmplY3Q7CiB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgb3IgbGFyZ2VyIHRoYW4KIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0IGNvbnNpc3RlbnRseSB3aXRoaW4gb25lCiBleGVjdXRpb24gb2YgYSBwcm9ncmFtLgpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY4LnRleCBiL0RvYy9yZWYvcmVmOC50ZXgKaW5kZXggODAxYWI1OC4uNDViZTcxZCAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY4LnRleAorKysgYi9Eb2MvcmVmL3JlZjgudGV4CkBAIC0zNCw3ICszNCw3IEBACiBcaW5kZXh7aW50ZXJhY3RpdmUgbW9kZX0KIFxyZWZiaW1vZGluZGV4e19fbWFpbl9ffQogCi1VbmRlciB7XFVOSVh9LCBhIGNvbXBsZXRlIHByb2dyYW0gY2FuIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgaW4KK1VuZGVyIFxVTklYLCBhIGNvbXBsZXRlIHByb2dyYW0gY2FuIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgaW4KIHRocmVlIGZvcm1zOiB3aXRoIHRoZSBccHJvZ3JhbW9wdHstY30gXHZhcntzdHJpbmd9IGNvbW1hbmQgbGluZSBvcHRpb24sIGFzIGEKIGZpbGUgcGFzc2VkIGFzIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUgYXJndW1lbnQsIG9yIGFzIHN0YW5kYXJkIGlucHV0LgogSWYgdGhlIGZpbGUgb3Igc3RhbmRhcmQgaW5wdXQgaXMgYSB0dHkgZGV2aWNlLCB0aGUgaW50ZXJwcmV0ZXIgZW50ZXJzCmRpZmYgLS1naXQgYS9Eb2MvdHV0L3R1dC50ZXggYi9Eb2MvdHV0L3R1dC50ZXgKaW5kZXggNGUwYTI2Yi4uMWIwOGE4ZSAxMDA2NDQKLS0tIGEvRG9jL3R1dC90dXQudGV4CisrKyBiL0RvYy90dXQvdHV0LnRleApAQCAtMjkzMSwxNCArMjkzMSwxMyBAQAogCiBUaGUgc3VibW9kdWxlcyBvZnRlbiBuZWVkIHRvIHJlZmVyIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgdGhlCiBcbW9kdWxle3N1cnJvdW5kfSBtb2R1bGUgbWlnaHQgdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZS4gIEluIGZhY3QsCi1zdWNoIHJlZmVyZW5jZXMKLWFyZSBzbyBjb21tb24gdGhhdCB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgZmlyc3QgbG9va3MgaW4gdGhlCi1jb250YWluaW5nIHBhY2thZ2UgYmVmb3JlIGxvb2tpbmcgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZSBzZWFyY2ggcGF0aC4KLVRodXMsIHRoZSBzdXJyb3VuZCBtb2R1bGUgY2FuIHNpbXBseSB1c2UgXGNvZGV7aW1wb3J0IGVjaG99IG9yCi1cY29kZXtmcm9tIGVjaG8gaW1wb3J0IGVjaG9maWx0ZXJ9LiAgSWYgdGhlIGltcG9ydGVkIG1vZHVsZSBpcyBub3QKLWZvdW5kIGluIHRoZSBjdXJyZW50IHBhY2thZ2UgKHRoZSBwYWNrYWdlIG9mIHdoaWNoIHRoZSBjdXJyZW50IG1vZHVsZQotaXMgYSBzdWJtb2R1bGUpLCB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgbG9va3MgZm9yIGEgdG9wLWxldmVsCi1tb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KK3N1Y2ggcmVmZXJlbmNlcyBhcmUgc28gY29tbW9uIHRoYXQgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50CitmaXJzdCBsb29rcyBpbiB0aGUgY29udGFpbmluZyBwYWNrYWdlIGJlZm9yZSBsb29raW5nIGluIHRoZSBzdGFuZGFyZAorbW9kdWxlIHNlYXJjaCBwYXRoLiBUaHVzLCB0aGUgXG1vZHVsZXtzdXJyb3VuZH0gbW9kdWxlIGNhbiBzaW1wbHkgdXNlCitcY29kZXtpbXBvcnQgZWNob30gb3IgXGNvZGV7ZnJvbSBlY2hvIGltcG9ydCBlY2hvZmlsdGVyfS4gIElmIHRoZQoraW1wb3J0ZWQgbW9kdWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBwYWNrYWdlICh0aGUgcGFja2FnZSBvZgord2hpY2ggdGhlIGN1cnJlbnQgbW9kdWxlIGlzIGEgc3VibW9kdWxlKSwgdGhlIFxrZXl3b3Jke2ltcG9ydH0KK3N0YXRlbWVudCBsb29rcyBmb3IgYSB0b3AtbGV2ZWwgbW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAKIFdoZW4gcGFja2FnZXMgYXJlIHN0cnVjdHVyZWQgaW50byBzdWJwYWNrYWdlcyAoYXMgd2l0aCB0aGUKIFxtb2R1bGV7U291bmR9IHBhY2thZ2UgaW4gdGhlIGV4YW1wbGUpLCB0aGVyZSdzIG5vIHNob3J0Y3V0IHRvIHJlZmVyCkBAIC0yOTQ4LDYgKzI5NDcsMjQgQEAKIGluIHRoZSBcbW9kdWxle1NvdW5kLkVmZmVjdHN9IHBhY2thZ2UsIGl0IGNhbiB1c2UgXGNvZGV7ZnJvbQogU291bmQuRWZmZWN0cyBpbXBvcnQgZWNob30uCiAKK1N0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSwgaW4gYWRkaXRpb24gdG8gdGhlIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMKK2Rlc2NyaWJlZCBhYm92ZSwgeW91IGNhbiB3cml0ZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnRzIHdpdGggdGhlCitcY29kZXtmcm9tIG1vZHVsZSBpbXBvcnQgbmFtZX0gZm9ybSBvZiBpbXBvcnQgc3RhdGVtZW50LiBUaGVzZSBleHBsaWNpdAorcmVsYXRpdmUgaW1wb3J0cyB1c2UgbGVhZGluZyBkb3RzIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IGFuZCBwYXJlbnQKK3BhY2thZ2VzIGludm9sdmVkIGluIHRoZSByZWxhdGl2ZSBpbXBvcnQuIEZyb20gdGhlIFxtb2R1bGV7c3Vycm91bmR9Cittb2R1bGUgZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2U6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gLiBpbXBvcnQgZWNobworZnJvbSAuLiBpbXBvcnQgRm9ybWF0cworZnJvbSAuLkZpbHRlcnMgaW1wb3J0IGVxdWFsaXplcgorXGVuZHt2ZXJiYXRpbX0KKworTm90ZSB0aGF0IGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMgYXJlIGJhc2VkIG9uIHRoZQorbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUuIFNpbmNlIHRoZSBuYW1lIG9mIHRoZSBtYWluIG1vZHVsZSBpcyBhbHdheXMKK1xjb2RleyJfX21haW5fXyJ9LCBtb2R1bGVzIGludGVuZGVkIGZvciB1c2UgYXMgdGhlIG1haW4gbW9kdWxlIG9mIGEKK1B5dGhvbiBhcHBsaWNhdGlvbiBzaG91bGQgYWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnRzLgorCiBcc3Vic2VjdGlvbntQYWNrYWdlcyBpbiBNdWx0aXBsZSBEaXJlY3Rvcmllc30KIAogUGFja2FnZXMgc3VwcG9ydCBvbmUgbW9yZSBzcGVjaWFsIGF0dHJpYnV0ZSwgXG1lbWJlcntfX3BhdGhfX30uICBUaGlzCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXgKaW5kZXggNTZkMTViOC4uMzYwZDdkYyAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleApAQCAtMjE2LDcgKzIxNiw3IEBACiBjaGFyYWN0ZXIgcHJvcGVydGllcy4gIEZvciBleGFtcGxlLCBcY29kZXt1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKX0KIHJldHVybnMgdGhlIDItY2hhcmFjdGVyIHN0cmluZyAnTHUnLCB0aGUgJ0wnIGRlbm90aW5nIGl0J3MgYSBsZXR0ZXIsCiBhbmQgJ3UnIG1lYW5pbmcgdGhhdCBpdCdzIHVwcGVyY2FzZS4KLVxjb2Rle3UuYmlkaXJlY3Rpb25hbCh1J1xlIHgwNjYwJyl9IHJldHVybnMgJ0FOJywgbWVhbmluZyB0aGF0IFUrMDY2MCBpcworXGNvZGV7dW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbCh1J1xlIHUwNjYwJyl9IHJldHVybnMgJ0FOJywgbWVhbmluZyB0aGF0IFUrMDY2MCBpcwogYW4gQXJhYmljIG51bWJlci4KIAogVGhlIFxtb2R1bGV7Y29kZWNzfSBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIGxvb2sgdXAgZXhpc3RpbmcgZW5jb2RpbmdzCkBAIC01NzEsNyArNTcxLDcgQEAKIAogVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQgY2FuIG5vdyBoYXZlIGl0cyBvdXRwdXQgZGlyZWN0ZWQgdG8gYQogZmlsZS1saWtlIG9iamVjdCBieSBmb2xsb3dpbmcgdGhlIFxrZXl3b3Jke3ByaW50fSB3aXRoIAotXHZlcmJ8Pj4gZmlsZXwsIHNpbWlsYXIgdG8gdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yIGluIFVuaXggc2hlbGxzLgorXHZlcmJ8Pj4gZmlsZXwsIHNpbWlsYXIgdG8gdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yIGluIFxVTklYe30gc2hlbGxzLgogUHJldmlvdXNseSB5b3UnZCBlaXRoZXIgaGF2ZSB0byB1c2UgdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIG9mIHRoZQogZmlsZS1saWtlIG9iamVjdCwgd2hpY2ggbGFja3MgdGhlIGNvbnZlbmllbmNlIGFuZCBzaW1wbGljaXR5IG9mCiBca2V5d29yZHtwcmludH0sIG9yIHlvdSBjb3VsZCBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gCkBAIC03NzcsNyArNzc3LDcgQEAKIAogU29tZSB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gbWFrZSBpbnRlZ2VycyBhbmQgbG9uZyBpbnRlZ2VycyBhIGJpdCBtb3JlCiBpbnRlcmNoYW5nZWFibGUuICBJbiAxLjUuMiwgbGFyZ2UtZmlsZSBzdXBwb3J0IHdhcyBhZGRlZCBmb3IgU29sYXJpcywKLXRvIGFsbG93IHJlYWRpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMkdiOyB0aGlzIG1hZGUgdGhlIFxtZXRob2R7dGVsbCgpfQordG8gYWxsb3cgcmVhZGluZyBmaWxlcyBsYXJnZXIgdGhhbiAyfkdpQjsgdGhpcyBtYWRlIHRoZSBcbWV0aG9ke3RlbGwoKX0KIG1ldGhvZCBvZiBmaWxlIG9iamVjdHMgcmV0dXJuIGEgbG9uZyBpbnRlZ2VyIGluc3RlYWQgb2YgYSByZWd1bGFyCiBpbnRlZ2VyLiAgU29tZSBjb2RlIHdvdWxkIHN1YnRyYWN0IHR3byBmaWxlIG9mZnNldHMgYW5kIGF0dGVtcHQgdG8gdXNlCiB0aGUgcmVzdWx0IHRvIG11bHRpcGx5IGEgc2VxdWVuY2Ugb3Igc2xpY2UgYSBzdHJpbmcsIGJ1dCB0aGlzIHJhaXNlZCBhCkBAIC04OTQsNyArODk0LDcgQEAKIG5hbWUuICBUaGlzIHRoaXJkIGFyZ3VtZW50IGlzLCByZXNwZWN0aXZlbHksIGEgUHl0aG9uIG9iamVjdCwgYSBDCiBsb25nLCBvciBhIEMgc3RyaW5nLgogCi1BIHdyYXBwZXIgQVBJIHdhcyBhZGRlZCBmb3IgVW5peC1zdHlsZSBzaWduYWwgaGFuZGxlcnMuCitBIHdyYXBwZXIgQVBJIHdhcyBhZGRlZCBmb3IgXFVOSVgtc3R5bGUgc2lnbmFsIGhhbmRsZXJzLgogXGZ1bmN0aW9ue1B5T1NfZ2V0c2lnKCl9IGdldHMgYSBzaWduYWwgaGFuZGxlciBhbmQKIFxmdW5jdGlvbntQeU9TX3NldHNpZygpfSB3aWxsIHNldCBhIG5ldyBoYW5kbGVyLgogCkBAIC05MDUsNyArOTA1LDcgQEAKIHdhcyBubyB3YXkgdG8gZmlndXJlIG91dCBhdXRvbWF0aWNhbGx5IHdoZXJlIFB5dGhvbiBpcyBpbnN0YWxsZWQsIG9yCiB3aGF0IGNvbXBpbGVyIG9wdGlvbnMgdG8gdXNlIGZvciBleHRlbnNpb24gbW9kdWxlcy4gIFNvZnR3YXJlIGF1dGhvcnMKIGhhZCB0byBnbyB0aHJvdWdoIGFuIGFyZHVvdXMgcml0dWFsIG9mIGVkaXRpbmcgTWFrZWZpbGVzIGFuZAotY29uZmlndXJhdGlvbiBmaWxlcywgd2hpY2ggb25seSByZWFsbHkgd29yayBvbiBVbml4IGFuZCBsZWF2ZSBXaW5kb3dzCitjb25maWd1cmF0aW9uIGZpbGVzLCB3aGljaCBvbmx5IHJlYWxseSB3b3JrIG9uIFxVTklYe30gYW5kIGxlYXZlIFdpbmRvd3MKIGFuZCBNYWNPUyB1bnN1cHBvcnRlZC4gIFB5dGhvbiB1c2VycyBmYWNlZCB3aWxkbHkgZGlmZmVyaW5nCiBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIHdoaWNoIHZhcmllZCBiZXR3ZWVuIGRpZmZlcmVudCBleHRlbnNpb24KIHBhY2thZ2VzLCB3aGljaCBtYWRlIGFkbWluaXN0ZXJpbmcgYSBQeXRob24gaW5zdGFsbGF0aW9uIHNvbWV0aGluZyBvZiAKQEAgLTEyMjIsNyArMTIyMiw3IEBACiAoQ29udHJpYnV0ZWQgYnkgUGV0ZXIgQm9zY2gsIHdpdGggZml4ZXMgYnkgSmVyZW15IEh5bHRvbi4pCiAKIFxpdGVte1xtb2R1bGV7bW1hcH06fSBBbiBpbnRlcmZhY2UgdG8gbWVtb3J5LW1hcHBlZCBmaWxlcyBvbiBib3RoCi1XaW5kb3dzIGFuZCBVbml4LiAgQSBmaWxlJ3MgY29udGVudHMgY2FuIGJlIG1hcHBlZCBkaXJlY3RseSBpbnRvCitXaW5kb3dzIGFuZCBcVU5JWC4gIEEgZmlsZSdzIGNvbnRlbnRzIGNhbiBiZSBtYXBwZWQgZGlyZWN0bHkgaW50bwogbWVtb3J5LCBhdCB3aGljaCBwb2ludCBpdCBiZWhhdmVzIGxpa2UgYSBtdXRhYmxlIHN0cmluZywgc28gaXRzCiBjb250ZW50cyBjYW4gYmUgcmVhZCBhbmQgbW9kaWZpZWQuICBUaGV5IGNhbiBldmVuIGJlIHBhc3NlZCB0bwogZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9yZGluYXJ5IHN0cmluZ3MsIHN1Y2ggYXMgdGhlIFxtb2R1bGV7cmV9CkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCiBcaXRlbXtcbW9kdWxle3ppcGZpbGV9On0gQSBtb2R1bGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgWklQLWZvcm1hdAogYXJjaGl2ZXMuICBUaGVzZSBhcmUgYXJjaGl2ZXMgcHJvZHVjZWQgYnkgXHByb2dyYW17UEtaSVB9IG9uCi1ET1MvV2luZG93cyBvciBccHJvZ3JhbXt6aXB9IG9uIFVuaXgsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoCitET1MvV2luZG93cyBvciBccHJvZ3JhbXt6aXB9IG9uIFxVTklYLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aAogXHByb2dyYW17Z3ppcH0tZm9ybWF0IGZpbGVzICh3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBcbW9kdWxle2d6aXB9CiBtb2R1bGUpCiAoQ29udHJpYnV0ZWQgYnkgSmFtZXMgQy4gQWhsc3Ryb20uKQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4CmluZGV4IGYzZDAyNDUuLjY3Y2JiZTQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIxLnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXgKQEAgLTMyNSw3ICszMjUsNyBAQAogV2hlbiBjb21waWxpbmcgUHl0aG9uLCB0aGUgdXNlciBoYWQgdG8gZ28gaW4gYW5kIGVkaXQgdGhlCiBcZmlsZXtNb2R1bGVzL1NldHVwfSBmaWxlIGluIG9yZGVyIHRvIGVuYWJsZSB2YXJpb3VzIGFkZGl0aW9uYWwKIG1vZHVsZXM7IHRoZSBkZWZhdWx0IHNldCBpcyByZWxhdGl2ZWx5IHNtYWxsIGFuZCBsaW1pdGVkIHRvIG1vZHVsZXMKLXRoYXQgY29tcGlsZSBvbiBtb3N0IFVuaXggcGxhdGZvcm1zLiAgVGhpcyBtZWFucyB0aGF0IG9uIFVuaXgKK3RoYXQgY29tcGlsZSBvbiBtb3N0IFxVTklYe30gcGxhdGZvcm1zLiAgVGhpcyBtZWFucyB0aGF0IG9uIFxVbml4e30KIHBsYXRmb3JtcyB3aXRoIG1hbnkgbW9yZSBmZWF0dXJlcywgbW9zdCBub3RhYmx5IExpbnV4LCBQeXRob24KIGluc3RhbGxhdGlvbnMgb2Z0ZW4gZG9uJ3QgY29udGFpbiBhbGwgdXNlZnVsIG1vZHVsZXMgdGhleSBjb3VsZC4KIApAQCAtNjYxLDcgKzY2MSw3IEBACiBcaXRlbSBUaGUgXG1vZHVsZXtkaWZmbGlifSBtb2R1bGUgY29udGFpbnMgYSBjbGFzcywKIFxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9LCB3aGljaCBjb21wYXJlcyB0d28gc2VxdWVuY2VzIGFuZCBjb21wdXRlcyB0aGUKIGNoYW5nZXMgcmVxdWlyZWQgdG8gdHJhbnNmb3JtIG9uZSBzZXF1ZW5jZSBpbnRvIHRoZSBvdGhlci4gIEZvcgotZXhhbXBsZSwgdGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSB0b29sIHNpbWlsYXIgdG8gdGhlIFVuaXgKK2V4YW1wbGUsIHRoaXMgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgdG9vbCBzaW1pbGFyIHRvIHRoZSBcVU5JWHt9CiBccHJvZ3JhbXtkaWZmfSBwcm9ncmFtLCBhbmQgaW4gZmFjdCB0aGUgc2FtcGxlIHByb2dyYW0KIFxmaWxle1Rvb2xzL3NjcmlwdHMvbmRpZmYucHl9IGRlbW9uc3RyYXRlcyBob3cgdG8gd3JpdGUgc3VjaCBhIHNjcmlwdC4gIAogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXgKaW5kZXggYTEyMjA4My4uNzJmZDMwNiAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleApAQCAtMTQ3OSw3ICsxNDc5LDcgQEAKICgnYW1rJywgNTAwKQogXGVuZHt2ZXJiYXRpbX0KIAotXGl0ZW0gVGhlIFxtb2R1bGV7Z3ppcH0gbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZpbGVzIGV4Y2VlZGluZyAyfkdiLiAgCitcaXRlbSBUaGUgXG1vZHVsZXtnemlwfSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZmlsZXMgZXhjZWVkaW5nIDJ+R2lCLiAgCiAKIFxpdGVtIFRoZSBuZXcgXG1vZHVsZXtoZWFwcX0gbW9kdWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIGEKIGhlYXAgcXVldWUgYWxnb3JpdGhtLiAgQSBoZWFwIGlzIGFuIGFycmF5LWxpa2UgZGF0YSBzdHJ1Y3R1cmUgdGhhdApAQCAtMTk3OSw3ICsxOTc5LDcgQEAKIAogVGhlIFxtb2R1bGV7Z2V0b3B0fSBtb2R1bGUgcHJvdmlkZXMgc2ltcGxlIHBhcnNpbmcgb2YgY29tbWFuZC1saW5lCiBhcmd1bWVudHMuICBUaGUgbmV3IFxtb2R1bGV7b3B0cGFyc2V9IG1vZHVsZSAob3JpZ2luYWxseSBuYW1lZCBPcHRpaykKLXByb3ZpZGVzIG1vcmUgZWxhYm9yYXRlIGNvbW1hbmQtbGluZSBwYXJzaW5nIHRoYXQgZm9sbG93cyB0aGUgVW5peAorcHJvdmlkZXMgbW9yZSBlbGFib3JhdGUgY29tbWFuZC1saW5lIHBhcnNpbmcgdGhhdCBmb2xsb3dzIHRoZSBcVU5JWHt9CiBjb252ZW50aW9ucywgYXV0b21hdGljYWxseSBjcmVhdGVzIHRoZSBvdXRwdXQgZm9yIFxsb25ncHJvZ3JhbW9wdHtoZWxwfSwKIGFuZCBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgYWN0aW9ucyBmb3IgZGlmZmVyZW50IG9wdGlvbnMuCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleAppbmRleCA1MWJhZWNlLi4wOTZiMWVjIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CkBAIC0xNjIsNyArMTYyLDcgQEAKIAogR2VuZXJhdG9yIGV4cHJlc3Npb25zIGFsd2F5cyBoYXZlIHRvIGJlIHdyaXR0ZW4gaW5zaWRlIHBhcmVudGhlc2VzLCBhcwogaW4gdGhlIGFib3ZlIGV4YW1wbGUuICBUaGUgcGFyZW50aGVzZXMgc2lnbmFsbGluZyBhIGZ1bmN0aW9uIGNhbGwgYWxzbwotY291bnQsIHNvIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGl0ZXJhdG9yIHRoYXQgd2lsbCBiZSBpbW1lZGlhdGVseQorY291bnQsIHNvIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciB0aGF0IHdpbGwgYmUgaW1tZWRpYXRlbHkKIHBhc3NlZCB0byBhIGZ1bmN0aW9uIHlvdSBjb3VsZCB3cml0ZToKIAogXGJlZ2lue3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CmluZGV4IDQwMTVkOTguLmRjYjZhYjEgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKQEAgLTMsMTAgKzMsOSBAQAogJSAkSWQkCiAKICUgRml4IFhYWCBjb21tZW50cwotJSBDb3VudCB1cCB0aGUgcGF0Y2hlcyBhbmQgYnVncwogCiBcdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi41fQotXHJlbGVhc2V7MC4yfQorXHJlbGVhc2V7MC45fQogXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQogXGF1dGhvcmFkZHJlc3N7XGVtYWlse2Fta0BhbWsuY2F9fQogCkBAIC0xNCwzMSArMTMsNTcgQEAKIFxtYWtldGl0bGUKIFx0YWJsZW9mY29udGVudHMKIAotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDIuNS4gIE5vIHJlbGVhc2UgZGF0ZQotZm9yIFB5dGhvbiAyLjUgaGFzIGJlZW4gc2V0OyBpdCB3aWxsIHByb2JhYmx5IGJlIHJlbGVhc2VkIGluIHRoZQotYXV0dW1uIG9mIDIwMDYuICBccGVwezM1Nn0gZGVzY3JpYmVzIHRoZSBwbGFubmVkIHJlbGVhc2Ugc2NoZWR1bGUuCitUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMi41LiAgVGhlIGZpbmFsCityZWxlYXNlIG9mIFB5dGhvbiAyLjUgaXMgc2NoZWR1bGVkIGZvciBBdWd1c3QgMjAwNjsKK1xwZXB7MzU2fSBkZXNjcmliZXMgdGhlIHBsYW5uZWQgcmVsZWFzZSBzY2hlZHVsZS4KIAotQ29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgZXJyb3IgcmVwb3J0cyBhcmUgd2VsY29tZTsgcGxlYXNlIGUtbWFpbCB0aGVtIAotdG8gdGhlIGF1dGhvciBvciBvcGVuIGEgYnVnIGluIHRoZSBQeXRob24gYnVnIHRyYWNrZXIuCitUaGUgY2hhbmdlcyBpbiBQeXRob24gMi41IGFyZSBhbiBpbnRlcmVzdGluZyBtaXggb2YgbGFuZ3VhZ2UgYW5kCitsaWJyYXJ5IGltcHJvdmVtZW50cy4gVGhlIGxpYnJhcnkgZW5oYW5jZW1lbnRzIHdpbGwgYmUgbW9yZSBpbXBvcnRhbnQKK3RvIFB5dGhvbidzIHVzZXIgY29tbXVuaXR5LCBJIHRoaW5rLCBiZWNhdXNlIHNldmVyYWwgd2lkZWx5LXVzZWZ1bAorcGFja2FnZXMgd2VyZSBhZGRlZC4gIE5ldyBtb2R1bGVzIGluY2x1ZGUgRWxlbWVudFRyZWUgZm9yIFhNTAorcHJvY2Vzc2luZyAoc2VjdGlvbn5ccmVme21vZHVsZS1ldHJlZX0pLCB0aGUgU1FMaXRlIGRhdGFiYXNlIG1vZHVsZQorKHNlY3Rpb25+XHJlZnttb2R1bGUtc3FsaXRlfSksIGFuZCB0aGUgXG1vZHVsZXtjdHlwZXN9IG1vZHVsZSBmb3IKK2NhbGxpbmcgQyBmdW5jdGlvbnMgKHNlY3Rpb25+XHJlZnttb2R1bGUtY3R5cGVzfSkuCiAKLSUgWFhYIENvbXBhcmUgd2l0aCBwcmV2aW91cyByZWxlYXNlIGluIDIgLSAzIHNlbnRlbmNlcyBoZXJlLgorVGhlIGxhbmd1YWdlIGNoYW5nZXMgYXJlIG9mIG1pZGRsaW5nIHNpZ25pZmljYW5jZS4gIFNvbWUgcGxlYXNhbnQgbmV3CitmZWF0dXJlcyB3ZXJlIGFkZGVkLCBidXQgbW9zdCBvZiB0aGVtIGFyZW4ndCBmZWF0dXJlcyB0aGF0IHlvdSdsbCB1c2UKK2V2ZXJ5IGRheS4gIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHdlcmUgZmluYWxseSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UKK3VzaW5nIGEgbm92ZWwgc3ludGF4OyBzZWUgc2VjdGlvbn5ccmVme3BlcC0zMDh9LiAgVGhlIG5ldworJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgd2lsbCBtYWtlIHdyaXRpbmcgY2xlYW51cCBjb2RlIGVhc2llcgorKHNlY3Rpb25+XHJlZntwZXAtMzQzfSkuICBWYWx1ZXMgY2FuIG5vdyBiZSBwYXNzZWQgaW50byBnZW5lcmF0b3JzCisoc2VjdGlvbn5ccmVme3BlcC0zNDJ9KS4gIEltcG9ydHMgYXJlIG5vdyB2aXNpYmxlIGFzIGVpdGhlciBhYnNvbHV0ZQorb3IgcmVsYXRpdmUgKHNlY3Rpb25+XHJlZntwZXAtMzI4fSkuICBTb21lIGNvcm5lciBjYXNlcyBvZiBleGNlcHRpb24KK2hhbmRsaW5nIGFyZSBoYW5kbGVkIGJldHRlciAoc2VjdGlvbn5ccmVme3BlcC0zNDF9KS4gIEFsbCB0aGVzZQoraW1wcm92ZW1lbnRzIGFyZSB3b3J0aHdoaWxlLCBidXQgdGhleSdyZSBpbXByb3ZlbWVudHMgdG8gb25lIHNwZWNpZmljCitsYW5ndWFnZSBmZWF0dXJlIG9yIGFub3RoZXI7IG5vbmUgb2YgdGhlbSBhcmUgYnJvYWQgbW9kaWZpY2F0aW9ucyB0bworUHl0aG9uJ3Mgc2VtYW50aWNzLgogCi1UaGlzIGFydGljbGUgZG9lc24ndCBhdHRlbXB0IHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mCi10aGUgbmV3IGZlYXR1cmVzLCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGNvbnZlbmllbnQgb3ZlcnZpZXcuICBGb3IKLWZ1bGwgZGV0YWlscywgeW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDIuNS4KK0FzIHdlbGwgYXMgdGhlIGxhbmd1YWdlIGFuZCBsaWJyYXJ5IGFkZGl0aW9ucywgb3RoZXIgaW1wcm92ZW1lbnRzIGFuZAorYnVnZml4ZXMgd2VyZSBtYWRlIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgQSBzZWFyY2ggdGhyb3VnaCB0aGUKK1NWTiBjaGFuZ2UgbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIDMzNCBwYXRjaGVzIGFwcGxpZWQgYW5kIDQ0MyBidWdzCitmaXhlZCBiZXR3ZWVuIFB5dGhvbiAyLjQgYW5kIDIuNS4gIChCb3RoIGZpZ3VyZXMgYXJlIGxpa2VseSB0byBiZQordW5kZXJlc3RpbWF0ZXMuKSAgCisKK1RoaXMgYXJ0aWNsZSBkb2Vzbid0IHRyeSB0byBiZSBhIGNvbXBsZXRlIHNwZWNpZmljYXRpb24gb2YgdGhlIG5ldworZmVhdHVyZXM7IGluc3RlYWQgY2hhbmdlcyBhcmUgYnJpZWZseSBpbnRyb2R1Y2VkIHVzaW5nIGhlbHBmdWwKK2V4YW1wbGVzLiAgRm9yIGZ1bGwgZGV0YWlscywgeW91IHNob3VsZCBhbHdheXMgcmVmZXIgdG8gdGhlCitkb2N1bWVudGF0aW9uIGZvciBQeXRob24gMi41LgogJSBYWFggYWRkIGh5cGVybGluayB3aGVuIHRoZSBkb2N1bWVudGF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9ubGluZS4KIElmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24KIHJhdGlvbmFsZSwgcmVmZXIgdG8gdGhlIFBFUCBmb3IgYSBwYXJ0aWN1bGFyIG5ldyBmZWF0dXJlLgogCitDb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBlcnJvciByZXBvcnRzIGZvciB0aGlzIGRvY3VtZW50IGFyZQord2VsY29tZTsgcGxlYXNlIGUtbWFpbCB0aGVtIHRvIHRoZSBhdXRob3Igb3Igb3BlbiBhIGJ1ZyBpbiB0aGUgUHl0aG9uCitidWcgdHJhY2tlci4KIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzMDg6IENvbmRpdGlvbmFsIEV4cHJlc3Npb25zXGxhYmVse3BlcC0zMDh9fQogCiBGb3IgYSBsb25nIHRpbWUsIHBlb3BsZSBoYXZlIGJlZW4gcmVxdWVzdGluZyBhIHdheSB0byB3cml0ZQotY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25zIHRoYXQgcmV0dXJuIHZhbHVlIEEgb3IgdmFsdWUgQgotZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBCb29sZWFuIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UuICBBIGNvbmRpdGlvbmFsCi1leHByZXNzaW9uIGxldHMgeW91IHdyaXRlIGEgc2luZ2xlIGFzc2lnbm1lbnQgc3RhdGVtZW50IHRoYXQgaGFzIHRoZQotc2FtZSBlZmZlY3QgYXMgdGhlIGZvbGxvd2luZzoKK2NvbmRpdGlvbmFsIGV4cHJlc3Npb25zLCB3aGljaCBhcmUgZXhwcmVzc2lvbnMgdGhhdCByZXR1cm4gdmFsdWUgQSBvcgordmFsdWUgQiBkZXBlbmRpbmcgb24gd2hldGhlciBhIEJvb2xlYW4gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZS4gIEEKK2NvbmRpdGlvbmFsIGV4cHJlc3Npb24gbGV0cyB5b3Ugd3JpdGUgYSBzaW5nbGUgYXNzaWdubWVudCBzdGF0ZW1lbnQKK3RoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgZm9sbG93aW5nOgogCiBcYmVnaW57dmVyYmF0aW19CiBpZiBjb25kaXRpb246CkBAIC01NCw3ICs3OSw3IEBACiBDYW5kaWRhdGVzIGluY2x1ZGVkIEMncyBcY29kZXtjb25kID8gdHJ1ZV92IDogZmFsc2Vfdn0sCiBcY29kZXtpZiBjb25kIHRoZW4gdHJ1ZV92IGVsc2UgZmFsc2Vfdn0sIGFuZCAxNiBvdGhlciB2YXJpYXRpb25zLgogCi1HdlIgZXZlbnR1YWxseSBjaG9zZSBhIHN1cnByaXNpbmcgc3ludGF4OgorR3VpZG8gdmFuflJvc3N1bSBldmVudHVhbGx5IGNob3NlIGEgc3VycHJpc2luZyBzeW50YXg6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIHggPSB0cnVlX3ZhbHVlIGlmIGNvbmRpdGlvbiBlbHNlIGZhbHNlX3ZhbHVlCkBAIC0xMjYsMTkgKzE1MSwxNiBAQAogXHNlY3Rpb257UEVQIDMwOTogUGFydGlhbCBGdW5jdGlvbiBBcHBsaWNhdGlvblxsYWJlbHtwZXAtMzA5fX0KIAogVGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gY29udGFpbiB0b29scyBmb3IKLWZ1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbW1pbmcuICBDdXJyZW50bHkgaXQgb25seSBjb250YWlucyBhCi1cY2xhc3N7cGFydGlhbCgpfSBmdW5jdGlvbiwgYnV0IG5ldyBmdW5jdGlvbnMgd2lsbCBwcm9iYWJseSBiZSBhZGRlZAotaW4gZnV0dXJlIHZlcnNpb25zIG9mIFB5dGhvbi4KK2Z1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbW1pbmcuICAKIAotRm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gYSBmdW5jdGlvbmFsIHN0eWxlLCBpdCBjYW4gYmUgdXNlZnVsIHRvCitPbmUgdXNlZnVsIHRvb2wgaW4gdGhpcyBtb2R1bGUgaXMgdGhlIFxmdW5jdGlvbntwYXJ0aWFsKCl9IGZ1bmN0aW9uLgorRm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gYSBmdW5jdGlvbmFsIHN0eWxlLCB5b3UnbGwgc29tZXRpbWVzIHdhbnQgdG8KIGNvbnN0cnVjdCB2YXJpYW50cyBvZiBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBoYXZlIHNvbWUgb2YgdGhlCiBwYXJhbWV0ZXJzIGZpbGxlZCBpbi4gIENvbnNpZGVyIGEgUHl0aG9uIGZ1bmN0aW9uIFxjb2Rle2YoYSwgYiwgYyl9OwogeW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBcY29kZXtnKGIsIGMpfSB0aGF0IHdhcyBlcXVpdmFsZW50IHRvCi1cY29kZXtmKDEsIGIsIGMpfS4gIFRoaXMgaXMgY2FsbGVkIGBgcGFydGlhbCBmdW5jdGlvbiBhcHBsaWNhdGlvbicnLAotYW5kIGlzIHByb3ZpZGVkIGJ5IHRoZSBcY2xhc3N7cGFydGlhbH0gY2xhc3MgaW4gdGhlIG5ldwotXG1vZHVsZXtmdW5jdG9vbHN9IG1vZHVsZS4KK1xjb2Rle2YoMSwgYiwgYyl9LiAgVGhpcyBpcyBjYWxsZWQgYGBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uJycuCiAKLVRoZSBjb25zdHJ1Y3RvciBmb3IgXGNsYXNze3BhcnRpYWx9IHRha2VzIHRoZSBhcmd1bWVudHMKK1xmdW5jdGlvbntwYXJ0aWFsfSB0YWtlcyB0aGUgYXJndW1lbnRzCiBcY29kZXsoXHZhcntmdW5jdGlvbn0sIFx2YXJ7YXJnMX0sIFx2YXJ7YXJnMn0sIC4uLgogXHZhcntrd2FyZzF9PVx2YXJ7dmFsdWUxfSwgXHZhcntrd2FyZzJ9PVx2YXJ7dmFsdWUyfSl9LiAgVGhlIHJlc3VsdGluZwogb2JqZWN0IGlzIGNhbGxhYmxlLCBzbyB5b3UgY2FuIGp1c3QgY2FsbCBpdCB0byBpbnZva2UgXHZhcntmdW5jdGlvbn0KQEAgLTE3NSwxMSArMTk3LDQwIEBACiBcZW5ke3ZlcmJhdGltfQogCiAKK0Fub3RoZXIgZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgdGhlCitcZnVuY3Rpb257dXBkYXRlX3dyYXBwZXIoXHZhcnt3cmFwcGVyfSwgXHZhcnt3cmFwcGVkfSl9IGZ1bmN0aW9uIHRoYXQKK2hlbHBzIHlvdSB3cml0ZSB3ZWxsLWJlaGF2ZWQgZGVjb3JhdG9ycy4gIFxmdW5jdGlvbnt1cGRhdGVfd3JhcHBlcigpfQorY29waWVzIHRoZSBuYW1lLCBtb2R1bGUsIGFuZCBkb2NzdHJpbmcgYXR0cmlidXRlIHRvIGEgd3JhcHBlciBmdW5jdGlvbgorc28gdGhhdCB0cmFjZWJhY2tzIGluc2lkZSB0aGUgd3JhcHBlZCBmdW5jdGlvbiBhcmUgZWFzaWVyIHRvCit1bmRlcnN0YW5kLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3cml0ZToKKworXGJlZ2lue3ZlcmJhdGltfQorZGVmIG15X2RlY29yYXRvcihmKToKKyAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2RzKToKKyAgICAgICAgcHJpbnQgJ0NhbGxpbmcgZGVjb3JhdGVkIGZ1bmN0aW9uJworICAgICAgICByZXR1cm4gZigqYXJncywgKiprd2RzKQorICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBmKQorICAgIHJldHVybiB3cmFwcGVyCitcZW5ke3ZlcmJhdGltfQorCitcZnVuY3Rpb257d3JhcHMoKX0gaXMgYSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgeW91ciBvd24KK2RlY29yYXRvcnMgdG8gY29weSB0aGUgd3JhcHBlZCBmdW5jdGlvbidzIGluZm9ybWF0aW9uLiAgQW4gYWx0ZXJuYXRlIAordmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBiZToKKworXGJlZ2lue3ZlcmJhdGltfQorZGVmIG15X2RlY29yYXRvcihmKToKKyAgICBAZnVuY3Rvb2xzLndyYXBzKGYpCisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHByaW50ICdDYWxsaW5nIGRlY29yYXRlZCBmdW5jdGlvbicKKyAgICAgICAgcmV0dXJuIGYoKmFyZ3MsICoqa3dkcykKKyAgICByZXR1cm4gd3JhcHBlcgorXGVuZHt2ZXJiYXRpbX0KKwogXGJlZ2lue3NlZWFsc299CiAKIFxzZWVwZXB7MzA5fXtQYXJ0aWFsIEZ1bmN0aW9uIEFwcGxpY2F0aW9ufXtQRVAgcHJvcG9zZWQgYW5kIHdyaXR0ZW4gYnkKLVBldGVyIEhhcnJpczsgaW1wbGVtZW50ZWQgYnkgSHllLVNoaWsgQ2hhbmcsIHdpdGggYWRhcHRhdGlvbnMgYnkKLVJheW1vbmQgSGV0dGluZ2VyLn0KK1BldGVyIEhhcnJpczsgaW1wbGVtZW50ZWQgYnkgSHllLVNoaWsgQ2hhbmcgYW5kIE5pY2sgQ29naGxhbiwgd2l0aAorYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIufQogCiBcZW5ke3NlZWFsc299CiAKQEAgLTM2MSw3ICs0MTIsNyBAQAogY29tYmluZWQgdmVyc2lvbiB3YXMgY29tcGxpY2F0ZWQgYW5kIGl0IHdhc24ndCBjbGVhciB3aGF0IHRoZQogc2VtYW50aWNzIG9mIHRoZSBjb21iaW5lZCBzaG91bGQgYmUuICAKIAotR3ZSIHNwZW50IHNvbWUgdGltZSB3b3JraW5nIHdpdGggSmF2YSwgd2hpY2ggZG9lcyBzdXBwb3J0IHRoZQorR3VpZG8gdmFuflJvc3N1bSBzcGVudCBzb21lIHRpbWUgd29ya2luZyB3aXRoIEphdmEsIHdoaWNoIGRvZXMgc3VwcG9ydCB0aGUKIGVxdWl2YWxlbnQgb2YgY29tYmluaW5nIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFuZCBhCiBca2V5d29yZHtmaW5hbGx5fSBibG9jaywgYW5kIHRoaXMgY2xhcmlmaWVkIHdoYXQgdGhlIHN0YXRlbWVudCBzaG91bGQKIG1lYW4uICBJbiBQeXRob24gMi41LCB5b3UgY2FuIG5vdyB3cml0ZToKQEAgLTU1NCw3ICs2MDUsMTEgQEAKIFxzZWVwZXB7MzQyfXtDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzfXtQRVAgd3JpdHRlbiBieSAKIEd1aWRvIHZhbn5Sb3NzdW0gYW5kIFBoaWxsaXAgSi4gRWJ5OwogaW1wbGVtZW50ZWQgYnkgUGhpbGxpcCBKLiBFYnkuICBJbmNsdWRlcyBleGFtcGxlcyBvZiAKLXNvbWUgZmFuY2llciB1c2VzIG9mIGdlbmVyYXRvcnMgYXMgY29yb3V0aW5lcy59Citzb21lIGZhbmNpZXIgdXNlcyBvZiBnZW5lcmF0b3JzIGFzIGNvcm91dGluZXMuCisKK0VhcmxpZXIgdmVyc2lvbnMgb2YgdGhlc2UgZmVhdHVyZXMgd2VyZSBwcm9wb3NlZCBpbiAKK1xwZXB7Mjg4fSBieSBSYXltb25kIEhldHRpbmdlciBhbmQgXHBlcHszMjV9IGJ5IFNhbXVlbGUgUGVkcm9uaS4KK30KIAogXHNlZXVybHtodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nvcm91dGluZX17VGhlIFdpa2lwZWRpYSBlbnRyeSBmb3IgCiBjb3JvdXRpbmVzLn0KQEAgLTc3MSw3ICs4MjYsNyBAQAogZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBvYmplY3RzIGZvciB1c2Ugd2l0aCB0aGUKICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50LgogCi1UaGUgZGVjb3JhdG9yIGlzIGNhbGxlZCBcZnVuY3Rpb257Y29udGV4dGZhY3Rvcnl9LCBhbmQgbGV0cyB5b3Ugd3JpdGUKK1RoZSBkZWNvcmF0b3IgaXMgY2FsbGVkIFxmdW5jdGlvbntjb250ZXh0bWFuYWdlcn0sIGFuZCBsZXRzIHlvdSB3cml0ZQogYSBzaW5nbGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgZGVmaW5pbmcgYSBuZXcgY2xhc3MuICBUaGUgZ2VuZXJhdG9yCiBzaG91bGQgeWllbGQgZXhhY3RseSBvbmUgdmFsdWUuICBUaGUgY29kZSB1cCB0byB0aGUgXGtleXdvcmR7eWllbGR9CiB3aWxsIGJlIGV4ZWN1dGVkIGFzIHRoZSBcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QsIGFuZCB0aGUgdmFsdWUKQEAgLTc4NSw5ICs4NDAsOSBAQAogdXNpbmcgdGhpcyBkZWNvcmF0b3IgYXM6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dGZhY3RvcnkKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKIAotQGNvbnRleHRmYWN0b3J5CitAY29udGV4dG1hbmFnZXIKIGRlZiBkYl90cmFuc2FjdGlvbiAoY29ubmVjdGlvbik6CiAgICAgY3Vyc29yID0gY29ubmVjdGlvbi5jdXJzb3IoKQogICAgIHRyeToKQEAgLTkzMyw3ICs5ODgsNyBAQAogYWxyZWFkeSBtb3JlIGJ5dGVzIHRoYW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSBjYW4gY29udGFpbi4KIAogSXQncyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoYXQgbXVjaCBtZW1vcnkgb24gYSA2NC1iaXQgcGxhdGZvcm0sCi1ob3dldmVyLiAgVGhlIHBvaW50ZXJzIGZvciBhIGxpc3QgdGhhdCBzaXplIHdvdWxkIG9ubHkgcmVxdWlyZSAxNkdpQgoraG93ZXZlci4gIFRoZSBwb2ludGVycyBmb3IgYSBsaXN0IHRoYXQgc2l6ZSB3b3VsZCBvbmx5IHJlcXVpcmUgMTZ+R2lCCiBvZiBzcGFjZSwgc28gaXQncyBub3QgdW5yZWFzb25hYmxlIHRoYXQgUHl0aG9uIHByb2dyYW1tZXJzIG1pZ2h0CiBjb25zdHJ1Y3QgbGlzdHMgdGhhdCBsYXJnZS4gIFRoZXJlZm9yZSwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYWQgdG8KIGJlIGNoYW5nZWQgdG8gdXNlIHNvbWUgdHlwZSBvdGhlciB0aGFuIFxjdHlwZXtpbnR9LCBhbmQgdGhpcyB3aWxsIGJlIGEKQEAgLTEwNDQsMTAgKzEwOTksMTAgQEAKIAogXGl0ZW0gQm90aCA4LWJpdCBhbmQgVW5pY29kZSBzdHJpbmdzIGhhdmUgbmV3IFxtZXRob2R7cGFydGl0aW9uKHNlcCl9IAogYW5kIFxtZXRob2R7cnBhcnRpdGlvbihzZXApfSBtZXRob2RzIHRoYXQgc2ltcGxpZnkgYSBjb21tb24gdXNlIGNhc2UuCisKIFRoZSBcbWV0aG9ke2ZpbmQoUyl9IG1ldGhvZCBpcyBvZnRlbiB1c2VkIHRvIGdldCBhbiBpbmRleCB3aGljaCBpcwogdGhlbiB1c2VkIHRvIHNsaWNlIHRoZSBzdHJpbmcgYW5kIG9idGFpbiB0aGUgcGllY2VzIHRoYXQgYXJlIGJlZm9yZQogYW5kIGFmdGVyIHRoZSBzZXBhcmF0b3IuICAKLQogXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gY29uZGVuc2VzIHRoaXMKIHBhdHRlcm4gaW50byBhIHNpbmdsZSBtZXRob2QgY2FsbCB0aGF0IHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcKIHRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlCkBAIC0xMDcyLDYgKzExMjcsMTcgQEAKIAogKEltcGxlbWVudGVkIGJ5IEZyZWRyaWsgTHVuZGggZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBieSBSYXltb25kIEhldHRpbmdlci4pCiAKK1xpdGVtIFRoZSBcbWV0aG9ke3N0YXJ0c3dpdGgoKX0gYW5kIFxtZXRob2R7ZW5kc3dpdGgoKX0gbWV0aG9kcworb2Ygc3RyaW5nIHR5cGVzIG5vdyBhY2NlcHQgdHVwbGVzIG9mIHN0cmluZ3MgdG8gY2hlY2sgZm9yLgorCitcYmVnaW57dmVyYmF0aW19CitkZWYgaXNfaW1hZ2VfZmlsZSAoZmlsZW5hbWUpOgorICAgIHJldHVybiBmaWxlbmFtZS5lbmRzd2l0aCgoJy5naWYnLCAnLmpwZycsICcudGlmZicpKQorXGVuZHt2ZXJiYXRpbX0KKworKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbCBmb2xsb3dpbmcgYSBzdWdnZXN0aW9uIGJ5IFRvbSBMeW5uLikKKyUgUkZFICMxNDkxNDg1CisKIFxpdGVtIFRoZSBcZnVuY3Rpb257bWluKCl9IGFuZCBcZnVuY3Rpb257bWF4KCl9IGJ1aWx0LWluIGZ1bmN0aW9ucwogZ2FpbmVkIGEgXGNvZGV7a2V5fSBrZXl3b3JkIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8gdGhlIFxjb2Rle2tleX0KIGFyZ3VtZW50IGZvciBcbWV0aG9ke3NvcnQoKX0uICBUaGlzIHBhcmFtZXRlciBzdXBwbGllcyBhIGZ1bmN0aW9uIHRoYXQKQEAgLTEwOTUsOCArMTE2MSwxNyBAQAogZmFsc2UgdmFsdWVzLiAgXGZ1bmN0aW9ue2FueSgpfSByZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiBhbnkgdmFsdWUKIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyB0cnVlOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4KIFxjb25zdGFudHtGYWxzZX0uICBcZnVuY3Rpb257YWxsKCl9IHJldHVybnMgXGNvbnN0YW50e1RydWV9IG9ubHkgaWYKLWFsbCBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBldmFsdWF0ZSBhcyBiZWluZyB0cnVlLgotKFN1Z2dlc3RlZCBieSBHdlIsIGFuZCBpbXBsZW1lbnRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCithbGwgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IgZXZhbHVhdGUgYXMgdHJ1ZS4KKyhTdWdnZXN0ZWQgYnkgR3VpZG8gdmFuflJvc3N1bSwgYW5kIGltcGxlbWVudGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKKworXGl0ZW0gVGhlIHJlc3VsdCBvZiBhIGNsYXNzJ3MgXG1ldGhvZHtfX2hhc2hfXygpfSBtZXRob2QgY2FuIG5vdyAKK2JlIGVpdGhlciBhIGxvbmcgaW50ZWdlciBvciBhIHJlZ3VsYXIgaW50ZWdlci4gIElmIGEgbG9uZyBpbnRlZ2VyIGlzCityZXR1cm5lZCwgdGhlIGhhc2ggb2YgdGhhdCB2YWx1ZSBpcyB0YWtlbi4gIEluIGVhcmxpZXIgdmVyc2lvbnMgdGhlCitoYXNoIHZhbHVlIHdhcyByZXF1aXJlZCB0byBiZSBhIHJlZ3VsYXIgaW50ZWdlciwgYnV0IGluIDIuNSB0aGUKK1xmdW5jdGlvbntpZCgpfSBidWlsdC1pbiB3YXMgY2hhbmdlZCB0byBhbHdheXMgcmV0dXJuIG5vbi1uZWdhdGl2ZQorbnVtYmVycywgYW5kIHVzZXJzIG9mdGVuIHNlZW0gdG8gdXNlIFxjb2Rle2lkKHNlbGYpfSBpbgorXG1ldGhvZHtfX2hhc2hfXygpfSBtZXRob2RzICh0aG91Z2ggdGhpcyBpcyBkaXNjb3VyYWdlZCkuCislIEJ1ZyAjMTUzNjAyMQogCiBcaXRlbSBBU0NJSSBpcyBub3cgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIG1vZHVsZXMuICBJdCdzIG5vdyAKIGEgc3ludGF4IGVycm9yIGlmIGEgbW9kdWxlIGNvbnRhaW5zIHN0cmluZyBsaXRlcmFscyB3aXRoIDgtYml0CkBAIC0xMTEzLDkgKzExODgsMTIgQEAKIHRvIGluY2x1ZGUgYW4gXGZpbGV7X19pbml0X18ucHl9IG1vZHVsZSBpbiBhIHBhY2thZ2UgZGlyZWN0b3J5LgogRGVidWdnaW5nIHRoaXMgbWlzdGFrZSBjYW4gYmUgY29uZnVzaW5nLCBhbmQgdXN1YWxseSByZXF1aXJlcyBydW5uaW5nCiBQeXRob24gd2l0aCB0aGUgXHByb2dyYW1vcHR7LXZ9IHN3aXRjaCB0byBsb2cgYWxsIHRoZSBwYXRocyBzZWFyY2hlZC4KLUluIFB5dGhvbiAyLjUsIGEgbmV3IFxleGNlcHRpb257SW1wb3J0V2FybmluZ30gd2FybmluZyBpcyByYWlzZWQgd2hlbgorSW4gUHl0aG9uIDIuNSwgYSBuZXcgXGV4Y2VwdGlvbntJbXBvcnRXYXJuaW5nfSB3YXJuaW5nIGlzIHRyaWdnZXJlZCB3aGVuCiBhbiBpbXBvcnQgd291bGQgaGF2ZSBwaWNrZWQgdXAgYSBkaXJlY3RvcnkgYXMgYSBwYWNrYWdlIGJ1dCBubwotXGZpbGV7X19pbml0X18ucHl9IHdhcyBmb3VuZC4gIChJbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4pCitcZmlsZXtfX2luaXRfXy5weX0gd2FzIGZvdW5kLiAgVGhpcyB3YXJuaW5nIGlzIHNpbGVudGx5IGlnbm9yZWQgYnkgZGVmYXVsdDsKK3Byb3ZpZGUgdGhlIFxwcm9ncmFtb3B0ey1XZH0gb3B0aW9uIHdoZW4gcnVubmluZyB0aGUgUHl0aG9uIGV4ZWN1dGFibGUKK3RvIGRpc3BsYXkgdGhlIHdhcm5pbmcgbWVzc2FnZS4KKyhJbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4pCiAKIFxpdGVtIFRoZSBsaXN0IG9mIGJhc2UgY2xhc3NlcyBpbiBhIGNsYXNzIGRlZmluaXRpb24gY2FuIG5vdyBiZSBlbXB0eS4gIAogQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyBub3cgbGVnYWw6CkBAIC0xMTQ2LDYgKzEyMjQsMTEgQEAKIE5ld2JpZXMgd2hvIHRyeSBcY29kZXtxdWl0KCl9IG9yIFxjb2Rle2V4aXQoKX0gd2lsbCBub3cgZXhpdCB0aGUKIGludGVycHJldGVyIGFzIHRoZXkgZXhwZWN0LiAgKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbC4pCiAKK1RoZSBQeXRob24gZXhlY3V0YWJsZSBub3cgYWNjZXB0cyB0aGUgc3RhbmRhcmQgbG9uZyBvcHRpb25zIAorXGxvbmdwcm9ncmFtb3B0e2hlbHB9IGFuZCBcbG9uZ3Byb2dyYW1vcHR7dmVyc2lvbn07IG9uIFdpbmRvd3MsIAoraXQgYWxzbyBhY2NlcHRzIHRoZSBccHJvZ3JhbW9wdHsvP30gb3B0aW9uIGZvciBkaXNwbGF5aW5nIGEgaGVscCBtZXNzYWdlLgorKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbC4pCisKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzdWJzZWN0aW9ue09wdGltaXphdGlvbnNcbGFiZWx7b3B0c319CkBAIC0xMTk0LDcgKzEyNzcsOCBAQAogXGl0ZW0gVGhlIGNvZGUgZ2VuZXJhdG9yJ3MgcGVlcGhvbGUgb3B0aW1pemVyIG5vdyBwZXJmb3Jtcwogc2ltcGxlIGNvbnN0YW50IGZvbGRpbmcgaW4gZXhwcmVzc2lvbnMuICBJZiB5b3Ugd3JpdGUgc29tZXRoaW5nIGxpa2UKIFxjb2Rle2EgPSAyKzN9LCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBkbyB0aGUgYXJpdGhtZXRpYyBhbmQgcHJvZHVjZQotY29kZSBjb3JyZXNwb25kaW5nIHRvIFxjb2Rle2EgPSA1fS4KK2NvZGUgY29ycmVzcG9uZGluZyB0byBcY29kZXthID0gNX0uICAoUHJvcG9zZWQgYW5kIGltcGxlbWVudGVkIAorYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCiBcaXRlbSBGdW5jdGlvbiBjYWxscyBhcmUgbm93IGZhc3RlciBiZWNhdXNlIGNvZGUgb2JqZWN0cyBub3cga2VlcCAKIHRoZSBtb3N0IHJlY2VudGx5IGZpbmlzaGVkIGZyYW1lIChhIGBgem9tYmllIGZyYW1lJycpIGluIGFuIGludGVybmFsCkBAIC0xMjg4LDEwICsxMzcyLDEzIEBACiAgICAgICAgICdyJzogWydyaXRyb3ZhaSddLCAndSc6IFsndW5hJ10sICd2JzogWyd2aXRhJywgJ3ZpYSddfQogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIFxjbGFzc3tkZXF1ZX0gZG91YmxlLWVuZGVkIHF1ZXVlIHR5cGUgc3VwcGxpZWQgYnkgdGhlCisoQ29udHJpYnV0ZWQgYnkgR3VpZG8gdmFuflJvc3N1bS4pCisKK1xpdGVtIFRoZSBcY2xhc3N7ZGVxdWV9IGRvdWJsZS1lbmRlZCBxdWV1ZSB0eXBlIHN1cHBsaWVkIGJ5IHRoZQogXG1vZHVsZXtjb2xsZWN0aW9uc30gbW9kdWxlIG5vdyBoYXMgYSBcbWV0aG9ke3JlbW92ZShcdmFye3ZhbHVlfSl9CiBtZXRob2QgdGhhdCByZW1vdmVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFx2YXJ7dmFsdWV9IGluIHRoZSBxdWV1ZSwKIHJhaXNpbmcgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiB0aGUgdmFsdWUgaXNuJ3QgZm91bmQuCisoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCiBcaXRlbSBOZXcgbW9kdWxlOiBUaGUgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUgY29udGFpbnMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNlIAogd2l0aCB0aGUgbmV3ICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50LiAgU2VlCkBAIC0xMzIwLDYgKzE0MDcsMTcgQEAKIFxtZW1iZXJ7bGluZV9udW19IGF0dHJpYnV0ZSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGxpbmVzCiByZWFkIGZyb20gdGhlIHNvdXJjZTsgcmVjb3JkcyBjYW4gc3BhbiBtdWx0aXBsZSBwaHlzaWNhbCBsaW5lcywgc28KIFxtZW1iZXJ7bGluZV9udW19IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZC4KKworVGhlIENTViBwYXJzZXIgaXMgbm93IHN0cmljdGVyIGFib3V0IG11bHRpLWxpbmUgcXVvdGVkCitmaWVsZHMuIFByZXZpb3VzbHksIGlmIGEgbGluZSBlbmRlZCB3aXRoaW4gYSBxdW90ZWQgZmllbGQgd2l0aG91dCBhCit0ZXJtaW5hdGluZyBuZXdsaW5lIGNoYXJhY3RlciwgYSBuZXdsaW5lIHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCityZXR1cm5lZCBmaWVsZC4gVGhpcyBiZWhhdmlvciBjYXVzZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIGZpbGVzIHRoYXQKK2NvbnRhaW5lZCBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVycyB3aXRoaW4gZmllbGRzLCBzbyB0aGUgY29kZSB3YXMKK2NoYW5nZWQgdG8gcmV0dXJuIHRoZSBmaWVsZCB3aXRob3V0IGluc2VydGluZyBuZXdsaW5lcy4gQXMgYQorY29uc2VxdWVuY2UsIGlmIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMgYXJlIGltcG9ydGFudCwgdGhlCitpbnB1dCBzaG91bGQgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB0aGF0IHByZXNlcnZlcyB0aGUKK25ld2xpbmUgY2hhcmFjdGVycy4KKwogKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvIGFuZCBBbmRyZXcgTWNOYW1hcmEuKQogCiBcaXRlbSBUaGUgXGNsYXNze2RhdGV0aW1lfSBjbGFzcyBpbiB0aGUgXG1vZHVsZXtkYXRldGltZX0gCkBAIC0xMzM1LDExICsxNDMzLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICclSDolTTolUyAlWS0lbS0lZCcpCiBcZW5ke3ZlcmJhdGltfQogCitcaXRlbSBUaGUgXG1ldGhvZHtTZXF1ZW5jZU1hdGNoZXIuZ2V0X21hdGNoaW5nX2Jsb2NrcygpfSBtZXRob2QKK2luIHRoZSBcbW9kdWxle2RpZmZsaWJ9IG1vZHVsZSBub3cgZ3VhcmFudGVlcyB0byByZXR1cm4gYSBtaW5pbWFsIGxpc3QKK29mIGJsb2NrcyBkZXNjcmliaW5nIG1hdGNoaW5nIHN1YnNlcXVlbmNlcy4gIFByZXZpb3VzbHksIHRoZSBhbGdvcml0aG0gd291bGQKK29jY2FzaW9uYWxseSBicmVhayBhIGJsb2NrIG9mIG1hdGNoaW5nIGVsZW1lbnRzIGludG8gdHdvIGxpc3QgZW50cmllcy4KKyhFbmhhbmNlbWVudCBieSBUaW0gUGV0ZXJzLikKKwogXGl0ZW0gVGhlIFxtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlIGdhaW5lZCBhIFxjb2Rle1NLSVB9IG9wdGlvbiB0aGF0CiBrZWVwcyBhbiBleGFtcGxlIGZyb20gYmVpbmcgZXhlY3V0ZWQgYXQgYWxsLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IKIGNvZGUgc25pcHBldHMgdGhhdCBhcmUgdXNhZ2UgZXhhbXBsZXMgaW50ZW5kZWQgZm9yIHRoZSByZWFkZXIgYW5kCiBhcmVuJ3QgYWN0dWFsbHkgdGVzdCBjYXNlcy4KIAorQW4gXHZhcntlbmNvZGluZ30gcGFyYW1ldGVyIHdhcyBhZGRlZCB0byB0aGUgXGZ1bmN0aW9ue3Rlc3RmaWxlKCl9CitmdW5jdGlvbiBhbmQgdGhlIFxjbGFzc3tEb2NGaWxlU3VpdGV9IGNsYXNzIHRvIHNwZWNpZnkgdGhlIGZpbGUncworZW5jb2RpbmcuICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gCit0ZXN0cyBjb250YWluZWQgd2l0aGluIGEgZG9jc3RyaW5nLiAgKENvbnRyaWJ1dGVkIGJ5IEJqb3JuIFRpbGxlbml1cy4pCislIFBhdGNoIDEwODA3MjcKKworXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgaGFzIGJlZW4gdXBkYXRlZCB0byB2ZXJzaW9uIDQuMC4KKyUgWFhYIG5lZWQgdG8gcHJvdmlkZSBzb21lIG1vcmUgZGV0YWlsIGhlcmUKKyhDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXtmaWxlaW5wdXR9IG1vZHVsZSB3YXMgbWFkZSBtb3JlIGZsZXhpYmxlLgogVW5pY29kZSBmaWxlbmFtZXMgYXJlIG5vdyBzdXBwb3J0ZWQsIGFuZCBhIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIHRoYXQKIGRlZmF1bHRzIHRvIFxjb2RleyJyIn0gd2FzIGFkZGVkIHRvIHRoZQpAQCAtMTM1OCw2ICsxNDcyLDcgQEAKIGNvbGxlY3Rpb24gc3dlZXAgd2lsbCBiZSBtYWRlLiAgVGhlIGV4aXN0aW5nIFxmdW5jdGlvbntnYy5jb2xsZWN0KCl9CiBmdW5jdGlvbiBub3cgdGFrZXMgYW4gb3B0aW9uYWwgXHZhcntnZW5lcmF0aW9ufSBhcmd1bWVudCBvZiAwLCAxLCBvciAyCiB0byBzcGVjaWZ5IHdoaWNoIGdlbmVyYXRpb24gdG8gY29sbGVjdC4KKyhDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQogCiBcaXRlbSBUaGUgXGZ1bmN0aW9ue25zbWFsbGVzdCgpfSBhbmQgCiBcZnVuY3Rpb257bmxhcmdlc3QoKX0gZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle2hlYXBxfSBtb2R1bGUgCkBAIC0xMzg4LDYgKzE1MDMsMjkgQEAKIAogKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKIAorXGl0ZW0gVGhlIFxmdW5jdGlvbntmb3JtYXQoKX0gZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7bG9jYWxlfSBtb2R1bGUKK2hhcyBiZWVuIG1vZGlmaWVkIGFuZCB0d28gbmV3IGZ1bmN0aW9ucyB3ZXJlIGFkZGVkLAorXGZ1bmN0aW9ue2Zvcm1hdF9zdHJpbmcoKX0gYW5kIFxmdW5jdGlvbntjdXJyZW5jeSgpfS4KKworVGhlIFxmdW5jdGlvbntmb3JtYXQoKX0gZnVuY3Rpb24ncyBcdmFye3ZhbH0gcGFyYW1ldGVyIGNvdWxkCitwcmV2aW91c2x5IGJlIGEgc3RyaW5nIGFzIGxvbmcgYXMgbm8gbW9yZSB0aGFuIG9uZSBcJWNoYXIgc3BlY2lmaWVyCithcHBlYXJlZDsgbm93IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBleGFjdGx5IG9uZSBcJWNoYXIgc3BlY2lmaWVyIHdpdGgKK25vIHN1cnJvdW5kaW5nIHRleHQuICBBbiBvcHRpb25hbCBcdmFye21vbmV0YXJ5fSBwYXJhbWV0ZXIgd2FzIGFsc28KK2FkZGVkIHdoaWNoLCBpZiBcY29kZXtUcnVlfSwgd2lsbCB1c2UgdGhlIGxvY2FsZSdzIHJ1bGVzIGZvcgorZm9ybWF0dGluZyBjdXJyZW5jeSBpbiBwbGFjaW5nIGEgc2VwYXJhdG9yIGJldHdlZW4gZ3JvdXBzIG9mIHRocmVlCitkaWdpdHMuCisKK1RvIGZvcm1hdCBzdHJpbmdzIHdpdGggbXVsdGlwbGUgXCVjaGFyIHNwZWNpZmllcnMsIHVzZSB0aGUgbmV3CitcZnVuY3Rpb257Zm9ybWF0X3N0cmluZygpfSBmdW5jdGlvbiB0aGF0IHdvcmtzIGxpa2UgXGZ1bmN0aW9ue2Zvcm1hdCgpfQorYnV0IGFsc28gc3VwcG9ydHMgbWl4aW5nIFwlY2hhciBzcGVjaWZpZXJzIHdpdGgKK2FyYml0cmFyeSB0ZXh0LgorCitBIG5ldyBcZnVuY3Rpb257Y3VycmVuY3koKX0gZnVuY3Rpb24gd2FzIGFsc28gYWRkZWQgdGhhdCBmb3JtYXRzIGEKK251bWJlciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlJ3Mgc2V0dGluZ3MuCisKKyhDb250cmlidXRlZCBieSBHZW9yZyBCcmFuZGwuKQorJSBQYXRjaCAxMTgwMjk2CisKIFxpdGVtIFRoZSBcbW9kdWxle21haWxib3h9IG1vZHVsZSB1bmRlcndlbnQgYSBtYXNzaXZlIHJld3JpdGUgdG8gYWRkCiB0aGUgY2FwYWJpbGl0eSB0byBtb2RpZnkgbWFpbGJveGVzIGluIGFkZGl0aW9uIHRvIHJlYWRpbmcgdGhlbS4gIEEgbmV3CiBzZXQgb2YgY2xhc3NlcyB0aGF0IGluY2x1ZGUgXGNsYXNze21ib3h9LCBcY2xhc3N7TUh9LCBhbmQKQEAgLTE0OTYsNiArMTYzNCw5IEBACiBwZXJmb3JtaW5nIG1hbnkgZGlmZmVyZW50IG9wZXJhdGlvbnMgYW5kIHJlZHVjaW5nIHRoZSByZXN1bHQgdG8gYQogc2luZ2xlIG51bWJlciBhcyBcZmlsZXtweXN0b25lLnB5fSBkb2VzLgogCitcaXRlbSBUaGUgXG1vZHVsZXtweWV4cGF0fSBtb2R1bGUgbm93IHVzZXMgdmVyc2lvbiAyLjAgb2YgdGhlIEV4cGF0IHBhcnNlci4KKyhDb250cmlidXRlZCBieSBUcmVudCBNaWNrLikKKwogXGl0ZW0gVGhlIG9sZCBcbW9kdWxle3JlZ2V4fSBhbmQgXG1vZHVsZXtyZWdzdWJ9IG1vZHVsZXMsIHdoaWNoIGhhdmUgYmVlbiAKIGRlcHJlY2F0ZWQgZXZlciBzaW5jZSBQeXRob24gMi4wLCBoYXZlIGZpbmFsbHkgYmVlbiBkZWxldGVkLiAgCiBPdGhlciBkZWxldGVkIG1vZHVsZXM6IFxtb2R1bGV7c3RhdGNhY2hlfSwgXG1vZHVsZXt0enBhcnNlfSwKQEAgLTE1NjAsNyArMTcwMSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBZb3UgY2FuIGFsc28gcGFjayBhbmQgdW5wYWNrIGRhdGEgdG8gYW5kIGZyb20gYnVmZmVyIG9iamVjdHMgZGlyZWN0bHkKLXVzaW5nIHRoZSBcbWV0aG9ke3BhY2tfdG8oXHZhcntidWZmZXJ9LCBcdmFye29mZnNldH0sIFx2YXJ7djF9LAordXNpbmcgdGhlIFxtZXRob2R7cGFja19pbnRvKFx2YXJ7YnVmZmVyfSwgXHZhcntvZmZzZXR9LCBcdmFye3YxfSwKIFx2YXJ7djJ9LCAuLi4pfSBhbmQgXG1ldGhvZHt1bnBhY2tfZnJvbShcdmFye2J1ZmZlcn0sIFx2YXJ7b2Zmc2V0fSl9CiBtZXRob2RzLiAgVGhpcyBsZXRzIHlvdSBzdG9yZSBkYXRhIGRpcmVjdGx5IGludG8gYW4gYXJyYXkgb3IgYQogbWVtb3J5LW1hcHBlZCBmaWxlLgpAQCAtMTU4MiwyMiArMTcyMyw3NiBAQAogXGNvZGV7InRydW5rOjQ1MzU1OjQ1MzU2TSwgQXByIDEzIDIwMDYsIDA3OjQyOjE5In0uICAKIChDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQogCitcaXRlbSBBbm90aGVyIG5ldyBmdW5jdGlvbiwgXGZ1bmN0aW9ue3N5cy5fY3VycmVudF9mcmFtZXMoKX0sIHJldHVybnMKK3RoZSBjdXJyZW50IHN0YWNrIGZyYW1lcyBmb3IgYWxsIHJ1bm5pbmcgdGhyZWFkcyBhcyBhIGRpY3Rpb25hcnkKK21hcHBpbmcgdGhyZWFkIGlkZW50aWZpZXJzIHRvIHRoZSB0b3Btb3N0IHN0YWNrIGZyYW1lIGN1cnJlbnRseSBhY3RpdmUKK2luIHRoYXQgdGhyZWFkIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICAoQ29udHJpYnV0ZWQgYnkKK1RpbSBQZXRlcnMuKQorCiBcaXRlbSBUaGUgXGNsYXNze1RhckZpbGV9IGNsYXNzIGluIHRoZSBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBub3cgaGFzCiBhbiBcbWV0aG9ke2V4dHJhY3RhbGwoKX0gbWV0aG9kIHRoYXQgZXh0cmFjdHMgYWxsIG1lbWJlcnMgZnJvbSB0aGUKIGFyY2hpdmUgaW50byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZXQKIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhcyB0aGUgZXh0cmFjdGlvbiB0YXJnZXQsIGFuZCB0byB1bnBhY2sgb25seSBhCi1zdWJzZXQgb2YgdGhlIGFyY2hpdmUncyBtZW1iZXJzLiAgCitzdWJzZXQgb2YgdGhlIGFyY2hpdmUncyBtZW1iZXJzLgogCi1BIHRhcmZpbGUncyBjb21wcmVzc2lvbiBjYW4gYmUgYXV0b2RldGVjdGVkIGJ5IAotdXNpbmcgdGhlIG1vZGUgXGNvZGV7J3J8Kid9LgorVGhlIGNvbXByZXNzaW9uIHVzZWQgZm9yIGEgdGFyZmlsZSBvcGVuZWQgaW4gc3RyZWFtIG1vZGUgY2FuIG5vdyBiZQorYXV0b2RldGVjdGVkIHVzaW5nIHRoZSBtb2RlIFxjb2RleydyfConfS4KICUgcGF0Y2ggOTE4MTAxCiAoQ29udHJpYnV0ZWQgYnkgTGFycyBHdXN0XCJhYmVsLikKIAorXGl0ZW0gVGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUgbm93IGxldHMgeW91IHNldCB0aGUgc3RhY2sgc2l6ZQordXNlZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBjcmVhdGVkLiBUaGUKK1xmdW5jdGlvbntzdGFja19zaXplKFxvcHRpb25hbHtcdmFye3NpemV9fSl9IGZ1bmN0aW9uIHJldHVybnMgdGhlCitjdXJyZW50bHkgY29uZmlndXJlZCBzdGFjayBzaXplLCBhbmQgc3VwcGx5aW5nIHRoZSBvcHRpb25hbCBcdmFye3NpemV9CitwYXJhbWV0ZXIgc2V0cyBhIG5ldyB2YWx1ZS4gIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgY2hhbmdpbmcgdGhlCitzdGFjayBzaXplLCBidXQgV2luZG93cywgUE9TSVggdGhyZWFkaW5nLCBhbmQgT1MvMiBhbGwgZG8uCisoQ29udHJpYnV0ZWQgYnkgQW5kcmV3IE1hY0ludHlyZS4pCislIFBhdGNoIDE0NTQ0ODEKKwogXGl0ZW0gVGhlIFxtb2R1bGV7dW5pY29kZWRhdGF9IG1vZHVsZSBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSB2ZXJzaW9uIDQuMS4wCiBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UuICBWZXJzaW9uIDMuMi4wIGlzIHJlcXVpcmVkIAogYnkgc29tZSBzcGVjaWZpY2F0aW9ucywgc28gaXQncyBzdGlsbCBhdmFpbGFibGUgYXMgCiBcbWVtYmVye3VuaWNvZGVkYXRhLnVjZF8zXzJfMH0uCiAKK1xpdGVtIE5ldyBtb2R1bGU6IHRoZSAgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZ2VuZXJhdGVzIAordW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzIChVVUlEcykgYWNjb3JkaW5nIHRvIFxyZmN7NDEyMn0uICBUaGUKK1JGQyBkZWZpbmVzIHNldmVyYWwgZGlmZmVyZW50IFVVSUQgdmVyc2lvbnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gYQorc3RhcnRpbmcgc3RyaW5nLCBmcm9tIHN5c3RlbSBwcm9wZXJ0aWVzLCBvciBwdXJlbHkgcmFuZG9tbHkuICBUaGlzCittb2R1bGUgY29udGFpbnMgYSBcY2xhc3N7VVVJRH0gY2xhc3MgYW5kIAorZnVuY3Rpb25zIG5hbWVkIFxmdW5jdGlvbnt1dWlkMSgpfSwKK1xmdW5jdGlvbnt1dWlkMygpfSwgXGZ1bmN0aW9ue3V1aWQ0KCl9LCAgYW5kIAorXGZ1bmN0aW9ue3V1aWQ1KCl9IHRvIGdlbmVyYXRlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBVVUlELiAgKFZlcnNpb24gMiBVVUlEcyAKK2FyZSBub3Qgc3BlY2lmaWVkIGluIFxyZmN7NDEyMn0gYW5kIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbW9kdWxlLikKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGltcG9ydCB1dWlkCis+Pj4gIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCis+Pj4gdXVpZC51dWlkMSgpCitVVUlEKCdhODA5OGMxYS1mODZlLTExZGEtYmQxYS0wMDExMjQ0NGJlMWUnKQorCis+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKz4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworPj4+ICMgbWFrZSBhIHJhbmRvbSBVVUlECis+Pj4gdXVpZC51dWlkNCgpCitVVUlEKCcxNmZkMjcwNi04YmFmLTQzM2ItODJlYi04YzdmYWRhODQ3ZGEnKQorCis+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCis+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKK1VVSUQoJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpCitcZW5ke3ZlcmJhdGltfQorCisoQ29udHJpYnV0ZWQgYnkgS2EtUGluZyBZZWUuKQorCitcaXRlbSBUaGUgXG1vZHVsZXt3ZWFrcmVmfSBtb2R1bGUncyBcY2xhc3N7V2Vha0tleURpY3Rpb25hcnl9IGFuZAorXGNsYXNze1dlYWtWYWx1ZURpY3Rpb25hcnl9IHR5cGVzIGdhaW5lZCBuZXcgbWV0aG9kcyBmb3IgaXRlcmF0aW5nCitvdmVyIHRoZSB3ZWFrIHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoZSBkaWN0aW9uYXJ5LiAKK1xtZXRob2R7aXRlcmtleXJlZnMoKX0gYW5kIFxtZXRob2R7a2V5cmVmcygpfSBtZXRob2RzIHdlcmUKK2FkZGVkIHRvIFxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0sIGFuZAorXG1ldGhvZHtpdGVydmFsdWVyZWZzKCl9IGFuZCBcbWV0aG9ke3ZhbHVlcmVmcygpfSB3ZXJlIGFkZGVkIHRvCitcY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0uICAoQ29udHJpYnV0ZWQgYnkgRnJlZCBMLn5EcmFrZSwgSnIuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXt3ZWJicm93c2VyfSBtb2R1bGUgcmVjZWl2ZWQgYSBudW1iZXIgb2YKIGVuaGFuY2VtZW50cy4KIEl0J3Mgbm93IHVzYWJsZSBhcyBhIHNjcmlwdCB3aXRoIFxjb2Rle3B5dGhvbiAtbSB3ZWJicm93c2VyfSwgdGFraW5nIGEKQEAgLTE2MDksMTEgKzE4MDQsMTAgQEAKIGFkZGl0aW9uYWwgZmVhdHVyZSwgYW4gXHZhcnthdXRvcmFpc2V9IHBhcmFtZXRlciB0aGF0IHNpZ25hbHMgd2hldGhlcgogdG8gcmFpc2UgdGhlIG9wZW4gd2luZG93IHdoZW4gcG9zc2libGUuIEEgbnVtYmVyIG9mIGFkZGl0aW9uYWwKIGJyb3dzZXJzIHdlcmUgYWRkZWQgdG8gdGhlIHN1cHBvcnRlZCBsaXN0IHN1Y2ggYXMgRmlyZWZveCwgT3BlcmEsCi1Lb25xdWVyb3IsIGFuZCBlbGlua3MuICAoQ29udHJpYnV0ZWQgYnkgT2xlZyBCcm95dG1hbm4gYW5kIEdlb3JnZQorS29ucXVlcm9yLCBhbmQgZWxpbmtzLiAgKENvbnRyaWJ1dGVkIGJ5IE9sZWcgQnJveXRtYW5uIGFuZCBHZW9yZwogQnJhbmRsLikKICUgUGF0Y2ggIzc1NDAyMgogCi0KIFxpdGVtIFRoZSBcbW9kdWxle3htbHJwY2xpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyByZXR1cm5pbmcgCiAgICAgICBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdHMgZm9yIHRoZSBYTUwtUlBDIGRhdGUgdHlwZS4gIFN1cHBseSAKICAgICAgIFxjb2Rle3VzZV9kYXRldGltZT1UcnVlfSB0byB0aGUgXGZ1bmN0aW9ue2xvYWRzKCl9IGZ1bmN0aW9uCkBAIC0xNjIxLDYgKzE4MTUsMTIgQEAKICAgICAgIChDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCiAlIFBhdGNoIDExMjAzNTMKIAorXGl0ZW0gVGhlIFxtb2R1bGV7emlwZmlsZX0gbW9kdWxlIG5vdyBzdXBwb3J0cyB0aGUgWklQNjQgdmVyc2lvbiBvZiB0aGUgCitmb3JtYXQsIG1lYW5pbmcgdGhhdCBhIC56aXAgYXJjaGl2ZSBjYW4gbm93IGJlIGxhcmdlciB0aGFuIDR+R2lCIGFuZAorY2FuIGNvbnRhaW4gaW5kaXZpZHVhbCBmaWxlcyBsYXJnZXIgdGhhbiA0fkdpQi4gIChDb250cmlidXRlZCBieQorUm9uYWxkIE91c3NvcmVuLikKKyUgUGF0Y2ggMTQ0NjQ4OQorCiBcaXRlbSBUaGUgXG1vZHVsZXt6bGlifSBtb2R1bGUncyBcY2xhc3N7Q29tcHJlc3N9IGFuZCBcY2xhc3N7RGVjb21wcmVzc30KIG9iamVjdHMgbm93IHN1cHBvcnQgYSBcbWV0aG9ke2NvcHkoKX0gbWV0aG9kIHRoYXQgbWFrZXMgYSBjb3B5IG9mIHRoZSAKIG9iamVjdCdzIGludGVybmFsIHN0YXRlIGFuZCByZXR1cm5zIGEgbmV3IApAQCAtMTcxMSw2ICsxOTExLDkgQEAKIFxzZWV1cmx7aHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy90aGVsbGVyL2N0eXBlcy99CiB7VGhlIGN0eXBlcyB3ZWIgcGFnZSwgd2l0aCBhIHR1dG9yaWFsLCByZWZlcmVuY2UsIGFuZCBGQVEufQogCitcc2VldXJsey4uL2xpYi9tb2R1bGUtY3R5cGVzLmh0bWx9e1RoZSBkb2N1bWVudGF0aW9uIAorZm9yIHRoZSBcbW9kdWxle2N0eXBlc30gbW9kdWxlLn0KKwogXGVuZHtzZWVhbHNvfQogCiAKQEAgLTE4MjIsNyArMjAyNSw2IEBACiBcc2VldXJse2h0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudC1pbmRleC5odG19CiB7T2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBmb3IgRWxlbWVudFRyZWUufQogCi0KIFxlbmR7c2VlYWxzb30KIAogCkBAIC0xODczLDYgKzIwNzUsMTMgQEAKIHJldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgYmluYXJ5IHN0cmluZyBvciBhIHN0cmluZyBvZiBoZXggZGlnaXRzLAogYW5kIFxtZXRob2R7Y29weSgpfSByZXR1cm5zIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGlnZXN0IHN0YXRlLgogCitcYmVnaW57c2VlYWxzb30KKworXHNlZXVybHsuLi9saWIvbW9kdWxlLWhhc2hsaWIuaHRtbH17VGhlIGRvY3VtZW50YXRpb24gCitmb3IgdGhlIFxtb2R1bGV7aGFzaGxpYn0gbW9kdWxlLn0KKworXGVuZHtzZWVhbHNvfQorCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc3Vic2VjdGlvbntUaGUgc3FsaXRlMyBwYWNrYWdlXGxhYmVse21vZHVsZS1zcWxpdGV9fQpAQCAtMTk4MywxMiArMjE5Miw1MyBAQAoge1RoZSBTUUxpdGUgd2ViIHBhZ2U7IHRoZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyB0aGUgc3ludGF4IGFuZCB0aGUKIGF2YWlsYWJsZSBkYXRhIHR5cGVzIGZvciB0aGUgc3VwcG9ydGVkIFNRTCBkaWFsZWN0Ln0KIAorXHNlZXVybHsuLi9saWIvbW9kdWxlLXNxbGl0ZTMuaHRtbH17VGhlIGRvY3VtZW50YXRpb24gCitmb3IgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlLn0KKwogXHNlZXBlcHsyNDl9e0RhdGFiYXNlIEFQSSBTcGVjaWZpY2F0aW9uIDIuMH17UEVQIHdyaXR0ZW4gYnkKIE1hcmMtQW5kclwnZSBMZW1idXJnLn0KIAogXGVuZHtzZWVhbHNvfQogCiAKKyU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citcc3Vic2VjdGlvbntUaGUgd3NnaXJlZiBwYWNrYWdlXGxhYmVse21vZHVsZS13c2dpcmVmfX0KKworJSBYWFggc2hvdWxkIHRoaXMgYmUgaW4gYSBQRVAgMzMzIHNlY3Rpb24gaW5zdGVhZD8KKworVGhlIFdlYiBTZXJ2ZXIgR2F0ZXdheSBJbnRlcmZhY2UgKFdTR0kpIHYxLjAgZGVmaW5lcyBhIHN0YW5kYXJkCitpbnRlcmZhY2UgYmV0d2VlbiB3ZWIgc2VydmVycyBhbmQgUHl0aG9uIHdlYiBhcHBsaWNhdGlvbnMgYW5kIGlzCitkZXNjcmliZWQgaW4gXHBlcHszMzN9LiAgVGhlIFxtb2R1bGV7d3NnaXJlZn0gcGFja2FnZSBpcyBhIHJlZmVyZW5jZQoraW1wbGVtZW50YXRpb24gb2YgdGhlIFdTR0kgc3BlY2lmaWNhdGlvbi4KKworVGhlIHBhY2thZ2UgaW5jbHVkZXMgYSBiYXNpYyBIVFRQIHNlcnZlciB0aGF0IHdpbGwgcnVuIGEgV1NHSQorYXBwbGljYXRpb247IHRoaXMgc2VydmVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGJ1dCBpc24ndCBpbnRlbmRlZCBmb3IgCitwcm9kdWN0aW9uIHVzZS4gIFNldHRpbmcgdXAgYSBzZXJ2ZXIgdGFrZXMgb25seSBhIGZldyBsaW5lcyBvZiBjb2RlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIHdzZ2lyZWYgaW1wb3J0IHNpbXBsZV9zZXJ2ZXIKKword3NnaV9hcHAgPSAuLi4KKworaG9zdCA9ICcnCitwb3J0ID0gODAwMAoraHR0cGQgPSBzaW1wbGVfc2VydmVyLm1ha2Vfc2VydmVyKGhvc3QsIHBvcnQsIHdzZ2lfYXBwKQoraHR0cGQuc2VydmVfZm9yZXZlcigpCitcZW5ke3ZlcmJhdGltfQorCislIFhYWCBkaXNjdXNzIHN0cnVjdHVyZSBvZiBXU0dJIGFwcGxpY2F0aW9ucz8gIAorJSBYWFggcHJvdmlkZSBhbiBleGFtcGxlIHVzaW5nIERqYW5nbyBvciBzb21lIG90aGVyIGZyYW1ld29yaz8KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWV1cmx7aHR0cDovL3d3dy53c2dpLm9yZ317QSBjZW50cmFsIHdlYiBzaXRlIGZvciBXU0dJLXJlbGF0ZWQgcmVzb3VyY2VzLn0KKworXHNlZXBlcHszMzN9e1B5dGhvbiBXZWIgU2VydmVyIEdhdGV3YXkgSW50ZXJmYWNlIHYxLjB9e1BFUCB3cml0dGVuIGJ5CitQaGlsbGlwIEouIEVieS59CisKK1xlbmR7c2VlYWxzb30KKworCiAlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzXGxhYmVse2J1aWxkLWFwaX19CiAKQEAgLTE5OTYsMTMgKzIyNDYsMjUgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKK1xpdGVtIFRoZSBQeXRob24gc291cmNlIHRyZWUgd2FzIGNvbnZlcnRlZCBmcm9tIENWUyB0byBTdWJ2ZXJzaW9uLCAKK2luIGEgY29tcGxleCBtaWdyYXRpb24gcHJvY2VkdXJlIHRoYXQgd2FzIHN1cGVydmlzZWQgYW5kIGZsYXdsZXNzbHkKK2NhcnJpZWQgb3V0IGJ5IE1hcnRpbiB2b25+TFwib3dpcy4gIFRoZSBwcm9jZWR1cmUgd2FzIGRldmVsb3BlZCBhcworXHBlcHszNDd9LgorCitcaXRlbSBDb3Zlcml0eSwgYSBjb21wYW55IHRoYXQgbWFya2V0cyBhIHNvdXJjZSBjb2RlIGFuYWx5c2lzIHRvb2wKK2NhbGxlZCBQcmV2ZW50LCBwcm92aWRlZCB0aGUgcmVzdWx0cyBvZiB0aGVpciBleGFtaW5hdGlvbiBvZiB0aGUgUHl0aG9uCitzb3VyY2UgY29kZS4gIFRoZSBhbmFseXNpcyBmb3VuZCBhYm91dCA2MCBidWdzIHRoYXQgCit3ZXJlIHF1aWNrbHkgZml4ZWQuICBNYW55IG9mIHRoZSBidWdzIHdlcmUgcmVmY291bnRpbmcgcHJvYmxlbXMsIG9mdGVuCitvY2N1cnJpbmcgaW4gZXJyb3ItaGFuZGxpbmcgY29kZS4gIFNlZQorXHVybHtodHRwOi8vc2Nhbi5jb3Zlcml0eS5jb219IGZvciB0aGUgc3RhdGlzdGljcy4KKwogXGl0ZW0gVGhlIGxhcmdlc3QgY2hhbmdlIHRvIHRoZSBDIEFQSSBjYW1lIGZyb20gXHBlcHszNTN9LAogd2hpY2ggbW9kaWZpZXMgdGhlIGludGVycHJldGVyIHRvIHVzZSBhIFxjdHlwZXtQeV9zc2l6ZV90fSB0eXBlCiBkZWZpbml0aW9uIGluc3RlYWQgb2YgXGN0eXBle2ludH0uICBTZWUgdGhlIGVhcmxpZXIKIHNlY3Rpb25+XHJlZntwZXAtMzUzfSBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgY2hhbmdlLgogCi1caXRlbSBUaGUgZGVzaWduIG9mIHRoZSBieXRlY29kZSBjb21waWxlciBoYXMgY2hhbmdlZCBhIGdyZWF0IGRlYWwsIHRvCi1ubyBsb25nZXIgZ2VuZXJhdGUgYnl0ZWNvZGUgYnkgdHJhdmVyc2luZyB0aGUgcGFyc2UgdHJlZS4gIEluc3RlYWQKK1xpdGVtIFRoZSBkZXNpZ24gb2YgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGhhcyBjaGFuZ2VkIGEgZ3JlYXQgZGVhbCwgCitubyBsb25nZXIgZ2VuZXJhdGluZyBieXRlY29kZSBieSB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLiAgSW5zdGVhZAogdGhlIHBhcnNlIHRyZWUgaXMgY29udmVydGVkIHRvIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIChvciBBU1QpLCBhbmQgaXQgaXMgCiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdGhhdCdzIHRyYXZlcnNlZCB0byBwcm9kdWNlIHRoZSBieXRlY29kZS4KIApAQCAtMjAyMiwxMiArMjI4NCwxMyBAQAogZm9yX2xvb3AgPSBhc3QuYm9keVsxXQogXGVuZHt2ZXJiYXRpbX0KIAotTm8gZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgQVNUIGNvZGUgeWV0LiAgVG8gc3RhcnQKLWxlYXJuaW5nIGFib3V0IGl0LCByZWFkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIEFTVCBub2RlcyBpbgotXGZpbGV7UGFyc2VyL1B5dGhvbi5hc2RsfS4gIEEgUHl0aG9uIHNjcmlwdCByZWFkcyB0aGlzIGZpbGUgYW5kCi1nZW5lcmF0ZXMgYSBzZXQgb2YgQyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4KLVxmaWxle0luY2x1ZGUvUHl0aG9uLWFzdC5ofS4gIFRoZSBcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21TdHJpbmcoKX0KLWFuZCBcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21GaWxlKCl9LCBkZWZpbmVkIGluCitObyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIHRoZSBBU1QgY29kZSB5ZXQsIGJ1dAorXHBlcHszMzl9IGRpc2N1c3NlcyB0aGUgZGVzaWduLiAgVG8gc3RhcnQgbGVhcm5pbmcgYWJvdXQgdGhlIGNvZGUsIHJlYWQgdGhlCitkZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIEFTVCBub2RlcyBpbiBcZmlsZXtQYXJzZXIvUHl0aG9uLmFzZGx9LiAgQQorUHl0aG9uIHNjcmlwdCByZWFkcyB0aGlzIGZpbGUgYW5kIGdlbmVyYXRlcyBhIHNldCBvZiBDIHN0cnVjdHVyZQorZGVmaW5pdGlvbnMgaW4gXGZpbGV7SW5jbHVkZS9QeXRob24tYXN0Lmh9LiAgVGhlCitcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21TdHJpbmcoKX0gYW5kCitcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21GaWxlKCl9LCBkZWZpbmVkIGluCiBcZmlsZXtJbmNsdWRlL3B5dGhvbnJ1bi5ofSwgdGFrZSBQeXRob24gc291cmNlIGFzIGlucHV0IGFuZCByZXR1cm4gdGhlCiByb290IG9mIGFuIEFTVCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzLiAgVGhpcyBBU1QgY2FuIHRoZW4gYmUgdHVybmVkCiBpbnRvIGEgY29kZSBvYmplY3QgYnkgXGNmdW5jdGlvbntQeUFTVF9Db21waWxlKCl9LiAgRm9yIG1vcmUKQEAgLTIwNDIsNiArMjMwNSwzMiBAQAogQXJtaW4gUmlnbywgYW5kIE5laWwgU2NoZW1lbmF1ZXIsIHBsdXMgdGhlIHBhcnRpY2lwYW50cyBpbiBhIG51bWJlciBvZgogQVNUIHNwcmludHMgYXQgY29uZmVyZW5jZXMgc3VjaCBhcyBQeUNvbi4KICAKK1xpdGVtIEV2YW4gSm9uZXMncyBwYXRjaCB0byBvYm1hbGxvYywgZmlyc3QgZGVzY3JpYmVkIGluIGEgdGFsaworYXQgUHlDb24gREMgMjAwNSwgd2FzIGFwcGxpZWQuICBQeXRob24gMi40IGFsbG9jYXRlZCBzbWFsbCBvYmplY3RzIGluCisyNTZLLXNpemVkIGFyZW5hcywgYnV0IG5ldmVyIGZyZWVkIGFyZW5hcy4gIFdpdGggdGhpcyBwYXRjaCwgUHl0aG9uCit3aWxsIGZyZWUgYXJlbmFzIHdoZW4gdGhleSdyZSBlbXB0eS4gIFRoZSBuZXQgZWZmZWN0IGlzIHRoYXQgb24gc29tZQorcGxhdGZvcm1zLCB3aGVuIHlvdSBhbGxvY2F0ZSBtYW55IG9iamVjdHMsIFB5dGhvbidzIG1lbW9yeSB1c2FnZSBtYXkKK2FjdHVhbGx5IGRyb3Agd2hlbiB5b3UgZGVsZXRlIHRoZW0gYW5kIHRoZSBtZW1vcnkgbWF5IGJlIHJldHVybmVkIHRvCit0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIChJbXBsZW1lbnRlZCBieSBFdmFuIEpvbmVzLCBhbmQgcmV3b3JrZWQgYnkgVGltCitQZXRlcnMuKQorCitOb3RlIHRoYXQgdGhpcyBjaGFuZ2UgbWVhbnMgZXh0ZW5zaW9uIG1vZHVsZXMgbXVzdCBiZSBtb3JlIGNhcmVmdWwKK3doZW4gYWxsb2NhdGluZyBtZW1vcnkuICBQeXRob24ncyBBUEkgaGFzIG1hbnkgZGlmZmVyZW50CitmdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRoYXQgYXJlIGdyb3VwZWQgaW50byBmYW1pbGllcy4gIEZvcgorZXhhbXBsZSwgXGNmdW5jdGlvbntQeU1lbV9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfSwgYW5kCitcY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gYXJlIG9uZSBmYW1pbHkgdGhhdCBhbGxvY2F0ZXMgcmF3IG1lbW9yeSwKK3doaWxlIFxjZnVuY3Rpb257UHlPYmplY3RfTWFsbG9jKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlYWxsb2MoKX0sCithbmQgXGNmdW5jdGlvbntQeU9iamVjdF9GcmVlKCl9IGFyZSBhbm90aGVyIGZhbWlseSB0aGF0J3Mgc3VwcG9zZWQgdG8KK2JlIHVzZWQgZm9yIGNyZWF0aW5nIFB5dGhvbiBvYmplY3RzLiAgCisKK1ByZXZpb3VzbHkgdGhlc2UgZGlmZmVyZW50IGZhbWlsaWVzIGFsbCByZWR1Y2VkIHRvIHRoZSBwbGF0Zm9ybSdzCitcY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgXGNmdW5jdGlvbntmcmVlKCl9IGZ1bmN0aW9ucy4gIFRoaXMgbWVhbnQgCitpdCBkaWRuJ3QgbWF0dGVyIGlmIHlvdSBnb3QgdGhpbmdzIHdyb25nIGFuZCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggdGhlCitcY2Z1bmN0aW9ue1B5TWVtfSBmdW5jdGlvbiBidXQgZnJlZWQgaXQgd2l0aCB0aGUgXGNmdW5jdGlvbntQeU9iamVjdH0KK2Z1bmN0aW9uLiAgV2l0aCAyLjUncyBjaGFuZ2VzIHRvIG9ibWFsbG9jLCB0aGVzZSBmYW1pbGllcyBub3cgZG8gZGlmZmVyZW50Cit0aGluZ3MgYW5kIG1pc21hdGNoZXMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYSBzZWdmYXVsdC4gIFlvdSBzaG91bGQKK2NhcmVmdWxseSB0ZXN0IHlvdXIgQyBleHRlbnNpb24gbW9kdWxlcyB3aXRoIFB5dGhvbiAyLjUuCisKIFxpdGVtIFRoZSBidWlsdC1pbiBzZXQgdHlwZXMgbm93IGhhdmUgYW4gb2ZmaWNpYWwgQyBBUEkuICBDYWxsCiBcY2Z1bmN0aW9ue1B5U2V0X05ldygpfSBhbmQgXGNmdW5jdGlvbntQeUZyb3plblNldF9OZXcoKX0gdG8gY3JlYXRlIGEKIG5ldyBzZXQsIFxjZnVuY3Rpb257UHlTZXRfQWRkKCl9IGFuZCBcY2Z1bmN0aW9ue1B5U2V0X0Rpc2NhcmQoKX0gdG8KQEAgLTIwNzIsMTMgKzIzNjEsMjUgQEAKIFx2YXJ7ZGljdH0pfSBjYW4gbm93IGFjY2VwdCBhIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBhcyBpdHMgXHZhcntiYXNlfQogYXJndW1lbnQuICAoQ29udHJpYnV0ZWQgYnkgR2VvcmcgQnJhbmRsLikKIAorXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlFcnJfV2FybigpfSBmdW5jdGlvbiBmb3IgaXNzdWluZyB3YXJuaW5ncworaXMgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIFxjZnVuY3Rpb257UHlFcnJfV2FybkV4KGNhdGVnb3J5LAorbWVzc2FnZSwgc3RhY2tsZXZlbCl9IHdoaWNoIGxldHMgeW91IHNwZWNpZnkgdGhlIG51bWJlciBvZiBzdGFjaworZnJhbWVzIHNlcGFyYXRpbmcgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4gIEEgXHZhcntzdGFja2xldmVsfSBvZgorMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyB0aGUKK2Z1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4gIChBZGRlZCBieSBOZWFsIE5vcndpdHouKQorCiBcaXRlbSBUaGUgQ1B5dGhvbiBpbnRlcnByZXRlciBpcyBzdGlsbCB3cml0dGVuIGluIEMsIGJ1dCAKIHRoZSBjb2RlIGNhbiBub3cgYmUgY29tcGlsZWQgd2l0aCBhIHtcQ3BwfSBjb21waWxlciB3aXRob3V0IGVycm9ycy4gIAogKEltcGxlbWVudGVkIGJ5IEFudGhvbnkgQmF4dGVyLCBNYXJ0aW4gdm9ufkxcIm93aXMsIFNraXAgTW9udGFuYXJvLikKIAogXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlSYW5nZV9OZXcoKX0gZnVuY3Rpb24gd2FzIHJlbW92ZWQuICBJdCB3YXMKIG5ldmVyIGRvY3VtZW50ZWQsIG5ldmVyIHVzZWQgaW4gdGhlIGNvcmUgY29kZSwgYW5kIGhhZCBkYW5nZXJvdXNseSBsYXgKLWVycm9yIGNoZWNraW5nLgorZXJyb3IgY2hlY2tpbmcuICBJbiB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IHlvdXIgZXh0ZW5zaW9ucyB3ZXJlIHVzaW5nCitpdCwgeW91IGNhbiByZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CitcYmVnaW57dmVyYmF0aW19CityYW5nZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmUHlSYW5nZV9UeXBlLCAibGxsIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgc3RlcCk7CitcZW5ke3ZlcmJhdGltfQogCiBcZW5ke2l0ZW1pemV9CiAKQEAgLTIxMDUsNTQgKzI0MDYsNiBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntPdGhlciBDaGFuZ2VzIGFuZCBGaXhlcyBcbGFiZWx7c2VjdGlvbi1vdGhlcn19Ci0KLUFzIHVzdWFsLCB0aGVyZSB3ZXJlIGEgYnVuY2ggb2Ygb3RoZXIgaW1wcm92ZW1lbnRzIGFuZCBidWdmaXhlcwotc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgQSBzZWFyY2ggdGhyb3VnaCB0aGUgU1ZOIGNoYW5nZQotbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIFhYWCBwYXRjaGVzIGFwcGxpZWQgYW5kIFlZWSBidWdzIGZpeGVkIGJldHdlZW4KLVB5dGhvbiAyLjQgYW5kIDIuNS4gIEJvdGggZmlndXJlcyBhcmUgbGlrZWx5IHRvIGJlIHVuZGVyZXN0aW1hdGVzLgotCi1Tb21lIG9mIHRoZSBtb3JlIG5vdGFibGUgY2hhbmdlcyBhcmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBFdmFuIEpvbmVzJ3MgcGF0Y2ggdG8gb2JtYWxsb2MsIGZpcnN0IGRlc2NyaWJlZCBpbiBhIHRhbGsKLWF0IFB5Q29uIERDIDIwMDUsIHdhcyBhcHBsaWVkLiAgUHl0aG9uIDIuNCBhbGxvY2F0ZWQgc21hbGwgb2JqZWN0cyBpbgotMjU2Sy1zaXplZCBhcmVuYXMsIGJ1dCBuZXZlciBmcmVlZCBhcmVuYXMuICBXaXRoIHRoaXMgcGF0Y2gsIFB5dGhvbgotd2lsbCBmcmVlIGFyZW5hcyB3aGVuIHRoZXkncmUgZW1wdHkuICBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IG9uIHNvbWUKLXBsYXRmb3Jtcywgd2hlbiB5b3UgYWxsb2NhdGUgbWFueSBvYmplY3RzLCBQeXRob24ncyBtZW1vcnkgdXNhZ2UgbWF5Ci1hY3R1YWxseSBkcm9wIHdoZW4geW91IGRlbGV0ZSB0aGVtLCBhbmQgdGhlIG1lbW9yeSBtYXkgYmUgcmV0dXJuZWQgdG8KLXRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgKEltcGxlbWVudGVkIGJ5IEV2YW4gSm9uZXMsIGFuZCByZXdvcmtlZCBieSBUaW0KLVBldGVycy4pCi0KLU5vdGUgdGhhdCB0aGlzIGNoYW5nZSBtZWFucyBleHRlbnNpb24gbW9kdWxlcyBuZWVkIHRvIGJlIG1vcmUgY2FyZWZ1bAotd2l0aCBob3cgdGhleSBhbGxvY2F0ZSBtZW1vcnkuICBQeXRob24ncyBBUEkgaGFzIG1hbnkgZGlmZmVyZW50Ci1mdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRoYXQgYXJlIGdyb3VwZWQgaW50byBmYW1pbGllcy4gIEZvcgotZXhhbXBsZSwgXGNmdW5jdGlvbntQeU1lbV9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfSwgYW5kCi1cY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gYXJlIG9uZSBmYW1pbHkgdGhhdCBhbGxvY2F0ZXMgcmF3IG1lbW9yeSwKLXdoaWxlIFxjZnVuY3Rpb257UHlPYmplY3RfTWFsbG9jKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlYWxsb2MoKX0sCi1hbmQgXGNmdW5jdGlvbntQeU9iamVjdF9GcmVlKCl9IGFyZSBhbm90aGVyIGZhbWlseSB0aGF0J3Mgc3VwcG9zZWQgdG8KLWJlIHVzZWQgZm9yIGNyZWF0aW5nIFB5dGhvbiBvYmplY3RzLiAgCi0KLVByZXZpb3VzbHkgdGhlc2UgZGlmZmVyZW50IGZhbWlsaWVzIGFsbCByZWR1Y2VkIHRvIHRoZSBwbGF0Zm9ybSdzCi1cY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgXGNmdW5jdGlvbntmcmVlKCl9IGZ1bmN0aW9ucy4gIFRoaXMgbWVhbnQgCi1pdCBkaWRuJ3QgbWF0dGVyIGlmIHlvdSBnb3QgdGhpbmdzIHdyb25nIGFuZCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggdGhlCi1cY2Z1bmN0aW9ue1B5TWVtfSBmdW5jdGlvbiBidXQgZnJlZWQgaXQgd2l0aCB0aGUgXGNmdW5jdGlvbntQeU9iamVjdH0KLWZ1bmN0aW9uLiAgV2l0aCB0aGUgb2JtYWxsb2MgY2hhbmdlLCB0aGVzZSBmYW1pbGllcyBub3cgZG8gZGlmZmVyZW50Ci10aGluZ3MsIGFuZCBtaXNtYXRjaGVzIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGEgc2VnZmF1bHQuICBZb3Ugc2hvdWxkCi1jYXJlZnVsbHkgdGVzdCB5b3VyIEMgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBQeXRob24gMi41LgotCi1caXRlbSBDb3Zlcml0eSwgYSBjb21wYW55IHRoYXQgbWFya2V0cyBhIHNvdXJjZSBjb2RlIGFuYWx5c2lzIHRvb2wKLSAgY2FsbGVkIFByZXZlbnQsIHByb3ZpZGVkIHRoZSByZXN1bHRzIG9mIHRoZWlyIGV4YW1pbmF0aW9uIG9mIHRoZSBQeXRob24KLSAgc291cmNlIGNvZGUuICBUaGUgYW5hbHlzaXMgZm91bmQgYWJvdXQgNjAgYnVncyB0aGF0IAotICB3ZXJlIHF1aWNrbHkgZml4ZWQuICBNYW55IG9mIHRoZSBidWdzIHdlcmUgcmVmY291bnRpbmcgcHJvYmxlbXMsIG9mdGVuCi0gIG9jY3VycmluZyBpbiBlcnJvci1oYW5kbGluZyBjb2RlLiAgU2VlCi0gIFx1cmx7aHR0cDovL3NjYW4uY292ZXJpdHkuY29tfSBmb3IgdGhlIHN0YXRpc3RpY3MuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257UG9ydGluZyB0byBQeXRob24gMi41XGxhYmVse3BvcnRpbmd9fQogCiBUaGlzIHNlY3Rpb24gbGlzdHMgcHJldmlvdXNseSBkZXNjcmliZWQgY2hhbmdlcyB0aGF0IG1heSByZXF1aXJlCkBAIC0yMTcwLDYgKzI0MjMsMTYgQEAKIGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7cGVwLTM0Mn0sIGl0J3Mgbm93IHBvc3NpYmxlCiBmb3IgXG1lbWJlcntnaV9mcmFtZX0gdG8gYmUgXGNvZGV7Tm9uZX0uCiAKK1xpdGVtIExpYnJhcnk6IHRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGlzIG5vdyBzdHJpY3RlciBhYm91dCBtdWx0aS1saW5lIHF1b3RlZAorZmllbGRzLiAgSWYgeW91ciBmaWxlcyBjb250YWluIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMsIHRoZQoraW5wdXQgc2hvdWxkIGJlIHNwbGl0IGludG8gbGluZXMgaW4gYSBtYW5uZXIgd2hpY2ggcHJlc2VydmVzIHRoZQorbmV3bGluZSBjaGFyYWN0ZXJzLgorCitcaXRlbSBMaWJyYXJ5OiB0aGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSdzIAorXGZ1bmN0aW9ue2Zvcm1hdCgpfSBmdW5jdGlvbidzIHdvdWxkIHByZXZpb3VzbHkgCithY2NlcHQgYW55IHN0cmluZyBhcyBsb25nIGFzIG5vIG1vcmUgdGhhbiBvbmUgXCVjaGFyIHNwZWNpZmllcgorYXBwZWFyZWQuICBJbiBQeXRob24gMi41LCB0aGUgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IG9uZSBcJWNoYXIKK3NwZWNpZmllciB3aXRoIG5vIHN1cnJvdW5kaW5nIHRleHQuIAogCiBcaXRlbSBMaWJyYXJ5OiBUaGUgXG1vZHVsZXtwaWNrbGV9IGFuZCBcbW9kdWxle2NQaWNrbGV9IG1vZHVsZXMgbm8KIGxvbmdlciBhY2NlcHQgYSByZXR1cm4gdmFsdWUgb2YgXGNvZGV7Tm9uZX0gZnJvbSB0aGUKQEAgLTIyMDYsNyArMjQ2OSwxMCBAQAogCiBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCiBzdWdnZXN0aW9ucywgY29ycmVjdGlvbnMgYW5kIGFzc2lzdGFuY2Ugd2l0aCB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzCi1hcnRpY2xlOiBQaGlsbGlwIEouIEVieSwgS2VudCBKb2huc29uLCBNYXJ0aW4gdm9ufkxcIm93aXMsIEZyZWRyaWsgTHVuZGgsIAotR3VzdGF2byBOaWVtZXllciwgSmFtZXMgUHJ5b3IsIE1pa2UgUm92bmVyLCBTY290dCBXZWlrYXJ0LCBUaG9tYXMgV291dGVycy4KK2FydGljbGU6IEdlb3JnIEJyYW5kbCwgTmljayBDb2dobGFuLCBQaGlsbGlwIEouIEVieSwgTGFycyBHdXN0XCJhYmVsLAorUmF5bW9uZCBIZXR0aW5nZXIsIFJhbGYgVy4gR3Jvc3NlLUt1bnN0bGV2ZSwgS2VudCBKb2huc29uLCBJYWluIExvd2UsCitNYXJ0aW4gdm9ufkxcIm93aXMsIEZyZWRyaWsgTHVuZGgsIEFuZHJldyBNY05hbWFyYSwgU2tpcCBNb250YW5hcm8sCitHdXN0YXZvIE5pZW1leWVyLCBQYXVsIFByZXNjb2QsIEphbWVzIFByeW9yLCBNaWtlIFJvdm5lciwgU2NvdHQKK1dlaWthcnQsIEJhcnJ5IFdhcnNhdywgVGhvbWFzIFdvdXRlcnMuCiAKIFxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9JbmNsdWRlL1B5dGhvbi5oIGIvSW5jbHVkZS9QeXRob24uaAppbmRleCBjYTE2YzY0Li5iYmI5YTA4IDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi5oCisrKyBiL0luY2x1ZGUvUHl0aG9uLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIERPTlRfSEFWRV9FUlJOT19ICisjaWZkZWYgSEFWRV9FUlJOT19ICiAjaW5jbHVkZSA8ZXJybm8uaD4KICNlbmRpZgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9mcmFtZW9iamVjdC5oIGIvSW5jbHVkZS9mcmFtZW9iamVjdC5oCmluZGV4IGNjZTU5OGIuLjc5NGY2NTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZnJhbWVvYmplY3QuaAorKysgYi9JbmNsdWRlL2ZyYW1lb2JqZWN0LmgKQEAgLTQxLDggKzQxLDYgQEAKICAgICAvKiBBcyBvZiAyLjMgZl9saW5lbm8gaXMgb25seSB2YWxpZCB3aGVuIHRyYWNpbmcgaXMgYWN0aXZlIChpLmUuIHdoZW4KICAgICAgICBmX3RyYWNlIGlzIHNldCkgLS0gYXQgb3RoZXIgdGltZXMgdXNlIFB5Q29kZV9BZGRyMkxpbmUgaW5zdGVhZC4gKi8KICAgICBpbnQgZl9saW5lbm87CQkvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCi0gICAgaW50IGZfcmVzdHJpY3RlZDsJCS8qIEZsYWcgc2V0IGlmIHJlc3RyaWN0ZWQgb3BlcmF0aW9ucwotCQkJCSAgIGluIHRoaXMgc2NvcGUgKi8KICAgICBpbnQgZl9pYmxvY2s7CQkvKiBpbmRleCBpbiBmX2Jsb2Nrc3RhY2sgKi8KICAgICBQeVRyeUJsb2NrIGZfYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAvKiBmb3IgdHJ5IGFuZCBsb29wIGJsb2NrcyAqLwogICAgIFB5T2JqZWN0ICpmX2xvY2Fsc3BsdXNbMV07CS8qIGxvY2FscytzdGFjaywgZHluYW1pY2FsbHkgc2l6ZWQgKi8KQEAgLTU0LDYgKzUyLDggQEAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZyYW1lX1R5cGU7CiAKICNkZWZpbmUgUHlGcmFtZV9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5RnJhbWVfVHlwZSkKKyNkZWZpbmUgUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoZikgXAorCSgoZiktPmZfYnVpbHRpbnMgIT0gKGYpLT5mX3RzdGF0ZS0+aW50ZXJwLT5idWlsdGlucykKIAogUHlBUElfRlVOQyhQeUZyYW1lT2JqZWN0ICopIFB5RnJhbWVfTmV3KFB5VGhyZWFkU3RhdGUgKiwgUHlDb2RlT2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHllcnJvcnMuaCBiL0luY2x1ZGUvcHllcnJvcnMuaAppbmRleCA2MDA2YWM3Li41ZGYzMzRiIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXJyb3JzLmgKKysrIGIvSW5jbHVkZS9weWVycm9ycy5oCkBAIC0yMTgsMTAgKzIxOCwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlPYmplY3QgKik7CiAKIC8qIElzc3VlIGEgd2FybmluZyBvciBleGNlcHRpb24gKi8KLVB5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuKFB5T2JqZWN0ICosIGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqbXNnLAorCQkJICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKTsKIFB5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuRXhwbGljaXQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLAogCQkJCSAgIGNvbnN0IGNoYXIgKiwgaW50LCAKIAkJCQkgICBjb25zdCBjaGFyICosIFB5T2JqZWN0ICopOworLyogUHlFcnJfV2FybiBpcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBhbmQgd2lsbCBiZSByZW1vdmVkLgorICAgVXNlIFB5RXJyX1dhcm5FeCBpbnN0ZWFkLiAqLworI2RlZmluZSBQeUVycl9XYXJuKGNhdGVnb3J5LCBtc2cpIFB5RXJyX1dhcm5FeChjYXRlZ29yeSwgbXNnLCAxKQogCiAvKiBJbiBzaWdjaGVjay5jIG9yIHNpZ25hbG1vZHVsZS5jICovCiBQeUFQSV9GVU5DKGludCkgUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWV4cGF0LmggYi9JbmNsdWRlL3B5ZXhwYXQuaAppbmRleCA1MGVkNDlmLi4xZTc5ZjRlIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXhwYXQuaAorKysgYi9JbmNsdWRlL3B5ZXhwYXQuaApAQCAtMTYsOCArMTYsOCBAQAogICAgICAgIHRoZSBlbmQsIGlmIG5lZWRlZCAqLwogICAgIGNvbnN0IFhNTF9MQ2hhciAqICgqRXJyb3JTdHJpbmcpKGVudW0gWE1MX0Vycm9yIGNvZGUpOwogICAgIGVudW0gWE1MX0Vycm9yICgqR2V0RXJyb3JDb2RlKShYTUxfUGFyc2VyIHBhcnNlcik7Ci0gICAgaW50ICgqR2V0RXJyb3JDb2x1bW5OdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKLSAgICBpbnQgKCpHZXRFcnJvckxpbmVOdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKKyAgICBYTUxfU2l6ZSAoKkdldEVycm9yQ29sdW1uTnVtYmVyKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgWE1MX1NpemUgKCpHZXRFcnJvckxpbmVOdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKICAgICBlbnVtIFhNTF9TdGF0dXMgKCpQYXJzZSkoCiAgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CiAgICAgWE1MX1BhcnNlciAoKlBhcnNlckNyZWF0ZV9NTSkoCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5cG9ydC5oIGIvSW5jbHVkZS9weXBvcnQuaAppbmRleCA0N2I5ZjcwLi5iZTZjNTFmIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5cG9ydC5oCisrKyBiL0luY2x1ZGUvcHlwb3J0LmgKQEAgLTI0MCwxMCArMjQwLDEwIEBACiAgKiB0byB5b3VyIHB5Y29uZmlnLmguIFB5dGhvbiBjb2RlIGJleW9uZCB0aGlzIHNob3VsZCBjaGVjayBIQVZFX1NUQVQgYW5kCiAgKiBIQVZFX0ZTVEFUIGluc3RlYWQuCiAgKiBBbHNvCi0gKiAgICAgICNkZWZpbmUgRE9OVF9IQVZFX1NZU19TVEFUX0gKLSAqIGlmIDxzeXMvc3RhdC5oPiBkb2Vzbid0IGV4aXN0IG9uIHlvdXIgcGxhdGZvcm0sIGFuZAorICogICAgICAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSAorICogaWYgPHN5cy9zdGF0Lmg+IGV4aXN0cyBvbiB5b3VyIHBsYXRmb3JtLCBhbmQKICAqICAgICAgI2RlZmluZSBIQVZFX1NUQVRfSAotICogaWYgPHN0YXQuaD4gZG9lcyAoZG9uJ3QgbG9vayBhdCBtZSAtLSB0aHMgbWVzcyBpcyBpbmhlcml0ZWQpLgorICogaWYgPHN0YXQuaD4gZG9lcy4KICAqLwogI2lmbmRlZiBET05UX0hBVkVfU1RBVAogI2RlZmluZSBIQVZFX1NUQVQKQEAgLTI1OCw3ICsyNTgsNyBAQAogI2luY2x1ZGUgInVuaXhzdHVmZi5oIgogI2VuZGlmCiAKLSNpZm5kZWYgRE9OVF9IQVZFX1NZU19TVEFUX0gKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5c3RhdGUuaCBiL0luY2x1ZGUvcHlzdGF0ZS5oCmluZGV4IGJmZDM1NDguLmNmMjk2OTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlzdGF0ZS5oCisrKyBiL0luY2x1ZGUvcHlzdGF0ZS5oCkBAIC0xNzEsNiArMTcxLDExIEBACiAqLwogUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKHZvaWQpOwogCisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3lzLl9jdXJyZW50X2ZyYW1lcygpICBSZXR1cm5zIGEgZGljdCBtYXBwaW5nCisgICB0aHJlYWQgaWQgdG8gdGhhdCB0aHJlYWQncyBjdXJyZW50IGZyYW1lLgorKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXModm9pZCk7CisKIC8qIFJvdXRpbmVzIGZvciBhZHZhbmNlZCBkZWJ1Z2dlcnMsIHJlcXVlc3RlZCBieSBEYXZpZCBCZWF6bGV5LgogICAgRG9uJ3QgdXNlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchICovCiBQeUFQSV9GVU5DKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKSBQeUludGVycHJldGVyU3RhdGVfSGVhZCh2b2lkKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aHJlYWQuaCBiL0luY2x1ZGUvcHl0aHJlYWQuaAppbmRleCAwZmE4ZGIwLi5mMjZkYjE2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhyZWFkLmgKKysrIGIvSW5jbHVkZS9weXRocmVhZC5oCkBAIC0yNSw2ICsyNSw5IEBACiAjZGVmaW5lIE5PV0FJVF9MT0NLCTAKIFB5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayk7CiAKK1B5QVBJX0ZVTkMoc2l6ZV90KSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX3NldF9zdGFja3NpemUoc2l6ZV90KTsKKwogI2lmbmRlZiBOT19FWElUX1BST0cKIFB5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfZXhpdF9wcm9nKGludCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX19QeVRocmVhZF9leGl0X3Byb2coaW50KTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2V0b2JqZWN0LmggYi9JbmNsdWRlL3NldG9iamVjdC5oCmluZGV4IGNjOTM5NjguLmExNmMyZjcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2V0b2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zZXRvYmplY3QuaApAQCAtMzUsMTQgKzM1LDE0IEBACiBzdHJ1Y3QgX3NldG9iamVjdCB7CiAJUHlPYmplY3RfSEVBRAogCi0JaW50IGZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlpbnQgdXNlZDsgIC8qICMgQWN0aXZlICovCisJUHlfc3NpemVfdCBmaWxsOyAgLyogIyBBY3RpdmUgKyAjIER1bW15ICovCisJUHlfc3NpemVfdCB1c2VkOyAgLyogIyBBY3RpdmUgKi8KIAogCS8qIFRoZSB0YWJsZSBjb250YWlucyBtYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCiAJICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKIAkgKiBmcmVxdWVudGx5IG5lZWRlZC4KIAkgKi8KLQlpbnQgbWFzazsKKwlQeV9zc2l6ZV90IG1hc2s7CiAKIAkvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCiAJICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmggYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAppbmRleCAzMTc3MDUxLi5jN2UwN2E4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAorKysgYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaApAQCAtOTM4LDYgKzkzOCwxMyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBNQkNTIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKwogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc01CQ1NTdHJpbmcoCiAgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvd2Vha3JlZm9iamVjdC5oIGIvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKaW5kZXggZGFmNDkwZi4uMGE2NTliMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKKysrIGIvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjayk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5V2Vha3JlZl9HZXRPYmplY3QoUHlPYmplY3QgKnJlZik7CiAKLVB5QVBJX0ZVTkMobG9uZykgX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKTsKIAogUHlBUElfRlVOQyh2b2lkKSBfUHlXZWFrcmVmX0NsZWFyUmVmKFB5V2Vha1JlZmVyZW5jZSAqc2VsZik7CiAKZGlmZiAtLWdpdCBhL0xpYi9RdWV1ZS5weSBiL0xpYi9RdWV1ZS5weQppbmRleCA1MWFkMzU0Li4wZjgwNTg0IDEwMDY0NAotLS0gYS9MaWIvUXVldWUucHkKKysrIGIvTGliL1F1ZXVlLnB5CkBAIC0xNCwxMSArMTQsMTEgQEAKICAgICBwYXNzCiAKIGNsYXNzIFF1ZXVlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgotICAgICAgICAiIiJJbml0aWFsaXplIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCisgICAgIiIiQ3JlYXRlIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCiAKLSAgICAgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KLSAgICAgICAgIiIiCisgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0wKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZwogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvU2ltcGxlSFRUUFNlcnZlci5weSBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CmluZGV4IDA4OTkzNmYuLmZhZTU1MWEgMTAwNjQ0Ci0tLSBhL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CisrKyBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CkBAIC0xOTIsNiArMTkyLDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwWycnXQogCisgICAgaWYgbm90IG1pbWV0eXBlcy5pbml0ZWQ6CisgICAgICAgIG1pbWV0eXBlcy5pbml0KCkgIyB0cnkgdG8gcmVhZCBzeXN0ZW0gbWltZS50eXBlcwogICAgIGV4dGVuc2lvbnNfbWFwID0gbWltZXR5cGVzLnR5cGVzX21hcC5jb3B5KCkKICAgICBleHRlbnNpb25zX21hcC51cGRhdGUoewogICAgICAgICAnJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICMgRGVmYXVsdApkaWZmIC0tZ2l0IGEvTGliL1VzZXJTdHJpbmcucHkgYi9MaWIvVXNlclN0cmluZy5weQppbmRleCA0NzNlZTg4Li42MGRjMzRiIDEwMDc1NQotLS0gYS9MaWIvVXNlclN0cmluZy5weQorKysgYi9MaWIvVXNlclN0cmluZy5weQpAQCAtNSwxNCArNSwxMyBAQAogTm90ZTogc3RyaW5nIG9iamVjdHMgaGF2ZSBncm93biBtZXRob2RzIGluIFB5dGhvbiAxLjYKIFRoaXMgbW9kdWxlIHJlcXVpcmVzIFB5dGhvbiAxLjYgb3IgbGF0ZXIuCiAiIiIKLWZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGVzCiBpbXBvcnQgc3lzCiAKIF9fYWxsX18gPSBbIlVzZXJTdHJpbmciLCJNdXRhYmxlU3RyaW5nIl0KIAogY2xhc3MgVXNlclN0cmluZzoKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZXEsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxLmRhdGFbOl0KQEAgLTQzLDEyICs0MiwxMiBAQAogICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIuZGF0YSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgc3RyKG90aGVyKSkKICAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKG90aGVyICsgc2VsZi5kYXRhKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHN0cihvdGhlcikgKyBzZWxmLmRhdGEpCkBAIC0xNjMsNyArMTYyLDcgQEAKICAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQogICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIuZGF0YStzZWxmLmRhdGFbZW5kOl0KLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YiwgU3RyaW5nVHlwZXMpOgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3ViLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1YitzZWxmLmRhdGFbZW5kOl0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICBzZWxmLmRhdGFbOnN0YXJ0XStzdHIoc3ViKStzZWxmLmRhdGFbZW5kOl0KQEAgLTE3NSw3ICsxNzQsNyBAQAogICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyLmRhdGEKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSArPSBzdHIob3RoZXIpCmRpZmYgLS1naXQgYS9MaWIvX01vemlsbGFDb29raWVKYXIucHkgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKaW5kZXggMTc3NmI5My4uNGZkNmRlMyAxMDA2NDQKLS0tIGEvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CisrKyBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtNjMsOCArNjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIlxuIik6IGxpbmUgPSBsaW5lWzotMV0KIAogICAgICAgICAgICAgICAgICMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgWFhYIHdoYXQgaXMgJCBmb3I/Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIjIikgb3IKLSAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoIiQiKSBvcgorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgoIiMiLCAiJCIpKSBvcgogICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkgPT0gIiIpOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogCmRpZmYgLS1naXQgYS9MaWIvYmluaGV4LnB5IGIvTGliL2JpbmhleC5weQppbmRleCA0ZjM4ODJhLi4wZjNlM2M0IDEwMDY0NAotLS0gYS9MaWIvYmluaGV4LnB5CisrKyBiL0xpYi9iaW5oZXgucHkKQEAgLTQ0LDIyICs0NCwxNCBAQAogCiAjCiAjIFdvcmthcm91bmRzIGZvciBub24tbWFjIG1hY2hpbmVzLgotaWYgb3MubmFtZSA9PSAnbWFjJzoKLSAgICBpbXBvcnQgbWFjZnMKLSAgICBpbXBvcnQgTWFjT1MKLSAgICB0cnk6Ci0gICAgICAgIG9wZW5yZiA9IE1hY09TLm9wZW5yZgotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIG9wZW5yZiA9IG9wZW4KLQotICAgIGRlZiBGSW5mbygpOgotICAgICAgICByZXR1cm4gbWFjZnMuRkluZm8oKQordHJ5OgorICAgIGZyb20gQ2FyYm9uLkZpbGUgaW1wb3J0IEZTU3BlYywgRkluZm8KKyAgICBmcm9tIE1hY09TIGltcG9ydCBvcGVucmYKIAogICAgIGRlZiBnZXRmaWxlaW5mbyhuYW1lKToKLSAgICAgICAgZmluZm8gPSBtYWNmcy5GU1NwZWMobmFtZSkuR2V0RkluZm8oKQorICAgICAgICBmaW5mbyA9IEZTU3BlYyhuYW1lKS5GU3BHZXRGSW5mbygpCiAgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQobmFtZSkKLSAgICAgICAgIyBYWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCisgICAgICAgICMgWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCiAgICAgICAgIGZwID0gb3BlbihuYW1lLCAncmInKQogICAgICAgICBmcC5zZWVrKDAsIDIpCiAgICAgICAgIGRsZW4gPSBmcC50ZWxsKCkKQEAgLTc1LDcgKzY3LDcgQEAKICAgICAgICAgICAgIG1vZGUgPSAnKicgKyBtb2RlWzBdCiAgICAgICAgIHJldHVybiBvcGVucmYobmFtZSwgbW9kZSkKIAotZWxzZToKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjCiAgICAgIyBHbHVlIGNvZGUgZm9yIG5vbi1tYWNpbnRvc2ggdXNhZ2UKICAgICAjCkBAIC0xODMsNyArMTc1LDcgQEAKICAgICAgICAgICAgIG9mbmFtZSA9IG9mcAogICAgICAgICAgICAgb2ZwID0gb3BlbihvZm5hbWUsICd3JykKICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgICAgICAgICAgZnNzID0gbWFjZnMuRlNTcGVjKG9mbmFtZSkKKyAgICAgICAgICAgICAgICBmc3MgPSBGU1NwZWMob2ZuYW1lKQogICAgICAgICAgICAgICAgIGZzcy5TZXRDcmVhdG9yVHlwZSgnQm5IcScsICdURVhUJykKICAgICAgICAgb2ZwLndyaXRlKCcoVGhpcyBmaWxlIG11c3QgYmUgY29udmVydGVkIHdpdGggQmluSGV4IDQuMClcblxuOicpCiAgICAgICAgIGhxeGVyID0gX0hxeGNvZGVyZW5naW5lKG9mcCkKQEAgLTQ4Niw3ICs0NzgsNyBAQAogICAgIGlmIG5vdCBvdXQ6CiAgICAgICAgIG91dCA9IGlmcC5GTmFtZQogICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgIG9mc3MgPSBtYWNmcy5GU1NwZWMob3V0KQorICAgICAgICBvZnNzID0gRlNTcGVjKG91dCkKICAgICAgICAgb3V0ID0gb2Zzcy5hc19wYXRobmFtZSgpCiAKICAgICBvZnAgPSBvcGVuKG91dCwgJ3diJykKQEAgLTUxOSw2ICs1MTEsNyBAQAogCiBkZWYgX3Rlc3QoKToKICAgICBpZiBvcy5uYW1lID09ICdtYWMnOgorICAgICAgICBpbXBvcnQgbWFjZnMKICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoJ0ZpbGUgdG8gY29udmVydDonKQogICAgICAgICBpZiBub3Qgb2s6CiAgICAgICAgICAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL19faW5pdF9fLnB5IGIvTGliL2JzZGRiL19faW5pdF9fLnB5CmluZGV4IDkwZWQzNjIuLmNmMzI2NjggMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9fX2luaXRfXy5weQorKysgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKQEAgLTMzLDcgKzMzLDEwIEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLSIiIlN1cHBvcnQgZm9yIEJlcmtlbGV5REIgMy4yIHRocm91Z2ggNC4yLgorIiIiU3VwcG9ydCBmb3IgQmVya2VsZXlEQiAzLjMgdGhyb3VnaCA0LjQgd2l0aCBhIHNpbXBsZSBpbnRlcmZhY2UuCisKK0ZvciB0aGUgZnVsbCBmZWF0dXJlZCBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHVzZSB0aGUgYnNkZGIuZGIgbW9kdWxlCitpbnN0ZWFkLiAgSXQgbWlycm9ycyB0aGUgU2xlZXB5Y2F0IEJlcmtlbGV5REIgQyBBUEkuCiAiIiIKIAogdHJ5OgpAQCAtNDMsOCArNDYsMTAgQEAKICAgICAgICAgIyBweXRob24gYXMgYnNkZGIuX2JzZGRiLgogICAgICAgICBpbXBvcnQgX3B5YnNkZGIKICAgICAgICAgX2JzZGRiID0gX3B5YnNkZGIKKyAgICAgICAgZnJvbSBic2RkYjMuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKICAgICBlbHNlOgogICAgICAgICBpbXBvcnQgX2JzZGRiCisgICAgICAgIGZyb20gYnNkZGIuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjIFJlbW92ZSBvdXJzZWx2ZXMgZnJvbSBzeXMubW9kdWxlcwogICAgIGltcG9ydCBzeXMKQEAgLTcwLDcgKzc1LDcgQEAKICAgICBleGVjICIiIgogY2xhc3MgX2l0ZXJfbWl4aW4oVXNlckRpY3QuRGljdE1peGluKToKICAgICBkZWYgX21ha2VfaXRlcl9jdXJzb3Ioc2VsZik6Ci0gICAgICAgIGN1ciA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgY3VyID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmN1cnNvcikKICAgICAgICAga2V5ID0gaWQoY3VyKQogICAgICAgICBzZWxmLl9jdXJzb3JfcmVmc1trZXldID0gcmVmKGN1ciwgc2VsZi5fZ2VuX2NyZWZfY2xlYW5lcihrZXkpKQogICAgICAgICByZXR1cm4gY3VyCkBAIC05MCwxOSArOTUsMTkgQEAKIAogICAgICAgICAgICAgIyBzaW5jZSB3ZSdyZSBvbmx5IHJldHVybmluZyBrZXlzLCB3ZSBjYWxsIHRoZSBjdXJzb3IKICAgICAgICAgICAgICMgbWV0aG9kcyB3aXRoIGZsYWdzPTAsIGRsZW49MCwgZG9mcz0wCi0gICAgICAgICAgICBrZXkgPSBjdXIuZmlyc3QoMCwwLDApWzBdCisgICAgICAgICAgICBrZXkgPSBfRGVhZGxvY2tXcmFwKGN1ci5maXJzdCwgMCwwLDApWzBdCiAgICAgICAgICAgICB5aWVsZCBrZXkKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV4dCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAga2V5ID0gX0RlYWRsb2NrV3JhcChuZXh0LCAwLDAsMClbMF0KICAgICAgICAgICAgICAgICAgICAgeWllbGQga2V5CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTE5LDIxICsxMjQsMjEgQEAKICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDItZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCiAKLSAgICAgICAgICAgIGt2ID0gY3VyLmZpcnN0KCkKKyAgICAgICAgICAgIGt2ID0gX0RlYWRsb2NrV3JhcChjdXIuZmlyc3QpCiAgICAgICAgICAgICBrZXkgPSBrdlswXQogICAgICAgICAgICAgeWllbGQga3YKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga3YgPSBuZXh0KCkKKyAgICAgICAgICAgICAgICAgICAga3YgPSBfRGVhZGxvY2tXcmFwKG5leHQpCiAgICAgICAgICAgICAgICAgICAgIGtleSA9IGt2WzBdCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGt2CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTc3LDkgKzE4Miw5IEBACiAKICAgICBkZWYgX2NoZWNrQ3Vyc29yKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmRiYyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5kYmMgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgICAgICBzZWxmLmRiYyA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jdXJzb3IpCiAgICAgICAgICAgICBpZiBzZWxmLnNhdmVkX2RiY19rZXkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5kYmMuc2V0KHNlbGYuc2F2ZWRfZGJjX2tleSkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnNldCwgc2VsZi5zYXZlZF9kYmNfa2V5KQogICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKIAogICAgICMgVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciBhbGwgbm9uLWN1cnNvciBEQiBjYWxscyB0byBhdm9pZApAQCAtMTkyLDE1ICsxOTcsMTUgQEAKICAgICAgICAgICAgIHNlbGYuZGJjID0gTm9uZQogICAgICAgICAgICAgaWYgc2F2ZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IGMuY3VycmVudCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gX0RlYWRsb2NrV3JhcChjLmN1cnJlbnQsIDAsMCwwKVswXQogICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoYy5jbG9zZSkKICAgICAgICAgICAgIGRlbCBjCiAgICAgICAgIGZvciBjcmVmIGluIHNlbGYuX2N1cnNvcl9yZWZzLnZhbHVlcygpOgogICAgICAgICAgICAgYyA9IGNyZWYoKQogICAgICAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGMuY2xvc2UpCiAKICAgICBkZWYgX2NoZWNrT3BlbihzZWxmKToKICAgICAgICAgaWYgc2VsZi5kYiBpcyBOb25lOgpAQCAtMjExLDczICsyMTYsNzcgQEAKIAogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGIpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogbGVuKHNlbGYuZGIpKSAgIyBsZW4oc2VsZi5kYikKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gc2VsZi5kYltrZXldCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogc2VsZi5kYltrZXldKSAgIyBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKCkKLSAgICAgICAgc2VsZi5kYltrZXldID0gdmFsdWUKKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBzZWxmLmRiW2tleV0gPSB2YWx1ZQorICAgICAgICBfRGVhZGxvY2tXcmFwKHdyYXBGKSAgIyBzZWxmLmRiW2tleV0gPSB2YWx1ZQogCiAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2Nsb3NlQ3Vyc29ycygpCi0gICAgICAgIGRlbCBzZWxmLmRiW2tleV0KKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYltrZXldCisgICAgICAgIF9EZWFkbG9ja1dyYXAod3JhcEYpICAjIGRlbCBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKHNhdmU9MCkKICAgICAgICAgaWYgc2VsZi5kYmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmRiYy5jbG9zZSgpCisgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmNsb3NlKQogICAgICAgICB2ID0gMAogICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgdiA9IHNlbGYuZGIuY2xvc2UoKQorICAgICAgICAgICAgdiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jbG9zZSkKICAgICAgICAgc2VsZi5kYmMgPSBOb25lCiAgICAgICAgIHNlbGYuZGIgPSBOb25lCiAgICAgICAgIHJldHVybiB2CiAKICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKLSAgICAgICAgcmV0dXJuIHNlbGYuZGIua2V5cygpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKHNlbGYuZGIua2V5cykKIAogICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLmhhc19rZXkoa2V5KQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmhhc19rZXksIGtleSkKIAogICAgIGRlZiBzZXRfbG9jYXRpb24oc2VsZiwga2V5KToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICByZXR1cm4gc2VsZi5kYmMuc2V0X3JhbmdlKGtleSkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuc2V0X3JhbmdlLCBrZXkpCiAKICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICBydiA9IHNlbGYuZGJjLm5leHQoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMubmV4dCkKICAgICAgICAgcmV0dXJuIHJ2CiAKICAgICBkZWYgcHJldmlvdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5wcmV2KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnByZXYpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGZpcnN0KHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQogICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCi0gICAgICAgIHJ2ID0gc2VsZi5kYmMuZmlyc3QoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuZmlyc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGxhc3Qoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5sYXN0KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmxhc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIHN5bmMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLnN5bmMoKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLnN5bmMpCiAKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NSw1ICszOTQsNCBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGRiLkRCX1RIUkVBRCA9IDAKIAotCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL2RicmVjaW8ucHkgYi9MaWIvYnNkZGIvZGJyZWNpby5weQppbmRleCAyMmUzODJhLi5kNDM5ZjMyIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvZGJyZWNpby5weQorKysgYi9MaWIvYnNkZGIvZGJyZWNpby5weQpAQCAtNzUsNyArNzUsNyBAQAogCiAgICAgICAgIGRsZW4gPSBuZXdwb3MgLSBzZWxmLnBvcwogCi0gICAgICAgIHIgPSBzZWxmLmRiLmdldChrZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQorICAgICAgICByID0gc2VsZi5kYi5nZXQoc2VsZi5rZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogICAgICAgICByZXR1cm4gcgogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWQiKQogICAgICAgICBlbGlmIHNpemUgPCBzZWxmLnBvczoKICAgICAgICAgICAgIHNlbGYucG9zID0gc2l6ZQotICAgICAgICBzZWxmLmRiLnB1dChrZXksICIiLCB0eG49c2VsZi50eG4sIGRsZW49c2VsZi5sZW4tc2l6ZSwgZG9mZj1zaXplKQorICAgICAgICBzZWxmLmRiLnB1dChzZWxmLmtleSwgIiIsIHR4bj1zZWxmLnR4biwgZGxlbj1zZWxmLmxlbi1zaXplLCBkb2ZmPXNpemUpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcMCcqKHNlbGYucG9zIC0gc2VsZi5sZW4pKQogICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcwogICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbihzKQotICAgICAgICBzZWxmLmRiLnB1dChrZXksIHMsIHR4bj1zZWxmLnR4biwgZGxlbj1sZW4ocyksIGRvZmY9c2VsZi5wb3MpCisgICAgICAgIHNlbGYuZGIucHV0KHNlbGYua2V5LCBzLCB0eG49c2VsZi50eG4sIGRsZW49bGVuKHMpLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogCiAgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ0YWJsZXMucHkgYi9MaWIvYnNkZGIvZGJ0YWJsZXMucHkKaW5kZXggMzY5ZGI0My4uNDkyZDVmZCAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL2RidGFibGVzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnRhYmxlcy5weQpAQCAtMzIsNiArMzIsMTIgQEAKICAgICAjIEZvciBQeXRob24gMi4zCiAgICAgZnJvbSBic2RkYi5kYiBpbXBvcnQgKgogCisjIFhYWChubm9yd2l0eik6IGlzIHRoaXMgY29ycmVjdD8gREJJbmNvbXBsZXRlRXJyb3IgaXMgY29uZGl0aW9uYWwgaW4gX2JzZGRiLmMKK3RyeToKKyAgICBEQkluY29tcGxldGVFcnJvcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBjbGFzcyBEQkluY29tcGxldGVFcnJvcihFeGNlcHRpb24pOgorICAgICAgICBwYXNzCiAKIGNsYXNzIFRhYmxlREJFcnJvcihTdGFuZGFyZEVycm9yKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ1dGlscy5weSBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CmluZGV4IDNmNjM4NDIuLjZkY2ZkZDUgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9kYnV0aWxzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CkBAIC0yMiwxNCArMjIsMTQgQEAKIAogIwogIyBpbXBvcnQgdGhlIHRpbWUuc2xlZXAgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2FmZSB3YXkgdG8gYWxsb3cKLSMgImZyb20gYnNkZGIuZGIgaW1wb3J0ICoiCisjICJmcm9tIGJzZGRiLmRidXRpbHMgaW1wb3J0ICoiCiAjCiBmcm9tIHRpbWUgaW1wb3J0IHNsZWVwIGFzIF9zbGVlcAogCiBpbXBvcnQgZGIKIAogIyBhbHdheXMgc2xlZXAgYXQgbGVhc3QgTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCi1fZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzY0CitfZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzEyOAogIyBuZXZlciBzbGVlcCBtb3JlIHRoYW4gTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCiBfZGVhZGxvY2tfTWF4U2xlZXBUaW1lID0gMy4xNDE1OQogCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgbWF4X3JldHJpZXMgPSBfa3dhcmdzLmdldCgnbWF4X3JldHJpZXMnLCAtMSkKICAgICBpZiBfa3dhcmdzLmhhc19rZXkoJ21heF9yZXRyaWVzJyk6CiAgICAgICAgIGRlbCBfa3dhcmdzWydtYXhfcmV0cmllcyddCi0gICAgd2hpbGUgMToKKyAgICB3aGlsZSBUcnVlOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKl9hcmdzLCAqKl9rd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBkYi5EQkxvY2tEZWFkbG9ja0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQppbmRleCBiZWM1ZGEzLi5kNmQ1MDdmIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQpAQCAtNTYyLDYgKzU2Miw5IEBACiAgICAgICAgIG51bSA9IGQudHJ1bmNhdGUoKQogICAgICAgICBhc3NlcnQgbnVtID09IDAsICJ0cnVuY2F0ZSBvbiBlbXB0eSBEQiByZXR1cm5lZCBub256ZXJvICglcikiICUgKG51bSwpCiAKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIApAQCAtNTgzLDE4ICs1ODYsNDAgQEAKICAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAogCiAKLWNsYXNzIEJhc2ljQlRyZWVXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY1dpdGhFbnZUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIHVzZUVudiA9IDEKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW52OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICMgY2FuJ3QgcmVuYW1lIG9yIHJlbW92ZSBhbiBvcGVuIERCCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICAgICAgbmV3bmFtZSA9IHNlbGYuZmlsZW5hbWUgKyAnLnJlbmFtZWQnCisgICAgICAgIHNlbGYuZW52LmRicmVuYW1lKHNlbGYuZmlsZW5hbWUsIE5vbmUsIG5ld25hbWUpCisgICAgICAgIHNlbGYuZW52LmRicmVtb3ZlKG5ld25hbWUpCisKKyAgICAjIGRicmVtb3ZlIGFuZCBkYnJlbmFtZSBhcmUgaW4gNC4xIGFuZCBsYXRlcgorICAgIGlmIGRiLnZlcnNpb24oKSA8ICg0LDEpOgorICAgICAgICBkZWwgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNCVHJlZVdpdGhFbnZUZXN0Q2FzZShCYXNpY1dpdGhFbnZUZXN0Q2FzZSk6CiAgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCi1jbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNXaXRoRW52VGVzdENhc2UpOgogICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weSBiL0xpYi9jb21waWxlci9mdXR1cmUucHkKaW5kZXggMzljM2JiOS4uZmVmMTg5ZSAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weQorKysgYi9MaWIvY29tcGlsZXIvZnV0dXJlLnB5CkBAIC0yMywxNCArMjMsNyBAQAogCiAgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgogICAgICAgICBzdG10ID0gbm9kZS5ub2RlCi0gICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IEZhbHNlCiAgICAgICAgIGZvciBzIGluIHN0bXQubm9kZXM6Ci0gICAgICAgICAgICAjIFNraXAgb3ZlciBkb2NzdHJpbmdzCi0gICAgICAgICAgICBpZiBub3QgZm91bmRfZG9jc3RyaW5nIGFuZCBpc2luc3RhbmNlKHMsIGFzdC5EaXNjYXJkKSBcCi0gICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzLmV4cHIsIGFzdC5Db25zdCkgXAotICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uocy5leHByLnZhbHVlLCBzdHIpOgotICAgICAgICAgICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IFRydWUKLSAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfc3RtdChzKToKICAgICAgICAgICAgICAgICBicmVhawogCmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5IGIvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQppbmRleCBjMDkzMTI4Li5jOGE5Nzc5IDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CisrKyBiL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKQEAgLTM4MCwxNiArMzgwLDcgQEAKICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCiAgICAgICAgIGZvciBkZWZhdWx0IGluIG5vZGUuZGVmYXVsdHM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGRlZmF1bHQpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGZyZWVzOgotICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICAgICAgc2VsZi5lbWl0KCdNQUtFX0ZVTkNUSU9OJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgbGVuKG5vZGUuZGVmYXVsdHMpKQogICAgICAgICBmb3IgaSBpbiByYW5nZShuZGVjb3JhdG9ycyk6CiAgICAgICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQogCkBAIC00MDMsMTQgKzM5NCw3IEBACiAgICAgICAgIGZvciBiYXNlIGluIG5vZGUuYmFzZXM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGJhc2UpCiAgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4obm9kZS5iYXNlcykpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgMCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIDApCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMCkKICAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9DTEFTUycpCiAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKQEAgLTY0MiwyMiArNjI2LDI1IEBACiAgICAgICAgIHNlbGYubmV3QmxvY2soKQogICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQogCisgICAgZGVmIF9tYWtlQ2xvc3VyZShzZWxmLCBnZW4sIGFyZ3MpOgorICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKKyAgICAgICAgaWYgZnJlZXM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1RVUExFJywgbGVuKGZyZWVzKSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIGFyZ3MpCisKICAgICBkZWYgdmlzaXRHZW5FeHByKHNlbGYsIG5vZGUpOgogICAgICAgICBnZW4gPSBHZW5FeHByQ29kZUdlbmVyYXRvcihub2RlLCBzZWxmLnNjb3Blcywgc2VsZi5jbGFzc19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tb2R1bGUoKSkKICAgICAgICAgd2Fsayhub2RlLmNvZGUsIGdlbikKICAgICAgICAgZ2VuLmZpbmlzaCgpCiAgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQotICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKLSAgICAgICAgaWYgZnJlZXM6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfQ0xPU1VSRScsIDApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfRlVOQ1RJT04nLCAwKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgIyBwcmVjb21wdXRhdGlvbiBvZiBvdXRtb3N0IGl0ZXJhYmxlCiAgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLnF1YWxzWzBdLml0ZXIpCiAgICAgICAgIHNlbGYuZW1pdCgnR0VUX0lURVInKQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL3N5bWJvbHMucHkgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQppbmRleCBjNjA4ZjY0Li44ZWI1ZmNlIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvc3ltYm9scy5weQorKysgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgIHNlbGYuYWRkX3BhcmFtKCdbb3V0bW9zdC1pdGVyYWJsZV0nKQogCiAgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKLSAgICAgICAga2V5cyA9IFNjb3BlLmdldF9uYW1lcygpCisgICAgICAgIGtleXMgPSBTY29wZS5nZXRfbmFtZXMoc2VsZikKICAgICAgICAgcmV0dXJuIGtleXMKIAogY2xhc3MgTGFtYmRhU2NvcGUoRnVuY3Rpb25TY29wZSk6CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkgYi9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKaW5kZXggOTZiY2NlMy4uOGQyNTZlZCAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5CisrKyBiL0xpYi9jb21waWxlci90cmFuc2Zvcm1lci5weQpAQCAtNTM2LDEyICs1MzYsNyBAQAogICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKIAogICAgIGRlZiB0cnlfc3RtdChzZWxmLCBub2RlbGlzdCk6Ci0gICAgICAgICMgJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQotICAgICAgICAjIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKLSAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gIT0gc3ltYm9sLmV4Y2VwdF9jbGF1c2U6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fdHJ5X2ZpbmFsbHkobm9kZWxpc3QpCi0KLSAgICAgICAgcmV0dXJuIHNlbGYuY29tX3RyeV9leGNlcHQobm9kZWxpc3QpCisgICAgICAgIHJldHVybiBzZWxmLmNvbV90cnlfZXhjZXB0X2ZpbmFsbHkobm9kZWxpc3QpCiAKICAgICBkZWYgd2l0aF9zdG10KHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3dpdGgobm9kZWxpc3QpCkBAIC03MjksMjIgKzcyNCwyMCBAQAogCiAgICAgZGVmIGF0b20oc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXRvbV9kaXNwYXRjaFtub2RlbGlzdFswXVswXV0obm9kZWxpc3QpCi0gICAgICAgIG4ubGluZW5vID0gbm9kZWxpc3RbMF1bMl0KLSAgICAgICAgcmV0dXJuIG4KIAogICAgIGRlZiBhdG9tX2xwYXIoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SUEFSOgotICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpKQorICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbHNxYihzZWxmLCBub2RlbGlzdCk6CiAgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJTUUI6Ci0gICAgICAgICAgICByZXR1cm4gTGlzdCgoKSkKKyAgICAgICAgICAgIHJldHVybiBMaXN0KCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9saXN0X2NvbnN0cnVjdG9yKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbGJyYWNlKHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uUkJSQUNFOgotICAgICAgICAgICAgcmV0dXJuIERpY3QoKCkpCisgICAgICAgICAgICByZXR1cm4gRGljdCgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQogICAgICAgICByZXR1cm4gc2VsZi5jb21fZGljdG1ha2VyKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fYmFja3F1b3RlKHNlbGYsIG5vZGVsaXN0KToKQEAgLTkxOSwxOCArOTEyLDIxIEBACiAgICAgICAgICAgICBiYXNlcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlW2ldKSkKICAgICAgICAgcmV0dXJuIGJhc2VzCiAKLSAgICBkZWYgY29tX3RyeV9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZmluX3N0bXQ6ICJ0cnkiICI6IiBzdWl0ZSAiZmluYWxseSIgIjoiIHN1aXRlCi0gICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgIGRlZiBjb21fdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAoJ3RyeScgJzonIHN1aXRlCisgICAgICAgICMgICgoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0gWydmaW5hbGx5JyAnOicgc3VpdGVdCisgICAgICAgICMgICB8ICdmaW5hbGx5JyAnOicgc3VpdGUpKQogCi0gICAgZGVmIGNvbV90cnlfZXhjZXB0KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZXhjZXB0OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSogWydlbHNlJyBzdWl0ZV0KKyAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICMgZmlyc3QgY2xhdXNlIGlzIGEgZmluYWxseSBjbGF1c2U6IG9ubHkgdHJ5LWZpbmFsbHkKKyAgICAgICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFs1XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKICAgICAgICAgI3RyeWV4Y2VwdDogIFtUcnlOb2RlLCBbZXhjZXB0X2NsYXVzZXNdLCBlbHNlTm9kZSldCi0gICAgICAgIHN0bXQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQogICAgICAgICBjbGF1c2VzID0gW10KICAgICAgICAgZWxzZU5vZGUgPSBOb25lCisgICAgICAgIGZpbmFsbHlOb2RlID0gTm9uZQogICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBsZW4obm9kZWxpc3QpLCAzKToKICAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSBzeW1ib2wuZXhjZXB0X2NsYXVzZToKQEAgLTk0Niw5ICs5NDIsMTYgQEAKICAgICAgICAgICAgICAgICBjbGF1c2VzLmFwcGVuZCgoZXhwcjEsIGV4cHIyLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMl0pKSkKIAogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5OQU1FOgotICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQotICAgICAgICByZXR1cm4gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgICAgICAgICAgaWYgbm9kZVsxXSA9PSAnZWxzZSc6CisgICAgICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICAgICAgICAgIGVsaWYgbm9kZVsxXSA9PSAnZmluYWxseSc6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHlOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICB0cnlfZXhjZXB0ID0gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGlmIGZpbmFsbHlOb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRyeUZpbmFsbHkodHJ5X2V4Y2VwdCwgZmluYWxseU5vZGUsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB0cnlfZXhjZXB0CiAKICAgICBkZWYgY29tX3dpdGgoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICAjIHdpdGhfc3RtdDogJ3dpdGgnIGV4cHIgW3dpdGhfdmFyXSAnOicgc3VpdGUKQEAgLTExMzgsNyArMTE0MSw3IEBACiAgICAgICAgICAgICB2YWx1ZXMgPSBbXQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGVsaXN0KSwgMik6CiAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkKLSAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcykKKyAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcywgbGluZW5vPXZhbHVlc1swXS5saW5lbm8pCiAKICAgICBpZiBoYXNhdHRyKHN5bWJvbCwgJ2dlbl9mb3InKToKICAgICAgICAgZGVmIGNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbihzZWxmLCBleHByLCBub2RlKToKQEAgLTExODUsNyArMTE4OCw3IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCksIDQpOgogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKSkpCi0gICAgICAgIHJldHVybiBEaWN0KGl0ZW1zKQorICAgICAgICByZXR1cm4gRGljdChpdGVtcywgbGluZW5vPWl0ZW1zWzBdWzBdLmxpbmVubykKIAogICAgIGRlZiBjb21fYXBwbHlfdHJhaWxlcihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgogICAgICAgICB0ID0gbm9kZWxpc3RbMV1bMF0KQEAgLTEzNzksNiArMTM4Miw3IEBACiAgICAgc3ltYm9sLnRlc3RsaXN0LAogICAgIHN5bWJvbC50ZXN0bGlzdF9zYWZlLAogICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5vcl90ZXN0LAogICAgIHN5bWJvbC5hbmRfdGVzdCwKICAgICBzeW1ib2wubm90X3Rlc3QsCiAgICAgc3ltYm9sLmNvbXBhcmlzb24sCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCBmMmRkYmFhLi5hNGUzYzM2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTEsOSArMSwxMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiY3JlYXRlIGFuZCBtYW5pcHVsYXRlIEMgZGF0YSB0eXBlcyBpbiBQeXRob24iIiIKIAogaW1wb3J0IG9zIGFzIF9vcywgc3lzIGFzIF9zeXMKLWZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiBhcyBfY2hhaW4KIAotX192ZXJzaW9uX18gPSAiMC45LjkuNiIKK19fdmVyc2lvbl9fID0gIjEuMC4wIgogCiBmcm9tIF9jdHlwZXMgaW1wb3J0IFVuaW9uLCBTdHJ1Y3R1cmUsIEFycmF5CiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9Qb2ludGVyCkBAIC0yMCw2ICsyMiwyMyBAQAogaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRm9ybWF0RXJyb3IKIAorREVGQVVMVF9NT0RFID0gUlRMRF9MT0NBTAoraWYgX29zLm5hbWUgPT0gInBvc2l4IiBhbmQgX3N5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBpbXBvcnQgZ2VzdGFsdAorCisgICAgIyBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKyAgICAjIGN1cnJlbnRseSBhY3RpdmUgc3lzdGVtIGZpbGUgYXMgQkNELgorICAgICMgT24gT1MgWCAxMC40LjYgLT4gMHgxMDQ2CisgICAgIyBPbiBPUyBYIDEwLjIuOCAtPiAweDEwMjgKKyAgICAjIFNlZSBhbHNvIGh0dHA6Ly93d3cucmdhcm9zLm5sL2dlc3RhbHQvCisgICAgIworICAgICMgT24gT1MgWCAxMC4zLCB3ZSB1c2UgUlRMRF9HTE9CQUwgYXMgZGVmYXVsdCBtb2RlCisgICAgIyBiZWNhdXNlIFJUTERfTE9DQUwgZG9lcyBub3Qgd29yayBhdCBsZWFzdCBvbiBzb21lCisgICAgIyBsaWJyYXJpZXMuCisKKyAgICBpZiBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSA8IDB4MTA0MDoKKyAgICAgICAgREVGQVVMVF9NT0RFID0gUlRMRF9HTE9CQUwKKwogZnJvbSBfY3R5cGVzIGltcG9ydCBGVU5DRkxBR19DREVDTCBhcyBfRlVOQ0ZMQUdfQ0RFQ0wsIFwKICAgICAgRlVOQ0ZMQUdfUFlUSE9OQVBJIGFzIF9GVU5DRkxBR19QWVRIT05BUEkKIApAQCAtNjcsNyArODYsNyBAQAogICAgIHJlc3R5cGU6IHRoZSByZXN1bHQgdHlwZQogICAgIGFyZ3R5cGVzOiBhIHNlcXVlbmNlIHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50IHR5cGVzCiAKLSAgICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSBjYWxsZWQgaW4gdGhyZWUgd2F5cyB0byBjcmVhdGUgYQorICAgIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgY2FuIGJlIGNhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cyB0byBjcmVhdGUgYQogICAgIGNhbGxhYmxlIG9iamVjdDoKIAogICAgIHByb3RvdHlwZShpbnRlZ2VyIGFkZHJlc3MpIC0+IGZvcmVpZ24gZnVuY3Rpb24KQEAgLTExMSw3ICsxMzAsNyBAQAogZWxpZiBfb3MubmFtZSA9PSAicG9zaXgiOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuIGFzIF9kbG9wZW4KIAotZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudAorZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudCwgcmVzaXplCiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQogCiBjbGFzcyBweV9vYmplY3QoX1NpbXBsZUNEYXRhKToKQEAgLTI4Miw3ICszMDEsNyBAQAogICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMCiAgICAgICAgIF9yZXN0eXBlXyA9IGNfaW50ICMgZGVmYXVsdCwgY2FuIGJlIG92ZXJyaWRkZW4gaW4gaW5zdGFuY2VzCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgIGlmIGhhbmRsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gX2Rsb3BlbihzZWxmLl9uYW1lLCBtb2RlKQpAQCAtMjkzLDE4ICszMTIsMTkgQEAKICAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCiAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCiAgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChfc3lzLm1heGludCoyICsgMSkpLAotICAgICAgICAgICAgICAgIGlkKHNlbGYpKQorICAgICAgICAgICAgICAgIGlkKHNlbGYpICYgKF9zeXMubWF4aW50KjIgKyAxKSkKIAogICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBuYW1lLmVuZHN3aXRoKCdfXycpOgogICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgZnVuYyA9IHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICByZXR1cm4gZnVuYwogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCk6CiAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKChuYW1lX29yX29yZGluYWwsIHNlbGYpKQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lX29yX29yZGluYWwsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lX29yX29yZGluYWwKLSAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZV9vcl9vcmRpbmFsLCBmdW5jKQogICAgICAgICByZXR1cm4gZnVuYwogCiBjbGFzcyBQeURMTChDRExMKToKQEAgLTQxOSwxMiArNDM5LDEwIEBACiAgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQotX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKIAorX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQogZGVmIGNhc3Qob2JqLCB0eXApOgotICAgIHJlc3VsdCA9IF9jYXN0KG9iaiwgdHlwKQotICAgIHJlc3VsdC5fX2tlZXByZWYgPSBvYmoKLSAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIF9jYXN0KG9iaiwgb2JqLCB0eXApCiAKIF9zdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKIGRlZiBzdHJpbmdfYXQocHRyLCBzaXplPTApOgpAQCAtNDQ2LDUyICs0NjQsMjEgQEAKICAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKIAogCi1pZiBfb3MubmFtZSA9PSAibnQiOiAjIENPTSBzdHVmZgoraWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOiAjIENPTSBzdHVmZgogICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGZvciB0aGUKLSAgICAgICAgIyBjbGFzcyBvYmplY3QuCi0KLSAgICAgICAgIyB0cmljayBweTJleGUgYnkgZG9pbmcgZHluYW1pYyBpbXBvcnRzCi0gICAgICAgIHJlc3VsdCA9IC0yMTQ3MjIxMjMxICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjdGNvbSA9IF9faW1wb3J0X18oImN0eXBlcy5jb20uc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgICAgICBjY29tID0gX19pbXBvcnRfXygiY29tdHlwZXMuc2VydmVyLmlucHJvY3NlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXR1cm4gLTIxNDcyMjEyMzEgIyBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN1bHQgPSBjdGNvbS5EbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdikKLQotICAgICAgICBpZiByZXN1bHQgPT0gLTIxNDcyMjEyMzE6ICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCiAKICAgICBkZWYgRGxsQ2FuVW5sb2FkTm93KCk6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGlmIHdlIGNhbiB1bmxvYWQgb3Igbm90LgotICAgICAgICAjIHRyaWNrIHB5MmV4ZSBieSBkb2luZyBkeW5hbWljIGltcG9ydHMKLSAgICAgICAgcmVzdWx0ID0gMCAjIFNfT0sKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgY3Rjb20gPSBfX2ltcG9ydF9fKCJjdHlwZXMuY29tLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlci5pbnByb2NzZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVzdWx0ID0gY3Rjb20uRGxsQ2FuVW5sb2FkTm93KCkKLSAgICAgICAgICAgIGlmIHJlc3VsdCAhPSAwOiAjICE9IFNfT0sKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIDAgIyBTX09LCisgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCiAKIGZyb20gY3R5cGVzLl9lbmRpYW4gaW1wb3J0IEJpZ0VuZGlhblN0cnVjdHVyZSwgTGl0dGxlRW5kaWFuU3RydWN0dXJlCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2VuZGlhbi5weSBiL0xpYi9jdHlwZXMvX2VuZGlhbi5weQppbmRleCA1ODE4YWUxLi42ZGUwZDQ3IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19lbmRpYW4ucHkKKysrIGIvTGliL2N0eXBlcy9fZW5kaWFuLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHkKaW5kZXggNTYyMWRlZi4uMzYxNDlkMiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBFbm91Z2ggTWFjaC1PIHRvIG1ha2UgeW91ciBoZWFkIHNwaW4uCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQppbmRleCBhMzM2ZmQwLi4xNGUyMTM5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGQucHkKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxkLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBkeWxkIGVtdWxhdGlvbgogIiIiCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5IGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxpYi5weQppbmRleCBhYTEwNzUwLi5lYTNkZDM4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5CisrKyBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkKQEAgLTEsMyArMSw2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAiIiIKIEdlbmVyaWMgZHlsaWIgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQppbmRleCBhZDZlZDU1Li5kZDdmYjJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpAQCAtMSwzICsxLDYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICIiIgogR2VuZXJpYyBmcmFtZXdvcmsgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMDJjYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKQEAgLTAsMCArMSw2MCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBBbm9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbm9uKHNlbGYpOgorICAgICAgICBjbGFzcyBBTk9OKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8iLCBBTk9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYi5vZmZzZXQsIDApCisKKyAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKKyAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0eXBlKFN0cnVjdHVyZSkoIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cnVjdHVyZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IFtdLCAiX2Fub255bW91c18iOiA0Mn0pKQorCisgICAgZGVmIHRlc3RfYW5vbl9ub25tZW1iZXIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlRXJyb3I6IHR5cGUgb2JqZWN0ICdOYW1lJyBoYXMgbm8gYXR0cmlidXRlICd4JworICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hbm9ueW1vdXNfIjogWyJ4Il19KSkKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQU5PTl9TKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgQU5PTl9VKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIEFOT05fUyksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfIiwgQU5PTl9VKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDgyMWNlM2YuLjA5ZTkyOGYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtMzAsMTcgKzMwLDMyIEBACiAgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzcywgUE9JTlRFUihjX2ludCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKIAorICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIGFycmF5WzBdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQogCi0gICAgZGVmIHRlc3RfcHRyMmFycmF5KHNlbGYpOgotICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKKyAgICAgICAgcCA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19jaGFyX3ApKQorICAgICAgICAjIGFycmF5IGFuZCBwIHNoYXJlIGEgY29tbW9uIF9vYmplY3RzIGF0dHJpYnV0ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIHsnMCc6ICJmb28gYmFyIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHBbMF0gPSAic3BhbSBzcGFtIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLl9vYmplY3RzLCB7JzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQorICAgICAgICBwWzFdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuX29iamVjdHMsIHsnMSc6ICdmb28gYmFyJywgJzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQogCi0gICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudAotCi0gICAgICAgIGJlZm9yZSA9IGdldHJlZmNvdW50KGFycmF5KQotICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0cmVmY291bnQoYXJyYXkpLCBiZWZvcmUgKyAxKQotICAgICAgICBkZWwgcHRyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldHJlZmNvdW50KGFycmF5KSwgYmVmb3JlKQorICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgorICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgY19pbnQoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBwWzJdID0gOTYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIGNfaW50KCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CmluZGV4IDczMThmMjkuLjgwYjZjYTIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC02MSw2ICs2MSw4IEBACiAgICAgICAgIHIudWwueCA9IDIyCiAgICAgICAgIHIudWwueSA9IDQ0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKyAgICAgICAgci5sciA9IFBPSU5UKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5fb2JqZWN0cywgeycwJzoge30sICcxJzoge319KQogCiBjbGFzcyBBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jaW50X2FycmF5KHNlbGYpOgpAQCAtODYsOSArODgsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgeycxJzoge319KQogCiBjbGFzcyBQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBYX3Rlc3RfcF9jaW50KHNlbGYpOgotICAgICAgICB4ID0gcG9pbnRlcihjX2ludCg0MikpCi0gICAgICAgIHByaW50IHguX29iamVjdHMKKyAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CisgICAgICAgIGkgPSBjX2ludCg0MikKKyAgICAgICAgeCA9IHBvaW50ZXIoaSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIFhfdGVzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDQ1NTg1YWUuLjI4YzgzZmQ0IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTksMTggKzksMTAgQEAKICAgICBsaWJjX25hbWUgPSAibXN2Y3J0IgogZWxpZiBvcy5uYW1lID09ICJjZSI6CiAgICAgbGliY19uYW1lID0gImNvcmVkbGwiCi1lbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLSAgICBsaWJjX25hbWUgPSAibGliYy5keWxpYiIKIGVsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgIGxpYmNfbmFtZSA9ICJjeWd3aW4xLmRsbCIKIGVsc2U6Ci0gICAgZm9yIGxpbmUgaW4gb3MucG9wZW4oImxkZCAlcyIgJSBzeXMuZXhlY3V0YWJsZSk6Ci0gICAgICAgIGlmICJsaWJjLnNvIiBpbiBsaW5lOgotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJvcGVuYnNkMyI6Ci0gICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzRdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxpYmNfbmFtZSA9IGxpbmUuc3BsaXQoKVsyXQotICAgICAgICAgICAgYnJlYWsKKyAgICBsaWJjX25hbWUgPSBmaW5kX2xpYnJhcnkoImMiKQogCiBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJwcmludGluZyIpOgogICAgIHByaW50ICJsaWJjX25hbWUgaXMiLCBsaWJjX25hbWUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTIxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CkBAIC0wLDAgKzEsNzAgQEAKK3InJycKK1RoaXMgdGVzdHMgdGhlICdfb2JqZWN0cycgYXR0cmlidXRlIG9mIGN0eXBlcyBpbnN0YW5jZXMuICAnX29iamVjdHMnCitob2xkcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgdGhhdCBtdXN0IGJlIGtlcHQgYWxpdmUgYXMgbG9uZyBhcyB0aGUKK2N0eXBlcyBpbnN0YW5jZSwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1lbW9yeSBidWZmZXIgaXMgdmFsaWQuCisKK1dBUk5JTkc6IFRoZSAnX29iamVjdHMnIGF0dHJpYnV0ZSBpcyBleHBvc2VkIE9OTFkgZm9yIGRlYnVnZ2luZyBjdHlwZXMgaXRzZWxmLAoraXQgTVVTVCBORVZFUiBCRSBNT0RJRklFRCEKKworJ19vYmplY3RzJyBpcyBpbml0aWFsaXplZCB0byBhIGRpY3Rpb25hcnkgb24gZmlyc3QgdXNlLCBiZWZvcmUgdGhhdCBpdAoraXMgTm9uZS4KKworSGVyZSBpcyBhbiBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnM6CisKKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGFycmF5ID0gKGNfY2hhcl9wICogNSkoKQorPj4+IHByaW50IGFycmF5Ll9vYmplY3RzCitOb25lCis+Pj4KKworVGhlIG1lbW9yeSBibG9jayBzdG9yZXMgcG9pbnRlcnMgdG8gc3RyaW5ncywgYW5kIHRoZSBzdHJpbmdzIGl0c2VsZgorYXNzaWduZWQgZnJvbSBQeXRob24gbXVzdCBiZSBrZXB0LgorCis+Pj4gYXJyYXlbNF0gPSAnZm9vIGJhcicKKz4+PiBhcnJheS5fb2JqZWN0cworeyc0JzogJ2ZvbyBiYXInfQorPj4+IGFycmF5WzRdCisnZm9vIGJhcicKKz4+PgorCitJdCBnZXRzIG1vcmUgY29tcGxpY2F0ZWQgd2hlbiB0aGUgY3R5cGVzIGluc3RhbmNlIGl0c2VsZiBpcyBjb250YWluZWQKK2luIGEgJ2Jhc2UnIG9iamVjdC4KKworPj4+IGNsYXNzIFgoU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCksICgiYXJyYXkiLCBjX2NoYXJfcCAqIDUpXQorLi4uCis+Pj4geCA9IFgoKQorPj4+IHByaW50IHguX29iamVjdHMKK05vbmUKKz4+PgorCitUaGUnYXJyYXknIGF0dHJpYnV0ZSBvZiB0aGUgJ3gnIG9iamVjdCBzaGFyZXMgcGFydCBvZiB0aGUgbWVtb3J5IGJ1ZmZlcgorb2YgJ3gnICgnX2JfYmFzZV8nIGlzIGVpdGhlciBOb25lLCBvciB0aGUgcm9vdCBvYmplY3Qgb3duaW5nIHRoZSBtZW1vcnkgYmxvY2spOgorCis+Pj4gcHJpbnQgeC5hcnJheS5fYl9iYXNlXyAjIGRvY3Rlc3Q6ICtFTExJUFNJUworPGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cy5YIG9iamVjdCBhdCAweC4uLj4KKz4+PgorCis+Pj4geC5hcnJheVswXSA9ICdzcGFtIHNwYW0gc3BhbScKKz4+PiB4Ll9vYmplY3RzCit7JzA6Mic6ICdzcGFtIHNwYW0gc3BhbSd9Cis+Pj4geC5hcnJheS5fYl9iYXNlXy5fb2JqZWN0cworeycwOjInOiAnc3BhbSBzcGFtIHNwYW0nfQorPj4+CisKKycnJworCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QsIHN5cworCitpbXBvcnQgY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6CisgICAgICAgICMgUHl0aG9uIDIuMyBoYXMgbm8gRUxMSVBTSVMgZmxhZywgc28gd2UgZG9uJ3QgdGVzdCB3aXRoIHRoaXMKKyAgICAgICAgIyB2ZXJzaW9uOgorICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgc3lzLmhleHZlcnNpb24gPiAweDAyMDQwMDAwOgorICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKaW5kZXggOTUzNzQwMC4uMWI3ZjBkYyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CkBAIC0xNDcsNiArMTQ3LDQxIEBACiAjIyAgICBkZWYgdGVzdF9wZXJmb3JtYW5jZShzZWxmKToKICMjICAgICAgICBjaGVja19wZXJmKCkKIAorICAgIGRlZiB0ZXN0X25vY3R5cGVzX2FyZ3R5cGUoc2VsZik6CisgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IENETEwsIGNfdm9pZF9wLCBBcmd1bWVudEVycm9yCisKKyAgICAgICAgZnVuYyA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgICMgVHlwZUVycm9yOiBoYXMgbm8gZnJvbV9wYXJhbSBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBmdW5jLCAiYXJndHlwZXMiLCAob2JqZWN0LCkpCisKKyAgICAgICAgY2xhc3MgQWRhcHRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKG9iamVjdCgpKSwgTm9uZSkKKworICAgICAgICBjbGFzcyBBZGFwdGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iagorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoQWRhcHRlcigpLCkKKyAgICAgICAgIyBkb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IHBhcmFtZXRlciAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIG9iamVjdCgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKGNfdm9pZF9wKDQyKSksIDQyKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG9iaikKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCisgICAgICAgICMgQXJndW1lbnRFcnJvcjogYXJndW1lbnQgMTogVmFsdWVFcnJvcjogOTkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgOTkpCisKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQppbmRleCBhN2EyODAyLi41ODY2NTVhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtMTU3LDYgKzE1NywyMyBAQAogICAgICAgICBxID0gcG9pbnRlcih5KQogICAgICAgICBwcFswXSA9IHEgICAgICAgICAjIDw9PQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA2KQorICAgIGRlZiB0ZXN0X2Nfdm9pZF9wKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTE1MTgxOTAmZ3JvdXBfaWQ9NTQ3MCZhdGlkPTEwNTQ3MAorICAgICAgICBpZiBzaXplb2YoY192b2lkX3ApID09IDQ6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKyAgICAgICAgZWxpZiBzaXplb2YoY192b2lkX3ApID09IDg6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGTCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfdm9pZF9wLCAzLjE0KSAjIG1ha2Ugc3VyZSBmbG9hdHMgYXJlIE5PVCBhY2NlcHRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfdm9pZF9wLCBvYmplY3QoKSkgIyBub3Igb3RoZXIgb2JqZWN0cwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKaW5kZXggMDhjODExZS4uNTExYzNkMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldHNsaWNlLCBhLCAwLCA1LCByYW5nZSgzMikpCiAKICAgICBkZWYgdGVzdF9jaGFyX3B0cihzZWxmKToKLSAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgorICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogCiAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKQEAgLTUwLDkgKzUwLDMxIEBACiAKICAgICAgICAgZGxsLm15X3N0cmR1cC5yZXN0eXBlID0gUE9JTlRFUihjX2J5dGUpCiAgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyktMV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyldLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCiAgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAorICAgIGRlZiB0ZXN0X2NoYXJfcHRyX3dpdGhfZnJlZShzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisKKyAgICAgICAgY2xhc3MgYWxsb2NhdGVkX2NfY2hhcl9wKGNfY2hhcl9wKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICBkZWYgZXJyY2hlY2socmVzdWx0LCBmdW5jLCBhcmdzKToKKyAgICAgICAgICAgIHJldHZhbCA9IHJlc3VsdC52YWx1ZQorICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IGFsbG9jYXRlZF9jX2NoYXJfcAorICAgICAgICBkbGwubXlfc3RyZHVwLmVycmNoZWNrID0gZXJyY2hlY2sKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sKKworCiAgICAgZGVmIHRlc3RfY2hhcl9hcnJheShzZWxmKToKICAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCA0OWYwNjRiLi44YTQ1MzFkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTEzOCw4ICsxMzgsOCBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnkuc2l6ZSwgc2l6ZW9mKGNfY2hhcikpCiAKICAgICAgICAgIyByZWFkb25seQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQogCiAgICAgICAgIGNsYXNzIFgoVW5pb24pOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLApAQCAtMTUyLDggKzE1Miw4IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgueCwgInNpemUiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCiAKICAgICAgICAgIyBYWFggU2hvdWxkIHdlIGNoZWNrIG5lc3RlZCBkYXRhIHR5cGVzIGFsc28/CiAgICAgICAgICMgb2Zmc2V0IGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY2xhc3MuLi4KQEAgLTI5OCw3ICsyOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIFR5cGVFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCiAKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgiYSIsICJiIiwgImMiKSkKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPHR5cGUgJ2V4Y2VwdGlvbnMuVmFsdWVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBWYWx1ZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBleGNlcHRpb25zLlZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKQEAgLTM3MSw1ICszNzEsMTUgQEAKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKIAorICAgIGRlZiB0ZXN0X25vbmVfdG9fcG9pbnRlcl9maWVsZHMoc2VsZik6CisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicCIsIFBPSU5URVIoY19pbnQpKV0KKworICAgICAgICBzID0gUygpCisgICAgICAgIHMueCA9IDEyMzQ1Njc4CisgICAgICAgIHMucCA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy54LCAxMjM0NTY3OCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkMjMyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5CkBAIC0wLDAgKzEsNTAgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVmFyU2l6ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3Jlc2l6ZShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJpdGVtIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhcnJheSIsIGNfaW50ICogMSldCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4Lml0ZW0gPSA0MgorICAgICAgICB4LmFycmF5WzBdID0gMTAwCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgc2l6ZW9mKGNfaW50KSAqIDIpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIDEwIGFkZGl0aW9uYWwgaXRlbXMKKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogOQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICBkZWYgdGVzdF9hcnJheV9pbnZhbGlkX2xlbmd0aChzZWxmKToKKyAgICAgICAgIyBjYW5ub3QgY3JlYXRlIGFycmF5cyB3aXRoIG5vbi1wb3NpdGl2ZSBzaXplCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTMpCisKKyAgICBkZWYgdGVzdF96ZXJvc2l6ZWRfYXJyYXkoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMCkoKQorICAgICAgICAjIGFjY2Vzc2luZyBlbGVtZW50cyBvZiB6ZXJvLXNpemVkIGFycmF5cyByYWlzZSBJbmRleEVycm9yCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIDEsIE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAtMSwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAtMSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKaW5kZXggODI0N2QzNy4uZGI1MzBkMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKQEAgLTEsNiArMSw3IEBACiAjIFdpbmRvd3Mgc3BlY2lmaWMgdGVzdHMKIAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKIGltcG9ydCB1bml0dGVzdCwgc3lzCiAKIGltcG9ydCBfY3R5cGVzX3Rlc3QKQEAgLTMwLDE1ICszMSwxMCBAQAogICAgICAgICAgICAgIyBvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCBOb25lKQogCi0gICAgICAgIGRlZiB0ZXN0X1NFSChzZWxmKToKLSAgICAgICAgICAgICMgQ2FsbCBmdW5jdGlvbnMgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cywgYW5kIG1ha2Ugc3VyZSB0aGF0IGFjY2VzcyB2aW9sYXRpb25zCi0gICAgICAgICAgICAjIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIE5vcm1hbGx5LCBpbiBhIGRlYnVnIGJ1aWxkIG9mIHRoZSBfY3R5cGVzIGV4dGVuc2lvbgotICAgICAgICAgICAgIyBtb2R1bGUsIGV4Y2VwdGlvbnMgYXJlIG5vdCB0cmFwcGVkLCBzbyB3ZSBjYW4gb25seSBydW4KLSAgICAgICAgICAgICMgdGhpcyB0ZXN0IGluIGEgcmVsZWFzZSBidWlsZC4KLSAgICAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgImdldG9iamVjdHMiKToKKyAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgiU0VIIik6CisgICAgICAgICAgICBkZWYgdGVzdF9TRUgoc2VsZik6CisgICAgICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlIHRoYXQgYWNjZXNzIHZpb2xhdGlvbnMKKyAgICAgICAgICAgICAgICAjIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbiBleGNlcHRpb24uCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSwgMzIpCiAKIGNsYXNzIFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy91dGlsLnB5IGIvTGliL2N0eXBlcy91dGlsLnB5CmluZGV4IGQ3NTZjMWMuLjJlZTI5NjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdXRpbC5weQorKysgYi9MaWIvY3R5cGVzL3V0aWwucHkKQEAgLTEsNSArMSw3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbXBvcnQgc3lzLCBvcwotaW1wb3J0IGN0eXBlcwogCiAjIGZpbmRfbGlicmFyeShuYW1lKSByZXR1cm5zIHRoZSBwYXRobmFtZSBvZiBhIGxpYnJhcnksIG9yIE5vbmUuCiBpZiBvcy5uYW1lID09ICJudCI6CkBAIC00MSwxNCArNDMsMTcgQEAKIAogZWxpZiBvcy5uYW1lID09ICJwb3NpeCI6CiAgICAgIyBBbmRyZWFzIERlZ2VydCdzIGZpbmQgZnVuY3Rpb25zLCB1c2luZyBnY2MsIC9zYmluL2xkY29uZmlnLCBvYmpkdW1wCi0gICAgaW1wb3J0IHJlLCB0ZW1wZmlsZQorICAgIGltcG9ydCByZSwgdGVtcGZpbGUsIGVycm5vCiAKICAgICBkZWYgX2ZpbmRMaWJfZ2NjKG5hbWUpOgogICAgICAgICBleHByID0gJ1teXChcKVxzXSpsaWIlc1wuW15cKFwpXHNdKicgJSBuYW1lCisgICAgICAgIGZkb3V0LCBjY291dCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZG91dCkKICAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjICY+L2Rldi9udWxsOyB0aGVuIENDPWdjYzsgZWxzZSBDQz1jYzsgZmk7JyBcCi0gICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vIC9kZXYvbnVsbCAyPiYxIC1sJyArIG5hbWUKKyAgICAgICAgICAgICAgJyRDQyAtV2wsLXQgLW8gJyArIGNjb3V0ICsgJyAyPiYxIC1sJyArIG5hbWUKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZmRvdXQsIG91dGZpbGUgPSAgdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBvcy5jbG9zZShmZG91dCkKICAgICAgICAgICAgIGZkID0gb3MucG9wZW4oY21kKQogICAgICAgICAgICAgdHJhY2UgPSBmZC5yZWFkKCkKICAgICAgICAgICAgIGVyciA9IGZkLmNsb3NlKCkKQEAgLTU4LDYgKzYzLDExIEBACiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoY2NvdXQpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQogICAgICAgICBpZiBub3QgcmVzOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvd2ludHlwZXMucHkgYi9MaWIvY3R5cGVzL3dpbnR5cGVzLnB5CmluZGV4IDkyYjc5ZDIuLjk3NjgyMzMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvd2ludHlwZXMucHkKKysrIGIvTGliL2N0eXBlcy93aW50eXBlcy5weQpAQCAtMSw2MCArMSwxMTcgQEAKLSMgWFhYIFRoaXMgbW9kdWxlIG5lZWRzIGNsZWFudXAuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKKyMgVGhlIG1vc3QgdXNlZnVsIHdpbmRvd3MgZGF0YXR5cGVzCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1EV09SRCA9IGNfdWxvbmcKLVdPUkQgPSBjX3VzaG9ydAogQllURSA9IGNfYnl0ZQorV09SRCA9IGNfdXNob3J0CitEV09SRCA9IGNfdWxvbmcKKworV0NIQVIgPSBjX3djaGFyCitVSU5UID0gY191aW50CisKK0RPVUJMRSA9IGNfZG91YmxlCisKK0JPT0xFQU4gPSBCWVRFCitCT09MID0gY19sb25nCisKK2Zyb20gY3R5cGVzIGltcG9ydCBfU2ltcGxlQ0RhdGEKK2NsYXNzIFZBUklBTlRfQk9PTChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJ2IgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnZhbHVlKQogCiBVTE9ORyA9IGNfdWxvbmcKIExPTkcgPSBjX2xvbmcKIAotTEFSR0VfSU5URUdFUiA9IGNfbG9uZ2xvbmcKLVVMQVJHRV9JTlRFR0VSID0gY191bG9uZ2xvbmcKKyMgaW4gdGhlIHdpbmRvd3MgaGVhZGVyIGZpbGVzLCB0aGVzZSBhcmUgc3RydWN0dXJlcy4KK19MQVJHRV9JTlRFR0VSID0gTEFSR0VfSU5URUdFUiA9IGNfbG9uZ2xvbmcKK19VTEFSR0VfSU5URUdFUiA9IFVMQVJHRV9JTlRFR0VSID0gY191bG9uZ2xvbmcKIAotCi1IQU5ETEUgPSBjX3Vsb25nICMgaW4gdGhlIGhlYWRlciBmaWxlczogdm9pZCAqCi0KLUhXTkQgPSBIQU5ETEUKLUhEQyA9IEhBTkRMRQotSE1PRFVMRSA9IEhBTkRMRQotSElOU1RBTkNFID0gSEFORExFCi1IUkdOID0gSEFORExFCi1IVEFTSyA9IEhBTkRMRQotSEtFWSA9IEhBTkRMRQotSFBFTiA9IEhBTkRMRQotSEdESU9CSiA9IEhBTkRMRQotSE1FTlUgPSBIQU5ETEUKLQotTENJRCA9IERXT1JECitMUENPTEVTVFIgPSBMUE9MRVNUUiA9IE9MRVNUUiA9IGNfd2NoYXJfcAorTFBDV1NUUiA9IExQV1NUUiA9IGNfd2NoYXJfcAorTFBDU1RSID0gTFBTVFIgPSBjX2NoYXJfcAogCiBXUEFSQU0gPSBjX3VpbnQKIExQQVJBTSA9IGNfbG9uZwogCi1CT09MID0gY19sb25nCi1WQVJJQU5UX0JPT0wgPSBjX3Nob3J0CitBVE9NID0gV09SRAorTEFOR0lEID0gV09SRAogCi1MUENPTEVTVFIgPSBMUE9MRVNUUiA9IE9MRVNUUiA9IGNfd2NoYXJfcAotTFBDV1NUUiA9IExQV1NUUiA9IGNfd2NoYXJfcAorQ09MT1JSRUYgPSBEV09SRAorTEdSUElEID0gRFdPUkQKK0xDVFlQRSA9IERXT1JECiAKLUxQQ1NUUiA9IExQU1RSID0gY19jaGFyX3AKK0xDSUQgPSBEV09SRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEhBTkRMRSB0eXBlcworSEFORExFID0gY191bG9uZyAjIGluIHRoZSBoZWFkZXIgZmlsZXM6IHZvaWQgKgorCitIQUNDRUwgPSBIQU5ETEUKK0hCSVRNQVAgPSBIQU5ETEUKK0hCUlVTSCA9IEhBTkRMRQorSENPTE9SU1BBQ0UgPSBIQU5ETEUKK0hEQyA9IEhBTkRMRQorSERFU0sgPSBIQU5ETEUKK0hEV1AgPSBIQU5ETEUKK0hFTkhNRVRBRklMRSA9IEhBTkRMRQorSEZPTlQgPSBIQU5ETEUKK0hHRElPQkogPSBIQU5ETEUKK0hHTE9CQUwgPSBIQU5ETEUKK0hIT09LID0gSEFORExFCitISUNPTiA9IEhBTkRMRQorSElOU1RBTkNFID0gSEFORExFCitIS0VZID0gSEFORExFCitIS0wgPSBIQU5ETEUKK0hMT0NBTCA9IEhBTkRMRQorSE1FTlUgPSBIQU5ETEUKK0hNRVRBRklMRSA9IEhBTkRMRQorSE1PRFVMRSA9IEhBTkRMRQorSE1PTklUT1IgPSBIQU5ETEUKK0hQQUxFVFRFID0gSEFORExFCitIUEVOID0gSEFORExFCitIUkdOID0gSEFORExFCitIUlNSQyA9IEhBTkRMRQorSFNUUiA9IEhBTkRMRQorSFRBU0sgPSBIQU5ETEUKK0hXSU5TVEEgPSBIQU5ETEUKK0hXTkQgPSBIQU5ETEUKK1NDX0hBTkRMRSA9IEhBTkRMRQorU0VSVklDRV9TVEFUVVNfSEFORExFID0gSEFORExFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU29tZSBpbXBvcnRhbnQgc3RydWN0dXJlIGRlZmluaXRpb25zCiAKIGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKICAgICBfZmllbGRzXyA9IFsoImxlZnQiLCBjX2xvbmcpLAogICAgICAgICAgICAgICAgICgidG9wIiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoInJpZ2h0IiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoImJvdHRvbSIsIGNfbG9uZyldCi1SRUNUTCA9IFJFQ1QKK3RhZ1JFQ1QgPSBfUkVDVEwgPSBSRUNUTCA9IFJFQ1QKKworY2xhc3MgX1NNQUxMX1JFQ1QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoJ0xlZnQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ1RvcCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnUmlnaHQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ0JvdHRvbScsIGNfc2hvcnQpXQorU01BTExfUkVDVCA9IF9TTUFMTF9SRUNUCisKK2NsYXNzIF9DT09SRChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygnWCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnWScsIGNfc2hvcnQpXQogCiBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksCiAgICAgICAgICAgICAgICAgKCJ5IiwgY19sb25nKV0KLVBPSU5UTCA9IFBPSU5UCit0YWdQT0lOVCA9IF9QT0lOVEwgPSBQT0lOVEwgPSBQT0lOVAogCiBjbGFzcyBTSVpFKFN0cnVjdHVyZSk6CiAgICAgX2ZpZWxkc18gPSBbKCJjeCIsIGNfbG9uZyksCiAgICAgICAgICAgICAgICAgKCJjeSIsIGNfbG9uZyldCi1TSVpFTCA9IFNJWkUKK3RhZ1NJWkUgPSBTSVpFTCA9IFNJWkUKIAogZGVmIFJHQihyZWQsIGdyZWVuLCBibHVlKToKICAgICByZXR1cm4gcmVkICsgKGdyZWVuIDw8IDgpICsgKGJsdWUgPDwgMTYpCkBAIC02Miw2ICsxMTksNyBAQAogY2xhc3MgRklMRVRJTUUoU3RydWN0dXJlKToKICAgICBfZmllbGRzXyA9IFsoImR3TG93RGF0ZVRpbWUiLCBEV09SRCksCiAgICAgICAgICAgICAgICAgKCJkd0hpZ2hEYXRlVGltZSIsIERXT1JEKV0KK19GSUxFVElNRSA9IEZJTEVUSU1FCiAKIGNsYXNzIE1TRyhTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygiaFduZCIsIEhXTkQpLApAQCAtNzAsNiArMTI4LDcgQEAKICAgICAgICAgICAgICAgICAoImxQYXJhbSIsIExQQVJBTSksCiAgICAgICAgICAgICAgICAgKCJ0aW1lIiwgRFdPUkQpLAogICAgICAgICAgICAgICAgICgicHQiLCBQT0lOVCldCit0YWdNU0cgPSBNU0cKIE1BWF9QQVRIID0gMjYwCiAKIGNsYXNzIFdJTjMyX0ZJTkRfREFUQUEoU3RydWN0dXJlKToKQEAgLTk1LDMgKzE1NCwxOSBAQAogICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDEiLCBEV09SRCksCiAgICAgICAgICAgICAgICAgKCJjRmlsZU5hbWUiLCBjX3djaGFyICogTUFYX1BBVEgpLAogICAgICAgICAgICAgICAgICgiY0FsdGVybmFtZUZpbGVOYW1lIiwgY193Y2hhciAqIDE0KV0KKworX19hbGxfXyA9IFsnQVRPTScsICdCT09MJywgJ0JPT0xFQU4nLCAnQllURScsICdDT0xPUlJFRicsICdET1VCTEUnLAorICAgICAgICAgICAnRFdPUkQnLCAnRklMRVRJTUUnLCAnSEFDQ0VMJywgJ0hBTkRMRScsICdIQklUTUFQJywgJ0hCUlVTSCcsCisgICAgICAgICAgICdIQ09MT1JTUEFDRScsICdIREMnLCAnSERFU0snLCAnSERXUCcsICdIRU5ITUVUQUZJTEUnLCAnSEZPTlQnLAorICAgICAgICAgICAnSEdESU9CSicsICdIR0xPQkFMJywgJ0hIT09LJywgJ0hJQ09OJywgJ0hJTlNUQU5DRScsICdIS0VZJywKKyAgICAgICAgICAgJ0hLTCcsICdITE9DQUwnLCAnSE1FTlUnLCAnSE1FVEFGSUxFJywgJ0hNT0RVTEUnLCAnSE1PTklUT1InLAorICAgICAgICAgICAnSFBBTEVUVEUnLCAnSFBFTicsICdIUkdOJywgJ0hSU1JDJywgJ0hTVFInLCAnSFRBU0snLCAnSFdJTlNUQScsCisgICAgICAgICAgICdIV05EJywgJ0xBTkdJRCcsICdMQVJHRV9JTlRFR0VSJywgJ0xDSUQnLCAnTENUWVBFJywgJ0xHUlBJRCcsCisgICAgICAgICAgICdMT05HJywgJ0xQQVJBTScsICdMUENPTEVTVFInLCAnTFBDU1RSJywgJ0xQQ1dTVFInLCAnTFBPTEVTVFInLAorICAgICAgICAgICAnTFBTVFInLCAnTFBXU1RSJywgJ01BWF9QQVRIJywgJ01TRycsICdPTEVTVFInLCAnUE9JTlQnLAorICAgICAgICAgICAnUE9JTlRMJywgJ1JFQ1QnLCAnUkVDVEwnLCAnUkdCJywgJ1NDX0hBTkRMRScsCisgICAgICAgICAgICdTRVJWSUNFX1NUQVRVU19IQU5ETEUnLCAnU0laRScsICdTSVpFTCcsICdTTUFMTF9SRUNUJywgJ1VJTlQnLAorICAgICAgICAgICAnVUxBUkdFX0lOVEVHRVInLCAnVUxPTkcnLCAnVkFSSUFOVF9CT09MJywgJ1dDSEFSJywKKyAgICAgICAgICAgJ1dJTjMyX0ZJTkRfREFUQUEnLCAnV0lOMzJfRklORF9EQVRBVycsICdXT1JEJywgJ1dQQVJBTScsICdfQ09PUkQnLAorICAgICAgICAgICAnX0ZJTEVUSU1FJywgJ19MQVJHRV9JTlRFR0VSJywgJ19QT0lOVEwnLCAnX1JFQ1RMJywgJ19TTUFMTF9SRUNUJywKKyAgICAgICAgICAgJ19VTEFSR0VfSU5URUdFUicsICd0YWdNU0cnLCAndGFnUE9JTlQnLCAndGFnUkVDVCcsICd0YWdTSVpFJ10KZGlmZiAtLWdpdCBhL0xpYi9kaWZmbGliLnB5IGIvTGliL2RpZmZsaWIucHkKaW5kZXggNTVmNjliYS4uM2UyOGIxOCAxMDA2NDQKLS0tIGEvTGliL2RpZmZsaWIucHkKKysrIGIvTGliL2RpZmZsaWIucHkKQEAgLTg2LDggKzg2LDcgQEAKICAgICA+Pj4gZm9yIGJsb2NrIGluIHMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpOgogICAgIC4uLiAgICAgcHJpbnQgImFbJWRdIGFuZCBiWyVkXSBtYXRjaCBmb3IgJWQgZWxlbWVudHMiICUgYmxvY2sKICAgICBhWzBdIGFuZCBiWzBdIG1hdGNoIGZvciA4IGVsZW1lbnRzCi0gICAgYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDYgZWxlbWVudHMKLSAgICBhWzE0XSBhbmQgYlsyM10gbWF0Y2ggZm9yIDE1IGVsZW1lbnRzCisgICAgYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDIxIGVsZW1lbnRzCiAgICAgYVsyOV0gYW5kIGJbMzhdIG1hdGNoIGZvciAwIGVsZW1lbnRzCiAKICAgICBOb3RlIHRoYXQgdGhlIGxhc3QgdHVwbGUgcmV0dXJuZWQgYnkgLmdldF9tYXRjaGluZ19ibG9ja3MoKSBpcyBhbHdheXMgYQpAQCAtMTAxLDggKzEwMCw3IEBACiAgICAgLi4uICAgICBwcmludCAiJTZzIGFbJWQ6JWRdIGJbJWQ6JWRdIiAlIG9wY29kZQogICAgICBlcXVhbCBhWzA6OF0gYlswOjhdCiAgICAgaW5zZXJ0IGFbODo4XSBiWzg6MTddCi0gICAgIGVxdWFsIGFbODoxNF0gYlsxNzoyM10KLSAgICAgZXF1YWwgYVsxNDoyOV0gYlsyMzozOF0KKyAgICAgZXF1YWwgYVs4OjI5XSBiWzE3OjM4XQogCiAgICAgU2VlIHRoZSBEaWZmZXIgY2xhc3MgZm9yIGEgZmFuY3kgaHVtYW4tZnJpZW5kbHkgZmlsZSBkaWZmZXJlbmNlciwgd2hpY2gKICAgICB1c2VzIFNlcXVlbmNlTWF0Y2hlciBib3RoIHRvIGNvbXBhcmUgc2VxdWVuY2VzIG9mIGxpbmVzLCBhbmQgdG8gY29tcGFyZQpAQCAtNDYxLDcgKzQ1OSwxMSBAQAogCiAgICAgICAgIEVhY2ggdHJpcGxlIGlzIG9mIHRoZSBmb3JtIChpLCBqLCBuKSwgYW5kIG1lYW5zIHRoYXQKICAgICAgICAgYVtpOmkrbl0gPT0gYltqOmorbl0uICBUaGUgdHJpcGxlcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGluCi0gICAgICAgIGkgYW5kIGluIGouCisgICAgICAgIGkgYW5kIGluIGouICBOZXcgaW4gUHl0aG9uIDIuNSwgaXQncyBhbHNvIGd1YXJhbnRlZWQgdGhhdCBpZgorICAgICAgICAoaSwgaiwgbikgYW5kIChpJywgaicsIG4nKSBhcmUgYWRqYWNlbnQgdHJpcGxlcyBpbiB0aGUgbGlzdCwgYW5kCisgICAgICAgIHRoZSBzZWNvbmQgaXMgbm90IHRoZSBsYXN0IHRyaXBsZSBpbiB0aGUgbGlzdCwgdGhlbiBpK24gIT0gaScgb3IKKyAgICAgICAgaituICE9IGonLiAgSU9XLCBhZGphY2VudCB0cmlwbGVzIG5ldmVyIGRlc2NyaWJlIGFkamFjZW50IGVxdWFsCisgICAgICAgIGJsb2Nrcy4KIAogICAgICAgICBUaGUgbGFzdCB0cmlwbGUgaXMgYSBkdW1teSwgKGxlbihhKSwgbGVuKGIpLCAwKSwgYW5kIGlzIHRoZSBvbmx5CiAgICAgICAgIHRyaXBsZSB3aXRoIG49PTAuCkBAIC00NzUsMjggKzQ3Nyw1MiBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hpbmdfYmxvY2tzCiAgICAgICAgIGxhLCBsYiA9IGxlbihzZWxmLmEpLCBsZW4oc2VsZi5iKQogCi0gICAgICAgIGluZGV4ZWRfYmxvY2tzID0gW10KKyAgICAgICAgIyBUaGlzIGlzIG1vc3QgbmF0dXJhbGx5IGV4cHJlc3NlZCBhcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0sIGJ1dAorICAgICAgICAjIGF0IGxlYXN0IG9uZSB1c2VyIGJ1bXBlZCBpbnRvIGV4dHJlbWUgdXNlIGNhc2VzIHRoYXQgZXhjZWVkZWQKKyAgICAgICAgIyB0aGUgcmVjdXJzaW9uIGxpbWl0IG9uIHRoZWlyIGJveC4gIFNvLCBub3cgd2UgbWFpbnRhaW4gYSBsaXN0CisgICAgICAgICMgKCdxdWV1ZWApIG9mIGJsb2NrcyB3ZSBzdGlsbCBuZWVkIHRvIGxvb2sgYXQsIGFuZCBhcHBlbmQgcGFydGlhbAorICAgICAgICAjIHJlc3VsdHMgdG8gYG1hdGNoaW5nX2Jsb2Nrc2AgaW4gYSBsb29wOyB0aGUgbWF0Y2hlcyBhcmUgc29ydGVkCisgICAgICAgICMgYXQgdGhlIGVuZC4KICAgICAgICAgcXVldWUgPSBbKDAsIGxhLCAwLCBsYildCisgICAgICAgIG1hdGNoaW5nX2Jsb2NrcyA9IFtdCiAgICAgICAgIHdoaWxlIHF1ZXVlOgotICAgICAgICAgICAgIyBidWlsZHMgbGlzdCBvZiBtYXRjaGluZyBibG9ja3MgY292ZXJpbmcgYVthbG86YWhpXSBhbmQKLSAgICAgICAgICAgICMgYltibG86YmhpXSwgYXBwZW5kaW5nIHRoZW0gaW4gaW5jcmVhc2luZyBvcmRlciB0byBhbnN3ZXIKICAgICAgICAgICAgIGFsbywgYWhpLCBibG8sIGJoaSA9IHF1ZXVlLnBvcCgpCi0KKyAgICAgICAgICAgIGksIGosIGsgPSB4ID0gc2VsZi5maW5kX2xvbmdlc3RfbWF0Y2goYWxvLCBhaGksIGJsbywgYmhpKQogICAgICAgICAgICAgIyBhW2FsbzppXSB2cyBiW2JsbzpqXSB1bmtub3duCiAgICAgICAgICAgICAjIGFbaTppK2tdIHNhbWUgYXMgYltqOmora10KICAgICAgICAgICAgICMgYVtpK2s6YWhpXSB2cyBiW2orazpiaGldIHVua25vd24KLSAgICAgICAgICAgIGksIGosIGsgPSB4ID0gc2VsZi5maW5kX2xvbmdlc3RfbWF0Y2goYWxvLCBhaGksIGJsbywgYmhpKQotCi0gICAgICAgICAgICBpZiBrOgorICAgICAgICAgICAgaWYgazogICAjIGlmIGsgaXMgMCwgdGhlcmUgd2FzIG5vIG1hdGNoaW5nIGJsb2NrCisgICAgICAgICAgICAgICAgbWF0Y2hpbmdfYmxvY2tzLmFwcGVuZCh4KQogICAgICAgICAgICAgICAgIGlmIGFsbyA8IGkgYW5kIGJsbyA8IGo6CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoYWxvLCBpLCBibG8sIGopKQotICAgICAgICAgICAgICAgIGluZGV4ZWRfYmxvY2tzLmFwcGVuZCgoaSwgeCkpCiAgICAgICAgICAgICAgICAgaWYgaStrIDwgYWhpIGFuZCBqK2sgPCBiaGk6CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoaStrLCBhaGksIGoraywgYmhpKSkKLSAgICAgICAgaW5kZXhlZF9ibG9ja3Muc29ydCgpCisgICAgICAgIG1hdGNoaW5nX2Jsb2Nrcy5zb3J0KCkKIAotICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IFtlbGVtWzFdIGZvciBlbGVtIGluIGluZGV4ZWRfYmxvY2tzXQotICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2Nrcy5hcHBlbmQoIChsYSwgbGIsIDApICkKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhZGphY2VudCBlcXVhbCBibG9ja3MgaW4gdGhlCisgICAgICAgICMgbWF0Y2hpbmdfYmxvY2tzIGxpc3Qgbm93LiAgU3RhcnRpbmcgd2l0aCAyLjUsIHRoaXMgY29kZSB3YXMgYWRkZWQKKyAgICAgICAgIyB0byBjb2xsYXBzZSB0aGVtLgorICAgICAgICBpMSA9IGoxID0gazEgPSAwCisgICAgICAgIG5vbl9hZGphY2VudCA9IFtdCisgICAgICAgIGZvciBpMiwgajIsIGsyIGluIG1hdGNoaW5nX2Jsb2NrczoKKyAgICAgICAgICAgICMgSXMgdGhpcyBibG9jayBhZGphY2VudCB0byBpMSwgajEsIGsxPworICAgICAgICAgICAgaWYgaTEgKyBrMSA9PSBpMiBhbmQgajEgKyBrMSA9PSBqMjoKKyAgICAgICAgICAgICAgICAjIFllcywgc28gY29sbGFwc2UgdGhlbSAtLSB0aGlzIGp1c3QgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICAgICAgICAjIHRoZSBmaXJzdCBibG9jayBieSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQsIGFuZCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAjIGJsb2NrIHNvIGxlbmd0aGVuZWQgcmVtYWlucyB0aGUgYmxvY2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICAgICAgICAgIGsxICs9IGsyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm90IGFkamFjZW50LiAgUmVtZW1iZXIgdGhlIGZpcnN0IGJsb2NrIChrMT09MCBtZWFucyBpdCdzCisgICAgICAgICAgICAgICAgIyB0aGUgZHVtbXkgd2Ugc3RhcnRlZCB3aXRoKSwgYW5kIG1ha2UgdGhlIHNlY29uZCBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAjIG5ldyBibG9jayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAgICAgICAgaWYgazE6CisgICAgICAgICAgICAgICAgICAgIG5vbl9hZGphY2VudC5hcHBlbmQoKGkxLCBqMSwgazEpKQorICAgICAgICAgICAgICAgIGkxLCBqMSwgazEgPSBpMiwgajIsIGsyCisgICAgICAgIGlmIGsxOgorICAgICAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCgoaTEsIGoxLCBrMSkpCisKKyAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCggKGxhLCBsYiwgMCkgKQorICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IG5vbl9hZGphY2VudAogICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGluZ19ibG9ja3MKIAogICAgIGRlZiBnZXRfb3Bjb2RlcyhzZWxmKToKQEAgLTE0MjIsOCArMTQ0OCw3IEBACiAgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nIC09IDEKICAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9saW5lKGxpbmVzLCctJywwKSwgTm9uZSwgVHJ1ZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLS0/KycpIG9yIHMuc3RhcnRzd2l0aCgnLS0rJykgb3IgXAotICAgICAgICAgICAgICAgICBzLnN0YXJ0c3dpdGgoJy0gJyk6CisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgoJy0tPysnLCAnLS0rJywgJy0gJykpOgogICAgICAgICAgICAgICAgICMgaW4gZGVsZXRlIGJsb2NrIGFuZCBzZWUgYSBpbnRyYWxpbmUgY2hhbmdlIG9yIHVuY2hhbmdlZCBsaW5lCiAgICAgICAgICAgICAgICAgIyBjb21pbmc6IHlpZWxkIHRoZSBkZWxldGUgbGluZSBhbmQgdGhlbiBibGFua3MKICAgICAgICAgICAgICAgICBmcm9tX2xpbmUsdG9fbGluZSA9IF9tYWtlX2xpbmUobGluZXMsJy0nLDApLCBOb25lCkBAIC0xNDQ3LDcgKzE0NzIsNyBAQAogICAgICAgICAgICAgICAgIG51bV9ibGFua3NfcGVuZGluZyArPSAxCiAgICAgICAgICAgICAgICAgeWllbGQgTm9uZSwgX21ha2VfbGluZShsaW5lcywnKycsMSksIFRydWUKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJysgJykgb3Igcy5zdGFydHN3aXRoKCcrLScpOgorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoKCcrICcsICcrLScpKToKICAgICAgICAgICAgICAgICAjIHdpbGwgYmUgbGVhdmluZyBhbiBhZGQgYmxvY2s6IHlpZWxkIGJsYW5rcyB0aGVuIGFkZCBsaW5lCiAgICAgICAgICAgICAgICAgZnJvbV9saW5lLCB0b19saW5lID0gTm9uZSwgX21ha2VfbGluZShsaW5lcywnKycsMSkKICAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3RvX3lpZWxkLG51bV9ibGFua3NfcGVuZGluZyA9IG51bV9ibGFua3NfcGVuZGluZysxLDAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkgYi9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5CmluZGV4IGExZGJiNGIuLjljNjBlNTQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weQpAQCAtMTIsNCArMTIsNiBAQAogCiBfX3JldmlzaW9uX18gPSAiJElkJCIKIAotX192ZXJzaW9uX18gPSAiMi40LjAiCitpbXBvcnQgc3lzCitfX3ZlcnNpb25fXyA9ICIlZC4lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzozXQorZGVsIHN5cwpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKaW5kZXggNzM4ZTNmNy4uNWIwOTk2NSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5CkBAIC00NjcsNyArNDY3LDggQEAKIAogICAgICAgICAjIHJwbSBzY3JpcHRzCiAgICAgICAgICMgZmlndXJlIG91dCBkZWZhdWx0IGJ1aWxkIHNjcmlwdAotICAgICAgICBkZWZfYnVpbGQgPSAiJXMgc2V0dXAucHkgYnVpbGQiICUgc2VsZi5weXRob24KKyAgICAgICAgZGVmX3NldHVwX2NhbGwgPSAiJXMgJXMiICUgKHNlbGYucHl0aG9uLG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pKQorICAgICAgICBkZWZfYnVpbGQgPSAiJXMgYnVpbGQiICUgZGVmX3NldHVwX2NhbGwKICAgICAgICAgaWYgc2VsZi51c2VfcnBtX29wdF9mbGFnczoKICAgICAgICAgICAgIGRlZl9idWlsZCA9ICdlbnYgQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgJyArIGRlZl9idWlsZAogCkBAIC00ODEsOSArNDgyLDkgQEAKICAgICAgICAgICAgICgncHJlcCcsICdwcmVwX3NjcmlwdCcsICIlc2V0dXAiKSwKICAgICAgICAgICAgICgnYnVpbGQnLCAnYnVpbGRfc2NyaXB0JywgZGVmX2J1aWxkKSwKICAgICAgICAgICAgICgnaW5zdGFsbCcsICdpbnN0YWxsX3NjcmlwdCcsCi0gICAgICAgICAgICAgKCIlcyBzZXR1cC5weSBpbnN0YWxsICIKKyAgICAgICAgICAgICAoIiVzIGluc3RhbGwgIgogICAgICAgICAgICAgICAiLS1yb290PSRSUE1fQlVJTERfUk9PVCAiCi0gICAgICAgICAgICAgICItLXJlY29yZD1JTlNUQUxMRURfRklMRVMiKSAlIHNlbGYucHl0aG9uKSwKKyAgICAgICAgICAgICAgIi0tcmVjb3JkPUlOU1RBTExFRF9GSUxFUyIpICUgZGVmX3NldHVwX2NhbGwpLAogICAgICAgICAgICAgKCdjbGVhbicsICdjbGVhbl9zY3JpcHQnLCAicm0gLXJmICRSUE1fQlVJTERfUk9PVCIpLAogICAgICAgICAgICAgKCd2ZXJpZnlzY3JpcHQnLCAndmVyaWZ5X3NjcmlwdCcsIE5vbmUpLAogICAgICAgICAgICAgKCdwcmUnLCAncHJlX2luc3RhbGwnLCBOb25lKSwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CmluZGV4IDRhOWVkMzkuLjY3YmEwODAgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICAgICAgICBodHRwLmVuZGhlYWRlcnMoKQogICAgICAgICAgICAgaHR0cC5zZW5kKGJvZHkpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmFubm91bmNlKGUubXNnLCBsb2cuRVJST1IpCisgICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgciA9IGh0dHAuZ2V0cmVzcG9uc2UoKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQppbmRleCBkMjRkMGFjLi4wZDcyODM3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQpAQCAtMTMxLDggKzEzMSwxMCBAQAogICAgICAgICAgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtTREtEaXIiLCBuZXQsICJzZGtpbnN0YWxscm9vdCIpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXhjOiAjCiAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCi0gICAgICAgICAgICAgICAgICAoIlRoZSAuTkVUIEZyYW1ld29yayBTREsgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSAiCi0gICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIGV4dGVuc2lvbnMgZm9yIFB5dGhvbi4iKQorICAgICAgICAgICAgICAgICAgKCIiIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDM7CitleHRlbnNpb25zIG11c3QgYmUgYnVpbHQgd2l0aCBhIGNvbXBpbGVyIHRoYW4gY2FuIGdlbmVyYXRlIGNvbXBhdGlibGUgYmluYXJpZXMuCitWaXN1YWwgU3R1ZGlvIDIwMDMgd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHN5c3RlbS4gSWYgeW91IGhhdmUgQ3lnd2luIGluc3RhbGxlZCwKK3lvdSBjYW4gdHJ5IGNvbXBpbGluZyB3aXRoIE1pbmdXMzIsIGJ5IHBhc3NpbmcgIi1jIG1pbmd3MzIiIHRvIHNldHVwLnB5LiIiIikKIAogICAgICAgICBwID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcTkVUIEZyYW1ld29yayBTZXR1cFxQcm9kdWN0IgogICAgICAgICBmb3IgYmFzZSBpbiBIS0VZUzoKQEAgLTIzNyw3ICsyMzksNyBAQAogCiAgICAgZGVmIGluaXRpYWxpemUoc2VsZik6CiAgICAgICAgIHNlbGYuX19wYXRocyA9IFtdCi0gICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiTVNTZGsiKSBhbmQgc2VsZi5maW5kX2V4ZSgiY2wuZXhlIik6CisgICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgiRElTVFVUSUxTX1VTRV9TREsiKSBhbmQgb3MuZW52aXJvbi5oYXNfa2V5KCJNU1NkayIpIGFuZCBzZWxmLmZpbmRfZXhlKCJjbC5leGUiKToKICAgICAgICAgICAgICMgQXNzdW1lIHRoYXQgdGhlIFNESyBzZXQgdXAgZXZlcnl0aGluZyBhbHJpZ2h0OyBkb24ndCB0cnkgdG8gYmUKICAgICAgICAgICAgICMgc21hcnRlcgogICAgICAgICAgICAgc2VsZi5jYyA9ICJjbC5leGUiCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IGUxMzk3YTEuLjc2ZmUyNTYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC01MTIsNyArNTEyLDcgQEAKICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJyk6CiAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2tleV0KICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWlzeXNyb290IFteIFx0XSogJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzW2tleV0gPSBmbGFncwogCiAgICAgaWYgYXJnczoKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQppbmRleCAzMjQ4MTlkLi42Y2QxNGY3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CkBAIC03OCw3ICs3OCw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGluZGV4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1pc3lzcm9vdCcpCiAgICAgICAgICAgICAjIFN0cmlwIHRoaXMgYXJndW1lbnQgYW5kIHRoZSBuZXh0IG9uZToKLSAgICAgICAgICAgIGRlbCBjb21waWxlcl9zb1tpbmRleDppbmRleCsxXQorICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzJdCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDQ3YjNhYWUuLmZlNzM0YjMgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC05NSw3ICs5NSw3IEBACiAKIGltcG9ydCBfX2Z1dHVyZV9fCiAKLWltcG9ydCBzeXMsIHRyYWNlYmFjaywgaW5zcGVjdCwgbGluZWNhY2hlLCBvcywgcmUsIHR5cGVzCitpbXBvcnQgc3lzLCB0cmFjZWJhY2ssIGluc3BlY3QsIGxpbmVjYWNoZSwgb3MsIHJlCiBpbXBvcnQgdW5pdHRlc3QsIGRpZmZsaWIsIHBkYiwgdGVtcGZpbGUKIGltcG9ydCB3YXJuaW5ncwogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KQEAgLTgyMSw2ICs4MjEsMTEgQEAKICAgICAgICAgIyBSZWN1cnNpdmVseSBleHBvcmUgYG9iamAsIGV4dHJhY3RpbmcgRG9jVGVzdHMuCiAgICAgICAgIHRlc3RzID0gW10KICAgICAgICAgc2VsZi5fZmluZCh0ZXN0cywgb2JqLCBuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywgZ2xvYnMsIHt9KQorICAgICAgICAjIFNvcnQgdGhlIHRlc3RzIGJ5IGFscGhhIG9yZGVyIG9mIG5hbWVzLCBmb3IgY29uc2lzdGVuY3kgaW4KKyAgICAgICAgIyB2ZXJib3NlLW1vZGUgb3V0cHV0LiAgVGhpcyB3YXMgYSBmZWF0dXJlIG9mIGRvY3Rlc3QgaW4gUHl0aG9ucworICAgICAgICAjIDw9IDIuMyB0aGF0IGdvdCBsb3N0IGJ5IGFjY2lkZW50IGluIDIuNC4gIEl0IHdhcyByZXBhaXJlZCBpbgorICAgICAgICAjIDIuNC40IGFuZCAyLjUuCisgICAgICAgIHRlc3RzLnNvcnQoKQogICAgICAgICByZXR1cm4gdGVzdHMKIAogICAgIGRlZiBfZnJvbV9tb2R1bGUoc2VsZiwgbW9kdWxlLCBvYmplY3QpOgpkaWZmIC0tZ2l0IGEvTGliL2R1bW15X3RocmVhZC5weSBiL0xpYi9kdW1teV90aHJlYWQucHkKaW5kZXggMjFmZDAzZi4uYTcyYzkyNyAxMDA2NDQKLS0tIGEvTGliL2R1bW15X3RocmVhZC5weQorKysgYi9MaWIvZHVtbXlfdGhyZWFkLnB5CkBAIC0yMCw2ICsyMCw3IEBACiAgICAgICAgICAgICdpbnRlcnJ1cHRfbWFpbicsICdMb2NrVHlwZSddCiAKIGltcG9ydCB0cmFjZWJhY2sgYXMgX3RyYWNlYmFjaworaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIGVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLmVycm9yLiIiIgpAQCAtNzUsNiArNzYsMTIgQEAKICAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuYWxsb2NhdGVfbG9jaygpLiIiIgogICAgIHJldHVybiBMb2NrVHlwZSgpCiAKK2RlZiBzdGFja19zaXplKHNpemU9Tm9uZSk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLnN0YWNrX3NpemUoKS4iIiIKKyAgICBpZiBzaXplIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBlcnJvcigic2V0dGluZyB0aHJlYWQgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIikKKyAgICByZXR1cm4gMAorCiBjbGFzcyBMb2NrVHlwZShvYmplY3QpOgogICAgICIiIkNsYXNzIGltcGxlbWVudGluZyBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuTG9ja1R5cGUuCiAKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQppbmRleCBmMDEyNjBmLi44ZDIzMGZkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX19pbml0X18ucHkKKysrIGIvTGliL2VtYWlsL19faW5pdF9fLnB5CkBAIC00LDcgKzQsNyBAQAogCiAiIiJBIHBhY2thZ2UgZm9yIHBhcnNpbmcsIGhhbmRsaW5nLCBhbmQgZ2VuZXJhdGluZyBlbWFpbCBtZXNzYWdlcy4iIiIKIAotX192ZXJzaW9uX18gPSAnNC4wYTInCitfX3ZlcnNpb25fXyA9ICc0LjAuMScKIAogX19hbGxfXyA9IFsKICAgICAjIE9sZCBuYW1lcwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21lc3NhZ2UucHkgYi9MaWIvZW1haWwvbWVzc2FnZS5weQppbmRleCA1MGQ5MGI0Li43OWM1YzRjIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvbWVzc2FnZS5weQorKysgYi9MaWIvZW1haWwvbWVzc2FnZS5weQpAQCAtNzQ3LDcgKzc0NywxOCBAQAogICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIHR1cGxlKToKICAgICAgICAgICAgICMgUkZDIDIyMzEgZW5jb2RlZCwgc28gZGVjb2RlIGl0LCBhbmQgaXQgYmV0dGVyIGVuZCB1cCBhcyBhc2NpaS4KICAgICAgICAgICAgIHBjaGFyc2V0ID0gY2hhcnNldFswXSBvciAndXMtYXNjaWknCi0gICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0WzJdLCBwY2hhcnNldCkuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBMb29rdXBFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2hhcnNldCBpc24ndCBrbm93biB0bworICAgICAgICAgICAgICAgICMgUHl0aG9uLiAgVW5pY29kZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBlbmNvZGVkIHRleHQKKyAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgY2hhcmFjdGVyIG5vdCBpbiB0aGUgY2hhcnNldC4KKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0WzJdLCBwY2hhcnNldCkuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgICAgICBleGNlcHQgKExvb2t1cEVycm9yLCBVbmljb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0WzJdCisgICAgICAgICMgY2hhcnNldCBjaGFyYWN0ZXIgbXVzdCBiZSBpbiB1cy1hc2NpaSByYW5nZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0LCAndXMtYXNjaWknKS5lbmNvZGUoJ3VzLWFzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCiAgICAgICAgICMgUkZDIDIwNDYsICQ0LjEuMiBzYXlzIGNoYXJzZXRzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUKICAgICAgICAgcmV0dXJuIGNoYXJzZXQubG93ZXIoKQogCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQppbmRleCBhMTk3YTM2Li4xMzgwMWRjIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKQEAgLTMwMDUsMjYgKzMwMDUsNjcgQEAKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdOQU1FJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUsICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJhbSwKKyAgICAgICAgICAgICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWUoc2VsZik6CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWVfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjA9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CiBcdGZpbGVuYW1lKjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKIFx0ZmlsZW5hbWUqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzIGl0IG5vdC5wZGYnKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2JvdW5kYXJ5KHNlbGYpOgogICAgICAgICBtID0gJycnXAogQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Ci1cdGJvdW5kYXJ5KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKLVx0Ym91bmRhcnkqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCkBAIC0zMDM2LDggKzMwNzcsOCBAQAogICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Ci1cdGNoYXJzZXQqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOwotXHRjaGFyc2V0KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgogCiAnJycKQEAgLTMwNDUsMTUgKzMwODYsMTQ1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJib2d1cyd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9Ym9ndXMnJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFzY2lpJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImFzY2lpJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjIqPSJpcyBpdCBub3QucGRmJUUyIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKwogICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKICAgICAgICAgbSA9ICIiIlwKIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKLUNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqMD1YLVVOS05PV04nJ215ZmlsZS50eHQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAogCiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19leHRlbmRlZF92YWx1ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZT1cIkZyYW5rJ3MgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCduYW1lJyksICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZW5jb2RlZF90aGVuX3VuZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3VuZW5jb2RlZF90aGVuX2VuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxKj1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCiAKIAwKIGRlZiBfdGVzdGNsYXNzZXMoKToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQppbmRleCA5NWQwNmNiLi4zMGYzOWI5IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0zMDExLDI2ICszMDExLDY3IEBACiAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnTkFNRScpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBOb25lLCAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCdOQU1FJykKKyAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyYW0sCisgICAgICAgICAgICAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBtID0gJycnXAogQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lX2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOwogXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CiBcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCiAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpcyBpdCBub3QucGRmJykKIAogICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9ib3VuZGFyeShzZWxmKToKICAgICAgICAgbSA9ICcnJ1wKIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOwotXHRib3VuZGFyeSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7Ci1cdGJvdW5kYXJ5KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGJvdW5kYXJ5KjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Ym91bmRhcnkqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGJvdW5kYXJ5KjI9ImlzIGl0IG5vdC5wZGYiCiAKICcnJwpAQCAtMzA0Miw4ICszMDgzLDggQEAKICAgICAgICAgIyBUaGlzIGlzIGEgbm9uc2Vuc2ljYWwgY2hhcnNldCB2YWx1ZSwgYnV0IHRlc3RzIHRoZSBjb2RlIGFueXdheQogICAgICAgICBtID0gJycnXAogQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOwotXHRjaGFyc2V0KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKLVx0Y2hhcnNldCoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRjaGFyc2V0KjAqPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGNoYXJzZXQqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CiBcdGNoYXJzZXQqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCkBAIC0zMDUxLDE1ICszMDkyLDE0NSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKIAorICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYm9ndXMneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWJvZ3VzJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hc2NpaScndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJhc2NpaSd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyKj0iaXMgaXQgbm90LnBkZiVFMiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZlx1ZmZmZCcpCisKICAgICBkZWYgdGVzdF9yZmMyMjMxX3Vua25vd25fZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIG0gPSAiIiJcCiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0Ci1Db250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKjA9WC1VTktOT1dOJydteWZpbGUudHh0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKj1YLVVOS05PV04nJ215ZmlsZS50eHQKIAogIiIiCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKIAorICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cIkZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsIE5vbmUpCisgICAgICAgIGVxKGxhbmd1YWdlLCBOb25lKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3NpbmdsZV90aWNrX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZSowPVwiRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2tfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287IG5hbWU9XCJGcmFuaydzIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnbmFtZScpLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2VuY29kZWRfdGhlbl91bmVuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMT1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV91bmVuY29kZWRfdGhlbl9lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMSo9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKwogCiAMCiBkZWYgX3Rlc3RjbGFzc2VzKCk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdXRpbHMucHkgYi9MaWIvZW1haWwvdXRpbHMucHkKaW5kZXggMjUwZWIxOS4uMjZlYmIwZSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3V0aWxzLnB5CisrKyBiL0xpYi9lbWFpbC91dGlscy5weQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGJhc2U2NAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHNvY2tldAoraW1wb3J0IHVybGxpYgogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIApAQCAtNDUsNiArNDYsNyBAQAogRU1QVFlTVFJJTkcgPSAnJwogVUVNUFRZU1RSSU5HID0gdScnCiBDUkxGID0gJ1xyXG4nCitUSUNLID0gIiciCiAKIHNwZWNpYWxzcmUgPSByZS5jb21waWxlKHInW11bXFwoKTw+QCw6OyIuXScpCiBlc2NhcGVzcmUgPSByZS5jb21waWxlKHInW11bXFwoKSJdJykKQEAgLTIzMCwxMiArMjMyLDE0IEBACiAjIFJGQzIyMzEtcmVsYXRlZCBmdW5jdGlvbnMgLSBwYXJhbWV0ZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nCiBkZWYgZGVjb2RlX3JmYzIyMzEocyk6CiAgICAgIiIiRGVjb2RlIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDIDIyMzEiIiIKLSAgICBpbXBvcnQgdXJsbGliCi0gICAgcGFydHMgPSBzLnNwbGl0KCInIiwgMikKLSAgICBpZiBsZW4ocGFydHMpID09IDE6Ci0gICAgICAgIHJldHVybiBOb25lLCBOb25lLCB1cmxsaWIudW5xdW90ZShzKQotICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gcGFydHMKLSAgICByZXR1cm4gY2hhcnNldCwgbGFuZ3VhZ2UsIHVybGxpYi51bnF1b3RlKHMpCisgICAgcGFydHMgPSBzLnNwbGl0KFRJQ0ssIDIpCisgICAgaWYgbGVuKHBhcnRzKSA8PSAyOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgcworICAgIGlmIGxlbihwYXJ0cykgPiAzOgorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSA9IHBhcnRzWzoyXQorICAgICAgICBzID0gVElDSy5qb2luKHBhcnRzWzI6XSkKKyAgICAgICAgcmV0dXJuIGNoYXJzZXQsIGxhbmd1YWdlLCBzCisgICAgcmV0dXJuIHBhcnRzCiAKIAogZGVmIGVuY29kZV9yZmMyMjMxKHMsIGNoYXJzZXQ9Tm9uZSwgbGFuZ3VhZ2U9Tm9uZSk6CkBAIC0yNTksMzcgKzI2Myw1NCBAQAogZGVmIGRlY29kZV9wYXJhbXMocGFyYW1zKToKICAgICAiIiJEZWNvZGUgcGFyYW1ldGVycyBsaXN0IGFjY29yZGluZyB0byBSRkMgMjIzMS4KIAotICAgIHBhcmFtcyBpcyBhIHNlcXVlbmNlIG9mIDItdHVwbGVzIGNvbnRhaW5pbmcgKGNvbnRlbnQgdHlwZSwgc3RyaW5nIHZhbHVlKS4KKyAgICBwYXJhbXMgaXMgYSBzZXF1ZW5jZSBvZiAyLXR1cGxlcyBjb250YWluaW5nIChwYXJhbSBuYW1lLCBzdHJpbmcgdmFsdWUpLgogICAgICIiIgorICAgICMgQ29weSBwYXJhbXMgc28gd2UgZG9uJ3QgbWVzcyB3aXRoIHRoZSBvcmlnaW5hbAorICAgIHBhcmFtcyA9IHBhcmFtc1s6XQogICAgIG5ld19wYXJhbXMgPSBbXQotICAgICMgbWFwcyBwYXJhbWV0ZXIncyBuYW1lIHRvIGEgbGlzdCBvZiBjb250aW51YXRpb25zCisgICAgIyBNYXAgcGFyYW1ldGVyJ3MgbmFtZSB0byBhIGxpc3Qgb2YgY29udGludWF0aW9ucy4gIFRoZSB2YWx1ZXMgYXJlIGEKKyAgICAjIDMtdHVwbGUgb2YgdGhlIGNvbnRpbnVhdGlvbiBudW1iZXIsIHRoZSBzdHJpbmcgdmFsdWUsIGFuZCBhIGZsYWcKKyAgICAjIHNwZWNpZnlpbmcgd2hldGhlciBhIHBhcnRpY3VsYXIgc2VnbWVudCBpcyAlLWVuY29kZWQuCiAgICAgcmZjMjIzMV9wYXJhbXMgPSB7fQotICAgICMgcGFyYW1zIGlzIGEgc2VxdWVuY2Ugb2YgMi10dXBsZXMgY29udGFpbmluZyAoY29udGVudF90eXBlLCBzdHJpbmcgdmFsdWUpCi0gICAgbmFtZSwgdmFsdWUgPSBwYXJhbXNbMF0KKyAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtcy5wb3AoMCkKICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsdWUpKQotICAgICMgQ3ljbGUgdGhyb3VnaCBlYWNoIG9mIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLgotICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBwYXJhbXNbMTpdOgorICAgIHdoaWxlIHBhcmFtczoKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBwYXJhbXMucG9wKDApCisgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJyonKToKKyAgICAgICAgICAgIGVuY29kZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVkID0gRmFsc2UKICAgICAgICAgdmFsdWUgPSB1bnF1b3RlKHZhbHVlKQogICAgICAgICBtbyA9IHJmYzIyMzFfY29udGludWF0aW9uLm1hdGNoKG5hbWUpCiAgICAgICAgIGlmIG1vOgogICAgICAgICAgICAgbmFtZSwgbnVtID0gbW8uZ3JvdXAoJ25hbWUnLCAnbnVtJykKICAgICAgICAgICAgIGlmIG51bSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBudW0gPSBpbnQobnVtKQotICAgICAgICAgICAgcmZjMjIzMV9wYXJhbTEgPSByZmMyMjMxX3BhcmFtcy5zZXRkZWZhdWx0KG5hbWUsIFtdKQotICAgICAgICAgICAgcmZjMjIzMV9wYXJhbTEuYXBwZW5kKChudW0sIHZhbHVlKSkKKyAgICAgICAgICAgIHJmYzIyMzFfcGFyYW1zLnNldGRlZmF1bHQobmFtZSwgW10pLmFwcGVuZCgobnVtLCB2YWx1ZSwgZW5jb2RlZCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgcXVvdGUodmFsdWUpKSkKICAgICBpZiByZmMyMjMxX3BhcmFtczoKICAgICAgICAgZm9yIG5hbWUsIGNvbnRpbnVhdGlvbnMgaW4gcmZjMjIzMV9wYXJhbXMuaXRlbXMoKToKICAgICAgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgICAgIGV4dGVuZGVkID0gRmFsc2UKICAgICAgICAgICAgICMgU29ydCBieSBudW1iZXIKICAgICAgICAgICAgIGNvbnRpbnVhdGlvbnMuc29ydCgpCi0gICAgICAgICAgICAjIEFuZCBub3cgYXBwZW5kIGFsbCB2YWx1ZXMgaW4gbnVtIG9yZGVyCi0gICAgICAgICAgICBmb3IgbnVtLCBjb250aW51YXRpb24gaW4gY29udGludWF0aW9uczoKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY29udGludWF0aW9uKQotICAgICAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHZhbHVlID0gZGVjb2RlX3JmYzIyMzEoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCi0gICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSBxdW90ZSh2YWx1ZSkpKSkKKyAgICAgICAgICAgICMgQW5kIG5vdyBhcHBlbmQgYWxsIHZhbHVlcyBpbiBudW1lcmljYWwgb3JkZXIsIGNvbnZlcnRpbmcKKyAgICAgICAgICAgICMgJS1lbmNvZGluZ3MgZm9yIHRoZSBlbmNvZGVkIHNlZ21lbnRzLiAgSWYgYW55IG9mIHRoZQorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbmFtZXMgZW5kcyBpbiBhICosIHRoZW4gdGhlIGVudGlyZSBzdHJpbmcsIGFmdGVyCisgICAgICAgICAgICAjIGRlY29kaW5nIHNlZ21lbnRzIGFuZCBjb25jYXRlbmF0aW5nLCBtdXN0IGhhdmUgdGhlIGNoYXJzZXQgYW5kCisgICAgICAgICAgICAjIGxhbmd1YWdlIHNwZWNpZmllcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgZm9yIG51bSwgcywgZW5jb2RlZCBpbiBjb250aW51YXRpb25zOgorICAgICAgICAgICAgICAgIGlmIGVuY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSB1cmxsaWIudW5xdW90ZShzKQorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQocykKKyAgICAgICAgICAgIHZhbHVlID0gcXVvdGUoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCisgICAgICAgICAgICBpZiBleHRlbmRlZDoKKyAgICAgICAgICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUgPSBkZWNvZGVfcmZjMjIzMSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSB2YWx1ZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgdmFsdWUpKQogICAgIHJldHVybiBuZXdfcGFyYW1zCiAKIGRlZiBjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKHZhbHVlLCBlcnJvcnM9J3JlcGxhY2UnLApkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9tYmNzLnB5IGIvTGliL2VuY29kaW5ncy9tYmNzLnB5CmluZGV4IGZmNzdmZGUuLmJhZjQ2Y2IgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvbWJjcy5weQorKysgYi9MaWIvZW5jb2RpbmdzL21iY3MucHkKQEAgLTcsNDIgKzcsMzkgQEAKIChjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCiAKICIiIgorIyBJbXBvcnQgdGhlbSBleHBsaWNpdGx5IHRvIGNhdXNlIGFuIEltcG9ydEVycm9yCisjIG9uIG5vbi1XaW5kb3dzIHN5c3RlbXMKK2Zyb20gY29kZWNzIGltcG9ydCBtYmNzX2VuY29kZSwgbWJjc19kZWNvZGUKKyMgZm9yIEluY3JlbWVudGFsRGVjb2RlciwgSW5jcmVtZW50YWxFbmNvZGVyLCAuLi4KIGltcG9ydCBjb2RlY3MKIAogIyMjIENvZGVjIEFQSXMKIAotY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKK2VuY29kZSA9IG1iY3NfZW5jb2RlCiAKLSAgICAjIE5vdGU6IEJpbmRpbmcgdGhlc2UgYXMgQyBmdW5jdGlvbnMgd2lsbCByZXN1bHQgaW4gdGhlIGNsYXNzIG5vdAotICAgICMgY29udmVydGluZyB0aGVtIHRvIG1ldGhvZHMuIFRoaXMgaXMgaW50ZW5kZWQuCi0gICAgZW5jb2RlID0gY29kZWNzLm1iY3NfZW5jb2RlCi0gICAgZGVjb2RlID0gY29kZWNzLm1iY3NfZGVjb2RlCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBtYmNzX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQogCiBjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLm1iY3NfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQorICAgICAgICByZXR1cm4gbWJjc19lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLm1iY3NfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIHBhc3MKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gbWJjc19kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIHBhc3MKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBtYmNzX2VuY29kZQogCi1jbGFzcyBTdHJlYW1Db252ZXJ0ZXIoU3RyZWFtV3JpdGVyLFN0cmVhbVJlYWRlcik6Ci0KLSAgICBlbmNvZGUgPSBjb2RlY3MubWJjc19kZWNvZGUKLSAgICBkZWNvZGUgPSBjb2RlY3MubWJjc19lbmNvZGUKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBtYmNzX2RlY29kZQogCiAjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKIAogZGVmIGdldHJlZ2VudHJ5KCk6CiAgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCiAgICAgICAgIG5hbWU9J21iY3MnLAotICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAotICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAogICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAogICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLApkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9wdW55Y29kZS5weSBiL0xpYi9lbmNvZGluZ3MvcHVueWNvZGUucHkKaW5kZXggMmNkZThiOS4uZDk3MjAwZiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9wdW55Y29kZS5weQorKysgYi9MaWIvZW5jb2RpbmdzL3B1bnljb2RlLnB5CkBAIC0yMTQsOSArMjE0LDkgQEAKIAogY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgogICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKLSAgICAgICAgaWYgZXJyb3JzIG5vdCBpbiAoJ3N0cmljdCcsICdyZXBsYWNlJywgJ2lnbm9yZScpOgotICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMKLSAgICAgICAgcmV0dXJuIHB1bnljb2RlX2RlY29kZShpbnB1dCwgZXJyb3JzKQorICAgICAgICBpZiBzZWxmLmVycm9ycyBub3QgaW4gKCdzdHJpY3QnLCAncmVwbGFjZScsICdpZ25vcmUnKToKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrc2VsZi5lcnJvcnMKKyAgICAgICAgcmV0dXJuIHB1bnljb2RlX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpCiAKIGNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3V0Zl84X3NpZy5weSBiL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CmluZGV4IGNkMTRhYjAuLmYwNWY2YjggMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CkBAIC0zMCw5ICszMCw5IEBACiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgICBpZiBzZWxmLmZpcnN0OgogICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCi0gICAgICAgICAgICByZXR1cm4gY29kZWNzLkJPTV9VVEY4ICsgY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgZXJyb3JzKVswXQorICAgICAgICAgICAgcmV0dXJuIGNvZGVjcy5CT01fVVRGOCArIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0KKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KIAogICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5yZXNldChzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvdXVfY29kZWMucHkKaW5kZXggMDg3N2ZlMS4uNDNmYjkzYyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weQorKysgYi9MaWIvZW5jb2RpbmdzL3V1X2NvZGVjLnB5CkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogCiBjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CiAgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gdXVfZW5jb2RlKGlucHV0LCBlcnJvcnMpWzBdCisgICAgICAgIHJldHVybiB1dV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CiAgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gdXVfZGVjb2RlKGlucHV0LCBlcnJvcnMpWzBdCisgICAgICAgIHJldHVybiB1dV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCiBjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2d6aXAucHkgYi9MaWIvZ3ppcC5weQppbmRleCA4NjBhY2NjLi4wYmYyOWU4IDEwMDY0NAotLS0gYS9MaWIvZ3ppcC5weQorKysgYi9MaWIvZ3ppcC5weQpAQCAtMzE1LDcgKzMxNSwxMyBAQAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgaWYgc2VsZi5tb2RlID09IFdSSVRFOgogICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuY29tcHJlc3MuZmx1c2goKSkKLSAgICAgICAgICAgIHdyaXRlMzIoc2VsZi5maWxlb2JqLCBzZWxmLmNyYykKKyAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CisgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQworICAgICAgICAgICAgIyBsb25nLiAgU28sIG9uIGEgMzItYml0IGJveCBzZWxmLmNyYyBtYXkgImxvb2sgbmVnYXRpdmUiLAorICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCisgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQorICAgICAgICAgICAgIyBpdCB0byBsb29rIHBvc2l0aXZlIG9uIGFsbCBib3hlcy4KKyAgICAgICAgICAgIHdyaXRlMzJ1KHNlbGYuZmlsZW9iaiwgTE9XVTMyKHNlbGYuY3JjKSkKICAgICAgICAgICAgICMgc2VsZi5zaXplIG1heSBleGNlZWQgMkdCLCBvciBldmVuIDRHQgogICAgICAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBMT1dVMzIoc2VsZi5zaXplKSkKICAgICAgICAgICAgIHNlbGYuZmlsZW9iaiA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9odHRwbGliLnB5IGIvTGliL2h0dHBsaWIucHkKaW5kZXggMzYzODFkZS4uNWFlNWVmYyAxMDA2NDQKLS0tIGEvTGliL2h0dHBsaWIucHkKKysrIGIvTGliL2h0dHBsaWIucHkKQEAgLTMsNyArMyw3IEBACiA8aW50cm8gc3R1ZmYgZ29lcyBoZXJlPgogPG90aGVyIHN0dWZmLCB0b28+CiAKLUhUVFBDb25uZWN0aW9uIGdvIHRocm91Z2ggYSBudW1iZXIgb2YgInN0YXRlcyIsIHdoaWNoIGRlZmluZXMgd2hlbiBhIGNsaWVudAorSFRUUENvbm5lY3Rpb24gZ29lcyB0aHJvdWdoIGEgbnVtYmVyIG9mICJzdGF0ZXMiLCB3aGljaCBkZWZpbmUgd2hlbiBhIGNsaWVudAogbWF5IGxlZ2FsbHkgbWFrZSBhbm90aGVyIHJlcXVlc3Qgb3IgZmV0Y2ggdGhlIHJlc3BvbnNlIGZvciBhIHBhcnRpY3VsYXIKIHJlcXVlc3QuIFRoaXMgZGlhZ3JhbSBkZXRhaWxzIHRoZXNlIHN0YXRlIHRyYW5zaXRpb25zOgogCkBAIC05MjYsMTUgKzkyNiwxNSBAQAogICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfSURMRQogCiAgICAgICAgIGlmIHJlc3BvbnNlLndpbGxfY2xvc2U6Ci0gICAgICAgICAgICAjIHRoaXMgZWZmZWN0aXZlbHkgcGFzc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZXNwb25zZQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAjIFBhc3MgdGhlIHNvY2tldCB0byB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhpcywgc28gd2UgY2FuIHRlbGwgd2hlbiBpdCBpcyBjb21wbGV0ZQogICAgICAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gcmVzcG9uc2UKIAogICAgICAgICByZXR1cm4gcmVzcG9uc2UKIAotIyBUaGUgbmV4dCBzZXZlcmFsIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIEZha2VTb2NrZXQsYSBzb2NrZXQtbGlrZQorIyBUaGUgbmV4dCBzZXZlcmFsIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIEZha2VTb2NrZXQsIGEgc29ja2V0LWxpa2UKICMgaW50ZXJmYWNlIHRvIGFuIFNTTCBjb25uZWN0aW9uLgogCiAjIFRoZSBwcmltYXJ5IGNvbXBsZXhpdHkgY29tZXMgZnJvbSBmYWtpbmcgYSBtYWtlZmlsZSgpIG1ldGhvZC4gIFRoZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQppbmRleCBiNWU5MGIwLi5kMjRiZTNmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQorKysgYi9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQpAQCAtODAsNiArODAsMzIgQEAKICAgIF0pLAogXQogCitpbXBvcnQgc3lzCitpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICcuYXBwJyBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICAjIFJ1bm5pbmcgYXMgYSBwcm9wZXIgTWFjT1MgYXBwbGljYXRpb24gYnVuZGxlLiBUaGlzIGJsb2NrIHJlc3RydWN0dXJlcworICAgICMgdGhlIG1lbnVzIGEgbGl0dGxlIHRvIG1ha2UgdGhlbSBjb25mb3JtIGJldHRlciB0byB0aGUgSElHLgorCisgICAgcXVpdEl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMV0KKyAgICBjbG9zZUl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMl0KKworICAgICMgUmVtb3ZlIHRoZSBsYXN0IDMgaXRlbXMgb2YgdGhlIGZpbGUgbWVudTogYSBzZXBhcmF0b3IsIGNsb3NlIHdpbmRvdyBhbmQKKyAgICAjIHF1aXQuIENsb3NlIHdpbmRvdyB3aWxsIGJlIHJlaW5zZXJ0ZWQganVzdCBhYm92ZSB0aGUgc2F2ZSBpdGVtLCB3aGVyZQorICAgICMgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgSElHLiBRdWl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgorICAgIGRlbCBtZW51ZGVmc1swXVsxXVstMzpdCisgICAgbWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKKworICAgICMgUmVtb3ZlIHRoZSAnQWJvdXQnIGVudHJ5IGZyb20gdGhlIGhlbHAgbWVudSwgaXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgIyBtZW51CisgICAgZGVsIG1lbnVkZWZzWy0xXVsxXVswOjJdCisKKyAgICBtZW51ZGVmcy5pbnNlcnQoMCwKKyAgICAgICAgICAgICgnYXBwbGljYXRpb24nLCBbCisgICAgICAgICAgICAgICAgKCdBYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAoJ19QcmVmZXJlbmNlcy4uLi4nLCAnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicpLAorICAgICAgICAgICAgXSkpCisKKwogZGVmYXVsdF9rZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCiAKIGRlbCBzeXMKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NSRURJVFMudHh0IGIvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKaW5kZXggNmY0ZTk1ZC4uZTgzOGMwMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKKysrIGIvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQKQEAgLTE5LDE3ICsxOSwxOCBAQAogc3VicHJvY2VzcywgYW5kIG1hZGUgYSBudW1iZXIgb2YgdXNhYmlsaXR5IGVuaGFuY2VtZW50cy4KIAogT3RoZXIgY29udHJpYnV0b3JzIGluY2x1ZGUgUmF5bW9uZCBIZXR0aW5nZXIsIFRvbnkgTG93bmRzIChNYWMgaW50ZWdyYXRpb24pLAotTmVhbCBOb3J3aXR6IChjb2RlIGNoZWNrIGFuZCBjbGVhbi11cCksIGFuZCBDaHVpIFRleSAoUlBDIGludGVncmF0aW9uLCBkZWJ1Z2dlcgotaW50ZWdyYXRpb24gYW5kIHBlcnNpc3RlbnQgYnJlYWtwb2ludHMpLgorTmVhbCBOb3J3aXR6IChjb2RlIGNoZWNrIGFuZCBjbGVhbi11cCksIFJvbmFsZCBPdXNzb3JlbiAoTWFjIGludGVncmF0aW9uKSwKK05vYW0gUmFwaGFlbCAoQ29kZSBDb250ZXh0LCBDYWxsIFRpcHMsIG1hbnkgb3RoZXIgcGF0Y2hlcyksIGFuZCBDaHVpIFRleSAoUlBDCitpbnRlZ3JhdGlvbiwgZGVidWdnZXIgaW50ZWdyYXRpb24gYW5kIHBlcnNpc3RlbnQgYnJlYWtwb2ludHMpLgogCi1TY290dCBEYXZpZCBEYW5pZWxzLCBIZXJuYW4gRm9mZmFuaSwgQ2hyaXN0b3MgR2Vvcmdpb3UsIE1hcnRpbiB2LiBM9ndpcywgCi1KYXNvbiBPcmVuZG9yZmYsIE5vYW0gUmFwaGFlbCwgSm9zaCBSb2JiLCBOaWdlbCBSb3dlLCBCcnVjZSBTaGVyd29vZCwgYW5kCi1KZWZmIFNodXRlIGhhdmUgc3VibWl0dGVkIHVzZWZ1bCBwYXRjaGVzLiAgVGhhbmtzLCBndXlzIQorU2NvdHQgRGF2aWQgRGFuaWVscywgVGFsIEVpbmF0LCBIZXJuYW4gRm9mZmFuaSwgQ2hyaXN0b3MgR2Vvcmdpb3UsCitNYXJ0aW4gdi4gTPZ3aXMsIEphc29uIE9yZW5kb3JmZiwgSm9zaCBSb2JiLCBOaWdlbCBSb3dlLCBCcnVjZSBTaGVyd29vZCwKK2FuZCBKZWZmIFNodXRlIGhhdmUgc3VibWl0dGVkIHVzZWZ1bCBwYXRjaGVzLiAgVGhhbmtzLCBndXlzIQogCiBGb3IgYWRkaXRpb25hbCBkZXRhaWxzIHJlZmVyIHRvIE5FV1MudHh0IGFuZCBDaGFuZ2Vsb2cuCiAKLVBsZWFzZSBjb250YWN0IHRoZSBJRExFIG1haW50YWluZXIgdG8gaGF2ZSB5b3Vyc2VsZiBpbmNsdWRlZCBoZXJlIGlmIHlvdQotYXJlIG9uZSBvZiB0aG9zZSB3ZSBtaXNzZWQhIAorUGxlYXNlIGNvbnRhY3QgdGhlIElETEUgbWFpbnRhaW5lciAoa2JrQHNob3JlLm5ldCkgdG8gaGF2ZSB5b3Vyc2VsZiBpbmNsdWRlZAoraGVyZSBpZiB5b3UgYXJlIG9uZSBvZiB0aG9zZSB3ZSBtaXNzZWQhCiAKIAogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5IGIvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQppbmRleCBhZmQ0NDM5Li4yMjIzODg1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKQEAgLTQ5LDcgKzQ5LDExIEBACiAgICAgICAgICIiIgogICAgICAgICAjIHRydW5jYXRlIG92ZXJseSBsb25nIGNhbGx0aXAKICAgICAgICAgaWYgbGVuKHRleHQpID49IDc5OgotICAgICAgICAgICAgdGV4dCA9IHRleHRbOjc1XSArICcgLi4uJworICAgICAgICAgICAgdGV4dGxpbmVzID0gdGV4dC5zcGxpdGxpbmVzKCkKKyAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZSh0ZXh0bGluZXMpOgorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDc5OgorICAgICAgICAgICAgICAgICAgICB0ZXh0bGluZXNbaV0gPSBsaW5lWzo3NV0gKyAnIC4uLicKKyAgICAgICAgICAgIHRleHQgPSAnXG4nLmpvaW4odGV4dGxpbmVzKQogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CiAgICAgICAgIGlmIHNlbGYudGlwd2luZG93IG9yIG5vdCBzZWxmLnRleHQ6CiAgICAgICAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NhbGxUaXBzLnB5IGIvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKaW5kZXggNDdhMWQ1NS4uOTk3ZWIxMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIGFyZ1RleHQgPSAiIgogICAgIGlmIG9iIGlzIG5vdCBOb25lOgogICAgICAgICBhcmdPZmZzZXQgPSAwCi0gICAgICAgIGlmIHR5cGUob2IpPT10eXBlcy5DbGFzc1R5cGU6CisgICAgICAgIGlmIHR5cGUob2IpIGluICh0eXBlcy5DbGFzc1R5cGUsIHR5cGVzLlR5cGVUeXBlKToKICAgICAgICAgICAgICMgTG9vayBmb3IgdGhlIGhpZ2hlc3QgX19pbml0X18gaW4gdGhlIGNsYXNzIGNoYWluLgogICAgICAgICAgICAgZm9iID0gX2ZpbmRfY29uc3RydWN0b3Iob2IpCiAgICAgICAgICAgICBpZiBmb2IgaXMgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKaW5kZXggNWQ1NWY3Ny4uNjNjYzgyYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKKysrIGIvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKQEAgLTExLDExICsxMSwxMCBAQAogIiIiCiBpbXBvcnQgVGtpbnRlcgogZnJvbSBjb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBzZXRzIGltcG9ydCBTZXQKIGltcG9ydCByZQogZnJvbSBzeXMgaW1wb3J0IG1heGludCBhcyBJTkZJTklUWQogCi1CTE9DS09QRU5FUlMgPSBTZXQoWyJjbGFzcyIsICJkZWYiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJmaW5hbGx5IiwgImZvciIsCitCTE9DS09QRU5FUlMgPSBzZXQoWyJjbGFzcyIsICJkZWYiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJmaW5hbGx5IiwgImZvciIsCiAgICAgICAgICAgICAgICAgICAgICJpZiIsICJ0cnkiLCAid2hpbGUiXSkKIFVQREFURUlOVEVSVkFMID0gMTAwICMgbWlsbGlzZWMKIEZPTlRVUERBVEVJTlRFUlZBTCA9IDEwMDAgIyBtaWxsaXNlYwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQppbmRleCBmMjU4YjM0Li5lNTVmOWU2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQpAQCAtOCwyOCArOCwyOSBAQAogCiBERUJVRyA9IEZhbHNlCiAKLWRlZiBhbnkobmFtZSwgbGlzdCk6Ci0gICAgcmV0dXJuICIoP1A8JXM+IiAlIG5hbWUgKyAifCIuam9pbihsaXN0KSArICIpIgorZGVmIGFueShuYW1lLCBhbHRlcm5hdGVzKToKKyAgICAiUmV0dXJuIGEgbmFtZWQgZ3JvdXAgcGF0dGVybiBtYXRjaGluZyBsaXN0IG9mIGFsdGVybmF0ZXMuIgorICAgIHJldHVybiAiKD9QPCVzPiIgJSBuYW1lICsgInwiLmpvaW4oYWx0ZXJuYXRlcykgKyAiKSIKIAogZGVmIG1ha2VfcGF0KCk6CiAgICAga3cgPSByIlxiIiArIGFueSgiS0VZV09SRCIsIGtleXdvcmQua3dsaXN0KSArIHIiXGIiCiAgICAgYnVpbHRpbmxpc3QgPSBbc3RyKG5hbWUpIGZvciBuYW1lIGluIGRpcihfX2J1aWx0aW5fXykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyldCiAgICAgIyBzZWxmLmZpbGUgPSBmaWxlKCJmaWxlIikgOgotICAgICMgMXN0ICdmaWxlJyBjb2xvcml6ZWQgbm9ybWFsLCAybmQgYXMgYnVpbHRpbiwgM3JkIGFzIGNvbW1lbnQKLSAgICBidWlsdGluID0gciIoW14uJ1wiXFxdXGJ8XikiICsgYW55KCJCVUlMVElOIiwgYnVpbHRpbmxpc3QpICsgciJcYiIKKyAgICAjIDFzdCAnZmlsZScgY29sb3JpemVkIG5vcm1hbCwgMm5kIGFzIGJ1aWx0aW4sIDNyZCBhcyBzdHJpbmcKKyAgICBidWlsdGluID0gciIoW14uJ1wiXFwjXVxifF4pIiArIGFueSgiQlVJTFRJTiIsIGJ1aWx0aW5saXN0KSArIHIiXGIiCiAgICAgY29tbWVudCA9IGFueSgiQ09NTUVOVCIsIFtyIiNbXlxuXSoiXSkKLSAgICBzcXN0cmluZyA9IHIiKFxiW3JSXSk/J1teJ1xcXG5dKihcXC5bXidcXFxuXSopKic/IgotICAgIGRxc3RyaW5nID0gcicoXGJbclJdKT8iW14iXFxcbl0qKFxcLlteIlxcXG5dKikqIj8nCi0gICAgc3Ezc3RyaW5nID0gciIoXGJbclJdKT8nJydbXidcXF0qKChcXC58Jyg/IScnKSlbXidcXF0qKSooJycnKT8iCi0gICAgZHEzc3RyaW5nID0gcicoXGJbclJdKT8iIiJbXiJcXF0qKChcXC58Iig/ISIiKSlbXiJcXF0qKSooIiIiKT8nCisgICAgc3FzdHJpbmcgPSByIihcYltyUnVVXSk/J1teJ1xcXG5dKihcXC5bXidcXFxuXSopKic/IgorICAgIGRxc3RyaW5nID0gcicoXGJbclJ1VV0pPyJbXiJcXFxuXSooXFwuW14iXFxcbl0qKSoiPycKKyAgICBzcTNzdHJpbmcgPSByIihcYltyUnVVXSk/JycnW14nXFxdKigoXFwufCcoPyEnJykpW14nXFxdKikqKCcnJyk/IgorICAgIGRxM3N0cmluZyA9IHInKFxiW3JSdVVdKT8iIiJbXiJcXF0qKChcXC58Iig/ISIiKSlbXiJcXF0qKSooIiIiKT8nCiAgICAgc3RyaW5nID0gYW55KCJTVFJJTkciLCBbc3Ezc3RyaW5nLCBkcTNzdHJpbmcsIHNxc3RyaW5nLCBkcXN0cmluZ10pCiAgICAgcmV0dXJuIGt3ICsgInwiICsgYnVpbHRpbiArICJ8IiArIGNvbW1lbnQgKyAifCIgKyBzdHJpbmcgK1wKICAgICAgICAgICAgInwiICsgYW55KCJTWU5DIiwgW3IiXG4iXSkKIAogcHJvZyA9IHJlLmNvbXBpbGUobWFrZV9wYXQoKSwgcmUuUykKIGlkcHJvZyA9IHJlLmNvbXBpbGUociJccysoXHcrKSIsIHJlLlMpCi1hc3Byb2cgPSByZS5jb21waWxlKHIiLio/XGIoYXMpXGIiLCByZS5TKQorYXNwcm9nID0gcmUuY29tcGlsZShyIi4qP1xiKGFzKVxiIikKIAogY2xhc3MgQ29sb3JEZWxlZ2F0b3IoRGVsZWdhdG9yKToKIApAQCAtMjA4LDEwICsyMDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlID09ICJpbXBvcnQiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGFsbCB0aGUgImFzIiB3b3JkcyBvbiBzYW1lIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlYXAgYXBwcm94aW1hdGlvbiB0byB0aGUgdHJ1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBhbGwgdGhlICJhcyIgd29yZHMgb24gc2FtZSBsaW5lLCBleGNlcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBpbiBhIGNvbW1lbnQ7IGNoZWFwIGFwcHJveGltYXRpb24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIGNoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gY2hhcnMuaW5kZXgoJyMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbGVuKGNoYXJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEgPSBzZWxmLmFzcHJvZy5tYXRjaChjaGFycywgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0xID0gc2VsZi5hc3Byb2cubWF0Y2goY2hhcnMsIGIsIGVuZHBvcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgYiA9IG0xLnNwYW4oMSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0RlYnVnZ2VyLnB5IGIvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKaW5kZXggN2E5ZDAyZi4uZjU2NDYwYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKQEAgLTQsNiArNCw3IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGZyb20gV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKIGZyb20gU2Nyb2xsZWRMaXN0IGltcG9ydCBTY3JvbGxlZExpc3QKK2ltcG9ydCBtYWNvc3hTdXBwb3J0CiAKIAogY2xhc3MgSWRiKGJkYi5CZGIpOgpAQCAtMzIyLDcgKzMyMywxMyBAQAogY2xhc3MgU3RhY2tWaWV3ZXIoU2Nyb2xsZWRMaXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGZsaXN0LCBndWkpOgotICAgICAgICBTY3JvbGxlZExpc3QuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWR0aD04MCkKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgQXQgbGVhc3Qgb24gd2l0aCB0aGUgc3RvY2sgQXF1YVRrIHZlcnNpb24gb24gT1NYIDEwLjQgeW91J2xsCisgICAgICAgICAgICAjIGdldCBhbiBzaGFraW5nIEdVSSB0aGF0IGV2ZW50dWFsbHkga2lsbHMgSURMRSBpZiB0aGUgd2lkdGgKKyAgICAgICAgICAgICMgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgU2Nyb2xsZWRMaXN0Ll9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcm9sbGVkTGlzdC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZHRoPTgwKQogICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKICAgICAgICAgc2VsZi5ndWkgPSBndWkKICAgICAgICAgc2VsZi5zdGFjayA9IFtdCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKaW5kZXggNTk0NDBmMC4uNmI4YWI2MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IFB5UGFyc2UKIGZyb20gY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKIGltcG9ydCBhYm91dERpYWxvZywgdGV4dFZpZXcsIGNvbmZpZ0RpYWxvZworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogIyBUaGUgZGVmYXVsdCB0YWIgc2V0dGluZyBmb3IgYSBUZXh0IHdpZGdldCwgaW4gYXZlcmFnZS13aWR0aCBjaGFyYWN0ZXJzLgogVEtfVEFCV0lEVEhfREVGQVVMVCA9IDgKQEAgLTY2LDI2ICs2Nyw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiVkJWQuY2htJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNobWZpbGUpOgogICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gY2htZmlsZQorCisgICAgICAgICAgICBlbGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAgICAgIyBkb2N1bWVudGF0aW9uIGlzIHN0b3JlZCBpbnNpZGUgdGhlIHB5dGhvbiBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbi9pbmRleC5odG1sJykKKwogICAgICAgICAgICAgZG9jaG9tZSA9IG9zLnBhdGgubm9ybXBhdGgoZG9jaG9tZSkKICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRvY2hvbWUpOgogICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9IGRvY2hvbWUKKyAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgICAgICMgU2FmYXJpIHJlcXVpcmVzIHJlYWwgZmlsZTotVVJMcworICAgICAgICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSAnZmlsZTovLycgKyBFZGl0b3JXaW5kb3cuaGVscF91cmwKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgRWRpdG9yV2luZG93LmhlbHBfdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvY3VycmVudCIKICAgICAgICAgY3VycmVudFRoZW1lPWlkbGVDb25mLkN1cnJlbnRUaGVtZSgpCiAgICAgICAgIHNlbGYuZmxpc3QgPSBmbGlzdAogICAgICAgICByb290ID0gcm9vdCBvciBmbGlzdC5yb290CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnBzMQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzeXMucHMxID0gJz4+PiAnCiAgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnUocm9vdCkKICAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBXaW5kb3dMaXN0Lkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQogICAgICAgICBpZiBmbGlzdDoKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0gZmxpc3QudmFycwogICAgICAgICAgICAgI3NlbGYudG9wLmluc3RhbmNlX2RpY3QgbWFrZXMgZmxpc3QuaW52ZXJzZWRpY3QgYXZhbGFibGUgdG8KICAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhY2VzCi0gICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0PWZsaXN0LmludmVyc2VkaWN0CisgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXM6IFRraW50ZXIgdmFyaWFibGUgaW5zdGFuY2VzCi0gICAgICAgIHNlbGYucmVjZW50X2ZpbGVzX3BhdGg9b3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKKyAgICAgICAgICAgIHNlbGYudG9wLmluc3RhbmNlX2RpY3QgPSB7fQorICAgICAgICBzZWxmLnJlY2VudF9maWxlc19wYXRoID0gb3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKICAgICAgICAgICAgICAgICAncmVjZW50LWZpbGVzLmxzdCcpCiAgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIodG9wLCBuYW1lPSd2YmFyJykKICAgICAgICAgc2VsZi50ZXh0X2ZyYW1lID0gdGV4dF9mcmFtZSA9IEZyYW1lKHRvcCkKQEAgLTExMSw2ICsxMjYsOSBAQAogCiAgICAgICAgIHNlbGYudG9wLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jbG9zZSkKICAgICAgICAgc2VsZi50b3AuYmluZCgiPDxjbG9zZS13aW5kb3c+PiIsIHNlbGYuY2xvc2VfZXZlbnQpCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIENvbW1hbmQtVyBvbiBlZGl0b3J3aW5kb3dzIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoaXMuCisgICAgICAgICAgICB0ZXh0LmJpbmQoJzw8Y2xvc2Utd2luZG93Pj4nLCBzZWxmLmNsb3NlX2V2ZW50KQogICAgICAgICB0ZXh0LmJpbmQoIjw8Y3V0Pj4iLCBzZWxmLmN1dCkKICAgICAgICAgdGV4dC5iaW5kKCI8PGNvcHk+PiIsIHNlbGYuY29weSkKICAgICAgICAgdGV4dC5iaW5kKCI8PHBhc3RlPj4iLCBzZWxmLnBhc3RlKQpAQCAtMjc4LDYgKzI5NiwxMCBAQAogCiAgICAgZGVmIHNldF9zdGF0dXNfYmFyKHNlbGYpOgogICAgICAgICBzZWxmLnN0YXR1c19iYXIgPSBzZWxmLk11bHRpU3RhdHVzQmFyKHNlbGYudG9wKQorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBJbnNlcnQgc29tZSBwYWRkaW5nIHRvIGF2b2lkIG9ic2N1cmluZyBzb21lIG9mIHRoZSBzdGF0dXNiYXIKKyAgICAgICAgICAgICMgYnkgdGhlIHJlc2l6ZSB3aWRnZXQuCisgICAgICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdfcGFkZGluZzEnLCAnICAgICcsIHNpZGU9UklHSFQpCiAgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ2NvbHVtbicsICdDb2w6ID8nLCBzaWRlPVJJR0hUKQogICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdsaW5lJywgJ0xuOiA/Jywgc2lkZT1SSUdIVCkKICAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKQEAgLTMwMSw2ICszMjMsMTEgQEAKICAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCiAgICAgXQogCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgICAgIG1lbnVfc3BlY3NbLTJdID0gKCJ3aW5kb3dzIiwgIl9XaW5kb3ciKQorCisKICAgICBkZWYgY3JlYXRlbWVudWJhcihzZWxmKToKICAgICAgICAgbWJhciA9IHNlbGYubWVudWJhcgogICAgICAgICBzZWxmLm1lbnVkaWN0ID0gbWVudWRpY3QgPSB7fQpAQCAtMzA4LDYgKzMzNSwxMiBAQAogICAgICAgICAgICAgdW5kZXJsaW5lLCBsYWJlbCA9IHByZXBzdHIobGFiZWwpCiAgICAgICAgICAgICBtZW51ZGljdFtuYW1lXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9bmFtZSkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICcuZnJhbWV3b3JrJyBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBhcHBsaWNhdGlvbiBtZW51CisgICAgICAgICAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9J2FwcGxlJykKKyAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCisKICAgICAgICAgc2VsZi5maWxsX21lbnVzKCkKICAgICAgICAgc2VsZi5iYXNlX2hlbHBtZW51X2xlbmd0aCA9IHNlbGYubWVudWRpY3RbJ2hlbHAnXS5pbmRleChFTkQpCiAgICAgICAgIHNlbGYucmVzZXRfaGVscF9tZW51X2VudHJpZXMoKQpAQCAtNjQ5LDcgKzY4Miw3IEBACiAgICAgZGVmIF9fZXh0cmFfaGVscF9jYWxsYmFjayhzZWxmLCBoZWxwZmlsZSk6CiAgICAgICAgICJDcmVhdGUgYSBjYWxsYmFjayB3aXRoIHRoZSBoZWxwZmlsZSB2YWx1ZSBmcm96ZW4gYXQgZGVmaW5pdGlvbiB0aW1lIgogICAgICAgICBkZWYgZGlzcGxheV9leHRyYV9oZWxwKGhlbHBmaWxlPWhlbHBmaWxlKToKLSAgICAgICAgICAgIGlmIG5vdCAoaGVscGZpbGUuc3RhcnRzd2l0aCgnd3d3Jykgb3IgaGVscGZpbGUuc3RhcnRzd2l0aCgnaHR0cCcpKToKKyAgICAgICAgICAgIGlmIG5vdCBoZWxwZmlsZS5zdGFydHN3aXRoKCgnd3d3JywgJ2h0dHAnKSk6CiAgICAgICAgICAgICAgICAgdXJsID0gb3MucGF0aC5ub3JtcGF0aChoZWxwZmlsZSkKICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CiAgICAgICAgICAgICAgICAgb3Muc3RhcnRmaWxlKGhlbHBmaWxlKQpAQCAtMTI0NCwxMyArMTI3NywxMyBAQAogICAgICAgICAgICAgICAiVG9nZ2xlIHRhYnMiLAogICAgICAgICAgICAgICAiVHVybiB0YWJzICIgKyAoIm9uIiwgIm9mZiIpW3NlbGYudXNldGFic10gKwogICAgICAgICAgICAgICAiP1xuSW5kZW50IHdpZHRoICIgKwotICAgICAgICAgICAgICAoIndpbGwgYmUiLCAicmVtYWlucyBhdCIpW3NlbGYudXNldGFic10gKyAiIDguIiwKKyAgICAgICAgICAgICAgKCJ3aWxsIGJlIiwgInJlbWFpbnMgYXQiKVtzZWxmLnVzZXRhYnNdICsgIiA4LiIgKworICAgICAgICAgICAgICAiXG4gTm90ZTogYSB0YWIgaXMgYWx3YXlzIDggY29sdW1ucyIsCiAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpOgogICAgICAgICAgICAgc2VsZi51c2V0YWJzID0gbm90IHNlbGYudXNldGFicwotICAgICAgICAjIFRyeSB0byBwcmV2ZW50IG1peGVkIHRhYnMvc3BhY2VzLgotICAgICAgICAjIFVzZXIgbXVzdCByZXNldCBpbmRlbnQgd2lkdGggbWFudWFsbHkgYWZ0ZXIgdXNpbmcgdGFicwotICAgICAgICAjICAgICAgaWYgaGUgaW5zaXN0cyBvbiBnZXR0aW5nIGludG8gdHJvdWJsZS4KLSAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKKyAgICAgICAgICAgICMgVHJ5IHRvIHByZXZlbnQgaW5jb25zaXN0ZW50IGluZGVudGF0aW9uLgorICAgICAgICAgICAgIyBVc2VyIG11c3QgY2hhbmdlIGluZGVudCB3aWR0aCBtYW51YWxseSBhZnRlciB1c2luZyB0YWJzLgorICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgICMgWFhYIHRoaXMgaXNuJ3QgYm91bmQgdG8gYW55dGhpbmcgLS0gc2VlIHRhYndpZHRoIGNvbW1lbnRzCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ORVdTLnR4dCBiL0xpYi9pZGxlbGliL05FV1MudHh0CmluZGV4IDI1ZTVkNDAuLjIzNTk2M2UgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL05FV1MudHh0CisrKyBiL0xpYi9pZGxlbGliL05FV1MudHh0CkBAIC0xLDMgKzEsNDYgQEAKK1doYXQncyBOZXcgaW4gSURMRSAxLjJjMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogWFgtQVVHLTIwMDYqCisKKy0gQ2hhbmdpbmcgdG9rZW5pemUgKDM5MDQ2KSB0byBkZXRlY3QgZGVkZW50IGJyb2tlIHRhYm5hbm55IGNoZWNrIChzaW5jZSAxLjJhMSkKKworLSBUb2dnbGVUYWIgZGlhbG9nIHdhcyBzZXR0aW5nIGluZGVudCB0byA4IGV2ZW4gaWYgY2FuY2VsbGVkIChzaW5jZSAxLjJhMSkuCisKKy0gV2hlbiB1c2VkIHcvbyBzdWJwcm9jZXNzLCBhbGwgZXhjZXB0aW9ucyB3ZXJlIHByZWNlZGVkIGJ5IGFuIGVycm9yCisgIG1lc3NhZ2UgY2xhaW1pbmcgdGhleSB3ZXJlIElETEUgaW50ZXJuYWwgZXJyb3JzIChzaW5jZSAxLjJhMSkuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjJiMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDMtQVVHLTIwMDYqCisKKy0gRWRpdG9yV2luZG93LnRlc3QoKSB3YXMgZmFpbGluZy4gIEJ1ZyAxNDE3NTk4CisKKy0gRWRpdG9yV2luZG93IGZhaWxlZCB3aGVuIHVzZWQgc3RhbmQtYWxvbmUgaWYgc3lzLnBzMSBub3Qgc2V0LgorICBCdWcgMTAxMDM3MCBEYXZlIEZsb3JlaworCistIFRvb2x0aXBzIGZhaWxlZCBvbiBuZXctc3lsZSBjbGFzcyBfX2luaXRfXyBhcmdzLiAgQnVnIDEwMjc1NjYgTG9yZW4gR3V0aHJpZQorCistIEF2b2lkIG9jY2FzaW9uYWwgZmFpbHVyZSB0byBkZXRlY3QgY2xvc2luZyBwYXJlbiBwcm9wZXJseS4KKyAgUGF0Y2ggMTQwNzI4MCBUYWwgRWluYXQKKworLSBSZWJpbmRpbmcgVGFiIGtleSB3YXMgaW5zZXJ0aW5nICd0YWInIGluc3RlYWQgb2YgJ1RhYicuICBCdWcgMTE3OTE2OC4KKworLSBDb2xvcml6ZXIgbm93IGhhbmRsZXMgIzxidWlsdGluPiBjb3JyZWN0bHksIGFsc28gdW5pY29kZSBzdHJpbmdzIGFuZAorICAnYXMnIGtleXdvcmQgaW4gY29tbWVudCBkaXJlY3RseSBmb2xsb3dpbmcgaW1wb3J0IGNvbW1hbmQuIENsb3NlcyAxMzI1MDcxLgorICBQYXRjaCAxNDc5MjE5IFRhbCBFaW5hdAorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDExLUpVTC0yMDA2KgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwLUpVTi0yMDA2KgorCiBXaGF0J3MgTmV3IGluIElETEUgMS4yYTI/CiA9PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkgYi9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CmluZGV4IDY3M2FlZTIuLjI1MGFlOGIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKKysrIGIvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQpAQCAtOCw3ICs4LDcgQEAKIGZyb20gSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiBmcm9tIGNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCiAKLWtleXN5bV9vcGVuZXIgPSB7InBhcmVucmlnaHQiOicoJywgImJyYWNrZXRyaWdodCI6J1snLCAiYnJhY2VyaWdodCI6J3snfQorX29wZW5lcnMgPSB7JyknOicoJywnXSc6J1snLCd9Jzoneyd9CiBDSEVDS19ERUxBWSA9IDEwMCAjIG1pbGlzZWNvbmRzCiAKIGNsYXNzIFBhcmVuTWF0Y2g6CkBAIC0xMDAsMTIgKzEwMCwxMyBAQAogCiAgICAgZGVmIHBhcmVuX2Nsb3NlZF9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgICMgSWYgaXQgd2FzIGEgc2hvcnRjdXQgYW5kIG5vdCByZWFsbHkgYSBjbG9zaW5nIHBhcmVuLCBxdWl0LgotICAgICAgICBpZiBzZWxmLnRleHQuZ2V0KCJpbnNlcnQtMWMiKSBub3QgaW4gKCcpJywnXScsJ30nKToKKyAgICAgICAgY2xvc2VyID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0LTFjIikKKyAgICAgICAgaWYgY2xvc2VyIG5vdCBpbiBfb3BlbmVyczoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBocCA9IEh5cGVyUGFyc2VyKHNlbGYuZWRpdHdpbiwgImluc2VydC0xYyIpCiAgICAgICAgIGlmIG5vdCBocC5pc19pbl9jb2RlKCk6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaW5kaWNlcyA9IGhwLmdldF9zdXJyb3VuZGluZ19icmFja2V0cyhrZXlzeW1fb3BlbmVyW2V2ZW50LmtleXN5bV0sIFRydWUpCisgICAgICAgIGluZGljZXMgPSBocC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoX29wZW5lcnNbY2xvc2VyXSwgVHJ1ZSkKICAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQogICAgICAgICAgICAgcmV0dXJuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5IGIvTGliL2lkbGVsaWIvUHlTaGVsbC5weQppbmRleCBiNmFiZTQwLi4yNWViNDQ2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKQEAgLTExLDYgKzExLDcgQEAKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB0eXBlcworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogaW1wb3J0IGxpbmVjYWNoZQogZnJvbSBjb2RlIGltcG9ydCBJbnRlcmFjdGl2ZUludGVycHJldGVyCkBAIC03MjEsOCArNzIyLDEyIEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgIklETEUgaW50ZXJuYWwgZXJyb3IgaW4gcnVuY29kZSgpIgorICAgICAgICAgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnRrY29uc29sZS5zdGRlcnIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklETEUgaW50ZXJuYWwgZXJyb3IgaW4gcnVuY29kZSgpIgogICAgICAgICAgICAgICAgIHNlbGYuc2hvd3RyYWNlYmFjaygpCisgICAgICAgICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmVuZGV4ZWN1dGluZygpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CiAgICAgICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUuZW5kZXhlY3V0aW5nKCkKQEAgLTc3Nyw2ICs3ODIsMTEgQEAKICAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCiAgICAgXQogCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgICAgIG1lbnVfc3BlY3NbLTJdID0gKCJ3aW5kb3dzIiwgIl9XaW5kb3ciKQorCisKICAgICAjIE5ldyBjbGFzc2VzCiAgICAgZnJvbSBJZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQogCkBAIC0xMzAwLDEwICsxMzEwLDYgQEAKICAgICBzY3JpcHQgPSBOb25lCiAgICAgc3RhcnR1cCA9IEZhbHNlCiAgICAgdHJ5OgotICAgICAgICBzeXMucHMxCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBzeXMucHMxID0gJz4+PiAnCi0gICAgdHJ5OgogICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJjOmRlaWhucjpzdDoiKQogICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXJyb3I6ICVzXG4iICUgc3RyKG1zZykpCkBAIC0xMzcxLDkgKzEzNzcsMTIgQEAKICAgICBlbmFibGVfc2hlbGwgPSBlbmFibGVfc2hlbGwgb3Igbm90IGVkaXRfc3RhcnQKICAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKICAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKKwogICAgIGZpeHdvcmRicmVha3Mocm9vdCkKICAgICByb290LndpdGhkcmF3KCkKICAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQorICAgIG1hY29zeFN1cHBvcnQuc2V0dXBBcHAocm9vdCwgZmxpc3QpCisKICAgICBpZiBlbmFibGVfZWRpdDoKICAgICAgICAgaWYgbm90IChjbWQgb3Igc2NyaXB0KToKICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgpAQCAtMTM4MSw4ICsxMzkwLDE3IEBACiAgICAgICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgICAgICBmbGlzdC5uZXcoKQogICAgIGlmIGVuYWJsZV9zaGVsbDoKLSAgICAgICAgaWYgbm90IGZsaXN0Lm9wZW5fc2hlbGwoKToKKyAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKKyAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgICAgICAjIE9uIE9TWDogd2hlbiB0aGUgdXNlciBoYXMgZG91YmxlLWNsaWNrZWQgb24gYSBmaWxlIHRoYXQgY2F1c2VzCisgICAgICAgICAgICAjIElETEUgdG8gYmUgbGF1bmNoZWQgdGhlIHNoZWxsIHdpbmRvdyB3aWxsIG9wZW4ganVzdCBpbiBmcm9udCBvZgorICAgICAgICAgICAgIyB0aGUgZmlsZSBzaGUgd2FudHMgdG8gc2VlLiBMb3dlciB0aGUgaW50ZXJwcmV0ZXIgd2luZG93IHdoZW4KKyAgICAgICAgICAgICMgdGhlcmUgYXJlIG9wZW4gZmlsZXMuCisgICAgICAgICAgICBzaGVsbC50b3AubG93ZXIoKQorCiAgICAgc2hlbGwgPSBmbGlzdC5weXNoZWxsCiAgICAgIyBoYW5kbGUgcmVtYWluaW5nIG9wdGlvbnM6CiAgICAgaWYgZGVidWc6CkBAIC0xNDAzLDYgKzE0MjEsNyBAQAogICAgICAgICBlbGlmIHNjcmlwdDoKICAgICAgICAgICAgIHNoZWxsLmludGVycC5wcmVwZW5kX3N5c3BhdGgoc2NyaXB0KQogICAgICAgICAgICAgc2hlbGwuaW50ZXJwLmV4ZWNmaWxlKHNjcmlwdCkKKwogICAgIHJvb3QubWFpbmxvb3AoKQogICAgIHJvb3QuZGVzdHJveSgpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CmluZGV4IDA4NGM2MDcuLmYzMjVhZDEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgRGVidWdnZXIKICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgYmUgZG9uZSBkaWZmZXJlbnRseQogICAgICAgICBzZWxmLmZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0Ci0gICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZmxpc3Qucm9vdAorICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLmVkaXR3aW4ucm9vdAogCiAgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpCkBAIC03Niw2ICs3Niw5IEBACiAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uZ290b2xpbmUobmFnLmdldF9saW5lbm8oKSkKICAgICAgICAgICAgIHNlbGYuZXJyb3Jib3goIlRhYi9zcGFjZSBlcnJvciIsIGluZGVudF9tZXNzYWdlKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbmRlbnRhdGlvbkVycm9yOgorICAgICAgICAgICAgIyBGcm9tIHRva2VuaXplKCksIGxldCBjb21waWxlKCkgaW4gY2hlY2tzeW50YXggZmluZCBpdCBhZ2Fpbi4KKyAgICAgICAgICAgIHBhc3MKICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiBjaGVja3N5bnRheChzZWxmLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5IGIvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQppbmRleCAyYWI0NjU2Li44M2NhM2E2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CisrKyBiL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKQEAgLTIsNiArMiw3IEBACiAKIGltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IG1hY29zeFN1cHBvcnQKIAogY2xhc3MgWm9vbUhlaWdodDoKIApAQCAtMjksNiArMzAsMTQgQEAKICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKICAgICAgICAgbmV3eSA9IDAKICAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gNzIKKworICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgIyBUaGUgJzg4JyBiZWxvdyBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IGF2b2lkcyBwbGFjaW5nIHRoZSBib3R0b20KKyAgICAgICAgIyBvZiB0aGUgd2luZG93IGJlbG93IHRoZSBwYW5lbCBvbiBteSBtYWNoaW5lLiBJIGRvbid0IGtub3cgaG93CisgICAgICAgICMgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIHdpdGggdGtpbnRlci4KKyAgICAgICAgbmV3eSA9IDIyCisgICAgICAgIG5ld2hlaWdodCA9IG5ld2hlaWdodCAtIG5ld3kgLSA4OAorCiAgICAgZWxzZToKICAgICAgICAgI25ld3kgPSAyNAogICAgICAgICBuZXd5ID0gMApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYnVpbGRhcHAucHkgYi9MaWIvaWRsZWxpYi9idWlsZGFwcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyZWIxZS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9idWlsZGFwcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQWZ0ZXIgcnVubmluZyBweXRob24gc2V0dXAucHkgaW5zdGFsbCwgcnVuIHRoaXMgcHJvZ3JhbSBmcm9tIHRoZSBjb21tYW5kCi0jIGxpbmUgbGlrZSBzbzoKLSMKLSMgJSBweXRob24yLjMgYnVpbGRhcHAucHkgYnVpbGQKLSMKLSMgQSBkb3VibGUtY2xpY2thYmxlIElETEUgYXBwbGljYXRpb24gd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBidWlsZC8gZGlyZWN0b3J5LgotIwotCi1mcm9tIGJ1bmRsZWJ1aWxkZXIgaW1wb3J0IGJ1aWxkYXBwCi0KLWJ1aWxkYXBwKAotICAgICAgICBuYW1lPSJJRExFIiwKLSAgICAgICAgbWFpbnByb2dyYW09ImlkbGUucHkiLAotICAgICAgICBhcmd2X2VtdWxhdGlvbj0xLAotICAgICAgICBpY29uZmlsZT0iSWNvbnMvaWRsZS5pY25zIiwKLSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZiBiL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgppbmRleCAwNjUzNzQ2Li5mYjBhYWY0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCkBAIC0xNTksMyArMTU5LDU2IEBACiBjaGFuZ2UtaW5kZW50d2lkdGg9PENvbnRyb2wtS2V5LXU+CiBkZWwtd29yZC1sZWZ0PTxDb250cm9sLUtleS1CYWNrU3BhY2U+CiBkZWwtd29yZC1yaWdodD08Q29udHJvbC1LZXktRGVsZXRlPgorCitbSURMRSBDbGFzc2ljIE9TWF0KK3RvZ2dsZS10YWJzID0gPENvbnRyb2wtS2V5LXQ+CitpbnRlcnJ1cHQtZXhlY3V0aW9uID0gPENvbnRyb2wtS2V5LWM+Cit1bnRhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNj4KK3JlbW92ZS1zZWxlY3Rpb24gPSA8S2V5LUVzY2FwZT4KK3ByaW50LXdpbmRvdyA9IDxDb21tYW5kLUtleS1wPgorcmVwbGFjZSA9IDxDb21tYW5kLUtleS1yPgorZ290by1saW5lID0gPENvbW1hbmQtS2V5LWo+CitwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQgPSA8Q29udHJvbC1LZXktaj4KK2hpc3RvcnktcHJldmlvdXMgPSA8Q29udHJvbC1LZXktcD4KK2JlZ2lubmluZy1vZi1saW5lID0gPENvbnRyb2wtS2V5LUxlZnQ+CitlbmQtb2YtbGluZSA9IDxDb250cm9sLUtleS1SaWdodD4KK2NvbW1lbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LTM+CityZWRvID0gPFNoaWZ0LUNvbW1hbmQtS2V5LVo+CitjbG9zZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktdz4KK3Jlc3RhcnQtc2hlbGwgPSA8Q29udHJvbC1LZXktRjY+CitzYXZlLXdpbmRvdy1hcy1maWxlID0gPENvbW1hbmQtS2V5LVM+CitjbG9zZS1hbGwtd2luZG93cyA9IDxDb21tYW5kLUtleS1xPgordmlldy1yZXN0YXJ0ID0gPEtleS1GNj4KK3RhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNT4KK2ZpbmQtYWdhaW4gPSA8Q29tbWFuZC1LZXktZz4gPEtleS1GMz4KK2ZpbmQgPSA8Q29tbWFuZC1LZXktZj4KK3RvZ2dsZS1hdXRvLWNvbG9yaW5nID0gPENvbnRyb2wtS2V5LXNsYXNoPgorc2VsZWN0LWFsbCA9IDxDb21tYW5kLUtleS1hPgorc21hcnQtYmFja3NwYWNlID0gPEtleS1CYWNrU3BhY2U+CitjaGFuZ2UtaW5kZW50d2lkdGggPSA8Q29udHJvbC1LZXktdT4KK2RvLW5vdGhpbmcgPSA8Q29udHJvbC1LZXktRjEyPgorc21hcnQtaW5kZW50ID0gPEtleS1UYWI+CitjZW50ZXItaW5zZXJ0ID0gPENvbnRyb2wtS2V5LWw+CitoaXN0b3J5LW5leHQgPSA8Q29udHJvbC1LZXktbj4KK2RlbC13b3JkLXJpZ2h0ID0gPE9wdGlvbi1LZXktRGVsZXRlPgordW5kbyA9IDxDb21tYW5kLUtleS16Pgorc2F2ZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktcz4KK3VuY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktND4KK2N1dCA9IDxDb21tYW5kLUtleS14PgorZmluZC1pbi1maWxlcyA9IDxDb21tYW5kLUtleS1GMz4KK2RlZGVudC1yZWdpb24gPSA8Q29tbWFuZC1LZXktYnJhY2tldGxlZnQ+Citjb3B5ID0gPENvbW1hbmQtS2V5LWM+CitwYXN0ZSA9IDxDb21tYW5kLUtleS12PgoraW5kZW50LXJlZ2lvbiA9IDxDb21tYW5kLUtleS1icmFja2V0cmlnaHQ+CitkZWwtd29yZC1sZWZ0ID0gPE9wdGlvbi1LZXktQmFja1NwYWNlPiA8T3B0aW9uLUNvbW1hbmQtS2V5LUJhY2tTcGFjZT4KK25ld2xpbmUtYW5kLWluZGVudCA9IDxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgorZW5kLW9mLWZpbGUgPSA8Q29udHJvbC1LZXktZD4KK29wZW4tY2xhc3MtYnJvd3NlciA9IDxDb21tYW5kLUtleS1iPgorb3Blbi1uZXctd2luZG93ID0gPENvbW1hbmQtS2V5LW4+CitvcGVuLW1vZHVsZSA9IDxDb21tYW5kLUtleS1tPgorZmluZC1zZWxlY3Rpb24gPSA8U2hpZnQtQ29tbWFuZC1LZXktRjM+CitweXRob24tY29udGV4dC1oZWxwID0gPFNoaWZ0LUtleS1GMT4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZSA9IDxTaGlmdC1Db21tYW5kLUtleS1zPgorb3Blbi13aW5kb3ctZnJvbS1maWxlID0gPENvbW1hbmQtS2V5LW8+CitweXRob24tZG9jcyA9IDxLZXktRjE+CisKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CmluZGV4IDE5MWE4N2MuLjgyNmZiNWQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCitpbXBvcnQgbWFjb3N4U3VwcG9ydAogZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlciwgTm9PcHRpb25FcnJvciwgTm9TZWN0aW9uRXJyb3IKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtNDA2LDcgKzQwNyw3IEBACiAgICAgICAgIG5hbWVzPWV4dG5OYW1lTGlzdAogICAgICAgICBrYk5hbWVJbmRpY2llcz1bXQogICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ19iaW5kaW5ncycpIG9yIG5hbWUuZW5kc3dpdGgoJ19jZmdCaW5kaW5ncycpOgorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgoJ19iaW5kaW5ncycsICdfY2ZnQmluZGluZ3MnKSk6CiAgICAgICAgICAgICAgICAga2JOYW1lSW5kaWNpZXMuYXBwZW5kKG5hbWVzLmluZGV4KG5hbWUpKQogICAgICAgICBrYk5hbWVJbmRpY2llcy5zb3J0KCkKICAgICAgICAga2JOYW1lSW5kaWNpZXMucmV2ZXJzZSgpCkBAIC00OTUsNyArNDk2LDE4IEBACiAgICAgICAgIHJldHVybiBiaW5kaW5nCiAKICAgICBkZWYgR2V0Q3VycmVudEtleVNldChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuR2V0S2V5U2V0KHNlbGYuQ3VycmVudEtleXMoKSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5HZXRLZXlTZXQoc2VsZi5DdXJyZW50S2V5cygpKQorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIFdlJ3JlIHVzaW5nIEFxdWFUaywgcmVwbGFjZSBhbGwga2V5YmluZ2luZ3MgdGhhdCB1c2UgdGhlCisgICAgICAgICAgICAjIEFsdCBrZXkgYnkgb25lcyB0aGF0IHVzZSB0aGUgT3B0aW9uIGtleSBiZWNhdXNlIHRoZSBmb3JtZXIKKyAgICAgICAgICAgICMgZG9uJ3Qgd29yayByZWxpYWJseS4KKyAgICAgICAgICAgIGZvciBrLCB2IGluIHJlc3VsdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHYyID0gWyB4LnJlcGxhY2UoJzxBbHQtJywgJzxPcHRpb24tJykgZm9yIHggaW4gdiBdCisgICAgICAgICAgICAgICAgaWYgdiAhPSB2MjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tdID0gdjIKKworICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBkZWYgR2V0S2V5U2V0KHNlbGYsa2V5U2V0TmFtZSk6CiAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQppbmRleCA4OTI0Zjc5Li42NjExNjIxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQorKysgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQogICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKICAgICAgICAgICAgIHBhdGhPayA9IEZhbHNlCi0gICAgICAgIGVsaWYgcGF0aC5zdGFydHN3aXRoKCd3d3cuJykgb3IgcGF0aC5zdGFydHN3aXRoKCdodHRwJyk6CisgICAgICAgIGVsaWYgcGF0aC5zdGFydHN3aXRoKCgnd3d3LicsICdodHRwJykpOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgaWYgcGF0aFs6NV0gPT0gJ2ZpbGU6JzoKQEAgLTE0Niw4ICsxNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoLmdldCgpLnN0cmlwKCkpCiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucmVzdWx0WzFdCi0gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzd2l0aCgnd3d3Jykgb3IgcGF0aC5zdGFydHN3aXRoKCdmaWxlOicpCi0gICAgICAgICAgICAgICAgICAgIG9yIHBhdGguc3RhcnRzd2l0aCgnaHR0cDonKSk6CisgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCgnd3d3JywgJ2ZpbGU6JywgJ2h0dHA6JykpOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgIyBNYWMgU2FmYXJpIGluc2lzdHMgb24gdXNpbmcgdGhlIFVSSSBmb3JtIGZvciBsb2NhbCBmaWxlcwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZXZlci5weSBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKaW5kZXggYjdkZWIzZi4uMDdkM2Q4MiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZXZlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CkBAIC0xICsxIEBACi1JRExFX1ZFUlNJT04gPSAiMS4yYTIiCitJRExFX1ZFUlNJT04gPSAiMS4yYjMiCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQppbmRleCBlYTU3OTU4Li5hZmY5Y2FjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICBjb25maWcta2V5cy5kZWYgbXVzdCB1c2UgdGhlIHNhbWUgb3JkZXJpbmcuCiAgICAgICAgICIiIgogICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgc3lzLmV4ZWN1dGFibGUuY291bnQoJy5hcHAnKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBzeXMuYXJndlswXS5jb3VudCgnLmFwcCcpOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ1NoaWZ0JywgJ0NvbnRyb2wnLCAnT3B0aW9uJywgJ0NvbW1hbmQnXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5tb2RpZmllcnMgPSBbJ0NvbnRyb2wnLCAnQWx0JywgJ1NoaWZ0J10KQEAgLTIwMiw3ICsyMDIsNyBAQAogICAgICAgICAgICAgICAgICc6JzonY29sb24nLCcsJzonY29tbWEnLCcuJzoncGVyaW9kJywnPCc6J2xlc3MnLCc+JzonZ3JlYXRlcicsCiAgICAgICAgICAgICAgICAgJy8nOidzbGFzaCcsJz8nOidxdWVzdGlvbicsJ1BhZ2UgVXAnOidQcmlvcicsJ1BhZ2UgRG93bic6J05leHQnLAogICAgICAgICAgICAgICAgICdMZWZ0IEFycm93JzonTGVmdCcsJ1JpZ2h0IEFycm93JzonUmlnaHQnLCdVcCBBcnJvdyc6J1VwJywKLSAgICAgICAgICAgICAgICAnRG93biBBcnJvdyc6ICdEb3duJywgJ1RhYic6J3RhYid9CisgICAgICAgICAgICAgICAgJ0Rvd24gQXJyb3cnOiAnRG93bicsICdUYWInOidUYWInfQogICAgICAgICBpZiBrZXkgaW4gdHJhbnNsYXRlRGljdC5rZXlzKCk6CiAgICAgICAgICAgICBrZXkgPSB0cmFuc2xhdGVEaWN0W2tleV0KICAgICAgICAgaWYgJ1NoaWZ0JyBpbiBtb2RpZmllcnMgYW5kIGtleSBpbiBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weSBiL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2MWZmZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKQEAgLTAsMCArMSwxMTIgQEAKKyIiIgorQSBudW1iZXIgb2YgZnVuY3Rpb24gdGhhdCBlbmhhbmNlIElETEUgb24gTWFjT1NYIHdoZW4gaXQgdXNlZCBhcyBhIG5vcm1hbAorR1VJIGFwcGxpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGFuIFgxMSBhcHBsaWNhdGlvbikuCisiIiIKK2ltcG9ydCBzeXMKKworZGVmIHJ1bm5pbmdBc09TWEFwcCgpOgorICAgICIiIiBSZXR1cm5zIFRydWUgaWZmIHJ1bm5pbmcgZnJvbSB0aGUgSURMRS5hcHAgYnVuZGxlIG9uIE9TWCAiIiIKKyAgICByZXR1cm4gKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJ0lETEUuYXBwJyBpbiBzeXMuYXJndlswXSkKKworZGVmIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlc3BvbnQgdG8gb3BlbiBBcHBsZUV2ZW50cywgd2hpY2gKKyAgICBtYWtlcyBpcyBmZWFzZWFibGUgdG8gdXNlIElETEUgYXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gZm9yIHB5dGhvbiBmaWxlcy4KKyAgICAiIiIKKyAgICBkZWYgZG9PcGVuRmlsZSgqYXJncyk6CisgICAgICAgIGZvciBmbiBpbiBhcmdzOgorICAgICAgICAgICAgZmxpc3Qub3BlbihmbikKKworICAgICMgVGhlIGNvbW1hbmQgYmVsb3cgaXMgYSBob29rIGluIGFxdWF0ayB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYXBwCisgICAgIyByZWNlaXZlcyBhIGZpbGUgb3BlbiBldmVudC4gVGhlIGNhbGxiYWNrIGNhbiBoYXZlIG11bHRpcGxlIGFyZ3VtZW50cywKKyAgICAjIG9uZSBmb3IgZXZlcnkgZmlsZSB0aGF0IHNob3VsZCBiZSBvcGVuZWQuCisgICAgcm9vdC5jcmVhdGVjb21tYW5kKCI6OnRrOjptYWM6Ok9wZW5Eb2N1bWVudCIsIGRvT3BlbkZpbGUpCisKK2RlZiBoaWRlVGtDb25zb2xlKHJvb3QpOgorICAgIHJvb3QudGsuY2FsbCgnY29uc29sZScsICdoaWRlJykKKworZGVmIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFJlcGxhY2UgdGhlIFRrIHJvb3QgbWVudSBieSBzb21ldGhpbmcgdGhhdCdzIG1vcmUgYXBwcm9wcmlhdGUgZm9yCisgICAgSURMRS4KKyAgICAiIiIKKyAgICAjIFRoZSBtZW51IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIFRrIHJvb3QgKCIuIikgaXMgYWxzbyB1c2VkIGJ5IEFxdWFUayBmb3IKKyAgICAjIGFsbCB3aW5kb3dzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhIG1lbnUgb2YgdGhlaXIgb3duLiBUaGUgZGVmYXVsdCBtZW51YmFyCisgICAgIyBjb250YWlucyBhIG51bWJlciBvZiBtZW51cywgbm9uZSBvZiB3aGljaCBhcmUgYXBwcm9wcmlhdGUgZm9yIElETEUuIFRoZQorICAgICMgTW9zdCBhbm5veWluZyBvZiB0aG9zZSBpcyBhbiAnQWJvdXQgVGNrL1RrLi4uJyBtZW51IGluIHRoZSBhcHBsaWNhdGlvbgorICAgICMgbWVudS4KKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBkZWZhdWx0IG1lbnViYXIgYnkgYSBtb3N0bHkgZW1wdHkgb25lLCBpdAorICAgICMgc2hvdWxkIG9ubHkgY29udGFpbiB0aGUgY29ycmVjdCBhcHBsaWNhdGlvbiBtZW51IGFuZCB0aGUgd2luZG93IG1lbnUuCisgICAgIworICAgICMgRHVlIHRvIGEgKG1pcy0pZmVhdHVyZSBvZiBUa0FxdWEgdGhlIHVzZXIgd2lsbCBhbHNvIHNlZSBhbiBlbXB0eSBIZWxwCisgICAgIyBtZW51LgorICAgIGZyb20gVGtpbnRlciBpbXBvcnQgTWVudSwgVGV4dCwgVGV4dAorICAgIGZyb20gRWRpdG9yV2luZG93IGltcG9ydCBwcmVwc3RyLCBnZXRfYWNjZWxlcmF0b3IKKyAgICBpbXBvcnQgQmluZGluZ3MKKyAgICBpbXBvcnQgV2luZG93TGlzdAorICAgIGZyb20gTXVsdGlDYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCisKKyAgICBtZW51YmFyID0gTWVudShyb290KQorICAgIHJvb3QuY29uZmlndXJlKG1lbnU9bWVudWJhcikKKyAgICBtZW51ZGljdCA9IHt9CisKKyAgICBtZW51ZGljdFsnd2luZG93cyddID0gbWVudSA9IE1lbnUobWVudWJhciwgbmFtZT0nd2luZG93cycpCisgICAgbWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0nV2luZG93JywgbWVudT1tZW51LCB1bmRlcmxpbmU9MCkKKworICAgIGRlZiBwb3N0d2luZG93c21lbnUobWVudT1tZW51KToKKyAgICAgICAgZW5kID0gbWVudS5pbmRleCgnZW5kJykKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICBlbmQgPSAtMQorCisgICAgICAgIGlmIGVuZCA+IDA6CisgICAgICAgICAgICBtZW51LmRlbGV0ZSgwLCBlbmQpCisgICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgIFdpbmRvd0xpc3QucmVnaXN0ZXJfY2FsbGJhY2socG9zdHdpbmRvd3NtZW51KQorCisgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSdhcHBsZScpCisgICAgbWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0nSURMRScsIG1lbnU9bWVudSkKKworICAgIGRlZiBhYm91dF9kaWFsb2coZXZlbnQ9Tm9uZSk6CisgICAgICAgIGltcG9ydCBhYm91dERpYWxvZworICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCisKKyAgICBkZWYgY29uZmlnX2RpYWxvZyhldmVudD1Ob25lKToKKyAgICAgICAgaW1wb3J0IGNvbmZpZ0RpYWxvZworICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHJvb3QsICdTZXR0aW5ncycpCisKKyAgICByb290LmJpbmQoJzw8YWJvdXQtaWRsZT4+JywgYWJvdXRfZGlhbG9nKQorICAgIHJvb3QuYmluZCgnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicsIGNvbmZpZ19kaWFsb2cpCisgICAgaWYgZmxpc3Q6CisgICAgICAgIHJvb3QuYmluZCgnPDxjbG9zZS1hbGwtd2luZG93cz4+JywgZmxpc3QuY2xvc2VfYWxsX2NhbGxiYWNrKQorCisgICAgZm9yIG1uYW1lLCBlbnRyeWxpc3QgaW4gQmluZGluZ3MubWVudWRlZnM6CisgICAgICAgIG1lbnUgPSBtZW51ZGljdC5nZXQobW5hbWUpCisgICAgICAgIGlmIG5vdCBtZW51OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJ5bGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBlbnRyeToKKyAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsYWJlbCwgZXZlbnRuYW1lID0gZW50cnkKKyAgICAgICAgICAgICAgICB1bmRlcmxpbmUsIGxhYmVsID0gcHJlcHN0cihsYWJlbCkKKyAgICAgICAgICAgICAgICBhY2NlbGVyYXRvciA9IGdldF9hY2NlbGVyYXRvcihCaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudG5hbWUpCisgICAgICAgICAgICAgICAgZGVmIGNvbW1hbmQodGV4dD1yb290LCBldmVudG5hbWU9ZXZlbnRuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5ldmVudF9nZW5lcmF0ZShldmVudG5hbWUpCisgICAgICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD1sYWJlbCwgdW5kZXJsaW5lPXVuZGVybGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9Y29tbWFuZCwgYWNjZWxlcmF0b3I9YWNjZWxlcmF0b3IpCisKKworCisKKworZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKKyAgICAiIiIKKyAgICBQZXJmb3JtIHNldHVwIGZvciB0aGUgT1NYIGFwcGxpY2F0aW9uIGJ1bmRsZS4KKyAgICAiIiIKKyAgICBpZiBub3QgcnVubmluZ0FzT1NYQXBwKCk6IHJldHVybgorCisgICAgaGlkZVRrQ29uc29sZShyb290KQorICAgIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpCisgICAgYWRkT3BlbkV2ZW50U3VwcG9ydChyb290LCBmbGlzdCkKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggYmY3ZjAwNi4uMGI0OThiNSAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTg5LDYgKzg5LDQwIEBACiAgICAgaXMgbm90IGd1YXJhbnRlZWQuIiIiCiAgICAgcmV0dXJuIChoYXNhdHRyKG9iamVjdCwgIl9fc2V0X18iKSBhbmQgaGFzYXR0cihvYmplY3QsICJfX2dldF9fIikpCiAKK2lmIGhhc2F0dHIodHlwZXMsICdNZW1iZXJEZXNjcmlwdG9yVHlwZScpOgorICAgICMgQ1B5dGhvbiBhbmQgZXF1aXZhbGVudAorICAgIGRlZiBpc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1lbWJlciBkZXNjcmlwdG9yLgorCisgICAgICAgIE1lbWJlciBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5NZW1iZXJEZXNjcmlwdG9yVHlwZSkKK2Vsc2U6CisgICAgIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMKKyAgICBkZWYgaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICAgICAgICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCitpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAjIENQeXRob24gYW5kIGVxdWl2YWxlbnQKKyAgICBkZWYgaXNnZXRzZXRkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZXRzZXQgZGVzY3JpcHRvci4KKworICAgICAgICBnZXRzZXQgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuR2V0U2V0RGVzY3JpcHRvclR5cGUpCitlbHNlOgorICAgICMgT3RoZXIgaW1wbGVtZW50YXRpb25zCisgICAgZGVmIGlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCisKKyAgICAgICAgZ2V0c2V0IGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKwogZGVmIGlzZnVuY3Rpb24ob2JqZWN0KToKICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgogCkBAIC0zNTUsNDAgKzM4OSwzOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgIHJldHVybiBmaWxlbmFtZQotICAgICMgVWdseSBidXQgbmVjZXNzYXJ5IC0gJzxzdGRpbj4nIGFuZCAnPHN0cmluZz4nIG1lYW4gdGhhdCBnZXRtb2R1bGUoKQotICAgICMgd291bGQgaW5maW5pdGVseSByZWN1cnNlLCBiZWNhdXNlIHRoZXkncmUgbm90IHJlYWwgZmlsZXMgbm9yIGxvYWRhYmxlCi0gICAgIyBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHdyaXRpbmcgYSBQRVAgMzAyIGxvYWRlciB0aGF0IHVzZXMgJzwnCi0gICAgIyBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlbmFtZSBpcyBub3cgbm90IGEgZ29vZCBpZGVhLiAgOigKLSAgICBpZiBmaWxlbmFtZVs6MV0hPSc8JyBhbmQgaGFzYXR0cihnZXRtb2R1bGUob2JqZWN0KSwgJ19fbG9hZGVyX18nKToKKyAgICAjIG9ubHkgcmV0dXJuIGEgbm9uLWV4aXN0ZW50IGZpbGVuYW1lIGlmIHRoZSBtb2R1bGUgaGFzIGEgUEVQIDMwMiBsb2FkZXIKKyAgICBpZiBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QsIGZpbGVuYW1lKSwgJ19fbG9hZGVyX18nKToKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAKLWRlZiBnZXRhYnNmaWxlKG9iamVjdCk6CitkZWYgZ2V0YWJzZmlsZShvYmplY3QsIF9maWxlbmFtZT1Ob25lKToKICAgICAiIiJSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIG9yIGNvbXBpbGVkIGZpbGUgZm9yIGFuIG9iamVjdC4KIAogICAgIFRoZSBpZGVhIGlzIGZvciBlYWNoIG9iamVjdCB0byBoYXZlIGEgdW5pcXVlIG9yaWdpbiwgc28gdGhpcyByb3V0aW5lCiAgICAgbm9ybWFsaXplcyB0aGUgcmVzdWx0IGFzIG11Y2ggYXMgcG9zc2libGUuIiIiCi0gICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2UoCi0gICAgICAgIG9zLnBhdGguYWJzcGF0aChnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpKSkKKyAgICBpZiBfZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgX2ZpbGVuYW1lID0gZ2V0c291cmNlZmlsZShvYmplY3QpIG9yIGdldGZpbGUob2JqZWN0KQorICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChfZmlsZW5hbWUpKQogCiBtb2R1bGVzYnlmaWxlID0ge30KIAotZGVmIGdldG1vZHVsZShvYmplY3QpOgorZGVmIGdldG1vZHVsZShvYmplY3QsIF9maWxlbmFtZT1Ob25lKToKICAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBhbiBvYmplY3Qgd2FzIGRlZmluZWQgaW4sIG9yIE5vbmUgaWYgbm90IGZvdW5kLiIiIgogICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CiAgICAgICAgIHJldHVybiBvYmplY3QKICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fbW9kdWxlX18nKToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChvYmplY3QuX19tb2R1bGVfXykKICAgICB0cnk6Ci0gICAgICAgIGZpbGUgPSBnZXRhYnNmaWxlKG9iamVjdCkKKyAgICAgICAgZmlsZSA9IGdldGFic2ZpbGUob2JqZWN0LCBfZmlsZW5hbWUpCiAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgcmV0dXJuIE5vbmUKICAgICBpZiBmaWxlIGluIG1vZHVsZXNieWZpbGU6CiAgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtmaWxlXSkKICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgogICAgICAgICBpZiBpc21vZHVsZShtb2R1bGUpIGFuZCBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgICAgICBtb2R1bGVzYnlmaWxlWwotICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRhYnNmaWxlKG1vZHVsZSkpXSA9IG1vZHVsZS5fX25hbWVfXworICAgICAgICAgICAgZiA9IGdldGFic2ZpbGUobW9kdWxlKQorICAgICAgICAgICAgbW9kdWxlc2J5ZmlsZVtmXSA9IG1vZHVsZXNieWZpbGVbCisgICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aChmKV0gPSBtb2R1bGUuX19uYW1lX18KICAgICBpZiBmaWxlIGluIG1vZHVsZXNieWZpbGU6CiAgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtmaWxlXSkKICAgICBtYWluID0gc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10KZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGtpbnRlci5weSBiL0xpYi9saWItdGsvVGtpbnRlci5weQppbmRleCAwYmE5NTRlLi5iMjQ4MDMxIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL1RraW50ZXIucHkKKysrIGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CkBAIC0xNjgsMTggKzE2OCwzMCBAQAogICAgIFN1YmNsYXNzZXMgU3RyaW5nVmFyLCBJbnRWYXIsIERvdWJsZVZhciwgQm9vbGVhblZhciBhcmUgc3BlY2lhbGl6YXRpb25zCiAgICAgdGhhdCBjb25zdHJhaW4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZ2V0KCkuIiIiCiAgICAgX2RlZmF1bHQgPSAiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIHZhcmlhYmxlIHdpdGggYW4gb3B0aW9uYWwgTUFTVEVSIGFzIG1hc3RlciB3aWRnZXQuCi0gICAgICAgIFRoZSB2YXJpYWJsZSBpcyBuYW1lZCBQWV9WQVJfbnVtYmVyIGluIFRjbC4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHZhcmlhYmxlCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gIiIpCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgogICAgICAgICAiIiIKICAgICAgICAgZ2xvYmFsIF92YXJudW0KICAgICAgICAgaWYgbm90IG1hc3RlcjoKICAgICAgICAgICAgIG1hc3RlciA9IF9kZWZhdWx0X3Jvb3QKICAgICAgICAgc2VsZi5fbWFzdGVyID0gbWFzdGVyCiAgICAgICAgIHNlbGYuX3RrID0gbWFzdGVyLnRrCi0gICAgICAgIHNlbGYuX25hbWUgPSAnUFlfVkFSJyArIHJlcHIoX3Zhcm51bSkKLSAgICAgICAgX3Zhcm51bSA9IF92YXJudW0gKyAxCi0gICAgICAgIHNlbGYuc2V0KHNlbGYuX2RlZmF1bHQpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9ICdQWV9WQVInICsgcmVwcihfdmFybnVtKQorICAgICAgICAgICAgX3Zhcm51bSArPSAxCisgICAgICAgIGlmIHZhbHVlICE9IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNldCh2YWx1ZSkKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5fdGsuY2FsbCgiaW5mbyIsICJleGlzdHMiLCBzZWxmLl9uYW1lKToKKyAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuX2RlZmF1bHQpCiAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICIiIlVuc2V0IHRoZSB2YXJpYWJsZSBpbiBUY2wuIiIiCiAgICAgICAgIHNlbGYuX3RrLmdsb2JhbHVuc2V0dmFyKHNlbGYuX25hbWUpCkBAIC0yMTcsMTUgKzIyOSwyOSBAQAogICAgICAgICAiIiJSZXR1cm4gYWxsIHRyYWNlIGNhbGxiYWNrIGluZm9ybWF0aW9uLiIiIgogICAgICAgICByZXR1cm4gbWFwKHNlbGYuX3RrLnNwbGl0LCBzZWxmLl90ay5zcGxpdGxpc3QoCiAgICAgICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2aW5mbyIsIHNlbGYuX25hbWUpKSkKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKD09KS4KKworICAgICAgICBOb3RlOiBpZiB0aGUgVmFyaWFibGUncyBtYXN0ZXIgbWF0dGVycyB0byBiZWhhdmlvcgorICAgICAgICBhbHNvIGNvbXBhcmUgc2VsZi5fbWFzdGVyID09IG90aGVyLl9tYXN0ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyA9PSBvdGhlci5fX2NsYXNzX18uX19uYW1lX18gXAorICAgICAgICAgICAgYW5kIHNlbGYuX25hbWUgPT0gb3RoZXIuX25hbWUKIAogY2xhc3MgU3RyaW5nVmFyKFZhcmlhYmxlKToKICAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIHN0cmluZ3MgdmFyaWFibGVzLiIiIgogICAgIF9kZWZhdWx0ID0gIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgc3RyaW5nIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4iIiIKLSAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAiIikKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQogCiAgICAgZGVmIGdldChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHZhbHVlIG9mIHZhcmlhYmxlIGFzIHN0cmluZy4iIiIKQEAgLTIzNywxMSArMjYzLDE3IEBACiBjbGFzcyBJbnRWYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgaW50ZWdlciB2YXJpYWJsZXMuIiIiCiAgICAgX2RlZmF1bHQgPSAwCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhbiBpbnRlZ2VyIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4iIiIKLSAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAwKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKICAgICAgICAgIiIiU2V0IHRoZSB2YXJpYWJsZSB0byB2YWx1ZSwgY29udmVydGluZyBib29sZWFucyB0byBpbnRlZ2Vycy4iIiIKQEAgLTI1NiwxMSArMjg4LDE3IEBACiBjbGFzcyBEb3VibGVWYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgZmxvYXQgdmFyaWFibGVzLiIiIgogICAgIF9kZWZhdWx0ID0gMC4wCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIGZsb2F0IHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgYSBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIDAuMCkKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQogCiAgICAgZGVmIGdldChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYXMgYSBmbG9hdC4iIiIKQEAgLTI2OCwxMiArMzA2LDE4IEBACiAKIGNsYXNzIEJvb2xlYW5WYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3IgYm9vbGVhbiB2YXJpYWJsZXMuIiIiCi0gICAgX2RlZmF1bHQgPSAiZmFsc2UiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICBfZGVmYXVsdCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgogICAgICAgICAiIiJDb25zdHJ1Y3QgYSBib29sZWFuIHZhcmlhYmxlLgogCi0gICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgYSBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIEZhbHNlKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhIGJvb2wuIiIiCkBAIC0xNDU2LDEwICsxNTAwLDE5IEBACiAgICAgICAgIHRoZSBncm91cCBsZWFkZXIgb2YgdGhpcyB3aWRnZXQgaWYgTm9uZSBpcyBnaXZlbi4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnZ3JvdXAnLCBzZWxmLl93LCBwYXRoTmFtZSkKICAgICBncm91cCA9IHdtX2dyb3VwCi0gICAgZGVmIHdtX2ljb25iaXRtYXAoc2VsZiwgYml0bWFwPU5vbmUpOgorICAgIGRlZiB3bV9pY29uYml0bWFwKHNlbGYsIGJpdG1hcD1Ob25lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAiIiJTZXQgYml0bWFwIGZvciB0aGUgaWNvbmlmaWVkIHdpZGdldCB0byBCSVRNQVAuIFJldHVybgotICAgICAgICB0aGUgYml0bWFwIGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCBiaXRtYXApCisgICAgICAgIHRoZSBiaXRtYXAgaWYgTm9uZSBpcyBnaXZlbi4KKworICAgICAgICBVbmRlciBXaW5kb3dzLCB0aGUgREVGQVVMVCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpY29uCisgICAgICAgIGZvciB0aGUgd2lkZ2V0IGFuZCBhbnkgZGVzY2VuZGVudHMgdGhhdCBkb24ndCBoYXZlIGFuIGljb24gc2V0CisgICAgICAgIGV4cGxpY2l0bHkuICBERUZBVUxUIGNhbiBiZSB0aGUgcmVsYXRpdmUgcGF0aCB0byBhIC5pY28gZmlsZQorICAgICAgICAoZXhhbXBsZTogcm9vdC5pY29uYml0bWFwKGRlZmF1bHQ9J215aWNvbi5pY28nKSApLiAgU2VlIFRrCisgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIGlmIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdpY29uYml0bWFwJywgc2VsZi5fdywgJy1kZWZhdWx0JywgZGVmYXVsdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCBiaXRtYXApCiAgICAgaWNvbmJpdG1hcCA9IHdtX2ljb25iaXRtYXAKICAgICBkZWYgd21faWNvbmlmeShzZWxmKToKICAgICAgICAgIiIiRGlzcGxheSB3aWRnZXQgYXMgaWNvbi4iIiIKQEAgLTE4ODAsOSArMTkzMyw5IEBACiAgICAgZGVmIGRlc3Ryb3koc2VsZik6CiAgICAgICAgICIiIkRlc3Ryb3kgdGhpcyBhbmQgYWxsIGRlc2NlbmRhbnRzIHdpZGdldHMuIiIiCiAgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW4udmFsdWVzKCk6IGMuZGVzdHJveSgpCisgICAgICAgIHNlbGYudGsuY2FsbCgnZGVzdHJveScsIHNlbGYuX3cpCiAgICAgICAgIGlmIHNlbGYubWFzdGVyLmNoaWxkcmVuLmhhc19rZXkoc2VsZi5fbmFtZSk6CiAgICAgICAgICAgICBkZWwgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0KLSAgICAgICAgc2VsZi50ay5jYWxsKCdkZXN0cm95Jywgc2VsZi5fdykKICAgICAgICAgTWlzYy5kZXN0cm95KHNlbGYpCiAgICAgZGVmIF9kbyhzZWxmLCBuYW1lLCBhcmdzPSgpKToKICAgICAgICAgIyBYWFggT2Jzb2xldGUgLS0gYmV0dGVyIHVzZSBzZWxmLnRrLmNhbGwgZGlyZWN0bHkhCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3RrTWVzc2FnZUJveC5weSBiL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CmluZGV4IDI1MDcxZmUuLmFmZjA2OWIgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CisrKyBiL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5CkBAIC02Myw5ICs2MywxMCBAQAogIwogIyBjb252ZW5pZW5jZSBzdHVmZgogCi1kZWYgX3Nob3codGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCBpY29uPU5vbmUsIHR5cGU9Tm9uZSwgKipvcHRpb25zKToKLSAgICBpZiBpY29uOiAgICBvcHRpb25zWyJpY29uIl0gPSBpY29uCi0gICAgaWYgdHlwZTogICAgb3B0aW9uc1sidHlwZSJdID0gdHlwZQorIyBSZW5hbWUgX2ljb24gYW5kIF90eXBlIG9wdGlvbnMgdG8gYWxsb3cgb3ZlcnJpZGluZyB0aGVtIGluIG9wdGlvbnMKK2RlZiBfc2hvdyh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsIF9pY29uPU5vbmUsIF90eXBlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgaWYgX2ljb24gYW5kICJpY29uIiBub3QgaW4gb3B0aW9uczogICAgb3B0aW9uc1siaWNvbiJdID0gX2ljb24KKyAgICBpZiBfdHlwZSBhbmQgInR5cGUiIG5vdCBpbiBvcHRpb25zOiAgICBvcHRpb25zWyJ0eXBlIl0gPSBfdHlwZQogICAgIGlmIHRpdGxlOiAgIG9wdGlvbnNbInRpdGxlIl0gPSB0aXRsZQogICAgIGlmIG1lc3NhZ2U6IG9wdGlvbnNbIm1lc3NhZ2UiXSA9IG1lc3NhZ2UKICAgICByZXMgPSBNZXNzYWdlKCoqb3B0aW9ucykuc2hvdygpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3R1cnRsZS5weSBiL0xpYi9saWItdGsvdHVydGxlLnB5CmluZGV4IGQ2OGU0MDUuLjAxYTU1YjEgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdHVydGxlLnB5CisrKyBiL0xpYi9saWItdGsvdHVydGxlLnB5CkBAIC0zMCw2ICszMCw3IEBACiAgICAgICAgIHNlbGYuX3RyYWNpbmcgPSAxCiAgICAgICAgIHNlbGYuX2Fycm93ID0gMAogICAgICAgICBzZWxmLl9kZWxheSA9IDEwICAgICAjIGRlZmF1bHQgZGVsYXkgZm9yIGRyYXdpbmcKKyAgICAgICAgc2VsZi5fYW5nbGUgPSAwLjAKICAgICAgICAgc2VsZi5kZWdyZWVzKCkKICAgICAgICAgc2VsZi5yZXNldCgpCiAKQEAgLTM5LDYgKzQwLDEwIEBACiAgICAgICAgIEV4YW1wbGU6CiAgICAgICAgID4+PiB0dXJ0bGUuZGVncmVlcygpCiAgICAgICAgICIiIgorICAgICAgICAjIERvbid0IHRyeSB0byBjaGFuZ2UgX2FuZ2xlIGlmIGl0IGlzIDAsIGJlY2F1c2UKKyAgICAgICAgIyBfZnVsbGNpcmNsZSBtaWdodCBub3QgYmUgc2V0LCB5ZXQKKyAgICAgICAgaWYgc2VsZi5fYW5nbGU6CisgICAgICAgICAgICBzZWxmLl9hbmdsZSA9IChzZWxmLl9hbmdsZSAvIHNlbGYuX2Z1bGxjaXJjbGUpICogZnVsbGNpcmNsZQogICAgICAgICBzZWxmLl9mdWxsY2lyY2xlID0gZnVsbGNpcmNsZQogICAgICAgICBzZWxmLl9pbnZyYWRpYW4gPSBwaSAvIChmdWxsY2lyY2xlICogMC41KQogCkBAIC04MSw3ICs4Niw2IEBACiAgICAgICAgIHNlbGYuX2NvbG9yID0gImJsYWNrIgogICAgICAgICBzZWxmLl9maWxsaW5nID0gMAogICAgICAgICBzZWxmLl9wYXRoID0gW10KLSAgICAgICAgc2VsZi5fdG9maWxsID0gW10KICAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgIGNhbnZhcy5fcm9vdCgpLnRrcmFpc2UoKQogCkBAIC0zMDEsMTkgKzMwNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZpbGwnOiBzZWxmLl9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbW9vdGgnOiBzbW9vdGh9KQogICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQotICAgICAgICAgICAgICAgIGlmIHNlbGYuX3RvZmlsbDoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fdG9maWxsOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FudmFzLml0ZW1jb25maWd1cmUoaXRlbSwgZmlsbD1zZWxmLl9jb2xvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICBzZWxmLl9wYXRoID0gW10KLSAgICAgICAgc2VsZi5fdG9maWxsID0gW10KICAgICAgICAgc2VsZi5fZmlsbGluZyA9IGZsYWcKICAgICAgICAgaWYgZmxhZzoKICAgICAgICAgICAgIHNlbGYuX3BhdGguYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQotICAgICAgICBzZWxmLmZvcndhcmQoMCkKIAogICAgIGRlZiBiZWdpbl9maWxsKHNlbGYpOgogICAgICAgICAiIiIgQ2FsbGVkIGp1c3QgYmVmb3JlIGRyYXdpbmcgYSBzaGFwZSB0byBiZSBmaWxsZWQuCisgICAgICAgICAgICBNdXN0IGV2ZW50dWFsbHkgYmUgZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIGVuZF9maWxsKCkgY2FsbC4KKyAgICAgICAgICAgIE90aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCiAKICAgICAgICAgRXhhbXBsZToKICAgICAgICAgPj4+IHR1cnRsZS5iZWdpbl9maWxsKCkKQEAgLTMyNiw3ICszMjYsOCBAQAogICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQogICAgICAgICA+Pj4gdHVydGxlLmVuZF9maWxsKCkKICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuZmlsbCgxKQorICAgICAgICBzZWxmLl9wYXRoID0gW3NlbGYuX3Bvc2l0aW9uXQorICAgICAgICBzZWxmLl9maWxsaW5nID0gMQogCiAgICAgZGVmIGVuZF9maWxsKHNlbGYpOgogICAgICAgICAiIiIgQ2FsbGVkIGFmdGVyIGRyYXdpbmcgYSBzaGFwZSB0byBiZSBmaWxsZWQuCkBAIC0zNDQsNyArMzQ1LDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZmlsbCgwKQogCi0gICAgZGVmIGNpcmNsZShzZWxmLCByYWRpdXMsIGV4dGVudD1Ob25lKToKKyAgICBkZWYgY2lyY2xlKHNlbGYsIHJhZGl1cywgZXh0ZW50ID0gTm9uZSk6CiAgICAgICAgICIiIiBEcmF3IGEgY2lyY2xlIHdpdGggZ2l2ZW4gcmFkaXVzLgogICAgICAgICBUaGUgY2VudGVyIGlzIHJhZGl1cyB1bml0cyBsZWZ0IG9mIHRoZSB0dXJ0bGU7IGV4dGVudAogICAgICAgICBkZXRlcm1pbmVzIHdoaWNoIHBhcnQgb2YgdGhlIGNpcmNsZSBpcyBkcmF3bi4gSWYgbm90IGdpdmVuLApAQCAtMzYxLDUyICszNjIsMTggQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIGV4dGVudCBpcyBOb25lOgogICAgICAgICAgICAgZXh0ZW50ID0gc2VsZi5fZnVsbGNpcmNsZQotICAgICAgICB4MCwgeTAgPSBzZWxmLl9wb3NpdGlvbgotICAgICAgICB4YyA9IHgwIC0gcmFkaXVzICogc2luKHNlbGYuX2FuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICB5YyA9IHkwIC0gcmFkaXVzICogY29zKHNlbGYuX2FuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICBpZiByYWRpdXMgPj0gMC4wOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSAtIChzZWxmLl9mdWxsY2lyY2xlIC8gNC4wKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSArIChzZWxmLl9mdWxsY2lyY2xlIC8gNC4wKQotICAgICAgICAgICAgZXh0ZW50ID0gLWV4dGVudAotICAgICAgICBpZiBzZWxmLl9maWxsaW5nOgotICAgICAgICAgICAgaWYgYWJzKGV4dGVudCkgPj0gc2VsZi5fZnVsbGNpcmNsZToKLSAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9vdmFsKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9IiIpCi0gICAgICAgICAgICAgICAgc2VsZi5fdG9maWxsLmFwcGVuZChpdGVtKQotICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2NhbnZhcy5jcmVhdGVfYXJjKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjK3JhZGl1cywgeWMrcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJjaG9yZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50PWV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSIiKQotICAgICAgICAgICAgc2VsZi5fdG9maWxsLmFwcGVuZChpdGVtKQotICAgICAgICBpZiBzZWxmLl9kcmF3aW5nOgotICAgICAgICAgICAgaWYgYWJzKGV4dGVudCkgPj0gc2VsZi5fZnVsbGNpcmNsZToKLSAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9vdmFsKHhjLXJhZGl1cywgeWMtcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9c2VsZi5fY29sb3IpCi0gICAgICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9hcmMoeGMtcmFkaXVzLCB5Yy1yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImFyYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50PWV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1zZWxmLl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPXNlbGYuX2NvbG9yKQotICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgIGFuZ2xlID0gc3RhcnQgKyBleHRlbnQKLSAgICAgICAgeDEgPSB4YyArIGFicyhyYWRpdXMpICogY29zKGFuZ2xlICogc2VsZi5faW52cmFkaWFuKQotICAgICAgICB5MSA9IHljIC0gYWJzKHJhZGl1cykgKiBzaW4oYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCi0gICAgICAgIHNlbGYuX2FuZ2xlID0gKHNlbGYuX2FuZ2xlICsgZXh0ZW50KSAlIHNlbGYuX2Z1bGxjaXJjbGUKLSAgICAgICAgc2VsZi5fcG9zaXRpb24gPSB4MSwgeTEKLSAgICAgICAgaWYgc2VsZi5fZmlsbGluZzoKLSAgICAgICAgICAgIHNlbGYuX3BhdGguYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQotICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCisgICAgICAgIGZyYWMgPSBhYnMoZXh0ZW50KS9zZWxmLl9mdWxsY2lyY2xlCisgICAgICAgIHN0ZXBzID0gMStpbnQobWluKDExK2FicyhyYWRpdXMpLzYuMCwgNTkuMCkqZnJhYykKKyAgICAgICAgdyA9IDEuMCAqIGV4dGVudCAvIHN0ZXBzCisgICAgICAgIHcyID0gMC41ICogdworICAgICAgICBsID0gMi4wICogcmFkaXVzICogc2luKHcyKnNlbGYuX2ludnJhZGlhbikKKyAgICAgICAgaWYgcmFkaXVzIDwgMDoKKyAgICAgICAgICAgIGwsIHcsIHcyID0gLWwsIC13LCAtdzIKKyAgICAgICAgc2VsZi5sZWZ0KHcyKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzdGVwcyk6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQobCkKKyAgICAgICAgICAgIHNlbGYubGVmdCh3KQorICAgICAgICBzZWxmLnJpZ2h0KHcyKQogCiAgICAgZGVmIGhlYWRpbmcoc2VsZik6CiAgICAgICAgICIiIiBSZXR1cm4gdGhlIHR1cnRsZSdzIGN1cnJlbnQgaGVhZGluZy4KQEAgLTYzNCw2ICs2MDEsNyBAQAogCiAgICAgZGVmIF9kcmF3X3R1cnRsZShzZWxmLCBwb3NpdGlvbj1bXSk6CiAgICAgICAgIGlmIG5vdCBzZWxmLl90cmFjaW5nOgorICAgICAgICAgICAgc2VsZi5fY2FudmFzLnVwZGF0ZSgpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgcG9zaXRpb24gPT0gW106CiAgICAgICAgICAgICBwb3NpdGlvbiA9IHNlbGYuX3Bvc2l0aW9uCkBAIC02NzgsNyArNjQ2LDcgQEAKICAgICAgICAgICAgIF9jYW52YXMgPSBUa2ludGVyLkNhbnZhcyhfcm9vdCwgYmFja2dyb3VuZD0id2hpdGUiKQogICAgICAgICAgICAgX2NhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKIAotICAgICAgICBzZXR1cCh3aWR0aD1fd2lkdGgsIGhlaWdodD0gX2hlaWdodCwgc3RhcnR4PV9zdGFydHgsIHN0YXJ0eT1fc3RhcnR5KQorICAgICAgICAgICAgc2V0dXAod2lkdGg9X3dpZHRoLCBoZWlnaHQ9IF9oZWlnaHQsIHN0YXJ0eD1fc3RhcnR4LCBzdGFydHk9X3N0YXJ0eSkKIAogICAgICAgICBSYXdQZW4uX19pbml0X18oc2VsZiwgX2NhbnZhcykKIApAQCAtNzIwLDcgKzY4OCw3IEBACiBkZWYgd3JpdGUoYXJnLCBtb3ZlPTApOiBfZ2V0cGVuKCkud3JpdGUoYXJnLCBtb3ZlKQogZGVmIGZpbGwoZmxhZyk6IF9nZXRwZW4oKS5maWxsKGZsYWcpCiBkZWYgYmVnaW5fZmlsbCgpOiBfZ2V0cGVuKCkuYmVnaW5fZmlsbCgpCi1kZWYgZW5kX2ZpbGwoKTogX2dldHBlbi5lbmRfZmlsbCgpCitkZWYgZW5kX2ZpbGwoKTogX2dldHBlbigpLmVuZF9maWxsKCkKIGRlZiBjaXJjbGUocmFkaXVzLCBleHRlbnQ9Tm9uZSk6IF9nZXRwZW4oKS5jaXJjbGUocmFkaXVzLCBleHRlbnQpCiBkZWYgZ290bygqYXJncyk6IF9nZXRwZW4oKS5nb3RvKCphcmdzKQogZGVmIGhlYWRpbmcoKTogcmV0dXJuIF9nZXRwZW4oKS5oZWFkaW5nKCkKQEAgLTc0NSw3ICs3MTMsNyBAQAogZGVmIHNldHVwKCoqZ2VvbWV0cnkpOgogICAgICIiIiBTZXRzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgbWFpbiB3aW5kb3cuCiAKLSAgICBLZXl3b3JkcyBhcmUgd2lkdGgsIGhlaWdodCwgc3RhcnR4IGFuZCBzdGFydHkKKyAgICBLZXl3b3JkcyBhcmUgd2lkdGgsIGhlaWdodCwgc3RhcnR4IGFuZCBzdGFydHk6CiAKICAgICB3aWR0aDogZWl0aGVyIGEgc2l6ZSBpbiBwaXhlbHMgb3IgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgogICAgICAgRGVmYXVsdCBpcyA1MCUgb2Ygc2NyZWVuLgpAQCAtODIwLDcgKzc4OCw3IEBACiAgICAgICAgIF9yb290Lmdlb21ldHJ5KCIlZHglZCslZCslZCIgJSAoX3dpZHRoLCBfaGVpZ2h0LCBfc3RhcnR4LCBfc3RhcnR5KSkKIAogZGVmIHRpdGxlKHRpdGxlKToKLSAgICAiIiIgc2V0IHRoZSB3aW5kb3cgdGl0bGUuCisgICAgIiIiU2V0IHRoZSB3aW5kb3cgdGl0bGUuCiAKICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvICdUdXJ0bGUgR3JhcGhpY3MnCiAKQEAgLTkyOSwxNSArODk3LDMwIEBACiAgICAgICAgICAgICBzcGVlZChzcGVlZHNbc3BdKQogICAgIGNvbG9yKDAuMjUsMCwwLjc1KQogICAgIGZpbGwoMCkKLSAgICBjb2xvcigiZ3JlZW4iKQogCi0gICAgbGVmdCgxMzApCisgICAgIyBkcmF3IGFuZCBmaWxsIGEgY29uY2F2ZSBzaGFwZQorICAgIGxlZnQoMTIwKQogICAgIHVwKCkKLSAgICBmb3J3YXJkKDkwKQorICAgIGZvcndhcmQoNzApCisgICAgcmlnaHQoMzApCisgICAgZG93bigpCiAgICAgY29sb3IoInJlZCIpCi0gICAgc3BlZWQoJ2Zhc3Rlc3QnKQorICAgIHNwZWVkKCJmYXN0ZXN0IikKKyAgICBmaWxsKDEpCisgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgIGNpcmNsZSg1MCw5MCkKKyAgICAgICAgcmlnaHQoOTApCisgICAgICAgIGZvcndhcmQoMzApCisgICAgICAgIHJpZ2h0KDkwKQorICAgIGNvbG9yKCJ5ZWxsb3ciKQorICAgIGZpbGwoMCkKKyAgICBsZWZ0KDkwKQorICAgIHVwKCkKKyAgICBmb3J3YXJkKDMwKQogICAgIGRvd24oKTsKIAorICAgIGNvbG9yKCJyZWQiKQorCiAgICAgIyBjcmVhdGUgYSBzZWNvbmQgdHVydGxlIGFuZCBtYWtlIHRoZSBvcmlnaW5hbCBwdXJzdWUgYW5kIGNhdGNoIGl0CiAgICAgdHVydGxlPVR1cnRsZSgpCiAgICAgdHVydGxlLnJlc2V0KCkKZGlmZiAtLWdpdCBhL0xpYi9saW5lY2FjaGUucHkgYi9MaWIvbGluZWNhY2hlLnB5CmluZGV4IGY0OTY5NWEuLjQ4Mzg2MjUgMTAwNjQ0Ci0tLSBhL0xpYi9saW5lY2FjaGUucHkKKysrIGIvTGliL2xpbmVjYWNoZS5weQpAQCAtOTQsNiArOTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBsdWNrLCB0aGUgUEVQMzAyIGxvYWRlciBjYW5ub3QgZmluZCB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhpcyBtb2R1bGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5lKydcbicgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCldLCBmdWxsbmFtZQpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvY29uZmlnLnB5IGIvTGliL2xvZ2dpbmcvY29uZmlnLnB5CmluZGV4IDQ1N2VjNWMuLjFkNWY4YzQgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2NvbmZpZy5weQorKysgYi9MaWIvbG9nZ2luZy9jb25maWcucHkKQEAgLTc5LDYgKzc5LDcgQEAKICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCiAgICAgdHJ5OgogICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCisgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJMaXN0ID0gW10KICAgICAgICAgIyBIYW5kbGVycyBhZGQgdGhlbXNlbHZlcyB0byBsb2dnaW5nLl9oYW5kbGVycwogICAgICAgICBoYW5kbGVycyA9IF9pbnN0YWxsX2hhbmRsZXJzKGNwLCBmb3JtYXR0ZXJzKQogICAgICAgICBfaW5zdGFsbF9sb2dnZXJzKGNwLCBoYW5kbGVycykKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5IGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKaW5kZXggZTBkYTI1NC4uMzU1Mjk1MCAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKKysrIGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKQEAgLTEyOCwxMiArMTI4LDcgQEAKICAgICAgICAgICAgIGRmbiA9IHNlbGYuYmFzZUZpbGVuYW1lICsgIi4xIgogICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGZuKToKICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQotICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKyAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQogICAgICAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gY29kZWNzLm9wZW4oc2VsZi5iYXNlRmlsZW5hbWUsICd3Jywgc2VsZi5lbmNvZGluZykKQEAgLTI3MywxMiArMjY4LDcgQEAKICAgICAgICAgZGZuID0gc2VsZi5iYXNlRmlsZW5hbWUgKyAiLiIgKyB0aW1lLnN0cmZ0aW1lKHNlbGYuc3VmZml4LCB0aW1lVHVwbGUpCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CiAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKLSAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICByYWlzZQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKyAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCiAgICAgICAgIGlmIHNlbGYuYmFja3VwQ291bnQgPiAwOgogICAgICAgICAgICAgIyBmaW5kIHRoZSBvbGRlc3QgbG9nIGZpbGUgYW5kIGRlbGV0ZSBpdAogICAgICAgICAgICAgcyA9IGdsb2IuZ2xvYihzZWxmLmJhc2VGaWxlbmFtZSArICIuMjAqIikKQEAgLTU3Miw2ICs1NjIsMTggQEAKICAgICAgICAgImxvY2FsNyI6ICAgTE9HX0xPQ0FMNywKICAgICAgICAgfQogCisgICAgI1RoZSBtYXAgYmVsb3cgYXBwZWFycyB0byBiZSB0cml2aWFsbHkgbG93ZXJjYXNpbmcgdGhlIGtleS4gSG93ZXZlciwKKyAgICAjdGhlcmUncyBtb3JlIHRvIGl0IHRoYW4gbWVldHMgdGhlIGV5ZSAtIGluIHNvbWUgbG9jYWxlcywgbG93ZXJjYXNpbmcKKyAgICAjZ2l2ZXMgdW5leHBlY3RlZCByZXN1bHRzLiBTZWUgU0YgIzE1MjQwODE6IGluIHRoZSBUdXJraXNoIGxvY2FsZSwKKyAgICAjIklORk8iLmxvd2VyKCkgIT0gImluZm8iCisgICAgcHJpb3JpdHlfbWFwID0geworICAgICAgICAiREVCVUciIDogImRlYnVnIiwKKyAgICAgICAgIklORk8iIDogImluZm8iLAorICAgICAgICAiV0FSTklORyIgOiAid2FybmluZyIsCisgICAgICAgICJFUlJPUiIgOiAiZXJyb3IiLAorICAgICAgICAiQ1JJVElDQUwiIDogImNyaXRpY2FsIgorICAgIH0KKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzPSgnbG9jYWxob3N0JywgU1lTTE9HX1VEUF9QT1JUKSwgZmFjaWxpdHk9TE9HX1VTRVIpOgogICAgICAgICAiIiIKICAgICAgICAgSW5pdGlhbGl6ZSBhIGhhbmRsZXIuCkBAIC02MDgsNyArNjEwLDcgQEAKICAgICAjICAgbmVjZXNzYXJ5LgogICAgIGxvZ19mb3JtYXRfc3RyaW5nID0gJzwlZD4lc1wwMDAnCiAKLSAgICBkZWYgZW5jb2RlUHJpb3JpdHkgKHNlbGYsIGZhY2lsaXR5LCBwcmlvcml0eSk6CisgICAgZGVmIGVuY29kZVByaW9yaXR5KHNlbGYsIGZhY2lsaXR5LCBwcmlvcml0eSk6CiAgICAgICAgICIiIgogICAgICAgICBFbmNvZGUgdGhlIGZhY2lsaXR5IGFuZCBwcmlvcml0eS4gWW91IGNhbiBwYXNzIGluIHN0cmluZ3Mgb3IKICAgICAgICAgaW50ZWdlcnMgLSBpZiBzdHJpbmdzIGFyZSBwYXNzZWQsIHRoZSBmYWNpbGl0eV9uYW1lcyBhbmQKQEAgLTYyOSw2ICs2MzEsMTYgQEAKICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKICAgICAgICAgbG9nZ2luZy5IYW5kbGVyLmNsb3NlKHNlbGYpCiAKKyAgICBkZWYgbWFwUHJpb3JpdHkoc2VsZiwgbGV2ZWxOYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcCBhIGxvZ2dpbmcgbGV2ZWwgbmFtZSB0byBhIGtleSBpbiB0aGUgcHJpb3JpdHlfbmFtZXMgbWFwLgorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpbiB0d28gc2NlbmFyaW9zOiB3aGVuIGN1c3RvbSBsZXZlbHMgYXJlIGJlaW5nCisgICAgICAgIHVzZWQsIGFuZCBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgY2FuJ3QgZG8gYSBzdHJhaWdodGZvcndhcmQKKyAgICAgICAgbWFwcGluZyBieSBsb3dlcmNhc2luZyB0aGUgbG9nZ2luZyBsZXZlbCBuYW1lIGJlY2F1c2Ugb2YgbG9jYWxlLQorICAgICAgICBzcGVjaWZpYyBpc3N1ZXMgKHNlZSBTRiAjMTUyNDA4MSkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcmlvcml0eV9tYXAuZ2V0KGxldmVsTmFtZSwgIndhcm5pbmciKQorCiAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKICAgICAgICAgIiIiCiAgICAgICAgIEVtaXQgYSByZWNvcmQuCkBAIC02NDMsOCArNjU1LDggQEAKICAgICAgICAgIiIiCiAgICAgICAgIG1zZyA9IHNlbGYubG9nX2Zvcm1hdF9zdHJpbmcgJSAoCiAgICAgICAgICAgICBzZWxmLmVuY29kZVByaW9yaXR5KHNlbGYuZmFjaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5sb3dlcihyZWNvcmQubGV2ZWxuYW1lKSksCi0gICAgICAgICAgICBtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFwUHJpb3JpdHkocmVjb3JkLmxldmVsbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYudW5peHNvY2tldDoKICAgICAgICAgICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvbWFpbGJveC5weSBiL0xpYi9tYWlsYm94LnB5CmluZGV4IGJiMTE1ZTEuLmI3MjEyOGIgMTAwNzU1Ci0tLSBhL0xpYi9tYWlsYm94LnB5CisrKyBiL0xpYi9tYWlsYm94LnB5CkBAIC0xNSw3ICsxNSwxMCBAQAogaW1wb3J0IHJmYzgyMgogaW1wb3J0IFN0cmluZ0lPCiB0cnk6Ci0gICAgaW1wb3J0IGZuY3RsCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICAjIE9TLzIgRU1YIGZjbnRsKCkgbm90IGFkZXF1YXRlCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisgICAgaW1wb3J0IGZjbnRsCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgZmNudGwgPSBOb25lCiAKQEAgLTU2NSw3ICs1NjgsOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6Ci0gICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUIG9yIFwKKyAgICAgICAgICAgICAgKG9zLm5hbWUgPT0gJ29zMicgYW5kIGUuZXJybm8gPT0gZXJybm8uRUFDQ0VTKToKICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5fcGF0aCkKICAgICAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKICAgICAgICAgICAgIGVsc2U6CkBAIC0xMDMwLDYgKzEwMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKHByZXYgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbm5vdCB1bmxpbmsgYW4gb3BlbiBmaWxlIG9uIE9TLzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQpAQCAtMTc5OCwyNiArMTgwNSwxOCBAQAogCiAKIGRlZiBfbG9ja19maWxlKGYsIGRvdGxvY2s9VHJ1ZSk6Ci0gICAgIiIiTG9jayBmaWxlIGYgdXNpbmcgbG9ja2YsIGZsb2NrLCBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgIiIiTG9jayBmaWxlIGYgdXNpbmcgbG9ja2YgYW5kIGRvdCBsb2NraW5nLiIiIgogICAgIGRvdGxvY2tfZG9uZSA9IEZhbHNlCiAgICAgdHJ5OgogICAgICAgICBpZiBmY250bDoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgotICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUFHQUlOOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVBR0FJTiwgZXJybm8uRUFDQ0VTKToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdsb2NrZjogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfRVggfCBmY250bC5MT0NLX05CKQotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FV09VTERCTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdmbG9jazogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICBpZiBkb3Rsb2NrOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHByZV9sb2NrID0gX2NyZWF0ZV90ZW1wb3JhcnkoZi5uYW1lICsgJy5sb2NrJykKQEAgLTE4MzYsNyArMTgzNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwcmVfbG9jay5uYW1lLCBmLm5hbWUgKyAnLmxvY2snKQogICAgICAgICAgICAgICAgICAgICBkb3Rsb2NrX2RvbmUgPSBUcnVlCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVCBvciBcCisgICAgICAgICAgICAgICAgICAob3MubmFtZSA9PSAnb3MyJyBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUNDRVMpOgogICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocHJlX2xvY2submFtZSkKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdkb3QgbG9jayB1bmF2YWlsYWJsZTogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKQEAgLTE4NDUsMTYgKzE4NDUsMTQgQEAKICAgICBleGNlcHQ6CiAgICAgICAgIGlmIGZjbnRsOgogICAgICAgICAgICAgZmNudGwubG9ja2YoZiwgZmNudGwuTE9DS19VTikKLSAgICAgICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCiAgICAgICAgIGlmIGRvdGxvY2tfZG9uZToKICAgICAgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQogICAgICAgICByYWlzZQogCiBkZWYgX3VubG9ja19maWxlKGYpOgotICAgICIiIlVubG9jayBmaWxlIGYgdXNpbmcgbG9ja2YsIGZsb2NrLCBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgIiIiVW5sb2NrIGZpbGUgZiB1c2luZyBsb2NrZiBhbmQgZG90IGxvY2tpbmcuIiIiCiAgICAgaWYgZmNudGw6CiAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfVU4pCi0gICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCiAgICAgaWYgb3MucGF0aC5leGlzdHMoZi5uYW1lICsgJy5sb2NrJyk6CiAgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQogCmRpZmYgLS1naXQgYS9MaWIvbWltZXR5cGVzLnB5IGIvTGliL21pbWV0eXBlcy5weQppbmRleCBiZWUyZmY3Li5iMGQyZjE4IDEwMDY0NAotLS0gYS9MaWIvbWltZXR5cGVzLnB5CisrKyBiL0xpYi9taW1ldHlwZXMucHkKQEAgLTMzLDYgKzMzLDEwIEBACiAKIGtub3duZmlsZXMgPSBbCiAgICAgIi9ldGMvbWltZS50eXBlcyIsCisgICAgIi9ldGMvaHR0cGQvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICAgICAjIE1hYyBPUyBYCisgICAgIi9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAjIEFwYWNoZQorICAgICIvZXRjL2FwYWNoZS9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAgIyBBcGFjaGUgMQorICAgICIvZXRjL2FwYWNoZTIvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICAgIyBBcGFjaGUgMgogICAgICIvdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLAogICAgICIvdXNyL2xvY2FsL2xpYi9uZXRzY2FwZS9taW1lLnR5cGVzIiwKICAgICAiL3Vzci9sb2NhbC9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwgICAgICMgQXBhY2hlIDEuMgpkaWZmIC0tZ2l0IGEvTGliL21zaWxpYi9fX2luaXRfXy5weSBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKaW5kZXggMDg4MTQwOS4uNGJlODJiMCAxMDA2NDQKLS0tIGEvTGliL21zaWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAgICAgc2VsZi5maWxlbmFtZXMgPSBzZXRzLlNldCgpCiAgICAgICAgIHNlbGYuaW5kZXggPSAwCiAKLSAgICBkZWYgZ2VuX2lkKHNlbGYsIGRpciwgZmlsZSk6CisgICAgZGVmIGdlbl9pZChzZWxmLCBmaWxlKToKICAgICAgICAgbG9naWNhbCA9IF9sb2dpY2FsID0gbWFrZV9pZChmaWxlKQogICAgICAgICBwb3MgPSAxCiAgICAgICAgIHdoaWxlIGxvZ2ljYWwgaW4gc2VsZi5maWxlbmFtZXM6CkBAIC0xOTYsOSArMTk2LDExIEBACiAgICAgICAgIHNlbGYuZmlsZW5hbWVzLmFkZChsb2dpY2FsKQogICAgICAgICByZXR1cm4gbG9naWNhbAogCi0gICAgZGVmIGFwcGVuZChzZWxmLCBmdWxsLCBsb2dpY2FsKToKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGZ1bGwsIGZpbGUsIGxvZ2ljYWwpOgogICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGwpOgogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBsb2dpY2FsOgorICAgICAgICAgICAgbG9naWNhbCA9IHNlbGYuZ2VuX2lkKGZpbGUpCiAgICAgICAgIHNlbGYuaW5kZXggKz0gMQogICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZCgoZnVsbCwgbG9naWNhbCkpCiAgICAgICAgIHJldHVybiBzZWxmLmluZGV4LCBsb2dpY2FsCkBAIC0zMjgsNyArMzMwLDcgQEAKICAgICAgICAgICAgIGxvZ2ljYWwgPSBzZWxmLmtleWZpbGVzW2ZpbGVdCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBsb2dpY2FsID0gTm9uZQotICAgICAgICBzZXF1ZW5jZSwgbG9naWNhbCA9IHNlbGYuY2FiLmFwcGVuZChhYnNvbHV0ZSwgbG9naWNhbCkKKyAgICAgICAgc2VxdWVuY2UsIGxvZ2ljYWwgPSBzZWxmLmNhYi5hcHBlbmQoYWJzb2x1dGUsIGZpbGUsIGxvZ2ljYWwpCiAgICAgICAgIGFzc2VydCBsb2dpY2FsIG5vdCBpbiBzZWxmLmlkcwogICAgICAgICBzZWxmLmlkcy5hZGQobG9naWNhbCkKICAgICAgICAgc2hvcnQgPSBzZWxmLm1ha2Vfc2hvcnQoZmlsZSkKQEAgLTQwMyw3ICs0MDUsNyBAQAogICAgICAgICAgICAgICAgICBbKHNlbGYuZGxnLm5hbWUsIHNlbGYubmFtZSwgZXZlbnQsIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgb3JkZXJpbmcpXSkKIAotICAgIGRlZiBtYXBwaW5nKHNlbGYsIG1hcHBpbmcsIGF0dHJpYnV0ZSk6CisgICAgZGVmIG1hcHBpbmcoc2VsZiwgZXZlbnQsIGF0dHJpYnV0ZSk6CiAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGxnLmRiLCAiRXZlbnRNYXBwaW5nIiwKICAgICAgICAgICAgICAgICAgWyhzZWxmLmRsZy5uYW1lLCBzZWxmLm5hbWUsIGV2ZW50LCBhdHRyaWJ1dGUpXSkKIApkaWZmIC0tZ2l0IGEvTGliL29wdHBhcnNlLnB5IGIvTGliL29wdHBhcnNlLnB5CmluZGV4IDZiOGY1ZDEuLjYyZDJmN2UgMTAwNjQ0Ci0tLSBhL0xpYi9vcHRwYXJzZS5weQorKysgYi9MaWIvb3B0cGFyc2UucHkKQEAgLTE2LDcgKzE2LDcgQEAKICMgUHl0aG9uIGRldmVsb3BlcnM6IHBsZWFzZSBkbyBub3QgbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSwgc2luY2UKICMgaXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT3B0aWsgc291cmNlIGNvZGUuCiAKLV9fdmVyc2lvbl9fID0gIjEuNS4xIgorX192ZXJzaW9uX18gPSAiMS41LjMiCiAKIF9fYWxsX18gPSBbJ09wdGlvbicsCiAgICAgICAgICAgICdTVVBQUkVTU19IRUxQJywKQEAgLTc1LDkgKzc1LDkgQEAKIAogCiAjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb206Ci0jICAgSWQ6IG9wdGlvbl9wYXJzZXIucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCi0jICAgSWQ6IG9wdGlvbi5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKLSMgICBJZDogaGVscC5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKKyMgICBJZDogb3B0aW9uX3BhcnNlci5weSA1MjcgMjAwNi0wNy0yMyAxNToyMTozMFogZ3JlZworIyAgIElkOiBvcHRpb24ucHkgNTIyIDIwMDYtMDYtMTEgMTY6MjI6MDNaIGd3YXJkCisjICAgSWQ6IGhlbHAucHkgNTI3IDIwMDYtMDctMjMgMTU6MjE6MzBaIGdyZWcKICMgICBJZDogZXJyb3JzLnB5IDUwOSAyMDA2LTA0LTIwIDAwOjU4OjI0WiBnd2FyZAogCiB0cnk6CkBAIC0xNjI5LDYgKzE2MjksMTMgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmZvcm1hdF9lcGlsb2coZm9ybWF0dGVyKSkKICAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQogCisgICAgIyB1c2VkIGJ5IHRlc3Qgc3VpdGUKKyAgICBkZWYgX2dldF9lbmNvZGluZyhzZWxmLCBmaWxlKToKKyAgICAgICAgZW5jb2RpbmcgPSBnZXRhdHRyKGZpbGUsICJlbmNvZGluZyIsIE5vbmUpCisgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHJldHVybiBlbmNvZGluZworCiAgICAgZGVmIHByaW50X2hlbHAoc2VsZiwgZmlsZT1Ob25lKToKICAgICAgICAgIiIicHJpbnRfaGVscChmaWxlIDogZmlsZSA9IHN0ZG91dCkKIApAQCAtMTYzNyw3ICsxNjQ0LDggQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0Ci0gICAgICAgIGZpbGUud3JpdGUoc2VsZi5mb3JtYXRfaGVscCgpKQorICAgICAgICBlbmNvZGluZyA9IHNlbGYuX2dldF9lbmNvZGluZyhmaWxlKQorICAgICAgICBmaWxlLndyaXRlKHNlbGYuZm9ybWF0X2hlbHAoKS5lbmNvZGUoZW5jb2RpbmcsICJyZXBsYWNlIikpCiAKICMgY2xhc3MgT3B0aW9uUGFyc2VyCiAKZGlmZiAtLWdpdCBhL0xpYi9vcy5weSBiL0xpYi9vcy5weQppbmRleCAzMTAwMmFjLi4yZDFiMjliIDEwMDY0NAotLS0gYS9MaWIvb3MucHkKKysrIGIvTGliL29zLnB5CkBAIC03MjMsNyArNzIzLDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF91cmFuZG9tZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiL2Rldi91cmFuZG9tIChvciBlcXVpdmFsZW50KSBub3QgZm91bmQiKQogICAgICAgICBieXRlcyA9ICIiCiAgICAgICAgIHdoaWxlIGxlbihieXRlcykgPCBuOgpkaWZmIC0tZ2l0IGEvTGliL3BkYi5weSBiL0xpYi9wZGIucHkKaW5kZXggOTRmNjFmNy4uMDYxODFlNyAxMDA3NTUKLS0tIGEvTGliL3BkYi5weQorKysgYi9MaWIvcGRiLnB5CkBAIC0yMzUsNyArMjM1LDggQEAKICAgICAgICAgIiIiSW50ZXJwcmV0IHRoZSBhcmd1bWVudCBhcyB0aG91Z2ggaXQgaGFkIGJlZW4gdHlwZWQgaW4gcmVzcG9uc2UKICAgICAgICAgdG8gdGhlIHByb21wdC4KIAotICAgICAgICBDaGVja3Mgd2V0aGVyICB0aGlzIGxpbmUgaXMgdHlwZWQgaW4gdGhlIG5vcm1hbCBwcm9tcHQgb3IgaW4gYSBicmVha3BvaW50IGNvbW1hbmQgbGlzdCBkZWZpbml0aW9uCisgICAgICAgIENoZWNrcyB3aGV0aGVyIHRoaXMgbGluZSBpcyB0eXBlZCBhdCB0aGUgbm9ybWFsIHByb21wdCBvciBpbgorICAgICAgICBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19kZWZpbmluZzoKICAgICAgICAgICAgIHJldHVybiBjbWQuQ21kLm9uZWNtZChzZWxmLCBsaW5lKQpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCAyNmM3OTdmLi4zNzczOGU0IDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtNjksNyArNjksMzMgQEAKIAogCiBkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKLSAgICAiIiJZaWVsZCBzdWJtb2R1bGUgbmFtZXMrbG9hZGVycyByZWN1cnNpdmVseSwgZm9yIHBhdGggb3Igc3lzLnBhdGgiIiIKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKKyAgICBvbiBwYXRoLCBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgYWNjZXNzaWJsZSBtb2R1bGVzLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKworICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgaW1wb3J0IGFsbCAqcGFja2FnZXMqIChOT1QgYWxsCisgICAgbW9kdWxlcyEpIG9uIHRoZSBnaXZlbiBwYXRoLCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIF9fcGF0aF9fCisgICAgYXR0cmlidXRlIHRvIGZpbmQgc3VibW9kdWxlcy4KKworICAgICdvbmVycm9yJyBpcyBhIGZ1bmN0aW9uIHdoaWNoIGdldHMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50ICh0aGUKKyAgICBuYW1lIG9mIHRoZSBwYWNrYWdlIHdoaWNoIHdhcyBiZWluZyBpbXBvcnRlZCkgaWYgYW55IGV4Y2VwdGlvbgorICAgIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IGEgcGFja2FnZS4gIElmIG5vIG9uZXJyb3IgZnVuY3Rpb24gaXMKKyAgICBzdXBwbGllZCwgSW1wb3J0RXJyb3JzIGFyZSBjYXVnaHQgYW5kIGlnbm9yZWQsIHdoaWxlIGFsbCBvdGhlcgorICAgIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQsIHRlcm1pbmF0aW5nIHRoZSBzZWFyY2guCisKKyAgICBFeGFtcGxlczoKKworICAgICMgbGlzdCBhbGwgbW9kdWxlcyBweXRob24gY2FuIGFjY2VzcworICAgIHdhbGtfcGFja2FnZXMoKQorCisgICAgIyBsaXN0IGFsbCBzdWJtb2R1bGVzIG9mIGN0eXBlcworICAgIHdhbGtfcGFja2FnZXMoY3R5cGVzLl9fcGF0aF9fLCBjdHlwZXMuX19uYW1lX18rJy4nKQorICAgICIiIgogCiAgICAgZGVmIHNlZW4ocCwgbT17fSk6CiAgICAgICAgIGlmIHAgaW4gbToKQEAgLTg0LDE5ICsxMTAsMzMgQEAKICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpCisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW25hbWVdLCAnX19wYXRoX18nLCBOb25lKSBvciBbXQogCiAgICAgICAgICAgICAgICAgIyBkb24ndCB0cmF2ZXJzZSBwYXRoIGl0ZW1zIHdlJ3ZlIHNlZW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgcGF0aCA9IFtwIGZvciBwIGluIHBhdGggaWYgbm90IHNlZW4ocCldCiAKLSAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nKToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nLCBvbmVycm9yKToKICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQogCiAKIGRlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgotICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisgICAgIiIiWWllbGRzIChtb2R1bGVfbG9hZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBzdWJtb2R1bGVzIG9uIHBhdGgsCisgICAgb3IsIGlmIHBhdGggaXMgTm9uZSwgYWxsIHRvcC1sZXZlbCBtb2R1bGVzIG9uIHN5cy5wYXRoLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKyAgICAiIiIKKwogICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgaW1wb3J0ZXJzID0gaXRlcl9pbXBvcnRlcnMoKQogICAgIGVsc2U6CkBAIC0yMDgsNiArMjQ4LDcgQEAKIAogICAgIGRlZiBfcmVvcGVuKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmZpbGUgYW5kIHNlbGYuZmlsZS5jbG9zZWQ6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCiAgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKICAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyVScpCiAgICAgICAgICAgICBlbGlmIG1vZF90eXBlIGluIChpbXAuUFlfQ09NUElMRUQsIGltcC5DX0VYVEVOU0lPTik6CkBAIC0zNDAsOSArMzgxLDcgQEAKICAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQogICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5zZXRkZWZhdWx0KHBhdGhfaXRlbSwgaW1wb3J0ZXIpCiAKLSAgICAjIFRoZSBib29sZWFuIHZhbHVlcyBhcmUgdXNlZCBmb3IgY2FjaGluZyB2YWxpZCBhbmQgaW52YWxpZAotICAgICMgZmlsZSBwYXRocyBmb3IgdGhlIGJ1aWx0LWluIGltcG9ydCBtYWNoaW5lcnkKLSAgICBpZiBpbXBvcnRlciBpbiAoTm9uZSwgVHJ1ZSwgRmFsc2UpOgorICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydGVyID0gSW1wSW1wb3J0ZXIocGF0aF9pdGVtKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvcG9wZW4yLnB5IGIvTGliL3BvcGVuMi5weQppbmRleCBiOTY2ZDRjLi42OTQ5NzllIDEwMDY0NAotLS0gYS9MaWIvcG9wZW4yLnB5CisrKyBiL0xpYi9wb3BlbjIucHkKQEAgLTcyLDE0ICs3MiwxNCBAQAogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQogICAgICAgICBpZiBzZWxmLnN0cyA8IDA6Ci0gICAgICAgICAgICBpZiBfYWN0aXZlOgorICAgICAgICAgICAgaWYgX2FjdGl2ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCiAgICAgICAgICAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKIAogICAgIGRlZiBfcnVuX2NoaWxkKHNlbGYsIGNtZCk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIGNtZCA9IFsnL2Jpbi9zaCcsICctYycsIGNtZF0KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgTUFYRkQpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMywgTUFYRkQpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG9zLmNsb3NlKGkpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9wc3RhdHMucHkgYi9MaWIvcHN0YXRzLnB5CmluZGV4IGMzYTg4MjguLjRlOTRiMGMgMTAwNjQ0Ci0tLSBhL0xpYi9wc3RhdHMucHkKKysrIGIvTGliL3BzdGF0cy5weQpAQCAtNTQ4LDggKzU0OCwxMCBAQAogICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSAiJSAiCiAgICAgICAgICAgICBpZiBwcm9maWxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBTdGF0cyhwcm9maWxlKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5zdGF0cy5zdHJlYW0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN5cy5zdGRvdXQKIAogICAgICAgICBkZWYgZ2VuZXJpYyhzZWxmLCBmbiwgbGluZSk6CiAgICAgICAgICAgICBhcmdzID0gbGluZS5zcGxpdCgpCkBAIC02NjcsMTQgKzY2OSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGltcG9ydCBzeXMKLSAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIldlbGNvbWUgdG8gdGhlIHByb2ZpbGUgc3RhdGlzdGljcyBicm93c2VyLiIKICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKICAgICAgICAgaW5pdHByb2ZpbGUgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIGluaXRwcm9maWxlID0gTm9uZQogICAgIHRyeToKLSAgICAgICAgUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpLmNtZGxvb3AoKQotICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkdvb2RieWUuIgorICAgICAgICBicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpCisgICAgICAgIHByaW50ID4+IGJyb3dzZXIuc3RyZWFtLCAiV2VsY29tZSB0byB0aGUgcHJvZmlsZSBzdGF0aXN0aWNzIGJyb3dzZXIuIgorICAgICAgICBicm93c2VyLmNtZGxvb3AoKQorICAgICAgICBwcmludCA+PiBicm93c2VyLnN0cmVhbSwgIkdvb2RieWUuIgogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKaW5kZXggY2YzODYzMC4uMjljNmNjNCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtMzE4LDYgKzMxOCw4IEBACiAgICAgICAgICMgaWRlbnRpZmllcyBzb21ldGhpbmcgaW4gYSB3YXkgdGhhdCBweWRvYyBpdHNlbGYgaGFzIGlzc3VlcyBoYW5kbGluZzsKICAgICAgICAgIyB0aGluayAnc3VwZXInIGFuZCBob3cgaXQgaXMgYSBkZXNjcmlwdG9yICh3aGljaCByYWlzZXMgdGhlIGV4Y2VwdGlvbgogICAgICAgICAjIGJ5IGxhY2tpbmcgYSBfX25hbWVfXyBhdHRyaWJ1dGUpIGFuZCBhbiBpbnN0YW5jZS4KKyAgICAgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKKyAgICAgICAgaWYgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgaW5zcGVjdC5pc21vZHVsZShvYmplY3QpOiByZXR1cm4gc2VsZi5kb2Ntb2R1bGUoKmFyZ3MpCiAgICAgICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jY2xhc3MoKmFyZ3MpCkBAIC0zMzMsNyArMzM1LDcgQEAKICAgICAgICAgICAgIG5hbWUgYW5kICcgJyArIHJlcHIobmFtZSksIHR5cGUob2JqZWN0KS5fX25hbWVfXykKICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBtZXNzYWdlCiAKLSAgICBkb2Ntb2R1bGUgPSBkb2NjbGFzcyA9IGRvY3JvdXRpbmUgPSBkb2NvdGhlciA9IGZhaWwKKyAgICBkb2Ntb2R1bGUgPSBkb2NjbGFzcyA9IGRvY3JvdXRpbmUgPSBkb2NvdGhlciA9IGRvY3Byb3BlcnR5ID0gZG9jZGF0YSA9IGZhaWwKIAogICAgIGRlZiBnZXRkb2Nsb2Moc2VsZiwgb2JqZWN0KToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiBtb2R1bGUgZG9jcyBvciBOb25lIiIiCkBAIC05MTUsNiArOTE3LDEwIEBACiAgICAgICAgIGxocyA9IG5hbWUgYW5kICc8c3Ryb25nPiVzPC9zdHJvbmc+ID0gJyAlIG5hbWUgb3IgJycKICAgICAgICAgcmV0dXJuIGxocyArIHNlbGYucmVwcihvYmplY3QpCiAKKyAgICBkZWYgZG9jZGF0YShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIGh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIGRlc2NyaXB0b3IuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCiAgICAgZGVmIGluZGV4KHNlbGYsIGRpciwgc2hhZG93ZWQ9Tm9uZSk6CiAgICAgICAgICIiIkdlbmVyYXRlIGFuIEhUTUwgaW5kZXggZm9yIGEgZGlyZWN0b3J5IG9mIG1vZHVsZXMuIiIiCiAgICAgICAgIG1vZHBrZ3MgPSBbXQpAQCAtMTI2OCw2ICsxMjc0LDEwIEBACiAgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIHByb3BlcnR5LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCBvYmplY3QsIG1vZCkKIAorICAgIGRlZiBkb2NkYXRhKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGRhdGEgZGVzY3JpcHRvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgb2JqZWN0LCBtb2QpCisKICAgICBkZWYgZG9jb3RoZXIoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBwYXJlbnQ9Tm9uZSwgbWF4bGVuPU5vbmUsIGRvYz1Ob25lKToKICAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZGF0YSBvYmplY3QuIiIiCiAgICAgICAgIHJlcHIgPSBzZWxmLnJlcHIob2JqZWN0KQpAQCAtMTM5Nyw2ICsxNDA3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gJ21vZHVsZSAnICsgdGhpbmcuX19uYW1lX18KICAgICBpZiBpbnNwZWN0LmlzYnVpbHRpbih0aGluZyk6CiAgICAgICAgIHJldHVybiAnYnVpbHQtaW4gZnVuY3Rpb24gJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IodGhpbmcpOgorICAgICAgICByZXR1cm4gJ2dldHNldCBkZXNjcmlwdG9yICVzLiVzLiVzJyAlICgKKyAgICAgICAgICAgIHRoaW5nLl9fb2JqY2xhc3NfXy5fX21vZHVsZV9fLCB0aGluZy5fX29iamNsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICB0aGluZy5fX25hbWVfXykKKyAgICBpZiBpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcih0aGluZyk6CisgICAgICAgIHJldHVybiAnbWVtYmVyIGRlc2NyaXB0b3IgJXMuJXMuJXMnICUgKAorICAgICAgICAgICAgdGhpbmcuX19vYmpjbGFzc19fLl9fbW9kdWxlX18sIHRoaW5nLl9fb2JqY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgIHRoaW5nLl9fbmFtZV9fKQogICAgIGlmIGluc3BlY3QuaXNjbGFzcyh0aGluZyk6CiAgICAgICAgIHJldHVybiAnY2xhc3MgJyArIHRoaW5nLl9fbmFtZV9fCiAgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKHRoaW5nKToKQEAgLTE0NTMsNiArMTQ3MSw4IEBACiAgICAgICAgIGlmIG5vdCAoaW5zcGVjdC5pc21vZHVsZShvYmplY3QpIG9yCiAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2NsYXNzKG9iamVjdCkgb3IKICAgICAgICAgICAgICAgICBpbnNwZWN0Lmlzcm91dGluZShvYmplY3QpIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KSBvcgorICAgICAgICAgICAgICAgIGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCkgb3IKICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG9iamVjdCwgcHJvcGVydHkpKToKICAgICAgICAgICAgICMgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYSBwaWVjZSBvZiBkYXRhIG9yIGFuIGluc3RhbmNlLAogICAgICAgICAgICAgIyBkb2N1bWVudCBpdHMgYXZhaWxhYmxlIG1ldGhvZHMgaW5zdGVhZCBvZiBpdHMgdmFsdWUuCmRpZmYgLS1naXQgYS9MaWIvcmFuZG9tLnB5IGIvTGliL3JhbmRvbS5weQppbmRleCA0NjVmNDc3Li5hZTJkNDM0IDEwMDY0NAotLS0gYS9MaWIvcmFuZG9tLnB5CisrKyBiL0xpYi9yYW5kb20ucHkKQEAgLTI5LDEzICsyOSwxMiBAQAogR2VuZXJhbCBub3RlcyBvbiB0aGUgdW5kZXJseWluZyBNZXJzZW5uZSBUd2lzdGVyIGNvcmUgZ2VuZXJhdG9yOgogCiAqIFRoZSBwZXJpb2QgaXMgMioqMTk5MzctMS4KLSogSXQgaXMgb25lIG9mIHRoZSBtb3N0IGV4dGVuc2l2ZWx5IHRlc3RlZCBnZW5lcmF0b3JzIGluIGV4aXN0ZW5jZQotKiBXaXRob3V0IGEgZGlyZWN0IHdheSB0byBjb21wdXRlIE4gc3RlcHMgZm9yd2FyZCwgdGhlCi0gIHNlbWFudGljcyBvZiBqdW1wYWhlYWQobikgYXJlIHdlYWtlbmVkIHRvIHNpbXBseSBqdW1wCi0gIHRvIGFub3RoZXIgZGlzdGFudCBzdGF0ZSBhbmQgcmVseSBvbiB0aGUgbGFyZ2UgcGVyaW9kCi0gIHRvIGF2b2lkIG92ZXJsYXBwaW5nIHNlcXVlbmNlcy4KLSogVGhlIHJhbmRvbSgpIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBDLCBleGVjdXRlcyBpbgotICBhIHNpbmdsZSBQeXRob24gc3RlcCwgYW5kIGlzLCB0aGVyZWZvcmUsIHRocmVhZHNhZmUuCisqIEl0IGlzIG9uZSBvZiB0aGUgbW9zdCBleHRlbnNpdmVseSB0ZXN0ZWQgZ2VuZXJhdG9ycyBpbiBleGlzdGVuY2UuCisqIFdpdGhvdXQgYSBkaXJlY3Qgd2F5IHRvIGNvbXB1dGUgTiBzdGVwcyBmb3J3YXJkLCB0aGUgc2VtYW50aWNzIG9mCisgIGp1bXBhaGVhZChuKSBhcmUgd2Vha2VuZWQgdG8gc2ltcGx5IGp1bXAgdG8gYW5vdGhlciBkaXN0YW50IHN0YXRlIGFuZCByZWx5CisgIG9uIHRoZSBsYXJnZSBwZXJpb2QgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzLgorKiBUaGUgcmFuZG9tKCkgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIEMsIGV4ZWN1dGVzIGluIGEgc2luZ2xlIFB5dGhvbiBzdGVwLAorICBhbmQgaXMsIHRoZXJlZm9yZSwgdGhyZWFkc2FmZS4KIAogIiIiCiAKQEAgLTI1MywxMSArMjUyLDYgQEAKIAogICAgICAgICBPcHRpb25hbCBhcmcgcmFuZG9tIGlzIGEgMC1hcmd1bWVudCBmdW5jdGlvbiByZXR1cm5pbmcgYSByYW5kb20KICAgICAgICAgZmxvYXQgaW4gWzAuMCwgMS4wKTsgYnkgZGVmYXVsdCwgdGhlIHN0YW5kYXJkIHJhbmRvbS5yYW5kb20uCi0KLSAgICAgICAgTm90ZSB0aGF0IGZvciBldmVuIHJhdGhlciBzbWFsbCBsZW4oeCksIHRoZSB0b3RhbCBudW1iZXIgb2YKLSAgICAgICAgcGVybXV0YXRpb25zIG9mIHggaXMgbGFyZ2VyIHRoYW4gdGhlIHBlcmlvZCBvZiBtb3N0IHJhbmRvbSBudW1iZXIKLSAgICAgICAgZ2VuZXJhdG9yczsgdGhpcyBpbXBsaWVzIHRoYXQgIm1vc3QiIHBlcm11dGF0aW9ucyBvZiBhIGxvbmcKLSAgICAgICAgc2VxdWVuY2UgY2FuIG5ldmVyIGJlIGdlbmVyYXRlZC4KICAgICAgICAgIiIiCiAKICAgICAgICAgaWYgcmFuZG9tIGlzIE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc2dtbGxpYi5weSBiL0xpYi9zZ21sbGliLnB5CmluZGV4IDNlODVhOTEuLjMwMjBkMTEgMTAwNjQ0Ci0tLSBhL0xpYi9zZ21sbGliLnB5CisrKyBiL0xpYi9zZ21sbGliLnB5CkBAIC0yOSwxMSArMjksMTYgQEAKIHNob3J0dGFnb3BlbiA9IHJlLmNvbXBpbGUoJzxbYS16QS1aXVstLmEtekEtWjAtOV0qLycpCiBzaG9ydHRhZyA9IHJlLmNvbXBpbGUoJzwoW2EtekEtWl1bLS5hLXpBLVowLTldKikvKFteL10qKS8nKQogcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQotZW5kYnJhY2tldCA9IHJlLmNvbXBpbGUoJ1s8Pl0nKQorc3RhcnR0YWcgPSByZS5jb21waWxlKHInPFthLXpBLVpdWy1fLjphLXpBLVowLTldKlxzKignCisgICAgICAgIHInXHMqKFthLXpBLVpfXVstOi5hLXpBLVpfMC05XSopKFxzKj1ccyonCisgICAgICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+QF0nCisgICAgICAgIHInW11bXC1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKig/PVtccz4vPF0pKSk/JworICAgIHInKSpccyovP1xzKig/PVs8Pl0pJykKK2VuZHRhZyA9IHJlLmNvbXBpbGUocic8Lz9bYS16QS1aXVstXy46YS16QS1aMC05XSpccyovP1xzKig/PVs8Pl0pJykKIHRhZ2ZpbmQgPSByZS5jb21waWxlKCdbYS16QS1aXVstXy5hLXpBLVowLTldKicpCiBhdHRyZmluZCA9IHJlLmNvbXBpbGUoCiAgICAgcidccyooW2EtekEtWl9dWy06LmEtekEtWl8wLTldKikoXHMqPVxzKicKLSAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8Wy1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKikpPycpCisgICAgcicoXCdbXlwnXSpcJ3wiW14iXSoifFtdW1wtYS16QS1aMC05Li8sOjsrKiU/ISYkXChcKV8jPX5cJyJAXSopKT8nKQogCiAKIGNsYXNzIFNHTUxQYXJzZUVycm9yKFJ1bnRpbWVFcnJvcik6CkBAIC01Myw2ICs1OCwxMCBAQAogIyBzZWxmLmhhbmRsZV9lbnRpdHlyZWYoKSB3aXRoIHRoZSBlbnRpdHkgcmVmZXJlbmNlIGFzIGFyZ3VtZW50LgogCiBjbGFzcyBTR01MUGFyc2VyKG1hcmt1cGJhc2UuUGFyc2VyQmFzZSk6CisgICAgIyBEZWZpbml0aW9uIG9mIGVudGl0aWVzIC0tIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKyAgICBlbnRpdHlfb3JfY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyYoPzonCisgICAgICAnKFthLXpBLVpdWy0uYS16QS1aMC05XSopfCMoWzAtOV0rKScKKyAgICAgICcpKDs/KScpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT0wKToKICAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhpcyBpbnN0YW5jZS4iIiIKQEAgLTI0NSwxMSArMjU0LDEwIEBACiAgICAgICAgICAgICBzZWxmLmZpbmlzaF9zaG9ydHRhZyh0YWcsIGRhdGEpCiAgICAgICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IHJhd2RhdGFbc3RhcnRfcG9zOm1hdGNoLmVuZCgxKSArIDFdCiAgICAgICAgICAgICByZXR1cm4gawotICAgICAgICAjIFhYWCBUaGUgZm9sbG93aW5nIHNob3VsZCBza2lwIG1hdGNoaW5nIHF1b3RlcyAoJyBvciAiKQotICAgICAgICBtYXRjaCA9IGVuZGJyYWNrZXQuc2VhcmNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgbWF0Y2ggPSBzdGFydHRhZy5tYXRjaChyYXdkYXRhLCBpKQogICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KDApCisgICAgICAgIGogPSBtYXRjaC5lbmQoMCkKICAgICAgICAgIyBOb3cgcGFyc2UgdGhlIGRhdGEgYmV0d2VlbiBpKzEgYW5kIGogaW50byBhIHRhZyBhbmQgYXR0cnMKICAgICAgICAgYXR0cnMgPSBbXQogICAgICAgICBpZiByYXdkYXRhW2k6aSsyXSA9PSAnPD4nOgpAQCAtMjc0LDMyICsyODIsOCBAQAogICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XSk6CiAgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgcXVvdGVzCiAgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQotICAgICAgICAgICAgICAgIGwgPSAwCi0gICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSA9ICcnCi0gICAgICAgICAgICAgICAgd2hpbGUgbCA8IGxlbihhdHRydmFsdWUpOgotICAgICAgICAgICAgICAgICAgICBhdl9tYXRjaCA9IGVudGl0eXJlZi5tYXRjaChhdHRydmFsdWUsIGwpCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdl9tYXRjaCBhbmQgYXZfbWF0Y2guZ3JvdXAoMSkgaW4gc2VsZi5lbnRpdHlkZWZzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlW2F2X21hdGNoLmVuZCgxKV0gPT0gJzsnKToKLSAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzdWJzdGl0dXRlIGVudGl0eXJlZnMgZW5kaW5nIGluICc7JyBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugd2UgbWF5IGJyZWFrIDxhIGhyZWY9Jz9wPXgmcT15Jz4KLSAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgdmVyeSBjb21tb24KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gc2VsZi5lbnRpdHlkZWZzW2F2X21hdGNoLmdyb3VwKDEpXQotICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGF2X21hdGNoLmVuZCgwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgY2hfbWF0Y2ggPSBjaGFycmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKLSAgICAgICAgICAgICAgICAgICAgaWYgY2hfbWF0Y2g6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IGNocihpbnQoY2hfbWF0Y2guZ3JvdXAoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gY2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBjaF9tYXRjaC5lbmQoMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnZhbGlkIGNoYXJhY3RlciByZWZlcmVuY2UsIGRvbid0IHN1YnN0aXR1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAgICAgICAgICMgYWxsIG90aGVyIGNhc2VzCi0gICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gYXR0cnZhbHVlW2xdCi0gICAgICAgICAgICAgICAgICAgIGwgKz0gMQotICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IG5ld19hdHRydmFsdWUKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBzZWxmLmVudGl0eV9vcl9jaGFycmVmLnN1YigKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydF9yZWYsIGF0dHJ2YWx1ZSkKICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgoYXR0cm5hbWUubG93ZXIoKSwgYXR0cnZhbHVlKSkKICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CkBAIC0zMDgsMTMgKzI5MiwyNCBAQAogICAgICAgICBzZWxmLmZpbmlzaF9zdGFydHRhZyh0YWcsIGF0dHJzKQogICAgICAgICByZXR1cm4gagogCisgICAgIyBJbnRlcm5hbCAtLSBjb252ZXJ0IGVudGl0eSBvciBjaGFyYWN0ZXIgcmVmZXJlbmNlCisgICAgZGVmIF9jb252ZXJ0X3JlZihzZWxmLCBtYXRjaCk6CisgICAgICAgIGlmIG1hdGNoLmdyb3VwKDIpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jaGFycmVmKG1hdGNoLmdyb3VwKDIpKSBvciBcCisgICAgICAgICAgICAgICAgJyYjJXMlcycgJSBtYXRjaC5ncm91cHMoKVsxOl0KKyAgICAgICAgZWxpZiBtYXRjaC5ncm91cCgzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG1hdGNoLmdyb3VwKDEpKSBvciBcCisgICAgICAgICAgICAgICAgJyYlczsnICUgbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJiVzJyAlIG1hdGNoLmdyb3VwKDEpCisKICAgICAjIEludGVybmFsIC0tIHBhcnNlIGVuZHRhZwogICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CiAgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKLSAgICAgICAgbWF0Y2ggPSBlbmRicmFja2V0LnNlYXJjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIG1hdGNoID0gZW5kdGFnLm1hdGNoKHJhd2RhdGEsIGkpCiAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgaiA9IG1hdGNoLmVuZCgwKQogICAgICAgICB0YWcgPSByYXdkYXRhW2krMjpqXS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CiAgICAgICAgICAgICBqID0gaisxCkBAIC0zOTEsMzUgKzM4Niw1MSBAQAogICAgICAgICAgICAgcHJpbnQgJyoqKiBVbmJhbGFuY2VkIDwvJyArIHRhZyArICc+JwogICAgICAgICAgICAgcHJpbnQgJyoqKiBTdGFjazonLCBzZWxmLnN0YWNrCiAKLSAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgbmFtZSk6Ci0gICAgICAgICIiIkhhbmRsZSBjaGFyYWN0ZXIgcmVmZXJlbmNlLCBubyBuZWVkIHRvIG92ZXJyaWRlLiIiIgorICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbWF5IGJlIG92ZXJyaWRkZW4uIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG4gPSBpbnQobmFtZSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLnVua25vd25fY2hhcnJlZihuYW1lKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIG5vdCAwIDw9IG4gPD0gMjU1OgotICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGNocihuKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jb2RlcG9pbnQobikKKworICAgIGRlZiBjb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpOgorICAgICAgICByZXR1cm4gY2hyKGNvZGVwb2ludCkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiSGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5jb252ZXJ0X2NoYXJyZWYobmFtZSkKKyAgICAgICAgaWYgcmVwbGFjZW1lbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9jaGFycmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJlcGxhY2VtZW50KQogCiAgICAgIyBEZWZpbml0aW9uIG9mIGVudGl0aWVzIC0tIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUKICAgICBlbnRpdHlkZWZzID0gXAogICAgICAgICAgICAgeydsdCc6ICc8JywgJ2d0JzogJz4nLCAnYW1wJzogJyYnLCAncXVvdCc6ICciJywgJ2Fwb3MnOiAnXCcnfQogCi0gICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6Ci0gICAgICAgICIiIkhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcy4KKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgZW50aXR5IHJlZmVyZW5jZXMuCiAKLSAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IGl0IGNhbiBiZQotICAgICAgICB0YWlsb3JlZCBieSBzZXR0aW5nIHVwIHRoZSBzZWxmLmVudGl0eWRlZnMgbWFwcGluZyBhcHByb3ByaWF0ZWx5LgorICAgICAgICBBcyBhbiBhbHRlcm5hdGl2ZSB0byBvdmVycmlkaW5nIHRoaXMgbWV0aG9kOyBvbmUgY2FuIHRhaWxvciB0aGUKKyAgICAgICAgcmVzdWx0cyBieSBzZXR0aW5nIHVwIHRoZSBzZWxmLmVudGl0eWRlZnMgbWFwcGluZyBhcHByb3ByaWF0ZWx5LgogICAgICAgICAiIiIKICAgICAgICAgdGFibGUgPSBzZWxmLmVudGl0eWRlZnMKICAgICAgICAgaWYgbmFtZSBpbiB0YWJsZToKLSAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEodGFibGVbbmFtZV0pCisgICAgICAgICAgICByZXR1cm4gdGFibGVbbmFtZV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbnRpdHlyZWYobmFtZSkKICAgICAgICAgICAgIHJldHVybgogCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcywgbm8gbmVlZCB0byBvdmVycmlkZS4iIiIKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGlmIHJlcGxhY2VtZW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVua25vd25fZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHNlbGYuY29udmVydF9lbnRpdHlyZWYobmFtZSkpCisKICAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIGRhdGEsIHNob3VsZCBiZSBvdmVycmlkZGVuCiAgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgogICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvc2hlbHZlLnB5IGIvTGliL3NoZWx2ZS5weQppbmRleCA0OTU5YzI2Li43YTc1NDQ1IDEwMDY0NAotLS0gYS9MaWIvc2hlbHZlLnB5CisrKyBiL0xpYi9zaGVsdmUucHkKQEAgLTEzOSw2ICsxMzksOSBAQAogICAgICAgICBzZWxmLmRpY3QgPSAwCiAKICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3dyaXRlYmFjaycpOgorICAgICAgICAgICAgIyBfX2luaXRfXyBkaWRuJ3Qgc3VjY2VlZCwgc28gZG9uJ3QgYm90aGVyIGNsb3NpbmcKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBzeW5jKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3NodXRpbC5weSBiL0xpYi9zaHV0aWwucHkKaW5kZXggYzUwMTg0Yy4uYzNmZjY4NyAxMDA2NDQKLS0tIGEvTGliL3NodXRpbC5weQorKysgYi9MaWIvc2h1dGlsLnB5CkBAIC0xMjcsNyArMTI3LDEzIEBACiAgICAgICAgICMgY29udGludWUgd2l0aCBvdGhlciBmaWxlcwogICAgICAgICBleGNlcHQgRXJyb3IsIGVycjoKICAgICAgICAgICAgIGVycm9ycy5leHRlbmQoZXJyLmFyZ3NbMF0pCi0gICAgY29weXN0YXQoc3JjLCBkc3QpCisgICAgdHJ5OgorICAgICAgICBjb3B5c3RhdChzcmMsIGRzdCkKKyAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAjIGNhbid0IGNvcHkgZmlsZSBhY2Nlc3MgdGltZXMgb24gV2luZG93cworICAgICAgICBwYXNzCisgICAgZXhjZXB0IE9TRXJyb3IsIHdoeToKKyAgICAgICAgZXJyb3JzLmV4dGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgICBpZiBlcnJvcnM6CiAgICAgICAgIHJhaXNlIEVycm9yLCBlcnJvcnMKIApkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCA0N2VkYTI0Li4wMTA4NmI3IDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTEsMTAgKzExLDExIEBACiB3b3JrcykuCiAKIFRoaXMgd2lsbCBhcHBlbmQgc2l0ZS1zcGVjaWZpYyBwYXRocyB0byB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLiAgT24KLVVuaXgsIGl0IHN0YXJ0cyB3aXRoIHN5cy5wcmVmaXggYW5kIHN5cy5leGVjX3ByZWZpeCAoaWYgZGlmZmVyZW50KSBhbmQKLWFwcGVuZHMgbGliL3B5dGhvbjx2ZXJzaW9uPi9zaXRlLXBhY2thZ2VzIGFzIHdlbGwgYXMgbGliL3NpdGUtcHl0aG9uLgotT24gb3RoZXIgcGxhdGZvcm1zIChtYWlubHkgTWFjIGFuZCBXaW5kb3dzKSwgaXQgdXNlcyBqdXN0IHN5cy5wcmVmaXgKLShhbmQgc3lzLmV4ZWNfcHJlZml4LCBpZiBkaWZmZXJlbnQsIGJ1dCB0aGlzIGlzIHVubGlrZWx5KS4gIFRoZQorVW5peCAoaW5jbHVkaW5nIE1hYyBPU1gpLCBpdCBzdGFydHMgd2l0aCBzeXMucHJlZml4IGFuZAorc3lzLmV4ZWNfcHJlZml4IChpZiBkaWZmZXJlbnQpIGFuZCBhcHBlbmRzCitsaWIvcHl0aG9uPHZlcnNpb24+L3NpdGUtcGFja2FnZXMgYXMgd2VsbCBhcyBsaWIvc2l0ZS1weXRob24uCitPbiBvdGhlciBwbGF0Zm9ybXMgKHN1Y2ggYXMgV2luZG93cyksIGl0IHRyaWVzIGVhY2ggb2YgdGhlCitwcmVmaXhlcyBkaXJlY3RseSwgYXMgd2VsbCBhcyB3aXRoIGxpYi9zaXRlLXBhY2thZ2VzIGFwcGVuZGVkLiAgVGhlCiByZXN1bHRpbmcgZGlyZWN0b3JpZXMsIGlmIHRoZXkgZXhpc3QsIGFyZSBhcHBlbmRlZCB0byBzeXMucGF0aCwgYW5kCiBhbHNvIGluc3BlY3RlZCBmb3IgcGF0aCBjb25maWd1cmF0aW9uIGZpbGVzLgogCmRpZmYgLS1naXQgYS9MaWIvc29ja2V0LnB5IGIvTGliL3NvY2tldC5weQppbmRleCBmYTBlNjYzLi41MmZiOGUzIDEwMDY0NAotLS0gYS9MaWIvc29ja2V0LnB5CisrKyBiL0xpYi9zb2NrZXQucHkKQEAgLTEzMCwzNSArMTMwLDQwIEBACiBpZiBzeXMucGxhdGZvcm0gPT0gInJpc2NvcyI6CiAgICAgX3NvY2tldG1ldGhvZHMgPSBfc29ja2V0bWV0aG9kcyArICgnc2xlZXB0YXNrdycsKQogCisjIEFsbCB0aGUgbWV0aG9kIG5hbWVzIHRoYXQgbXVzdCBiZSBkZWxlZ2F0ZWQgdG8gZWl0aGVyIHRoZSByZWFsIHNvY2tldAorIyBvYmplY3Qgb3IgdGhlIF9jbG9zZWRzb2NrZXQgb2JqZWN0LgorX2RlbGVnYXRlX21ldGhvZHMgPSAoInJlY3YiLCAicmVjdmZyb20iLCAicmVjdl9pbnRvIiwgInJlY3Zmcm9tX2ludG8iLAorICAgICAgICAgICAgICAgICAgICAgInNlbmQiLCAic2VuZHRvIikKKwogY2xhc3MgX2Nsb3NlZHNvY2tldChvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgZGVmIF9kdW1teSgqYXJncyk6CiAgICAgICAgIHJhaXNlIGVycm9yKEVCQURGLCAnQmFkIGZpbGUgZGVzY3JpcHRvcicpCi0gICAgc2VuZCA9IHJlY3YgPSBzZW5kdG8gPSByZWN2ZnJvbSA9IF9fZ2V0YXR0cl9fID0gX2R1bW15CisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgIyBBbGwgX2RlbGVnYXRlX21ldGhvZHMgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkIGhlcmUuCisgICAgc2VuZCA9IHJlY3YgPSByZWN2X2ludG8gPSBzZW5kdG8gPSByZWN2ZnJvbSA9IHJlY3Zmcm9tX2ludG8gPSBfZHVtbXkKKyAgICBfX2dldGF0dHJfXyA9IF9kdW1teQogCiBjbGFzcyBfc29ja2V0b2JqZWN0KG9iamVjdCk6CiAKICAgICBfX2RvY19fID0gX3JlYWxzb2NrZXQuX19kb2NfXwogCi0gICAgX19zbG90c19fID0gWyJfc29jayIsCi0gICAgICAgICAgICAgICAgICJyZWN2IiwgInJlY3ZfaW50byIsICJyZWN2ZnJvbV9pbnRvIiwKLSAgICAgICAgICAgICAgICAgInNlbmQiLCAic2VuZHRvIiwgInJlY3Zmcm9tIiwKLSAgICAgICAgICAgICAgICAgIl9fd2Vha3JlZl9fIl0KKyAgICBfX3Nsb3RzX18gPSBbIl9zb2NrIiwgIl9fd2Vha3JlZl9fIl0gKyBsaXN0KF9kZWxlZ2F0ZV9tZXRob2RzKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhbWlseT1BRl9JTkVULCB0eXBlPVNPQ0tfU1RSRUFNLCBwcm90bz0wLCBfc29jaz1Ob25lKToKICAgICAgICAgaWYgX3NvY2sgaXMgTm9uZToKICAgICAgICAgICAgIF9zb2NrID0gX3JlYWxzb2NrZXQoZmFtaWx5LCB0eXBlLCBwcm90bykKICAgICAgICAgc2VsZi5fc29jayA9IF9zb2NrCi0gICAgICAgIHNlbGYuc2VuZCA9IHNlbGYuX3NvY2suc2VuZAotICAgICAgICBzZWxmLnJlY3YgPSBzZWxmLl9zb2NrLnJlY3YKLSAgICAgICAgc2VsZi5yZWN2X2ludG8gPSBzZWxmLl9zb2NrLnJlY3ZfaW50bwotICAgICAgICBzZWxmLnNlbmR0byA9IHNlbGYuX3NvY2suc2VuZHRvCi0gICAgICAgIHNlbGYucmVjdmZyb20gPSBzZWxmLl9zb2NrLnJlY3Zmcm9tCi0gICAgICAgIHNlbGYucmVjdmZyb21faW50byA9IHNlbGYuX3NvY2sucmVjdmZyb21faW50bworICAgICAgICBmb3IgbWV0aG9kIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2QsIGdldGF0dHIoX3NvY2ssIG1ldGhvZCkpCiAKICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY2xvc2UoKQogICAgICAgICBzZWxmLl9zb2NrID0gX2Nsb3NlZHNvY2tldCgpCi0gICAgICAgIHNlbGYuc2VuZCA9IHNlbGYucmVjdiA9IHNlbGYuc2VuZHRvID0gc2VsZi5yZWN2ZnJvbSA9IHNlbGYuX3NvY2suX2R1bW15CisgICAgICAgIGR1bW15ID0gc2VsZi5fc29jay5fZHVtbXkKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBfZGVsZWdhdGVfbWV0aG9kczoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbWV0aG9kLCBkdW1teSkKICAgICBjbG9zZS5fX2RvY19fID0gX3JlYWxzb2NrZXQuY2xvc2UuX19kb2NfXwogCiAgICAgZGVmIGFjY2VwdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IGIxMGIzZWYuLjc2MWJkYWEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtNDgsNiArNDgsOCBAQAogICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIENoZWNrQ29sbGF0aW9uSXNVc2VkKHNlbGYpOgorICAgICAgICBpZiBzcWxpdGUudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpOiAgIyBvbGQgU1FMaXRlIHZlcnNpb25zIGNyYXNoIG9uIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKICAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKaW5kZXggMjVlNGI2My4uYzg3MzNiOSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpAQCAtNjEsNiArNjEsMTQgQEAKIAogICAgICAgICBjb24ucm9sbGJhY2soKQogCisgICAgZGVmIENoZWNrQ29sdW1uTmFtZVdpdGhTcGFjZXMoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJhciBbZGF0ZXRpbWVdIicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXIiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJheiInKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmF6IikKKwogZGVmIHN1aXRlKCk6CiAgICAgcmVncmVzc2lvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWdyZXNzaW9uVGVzdHMsICJDaGVjayIpCiAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgocmVncmVzc2lvbl9zdWl0ZSwpKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKaW5kZXggZTQ5ZjdkZC4uOGRhNTcyMiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0yMSw3ICsyMSw3IEBACiAjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAotaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgYnoyLCBkYXRldGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIApAQCAtMTAxLDE2ICsxMDEsMTYgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IpIikKIAogICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZsb2F0Il0gPSBsYW1iZGEgeDogNDcuMgorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXSA9IGxhbWJkYSB4OiA0Ny4yCiAKICAgICAgICAgIyBhbmQgaW1wbGVtZW50IHR3byBjdXN0b20gb25lcwotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYm9vbCJdID0gbGFtYmRhIHg6IGJvb2woaW50KHgpKQotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBEZWNsVHlwZXNUZXN0cy5Gb28KKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXSA9IGxhbWJkYSB4OiBib29sKGludCh4KSkKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdCiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCkBAIC0yMDgsMTQgKzIwOCwxNCBAQAogICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHggZm9vKSIpCiAKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdID0gbGFtYmRhIHg6ICJbJXNdIiAlIHgKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImJhciJdID0gbGFtYmRhIHg6ICI8JXM+IiAlIHgKLSAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdID0gbGFtYmRhIHg6IDUvMAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRk9PIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQkFSIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRVhDIl0gPSBsYW1iZGEgeDogNS8wCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KLSAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJiYXIiXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkVYQyJdCiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCkBAIC0yMzEsMTIgKzIzMSw2IEBACiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQogCi0gICAgZGVmIENoZWNrRXhjKHNlbGYpOgotICAgICAgICAjIEV4Y2VwdGlvbnMgaW4gdHlwZSBjb252ZXJ0ZXJzIHJlc3VsdCBpbiByZXR1cm5lZCBOb25lcwotICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgNSBhcyAieCBbZXhjXSInKQotICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKLQogICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgeCBhcyAieCBbYmFyXSIgZnJvbSB0ZXN0JykKQEAgLTI3OSw2ICsyNzMsMjMgQEAKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQogCitjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNvbnZlcnQocyk6CisgICAgICAgIHJldHVybiBiejIuZGVjb21wcmVzcyhzKQorICAgIGNvbnZlcnQgPSBzdGF0aWNtZXRob2QoY29udmVydCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0NPTE5BTUVTKQorICAgICAgICBzcWxpdGUucmVnaXN0ZXJfY29udmVydGVyKCJiaW4iLCBCaW5hcnlDb252ZXJ0ZXJUZXN0cy5jb252ZXJ0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tCaW5hcnlJbnB1dEZvckNvbnZlcnRlcihzZWxmKToKKyAgICAgICAgdGVzdGRhdGEgPSAiYWJjZGVmZyIgKiAxMAorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAoYnVmZmVyKGJ6Mi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKKwogY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQpAQCAtMzI4LDggKzMzOSw5IEBACiAgICAgZGVjbHR5cGVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGVjbFR5cGVzVGVzdHMsICJDaGVjayIpCiAgICAgY29sbmFtZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xOYW1lc1Rlc3RzLCAiQ2hlY2siKQogICAgIGFkYXB0YXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoT2JqZWN0QWRhcHRhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGJpbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShCaW5hcnlDb252ZXJ0ZXJUZXN0cywgIkNoZWNrIikKICAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoc3FsaXRlX3R5cGVfc3VpdGUsIGRlY2x0eXBlc190eXBlX3N1aXRlLCBjb2xuYW1lc190eXBlX3N1aXRlLCBhZGFwdGF0aW9uX3N1aXRlLCBkYXRlX3N1aXRlKSkKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChzcWxpdGVfdHlwZV9zdWl0ZSwgZGVjbHR5cGVzX3R5cGVfc3VpdGUsIGNvbG5hbWVzX3R5cGVfc3VpdGUsIGFkYXB0YXRpb25fc3VpdGUsIGJpbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CmluZGV4IDc4NjU2ZTcuLjMxYmYyODkgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKQEAgLTU1LDYgKzU1LDkgQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHBhc3MKIAorICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKwogY2xhc3MgQWdnck5vRmluYWxpemU6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBwYXNzCkBAIC0xNDQsOSArMTQ3LDEyIEBACiAgICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgogICAgICAgICBkZWYgZ2V0ZnVuYygpOgogICAgICAgICAgICAgZGVmIGYoKToKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgIHJldHVybiBmCi0gICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgZiA9IGdldGZ1bmMoKQorICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgorICAgICAgICAjIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZikKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQogCkBAIC0xOTUsOSArMjAxLDEyIEBACiAKICAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQotICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJhaXNlZXhjZXB0aW9uKCkiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCisgICAgICAgICAgICBjdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKIAogICAgIGRlZiBDaGVja1BhcmFtU3RyaW5nKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMjY3LDMxICsyNzYsNDcgQEAKIAogICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIkFnZ3JOb1N0ZXAgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnc3RlcCciKQogCiAgICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JblN0ZXAoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQotICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDQyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQotICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNGaW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMzMxLDEwICszNTYsNTQgQEAKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA2MCkKIAorZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCisgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQorICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCisKK2NsYXNzIEF1dGhvcml6ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDEgKGMxLCBjMik7CisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDIgKGMxLCBjMik7CisgICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gdDIgKGMxLCBjMikgdmFsdWVzICg0LCA1KTsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICAjIEZvciBvdXIgc2VjdXJpdHkgdGVzdDoKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDIiKQorCisgICAgICAgIHNlbGYuY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXJfY2IpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja1RhYmxlQWNjZXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHQyIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCisKKyAgICBkZWYgQ2hlY2tDb2x1bW5BY2Nlc3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQxIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCisKIGRlZiBzdWl0ZSgpOgogICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCiAgICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQotICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUpKQorICAgIGF1dGhvcml6ZXJfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUsIGF1dGhvcml6ZXJfc3VpdGUpKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zdHJpbmcucHkgYi9MaWIvc3RyaW5nLnB5CmluZGV4IGJhODVhNDkuLmE1ODM3ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9zdHJpbmcucHkKKysrIGIvTGliL3N0cmluZy5weQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKICAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgdmFsCisgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAodmFsLCkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgpAQCAtMTg2LDEzICsxODYsMTMgQEAKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIKICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlIG1hcHBpbmdbbmFtZWRdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbbmFtZWRdLCkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlciArIG5hbWVkCiAgICAgICAgICAgICBicmFjZWQgPSBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIGJyYWNlZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgbWFwcGluZ1ticmFjZWRdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbYnJhY2VkXSwpCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIgKyAneycgKyBicmFjZWQgKyAnfScKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc3RydWN0LnB5IGIvTGliL3N0cnVjdC5weQppbmRleCA5MTEzZTcxLi4wN2MyMWJmIDEwMDY0NAotLS0gYS9MaWIvc3RydWN0LnB5CisrKyBiL0xpYi9zdHJ1Y3QucHkKQEAgLTY0LDcgKzY0LDcgQEAKIAogZGVmIHBhY2tfaW50byhmbXQsIGJ1Ziwgb2Zmc2V0LCAqYXJncyk6CiAgICAgIiIiCi0gICAgUGFjayB0aGUgdmFsdWVzIHYyLCB2MiwgLi4uIGFjY29yZGluZyB0byBmbXQsIHdyaXRlCisgICAgUGFjayB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uIGFjY29yZGluZyB0byBmbXQsIHdyaXRlCiAgICAgdGhlIHBhY2tlZCBieXRlcyBpbnRvIHRoZSB3cml0YWJsZSBidWZmZXIgYnVmIHN0YXJ0aW5nIGF0IG9mZnNldC4KICAgICBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuCiAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvc3VicHJvY2Vzcy5weSBiL0xpYi9zdWJwcm9jZXNzLnB5CmluZGV4IGE2YWY3ZTcuLjBkMTkxMjkgMTAwNjQ0Ci0tLSBhL0xpYi9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9zdWJwcm9jZXNzLnB5CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUuICBJZiB0aGUKICAgICBleGl0IGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZQogICAgIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZSBDYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUKLSAgICByZXR1cm4gY29kZSBpbiB0aGUgZXJybm8gYXR0cmlidXRlLgorICAgIHJldHVybiBjb2RlIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KIAogICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgogCkBAIC0xNDEsOCArMTQxLDggQEAKIAogQSBWYWx1ZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIFBvcGVuIGlzIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzLgogCi1jaGVja19jYWxsKCkgd2lsbCByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IsIHdoaWNoIGlzIGEgc3ViY2xhc3Mgb2YKLU9TRXJyb3IsIGlmIHRoZSBjYWxsZWQgcHJvY2VzcyByZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCitjaGVja19jYWxsKCkgd2lsbCByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IsIGlmIHRoZSBjYWxsZWQgcHJvY2VzcworcmV0dXJucyBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgogCiAKIFNlY3VyaXR5CkBAIC0yMzQsNyArMjM0LDcgQEAKIHN0cyA9IG9zLnN5c3RlbSgibXljbWQiICsgIiBteWFyZyIpCiA9PT4KIHAgPSBQb3BlbigibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCi1zdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQorcGlkLCBzdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQogCiBOb3RlOgogCkBAIC0zNjAsMTEgKzM2MCwxNiBAQAogaW1wb3J0IHRyYWNlYmFjawogCiAjIEV4Y2VwdGlvbiBjbGFzc2VzIHVzZWQgYnkgdGhpcyBtb2R1bGUuCi1jbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoT1NFcnJvcik6CitjbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoRXhjZXB0aW9uKToKICAgICAiIiJUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHByb2Nlc3MgcnVuIGJ5IGNoZWNrX2NhbGwoKSByZXR1cm5zCiAgICAgYSBub24temVybyBleGl0IHN0YXR1cy4gIFRoZSBleGl0IHN0YXR1cyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKLSAgICBlcnJubyBhdHRyaWJ1dGUuICBUaGlzIGV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mCi0gICAgT1NFcnJvci4iIiIKKyAgICByZXR1cm5jb2RlIGF0dHJpYnV0ZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZSwgY21kKToKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZCIgJSAoc2VsZi5jbWQsIHNlbGYucmV0dXJuY29kZSkKKwogCiBpZiBtc3dpbmRvd3M6CiAgICAgaW1wb3J0IHRocmVhZGluZwpAQCAtNDQyLDcgKzQ0Nyw3IEBACiAgICAgIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiAgSWYKICAgICB0aGUgZXhpdCBjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UKICAgICBDYWxsZWRQcm9jZXNzRXJyb3IuICBUaGUgQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlCi0gICAgcmV0dXJuIGNvZGUgaW4gdGhlIGVycm5vIGF0dHJpYnV0ZS4KKyAgICByZXR1cm4gY29kZSBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCiAKICAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKIApAQCAtNDUzLDcgKzQ1OCw3IEBACiAgICAgaWYgY21kIGlzIE5vbmU6CiAgICAgICAgIGNtZCA9IHBvcGVuYXJnc1swXQogICAgIGlmIHJldGNvZGU6Ci0gICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCAiQ29tbWFuZCAlcyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyIgJSBjbWQpCisgICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCBjbWQpCiAgICAgcmV0dXJuIHJldGNvZGUKIAogCkBAIC02MTMsNyArNjE4LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQotICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmUgYW5kIF9hY3RpdmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCiAgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQogCkBAIC05NDEsNyArOTQ2LDcgQEAKIAogCiAgICAgICAgIGRlZiBfY2xvc2VfZmRzKHNlbGYsIGJ1dCk6Ci0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBNQVhGRCk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMywgTUFYRkQpOgogICAgICAgICAgICAgICAgIGlmIGkgPT0gYnV0OgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggMDYxZDBmNS4uYzE4NWZiZCAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTQxNyw3ICs0MTcsMTMgQEAKICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKICAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKICAgICAgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKLSAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxsIiwgc2VsZi5jcmMpKQorICAgICAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CisgICAgICAgICAgICAgICAgIyB0aGUgUHl0aG9uIHdyYXBwZXIgaW1wbGljaXRseSBjYXN0cyB0aGF0IHRvIGEgc2lnbmVkIEMKKyAgICAgICAgICAgICAgICAjIGxvbmcuICBTbywgb24gYSAzMi1iaXQgYm94IHNlbGYuY3JjIG1heSAibG9vayBuZWdhdGl2ZSIsCisgICAgICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCisgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBpcmtzb21lIHdhcm5pbmdzIGZyb20gdGhlIGBzdHJ1Y3RgIG1vZHVsZSwgZm9yY2UKKyAgICAgICAgICAgICAgICAjIGl0IHRvIGxvb2sgcG9zaXRpdmUgb24gYWxsIGJveGVzLgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLmNyYyAmIDB4ZmZmZmZmZmZMKSkKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MgJiAweGZmZmZGRkZGTCkpCiAKICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CkBAIC0xNzUwLDEzICsxNzU2LDYgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB0YXJpbmZvID0gVGFySW5mby5mcm9tYnVmKGJ1ZikKIAotICAgICAgICAgICAgICAgICMgV2Ugc2hvdWxkbid0IHJlbHkgb24gdGhpcyBjaGVja3N1bSwgYmVjYXVzZSBzb21lIHRhciBwcm9ncmFtcwotICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGl0IGRpZmZlcmVudGx5IGFuZCBpdCBpcyBtZXJlbHkgdmFsaWRhdGluZyB0aGUKLSAgICAgICAgICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAotICAgICAgICAgICAgICAgICMgaGF2ZSBhIHNsaWdodCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuLi4KLSAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogQmFkIENoZWNrc3VtICVyIiAlIHRhcmluZm8ubmFtZSkKLQogICAgICAgICAgICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKICAgICAgICAgICAgICAgICAjIFRhckZpbGUgYW5kIHNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzCiAgICAgICAgICAgICAgICAgIyBzaG91bGQgYmVnaW4uCmRpZmYgLS1naXQgYS9MaWIvdGVsbmV0bGliLnB5IGIvTGliL3RlbG5ldGxpYi5weQppbmRleCAzNTIzMDM3Li5hMTNlODVjIDEwMDY0NAotLS0gYS9MaWIvdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZWxuZXRsaWIucHkKQEAgLTMxMSw2ICszMTEsOCBAQAogICAgICAgICBzX2FyZ3MgPSBzX3JlcGx5CiAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzX2FyZ3MgPSBzX2FyZ3MgKyAodGltZW91dCwpCisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKICAgICAgICAgd2hpbGUgbm90IHNlbGYuZW9mIGFuZCBzZWxlY3Quc2VsZWN0KCpzX2FyZ3MpID09IHNfcmVwbHk6CiAgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzZWxmLmNvb2tlZHEpLW4pCiAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCkBAIC0zMjEsNiArMzIzLDExIEBACiAgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxWzppXQogICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtpOl0KICAgICAgICAgICAgICAgICByZXR1cm4gYnVmCisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgaWYgZWxhcHNlZCA+PSB0aW1lb3V0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNfYXJncyA9IHNfcmVwbHkgKyAodGltZW91dC1lbGFwc2VkLCkKICAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQogCiAgICAgZGVmIHJlYWRfYWxsKHNlbGYpOgpAQCAtNjAxLDYgKzYwOCw5IEBACiAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihsaXN0W2ldLCAic2VhcmNoIik6CiAgICAgICAgICAgICAgICAgaWYgbm90IHJlOiBpbXBvcnQgcmUKICAgICAgICAgICAgICAgICBsaXN0W2ldID0gcmUuY29tcGlsZShsaXN0W2ldKQorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCiAgICAgICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgpAQCAtNjEzLDcgKzYyMywxMSBAQAogICAgICAgICAgICAgaWYgc2VsZi5lb2Y6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuZmlsZW5vKCldLCBbXSwgW10sIHRpbWVvdXQpCisgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc19hcmdzID0gKFtzZWxmLmZpbGVubygpXSwgW10sIFtdLCB0aW1lb3V0LWVsYXBzZWQpCisgICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoKnNfYXJncykKICAgICAgICAgICAgICAgICBpZiBub3QgcjoKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKZGlmZiAtLWdpdCBhL0xpYi90ZW1wZmlsZS5weSBiL0xpYi90ZW1wZmlsZS5weQppbmRleCBkZDdlODY0Li4yZThjZDZkIDEwMDY0NAotLS0gYS9MaWIvdGVtcGZpbGUucHkKKysrIGIvTGliL3RlbXBmaWxlLnB5CkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9dGVtcGxhdGUsIGRpcj1Ob25lKToKICAgICAgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZS4KICAgICAgICAgQXJndW1lbnRzOgotICAgICAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXJlY3RvcnknIC0tIGFzIGZvciBta3N0ZW1wLgorICAgICAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXInIC0tIGFzIGZvciBta3N0ZW1wLgogICAgICAgICAnbW9kZScgLS0gdGhlIG1vZGUgYXJndW1lbnQgdG8gb3MuZmRvcGVuIChkZWZhdWx0ICJ3K2IiKS4KICAgICAgICAgJ2J1ZnNpemUnIC0tIHRoZSBidWZmZXIgc2l6ZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgLTEpLgogICAgICAgICBUaGUgZmlsZSBpcyBjcmVhdGVkIGFzIG1rc3RlbXAoKSB3b3VsZCBkbyBpdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2JvZ3VzX2NvZGVfb2JqLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfY29kZV9vYmoucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzYWU1MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvZ3VzX2NvZGVfb2JqLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIgorQnJva2VuIGJ5dGVjb2RlIG9iamVjdHMgY2FuIGVhc2lseSBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuCisKK1RoaXMgaXMgbm90IGdvaW5nIHRvIGJlIGZpeGVkLiAgSXQgaXMgZ2VuZXJhbGx5IGFncmVlZCB0aGF0IHRoZXJlIGlzIG5vCitwb2ludCBpbiB3cml0aW5nIGEgYnl0ZWNvZGUgdmVyaWZpZXIgYW5kIHB1dHRpbmcgaXQgaW4gQ1B5dGhvbiBqdXN0IGZvcgordGhpcy4gIE1vcmVvdmVyLCBhIHZlcmlmaWVyIGlzIGJvdW5kIHRvIGFjY2VwdCBvbmx5IGEgc3Vic2V0IG9mIGFsbCBzYWZlCitieXRlY29kZXMsIHNvIGl0IGNvdWxkIGxlYWQgdG8gdW5uZWNlc3NhcnkgYnJlYWthZ2UuCisKK0ZvciBzZWN1cml0eSBwdXJwb3NlcywgInJlc3RyaWN0ZWQiIGludGVycHJldGVycyBhcmUgbm90IGdvaW5nIHRvIGxldAordGhlIHVzZXIgYnVpbGQgb3IgbG9hZCByYW5kb20gYnl0ZWNvZGVzIGFueXdheS4gIE90aGVyd2lzZSwgdGhpcyBpcyBhCisid29uJ3QgZml4IiBjYXNlLgorCisiIiIKKworaW1wb3J0IHR5cGVzCisKK2NvID0gdHlwZXMuQ29kZVR5cGUoMCwgMCwgMCwgMCwgJ1x4MDRceDcxXHgwMFx4MDAnLCAoKSwKKyAgICAgICAgICAgICAgICAgICAgKCksICgpLCAnJywgJycsIDEsICcnKQorZXhlYyBjbwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzEucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9ib3Jyb3dlZF9yZWZfMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTZlZGUyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzEucHkKQEAgLTAsMCArMSwyOSBAQAorIiIiCitfUHlUeXBlX0xvb2t1cCgpIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UuCitUaGlzIGF0dGFja3MgdGhlIGNhbGwgaW4gZGljdG9iamVjdC5jLgorIiIiCisKK2NsYXNzIEEob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgcHJpbnQgJ2hpJworICAgICAgICBkZWwgRC5fX21pc3NpbmdfXworCitjbGFzcyBEKGRpY3QpOgorICAgIGNsYXNzIF9fbWlzc2luZ19fOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworCisKK2QgPSBEKCkKK2EgPSBBKCkKK2EuY3ljbGUgPSBhCithLm90aGVyID0gQigpCitkZWwgYQorCitwcmV2ID0gTm9uZQord2hpbGUgMToKKyAgICBkWzVdCisgICAgcHJldiA9IChwcmV2LCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2JvcnJvd2VkX3JlZl8yLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3YjNmZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvcnJvd2VkX3JlZl8yLnB5CkBAIC0wLDAgKzEsMzggQEAKKyIiIgorX1B5VHlwZV9Mb29rdXAoKSByZXR1cm5zIGEgYm9ycm93ZWQgcmVmZXJlbmNlLgorVGhpcyBhdHRhY2tzIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKCkuCisKK05CLiBvbiBteSBtYWNoaW5lIHRoaXMgY3Jhc2hlcyBpbiAyLjUgZGVidWcgYnV0IG5vdCByZWxlYXNlLgorIiIiCisKK2NsYXNzIEEob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgcHJpbnQgImhpIgorICAgICAgICBkZWwgQy5kCisKK2NsYXNzIEQob2JqZWN0KToKKyAgICBkZWYgX19zZXRfXyhzZWxmLCBvYmosIHZhbHVlKToKKyAgICAgICAgc2VsZi5oZWxsbyA9IDQyCisKK2NsYXNzIEMob2JqZWN0KToKKyAgICBkID0gRCgpCisKKyAgICBkZWYgZygpOgorICAgICAgICBwYXNzCisKKworYyA9IEMoKQorYSA9IEEoKQorYS5jeWNsZSA9IGEKK2Eub3RoZXIgPSBCKCkKKworbHN0ID0gW05vbmVdICogMTAwMDAwMAoraSA9IDAKK2RlbCBhCit3aGlsZSAxOgorICAgIGMuZCA9IDQyICAgICAgICAgIyBzZWdmYXVsdHMgaW4gUHlNZXRob2RfTmV3KGltX2Z1bmM9RC5fX3NldF9fLCBpbV9zZWxmPWQpCisgICAgbHN0W2ldID0gYy5nICAgICAjIGNvbnN1bWUgdGhlIGZyZWUgbGlzdCBvZiBpbnN0YW5jZW1ldGhvZCBvYmplY3RzCisgICAgaSArPSAxCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9jb2VyY2UucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9jb2VyY2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDk1NmIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY3Jhc2hlcnMvY29lcmNlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLSMgaHR0cDovL3B5dGhvbi5vcmcvc2YvOTkyMDE3Ci0KLWNsYXNzIGZvbzoKLSAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBvdGhlciwgc2VsZgotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGZvbygpKzEgICAjIHNlZ2ZhdWx0OiBpbmZpbml0ZSByZWN1cnNpb24gaW4gQwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvZ2NfaW5zcGVjdGlvbi5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2djX2luc3BlY3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYWE3OQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2djX2luc3BlY3Rpb24ucHkKQEAgLTAsMCArMSwzMiBAQAorIiIiCitnYy5nZXRfcmVmZXJyZXJzKCkgY2FuIGJlIHVzZWQgdG8gc2VlIG9iamVjdHMgYmVmb3JlIHRoZXkgYXJlIGZ1bGx5IGJ1aWx0LgorCitOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFuIGV4YW1wbGUuICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGNyYXNoIFB5dGhvbgorYnkgdXNpbmcgZ2MuZ2V0X3JlZmVycmVycygpLCBhcyB3ZWxsIGFzIG1hbnkgZXh0ZW5zaW9uIG1vZHVsZXMgKGV2ZW4KK3doZW4gdGhleSBhcmUgdXNpbmcgcGVyZmVjdGx5IGRvY3VtZW50ZWQgcGF0dGVybnMgdG8gYnVpbGQgb2JqZWN0cykuCisKK0lkZW50aWZ5aW5nIGFuZCByZW1vdmluZyBhbGwgcGxhY2VzIHRoYXQgZXhwb3NlIHRvIHRoZSBHQyBhCitwYXJ0aWFsbHktYnVpbHQgb2JqZWN0IGlzIGEgbG9uZy10ZXJtIHByb2plY3QuICBBIHBhdGNoIHdhcyBwcm9wb3NlZCBvbgorU0Ygc3BlY2lmaWNhbGx5IGZvciB0aGlzIGV4YW1wbGUgYnV0IEkgY29uc2lkZXIgZml4aW5nIGp1c3QgdGhpcyBzaW5nbGUKK2V4YW1wbGUgYSBiaXQgcG9pbnRsZXNzICgjMTUxNzA0MikuCisKK0EgZml4IHdvdWxkIGluY2x1ZGUgYSB3aG9sZS1zY2FsZSBjb2RlIHJldmlldywgcG9zc2libHkgd2l0aCBhbiBBUEkKK2NoYW5nZSB0byBkZWNvdXBsZSBvYmplY3QgY3JlYXRpb24gYW5kIEdDIHJlZ2lzdHJhdGlvbiwgYW5kIGFjY29yZGluZworZml4ZXMgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIGV4dGVuc2lvbiBtb2R1bGUgd3JpdGVycy4gIEl0J3MgdW5saWtlbHkKK3RvIGhhcHBlbiwgdGhvdWdoLiAgU28gdGhpcyBpcyBjdXJyZW50bHkgY2xhc3NpZmllZCBhcworImdjLmdldF9yZWZlcnJlcnMoKSBpcyBkYW5nZXJvdXMsIHVzZSBvbmx5IGZvciBkZWJ1Z2dpbmciLgorIiIiCisKK2ltcG9ydCBnYworCisKK2RlZiBnKCk6CisgICAgbWFya2VyID0gb2JqZWN0KCkKKyAgICB5aWVsZCBtYXJrZXIKKyAgICAjIG5vdyB0aGUgbWFya2VyIGlzIGluIHRoZSB0dXBsZSBiZWluZyBjb25zdHJ1Y3RlZAorICAgIFt0dXBdID0gW3ggZm9yIHggaW4gZ2MuZ2V0X3JlZmVycmVycyhtYXJrZXIpIGlmIHR5cGUoeCkgaXMgdHVwbGVdCisgICAgcHJpbnQgdHVwCisgICAgcHJpbnQgdHVwWzFdCisKKwordHVwbGUoZygpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvaW5maW5pdGVfcmVjXzMucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9yZWNfMy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwNGU0Yy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9yZWNfMy5weQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0jIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyMDI1MzMKLQotY2xhc3MgQShvYmplY3QpOgotICAgIHBhc3MKLUEuX19jYWxsX18gPSBBKCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBBKCkoKSAgICMgc2VnZmF1bHQ6IGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNGQzMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2lvbl9saW1pdF90b29faGlnaC5weQpAQCAtMCwwICsxLDE2IEBACisjIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBtYXkgY3Jhc2ggb3Igbm90IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisjIEUuZy4gb24gMzItYml0IEludGVsIExpbnV4IGluIGEgInN0YW5kYXJkIiBjb25maWd1cmF0aW9uIGl0IHNlZW1zIHRvCisjIGNyYXNoIG9uIFB5dGhvbiAyLjUgKGJ1dCBub3QgMi40IG5vciAyLjMpLiAgT24gV2luZG93cyB0aGUgaW1wb3J0CisjIGV2ZW50dWFsbHkgZmFpbHMgdG8gZmluZCB0aGUgbW9kdWxlLCBwb3NzaWJseSBiZWNhdXNlIHdlIHJ1biBvdXQgb2YKKyMgZmlsZSBoYW5kbGVzLgorCisjIFRoZSBwb2ludCBvZiB0aGlzIGV4YW1wbGUgaXMgdG8gc2hvdyB0aGF0IHN5cy5zZXRyZWN1cnNpb25saW1pdCgpIGlzIGEKKyMgaGFjaywgYW5kIG5vdCBhIHJvYnVzdCBzb2x1dGlvbi4gIFRoaXMgZXhhbXBsZSBzaW1wbHkgZXhlcmNpY2VzIGEgcGF0aAorIyB3aGVyZSBpdCB0YWtlcyBtYW55IEMtbGV2ZWwgcmVjdXJzaW9ucywgY29uc3VtaW5nIGEgbG90IG9mIHN0YWNrCisjIHNwYWNlLCBmb3IgZWFjaCBQeXRob24tbGV2ZWwgcmVjdXJzaW9uLiAgU28gMTAwMCB0aW1lcyB0aGlzIGFtb3VudCBvZgorIyBzdGFjayBzcGFjZSBtYXkgYmUgdG9vIG11Y2ggZm9yIHN0YW5kYXJkIHBsYXRmb3JtcyBhbHJlYWR5LgorCitpbXBvcnQgc3lzCitpZiAncmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoJyBpbiBzeXMubW9kdWxlczoKKyAgICBkZWwgc3lzLm1vZHVsZXNbJ3JlY3Vyc2lvbl9saW1pdF90b29faGlnaCddCitpbXBvcnQgcmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9yZWN1cnNpdmVfY2FsbC5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CmluZGV4IDA3NzY0NzkuLjMxYzg5NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5CkBAIC0xLDYgKzEsMTEgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCiAjIE5vIGJ1ZyByZXBvcnQgQUZBSUssIG1haWwgb24gcHl0aG9uLWRldiBvbiAyMDA2LTAxLTEwCisKKyMgVGhpcyBpcyBhICJ3b24ndCBmaXgiIGNhc2UuICBJdCBpcyBrbm93biB0aGF0IHNldHRpbmcgYSBoaWdoIGVub3VnaAorIyByZWN1cnNpb24gbGltaXQgY3Jhc2hlcyBieSBvdmVyZmxvd2luZyB0aGUgc3RhY2suICBVbmxlc3MgdGhpcyBpcworIyByZWRlc2lnbmVkIHNvbWVob3csIGl0IHdvbid0IGdvIGF3YXkuCisKIGltcG9ydCBzeXMKIAogc3lzLnNldHJlY3Vyc2lvbmxpbWl0KDEgPDwgMzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy94bWxfcGFyc2Vycy5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL3htbF9wYXJzZXJzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI1NzI3Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL3htbF9wYXJzZXJzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKLQotIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMjk2NDMzCi0KLWRlZiB0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKToKLSAgICAjCi0gICAgeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMjUpCi0gICAgIyB0aGlzIG9uZSBkb2Vzbid0IGNyYXNoCi0gICAgI3htbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMDAwKQotCi0gICAgZGVmIGhhbmRsZXIodGV4dCk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbgotCi0gICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKLSAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBoYW5kbGVyCi0KLSAgICB0cnk6Ci0gICAgICAgIHBhcnNlci5QYXJzZSh4bWwpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9wYXJzZV9vbmx5X3htbF9kYXRhKCkKLQotIyBJbnZhbGlkIHJlYWQgb2Ygc2l6ZSA0Ci0jICAgIGF0IDB4NDNGOTM2OiBQeU9iamVjdF9GcmVlIChvYm1hbGxvYy5jOjczNSkKLSMgICAgYnkgMHg0NUE3Qzc6IHVuaWNvZGVfZGVhbGxvYyAodW5pY29kZW9iamVjdC5jOjI0NikKLSMgICAgYnkgMHgxMjk5MDIxRDogUHlVbmtub3duRW5jb2RpbmdIYW5kbGVyIChweWV4cGF0LmM6MTMxNCkKLSMgICAgYnkgMHgxMjk5M0E2NjogcHJvY2Vzc1htbERlY2wgKHhtbHBhcnNlLmM6MzMzMCkKLSMgICAgYnkgMHgxMjk5OTIxMTogZG9Qcm9sb2cgKHhtbHBhcnNlLmM6MzY3OCkKLSMgICAgYnkgMHgxMjk5QzNGMDogcHJvbG9nSW5pdFByb2Nlc3NvciAoeG1scGFyc2UuYzozNTUwKQotIyAgICBieSAweDEyOTkxRUEzOiBYTUxfUGFyc2VCdWZmZXIgKHhtbHBhcnNlLmM6MTU2MikKLSMgICAgYnkgMHgxMjk4RjhFQzogeG1scGFyc2VfUGFyc2UgKHB5ZXhwYXQuYzo4OTUpCi0jICAgIGJ5IDB4NDdCM0ExOiBQeUV2YWxfRXZhbEZyYW1lRXggKGNldmFsLmM6MzU2NSkKLSMgICAgYnkgMHg0N0NDQUM6IFB5RXZhbF9FdmFsQ29kZUV4IChjZXZhbC5jOjI3MzkpCi0jICAgIGJ5IDB4NDdDREUxOiBQeUV2YWxfRXZhbENvZGUgKGNldmFsLmM6NDkwKQotIyAgICBieSAweDQ5OTgyMDogUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MgKHB5dGhvbnJ1bi5jOjExOTgpCi0jICAgIGJ5IDB4NDExN0YxOiBQeV9NYWluIChtYWluLmM6NDkyKQotIyAgICBieSAweDEyNDc2RDFGOiBfX2xpYmNfc3RhcnRfbWFpbiAoaW4gL2xpYi9saWJjLTIuMy41LnNvKQotIyAgICBieSAweDQxMERDOTogKHdpdGhpbiAvaG9tZS9uZWFsL2J1aWxkL3B5dGhvbi9zdm4vY2xlYW4vcHl0aG9uKQotIyAgQWRkcmVzcyAweDEyNzA0MDIwIGlzIDI2NCBieXRlcyBpbnNpZGUgYSBibG9jayBvZiBzaXplIDU5MiBmcmVlJ2QKLSMgICAgYXQgMHgxMUIxQkE4QTogZnJlZSAodmdfcmVwbGFjZV9tYWxsb2MuYzoyMzUpCi0jICAgIGJ5IDB4MTI0QjVGMTg6ICh3aXRoaW4gL2xpYi9saWJjLTIuMy41LnNvKQotIyAgICBieSAweDQ4REU0MzogZmluZF9tb2R1bGUgKGltcG9ydC5jOjEzMjApCi0jICAgIGJ5IDB4NDhFOTk3OiBpbXBvcnRfc3VibW9kdWxlIChpbXBvcnQuYzoyMjQ5KQotIyAgICBieSAweDQ4RUMxNTogbG9hZF9uZXh0IChpbXBvcnQuYzoyMDgzKQotIyAgICBieSAweDQ4RjA5MTogaW1wb3J0X21vZHVsZV9leCAoaW1wb3J0LmM6MTkxNCkKLSMgICAgYnkgMHg0OEYzODU6IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4IChpbXBvcnQuYzoxOTU1KQotIyAgICBieSAweDQ2RDA3MDogYnVpbHRpbl9fX2ltcG9ydF9fIChibHRpbm1vZHVsZS5jOjQ0KQotIyAgICBieSAweDQxODZDRjogUHlPYmplY3RfQ2FsbCAoYWJzdHJhY3QuYzoxNzc3KQotIyAgICBieSAweDQ3NEU5QjogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMgKGNldmFsLmM6MzQzMikKLSMgICAgYnkgMHg0NzkyOEU6IFB5RXZhbF9FdmFsRnJhbWVFeCAoY2V2YWwuYzoyMDM4KQotIyAgICBieSAweDQ3Q0NBQzogUHlFdmFsX0V2YWxDb2RlRXggKGNldmFsLmM6MjczOSkKLSMgICAgYnkgMHg0N0NERTE6IFB5RXZhbF9FdmFsQ29kZSAoY2V2YWwuYzo0OTApCi0jICAgIGJ5IDB4NDhEMEY3OiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4IChpbXBvcnQuYzo2MzUpCi0jICAgIGJ5IDB4NDhENEY0OiBsb2FkX3NvdXJjZV9tb2R1bGUgKGltcG9ydC5jOjkxMykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Zvcmtfd2FpdC5weSBiL0xpYi90ZXN0L2Zvcmtfd2FpdC5weQppbmRleCA1NjAwYmRiLi43ZWI1NWY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9mb3JrX3dhaXQucHkKKysrIGIvTGliL3Rlc3QvZm9ya193YWl0LnB5CkBAIC0zNCw3ICszNCwxNCBAQAogICAgICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6Ci0gICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0cGlkKCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgyICogU0hPUlRTTEVFUCkKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzcGlkLCBjcGlkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9vc3NhdWRpb2RldiBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CmluZGV4IDlmNTVhZmEuLmYwZGY1ZDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CisrKyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2CkBAIC0xLDMgKzEsMiBAQAogdGVzdF9vc3NhdWRpb2RldgotcGxheWluZyB0ZXN0IHNvdW5kIGZpbGUuLi4KLWVsYXBzZWQgdGltZTogMy4xIHNlYworcGxheWluZyB0ZXN0IHNvdW5kIGZpbGUgKGV4cGVjdGVkIHJ1bm5pbmcgdGltZTogMi45MyBzZWMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF90aHJlYWQgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF90aHJlYWQKaW5kZXggZDQ5NjUxZC4uNjhjNmE5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdGhyZWFkCisrKyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X3RocmVhZApAQCAtNCwzICs0LDE1IEBACiAKICoqKiBCYXJyaWVyIFRlc3QgKioqCiBhbGwgdGFza3MgZG9uZQorCisqKiogQ2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUgKioqCitjYXVnaHQgZXhwZWN0ZWQgVmFsdWVFcnJvciBzZXR0aW5nIHN0YWNrX3NpemUoNDA5NikKK3N1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSgyNjIxNDQpCitzdWNjZXNzZnVsbHkgc2V0IHN0YWNrX3NpemUoMTA0ODU3NikKK3N1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSgwKQordHJ5aW5nIHN0YWNrX3NpemUgPSAyNjIxNDQKK3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZQorYWxsIHRhc2tzIGRvbmUKK3RyeWluZyBzdGFja19zaXplID0gMTA0ODU3Ngord2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlCithbGwgdGFza3MgZG9uZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcmVncnRlc3QucHkgYi9MaWIvdGVzdC9yZWdydGVzdC5weQppbmRleCBjYTRhM2I1Li40NTUzODM4IDEwMDc1NQotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtNjYsNyArNjYsOSBAQAogCiAtTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCiB0eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCi0yIGJpbGlvbiBvYmplY3RzLCBhbmQgb25seSB3b3JrIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAorMiBiaWxsaW9uIG9iamVjdHMsIHdoaWNoIG9ubHkgd29ya3Mgb24gNjQtYml0IHN5c3RlbXMuIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3Rlc3RzIHRoYXQgdHJ5IHRvIGV4aGF1c3QgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MsIHdoaWNoIG9ubHkgbWFrZXMKK3NlbnNlIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGggYXQgbGVhc3QgMkdiIG9mIG1lbW9yeS4gVGhlIHBhc3NlZC1pbiBtZW1saW1pdCwKIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mICcyLjVHYicsIGRldGVybWluZXMgaG93bXVjaCBtZW1vcnkgdGhlCiB0ZXN0cyB3aWxsIGxpbWl0IHRoZW1zZWx2ZXMgdG8gKGJ1dCB0aGV5IG1heSBnbyBzbGlnaHRseSBvdmVyLikgVGhlIG51bWJlcgogc2hvdWxkbid0IGJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIG1hY2hpbmUgaGFzIChpbmNsdWRpbmcgc3dhcCBtZW1vcnkpLiBZb3UKQEAgLTQ5NiwxNCArNDk4LDMwIEBACiAKIGRlZiBydW50ZXN0KHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwgdGVzdGRpcj1Ob25lLCBodW50cmxlYWtzPUZhbHNlKToKICAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKwogICAgIHRlc3QgLS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QKICAgICBnZW5lcmF0ZSAtLSBpZiB0cnVlLCBnZW5lcmF0ZSBvdXRwdXQsIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdGVzdAotICAgIGFuZCBjb21wYXJpbmcgaXQgdG8gYSBwcmV2aW91c2x5IGNyZWF0ZWQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICBhbmQgY29tcGFyaW5nIGl0IHRvIGEgcHJldmlvdXNseSBjcmVhdGVkIG91dHB1dCBmaWxlCiAgICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCiAgICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCiAgICAgdGVzdGRpciAtLSB0ZXN0IGRpcmVjdG9yeQorICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCisgICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cworICAgIFJldHVybjoKKyAgICAgICAgLTIgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAorICAgICAgICAtMSAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgorICAgICAgICAgMCAgdGVzdCBmYWlsZWQKKyAgICAgICAgIDEgIHRlc3QgcGFzc2VkCiAgICAgIiIiCiAKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBydW50ZXN0X2lubmVyKHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwgdGVzdGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcykKKyAgICBmaW5hbGx5OgorICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCisKK2RlZiBydW50ZXN0X2lubmVyKHRlc3QsIGdlbmVyYXRlLCB2ZXJib3NlLCBxdWlldCwKKyAgICAgICAgICAgICAgICAgICAgIHRlc3RkaXI9Tm9uZSwgaHVudHJsZWFrcz1GYWxzZSk6CiAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCh0ZXN0KQogICAgIGlmIG5vdCB0ZXN0ZGlyOgogICAgICAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIoKQpAQCAtNTk1LDYgKzYxMywzNyBAQAogICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICAgcmV0dXJuIDAKIAorZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgorICAgIGltcG9ydCBzaHV0aWwKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluICh0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBudWtlcihuYW1lKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBtc2c6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSkKKwogZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKICAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgogICAgIGltcG9ydCBjb3B5X3JlZwpAQCAtNjM3LDcgKzY4Niw3IEBACiAKIGRlZiBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYyk6CiAgICAgaW1wb3J0IGdjLCBjb3B5X3JlZwotICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZSwgd2FybmluZ3MsIGRpcmNhY2hlCisgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlLCBkaXJjYWNoZQogICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyLCBtaW1ldHlwZXMsIGRvY3Rlc3QKICAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wCiAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKQEAgLTEyMjcsNiArMTI3NiwzNyBAQAogICAgICAgICB0ZXN0X3dpbnJlZwogICAgICAgICB0ZXN0X3dpbnNvdW5kCiAgICAgICAgICIiIiwKKyAgICAnbmV0YnNkMyc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2FlcGFjaworICAgICAgICB0ZXN0X2FsCisgICAgICAgIHRlc3RfYXBwbGVzaW5nbGUKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY2QKKyAgICAgICAgdGVzdF9jbAorICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dsCisgICAgICAgIHRlc3RfaW1nZmlsZQorICAgICAgICB0ZXN0X2xpbnV4YXVkaW9kZXYKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9tYWNmcworICAgICAgICB0ZXN0X21hY29zdG9vbHMKKyAgICAgICAgdGVzdF9uaXMKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BlcDI3NworICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQorICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdW5pY29kZV9maWxlCisgICAgICAgIHRlc3Rfd2lucmVnCisgICAgICAgIHRlc3Rfd2luc291bmQKKyAgICAgICAgIiIiLAogfQogX2V4cGVjdGF0aW9uc1snZnJlZWJzZDUnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KIF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q2J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKaW5kZXggYWFhMmRjMi4uNzM0NDdhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcjIsIHJlbSA9IGxlbihpKSsxLCAwCiAgICAgICAgICAgICAgICAgaWYgcmVtIG9yIHIxICE9IHIyOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbSwgMCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtLCAwLCAnJXMgIT0gMCBmb3IgJXMnICUgKHJlbSwgaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyLCAnJXMgIT0gJXMgZm9yICVzJyAlIChyMSwgcjIsIGkpKQogCiAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmNkZWZnaGlhYmMnLCAnZmluZCcsICdhYmMnKQpAQCAtNjM2LDYgKzYzNiwxMSBAQAogICAgICAgICBFUSgiYm9ib2JYYm9ib2IiLCAiYm9ib2JvYlhib2JvYm9iIiwgInJlcGxhY2UiLCAiYm9ib2IiLCAiYm9iIikKICAgICAgICAgRVEoIkJPQk9CT0IiLCAiQk9CT0JPQiIsICJyZXBsYWNlIiwgImJvYiIsICJib2JieSIpCiAKKyAgICAgICAgYmEgPSBidWZmZXIoJ2EnKQorICAgICAgICBiYiA9IGJ1ZmZlcignYicpCisgICAgICAgIEVRKCJiYmMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYSwgYmIpCisgICAgICAgIEVRKCJhYWMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYiwgYmEpCisKICAgICAgICAgIwogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmV0d290aHJlZScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnJykKQEAgLTgxOSw2ICs4MjQsMjEgQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJykKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJywgNDIpCiAKKyAgICAgICAgIyB0ZXN0IHR1cGxlIGFyZ3VtZW50cworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlJywgJ2hhJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2xvJywgJ2xsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlbGxveCcsICdoZWxsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgKCdoZWxsb3dvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcsICdsb3dvJyksIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnc3RhcnRzd2l0aCcsICgnaGVsbG93bycsICdlbGxvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnKSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdsbycsICdoZScpLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGVsJyksIDAsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGVsJyksIDAsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdGFydHN3aXRoJywgKDQyLCkpCisKICAgICBkZWYgdGVzdF9lbmRzd2l0aChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICdsbycpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2hlJykKQEAgLTg1Myw2ICs4NzMsMjEgQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcpCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCA0MikKIAorICAgICAgICAjIHRlc3QgdHVwbGUgYXJndW1lbnRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoYScpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdsbycsICdsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbG94JywgJ2hlbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICgnaGVsbG93bycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnLCAnbG93bycpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgKCdoZWxsb3dvJywgJ2VsbG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcpLCAzLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbCcsICdlbGwnKSwgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGUnLCAnaGVsbCcpLCAwLCA0KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoNDIsKSkKKwogICAgIGRlZiB0ZXN0X19fY29udGFpbnNfXyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcnLCAnX19jb250YWluc19fJywgJycpICAgICAgICAgIyB2ZXJlcSgnJyBpbiAnJywgVHJ1ZSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhYmMnLCAnX19jb250YWluc19fJywgJycpICAgICAgIyB2ZXJlcSgnJyBpbiAnYWJjJywgVHJ1ZSkKQEAgLTg3Miw3ICs5MDcsNyBAQAogICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdhYmMnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMTAwMCkpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2EnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMSkpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1JycsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAwKSkKLSAgICAgICAgIyBGSVhNRSBXaGF0IGFib3V0IG5lZ2F0aXZlIGluZGl6ZXM/IFRoaXMgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBieSBbXSBhbmQgX19nZXRpdGVtX18oc2xpY2UpCisgICAgICAgICMgRklYTUUgV2hhdCBhYm91dCBuZWdhdGl2ZSBpbmRpY2VzPyBUaGlzIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgYnkgW10gYW5kIF9fZ2V0aXRlbV9fKHNsaWNlKQogCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgJ2RlZicpCiAKQEAgLTkwOCw2ICs5NDMsOCBAQAogICAgICAgICAjIHRlc3QudGVzdF9zdHJpbmcuU3RyaW5nVGVzdC50ZXN0X2pvaW4pCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYSBiIGMgZCcsICcgJywgJ2pvaW4nLCBbJ2EnLCAnYicsICdjJywgJ2QnXSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNkJywgJycsICdqb2luJywgKCdhJywgJ2InLCAnYycsICdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYmQnLCAnJywgJ2pvaW4nLCAoJycsICdiJywgJycsICdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWMnLCAnJywgJ2pvaW4nLCAoJ2EnLCAnJywgJ2MnLCAnJykpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgndyB4IHkgeicsICcgJywgJ2pvaW4nLCBTZXF1ZW5jZSgpKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhJywgJ2pvaW4nLCAoJ2FiYycsKSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd6JywgJ2EnLCAnam9pbicsIFVzZXJMaXN0KFsneiddKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQppbmRleCA5Nzk5Zjg5Li5lYzU5ZDcxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CkBAIC0xMTMsNiArMTEzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIGV2YWwoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludChmbG9hdCgnMy4xNCcpICogMTAwKSwgMzE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgZmxvYXQoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKKyAgICAgICAgICAgIGlmIGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddICE9ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXS5qb2luKFsnMScsICcyMyddKSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChfTG9jYWxlVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CmluZGV4IGM2NGFkMjguLjE0ZmMwMTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0xNjAsNyArMTYwLDcgQEAKICgnTW9kdWxlJywgWygnRnVuY3Rpb25EZWYnLCAoMSwgMCksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgTm9uZSwgW10pLCBbKCdSZXR1cm4nLCAoMSwgOCksICgnTnVtJywgKDEsIDE1KSwgMSkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ0RlbGV0ZScsICgxLCAwKSwgWygnTmFtZScsICgxLCA0KSwgJ3YnLCAoJ0RlbCcsKSldKV0pLAogKCdNb2R1bGUnLCBbKCdBc3NpZ24nLCAoMSwgMCksIFsoJ05hbWUnLCAoMSwgMCksICd2JywgKCdTdG9yZScsKSldLCAoJ051bScsICgxLCA0KSwgMSkpXSksCi0oJ01vZHVsZScsIFsoJ0F1Z0Fzc2lnbicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAndicsICgnTG9hZCcsKSksICgnQWRkJywpLCAoJ051bScsICgxLCA1KSwgMSkpXSksCisoJ01vZHVsZScsIFsoJ0F1Z0Fzc2lnbicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAndicsICgnU3RvcmUnLCkpLCAoJ0FkZCcsKSwgKCdOdW0nLCAoMSwgNSksIDEpKV0pLAogKCdNb2R1bGUnLCBbKCdQcmludCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDgpLCAnZicsICgnTG9hZCcsKSksIFsoJ051bScsICgxLCAxMSksIDEpXSwgRmFsc2UpXSksCiAoJ01vZHVsZScsIFsoJ0ZvcicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDQpLCAndicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgOSksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCAxMSkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ1doaWxlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNiksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA4KSldLCBbXSldKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CmluZGV4IGY5MzU4N2EuLjk5MjYxNjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQpAQCAtMTMsNyArMTMsOCBAQAogICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICAgICAgc29jay5iaW5kKChIT1NULCBQT1JUKSkKKyAgICAgICAgZ2xvYmFsIFBPUlQKKyAgICAgICAgUE9SVCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc29jaywgSE9TVCwgUE9SVCkKICAgICAgICAgc29jay5saXN0ZW4oMSkKICAgICAgICAgY29ubiwgY2xpZW50ID0gc29jay5hY2NlcHQoKQogICAgICAgICBidWZmZXIgPSAiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkgYi9MaWIvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxNWZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkKQEAgLTAsMCArMSw0NiBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGJpZ2FkZHJzcGFjZXRlc3QsIE1BWF9QeV9zc2l6ZV90CisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgc3lzCisKKworY2xhc3MgU3RyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAYmlnYWRkcnNwYWNldGVzdAorICAgIGRlZiB0ZXN0X2NvbmNhdChzZWxmKToKKyAgICAgICAgczEgPSAneCcgKiBNQVhfUHlfc3NpemVfdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcGVyYXRvci5hZGQsIHMxLCAnPycpCisKKyAgICBAYmlnYWRkcnNwYWNldGVzdAorICAgIGRlZiB0ZXN0X29wdGltaXplZF9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSAneCcgKiBNQVhfUHlfc3NpemVfdAorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0geCArICc/JyAgICAgIyB0aGlzIHN0YXRlbWVudCB1c2VzIGEgZmFzdCBwYXRoIGluIGNldmFsLmMKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPdmVyZmxvd0Vycm9yIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCArPSAnPycgICAgICAgICMgdGhpcyBzdGF0ZW1lbnQgdXNlcyBhIGZhc3QgcGF0aCBpbiBjZXZhbC5jCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3ZlcmZsb3dFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih4KSwgTUFYX1B5X3NzaXplX3QpCisKKyAgICAjIyMgdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHBlbmRpbmcgYSBwYXRjaAorICAgICMgICAoaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA2LUp1bHkvMDY3Nzc0Lmh0bWwpCisgICAgI0BiaWdhZGRyc3BhY2V0ZXN0CisgICAgI2RlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAjICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9wZXJhdG9yLm11bCwgJ3gnLCBNQVhfUHlfc3NpemVfdCArIDEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnNldF9tZW1saW1pdChzeXMuYXJndlsxXSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkgYi9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQppbmRleCAyNTU0MjhmLi42ZDZjMzdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weQpAQCAtMjgsNyArMjgsNyBAQAogIyAgLSBXaGlsZSB0aGUgYmlnbWVtdGVzdCBkZWNvcmF0b3Igc3BlYWtzIG9mICdtaW5zaXplJywgYWxsIHRlc3RzIHdpbGwKICMgICAgYWN0dWFsbHkgYmUgY2FsbGVkIHdpdGggYSBtdWNoIHNtYWxsZXIgbnVtYmVyIHRvbywgaW4gdGhlIG5vcm1hbAogIyAgICB0ZXN0IHJ1biAoNUtiIGN1cnJlbnRseS4pIFRoaXMgaXMgc28gdGhlIHRlc3RzIHRoZW1zZWx2ZXMgZ2V0IGZyZXF1ZW50Ci0jICAgIHRlc3RpbmcgQ29uc2VxdWVudGx5LCBhbHdheXMgbWFrZSBhbGwgbGFyZ2UgYWxsb2NhdGlvbnMgYmFzZWQgb24gdGhlCisjICAgIHRlc3RpbmcuIENvbnNlcXVlbnRseSwgYWx3YXlzIG1ha2UgYWxsIGxhcmdlIGFsbG9jYXRpb25zIGJhc2VkIG9uIHRoZQogIyAgICBwYXNzZWQtaW4gJ3NpemUnLCBhbmQgZG9uJ3QgcmVseSBvbiB0aGUgc2l6ZSBiZWluZyB2ZXJ5IGxhcmdlLiBBbHNvLAogIyAgICBtZW11c2UtcGVyLXNpemUgc2hvdWxkIHJlbWFpbiBzYW5lIChsZXNzIHRoYW4gYSBmZXcgdGhvdXNhbmQpOyBpZiB5b3VyCiAjICAgIHRlc3QgdXNlcyBtb3JlLCBhZGp1c3QgJ3NpemUnIHVwd2FyZCwgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CmluZGV4IDUxM2U1NDEuLjQ3NGYzZGEgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQpAQCAtOCw3ICs4LDYgQEAKIGltcG9ydCBkYmhhc2ggIyBKdXN0IHNvIHdlIGtub3cgaXQncyBpbXBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotZnJvbSBzZXRzIGltcG9ydCBTZXQKIAogY2xhc3MgVGVzdEJTRERCKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBvcGVuZmxhZyA9ICdjJwpAQCAtNTMsNyArNTIsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZba10sIHYpCiAKICAgICBkZWYgYXNzZXJ0U2V0RXF1YWxzKHNlbGYsIHNlcW4xLCBzZXFuMik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU2V0KHNlcW4xKSwgU2V0KHNlcW4yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VxbjEpLCBzZXQoc2VxbjIpKQogCiAgICAgZGVmIHRlc3RfbWFwcGluZ19pdGVyYXRpb25fbWV0aG9kcyhzZWxmKToKICAgICAgICAgZiA9IHNlbGYuZgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IGU2ZTQ0NDAuLmM3ZTQzOTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTUzMiwxMyArNTMyLDI0IEBACiAgICAgQHJ1bl93aXRoX2xvY2FsZSgnTENfTlVNRVJJQycsICdmcl9GUicsICdkZV9ERScpCiAgICAgZGVmIHRlc3RfZmxvYXRfd2l0aF9jb21tYShzZWxmKToKICAgICAgICAgIyBzZXQgbG9jYWxlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgdXNlICcuJyBmb3IgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgIyBmbG9hdCBtdXN0IG5vdCBhY2NlcHQgdGhlIGxvY2FsZSBzcGVjaWZpYyBkZWNpbWFsIHBvaW50IGJ1dAorICAgICAgICAjIGl0IHN0aWxsIGhhcyB0byBhY2NlcHQgdGhlIG5vcm1hbCBweXRob24gc3ludGFjCiAgICAgICAgIGltcG9ydCBsb2NhbGUKICAgICAgICAgaWYgbm90IGxvY2FsZS5sb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXSA9PSAnLCc6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDMsMTQgICIpLCAzLjE0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgICszLDE0ICAiKSwgMy4xNCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAtMywxNCAgIiksIC0zLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDMuMTQgICIpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIrMy4xNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIi0zLjE0ICAiKSwgLTMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIi4xNCAgIiksIC4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy4gICIpLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjMuZTMgICIpLCAzMDAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjMuMmUzICAiKSwgMzIwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIyLjVlLTEgICIpLCAwLjI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCI1ZS0xIiksIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIDMsMTQgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICArMywxNCAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0zLDE0ICAiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgMHgzLjEgICIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAtMHgzLnAtMSAgIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAyNS5lLTEgICIpLCAyLjUpCkBAIC02MDMsNiArNjE0LDE5IEBACiAgICAgICAgIGRlZiBmKCk6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBbXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCB7fSkKKyAgICAgICAgIyBCdWcgMTUzNjAyMTogQWxsb3cgaGFzaCB0byByZXR1cm4gbG9uZyBvYmplY3RzCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIqKjEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGhhc2goWCgpKSksIGludCkKKyAgICAgICAgY2xhc3MgWShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKioxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHlwZShoYXNoKFkoKSkpLCBpbnQpCisgICAgICAgIGNsYXNzIFoobG9uZyk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGFzaChaKDQyKSksIGhhc2goNDJMKSkKIAogICAgIGRlZiB0ZXN0X2hleChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMTYpLCAnMHgxMCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J6Mi5weSBiL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CmluZGV4IDM1NmMyZTMuLmYxOTgxMTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnoyLnB5CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgYnoyZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSkKICAgICAgICAgeGxpbmVzID0gbGlzdChiejJmLnJlYWRsaW5lcygpKQogICAgICAgICBiejJmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWydUZXN0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeGxpbmVzLCBbJ1Rlc3QnXSkKIAogCiBjbGFzcyBCWjJDb21wcmVzc29yVGVzdChCYXNlVGVzdCk6CkBAIC0zNDQsNiArMzQ0LDcgQEAKICAgICAgICAgQloyRGVjb21wcmVzc29yVGVzdCwKICAgICAgICAgRnVuY1Rlc3QKICAgICApCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCBlYzg2MGQxLi41ZTg5ODYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTg3LDYgKzg3LDcgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbWRMaW5lVGVzdCkKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlLnB5CmluZGV4IDUyYmM4OTQuLjRlNjg2MzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGUucHkKQEAgLTYxLDYgKzYxLDIzIEBACiBmbGFnczogNjcKIGNvbnN0czogKCdOb25lJywpCiAKKz4+PiBkZWYgb3B0aW1pemVfYXdheSgpOgorLi4uICAgICAnZG9jIHN0cmluZycKKy4uLiAgICAgJ25vdCBhIGRvY3N0cmluZycKKy4uLiAgICAgNTMKKy4uLiAgICAgNTNMCisKKz4+PiBkdW1wKG9wdGltaXplX2F3YXkuZnVuY19jb2RlKQorbmFtZTogb3B0aW1pemVfYXdheQorYXJnY291bnQ6IDAKK25hbWVzOiAoKQordmFybmFtZXM6ICgpCitjZWxsdmFyczogKCkKK2ZyZWV2YXJzOiAoKQorbmxvY2FsczogMAorZmxhZ3M6IDY3Citjb25zdHM6ICgiJ2RvYyBzdHJpbmcnIiwgJ05vbmUnKQorCiAiIiIKIAogZGVmIGNvbnN0cyh0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggNmVhNDljYy4uODE1Mzk3OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTExNjYsNiArMTE2NiwxMiBAQAogICAgICAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRlbmNvZGVyKGVuY29kaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlbmNvZGVyKQogCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfbWFwX3R5cGVfaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgICAgIGZyb20gZW5jb2RpbmdzIGltcG9ydCBjcDExNDAKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2gsIHdlIGFyZSBvbmx5IHZlcmlmeWluZyB0aGVyZSdzIG5vIGNyYXNoLgorICAgICAgICB0YWJsZV90eXBlID0gdHlwZShjcDExNDAuZW5jb2RpbmdfdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFibGVfdHlwZSwgdGFibGVfdHlwZSkKKwogY2xhc3MgQmFzaWNTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CiAgICAgICAgIHMgPSAiYWJjMTIzIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKaW5kZXggMGY3ZDE1Zi4uYjcyYTFiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CkBAIC01LDcgKzUsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MsIHRlbXBmaWxlLCByZQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuCiBmcm9tIGNvbW1hbmRzIGltcG9ydCAqCiAKICMgVGhlIG1vZHVsZSBzYXlzOgpAQCAtNTgsNiArNTgsNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KENvbW1hbmRUZXN0cykKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDcyYzRmN2UuLmEzZjE1YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTE2Niw2ICsxNjYsMTYgQEAKICAgICAgICAgcGFzcyIiIgogICAgICAgICBjb21waWxlKHMsICI8c3RyaW5nPiIsICJleGVjIikKIAorICAgICMgVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHNwZWNpZmljIHRvIENQeXRob24gYW5kIG1heSBub3QgZ2VuZXJhbGl6ZQorICAgICMgdG8gb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgV2UgYXJlIHRyeWluZyB0byBlbnN1cmUgdGhhdCB3aGVuCisgICAgIyB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIHN0YXJ0cyBhZnRlciAyNTYsIGNvcnJlY3QgbGluZSBudW1iZXJzCisgICAgIyBpbiB0cmFjZWJhY2tzIGFyZSBzdGlsbCBwcm9kdWNlZC4KKyAgICBkZWYgdGVzdF9sZWFkaW5nX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzMjU2ID0gIiIuam9pbihbIlxuIl0gKiAyNTYgKyBbInNwYW0iXSkKKyAgICAgICAgY28gPSBjb21waWxlKHMyNTYsICdmbicsICdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19maXJzdGxpbmVubywgMjU3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2xub3RhYiwgJycpCisKICAgICBkZWYgdGVzdF9saXRlcmFsc193aXRoX2xlYWRpbmdfemVyb2VzKHNlbGYpOgogICAgICAgICBmb3IgYXJnIGluIFsiMDc3Nzg3IiwgIjB4aiIsICIweC4iLCAiMGUiLCAgIjA5MDAwMDAwMDAwMDAwMCIsCiAgICAgICAgICAgICAgICAgICAgICIwODAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDA5IiwgIjAwMDAwMDAwMDAwMDAwOCJdOgpAQCAtMjExLDYgKzIyMSwyNSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCItIiArIGFsbF9vbmVfYml0cyksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkhvdyBtYW55IGJpdHMgKmRvZXMqIHRoaXMgbWFjaGluZSBoYXZlPz8/IikKKyAgICAgICAgIyBWZXJpZnkgdHJlYXRtZW50IG9mIGNvbnRhbnQgZm9sZGluZyBvbiAtKHN5cy5tYXhpbnQrMSkKKyAgICAgICAgIyBpLmUuIC0yMTQ3NDgzNjQ4IG9uIDMyIGJpdCBwbGF0Zm9ybXMuICBTaG91bGQgcmV0dXJuIGludCwgbm90IGxvbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGV2YWwoIiVzIiAlICgtc3lzLm1heGludCAtIDEpKSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXZhbCgiJXMiICUgKC1zeXMubWF4aW50IC0gMikpLCBsb25nKSkKKworICAgIGlmIHN5cy5tYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgZGVmIHRlc3RfMzJfNjNfYml0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgICAgIGEgPSArNDI5NDk2NzI5NiAgIyAxIDw8IDMyCisgICAgICAgICAgICBiID0gLTQyOTQ5NjcyOTYgICMgMSA8PCAzMgorICAgICAgICAgICAgYyA9ICsyODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZCA9IC0yODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZSA9ICs0NjExNjg2MDE4NDI3Mzg3OTA0ICAjIDEgPDwgNjIKKyAgICAgICAgICAgIGYgPSAtNDYxMTY4NjAxODQyNzM4NzkwNCAgIyAxIDw8IDYyCisgICAgICAgICAgICBnID0gKzkyMjMzNzIwMzY4NTQ3NzU4MDcgICMgMSA8PCA2MyAtIDEKKyAgICAgICAgICAgIGggPSAtOTIyMzM3MjAzNjg1NDc3NTgwNyAgIyAxIDw8IDYzIC0gMQorCisgICAgICAgICAgICBmb3IgdmFyaWFibGUgaW4gc2VsZi50ZXN0XzMyXzYzX2JpdF92YWx1ZXMuZnVuY19jb2RlLmNvX2NvbnN0czoKKyAgICAgICAgICAgICAgICBpZiB2YXJpYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFyaWFibGUsIGludCkpCiAKICAgICBkZWYgdGVzdF9zZXF1ZW5jZV91bnBhY2tpbmdfZXJyb3Ioc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHNlcXVlbmNlIHBhY2tpbmcvdW5wYWNraW5nIHdpdGggIm9yIi4gIFNGIGJ1ZyAjNzU3ODE4CkBAIC0yMzgsNiArMjY3LDggQEAKICAgICAgICAgc3VjY2VlZCA9IFsKICAgICAgICAgICAgICdpbXBvcnQgc3lzJywKICAgICAgICAgICAgICdpbXBvcnQgb3MsIHN5cycsCisgICAgICAgICAgICAnaW1wb3J0IG9zIGFzIGJhcicsCisgICAgICAgICAgICAnaW1wb3J0IG9zLnBhdGggYXMgYmFyJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMsIGdlbmVyYXRvcnMnLAogICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKG5lc3RlZF9zY29wZXMsXG5nZW5lcmF0b3JzKScsCiAgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAobmVzdGVkX3Njb3BlcyxcbmdlbmVyYXRvcnMsKScsCkBAIC0yNTcsNiArMjg4LDEwIEBACiAgICAgICAgICAgICAnaW1wb3J0IChzeXMnLAogICAgICAgICAgICAgJ2ltcG9ydCBzeXMpJywKICAgICAgICAgICAgICdpbXBvcnQgKG9zLCknLAorICAgICAgICAgICAgJ2ltcG9ydCBvcyBBcyBiYXInLAorICAgICAgICAgICAgJ2ltcG9ydCBvcy5wYXRoIGEgYmFyJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gQXMgc3Rkb3V0JywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gYSBzdGRvdXQnLAogICAgICAgICAgICAgJ2Zyb20gKHN5cykgaW1wb3J0IHN0ZGluJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChuZXN0ZWRfc2NvcGVzJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMpJywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CmluZGV4IDQ4ZjE2NDMuLjFlZmI2YTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQpAQCAtNTYsMTMgKzU2LDMwIEBACiAgICAgZGVmIHRlc3RZaWVsZEV4cHIoc2VsZik6CiAgICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoImRlZiBnKCk6IHlpZWxkXG5cbiIsICI8c3RyaW5nPiIsICJleGVjIikKIAorICAgIGRlZiB0ZXN0VHJ5RXhjZXB0RmluYWxseShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgZXhjZXB0IGFuZCBmaW5hbGx5IGNsYXVzZXMgaW4gb25lIHRyeSBzdG10IGFyZSByZWNvZ25pemVkCisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCJ0cnk6XG4gMS8wXG5leGNlcHQ6XG4gZSA9IDFcbmZpbmFsbHk6XG4gZiA9IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN0cmluZz4iLCAiZXhlYyIpCisgICAgICAgIGRjdCA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGN0LmdldCgnZScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkY3QuZ2V0KCdmJyksIDEpCisKICAgICBkZWYgdGVzdERlZmF1bHRBcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZXIucGFyc2UsICJkZWYgZm9vKGE9MSwgYik6IHBhc3MiKQogCisgICAgZGVmIHRlc3REb2NzdHJpbmdzKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnX19kb2NfXycgaW4gYy5jb19uYW1lcykKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2RlZiBmKCk6XG4gImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGcgPSB7fQorICAgICAgICBleGVjIGMgaW4gZworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhnWydmJ10uX19kb2NfXywgImRvYyIpCisKICAgICBkZWYgdGVzdExpbmVObyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgYWxsIG5vZGVzIGV4Y2VwdCBNb2R1bGUgaGF2ZSBhIGNvcnJlY3QgbGluZW5vIGF0dHJpYnV0ZS4KICAgICAgICAgZmlsZW5hbWUgPSBfX2ZpbGVfXwotICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnB5YyIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIucHlvIik6CisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTFdCiAgICAgICAgIHRyZWUgPSBjb21waWxlci5wYXJzZUZpbGUoZmlsZW5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfbGluZW5vKHRyZWUpCkBAIC04Nyw2ICsxMDQsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmxhdHRlbihbMSwgWzJdXSksIFsxLCAyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmxhdHRlbigoMSwgKDIsKSkpLCBbMSwgMl0pCiAKKyAgICBkZWYgdGVzdE5lc3RlZFNjb3BlKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZGVmIGcoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBhID0gMVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRlZiBmKCk6IHJldHVybiBhICsgMlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHJldHVybiBmKClcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCA9IGcoKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJykKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkY3QuZ2V0KCdyZXN1bHQnKSwgMykKKworCiBOT0xJTkVOTyA9IChjb21waWxlci5hc3QuTW9kdWxlLCBjb21waWxlci5hc3QuU3RtdCwgY29tcGlsZXIuYXN0LkRpc2NhcmQpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEwMyw2ICsxMzMsMTIgQEAKIGwgPSBbKHgsIHkpIGZvciB4LCB5IGluIHppcChyYW5nZSg1KSwgcmFuZ2UoNSwxMCkpXQogbFswXQogbFszOjRdCitkID0geydhJzogMn0KK2QgPSB7fQordCA9ICgpCit0ID0gKDEsIDIpCitsID0gW10KK2wgPSBbMSwgMl0KIGlmIGw6CiAgICAgcGFzcwogZWxzZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3Vyc2VzLnB5IGIvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKaW5kZXggZGMyZjIwYi4uNDAyMjE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkKQEAgLTIxMiw2ICsyMTIsMTMgQEAKICAgICAgICAgICAgIG0gPSBjdXJzZXMuZ2V0bW91c2UoKQogICAgICAgICAgICAgY3Vyc2VzLnVuZ2V0bW91c2UoKm0pCiAKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ2lzX3Rlcm1fcmVzaXplZCcpOgorICAgICAgICBjdXJzZXMuaXNfdGVybV9yZXNpemVkKCpzdGRzY3IuZ2V0bWF4eXgoKSkKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ3Jlc2l6ZXRlcm0nKToKKyAgICAgICAgY3Vyc2VzLnJlc2l6ZXRlcm0oKnN0ZHNjci5nZXRtYXh5eCgpKQorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXplX3Rlcm0nKToKKyAgICAgICAgY3Vyc2VzLnJlc2l6ZV90ZXJtKCpzdGRzY3IuZ2V0bWF4eXgoKSkKKwogZGVmIHVuaXRfdGVzdHMoKToKICAgICBmcm9tIGN1cnNlcyBpbXBvcnQgYXNjaWkKICAgICBmb3IgY2gsIGV4cGVjdGVkIGluIFsoJ2EnLCAnYScpLCAoJ0EnLCAnQScpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKaW5kZXggYjVhNjYyOC4uMTM0YjVhOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CkBAIC00LDYgKzQsNyBAQAogaW1wb3J0IGNvcHkKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAogCkBAIC0xMzEsNSArMTMyLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCiAKIAorZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdERlZmF1bHREaWN0KQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCA4ZWU0MzFiLi40YTM5YmU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTE4OTksNiArMTg5OSwxNiBAQAogICAgICAgICBwcm9wMiA9IHByb3BlcnR5KGZzZXQ9c2V0dGVyKQogICAgICAgICB2ZXJlcShwcm9wMi5fX2RvY19fLCBOb25lKQogCisgICAgIyB0aGlzIHNlZ2ZhdWx0ZWQgaW4gMi41YjIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBwID0gcHJvcGVydHkoX3Rlc3RjYXBpLnRlc3Rfd2l0aF9kb2NzdHJpbmcpCisKKwogZGVmIHN1cGVycygpOgogICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIHN1cGVyLi4uIgogCkBAIC0zMDQ2LDYgKzMwNTYsMjEgQEAKICAgICBsaXN0Ll9faW5pdF9fKGEsIHNlcXVlbmNlPVswLCAxLCAyXSkKICAgICB2ZXJlcShhLCBbMCwgMSwgMl0pCiAKK2RlZiByZWN1cnNpdmVfX2NhbGxfXygpOgorICAgIGlmIHZlcmJvc2U6IHByaW50ICgiVGVzdGluZyByZWN1cnNpdmUgX19jYWxsX18oKSBieSBzZXR0aW5nIHRvIGluc3RhbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyAuLi4iKQorICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgcGFzcworCisgICAgQS5fX2NhbGxfXyA9IEEoKQorICAgIHRyeToKKyAgICAgICAgQSgpKCkKKyAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiUmVjdXJzaW9uIGxpbWl0IHNob3VsZCBoYXZlIGJlZW4gcmVhY2hlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2NhbGxfXygpIikKKwogZGVmIGRlbGhvb2soKToKICAgICBpZiB2ZXJib3NlOiBwcmludCAiVGVzdGluZyBfX2RlbF9fIGhvb2suLi4iCiAgICAgbG9nID0gW10KQEAgLTM4MDMsNiArMzgyOCwxMyBAQAogICAgIG8ud2hhdGV2ZXIgPSBQcm92b2tlcihvKQogICAgIGRlbCBvCiAKK2RlZiB3cmFwcGVyX3NlZ2ZhdWx0KCk6CisgICAgIyBTRiA5MjcyNDg6IGRlZXBseSBuZXN0ZWQgd3JhcHBlcnMgY291bGQgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cKKyAgICBmID0gbGFtYmRhOk5vbmUKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMDAwMCk6CisgICAgICAgIGYgPSBmLl9fY2FsbF9fCisgICAgZiA9IE5vbmUKKwogIyBGaXggU0YgIzc2MjQ1NSwgc2VnZmF1bHQgd2hlbiBzeXMuc3Rkb3V0IGlzIGNoYW5nZWQgaW4gZ2V0YXR0cgogZGVmIGZpbGVmYXVsdCgpOgogICAgIGlmIHZlcmJvc2U6CkBAIC0zOTU3LDYgKzM5ODksNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgd2Vha3JlZl9zZWdmYXVsdCgpICMgTXVzdCBiZSBmaXJzdCwgc29tZWhvdworICAgIHdyYXBwZXJfc2VnZmF1bHQoKQogICAgIGRvX3RoaXNfZmlyc3QoKQogICAgIGNsYXNzX2RvY3N0cmluZ3MoKQogICAgIGxpc3RzKCkKQEAgLTQwMTUsNiArNDA0OCw3IEBACiAgICAgYnVmZmVyX2luaGVyaXQoKQogICAgIHN0cl9vZl9zdHJfc3ViY2xhc3MoKQogICAgIGt3ZGFyZ3MoKQorICAgIHJlY3Vyc2l2ZV9fY2FsbF9fKCkKICAgICBkZWxob29rKCkKICAgICBoYXNoaW5oZXJpdCgpCiAgICAgc3Ryb3BzKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKaW5kZXggMDgxOTQxZC4uYzMxMDkyYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKQEAgLTgxLDYgKzgxLDEzIEBACiAgICAgIGJ1ZzEzMzM5ODIuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMiwKICAgICAgYnVnMTMzMzk4Mi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAzKQogCitfQklHX0xJTkVOT19GT1JNQVQgPSAiIiJcCislM2QgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHNwYW0pCisgICAgICAgICAgICAgIDMgUE9QX1RPUAorICAgICAgICAgICAgICA0IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgICA3IFJFVFVSTl9WQUxVRQorIiIiCisKIGNsYXNzIERpc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgZG9fZGlzYXNzZW1ibHlfdGVzdChzZWxmLCBmdW5jLCBleHBlY3RlZCk6CiAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCkBAIC0xMjQsNiArMTMxLDIzIEBACiAgICAgICAgIGlmIF9fZGVidWdfXzoKICAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChidWcxMzMzOTgyLCBkaXNfYnVnMTMzMzk4MikKIAorICAgIGRlZiB0ZXN0X2JpZ19saW5lbm9zKHNlbGYpOgorICAgICAgICBkZWYgZnVuYyhjb3VudCk6CisgICAgICAgICAgICBuYW1lc3BhY2UgPSB7fQorICAgICAgICAgICAgZnVuYyA9ICJkZWYgZm9vKCk6XG4gIiArICIiLmpvaW4oWyJcbiAiXSAqIGNvdW50ICsgWyJzcGFtXG4iXSkKKyAgICAgICAgICAgIGV4ZWMgZnVuYyBpbiBuYW1lc3BhY2UKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VbJ2ZvbyddCisKKyAgICAgICAgIyBUZXN0IGFsbCBzbWFsbCByYW5nZXMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIDMwMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKworICAgICAgICAjIFRlc3Qgc29tZSBsYXJnZXIgcmFuZ2VzIHRvbworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMzAwLCA1MDAwLCAxMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChEaXNUZXN0cykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IDAxZjdhY2QuLmU4Mzc5YzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTQxOSw3ICs0MTksNiBAQAogCiAgICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpCiAgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlQ2xhc3MpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMyAgU2FtcGxlQ2xhc3MKQEAgLTQzNSw3ICs0MzQsNiBAQAogTmV3LXN0eWxlIGNsYXNzZXMgYXJlIGFsc28gc3VwcG9ydGVkOgogCiAgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlTmV3U3R5bGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzCkBAIC00NzUsNyArNDczLDYgQEAKICAgICA+Pj4gIyBpZ25vcmluZyB0aGUgb2JqZWN0cyBzaW5jZSB0aGV5IHdlcmVuJ3QgZGVmaW5lZCBpbiBtLgogICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKICAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChtLCBtb2R1bGU9dGVzdC50ZXN0X2RvY3Rlc3QpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMSAgc29tZV9tb2R1bGUKQEAgLTQ5OSw3ICs0OTYsNiBAQAogCiAgICAgPj4+IGZyb20gdGVzdCBpbXBvcnQgZG9jdGVzdF9hbGlhc2VzCiAgICAgPj4+IHRlc3RzID0gZXhjbF9lbXB0eV9maW5kZXIuZmluZChkb2N0ZXN0X2FsaWFzZXMpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBwcmludCBsZW4odGVzdHMpCiAgICAgMgogICAgID4+PiBwcmludCB0ZXN0c1swXS5uYW1lCkBAIC01MTcsNyArNTEzLDYgQEAKIEJ5IGRlZmF1bHQsIGFuIG9iamVjdCB3aXRoIG5vIGRvY3Rlc3RzIGRvZXNuJ3QgY3JlYXRlIGFueSB0ZXN0czoKIAogICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoU2FtcGxlQ2xhc3MpCi0gICAgPj4+IHRlc3RzLnNvcnQoKQogICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKICAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKICAgICAgMyAgU2FtcGxlQ2xhc3MKQEAgLTUzNiw3ICs1MzEsNiBAQAogZGlzcGxheXMuCiAKICAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1GYWxzZSkuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpAQCAtNTU3LDcgKzU1MSw2IEBACiB1c2luZyB0aGUgYHJlY3Vyc2VgIGZsYWc6CiAKICAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIocmVjdXJzZT1GYWxzZSkuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQppbmRleCBhYWRkNTM3Li5jNTUwYTZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpAQCAtMSwxMSArMSwxNSBAQAogIyBDb3B5cmlnaHQgKEMpIDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcwogCi1pbXBvcnQgdW5pdHRlc3QKICMgVGhlIHNwZWNpZmljIHRlc3RzIG5vdyBsaXZlIGluIExpYi9lbWFpbC90ZXN0Ci1mcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbF9jb2RlY3MgaW1wb3J0IHN1aXRlCitmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzCitmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdWl0ZSA9IHRlc3RfZW1haWxfY29kZWNzLnN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQuc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3N1aXRlKHN1aXRlKQogCi0MCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CmluZGV4IGViZTYwYzEuLmJlMmNjYTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTMxNCw2ICszMTQsMTggQEAKICAgICAgICAgeCA9IERlcml2ZWRFeGNlcHRpb24oZmFuY3lfYXJnPTQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LmZhbmN5X2FyZywgNDIpCiAKKyAgICBkZWYgdGVzdEluZmluaXRlUmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGYpCisKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBnKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvblRlc3RzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5IGIvTGliL3Rlc3QvdGVzdF9mY250bC5weQppbmRleCBmNTNiMTNhLi41OGE1N2I1IDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKQEAgLTIwLDkgKzIwLDEwIEBACiBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYXRoZW9zJyk6CiAgICAgc3RhcnRfbGVuID0gInFxIgogCi1pZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywgJ25ldGJzZDInLCAnRGFyd2luMS4yJywgJ2RhcndpbicsCi0gICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsICdmcmVlYnNkNicsCi0gICAgICAgICAgICAgICAgICAgICdmcmVlYnNkNycsCitpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywgJ25ldGJzZDInLCAnbmV0YnNkMycsCisgICAgICAgICAgICAgICAgICAgICdEYXJ3aW4xLjInLCAnZGFyd2luJywKKyAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywKKyAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywKICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0JywKICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QnLCAnb3BlbmJzZDInLCAnb3BlbmJzZDMnKToKICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSA9PSA4OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IGRjZmEyNjUuLjIzNDkyMGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTExLDE0ICsxMSwxMiBAQAogICAgICMgZmlsZSB0ZXN0cyBmb3Igd2hpY2ggYSB0ZXN0IGZpbGUgaXMgYXV0b21hdGljYWxseSBzZXQgdXAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5mID0gZmlsZShURVNURk4sICd3YicpCisgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCAnd2InKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBzZWxmLmY6Ci0gICAgICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHNlbGYuZjoKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIG9zLnJlbW92ZShURVNURk4pCiAKICAgICBkZWYgdGVzdFdlYWtSZWZzKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB3ZWFrIHJlZmVyZW5jZXMKQEAgLTgwLDkgKzc4LDExIEBACiAKICAgICBkZWYgdGVzdFdyaXRlbGluZXNOb25TdHJpbmcoc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBub24tc3RyaW5nIG9iamVjdAotICAgICAgICBjbGFzcyBOb25TdHJpbmc6IHBhc3MKKyAgICAgICAgY2xhc3MgTm9uU3RyaW5nOgorICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIFtOb25TdHJpbmcoKSwgTm9uU3RyaW5nKCldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9uU3RyaW5nKCksIE5vblN0cmluZygpXSkKIAogICAgIGRlZiB0ZXN0UmVwcihzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgcmVwciB3b3JrcwpAQCAtOTMsMTkgKzkzLDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYubmFtZSwgVEVTVEZOKQogICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuaXNhdHR5KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5jbG9zZWQpCi0gICAgICAgIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5yZWFkaW50bywgIiIpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydF8oZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdmbHVzaCcsICdpc2F0dHknLCAnbmV4dCcsICdyZWFkJywgJ3JlYWRpbnRvJywKLSAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsICd3cml0ZScsCi0gICAgICAgICAgICAgICAgICAgJ19faXRlcl9fJ10KKyAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsCisgICAgICAgICAgICAgICAgICAgJ3dyaXRlJywgJ19faXRlcl9fJ10KICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgogICAgICAgICAgICAgbWV0aG9kcy5yZW1vdmUoJ3RydW5jYXRlJykKIAotICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQorICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCiAKICAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gbWV0aG9kczoKICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQpAQCAtMTEzLDYgKzExNSwxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWV0aG9kKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgW10pCiAKKyAgICAgICAgIyBmaWxlIGlzIGNsb3NlZCwgX19leGl0X18gc2hvdWxkbid0IGRvIGFueXRoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKSwgTm9uZSkKKyAgICAgICAgIyBpdCBtdXN0IGFsc28gcmV0dXJuIE5vbmUgaWYgYW4gZXhjZXB0aW9uIHdhcyBnaXZlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5mLl9fZXhpdF9fKCpzeXMuZXhjX2luZm8oKSksIE5vbmUpCisKIAogY2xhc3MgT3RoZXJGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xMjAsNyArMTMwLDcgQEAKICAgICAgICAgIyBjaGVjayBpbnZhbGlkIG1vZGUgc3RyaW5ncwogICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiKToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBmID0gZmlsZShURVNURk4sIG1vZGUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxzZToKQEAgLTE0Miw2ICsxNTIsNyBAQAogICAgICAgICBmID0gb3Blbih1bmljb2RlKFRFU1RGTiksICJ3IikKICAgICAgICAgc2VsZi5hc3NlcnRfKHJlcHIoZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSB1JyIgKyBURVNURk4pKQogICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CkBAIC0xODIsMTEgKzE5MywxMSBAQAogICAgICAgICBkZWYgYnVnODAxNjMxKCk6CiAgICAgICAgICAgICAjIFNGIGJ1ZyA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzgwMTYzMT4KICAgICAgICAgICAgICMgImZpbGUudHJ1bmNhdGUgZmF1bHQgb24gd2luZG93cyIKLSAgICAgICAgICAgIGYgPSBmaWxlKFRFU1RGTiwgJ3diJykKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3diJykKICAgICAgICAgICAgIGYud3JpdGUoJzEyMzQ1Njc4OTAxJykgICAjIDExIGJ5dGVzCiAgICAgICAgICAgICBmLmNsb3NlKCkKIAotICAgICAgICAgICAgZiA9IGZpbGUoVEVTVEZOLCdyYisnKQorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCdyYisnKQogICAgICAgICAgICAgZGF0YSA9IGYucmVhZCg1KQogICAgICAgICAgICAgaWYgZGF0YSAhPSAnMTIzNDUnOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVhZCBvbiBmaWxlIG9wZW5lZCBmb3IgdXBkYXRlIGZhaWxlZCAlciIgJSBkYXRhKQpAQCAtMjA4LDE0ICsyMTksMTQgQEAKICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKICAgICBkZWYgdGVzdEl0ZXJhdGlvbihzZWxmKToKLSAgICAgICAgIyBUZXN0IHRoZSBjb21wbGV4IGludGVyYWN0aW9uIHdoZW4gbWl4aW5nIGZpbGUtaXRlcmF0aW9uIGFuZCB0aGUgdmFyaW91cwotICAgICAgICAjIHJlYWQqIG1ldGhvZHMuIE9zdGVuc2libHksIHRoZSBtaXh0dXJlIGNvdWxkIGp1c3QgYmUgdGVzdGVkIHRvIHdvcmsKLSAgICAgICAgIyB3aGVuIGl0IHNob3VsZCB3b3JrIGFjY29yZGluZyB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLCBpbnN0ZWFkIG9mIGZhaWwKLSAgICAgICAgIyB3aGVuIGl0IHNob3VsZCBmYWlsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBDUHl0aG9uIGltcGxlbWVudGF0aW9uLgotICAgICAgICAjIFBlb3BsZSBkb24ndCBhbHdheXMgcHJvZ3JhbSBQeXRob24gdGhlIHdheSB0aGV5IHNob3VsZCwgdGhvdWdoLCBhbmQgdGhlCi0gICAgICAgICMgaW1wbGVtZW5hdGlvbiBtaWdodCBjaGFuZ2UgaW4gc3VidGxlIHdheXMsIHNvIHdlIGV4cGxpY2l0bHkgdGVzdCBmb3IKLSAgICAgICAgIyBlcnJvcnMsIHRvbzsgdGhlIHRlc3Qgd2lsbCBqdXN0IGhhdmUgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZQotICAgICAgICAjIGltcGxlbWVudGF0aW9uIGNoYW5nZXMuCisgICAgICAgICMgVGVzdCB0aGUgY29tcGxleCBpbnRlcmFjdGlvbiB3aGVuIG1peGluZyBmaWxlLWl0ZXJhdGlvbiBhbmQgdGhlCisgICAgICAgICMgdmFyaW91cyByZWFkKiBtZXRob2RzLiBPc3RlbnNpYmx5LCB0aGUgbWl4dHVyZSBjb3VsZCBqdXN0IGJlIHRlc3RlZAorICAgICAgICAjIHRvIHdvcmsgd2hlbiBpdCBzaG91bGQgd29yayBhY2NvcmRpbmcgdG8gdGhlIFB5dGhvbiBsYW5ndWFnZSwKKyAgICAgICAgIyBpbnN0ZWFkIG9mIGZhaWwgd2hlbiBpdCBzaG91bGQgZmFpbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgQ1B5dGhvbgorICAgICAgICAjIGltcGxlbWVudGF0aW9uLiAgUGVvcGxlIGRvbid0IGFsd2F5cyBwcm9ncmFtIFB5dGhvbiB0aGUgd2F5IHRoZXkKKyAgICAgICAgIyBzaG91bGQsIHRob3VnaCwgYW5kIHRoZSBpbXBsZW1lbmF0aW9uIG1pZ2h0IGNoYW5nZSBpbiBzdWJ0bGUgd2F5cywKKyAgICAgICAgIyBzbyB3ZSBleHBsaWNpdGx5IHRlc3QgZm9yIGVycm9ycywgdG9vOyB0aGUgdGVzdCB3aWxsIGp1c3QgaGF2ZSB0bworICAgICAgICAjIGJlIHVwZGF0ZWQgd2hlbiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KICAgICAgICAgZGF0YW9mZnNldCA9IDE2Mzg0CiAgICAgICAgIGZpbGxlciA9ICJoYW1cbiIKICAgICAgICAgYXNzZXJ0IG5vdCBkYXRhb2Zmc2V0ICUgbGVuKGZpbGxlciksIFwKQEAgLTI1MywxMiArMjY0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZG5hbWUsIGFyZ3MpKQogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZCBpdGVyYXRpb24KLSAgICAgICAgICAgICMgc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgaXRlcmF0aW9uCi0gICAgICAgICAgICAjIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYSBmbGV4aWJsZSBtYW5uZXIuCi0gICAgICAgICAgICAjIEVhY2ggbGluZSBpbiB0aGUgYmFnIG8nIGhhbSBpcyA0IGJ5dGVzICgiaCIsICJhIiwgIm0iLCAiXG4iKSwgc28KLSAgICAgICAgICAgICMgNDA5NiBsaW5lcyBvZiB0aGF0IHNob3VsZCBnZXQgdXMgZXhhY3RseSBvbiB0aGUgYnVmZmVyIGJvdW5kYXJ5IGZvcgotICAgICAgICAgICAgIyBhbnkgcG93ZXItb2YtMiBidWZmZXJzaXplIGJldHdlZW4gNCBhbmQgMTYzODQgKGluY2x1c2l2ZSkuCisgICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZAorICAgICAgICAgICAgIyBpdGVyYXRpb24gc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwKKyAgICAgICAgICAgICMgaXRlcmF0aW9uIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYQorICAgICAgICAgICAgIyBmbGV4aWJsZSBtYW5uZXIuICBFYWNoIGxpbmUgaW4gdGhlIGJhZyBvJyBoYW0gaXMgNCBieXRlcworICAgICAgICAgICAgIyAoImgiLCAiYSIsICJtIiwgIlxuIiksIHNvIDQwOTYgbGluZXMgb2YgdGhhdCBzaG91bGQgZ2V0IHVzCisgICAgICAgICAgICAjIGV4YWN0bHkgb24gdGhlIGJ1ZmZlciBib3VuZGFyeSBmb3IgYW55IHBvd2VyLW9mLTIgYnVmZmVyc2l6ZQorICAgICAgICAgICAgIyBiZXR3ZWVuIDQgYW5kIDE2Mzg0IChpbmNsdXNpdmUpLgogICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAncmInKQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmNodW5rcyk6CiAgICAgICAgICAgICAgICAgZi5uZXh0KCkKQEAgLTMxOSw3ICszMzEsMTMgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KEF1dG9GaWxlVGVzdHMsIE90aGVyRmlsZVRlc3RzKQorICAgICMgSGlzdG9yaWNhbGx5LCB0aGVzZSB0ZXN0cyBoYXZlIGJlZW4gc2xvcHB5IGFib3V0IHJlbW92aW5nIFRFU1RGTi4KKyAgICAjIFNvIGdldCByaWQgb2YgaXQgbm8gbWF0dGVyIHdoYXQuCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoQXV0b0ZpbGVUZXN0cywgT3RoZXJGaWxlVGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weQppbmRleCBjNTQxMTljLi41MDM1NjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5CkBAIC0xLDUgKzEsNSBAQAogCi1pbXBvcnQgb3MsIGZpbGVjbXAsIHNodXRpbCwgdGVtcGZpbGUKK2ltcG9ydCBvcywgZmlsZWNtcCwgc2h1dGlsLCB0ZW1wZmlsZSwgc2h1dGlsCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgc2VsZi5jYXNlaW5zZW5zaXRpdmUgPSBvcy5wYXRoLm5vcm1jYXNlKCdBJykgPT0gb3MucGF0aC5ub3JtY2FzZSgnYScpCiAgICAgICAgIGRhdGEgPSAnQ29udGVudHMgb2YgZmlsZSBnbyBoZXJlLlxuJwogICAgICAgICBmb3IgZGlyIGluIFtzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgc2VsZi5kaXJfZGlmZl06CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpciwgVHJ1ZSkKICAgICAgICAgICAgIG9zLm1rZGlyKGRpcikKICAgICAgICAgICAgIGlmIHNlbGYuY2FzZWluc2Vuc2l0aXZlIGFuZCBkaXIgaXMgc2VsZi5kaXJfc2FtZToKICAgICAgICAgICAgICAgICBmbiA9ICdGaUxlJyAgICAgIyBWZXJpZnkgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQppbmRleCBjYmE1ZmM3Li5lNjRlMzk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKQEAgLTIsOCArMiw5IEBACiAiIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgdGltZQogZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIAogdHJ5OgogICAgIG9zLmZvcmsKQEAgLTEyLDEyICsxMywyMCBAQAogCiBjbGFzcyBGb3JrVGVzdChGb3JrV2FpdCk6CiAgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKLSAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXRwaWQoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChGb3JrVGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IGExODRhOGIuLmVlMzY0MTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTE0OTcsMjIgKzE0OTcsNTUgQEAKIDx0eXBlICdnZW5lcmF0b3InPgogCiAKK0EgeWllbGQgZXhwcmVzc2lvbiB3aXRoIGF1Z21lbnRlZCBhc3NpZ25tZW50LgorCis+Pj4gZGVmIGNvcm91dGluZShzZXEpOgorLi4uICAgICBjb3VudCA9IDAKKy4uLiAgICAgd2hpbGUgY291bnQgPCAyMDA6CisuLi4gICAgICAgICBjb3VudCArPSB5aWVsZAorLi4uICAgICAgICAgc2VxLmFwcGVuZChjb3VudCkKKz4+PiBzZXEgPSBbXQorPj4+IGMgPSBjb3JvdXRpbmUoc2VxKQorPj4+IGMubmV4dCgpCis+Pj4gcHJpbnQgc2VxCitbXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMF0KKz4+PiBjLnNlbmQoMTApCis+Pj4gcHJpbnQgc2VxCitbMTAsIDIwXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMCwgMjAsIDMwXQorCisKIENoZWNrIHNvbWUgc3ludGF4IGVycm9ycyBmb3IgeWllbGQgZXhwcmVzc2lvbnM6CiAKID4+PiBmPWxhbWJkYTogKHlpZWxkIDEpLCh5aWVsZCAyKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KLVN5bnRheEVycm9yOiAneWllbGQnIG91dHNpZGUgZnVuY3Rpb24gKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsxMF0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogJ3lpZWxkJyBvdXRzaWRlIGZ1bmN0aW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjFdPiwgbGluZSAxKQogCiA+Pj4gZGVmIGYoKTogcmV0dXJuIGxhbWJkYSB4PSh5aWVsZCk6IDEKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1TeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMTFdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6ICdyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzIyXT4sIGxpbmUgMSkKIAogPj4+IGRlZiBmKCk6IHggPSB5aWVsZCA9IHkKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1TeW50YXhFcnJvcjogYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzEyXT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjNdPiwgbGluZSAxKQorCis+Pj4gZGVmIGYoKTogKHlpZWxkIGJhcikgPSB5CitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byB5aWVsZCBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjRdPiwgbGluZSAxKQorCis+Pj4gZGVmIGYoKTogKHlpZWxkIGJhcikgKz0geQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1N5bnRheEVycm9yOiBhdWdtZW50ZWQgYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzI1XT4sIGxpbmUgMSkKIAogCiBOb3cgY2hlY2sgc29tZSB0aHJvdygpIGNvbmRpdGlvbnM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKaW5kZXggZTQxNDc1Ny4uMjU5OGE3OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgRmlsZSAiPHB5c2hlbGwjND4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgICAgICAgKGkgZm9yIGkgaW4gNikKLSAgICBUeXBlRXJyb3I6IGl0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZQorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQogCiBWZXJpZnkgbGF0ZSBiaW5kaW5nIGZvciB0aGUgb3V0ZXJtb3N0IGlmLWV4cHJlc3Npb24KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKaW5kZXggODg2NGU4ZS4uYzQyOGY0NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC0yMzMsOCArMjMzLDI1IEBACiAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVMTE9OR19NQVgsIGdldGFyZ3NfSyhWRVJZX0xBUkdFKSkKIAorCitjbGFzcyBUdXBsZV9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3R1cGxlCisKKyAgICAgICAgcmV0ID0gZ2V0YXJnc190dXBsZSgxLCAoMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJldCwgKDEsMiwzKSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBpbnZhbGlkIHR1cGxlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkKKyAgICAgICAgY2xhc3Mgc2VxOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc190dXBsZSwgMSwgc2VxKCkpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3RzID0gW1NpZ25lZF9UZXN0Q2FzZSwgVW5zaWduZWRfVGVzdENhc2VdCisgICAgdGVzdHMgPSBbU2lnbmVkX1Rlc3RDYXNlLCBVbnNpZ25lZF9UZXN0Q2FzZSwgVHVwbGVfVGVzdENhc2VdCiAgICAgdHJ5OgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MLCBnZXRhcmdzX0sKICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKaW5kZXggNGJiNGU0NS4uZjE2MDg2NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtNTMxLDYgKzUzMSwxMSBAQAogZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKIGlmIG4gIT0gMjg1OiByYWlzZSBUZXN0RmFpbGVkLCAnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScKIAorcmVzdWx0ID0gW10KK2ZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06CisgICAgcmVzdWx0LmFwcGVuZCh4KQordmVyZXEocmVzdWx0LCBbMSwgMiwgM10pCisKIHByaW50ICd0cnlfc3RtdCcKICMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQogIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IGQ5ZmQ5M2QuLjk5MTQwZDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTEsNiArMSw4IEBACiBpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBkYXRldGltZQogCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAogCkBAIC0xNSw3ICsxNyw3IEBACiAjIGlzZGF0YWRlc2NyaXB0b3IKIAogbW9kZmlsZSA9IG1vZC5fX2ZpbGVfXwotaWYgbW9kZmlsZS5lbmRzd2l0aCgnYycpIG9yIG1vZGZpbGUuZW5kc3dpdGgoJ28nKToKK2lmIG1vZGZpbGUuZW5kc3dpdGgoKCdjJywgJ28nKSk6CiAgICAgbW9kZmlsZSA9IG1vZGZpbGVbOi0xXQogCiBpbXBvcnQgX19idWlsdGluX18KQEAgLTQwLDEwICs0MiwxMiBAQAogICAgICAgICAgICAgc2VsZi5mYWlsSWYob3RoZXIob2JqKSwgJ25vdCAlcyglcyknICUgKG90aGVyLl9fbmFtZV9fLCBleHApKQogCiBjbGFzcyBUZXN0UHJlZGljYXRlcyhJc1Rlc3RCYXNlKToKLSAgICBkZWYgdGVzdF9lbGV2ZW4oc2VsZik6Ci0gICAgICAgICMgRG9jL2xpYi9saWJpbnNwZWN0LnRleCBjbGFpbXMgdGhlcmUgYXJlIDExIHN1Y2ggZnVuY3Rpb25zCisgICAgZGVmIHRlc3RfdGhpcnRlZW4oc2VsZik6CiAgICAgICAgIGNvdW50ID0gbGVuKGZpbHRlcihsYW1iZGEgeDp4LnN0YXJ0c3dpdGgoJ2lzJyksIGRpcihpbnNwZWN0KSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIDExLCAiVGhlcmUgYXJlICVkIChub3QgMTEpIGlzKiBmdW5jdGlvbnMiICUgY291bnQpCisgICAgICAgICMgRG9jL2xpYi9saWJpbnNwZWN0LnRleCBjbGFpbXMgdGhlcmUgYXJlIDEzIHN1Y2ggZnVuY3Rpb25zCisgICAgICAgIGV4cGVjdGVkID0gMTMKKyAgICAgICAgZXJyX21zZyA9ICJUaGVyZSBhcmUgJWQgKG5vdCAlZCkgaXMqIGZ1bmN0aW9ucyIgJSAoY291bnQsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBleHBlY3RlZCwgZXJyX21zZykKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGluZ19wcmVkaWNhdGVzKHNlbGYpOgogICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzYnVpbHRpbiwgJ3N5cy5leGl0JykKQEAgLTU4LDYgKzYyLDE1IEBACiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXN0cmFjZWJhY2ssICd0YicpCiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNkYXRhZGVzY3JpcHRvciwgJ19fYnVpbHRpbl9fLmZpbGUuY2xvc2VkJykKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yLCAnX19idWlsdGluX18uZmlsZS5zb2Z0c3BhY2UnKQorICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKHR5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzKSkKKyAgICAgICAgaWYgaGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyk6CisgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvciwgJ2RhdGV0aW1lLnRpbWVkZWx0YS5kYXlzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzKSkKIAogICAgIGRlZiB0ZXN0X2lzcm91dGluZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRfKGluc3BlY3QuaXNyb3V0aW5lKG1vZC5zcGFtKSkKQEAgLTE4MCw2ICsxOTMsMTcgQEAKICAgICBkZWYgdGVzdF9nZXRmaWxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0ZmlsZShtb2QuU3R1cGlkR2l0KSwgbW9kLl9fZmlsZV9fKQogCisgICAgZGVmIHRlc3RfZ2V0bW9kdWxlX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgZnJvbSBuZXcgaW1wb3J0IG1vZHVsZQorICAgICAgICBuYW1lID0gJ19faW5zcGVjdF9kdW1teScKKyAgICAgICAgbSA9IHN5cy5tb2R1bGVzW25hbWVdID0gbW9kdWxlKG5hbWUpCisgICAgICAgIG0uX19maWxlX18gPSAiPHN0cmluZz4iICMgaG9wZWZ1bGx5IG5vdCBhIHJlYWwgZmlsZW5hbWUuLi4KKyAgICAgICAgbS5fX2xvYWRlcl9fID0gImR1bW15IiAgIyBwcmV0ZW5kIHRoZSBmaWxlbmFtZSBpcyB1bmRlcnN0b29kIGJ5IGEgbG9hZGVyCisgICAgICAgIGV4ZWMgImRlZiB4KCk6IHBhc3MiIGluIG0uX19kaWN0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUobS54LmZ1bmNfY29kZSksICc8c3RyaW5nPicpCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBpbnNwZWN0LmdldG1vZHVsZShjb21waWxlKCdhPTEwJywnJywnc2luZ2xlJykpCisKIGNsYXNzIFRlc3REZWNvcmF0b3JzKEdldFNvdXJjZUJhc2UpOgogICAgIGZvZGRlckZpbGUgPSBtb2QyCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQppbmRleCBiY2QwYTZmLi5hZjQ0NjdlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CkBAIC0yMzUsOSArMjM1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQogCiAKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQorZGVmIHRlc3RfbWFpbigpOgogICAgIHVuaXR0ZXN0cyA9IFsKICAgICAgICAgVGVzdFJlcGVhdCwKICAgICAgICAgVGVzdFhyYW5nZSwKQEAgLTI1NSwzICsyNTMsNiBAQAogICAgICAgICBUZXN0U2VxSXRlclJldmVyc2VkLAogICAgIF0KICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp1bml0dGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCA3M2Y4Mjg4Li42OGMyM2MyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC00ODAsNiArNDgwLDggQEAKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZm4pCisgICAgICAgICAgICAgICAgI2NhbGwgYWdhaW4gdG8gbWFrZSBzdXJlIGNsZWFudXAgaXMgY29ycmVjdAorICAgICAgICAgICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZm4pCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgdCA9IHN5cy5leGNfaW5mbygpWzBdCiAgICAgICAgICAgICAgICAgbWVzc2FnZShzdHIodCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKaW5kZXggOTE0YTIwYy4uNDVkZDExOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIFRlc3RNYWlsYm94LnNldFVwKHNlbGYpCi0gICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpOgogICAgICAgICAgICAgc2VsZi5fYm94LmNvbG9uID0gJyEnCiAKICAgICBkZWYgdGVzdF9hZGRfTU0oc2VsZik6CkBAIC01MjAsNyArNTIwLDcgQEAKICAgICAgICAgIyBJbml0aWFsaXplIGFuIGV4aXN0aW5nIG1haWxib3gKICAgICAgICAgc2VsZi50ZWFyRG93bigpCiAgICAgICAgIGZvciBzdWJkaXIgaW4gJycsICd0bXAnLCAnbmV3JywgJ2N1cic6Ci0gICAgICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKSkKKyAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpcikpKQogICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lk1haWxkaXIoc2VsZi5fcGF0aCkKICAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCiAgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PU5vbmUpCkBAIC03MjAsNiArNzIwLDMwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb250ZW50cyA9PSBvcGVuKHNlbGYuX3BhdGgsICdyYicpLnJlYWQoKSkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQogCisgICAgZGVmIHRlc3RfbG9ja19jb25mbGljdChzZWxmKToKKyAgICAgICAgIyBGb3JrIG9mZiBhIHN1YnByb2Nlc3MgdGhhdCB3aWxsIGxvY2sgdGhlIGZpbGUgZm9yIDIgc2Vjb25kcywKKyAgICAgICAgIyB1bmxvY2sgaXQsIGFuZCB0aGVuIGV4aXQuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAnZm9yaycpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICMgSW4gdGhlIGNoaWxkLCBsb2NrIHRoZSBtYWlsYm94LgorICAgICAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICAgICAgdGltZS5zbGVlcCgyKQorICAgICAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgICMgSW4gdGhlIHBhcmVudCwgc2xlZXAgYSBiaXQgdG8gZ2l2ZSB0aGUgY2hpbGQgdGltZSB0byBhY3F1aXJlCisgICAgICAgICMgdGhlIGxvY2suCisgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtYWlsYm94LkV4dGVybmFsQ2xhc2hFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm94LmxvY2spCisKKyAgICAgICAgIyBXYWl0IGZvciBjaGlsZCB0byBleGl0LiAgTG9ja2luZyBzaG91bGQgbm93IHN1Y2NlZWQuCisgICAgICAgIGV4aXRlZF9waWQsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCiAKIGNsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYpOgogCkBAIC0xNzYxLDYgKzE3ODUsNyBAQAogICAgICAgICAgICAgIFRlc3RNZXNzYWdlQ29udmVyc2lvbiwgVGVzdFByb3h5RmlsZSwgVGVzdFBhcnRpYWxGaWxlLAogICAgICAgICAgICAgIE1haWxkaXJUZXN0Q2FzZSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKaW5kZXggOTZiYmIzNi4uYjBiNWIwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKQEAgLTEsNyArMSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWltcG9ydCBzdHJpbmcsIFN0cmluZ0lPLCBtaW1ldG9vbHMsIHNldHMKK2ltcG9ydCBzdHJpbmcsIFN0cmluZ0lPLCBtaW1ldG9vbHMKIAogbXNndGV4dDEgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTy5TdHJpbmdJTygKICIiIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xOyBmb3JtYXQ9Zmxvd2VkCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uZ2V0dmFsdWUoKSwgc3RhcnQpCiAKICAgICBkZWYgdGVzdF9ib3VuZGFyeShzZWxmKToKLSAgICAgICAgcyA9IHNldHMuU2V0KFsiIl0pCisgICAgICAgIHMgPSBzZXQoWyIiXSkKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBuYiA9IG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5iIG5vdCBpbiBzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCA4YzU4NGFkLi4wMTkwYzJmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBtaW1ldHlwZXMKIGltcG9ydCBTdHJpbmdJTwogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHNldHMgaW1wb3J0IFNldAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCkBAIC01Miw4ICs1MSw4IEBACiAgICAgICAgICMgRmlyc3QgdHJ5IHN0cmljdC4gIFVzZSBhIHNldCBoZXJlIGZvciB0ZXN0aW5nIHRoZSByZXN1bHRzIGJlY2F1c2UgaWYKICAgICAgICAgIyB0ZXN0X3VybGxpYjIgaXMgcnVuIGJlZm9yZSB0ZXN0X21pbWV0eXBlcywgZ2xvYmFsIHN0YXRlIGlzIG1vZGlmaWVkCiAgICAgICAgICMgc3VjaCB0aGF0IHRoZSAnYWxsJyBzZXQgd2lsbCBoYXZlIG1vcmUgaXRlbXMgaW4gaXQuCi0gICAgICAgIGFsbCA9IFNldChzZWxmLmRiLmd1ZXNzX2FsbF9leHRlbnNpb25zKCd0ZXh0L3BsYWluJywgc3RyaWN0PVRydWUpKQotICAgICAgICB1bmxlc3MoYWxsID49IFNldChbJy5iYXQnLCAnLmMnLCAnLmgnLCAnLmtzaCcsICcucGwnLCAnLnR4dCddKSkKKyAgICAgICAgYWxsID0gc2V0KHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ3RleHQvcGxhaW4nLCBzdHJpY3Q9VHJ1ZSkpCisgICAgICAgIHVubGVzcyhhbGwgPj0gc2V0KFsnLmJhdCcsICcuYycsICcuaCcsICcua3NoJywgJy5wbCcsICcudHh0J10pKQogICAgICAgICAjIEFuZCBub3cgbm9uLXN0cmljdAogICAgICAgICBhbGwgPSBzZWxmLmRiLmd1ZXNzX2FsbF9leHRlbnNpb25zKCdpbWFnZS9qcGcnLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgIGFsbC5zb3J0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weSBiL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQppbmRleCBiOTM3N2FlLi5hNmQzMDlmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CkBAIC0xLDQgKzEsNCBAQAotIyB0ZXN0IGZvciB4bWxjb3JlLmRvbS5taW5pZG9tCisjIHRlc3QgZm9yIHhtbC5kb20ubWluaWRvbQogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKQEAgLTcsMTIgKzcsMTIgQEAKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCiAKLWltcG9ydCB4bWxjb3JlLmRvbQotaW1wb3J0IHhtbGNvcmUuZG9tLm1pbmlkb20KLWltcG9ydCB4bWxjb3JlLnBhcnNlcnMuZXhwYXQKK2ltcG9ydCB4bWwuZG9tCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tCitpbXBvcnQgeG1sLnBhcnNlcnMuZXhwYXQKIAotZnJvbSB4bWxjb3JlLmRvbS5taW5pZG9tIGltcG9ydCBwYXJzZSwgTm9kZSwgRG9jdW1lbnQsIHBhcnNlU3RyaW5nCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgcGFyc2UsIE5vZGUsIERvY3VtZW50LCBwYXJzZVN0cmluZworZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKQEAgLTEzOCwyOSArMTM4LDI5IEBACiAgICAgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgndGV4dCcpCiAKICAgICB0cnk6IGRvbS5hcHBlbmRDaGlsZCh0ZXh0KQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJkb20uYXBwZW5kQ2hpbGQgZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKICAgICBkb20uYXBwZW5kQ2hpbGQoZWxlbSkKICAgICB0cnk6IGRvbS5pbnNlcnRCZWZvcmUodGV4dCwgZWxlbSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZG9tLmFwcGVuZENoaWxkIGRpZG4ndCByYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXJyIgogCiAgICAgdHJ5OiBkb20ucmVwbGFjZUNoaWxkKHRleHQsIGVsZW0pCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImRvbS5hcHBlbmRDaGlsZCBkaWRuJ3QgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEVyciIKIAogICAgIG5vZGVtYXAgPSBlbGVtLmF0dHJpYnV0ZXMKICAgICB0cnk6IG5vZGVtYXAuc2V0TmFtZWRJdGVtKHRleHQpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgIk5hbWVkTm9kZU1hcC5zZXROYW1lZEl0ZW0gZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKICAgICB0cnk6IG5vZGVtYXAuc2V0TmFtZWRJdGVtTlModGV4dCkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiTmFtZWROb2RlTWFwLnNldE5hbWVkSXRlbU5TIGRpZG4ndCByYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXJyIgogCkBAIC00MzksNyArNDM5LDcgQEAKICAgICAgICAgICAgIGFuZCBwaS5maXJzdENoaWxkIGlzIE5vbmUKICAgICAgICAgICAgIGFuZCBwaS5sYXN0Q2hpbGQgaXMgTm9uZQogICAgICAgICAgICAgYW5kIHBpLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgcGkubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSkKKyAgICAgICAgICAgIGFuZCBwaS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCiAKIGRlZiB0ZXN0UHJvY2Vzc2luZ0luc3RydWN0aW9uUmVwcigpOiBwYXNzCiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgiZXh0cmEiKQogICAgIHRyeToKICAgICAgICAgZG9jLmFwcGVuZENoaWxkKGVsZW0pCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY2F0Y2ggZXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4iIFwKQEAgLTQ5MSw3ICs0OTEsNyBAQAogICAgIGNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCiAgICAgdHJ5OgogICAgICAgICBhdHRycy5yZW1vdmVOYW1lZEl0ZW0oImEiKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RGb3VuZEVycjoKICAgICAgICAgcGFzcwogCiBkZWYgdGVzdFJlbW92ZU5hbWVkSXRlbU5TKCk6CkBAIC01MDMsNyArNTAzLDcgQEAKICAgICBjb25maXJtKGExLmlzU2FtZU5vZGUoYTIpKQogICAgIHRyeToKICAgICAgICAgYXR0cnMucmVtb3ZlTmFtZWRJdGVtTlMoImh0dHA6Ly94bWwucHl0aG9uLm9yZy8iLCAiYiIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdEZvdW5kRXJyOgogICAgICAgICBwYXNzCiAKIGRlZiB0ZXN0QXR0ckxpc3RWYWx1ZXMoKTogcGFzcwpAQCAtNjgyLDcgKzY4Miw3IEBACiAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgIHRyeToKICAgICAgICAgZG9jMS5pbXBvcnROb2RlKGRvYzIsIGRlZXApCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICByYWlzZSBFeGNlcHRpb24odGVzdE5hbWUgKwpAQCAtNzA1LDE0ICs3MDUsMTIgQEAKICAgICBkb2N0eXBlID0gZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudFR5cGUoImRvYyIsIE5vbmUsIE5vbmUpCiAgICAgZG9jdHlwZS5lbnRpdGllcy5fc2VxID0gW10KICAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxID0gW10KLSAgICBub3RhdGlvbiA9IHhtbGNvcmUuZG9tLm1pbmlkb20uTm90YXRpb24oCi0gICAgICAgICJteS1ub3RhdGlvbiIsIE5vbmUsCi0gICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL215IikKKyAgICBub3RhdGlvbiA9IHhtbC5kb20ubWluaWRvbS5Ob3RhdGlvbigibXktbm90YXRpb24iLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL215IikKICAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub3RhdGlvbikKLSAgICBlbnRpdHkgPSB4bWxjb3JlLmRvbS5taW5pZG9tLkVudGl0eSgKLSAgICAgICAgIm15LWVudGl0eSIsIE5vbmUsCi0gICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvZW50aXRpZXMvbXkiLAotICAgICAgICAibXktbm90YXRpb24iKQorICAgIGVudGl0eSA9IHhtbC5kb20ubWluaWRvbS5FbnRpdHkoIm15LWVudGl0eSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL215IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteS1ub3RhdGlvbiIpCiAgICAgZW50aXR5LnZlcnNpb24gPSAiMS4wIgogICAgIGVudGl0eS5lbmNvZGluZyA9ICJ1dGYtOCIKICAgICBlbnRpdHkuYWN0dWFsRW5jb2RpbmcgPSAidXMtYXNjaWkiCkBAIC03MzEsNyArNzI5LDcgQEAKICAgICB0YXJnZXQgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZSgpCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnRlZCA9IHRhcmdldC5pbXBvcnROb2RlKHNyYy5kb2N0eXBlLCAwKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uTm90U3VwcG9ydGVkRXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKApAQCAtNzQyLDcgKzc0MCw3IEBACiAgICAgdGFyZ2V0ID0gY3JlYXRlX2RvY193aXRob3V0X2RvY3R5cGUoKQogICAgIHRyeToKICAgICAgICAgaW1wb3J0ZWQgPSB0YXJnZXQuaW1wb3J0Tm9kZShzcmMuZG9jdHlwZSwgMSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKQEAgLTg1MCw3ICs4NDgsNyBAQAogICAgIGRvYy51bmxpbmsoKQogCiBkZWYgdGVzdFNBWDJET00oKToKLSAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBwdWxsZG9tCisgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCiAKICAgICBzYXgyZG9tID0gcHVsbGRvbS5TQVgyRE9NKCkKICAgICBzYXgyZG9tLnN0YXJ0RG9jdW1lbnQoKQpAQCAtOTQwLDExICs5MzgsMTEgQEAKICAgICBhdHRyID0gZWxlbS5hdHRyaWJ1dGVzWydhJ10KIAogICAgICMgU2ltcGxlIHJlbmFtaW5nCi0gICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQorICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQogICAgIGNvbmZpcm0oYXR0ci5uYW1lID09ICJiIgogICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImIiCiAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgaXMgTm9uZQotICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCiAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgYW5kIGF0dHIudmFsdWUgPT0gInYiCiAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQpAQCAtOTg5LDExICs5ODcsMTEgQEAKICAgICAgICAgICAgIGFuZCBhdHRybWFwWygiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJkIildLmlzU2FtZU5vZGUoYXR0cikpCiAKICAgICAjIFJlbmFtZSBiYWNrIHRvIGEgc2ltcGxlIG5vbi1OUyBub2RlCi0gICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiKQorICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiKQogICAgIGNvbmZpcm0oYXR0ci5uYW1lID09ICJlIgogICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImUiCiAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgaXMgTm9uZQotICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCiAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgYW5kIGF0dHIudmFsdWUgPT0gInYiCiAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQpAQCAtMTAwNyw3ICsxMDA1LDcgQEAKIAogICAgIHRyeToKICAgICAgICAgZG9jLnJlbmFtZU5vZGUoYXR0ciwgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJ4bWxucyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5OYW1lc3BhY2VFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZXhwZWN0ZWQgTmFtZXNwYWNlRXJyIgpAQCAtMTAyMCwxMSArMTAxOCwxMSBAQAogICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CiAKICAgICAjIFNpbXBsZSByZW5hbWluZwotICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhIikKKyAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhIikKICAgICBjb25maXJtKGVsZW0udGFnTmFtZSA9PSAiYSIKICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJhIgogICAgICAgICAgICAgYW5kIGVsZW0ubG9jYWxOYW1lIGlzIE5vbmUKLSAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRQogICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4IGlzIE5vbmUKICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQogCkBAIC0xMDQ3LDExICsxMDQ1LDExIEBACiAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKIAogICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKLSAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZCIpCisgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZCIpCiAgICAgY29uZmlybShlbGVtLnRhZ05hbWUgPT0gImQiCiAgICAgICAgICAgICBhbmQgZWxlbS5ub2RlTmFtZSA9PSAiZCIKICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCBpcyBOb25lCiAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKIApAQCAtMTA2MiwxNSArMTA2MCwxNSBAQAogICAgICMgTWFrZSBzdXJlIGlsbGVnYWwgTlMgdXNhZ2UgaXMgZGV0ZWN0ZWQ6CiAgICAgdHJ5OgogICAgICAgICBkb2MucmVuYW1lTm9kZShub2RlLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgInhtbG5zOmZvbyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5OYW1lc3BhY2VFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZXhwZWN0ZWQgTmFtZXNwYWNlRXJyIgogCiAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQogICAgIHRyeToKLSAgICAgICAgZG9jMi5yZW5hbWVOb2RlKG5vZGUsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLldyb25nRG9jdW1lbnRFcnI6CisgICAgICAgIGRvYzIucmVuYW1lTm9kZShub2RlLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCisgICAgZXhjZXB0IHhtbC5kb20uV3JvbmdEb2N1bWVudEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJleHBlY3RlZCBXcm9uZ0RvY3VtZW50RXJyIgpAQCAtMTA3OCwxMiArMTA3NiwxMiBAQAogZGVmIHRlc3RSZW5hbWVPdGhlcigpOgogICAgICMgV2UgaGF2ZSB0byBjcmVhdGUgYSBjb21tZW50IG5vZGUgZXhwbGljaXRseSBzaW5jZSBub3QgYWxsIERPTQogICAgICMgYnVpbGRlcnMgdXNlZCB3aXRoIG1pbmlkb20gYWRkIGNvbW1lbnRzIHRvIHRoZSBET00uCi0gICAgZG9jID0geG1sY29yZS5kb20ubWluaWRvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KAotICAgICAgICB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJlIiwgTm9uZSkKKyAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgKKyAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJlIiwgTm9uZSkKICAgICBub2RlID0gZG9jLmNyZWF0ZUNvbW1lbnQoImNvbW1lbnQiKQogICAgIHRyeToKLSAgICAgICAgZG9jLnJlbmFtZU5vZGUobm9kZSwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyOgorICAgICAgICBkb2MucmVuYW1lTm9kZShub2RlLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCisgICAgZXhjZXB0IHhtbC5kb20uTm90U3VwcG9ydGVkRXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImV4cGVjdGVkIE5vdFN1cHBvcnRlZEVyciB3aGVuIHJlbmFtaW5nIGNvbW1lbnQgbm9kZSIKQEAgLTExOTQsMTMgKzExOTIsMTMgQEAKICAgICAjIHNpbmNlIGVhY2ggc3VwcG9ydHMgYSBkaWZmZXJlbnQgbGV2ZWwgb2YgRFREIGluZm9ybWF0aW9uLgogICAgIHQgPSBlbGVtLnNjaGVtYVR5cGUKICAgICBjb25maXJtKHQubmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFKQorICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQogICAgIG5hbWVzID0gImlkIG5vdGlkIHRleHQgZW51bSByZWYgcmVmcyBlbnQgZW50cyBubSBubXMiLnNwbGl0KCkKICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgYSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKQogICAgICAgICB0ID0gYS5zY2hlbWFUeXBlCiAgICAgICAgIGNvbmZpcm0oaGFzYXR0cih0LCAibmFtZSIpCi0gICAgICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSkKKyAgICAgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCiAKIGRlZiB0ZXN0U2V0SWRBdHRyaWJ1dGUoKToKICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhMT0ndicgYTI9J3cnLz4iKQpAQCAtMTIyOSw3ICsxMjI3LDcgQEAKICAgICAgICAgICAgIGFuZCBhMi5pc0lkCiAgICAgICAgICAgICBhbmQgbm90IGEzLmlzSWQpCiAgICAgIyByZW5hbWluZyBhbiBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhZmZlY3QgaXRzIElELW5lc3M6Ci0gICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKKyAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCiAgICAgY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCiAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKIApAQCAtMTI2NSw3ICsxMjYzLDcgQEAKICAgICBjb25maXJtKG5vdCBhMy5pc0lkKQogICAgIGNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZSkKICAgICAjIHJlbmFtaW5nIGFuIGF0dHJpYnV0ZSBzaG91bGQgbm90IGFmZmVjdCBpdHMgSUQtbmVzczoKLSAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQorICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKICAgICBjb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKICAgICAgICAgICAgIGFuZCBhMi5pc0lkKQogCkBAIC0xMzAxLDcgKzEyOTksNyBAQAogICAgIGNvbmZpcm0obm90IGEzLmlzSWQpCiAgICAgY29uZmlybShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSBpcyBOb25lKQogICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgotICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQogICAgIGNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQogICAgICAgICAgICAgYW5kIGEyLmlzSWQpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CmluZGV4IDI3NmI5YWYuLjM5N2ViZWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpAQCAtNiwxNyArNiwzNyBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcywgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4KK2ltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcywgc3lzLCBvcworCitBTExfQ0pLRU5DT0RJTkdTID0gWworIyBfY29kZWNzX2NuCisgICAgJ2diMjMxMicsICdnYmsnLCAnZ2IxODAzMCcsICdoeicsCisjIF9jb2RlY3NfaGsKKyAgICAnYmlnNWhrc2NzJywKKyMgX2NvZGVjc19qcAorICAgICdjcDkzMicsICdzaGlmdF9qaXMnLCAnZXVjX2pwJywgJ2V1Y19qaXN4MDIxMycsICdzaGlmdF9qaXN4MDIxMycsCisgICAgJ2V1Y19qaXNfMjAwNCcsICdzaGlmdF9qaXNfMjAwNCcsCisjIF9jb2RlY3Nfa3IKKyAgICAnY3A5NDknLCAnZXVjX2tyJywgJ2pvaGFiJywKKyMgX2NvZGVjc190dworICAgICdiaWc1JywgJ2NwOTUwJywKKyMgX2NvZGVjc19pc28yMDIyCisgICAgJ2lzbzIwMjJfanAnLCAnaXNvMjAyMl9qcF8xJywgJ2lzbzIwMjJfanBfMicsICdpc28yMDIyX2pwXzIwMDQnLAorICAgICdpc28yMDIyX2pwXzMnLCAnaXNvMjAyMl9qcF9leHQnLCAnaXNvMjAyMl9rcicsCitdCiAKIGNsYXNzIFRlc3RfTXVsdGlieXRlQ29kZWModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfbnVsbGNvZGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5kZWNvZGUoJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsICdnYjE4MDMwJyksIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKCdnYjE4MDMwJyksICcnKQorICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZShlbmMpLCB1JycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsIGVuYyksIHUnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmVuY29kZShlbmMpLCAnJykKIAogICAgIGRlZiB0ZXN0X3N0cl9kZWNvZGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZSgnZ2IxODAzMCcpLCAnYWJjZCcpCisgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZShlbmMpLCAnYWJjZCcpCiAKICAgICBkZWYgdGVzdF9lcnJvcmNhbGxiYWNrX2xvbmdpbmRleChzZWxmKToKICAgICAgICAgZGVjID0gY29kZWNzLmdldGRlY29kZXIoJ2V1Yy1rcicpCkBAIC0yNSw2ICs0NSwxNCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsZVx4OTJoYW1ceDkzc3BhbScsICd0ZXN0LmNqa3Rlc3QnKQogCisgICAgZGVmIHRlc3RfY29kaW5nc3BlYyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGVuYyBpbiBBTExfQ0pLRU5DT0RJTkdTOgorICAgICAgICAgICAgICAgIHByaW50ID4+IG9wZW4oVEVTVEZOLCAndycpLCAnIyBjb2Rpbmc6JywgZW5jCisgICAgICAgICAgICAgICAgZXhlYyBvcGVuKFRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKIGNsYXNzIFRlc3RfSW5jcmVtZW50YWxFbmNvZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3N0YXRlbGVzcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IDc5ZGY5MDYuLjQ1ODJmYTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIApAQCAtMTY0LDE1ICsxNjQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2Vycm9yPU5vbmUpOgogICAgICAgICAiIiJBc3NlcnQgdGhlIHBhcnNlciBwcmludHMgdGhlIGV4cGVjdGVkIG91dHB1dCBvbiBzdGRvdXQuIiIiCiAgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBlbmNvZGluZyA9IGdldGF0dHIoc2F2ZV9zdGRvdXQsICdlbmNvZGluZycsIE5vbmUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGNtZGxpbmVfYXJncykKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCiAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICAgICAgICAgZXhjZXB0IEludGVyY2VwdGVkRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICB0eXBlKG91dHB1dCkgaXMgdHlwZXMuU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgb3V0cHV0IHRvIGJlIGFuIG9yZGluYXJ5IHN0cmluZywgbm90ICVyIgorICAgICAgICAgICAgICAgICUgdHlwZShvdXRwdXQpKQorCiAgICAgICAgICAgICBpZiBvdXRwdXQgIT0gZXhwZWN0ZWRfb3V0cHV0OgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQ6IFxuJycnXG4iICsgZXhwZWN0ZWRfb3V0cHV0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIicnJ1xuYnV0IGdvdCBcbicnJ1xuIiArIG91dHB1dCArICInJyciKQpAQCAtMTQ1MiwxMCArMTQ2MCwyNiBAQAogICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tZm9vIiwgYWN0aW9uPSJhcHBlbmQiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSdmb28nLAogICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ic3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIgZm9vaW5nIiksCiAgICAgICAgICAgICBdCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIHNldCBDT0xVTU5TIGZvciB0aGUgT3B0aW9uUGFyc2VyIGNvbnN0cnVjdG9yLCBidXQKKyAgICAgICAgIyB3ZSBtdXN0IHJlc3RvcmUgaXRzIG9yaWdpbmFsIHZhbHVlIC0tIG90aGVyd2lzZSwgdGhpcyB0ZXN0CisgICAgICAgICMgc2NyZXdzIHRoaW5ncyB1cCBmb3Igb3RoZXIgdGVzdHMgd2hlbiBpdCdzIHBhcnQgb2YgdGhlIFB5dGhvbgorICAgICAgICAjIHRlc3Qgc3VpdGUuCisgICAgICAgIG9yaWdfY29sdW1ucyA9IG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJykKICAgICAgICAgb3MuZW52aXJvblsnQ09MVU1OUyddID0gc3RyKGNvbHVtbnMpCi0gICAgICAgIHJldHVybiBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIEludGVyY2VwdGluZ09wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgb3JpZ19jb2x1bW5zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ0NPTFVNTlMnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydDT0xVTU5TJ10gPSBvcmlnX2NvbHVtbnMKIAogICAgIGRlZiBhc3NlcnRIZWxwRXF1YWxzKHNlbGYsIGV4cGVjdGVkX291dHB1dCk6CisgICAgICAgIGlmIHR5cGUoZXhwZWN0ZWRfb3V0cHV0KSBpcyB0eXBlcy5Vbmljb2RlVHlwZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5wYXJzZXIuX2dldF9lbmNvZGluZyhzeXMuc3Rkb3V0KQorICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gZXhwZWN0ZWRfb3V0cHV0LmVuY29kZShlbmNvZGluZywgInJlcGxhY2UiKQorCiAgICAgICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2WzpdCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgTWFrZSBvcHRwYXJzZSBiZWxpZXZlIGJhci5weSBpcyBiZWluZyBleGVjdXRlZC4KQEAgLTE0ODYsNiArMTUxMCwyNyBAQAogICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYubWFrZV9wYXJzZXIoNjApCiAgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhfZXhwZWN0ZWRfaGVscF9zaG9ydF9saW5lcykKIAorICAgIGRlZiB0ZXN0X2hlbHBfdW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD11Im9sXHUwMEU5ISIpCisgICAgICAgIGV4cGVjdCA9IHUiIiJcCitPcHRpb25zOgorICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgIC1hICAgICAgICAgIG9sXHUwMEU5IQorIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCisKKyAgICBkZWYgdGVzdF9oZWxwX3VuaWNvZGVfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj11Im9sXHUwMEU5ISIpCisgICAgICAgIGV4cGVjdCA9IHUiIiJcCitvbFx1MDBFOSEKKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCisKICAgICBkZWYgdGVzdF9oZWxwX2Rlc2NyaXB0aW9uX2dyb3VwcyhzZWxmKToKICAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2Rlc2NyaXB0aW9uKAogICAgICAgICAgICAgIlRoaXMgaXMgdGhlIHByb2dyYW0gZGVzY3JpcHRpb24gZm9yICVwcm9nLiAgJXByb2cgaGFzICIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IGZmYzk0MjAuLjk0OTc3NzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMTEsNiArMTEsMTkgQEAKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGVtcG5hbSIsIFJ1bnRpbWVXYXJuaW5nLCBfX25hbWVfXykKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidG1wbmFtIiwgUnVudGltZVdhcm5pbmcsIF9fbmFtZV9fKQogCisjIFRlc3RzIGNyZWF0aW5nIFRFU1RGTgorY2xhc3MgRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgdGVhckRvd24gPSBzZXRVcAorCisgICAgZGVmIHRlc3RfYWNjZXNzKHNlbGYpOgorICAgICAgICBmID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5PX0NSRUFUfG9zLk9fUkRXUikKKyAgICAgICAgb3MuY2xvc2UoZikKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5XX09LKSkKKworCiBjbGFzcyBUZW1wb3JhcnlGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5maWxlcyA9IFtdCkBAIC0zOTMsNiArNDA2LDcgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEZpbGVUZXN0cywKICAgICAgICAgVGVtcG9yYXJ5RmlsZVRlc3RzLAogICAgICAgICBTdGF0QXR0cmlidXRlVGVzdHMsCiAgICAgICAgIEVudmlyb25UZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkgYi9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CmluZGV4IDg4MTA1MTYuLjU4NjhlYTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQpAQCAtNDAsNiArNDAsMTAgQEAKICAgICBkYXRhID0gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQogICAgIHJldHVybiAoZGF0YSwgcmF0ZSwgMTYsIG5jaGFubmVscykKIAorIyB2ZXJzaW9uIG9mIGFzc2VydCB0aGF0IHN0aWxsIHdvcmtzIHdpdGggLU8KK2RlZiBfYXNzZXJ0KGV4cHIsIG1lc3NhZ2U9Tm9uZSk6CisgICAgaWYgbm90IGV4cHI6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1lc3NhZ2Ugb3IgImFzc2VydGlvbiBmYWlsZWQiKQogCiBkZWYgcGxheV9zb3VuZF9maWxlKGRhdGEsIHJhdGUsIHNzaXplLCBuY2hhbm5lbHMpOgogICAgIHRyeToKQEAgLTU3LDkgKzYxLDkgQEAKICAgICBkc3AuZmlsZW5vKCkKIAogICAgICMgTWFrZSBzdXJlIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcyB3b3JrLgotICAgIGFzc2VydCBkc3AuY2xvc2VkIGlzIEZhbHNlLCAiZHNwLmNsb3NlZCBpcyBub3QgRmFsc2UiCi0gICAgYXNzZXJ0IGRzcC5uYW1lID09ICIvZGV2L2RzcCIKLSAgICBhc3NlcnQgZHNwLm1vZGUgPT0gJ3cnLCAiYmFkIGRzcC5tb2RlOiAlciIgJSBkc3AubW9kZQorICAgIF9hc3NlcnQoZHNwLmNsb3NlZCBpcyBGYWxzZSwgImRzcC5jbG9zZWQgaXMgbm90IEZhbHNlIikKKyAgICBfYXNzZXJ0KGRzcC5uYW1lID09ICIvZGV2L2RzcCIpCisgICAgX2Fzc2VydChkc3AubW9kZSA9PSAndycsICJiYWQgZHNwLm1vZGU6ICVyIiAlIGRzcC5tb2RlKQogCiAgICAgIyBBbmQgbWFrZSBzdXJlIHRoZXkncmUgcmVhbGx5IHJlYWQtb25seS4KICAgICBmb3IgYXR0ciBpbiAoJ2Nsb3NlZCcsICduYW1lJywgJ21vZGUnKToKQEAgLTY5LDE0ICs3MywyMyBAQAogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCisgICAgIyBDb21wdXRlIGV4cGVjdGVkIHJ1bm5pbmcgdGltZSBvZiBzb3VuZCBzYW1wbGUgKGluIHNlY29uZHMpLgorICAgIGV4cGVjdGVkX3RpbWUgPSBmbG9hdChsZW4oZGF0YSkpIC8gKHNzaXplLzgpIC8gbmNoYW5uZWxzIC8gcmF0ZQorCiAgICAgIyBzZXQgcGFyYW1ldGVycyBiYXNlZCBvbiAuYXUgZmlsZSBoZWFkZXJzCiAgICAgZHNwLnNldHBhcmFtZXRlcnMoQUZNVF9TMTZfTkUsIG5jaGFubmVscywgcmF0ZSkKKyAgICBwcmludCAoInBsYXlpbmcgdGVzdCBzb3VuZCBmaWxlIChleHBlY3RlZCBydW5uaW5nIHRpbWU6ICUuMmYgc2VjKSIKKyAgICAgICAgICAgJSBleHBlY3RlZF90aW1lKQogICAgIHQxID0gdGltZS50aW1lKCkKLSAgICBwcmludCAicGxheWluZyB0ZXN0IHNvdW5kIGZpbGUuLi4iCiAgICAgZHNwLndyaXRlKGRhdGEpCiAgICAgZHNwLmNsb3NlKCkKICAgICB0MiA9IHRpbWUudGltZSgpCi0gICAgcHJpbnQgImVsYXBzZWQgdGltZTogJS4xZiBzZWMiICUgKHQyLXQxKQorICAgIGVsYXBzZWRfdGltZSA9IHQyIC0gdDEKKworICAgIHBlcmNlbnRfZGlmZiA9IChhYnMoZWxhcHNlZF90aW1lIC0gZXhwZWN0ZWRfdGltZSkgLyBleHBlY3RlZF90aW1lKSAqIDEwMAorICAgIF9hc3NlcnQocGVyY2VudF9kaWZmIDw9IDEwLjAsIFwKKyAgICAgICAgICAgICgiZWxhcHNlZCB0aW1lICglLjJmIHNlYykgPiAxMCUlIG9mZiBvZiBleHBlY3RlZCB0aW1lICglLjJmIHNlYykiCisgICAgICAgICAgICAgJSAoZWxhcHNlZF90aW1lLCBleHBlY3RlZF90aW1lKSkpCiAKIGRlZiB0ZXN0X3NldHBhcmFtZXRlcnMoZHNwKToKICAgICAjIFR3byBjb25maWd1cmF0aW9ucyBmb3IgdGVzdGluZzoKQEAgLTEwMSwxMSArMTE0LDExIEBACiAgICAgIyBzZXRwYXJhbWV0ZXJzKCkgc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoaXMgY29uZmlndXJhdGlvbiBpbgogICAgICMgZWl0aGVyIHN0cmljdCBvciBub24tc3RyaWN0IG1vZGUuCiAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgRmFsc2UpCi0gICAgYXNzZXJ0IHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksIFwKLSAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZyArIHJlc3VsdCkKKyAgICBfYXNzZXJ0KHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnLCByZXN1bHQpKQogICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCi0gICAgYXNzZXJ0IHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksIFwKLSAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZyArIHJlc3VsdCkKKyAgICBfYXNzZXJ0KHJlc3VsdCA9PSAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnLCByZXN1bHQpKQogCiBkZWYgdGVzdF9iYWRfc2V0cGFyYW1ldGVycyhkc3ApOgogCkBAIC0xMjMsOCArMTM2LDggQEAKICAgICAgICAgICAgICAgICAgIF06CiAgICAgICAgIChmbXQsIGNoYW5uZWxzLCByYXRlKSA9IGNvbmZpZwogICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBjb25maWcsIFwKLSAgICAgICAgICAgICAgICJzZXRwYXJhbWV0ZXJzOiB1bmV4cGVjdGVkbHkgZ290IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIgorICAgICAgICBfYXNzZXJ0KHJlc3VsdCAhPSBjb25maWcsCisgICAgICAgICAgICAgICAgInNldHBhcmFtZXRlcnM6IHVuZXhwZWN0ZWRseSBnb3QgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24iKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCkBAIC0xNDUsNiArMTU4LDYgQEAKICAgICAgICAgI3Rlc3RfYmFkX3NldHBhcmFtZXRlcnMoZHNwKQogICAgIGZpbmFsbHk6CiAgICAgICAgIGRzcC5jbG9zZSgpCi0gICAgICAgIGFzc2VydCBkc3AuY2xvc2VkIGlzIFRydWUsICJkc3AuY2xvc2VkIGlzIG5vdCBUcnVlIgorICAgICAgICBfYXNzZXJ0KGRzcC5jbG9zZWQgaXMgVHJ1ZSwgImRzcC5jbG9zZWQgaXMgbm90IFRydWUiKQogCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjkyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKaW5kZXggMmE0MzUzYS4uZDExMDBlYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkKQEAgLTU4LDYgKzU4LDEzIEBACiAgICAgICAgIHMgPSBUZW1wbGF0ZSgndGltIGhhcyBlYXRlbiAke2NvdW50fSBiYWdzIG9mIGhhbSB0b2RheScpCiAgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgJ3RpbSBoYXMgZWF0ZW4gNyBiYWdzIG9mIGhhbSB0b2RheScpCiAKKyAgICBkZWYgdGVzdF90dXBsZWFyZ3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gYXRlICR7bWVhbH0nKQorICAgICAgICBkID0gZGljdCh3aG89KCd0aW0nLCAnZnJlZCcpLCBtZWFsPSgnaGFtJywgJ2t1bmcgcGFvJykpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgIigndGltJywgJ2ZyZWQnKSBhdGUgKCdoYW0nLCAna3VuZyBwYW8nKSIpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGQpLCAiKCd0aW0nLCAnZnJlZCcpIGF0ZSAoJ2hhbScsICdrdW5nIHBhbycpIikKKwogICAgIGRlZiB0ZXN0X1NhZmVUZW1wbGF0ZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAke3doYXR9IGZvciAke21lYWx9JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuLnB5CmluZGV4IDJiNjg3YWQuLmZiZjVlMDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3Blbi5weQpAQCAtNiw3ICs2LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJlYXBfY2hpbGRyZW4KIGZyb20gb3MgaW1wb3J0IHBvcGVuCiAKICMgVGVzdCB0aGF0IGNvbW1hbmQtbGluZXMgZ2V0IGRvd24gYXMgd2UgZXhwZWN0LgpAQCAtMzUsNSArMzUsNiBAQAogZGVmIG1haW4oKToKICAgICBwcmludCAiVGVzdCBwb3BlbjoiCiAgICAgX3Rlc3RfY29tbWFuZGxpbmUoKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKaW5kZXggNGRiM2NkMS4uMmQ1NGViMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkKQEAgLTUsNyArNSw3IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCByZWFwX2NoaWxkcmVuCiAKICMgcG9wZW4yIGNvbnRhaW5zIGl0cyBvd24gdGVzdGluZyByb3V0aW5lCiAjIHdoaWNoIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHRvIHNlZSBpZiBvcGVuIGZpbGVzCkBAIC03NSwzICs3NSw0IEBACiAKIG1haW4oKQogX3Rlc3QoKQorcmVhcF9jaGlsZHJlbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKaW5kZXggYTlhNWU4Zi4uMDY5ODgxOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQpAQCAtMzY1LDMgKzM2NSwyNCBAQAogICA8Yy8+CiAgPC9iPgogPC9hPicnJywgMSkKKworCitkZWYgdGVzdF9wYXJzZV9vbmx5X3htbF9kYXRhKCk6CisgICAgIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMjk2NDMzCisgICAgIworICAgIHhtbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDI1KQorICAgICMgdGhpcyBvbmUgZG9lc24ndCBjcmFzaAorICAgICN4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDAwMCkKKworICAgIGRlZiBoYW5kbGVyKHRleHQpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24KKworICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcgorCisgICAgdHJ5OgorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCit0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zYXgucHkgYi9MaWIvdGVzdC90ZXN0X3NheC5weQppbmRleCBkZWQ4MWZiLi5hZjRjN2RkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NheC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NheC5weQpAQCAtMSwxNyArMSwxNyBAQAogIyByZWdyZXNzaW9uIHRlc3QgZm9yIFNBWCAyLjAgICAgICAgICAgICAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQogIyAkSWQkCiAKLWZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyLCBDb250ZW50SGFuZGxlciwgXAotICAgICBTQVhFeGNlcHRpb24sIFNBWFJlYWRlck5vdEF2YWlsYWJsZSwgU0FYUGFyc2VFeGNlcHRpb24KK2Zyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIsIENvbnRlbnRIYW5kbGVyLCBcCisgICAgICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgogdHJ5OgogICAgIG1ha2VfcGFyc2VyKCkKIGV4Y2VwdCBTQVhSZWFkZXJOb3RBdmFpbGFibGU6CiAgICAgIyBkb24ndCB0cnkgdG8gdGVzdCB0aGlzIG1vZHVsZSBpZiB3ZSBjYW5ub3QgY3JlYXRlIGEgcGFyc2VyCiAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIm5vIFhNTCBwYXJzZXJzIGF2YWlsYWJsZSIpCi1mcm9tIHhtbGNvcmUuc2F4LnNheHV0aWxzIGltcG9ydCBYTUxHZW5lcmF0b3IsIGVzY2FwZSwgdW5lc2NhcGUsIHF1b3RlYXR0ciwgXAotICAgICBYTUxGaWx0ZXJCYXNlCi1mcm9tIHhtbGNvcmUuc2F4LmV4cGF0cmVhZGVyIGltcG9ydCBjcmVhdGVfcGFyc2VyCi1mcm9tIHhtbGNvcmUuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCitmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IFhNTEdlbmVyYXRvciwgZXNjYXBlLCB1bmVzY2FwZSwgcXVvdGVhdHRyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEZpbHRlckJhc2UKK2Zyb20geG1sLnNheC5leHBhdHJlYWRlciBpbXBvcnQgY3JlYXRlX3BhcnNlcgorZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyYm9zZSwgVGVzdEZhaWxlZCwgZmluZGZpbGUKIGltcG9ydCBvcwpAQCAtMzYsMTcgKzM2LDE3IEBACiAgICAgICAgICMgQ3JlYXRpbmcgcGFyc2VycyBzZXZlcmFsIHRpbWVzIGluIGEgcm93IHNob3VsZCBzdWNjZWVkLgogICAgICAgICAjIFRlc3RpbmcgdGhpcyBiZWNhdXNlIHRoZXJlIGhhdmUgYmVlbiBmYWlsdXJlcyBvZiB0aGlzIGtpbmQKICAgICAgICAgIyBiZWZvcmUuCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgZXhjZXB0OgogICAgICAgICByZXR1cm4gMApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgdHJ5OgogICAgICAgICAjIENyZWF0aW5nIGEgcGFyc2VyIHNob3VsZCBzdWNjZWVkIC0gaXQgc2hvdWxkIGZhbGwgYmFjawogICAgICAgICAjIHRvIHRoZSBleHBhdHJlYWRlcgotICAgICAgICBwID0gbWFrZV9wYXJzZXIoWyd4bWxjb3JlLnBhcnNlcnMubm9fc3VjaF9wYXJzZXInXSkKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKFsneG1sLnBhcnNlcnMubm9fc3VjaF9wYXJzZXInXSkKICAgICBleGNlcHQ6CiAgICAgICAgIHJldHVybiAwCiAgICAgZWxzZToKQEAgLTE3NSwxMSArMTc1LDE0IEBACiAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQogICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiJ1wiIn0pCiAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQorICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiXG5cclx0In0pCisgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQogICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgIGdlbi5lbmREb2N1bWVudCgpCiAKLSAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgXAotICAgICAgICAgICArICI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT48ZSBhPVwiJyZxdW90O1wiPjwvZT48L2RvYz4iCisgICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgKCI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJiMxMDsmIzEzOyYjOTtcIj48L2U+PC9kb2M+IikKIAogZGVmIHRlc3RfeG1sZ2VuX2lnbm9yYWJsZSgpOgogICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKQEAgLTY2OCw2ICs2NzEsNTUgQEAKICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gIm5zOmF0dHIiCiAKIAorIyBEdXJpbmcgdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiAyLjUsIGFuIGF0dGVtcHQgdG8gbW92ZSB0aGUgInhtbCIKKyMgcGFja2FnZSBpbXBsZW1lbnRhdGlvbiB0byBhIG5ldyBwYWNrYWdlICgieG1sY29yZSIpIHByb3ZlZCBwYWluZnVsLgorIyBUaGUgZ29hbCBvZiB0aGlzIGNoYW5nZSB3YXMgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGJlIGFibGUgdG8KKyMgb2J0YWluIGFuZCByZWx5IG9uIGJlaGF2aW9yIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisjIG9mIHRoZSBYTUwgc3VwcG9ydCB3aXRob3V0IG5lZWRpbmcgdG8gYmUgY29uY2VybmVkIGFib3V0IHRoZQorIyBhdmFpbGFiaWxpdHkgb2YgdGhlIFB5WE1MIGltcGxlbWVudGF0aW9uLgorIworIyBXaGlsZSB0aGUgZXhpc3RpbmcgaW1wb3J0IGhhY2tlcnkgaW4gTGliL3htbC9fX2luaXRfXy5weSBjYW4gY2F1c2UKKyMgUHlYTUwncyBfeG1scHVzIHBhY2thZ2UgdG8gc3VwcGxhbnQgdGhlICJ4bWwiIHBhY2thZ2UsIHRoYXQgb25seQorIyB3b3JrcyBiZWNhdXNlIGVpdGhlciBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAieG1sIiBwYWNrYWdlIG5hbWUgZm9yCisjIGltcG9ydHMuCisjCisjIFRoZSBtb3ZlIHJlc3VsdGVkIGluIGEgbnVtYmVyIG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorIyB0aGUgaW1wb3J0IG1hY2hpbmVyeSdzICJwYWNrYWdlIGNvbnRleHQiIGlzIGJhc2VkIG9uIHRoZSBuYW1lIHRoYXQncworIyBiZWluZyBpbXBvcnRlZCByYXRoZXIgdGhhbiB0aGUgX19uYW1lX18gb2YgdGhlIGFjdHVhbCBwYWNrYWdlCisjIGNvbnRhaW5tZW50OyBpdCB3YXNuJ3QgcG9zc2libGUgZm9yIHRoZSAieG1sIiBwYWNrYWdlIHRvIGJlIHJlcGxhY2VkCisjIGJ5IGEgc2ltcGxlIG1vZHVsZSB0aGF0IGluZGlyZWN0ZWQgaW1wb3J0cyB0byB0aGUgInhtbGNvcmUiIHBhY2thZ2UuCisjCisjIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGV4ZXJjaXNlZCBidWdzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHRoYXQKKyMgYXR0ZW1wdC4gIEtlZXBpbmcgdGhlc2UgdGVzdHMgYXJvdW5kIHdpbGwgaGVscCBkZXRlY3QgcHJvYmxlbXMgd2l0aAorIyBvdGhlciBhdHRlbXB0cyB0byBwcm92aWRlIHJlbGlhYmxlIGFjY2VzcyB0byB0aGUgc3RhbmRhcmQgbGlicmFyeSdzCisjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgc3VwcG9ydC4KKworZGVmIHRlc3Rfc2ZfMTUxMTQ5NygpOgorICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTE0OTcKKyAgICBpbXBvcnQgc3lzCisgICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKKyAgICBmb3IgbW9kbmFtZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgIGlmIG1vZG5hbWUuc3RhcnRzd2l0aCgieG1sLiIpOgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgorICAgICAgICBtb2R1bGUgPSB4bWwuc2F4LmV4cGF0cmVhZGVyCisgICAgICAgIHJldHVybiBtb2R1bGUuX19uYW1lX18gPT0gInhtbC5zYXguZXhwYXRyZWFkZXIiCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQorCitkZWYgdGVzdF9zZl8xNTEzNjExKCk6CisgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMzYxMQorICAgIHNpbyA9IFN0cmluZ0lPKCJpbnZhbGlkIikKKyAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCisgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBTQVhQYXJzZUV4Y2VwdGlvbgorICAgIHRyeToKKyAgICAgICAgcGFyc2VyLnBhcnNlKHNpbykKKyAgICBleGNlcHQgU0FYUGFyc2VFeGNlcHRpb246CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKICMgPT09PT0gTWFpbiBwcm9ncmFtCiAKIGRlZiBtYWtlX3Rlc3Rfb3V0cHV0KCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5IGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQppbmRleCBmMzcyNTRjLi4yMzk3NDVjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKQEAgLTI5OSw2ICsyOTksMTcgQEAKIGVsc2U6CiAgICAgcmFpc2UgVGVzdEZhaWxlZAogCisjIHRlc3QgZm9yIGJ1ZyAjMTUwMTkzNDogaW5jb3JyZWN0IExPQUQvU1RPUkVfR0xPQkFMIGdlbmVyYXRpb24KK2dsb2JhbF94ID0gMQorZGVmIGYoKToKKyAgICBnbG9iYWxfeCArPSAxCit0cnk6CisgICAgZigpCitleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAnc2NvcGUgb2YgZ2xvYmFsX3ggbm90IGNvcnJlY3RseSBkZXRlcm1pbmVkJworCiBwcmludCAiMTQuIGNvbXBsZXggZGVmaW5pdGlvbnMiCiAKIGRlZiBtYWtlUmV0dXJuZXIoKmxzdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NlbGVjdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CmluZGV4IGVhZWM1MmIuLmQzNDEzMjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5CkBAIC0xLDUgKzEsNSBAQAogIyBUZXN0aW5nIHNlbGVjdCBtb2R1bGUKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJlYXBfY2hpbGRyZW4KIGltcG9ydCBzZWxlY3QKIGltcG9ydCBvcwogCkBAIC02NSw1ICs2NSw2IEBACiAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICBwcmludCAnVW5leHBlY3RlZCByZXR1cm4gdmFsdWVzIGZyb20gc2VsZWN0KCk6JywgcmZkLCB3ZmQsIHhmZAogICAgIHAuY2xvc2UoKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQppbmRleCA4ZThiMDJmLi4yOGEyMWE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CkBAIC0xLDQgKzEsNiBAQAoraW1wb3J0IGh0bWxlbnRpdHlkZWZzCiBpbXBvcnQgcHByaW50CitpbXBvcnQgcmUKIGltcG9ydCBzZ21sbGliCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CkBAIC02NCw2ICs2NiwzNyBAQAogICAgICAgICBzZWxmLnNldGxpdGVyYWwoKQogCiAKK2NsYXNzIEhUTUxFbnRpdHlDb2xsZWN0b3IoRXZlbnRDb2xsZWN0b3IpOgorCisgICAgZW50aXR5X29yX2NoYXJyZWYgPSByZS5jb21waWxlKCcoPzomKFthLXpBLVpdWy0uYS16QS1aMC05XSopJworICAgICAgICAnfCYjKHhbMC05YS16QS1aXSt8WzAtOV0rKSkoOz8pJykKKworICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY2hhcnJlZiIsICJjb252ZXJ0IiwgbmFtZSkpCisgICAgICAgIGlmIG5hbWVbMF0gIT0gIngiOgorICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKQorCisgICAgZGVmIGNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY29kZXBvaW50IiwgImNvbnZlcnQiLCBjb2RlcG9pbnQpKQorICAgICAgICBFdmVudENvbGxlY3Rvci5jb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpCisKKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgImNvbnZlcnQiLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfZW50aXR5cmVmKHNlbGYsIG5hbWUpCisKKyAgICAjIFRoZXNlIHRvIHJlY29yZCB0aGF0IHRoZXkgd2VyZSBjYWxsZWQsIHRoZW4gcGFzcyB0aGUgY2FsbCBhbG9uZworICAgICMgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gdGhhdCBpdCdzIGFjdGlvbnMgY2FuIGJlCisgICAgIyByZWNvcmRlZC4KKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKQorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpCisKKwogY2xhc3MgU0dNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGNvbGxlY3RvciA9IEV2ZW50Q29sbGVjdG9yCkBAIC0yMTgsNyArMjUxLDkgQEAKICAgICAgICAgIiIiU3Vic3RpdHV0aW9uIG9mIGVudGl0aWVzIGFuZCBjaGFycmVmcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCiAgICAgICAgICMgU0YgYnVnICMxNDUyMjQ2CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9Jmx0OyBjPSZsdDsmZ3Q7IGQ9Jmx0LSZndDsgZT0nJmx0OyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY9IiZ4eHg7IiBnPScmIzMyOyYjMzM7JyBoPScmIzUwMDsnIGk9J3g/YT1iJmM9ZDsnPiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZj0iJnh4eDsiIGc9JyYjMzI7JiMzMzsnIGg9JyYjNTAwOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0neD9hPWImYz1kOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaj0nJmFtcDsjNDI7JyBrPScmIzM4OyM0MjsnPiIiIiwKICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgIjw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsICImbHQtPiIpLApAQCAtMjI2LDEzICsyNjEsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgIiZ4eHg7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsICIgISIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCAiJiM1MDA7IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsICJ4P2E9YiZjPWQ7IiksIF0pXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIng/YT1iJmM9ZDsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJqIiwgIiYjNDI7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiayIsICImIzQyOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV0pCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0X292ZXJyaWRlcyhzZWxmKToKKyAgICAgICAgIyBUaGlzIGNoZWNrcyB0aGF0IHRoZSBjaGFyYWN0ZXIgYW5kIGVudGl0eSByZWZlcmVuY2UKKyAgICAgICAgIyBjb252ZXJzaW9uIGhlbHBlcnMgYXJlIGNhbGxlZCBhdCB0aGUgZG9jdW1lbnRlZCB0aW1lcy4gIE5vCisgICAgICAgICMgYXR0ZW1wdCBpcyBtYWRlIHRvIHJlYWxseSBjaGFuZ2Ugd2hhdCB0aGUgcGFyc2VyIGFjY2VwdHMuCisgICAgICAgICMKKyAgICAgICAgc2VsZi5jb2xsZWN0b3IgPSBIVE1MRW50aXR5Q29sbGVjdG9yCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCgnPGEgdGl0bGU9IiZsZHF1bzt0ZXN0JiN4MjAxZDsiPmZvbzwvYT4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnJmZvb2JhcjsmIzQyOycpLCBbCisgICAgICAgICAgICAoJ2VudGl0eXJlZicsICdjb252ZXJ0JywgJ2xkcXVvJyksCisgICAgICAgICAgICAoJ2NoYXJyZWYnLCAnY29udmVydCcsICd4MjAxZCcpLAorICAgICAgICAgICAgKCdzdGFydHRhZycsICdhJywgWygndGl0bGUnLCAnJmxkcXVvO3Rlc3QmI3gyMDFkOycpXSksCisgICAgICAgICAgICAoJ2RhdGEnLCAnZm9vJyksCisgICAgICAgICAgICAoJ2VuZHRhZycsICdhJyksCisgICAgICAgICAgICAoJ2VudGl0eXJlZicsICdmb29iYXInKSwKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2NvbnZlcnQnLCAnZm9vYmFyJyksCisgICAgICAgICAgICAoJ2NoYXJyZWYnLCAnNDInKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICdjb252ZXJ0JywgJzQyJyksCisgICAgICAgICAgICAoJ2NvZGVwb2ludCcsICdjb252ZXJ0JywgNDIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzX3F1b3RlZF9tYXJrdXAoc2VsZik6CisgICAgICAgICIiIk11bHRpLWxpbmUgYW5kIG1hcmt1cCBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdmb29cbjxicj5iYXInPnRleHQ8L2E+IiIiLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImZvb1xuPGJyPmJhciIpXSksCisgICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKKyAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSB0aXRsZT0nbGVzcyA8IHRoYW4nPnRleHQ8L2E+IiIiLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImxlc3MgPCB0aGFuIildKSwKKyAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAorICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdncmVhdGVyID4gdGhhbic+dGV4dDwvYT4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAiZ3JlYXRlciA+IHRoYW4iKV0pLAorICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCisgICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKIAogICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGEuYj0ndicgYzpkPXYgZS1mPXY+IiIiLCBbCiAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJhLmIiLCAidiIpLCAoImM6ZCIsICJ2IiksICgiZS1mIiwgInYiKV0pLAogICAgICAgICAgICAgXSkKIAorICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVfaXA2X3VybChzZWxmKToKKyAgICAgICAgIyBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODUzNTA2CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCgiPGEgaHJlZj0naHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLyc+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhIGhyZWY9aHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLz4iKSwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICJodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vIildKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiaHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLyIpXSksCisgICAgICAgICAgICBdKQorCiAgICAgZGVmIHRlc3RfaWxsZWdhbF9kZWNsYXJhdGlvbnMoc2VsZik6CiAgICAgICAgIHMgPSAnYWJjPCFzcGFjZXIgdHlwZT0iYmxvY2siIGhlaWdodD0iMjUiPmRlZicKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMocywgWwpAQCAtMzAxLDggKzM4Miw4IEBACiAgICAgIyB0aGF0IG5lZWRzIHRvIGJlIGNhcmVmdWxseSBjb25zaWRlcmVkIGJlZm9yZSBjaGFuZ2luZyBpdC4KIAogICAgIGRlZiBfdGVzdF9zdGFydHRhZ19lbmRfYm91bmRhcnkoc2VsZik6Ci0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9JzwnPiIiIiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldKQotICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBiPSc+Jz4iIiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIj4iKV0pXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhIGI9JzwnPiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKV0pXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhIGI9Jz4nPiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIj4iKV0pXSkKIAogICAgIGRlZiBfdGVzdF9idWZmZXJfYXJ0ZWZhY3RzKHNlbGYpOgogICAgICAgICBvdXRwdXQgPSBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0KQEAgLTMyMiwxNyArNDAzLDE3IEBACiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPiciLCAiPiJdLCBvdXRwdXQpCiAKICAgICAgICAgb3V0cHV0ID0gWygiY29tbWVudCIsICJhYmMiKV0KLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IiwgIiEtLWFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhIiwgIi0tYWJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tIiwgImFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hIiwgImJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjIiwgIi0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMtIiwgIi0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLS0+IiwgIiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwiLCAiIS0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8ISIsICItLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS0iLCAiYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYSIsICJiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMiLCAiLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjLSIsICItPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMtLT4iLCAiIl0sIG91dHB1dCkKIAogICAgIGRlZiBfdGVzdF9zdGFydHRhZ19qdW5rX2NoYXJzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKaW5kZXggNmFiNWEzNS4uZGE3MWZhOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkKQEAgLTc0LDYgKzc0LDUzIEBACiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIHRlc3RfY29weXRyZWVfc2ltcGxlKHNlbGYpOgorICAgICAgICBkZWYgd3JpdGVfZGF0YShwYXRoLCBkYXRhKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGRlZiByZWFkX2RhdGEocGF0aCk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAgICAgc3JjX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBkc3RfZGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLm1rZHRlbXAoKSwgJ2Rlc3RpbmF0aW9uJykKKworICAgICAgICB3cml0ZV9kYXRhKG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdC50eHQnKSwgJzEyMycpCisKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicpKQorICAgICAgICB3cml0ZV9kYXRhKG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSwgJzQ1NicpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LnR4dCcpKSkKKyAgICAgICAgICAgIGFjdHVhbCA9IHJlYWRfZGF0YShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgJzEyMycpCisgICAgICAgICAgICBhY3R1YWwgPSByZWFkX2RhdGEob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsICc0NTYnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIHBhdGggaW4gKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBmb3IgcGF0aCBpbiAoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicpLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMocGF0aCkKKworCiAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKICAgICAgICAgZGVmIHRlc3RfZG9udF9jb3B5X2ZpbGVfb250b19saW5rX3RvX2l0c2VsZihzZWxmKToKICAgICAgICAgICAgICMgYnVnIDg1MTEyMy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKaW5kZXggZjdmY2IwNC4uYTYyNjdkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKQEAgLTI1LDcgKzI1LDExIEBACiAgKSAmCiAiIiIgJSB2YXJzKCkKIAorYV9jYWxsZWQgPSBiX2NhbGxlZCA9IEZhbHNlCisKIGRlZiBoYW5kbGVyQSgqYXJncyk6CisgICAgZ2xvYmFsIGFfY2FsbGVkCisgICAgYV9jYWxsZWQgPSBUcnVlCiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgImhhbmRsZXJBIiwgYXJncwogCkBAIC0zMywxMSArMzcsMTQgQEAKICAgICBwYXNzCiAKIGRlZiBoYW5kbGVyQigqYXJncyk6CisgICAgZ2xvYmFsIGJfY2FsbGVkCisgICAgYl9jYWxsZWQgPSBUcnVlCiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgImhhbmRsZXJCIiwgYXJncwogICAgIHJhaXNlIEhhbmRsZXJCQ2FsbGVkLCBhcmdzCiAKLXNpZ25hbC5hbGFybSgyMCkgICAgICAgICAgICAgICAgICAgICAgICAjIEVudGlyZSB0ZXN0IGxhc3RzIGF0IG1vc3QgMjAgc2VjLgorTUFYX0RVUkFUSU9OID0gMjAKK3NpZ25hbC5hbGFybShNQVhfRFVSQVRJT04pICAgIyBFbnRpcmUgdGVzdCBzaG91bGQgbGFzdCBhdCBtb3N0IDIwIHNlYy4KIGh1cCA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaGFuZGxlckEpCiB1c3IxID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgaGFuZGxlckIpCiB1c3IyID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCkBAIC02NSw5ICs3MiwzNSBAQAogZXhjZXB0IFR5cGVFcnJvcjoKICAgICBwYXNzCiAKKyMgU2V0IHVwIGEgY2hpbGQgdG8gc2VuZCBhbiBhbGFybSBzaWduYWwgdG8gdXMgKHRoZSBwYXJlbnQpIGFmdGVyIHdhaXRpbmcKKyMgbG9uZyBlbm91Z2ggdG8gcmVjZWl2ZSB0aGUgYWxhcm0uICBJdCBzZWVtcyB3ZSBtaXNzIHRoZSBhbGFybSBmb3Igc29tZQorIyByZWFzb24uICBUaGlzIHdpbGwgaG9wZWZ1bGx5IHN0b3AgdGhlIGhhbmdzIG9uIFRydTY0L0FscGhhLgorZGVmIGZvcmNlX3Rlc3RfZXhpdCgpOgorICAgICMgU2lnaCwgYm90aCBpbXBvcnRzIHNlZW0gbmVjZXNzYXJ5IHRvIGF2b2lkIGVycm9ycy4KKyAgICBpbXBvcnQgb3MKKyAgICBmb3JrX3BpZCA9IG9zLmZvcmsoKQorICAgIGlmIGZvcmtfcGlkID09IDA6CisgICAgICAgICMgSW4gY2hpbGQKKyAgICAgICAgaW1wb3J0IG9zLCB0aW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV2FpdCA1IHNlY29uZHMgbG9uZ2VyIHRoYW4gdGhlIGV4cGVjdGVkIGFsYXJtIHRvIGdpdmUgZW5vdWdoCisgICAgICAgICAgICAjIHRpbWUgZm9yIHRoZSBub3JtYWwgc2VxdWVuY2Ugb2YgZXZlbnRzIHRvIG9jY3VyLiAgVGhpcyBpcworICAgICAgICAgICAgIyBqdXN0IGEgc3RvcC1nYXAgdG8gcHJldmVudCB0aGUgdGVzdCBmcm9tIGhhbmdpbmcuCisgICAgICAgICAgICB0aW1lLnNsZWVwKE1BWF9EVVJBVElPTiArIDUpCisgICAgICAgICAgICBwcmludCA+PiBzeXMuX19zdGRvdXRfXywgJyAgY2hpbGQgc2hvdWxkIG5vdCBoYXZlIHRvIGtpbGwgcGFyZW50JworICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdBTEFSTSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgIyBJbiBwYXJlbnQgKG9yIGVycm9yKQorICAgIHJldHVybiBmb3JrX3BpZAorCiB0cnk6CiAgICAgb3Muc3lzdGVtKHNjcmlwdCkKIAorICAgICMgVHJ5IHRvIGVuc3VyZSB0aGlzIHRlc3QgZXhpdHMgZXZlbiBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCBhbGFybS4KKyAgICAjIFRydTY0L0FscGhhIHNvbWV0aW1lcyBoYW5ncyBhbmQgaXMgdWx0aW1hdGVseSBraWxsZWQgYnkgdGhlIGJ1aWxkYm90LgorICAgIGZvcmtfcGlkID0gZm9yY2VfdGVzdF9leGl0KCkKICAgICBwcmludCAic3RhcnRpbmcgcGF1c2UoKSBsb29wLi4uIgogCiAgICAgdHJ5OgpAQCAtODgsNiArMTIxLDIyIEBACiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiS2V5Ym9hcmRJbnRlcnJ1cHQgKGFzc3VtZSB0aGUgYWxhcm0oKSB3ZW50IG9mZikiCiAKKyAgICAjIEZvcmNpYmx5IGtpbGwgdGhlIGNoaWxkIHdlIGNyZWF0ZWQgdG8gcGluZyB1cyBpZiB0aGVyZSB3YXMgYSB0ZXN0IGVycm9yLgorICAgIHRyeToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3Qga2lsbCBvdXJzZWxmIGlmIHRoZXJlIHdhcyBhIGZvcmsgZXJyb3IuCisgICAgICAgIGlmIGZvcmtfcGlkID4gMDoKKyAgICAgICAgICAgIG9zLmtpbGwoZm9ya19waWQsIHNpZ25hbC5TSUdLSUxMKQorICAgIGV4Y2VwdDoKKyAgICAgICAgIyBJZiB0aGUgY2hpbGQga2lsbGVkIHVzLCBpdCBoYXMgcHJvYmFibHkgZXhpdGVkLiAgS2lsbGluZyBhCisgICAgICAgICMgbm9uLWV4aXN0YW50IHByb2Nlc3Mgd2lsbCByYWlzZSBhbiBlcnJvciB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0LgorICAgICAgICBwYXNzCisKKyAgICBpZiBub3QgYV9jYWxsZWQ6CisgICAgICAgIHByaW50ICdIYW5kbGVyQSBub3QgY2FsbGVkJworCisgICAgaWYgbm90IGJfY2FsbGVkOgorICAgICAgICBwcmludCAnSGFuZGxlckIgbm90IGNhbGxlZCcKKwogZmluYWxseToKICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIGh1cCkKICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCB1c3IxKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCAwMWI5YjViLi4zNTZiODAxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTEsNiArMTEsNyBAQAogaW1wb3J0IHN5cwogaW1wb3J0IGFycmF5CiBmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CitpbXBvcnQgc2lnbmFsCiAKIFBPUlQgPSA1MDAwNwogSE9TVCA9ICdsb2NhbGhvc3QnCkBAIC0yMSw3ICsyMiw4IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHNlbGYuc2Vydi5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzZWxmLnNlcnYuYmluZCgoSE9TVCwgUE9SVCkpCisgICAgICAgIGdsb2JhbCBQT1JUCisgICAgICAgIFBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydiwgSE9TVCwgUE9SVCkKICAgICAgICAgc2VsZi5zZXJ2Lmxpc3RlbigxKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpAQCAtMzMsNyArMzUsOCBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5zZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCiAgICAgICAgIHNlbGYuc2Vydi5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzZWxmLnNlcnYuYmluZCgoSE9TVCwgUE9SVCkpCisgICAgICAgIGdsb2JhbCBQT1JUCisgICAgICAgIFBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydiwgSE9TVCwgUE9SVCkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKQEAgLTQ0Nyw3ICs0NTAsMTIgQEAKICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc29jay5iaW5kKCgiMC4wLjAuMCIsIFBPUlQrMSkpCiAgICAgICAgIG5hbWUgPSBzb2NrLmdldHNvY2tuYW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lLCAoIjAuMC4wLjAiLCBQT1JUKzEpKQorICAgICAgICAjIFhYWChubm9yd2l0eik6IGh0dHA6Ly90aW55dXJsLmNvbS9vczVqeiBzZWVtcyB0byBpbmRpY2F0ZQorICAgICAgICAjIGl0IHJlYXNvbmFibGUgdG8gZ2V0IHRoZSBob3N0J3MgYWRkciBpbiBhZGRpdGlvbiB0byAwLjAuMC4wLgorICAgICAgICAjIEF0IGxlYXN0IGZvciBlQ29zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIFMvMzkwIHRvIHBhc3MuCisgICAgICAgIG15X2lwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWVbMF0gaW4gKCIwLjAuMC4wIiwgbXlfaXBfYWRkciksICclcyBpbnZhbGlkJyAlIG5hbWVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZVsxXSwgUE9SVCsxKQogCiAgICAgZGVmIHRlc3RHZXRTb2NrT3B0KHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgZ2V0c29ja29wdCgpCkBAIC01NzUsNiArNTgzLDIxIEBACiAgICAgZGVmIF90ZXN0UmVjdkZyb20oc2VsZik6CiAgICAgICAgIHNlbGYuY2xpLnNlbmR0byhNU0csIDAsIChIT1NULCBQT1JUKSkKIAorY2xhc3MgVENQQ2xvc2VyVGVzdChUaHJlYWRlZFRDUFNvY2tldFRlc3QpOgorCisgICAgZGVmIHRlc3RDbG9zZShzZWxmKToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgICAgICBzZCA9IHNlbGYuY2xpCisgICAgICAgIHJlYWQsIHdyaXRlLCBlcnIgPSBzZWxlY3Quc2VsZWN0KFtzZF0sIFtdLCBbXSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWQsIFtzZF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2QucmVjdigxKSwgJycpCisKKyAgICBkZWYgX3Rlc3RDbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgUE9SVCkpCisgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCiBjbGFzcyBCYXNpY1NvY2tldFBhaXJUZXN0KFNvY2tldFBhaXJUZXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CkBAIC03OTUsNiArODE4LDM3IEBACiAgICAgICAgIGlmIG5vdCBvazoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiYWNjZXB0KCkgcmV0dXJuZWQgc3VjY2VzcyB3aGVuIHdlIGRpZCBub3QgZXhwZWN0IGl0IikKIAorICAgIGRlZiB0ZXN0SW50ZXJydXB0ZWRUaW1lb3V0KHNlbGYpOgorICAgICAgICAjIFhYWCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgdGVzdCBvbiBNU1dpbmRvd3Mgb3IgYW55IG90aGVyCisgICAgICAgICMgcGxhZm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzaWduYWwuYWxhcm0oKSBvciBvcy5raWxsKCksIHRob3VnaAorICAgICAgICAjIHRoZSBidWcgc2hvdWxkIGhhdmUgZXhpc3RlZCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzaWduYWwsICJhbGFybSIpOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgIyBjYW4gb25seSB0ZXN0IG9uICpuaXgKKyAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoNS4wKSAgICMgbXVzdCBiZSBsb25nZXIgdGhhbiBhbGFybQorICAgICAgICBjbGFzcyBBbGFybShFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgYWxhcm1faGFuZGxlcihzaWduYWwsIGZyYW1lKToKKyAgICAgICAgICAgIHJhaXNlIEFsYXJtCisgICAgICAgIG9sZF9hbGFybSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSgyKSAgICAjIFBPU0lYIGFsbG93cyBhbGFybSB0byBiZSB1cCB0byAxIHNlY29uZCBlYXJseQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvbyA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHRpbWVvdXQgaW5zdGVhZCBvZiBBbGFybSIpCisgICAgICAgICAgICBleGNlcHQgQWxhcm06CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IG90aGVyIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIEFsYXJtIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJub3RoaW5nIGNhdWdodCIpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMCkgICAgICAgICAjIHNodXQgb2ZmIGFsYXJtCisgICAgICAgIGV4Y2VwdCBBbGFybToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZ290IEFsYXJtIGluIHdyb25nIHBsYWNlIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgbm8gYWxhcm0gY2FuIGJlIHBlbmRpbmcuICBTYWZlIHRvIHJlc3RvcmUgb2xkIGhhbmRsZXIuCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBvbGRfYWxhcm0pCisKIGNsYXNzIFVEUFRpbWVvdXRUZXN0KFNvY2tldFRDUFRlc3QpOgogCiAgICAgZGVmIHRlc3RVRFBUaW1lb3V0KHNlbGYpOgpAQCAtODgzLDggKzkzNyw4IEBACiAgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoYnVmKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUFRpbWVvdXRUZXN0LCBUZXN0RXhjZXB0aW9ucywKLSAgICAgICAgICAgICBCdWZmZXJJT1Rlc3RdCisgICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUENsb3NlclRlc3QsIFRDUFRpbWVvdXRUZXN0LAorICAgICAgICAgICAgIFRlc3RFeGNlcHRpb25zLCBCdWZmZXJJT1Rlc3RdCiAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdtYWMnOgogICAgICAgICB0ZXN0cy5leHRlbmQoWyBCYXNpY1VEUFRlc3QsIFVEUFRpbWVvdXRUZXN0IF0pCiAKQEAgLTg5OSw3ICs5NTMsMTAgQEAKICAgICAgICAgdGVzdHMuYXBwZW5kKEJhc2ljU29ja2V0UGFpclRlc3QpCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdsaW51eDInOgogICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UpCisKKyAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQppbmRleCAxMDkxMzgzLi4zYzljOWYwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CkBAIC0zLDYgKzMsNyBAQAogaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubwogCiAjIE9wdGlvbmFsbHkgdGVzdCBTU0wgc3VwcG9ydC4gIFRoaXMgcmVxdWlyZXMgdGhlICduZXR3b3JrJyByZXNvdXJjZSBhcyBnaXZlbgogIyBvbiB0aGUgcmVncnRlc3QgY29tbWFuZCBsaW5lLgpAQCAtMzMsNiArMzQsMTMgQEAKIGRlZiB0ZXN0X3RpbWVvdXQoKToKICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQogCisgICAgZGVmIGVycm9yX21zZyhleHRyYV9tc2cpOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiJcCisgICAgV0FSTklORzogIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byAlciAlcywgaW4KKyAgICB0ZXN0X3RpbWVvdXQuICBUaGF0IG1heSBiZSBsZWdpdGltYXRlLCBidXQgaXMgbm90IHRoZSBvdXRjb21lIHdlIGhvcGVkCisgICAgZm9yLiAgSWYgdGhpcyBtZXNzYWdlIGlzIHNlZW4gb2Z0ZW4sIHRlc3RfdGltZW91dCBzaG91bGQgYmUgY2hhbmdlZCB0bworICAgIHVzZSBhIG1vcmUgcmVsaWFibGUgYWRkcmVzcy4iIiIgJSAoQUREUiwgZXh0cmFfbXNnKQorCiAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgIHByaW50ICJ0ZXN0X3RpbWVvdXQgLi4uIgogCkBAIC00OCwxMiArNTYsMTQgQEAKICAgICB0cnk6CiAgICAgICAgIHMuY29ubmVjdChBRERSKQogICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKLSAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIiIiXAotICAgIFdBUk5JTkc6ICBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gJXIgdGltZWQgb3V0LCBpbgotICAgIHRlc3RfdGltZW91dC4gIFRoYXQgbWF5IGJlIGxlZ2l0aW1hdGUsIGJ1dCBpcyBub3QgdGhlIG91dGNvbWUgd2UgaG9wZWQKLSAgICBmb3IuICBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBvZnRlbiwgdGVzdF90aW1lb3V0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCi0gICAgdXNlIGEgbW9yZSByZWxpYWJsZSBhZGRyZXNzLiIiIiAlIChBRERSLCkKKyAgICAgICAgZXJyb3JfbXNnKCd0aW1lZCBvdXQnKQogICAgICAgICByZXR1cm4KKyAgICBleGNlcHQgc29ja2V0LmVycm9yLCBleGM6ICAjIEluIGNhc2UgY29ubmVjdGlvbiBpcyByZWZ1c2VkLgorICAgICAgICBpZiBleGMuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICBlcnJvcl9tc2coJ3dhcyByZWZ1c2VkJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKIAogICAgIHNzID0gc29ja2V0LnNzbChzKQogICAgICMgUmVhZCBwYXJ0IG9mIHJldHVybiB3ZWxjb21lIGJhbm5lciB0d2ljZS4KQEAgLTcxLDcgKzgxLDcgQEAKICAgICAgICAgcmV0dXJuCiAKICAgICAjIFNvbWUgcmFuZG9tIHBvcnQgdG8gY29ubmVjdCB0by4KLSAgICBQT1JUID0gOTkzNAorICAgIFBPUlQgPSBbOTkzNF0KIAogICAgIGxpc3RlbmVyX3JlYWR5ID0gdGhyZWFkaW5nLkV2ZW50KCkKICAgICBsaXN0ZW5lcl9nb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKQEAgLTgyLDcgKzkyLDcgQEAKICAgICAjIGtub3cgdGhlIHNvY2tldCBpcyBnb25lLgogICAgIGRlZiBsaXN0ZW5lcigpOgogICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCi0gICAgICAgIHMuYmluZCgoJycsIFBPUlQpKQorICAgICAgICBQT1JUWzBdID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzLCAnJywgUE9SVFswXSkKICAgICAgICAgcy5saXN0ZW4oNSkKICAgICAgICAgbGlzdGVuZXJfcmVhZHkuc2V0KCkKICAgICAgICAgcy5hY2NlcHQoKQpAQCAtOTIsNyArMTAyLDcgQEAKICAgICBkZWYgY29ubmVjdG9yKCk6CiAgICAgICAgIGxpc3RlbmVyX3JlYWR5LndhaXQoKQogICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCi0gICAgICAgIHMuY29ubmVjdCgoJ2xvY2FsaG9zdCcsIFBPUlQpKQorICAgICAgICBzLmNvbm5lY3QoKCdsb2NhbGhvc3QnLCBQT1JUWzBdKSkKICAgICAgICAgbGlzdGVuZXJfZ29uZS53YWl0KCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3NsX3NvY2sgPSBzb2NrZXQuc3NsKHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CmluZGV4IDEyNDViYTUuLmRkNDUzMmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CkBAIC0xLDExICsxLDEzIEBACiAjIFRlc3Qgc3VpdGUgZm9yIFNvY2tldFNlcnZlci5weQogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgdmVyaWZ5LCBURVNURk4sIFRlc3RTa2lwcGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAodmVyYm9zZSwgdmVyaWZ5LCBURVNURk4sIFRlc3RTa2lwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXBfY2hpbGRyZW4pCiB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQogCiBmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgKgogaW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgdGltZQogaW1wb3J0IHRocmVhZGluZwpAQCAtNzcsNiArNzksMTEgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogY3JlYXRpbmcgc2VydmVyIgogICAgICAgICBzdnIgPSBzdnJjbHMoc2VsZi5fX2FkZHIsIHNlbGYuX19oZGxyY2xzKQorICAgICAgICAjIHB1bGwgdGhlIGFkZHJlc3Mgb3V0IG9mIHRoZSBzZXJ2ZXIgaW4gY2FzZSBpdCBjaGFuZ2VkCisgICAgICAgICMgdGhpcyBjYW4gaGFwcGVuIGlmIGFub3RoZXIgcHJvY2VzcyBpcyB1c2luZyB0aGUgcG9ydAorICAgICAgICBhZGRyID0gZ2V0YXR0cihzdnIsICdzZXJ2ZXJfYWRkcmVzcycpCisgICAgICAgIGlmIGFkZHI6CisgICAgICAgICAgICBzZWxmLl9fYWRkciA9IGFkZHIKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogc2VydmluZyB0aHJlZSB0aW1lcyIKICAgICAgICAgc3ZyLnNlcnZlX2FfZmV3KCkKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRocmVhZDogZG9uZSIKQEAgLTEzNiw3ICsxNDMsMjUgQEAKICAgICAgICAgdC5qb2luKCkKICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgImRvbmUiCiAKLXRjcHNlcnZlcnMgPSBbVENQU2VydmVyLCBUaHJlYWRpbmdUQ1BTZXJ2ZXJdCitjbGFzcyBGb3JnaXZpbmdUQ1BTZXJ2ZXIoVENQU2VydmVyKToKKyAgICAjIHByZXZlbnQgZXJyb3JzIGlmIGFub3RoZXIgcHJvY2VzcyBpcyB1c2luZyB0aGUgcG9ydCB3ZSB3YW50CisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICBob3N0LCBkZWZhdWx0X3BvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzCisgICAgICAgICMgdGhpcyBjb2RlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0CisgICAgICAgICMgdGhlIHBvcnRzIHdlcmUgY2hhbmdlZCB0byBwcm90ZWN0IHRoZSBpbm5vY2VudAorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGZvciBwb3J0IGluIFtkZWZhdWx0X3BvcnQsIDM0MzQsIDg3OTgsIDIzODMzXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9hZGRyZXNzID0gaG9zdCwgcG9ydAorICAgICAgICAgICAgICAgIFRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICAgICAgICAgIGlmIGVyciAhPSBlcnJuby5FQUREUklOVVNFOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sIFwKKyAgICAgICAgICAgICAgICAgICAgJyAgV0FSTklORzogZmFpbGVkIHRvIGxpc3RlbiBvbiBwb3J0ICVkLCB0cnlpbmcgYW5vdGhlcicgJSBwb3J0CisKK3RjcHNlcnZlcnMgPSBbRm9yZ2l2aW5nVENQU2VydmVyLCBUaHJlYWRpbmdUQ1BTZXJ2ZXJdCiBpZiBoYXNhdHRyKG9zLCAnZm9yaycpIGFuZCBvcy5uYW1lIG5vdCBpbiAoJ29zMicsKToKICAgICB0Y3BzZXJ2ZXJzLmFwcGVuZChGb3JraW5nVENQU2VydmVyKQogdWRwc2VydmVycyA9IFtVRFBTZXJ2ZXIsIFRocmVhZGluZ1VEUFNlcnZlcl0KQEAgLTE3NSw2ICsyMDAsNyBAQAogICAgICAgICB0ZXN0YWxsKCkKICAgICBmaW5hbGx5OgogICAgICAgICBjbGVhbnVwKCkKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCBhYTQ1OGU2Li42NmZkNjY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtMTUsOSArMTUsMTEgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBQWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcgPSAwCiAgICAgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgPSAxCisgICAgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSA9IDIKIGVsc2U6Ci0gICAgUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HID0gX3N0cnVjdC5fUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HCi0gICAgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgPSBfc3RydWN0Ll9QWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORworICAgIFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyA9IGdldGF0dHIoX3N0cnVjdCwgJ19QWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcnLCAwKQorICAgIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HID0gZ2V0YXR0cihfc3RydWN0LCAnX1BZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HJywgMCkKKyAgICBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFID0gZ2V0YXR0cihfc3RydWN0LCAnX1BZX1NUUlVDVF9GTE9BVF9DT0VSQ0UnLCAwKQogCiBkZWYgc3RyaW5nX3JldmVyc2Uocyk6CiAgICAgcmV0dXJuICIiLmpvaW4ocmV2ZXJzZWQocykpCkBAIC00NiwzMyArNDgsNDAgQEAKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZGlkIG5vdCByYWlzZSBlcnJvciIgJSAoCiAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQogCi1kZWYgZGVwcmVjYXRlZF9lcnIoZnVuYywgKmFyZ3MpOgotICAgICMgVGhlIGB3YXJuaW5nc2AgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhbiBhZHZlcnRpc2VkIHdheSB0byByZXN0b3JlCi0gICAgIyBpdHMgZmlsdGVyIGxpc3QuICBDaGVhdC4KLSAgICBzYXZlX3dhcm5pbmdzX2ZpbHRlcnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCi0gICAgIyBHcnJyLCB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gd2FybiBldmVyeSB0aW1lLiAgV2l0aG91dCByZW1vdmluZwotICAgICMgdGhlIHdhcm5pbmdyZWdpc3RyeSwgcnVubmluZyB0ZXN0X3RhcmZpbGUgdGhlbiB0ZXN0X3N0cnVjdCB3b3VsZCBmYWlsCi0gICAgIyBvbiA2NC1iaXQgcGxhdGZvcm1zLgotICAgIGdsb2JhbHMgPSBmdW5jLmZ1bmNfZ2xvYmFscwotICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzOgotICAgICAgICBkZWwgZ2xvYmFsc1snX193YXJuaW5ncmVnaXN0cnlfXyddCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgciIiIl5zdHJ1Y3QuKiIiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiIuKmZvcm1hdCByZXF1aXJlcy4qIiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICB0cnk6CitkZWYgd2l0aF93YXJuaW5nX3Jlc3RvcmUoZnVuYyk6CisgICAgZGVmIF93aXRoX3dhcm5pbmdfcmVzdG9yZSgqYXJncywgKiprdyk6CisgICAgICAgICMgVGhlIGB3YXJuaW5nc2AgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhbiBhZHZlcnRpc2VkIHdheSB0byByZXN0b3JlCisgICAgICAgICMgaXRzIGZpbHRlciBsaXN0LiAgQ2hlYXQuCisgICAgICAgIHNhdmVfd2FybmluZ3NfZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICAgICAgIyBHcnJyLCB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gdG8gd2FybiBldmVyeSB0aW1lLiAgV2l0aG91dCByZW1vdmluZworICAgICAgICAjIHRoZSB3YXJuaW5ncmVnaXN0cnksIHJ1bm5pbmcgdGVzdF90YXJmaWxlIHRoZW4gdGVzdF9zdHJ1Y3Qgd291bGQgZmFpbAorICAgICAgICAjIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCisgICAgICAgIGdsb2JhbHMgPSBmdW5jLmZ1bmNfZ2xvYmFscworICAgICAgICBpZiAnX193YXJuaW5ncmVnaXN0cnlfXycgaW4gZ2xvYmFsczoKKyAgICAgICAgICAgIGRlbCBnbG9iYWxzWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgciIiIl5zdHJ1Y3QuKiIiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCByIiIiLipmb3JtYXQgcmVxdWlyZXMuKiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmdW5jKCphcmdzKQotICAgICAgICBleGNlcHQgKHN0cnVjdC5lcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKLSAgICAgICAgICAgIGlmIG5vdCBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORzoKLSAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBleHBlY3RlZCB0byByYWlzZSBzdHJ1Y3QuZXJyb3IiICUgKAotICAgICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZGlkIG5vdCByYWlzZSBlcnJvciIgJSAoCisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlX3dhcm5pbmdzX2ZpbHRlcnNbOl0KKyAgICByZXR1cm4gX3dpdGhfd2FybmluZ19yZXN0b3JlCisKK2RlZiBkZXByZWNhdGVkX2VycihmdW5jLCAqYXJncyk6CisgICAgdHJ5OgorICAgICAgICBmdW5jKCphcmdzKQorICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKKyAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzJXMgZXhwZWN0ZWQgdG8gcmFpc2Ugc3RydWN0LmVycm9yIiAlICgKICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBhcmdzKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlX3dhcm5pbmdzX2ZpbHRlcnNbOl0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBkaWQgbm90IHJhaXNlIGVycm9yIiAlICgKKyAgICAgICAgICAgIGZ1bmMuX19uYW1lX18sIGFyZ3MpCitkZXByZWNhdGVkX2VyciA9IHdpdGhfd2FybmluZ19yZXN0b3JlKGRlcHJlY2F0ZWRfZXJyKQorCiAKIHNpbXBsZV9lcnIoc3RydWN0LmNhbGNzaXplLCAnWicpCiAKQEAgLTQ3NSw2ICs0ODQsOSBAQAogCiB0ZXN0XzcwNTgzNigpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTRiBidWcgMTIyOTM4MC4gTm8gc3RydWN0LnBhY2sgZXhjZXB0aW9uIGZvciBzb21lIG91dCBvZiByYW5nZSBpbnRlZ2VycworCiBkZWYgdGVzdF8xMjI5MzgwKCk6CiAgICAgaW1wb3J0IHN5cwogICAgIGZvciBlbmRpYW4gaW4gKCcnLCAnPicsICc8Jyk6CkBAIC00OTEsNiArNTAzLDM3IEBACiBpZiBQWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkc6CiAgICAgdGVzdF8xMjI5MzgwKCkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNGIGJ1ZyAxNTMwNTU5LiBzdHJ1Y3QucGFjayByYWlzZXMgVHlwZUVycm9yIHdoZXJlIGl0IHVzZWQgdG8gY29udmVydC4KKworZGVmIGNoZWNrX2Zsb2F0X2NvZXJjZShmb3JtYXQsIG51bWJlcik6CisgICAgaWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSA9PSAyOgorICAgICAgICAjIFRlc3QgZm9yIHByZS0yLjUgc3RydWN0IG1vZHVsZQorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjayhmb3JtYXQsIG51bWJlcikKKyAgICAgICAgZmxvb3JlZCA9IHN0cnVjdC51bnBhY2soZm9ybWF0LCBwYWNrZWQpWzBdCisgICAgICAgIGlmIGZsb29yZWQgIT0gaW50KG51bWJlcik6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJkaWQgbm90IGNvcnJlY2x5IGNvZXJjZSBmbG9hdCB0byBpbnQiKQorICAgICAgICByZXR1cm4KKyAgICB0cnk6CisgICAgICAgIGZ1bmMoKmFyZ3MpCisgICAgZXhjZXB0IChzdHJ1Y3QuZXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgIGlmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0U6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCBEZXByZWNhdGlvbldhcm5pbmcgZm9yIGZsb2F0IGNvZXJjZSIpCisgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKKyAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0U6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCB0byByYWlzZSBzdHJ1Y3QuZXJyb3IgZm9yIGZsb2F0IGNvZXJjZSIpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZGlkIG5vdCByYWlzZSBlcnJvciBmb3IgZmxvYXQgY29lcmNlIikKKworY2hlY2tfZmxvYXRfY29lcmNlID0gd2l0aF93YXJuaW5nX3Jlc3RvcmUoZGVwcmVjYXRlZF9lcnIpCisKK2RlZiB0ZXN0XzE1MzA1NTkoKToKKyAgICBmb3IgZW5kaWFuIGluICgnJywgJz4nLCAnPCcpOgorICAgICAgICBmb3IgZm10IGluICgnQicsICdIJywgJ0knLCAnTCcsICdiJywgJ2gnLCAnaScsICdsJyk6CisgICAgICAgICAgICBjaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjApCisgICAgICAgICAgICBjaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjUpCisKK3Rlc3RfMTUzMDU1OSgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQYWNraW5nIGFuZCB1bnBhY2tpbmcgdG8vZnJvbSBidWZmZXJzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGVkZjViZDAuLjhjOGFjNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTI3LDYgKzI3LDE4IEBACiAgICAgcmV0dXJuIHJlLnN1YihyIlxbXGQrIHJlZnNcXVxyP1xuPyQiLCAiIiwgc3RkZXJyKQogCiBjbGFzcyBQcm9jZXNzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB3ZSBoYXZlIHNvIHRoaXMgdGVzdAorICAgICAgICAjIGRvZXNuJ3QgY3Jhc2ggb24gc29tZSBidWlsZGJvdHMgKEFscGhhcyBpbiBwYXJ0aWN1bGFyKS4KKyAgICAgICAgaWYgaGFzYXR0cih0ZXN0X3N1cHBvcnQsICJyZWFwX2NoaWxkcmVuIik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gd2UgaGF2ZSBzbyB0aGlzIHRlc3QKKyAgICAgICAgIyBkb2Vzbid0IGNyYXNoIG9uIHNvbWUgYnVpbGRib3RzIChBbHBoYXMgaW4gcGFydGljdWxhcikuCisgICAgICAgIGlmIGhhc2F0dHIodGVzdF9zdXBwb3J0LCAicmVhcF9jaGlsZHJlbiIpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCiAgICAgZGVmIG1rc3RlbXAoc2VsZik6CiAgICAgICAgICIiIndyYXBwZXIgZm9yIG1rc3RlbXAsIGNhbGxpbmcgbWt0ZW1wIGlmIG1rc3RlbXAgaXMgbm90IGF2YWlsYWJsZSIiIgogICAgICAgICBpZiBoYXNhdHRyKHRlbXBmaWxlLCAibWtzdGVtcCIpOgpAQCAtNTYsNyArNjgsNyBAQAogICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdKQogICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXJybm8sIDQ3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnJldHVybmNvZGUsIDQ3KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBDYWxsZWRQcm9jZXNzRXJyb3IiKQogCkBAIC0zODQsNyArMzk2LDggQEAKIAogICAgIGRlZiB0ZXN0X25vX2xlYWtpbmcoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHdlIGxlYWsgbm8gcmVzb3VyY2VzCi0gICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJzdWJwcm9jZXNzIikgYW5kIG5vdCBtc3dpbmRvd3M6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHRlc3Rfc3VwcG9ydCwgImlzX3Jlc291cmNlX2VuYWJsZWQiKSBcCisgICAgICAgICAgICAgICBvciB0ZXN0X3N1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgic3VicHJvY2VzcyIpIGFuZCBub3QgbXN3aW5kb3dzOgogICAgICAgICAgICAgbWF4X2hhbmRsZXMgPSAxMDI2ICMgdG9vIG11Y2ggZm9yIG1vc3QgVU5JWCBzeXN0ZW1zCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtYXhfaGFuZGxlcyA9IDY1CkBAIC00NjMsMTAgKzQ3NiwzNiBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIE9TRXJyb3IiKQogCisgICAgICAgIGRlZiBfc3VwcHJlc3NfY29yZV9maWxlcyhzZWxmKToKKyAgICAgICAgICAgICIiIlRyeSB0byBwcmV2ZW50IGNvcmUgZmlsZXMgZnJvbSBiZWluZyBjcmVhdGVkLgorICAgICAgICAgICAgUmV0dXJucyBwcmV2aW91cyB1bGltaXQgaWYgc3VjY2Vzc2Z1bCwgZWxzZSBOb25lLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgICAgICAgICAgb2xkX2xpbWl0ID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFKQorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgKDAsMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9sZF9saW1pdAorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZGVmIF91bnN1cHByZXNzX2NvcmVfZmlsZXMoc2VsZiwgb2xkX2xpbWl0KToKKyAgICAgICAgICAgICIiIlJldHVybiBjb3JlIGZpbGUgYmVoYXZpb3IgdG8gZGVmYXVsdC4iIiIKKyAgICAgICAgICAgIGlmIG9sZF9saW1pdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCByZXNvdXJjZQorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgb2xkX2xpbWl0KQorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIGRlZiB0ZXN0X3J1bl9hYm9ydChzZWxmKToKICAgICAgICAgICAgICMgcmV0dXJuY29kZSBoYW5kbGVzIHNpZ25hbCB0ZXJtaW5hdGlvbgotICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbXBvcnQgb3M7IG9zLmFib3J0KCkiXSkKKyAgICAgICAgICAgIG9sZF9saW1pdCA9IHNlbGYuX3N1cHByZXNzX2NvcmVfZmlsZXMoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCBvczsgb3MuYWJvcnQoKSJdKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN1cHByZXNzX2NvcmVfZmlsZXMob2xkX2xpbWl0KQogICAgICAgICAgICAgcC53YWl0KCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXAucmV0dXJuY29kZSwgc2lnbmFsLlNJR0FCUlQpCiAKQEAgLTU5OSw2ICs2MzgsOCBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQcm9jZXNzVGVzdENhc2UpCisgICAgaWYgaGFzYXR0cih0ZXN0X3N1cHBvcnQsICJyZWFwX2NoaWxkcmVuIik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IDJkMDhmNGQuLmE5ZDVkYWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTg5LDYgKzg5LDI0IEBACiAgICAgICAgICAgICBtc2cgPSAiVXNlIG9mIHRoZSBgJXMnIHJlc291cmNlIG5vdCBlbmFibGVkIiAlIHJlc291cmNlCiAgICAgICAgIHJhaXNlIFJlc291cmNlRGVuaWVkKG1zZykKIAorZGVmIGJpbmRfcG9ydChzb2NrLCBob3N0PScnLCBwcmVmZXJyZWRfcG9ydD01NDMyMSk6CisgICAgIiIiVHJ5IHRvIGJpbmQgdGhlIHNvY2sgdG8gYSBwb3J0LiAgSWYgd2UgYXJlIHJ1bm5pbmcgbXVsdGlwbGUKKyAgICB0ZXN0cyBhbmQgd2UgZG9uJ3QgdHJ5IG11bHRpcGxlIHBvcnRzLCB0aGUgdGVzdCBjYW4gZmFpbHMuICBUaGlzCisgICAgbWFrZXMgdGhlIHRlc3QgbW9yZSByb2J1c3QuIiIiCisKKyAgICBpbXBvcnQgc29ja2V0LCBlcnJubworICAgICMgc29tZSByYW5kb20gcG9ydHMgdGhhdCBob3BlZnVsbHkgbm8gb25lIGlzIGxpc3RlbmluZyBvbi4KKyAgICBmb3IgcG9ydCBpbiBbcHJlZmVycmVkX3BvcnQsIDk5MDcsIDEwMjQzLCAzMjk5OV06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgcG9ydCkpCisgICAgICAgICAgICByZXR1cm4gcG9ydAorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICAgICAgaWYgZXJyICE9IGVycm5vLkVBRERSSU5VU0U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sIFwKKyAgICAgICAgICAgICAgICAnICBXQVJOSU5HOiBmYWlsZWQgdG8gbGlzdGVuIG9uIHBvcnQgJWQsIHRyeWluZyBhbm90aGVyJyAlIHBvcnQKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAndW5hYmxlIHRvIGZpbmQgcG9ydCB0byBsaXN0ZW4gb24nCisKIEZVWlogPSAxZS02CiAKIGRlZiBmY21wKHgsIHkpOiAjIGZ1enp5IGNvbXBhcmlzb24gZnVuY3Rpb24KQEAgLTI5Niw2ICszMTQsMTIgQEAKIF8xRyA9IDEwMjQgKiBfMU0KIF8yRyA9IDIgKiBfMUcKIAorIyBIYWNrIHRvIGdldCBhdCB0aGUgbWF4aW11bSB2YWx1ZSBhbiBpbnRlcm5hbCBpbmRleCBjYW4gdGFrZS4KK2NsYXNzIF9EdW1teToKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICByZXR1cm4gagorTUFYX1B5X3NzaXplX3QgPSBfRHVtbXkoKVs6XQorCiBkZWYgc2V0X21lbWxpbWl0KGxpbWl0KToKICAgICBpbXBvcnQgcmUKICAgICBnbG9iYWwgbWF4X21lbXVzZQpAQCAtMzEwLDcgKzMzNCw5IEBACiAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIG1lbW9yeSBsaW1pdCAlcicgJSAobGltaXQsKSkKICAgICBtZW1saW1pdCA9IGludChmbG9hdChtLmdyb3VwKDEpKSAqIHNpemVzW20uZ3JvdXAoMykubG93ZXIoKV0pCi0gICAgaWYgbWVtbGltaXQgPCAyLjUqXzFHOgorICAgIGlmIG1lbWxpbWl0ID4gTUFYX1B5X3NzaXplX3Q6CisgICAgICAgIG1lbWxpbWl0ID0gTUFYX1B5X3NzaXplX3QKKyAgICBpZiBtZW1saW1pdCA8IF8yRyAtIDE6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01lbW9yeSBsaW1pdCAlciB0b28gbG93IHRvIGJlIHVzZWZ1bCcgJSAobGltaXQsKSkKICAgICBtYXhfbWVtdXNlID0gbWVtbGltaXQKIApAQCAtMzUzLDYgKzM3OSwxNyBAQAogICAgICAgICByZXR1cm4gd3JhcHBlcgogICAgIHJldHVybiBkZWNvcmF0b3IKIAorZGVmIGJpZ2FkZHJzcGFjZXRlc3QoZik6CisgICAgIiIiRGVjb3JhdG9yIGZvciB0ZXN0cyB0aGF0IGZpbGwgdGhlIGFkZHJlc3Mgc3BhY2UuIiIiCisgICAgZGVmIHdyYXBwZXIoc2VsZik6CisgICAgICAgIGlmIG1heF9tZW11c2UgPCBNQVhfUHlfc3NpemVfdDoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU2tpcHBpbmcgJXMgYmVjYXVzZSBvZiBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbnRcbiIgJSAoZi5fX25hbWVfXywpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGYoc2VsZikKKyAgICByZXR1cm4gd3JhcHBlcgorCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgUHJlbGltaW5hcnkgUHlVTklUIGludGVncmF0aW9uLgogCkBAIC00MzUsMyArNDcyLDQ2IEBACiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ2RvY3Rlc3QgKCVzKSAuLi4gJWQgdGVzdHMgd2l0aCB6ZXJvIGZhaWx1cmVzJyAlIChtb2R1bGUuX19uYW1lX18sIHQpCiAgICAgcmV0dXJuIGYsIHQKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRocmVhZGluZyBzdXBwb3J0IHRvIHByZXZlbnQgcmVwb3J0aW5nIHJlZmxlYWtzIHdoZW4gcnVubmluZyByZWdydGVzdC5weSAtUgorCitkZWYgdGhyZWFkaW5nX3NldHVwKCk6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIHJldHVybiBsZW4odGhyZWFkaW5nLl9hY3RpdmUpLCBsZW4odGhyZWFkaW5nLl9saW1ibykKKworZGVmIHRocmVhZGluZ19jbGVhbnVwKG51bV9hY3RpdmUsIG51bV9saW1ibyk6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIGltcG9ydCB0aW1lCisKKyAgICBfTUFYX0NPVU5UID0gMTAKKyAgICBjb3VudCA9IDAKKyAgICB3aGlsZSBsZW4odGhyZWFkaW5nLl9hY3RpdmUpICE9IG51bV9hY3RpdmUgYW5kIGNvdW50IDwgX01BWF9DT1VOVDoKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgIGNvdW50ID0gMAorICAgIHdoaWxlIGxlbih0aHJlYWRpbmcuX2xpbWJvKSAhPSBudW1fbGltYm8gYW5kIGNvdW50IDwgX01BWF9DT1VOVDoKKyAgICAgICAgY291bnQgKz0gMQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworZGVmIHJlYXBfY2hpbGRyZW4oKToKKyAgICAiIiJVc2UgdGhpcyBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIHRlc3RfbWFpbigpIHdoZW5ldmVyIHN1Yi1wcm9jZXNzZXMKKyAgICBhcmUgc3RhcnRlZC4gIFRoaXMgd2lsbCBoZWxwIGVuc3VyZSB0aGF0IG5vIGV4dHJhIGNoaWxkcmVuICh6b21iaWVzKQorICAgIHN0aWNrIGFyb3VuZCB0byBob2cgcmVzb3VyY2VzIGFuZCBjcmVhdGUgcHJvYmxlbXMgd2hlbiBsb29raW5nCisgICAgZm9yIHJlZmxlYWtzLgorICAgICIiIgorCisgICAgIyBSZWFwIGFsbCBvdXIgZGVhZCBjaGlsZCBwcm9jZXNzZXMgc28gd2UgZG9uJ3QgbGVhdmUgem9tYmllcyBhcm91bmQuCisgICAgIyBUaGVzZSBob2cgcmVzb3VyY2VzIGFuZCBtaWdodCBiZSBjYXVzaW5nIHNvbWUgb2YgdGhlIGJ1aWxkYm90cyB0byBkaWUuCisgICAgaW1wb3J0IG9zCisgICAgaWYgaGFzYXR0cihvcywgJ3dhaXRwaWQnKToKKyAgICAgICAgYW55X3Byb2Nlc3MgPSAtMQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBXaW5kb3dzLiAgVGhhdCdzIG9rLgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChhbnlfcHJvY2Vzcywgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCBhZTJhMWM4Li5mMWYxNTI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMjM3LDYgKzIzNyw5MCBAQAogICAgICAgICAgICAgaXMgc3lzLl9nZXRmcmFtZSgpLmZfY29kZQogICAgICAgICApCiAKKyAgICAjIHN5cy5fY3VycmVudF9mcmFtZXMoKSBpcyBhIENQeXRob24tb25seSBnaW1taWNrLgorICAgIGRlZiB0ZXN0X2N1cnJlbnRfZnJhbWVzKHNlbGYpOgorICAgICAgICBoYXZlX3RocmVhZHMgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaGF2ZV90aHJlYWRzID0gRmFsc2UKKworICAgICAgICBpZiBoYXZlX3RocmVhZHM6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhfdGhyZWFkcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhvdXRfdGhyZWFkcygpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIGluIGEgV0lUSF9USFJFQURTIGJ1aWxkLgorICAgIGRlZiBjdXJyZW50X2ZyYW1lc193aXRoX3RocmVhZHMoc2VsZik6CisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcsIHRocmVhZAorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisKKyAgICAgICAgIyBTcGF3biBhIHRocmVhZCB0aGF0IGJsb2NrcyBhdCBhIGtub3duIHBsYWNlLiAgVGhlbiB0aGUgbWFpbgorICAgICAgICAjIHRocmVhZCBkb2VzIHN5cy5fY3VycmVudF9mcmFtZXMoKSwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlIGZyYW1lcworICAgICAgICAjIHJldHVybmVkIG1ha2Ugc2Vuc2UuCisgICAgICAgIGVudGVyZWRfZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGxlYXZlX2cgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB0aHJlYWRfaW5mbyA9IFtdICAjIHRoZSB0aHJlYWQncyBpZAorCisgICAgICAgIGRlZiBmMTIzKCk6CisgICAgICAgICAgICBnNDU2KCkKKworICAgICAgICBkZWYgZzQ1NigpOgorICAgICAgICAgICAgdGhyZWFkX2luZm8uYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKKyAgICAgICAgICAgIGVudGVyZWRfZy5zZXQoKQorICAgICAgICAgICAgbGVhdmVfZy53YWl0KCkKKworICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZjEyMykKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGVudGVyZWRfZy53YWl0KCkKKworICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIHQgaGFzIGZpbmlzaGVkIGl0cyBlbnRlcmVkX2cuc2V0KCksIGFsdGhvdWdoIGl0J3MKKyAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGd1ZXNzIHdoZXRoZXIgaXQncyBzdGlsbCBvbiB0aGF0IGxpbmUgb3IgaGFzIG1vdmVkIG9uCisgICAgICAgICMgdG8gaXRzIGxlYXZlX2cud2FpdCgpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0aHJlYWRfaW5mbyksIDEpCisgICAgICAgIHRocmVhZF9pZCA9IHRocmVhZF9pbmZvWzBdCisKKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorCisgICAgICAgIG1haW5faWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1haW5faWQgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRocmVhZF9pZCBpbiBkKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIG1haW4tdGhyZWFkIGZyYW1lIGlzIF90aGlzXyBmcmFtZS4KKyAgICAgICAgZnJhbWUgPSBkLnBvcChtYWluX2lkKQorICAgICAgICBzZWxmLmFzc2VydF8oZnJhbWUgaXMgc3lzLl9nZXRmcmFtZSgpKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhcHR1cmVkIHRocmVhZCBmcmFtZSBpcyBibG9ja2VkIGluIGc0NTYsIGNhbGxlZAorICAgICAgICAjIGZyb20gZjEyMy4gIFRoaXMgaXMgYSBsaXR0ZSB0cmlja3ksIHNpbmNlIHZhcmlvdXMgYml0cyBvZgorICAgICAgICAjIHRocmVhZGluZy5weSBhcmUgYWxzbyBpbiB0aGUgdGhyZWFkJ3MgY2FsbCBzdGFjay4KKyAgICAgICAgZnJhbWUgPSBkLnBvcCh0aHJlYWRfaWQpCisgICAgICAgIHN0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soZnJhbWUpCisgICAgICAgIGZvciBpLCAoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIHNvdXJjZWxpbmUpIGluIGVudW1lcmF0ZShzdGFjayk6CisgICAgICAgICAgICBpZiBmdW5jbmFtZSA9PSAiZjEyMyI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IGZpbmQgZjEyMygpIG9uIHRocmVhZCdzIGNhbGwgc3RhY2siKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cmNlbGluZSwgImc0NTYoKSIpCisKKyAgICAgICAgIyBBbmQgdGhlIG5leHQgcmVjb3JkIG11c3QgYmUgZm9yIGc0NTYoKS4KKyAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIHNvdXJjZWxpbmUgPSBzdGFja1tpKzFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuY25hbWUsICJnNDU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNvdXJjZWxpbmUgaW4gWyJsZWF2ZV9nLndhaXQoKSIsICJlbnRlcmVkX2cuc2V0KCkiXSkKKworICAgICAgICAjIFJlYXAgdGhlIHNwYXduZWQgdGhyZWFkLgorICAgICAgICBsZWF2ZV9nLnNldCgpCisgICAgICAgIHQuam9pbigpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIHdoZW4gdGhyZWFkIHN1cHBvcnQgZG9lc24ndCBleGlzdC4KKyAgICBkZWYgY3VycmVudF9mcmFtZXNfd2l0aG91dF90aHJlYWRzKHNlbGYpOgorICAgICAgICAjIE5vdCBtdWNoIGhhcHBlbnMgaGVyZTogIHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCwgd2l0aCBhcnRpZmljaWFsCisgICAgICAgICMgInRocmVhZCBpZCIgMC4KKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKDAgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRbMF0gaXMgc3lzLl9nZXRmcmFtZSgpKQorCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmFwaV92ZXJzaW9uLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuYXJndiwgbGlzdCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RjbC5weSBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CmluZGV4IGUzZmJmOTguLmZhMTcwZWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGNsLnB5CkBAIC0xMzAsMTAgKzEzMCw4IEBACiAgICAgICAgIGltcG9ydCBvcwogICAgICAgICBvbGRfZGlzcGxheSA9IE5vbmUKICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBpZiAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpIG9yCi0gICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2RhcndpbicpIG9yCi0gICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2N5Z3dpbicpKToKLSAgICAgICAgICAgIHJldHVybiAjIG5vIGZhaWx1cmUgcG9zc2libGUgb24gd2luZG93cz8KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCd3aW4nLCAnZGFyd2luJywgJ2N5Z3dpbicpKToKKyAgICAgICAgICAgIHJldHVybiAgIyBubyBmYWlsdXJlIHBvc3NpYmxlIG9uIHdpbmRvd3M/CiAgICAgICAgIGlmICdESVNQTEFZJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgb2xkX2Rpc3BsYXkgPSBvcy5lbnZpcm9uWydESVNQTEFZJ10KICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWydESVNQTEFZJ10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkgYi9MaWIvdGVzdC90ZXN0X3RleHR3cmFwLnB5CmluZGV4IDY4ZTRkNmQuLjUwMGVjZWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZXh0d3JhcC5weQpAQCAtNDYwLDM4ICs0NjAsNDIgQEAKICMgb2YgSW5kZW50VGVzdENhc2UhCiBjbGFzcyBEZWRlbnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKKyAgICBkZWYgYXNzZXJ0VW5jaGFuZ2VkKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJhc3NlcnQgdGhhdCBkZWRlbnQoKSBoYXMgbm8gZWZmZWN0IG9uICd0ZXh0JyIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXh0LCBkZWRlbnQodGV4dCkpCisKICAgICBkZWYgdGVzdF9kZWRlbnRfbm9tYXJnaW4oc2VsZik6CiAgICAgICAgICMgTm8gbGluZXMgaW5kZW50ZWQuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5Ib3cgYXJlIHlvdT9cbk9oIGdvb2QsIEknbSBnbGFkLiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQogCiAgICAgICAgICMgU2ltaWxhciwgd2l0aCBhIGJsYW5rIGxpbmUuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5cbkJvbyEiCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKIAogICAgICAgICAjIFNvbWUgbGluZXMgaW5kZW50ZWQsIGJ1dCBvdmVyYWxsIG1hcmdpbiBpcyBzdGlsbCB6ZXJvLgogICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuICBUaGlzIGlzIGluZGVudGVkLiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQogCiAgICAgICAgICMgQWdhaW4sIGFkZCBhIGJsYW5rIGxpbmUuCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5cbiAgQm9vIVxuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCiAKICAgICBkZWYgdGVzdF9kZWRlbnRfZXZlbihzZWxmKToKICAgICAgICAgIyBBbGwgbGluZXMgaW5kZW50ZWQgYnkgdHdvIHNwYWNlcy4KICAgICAgICAgdGV4dCA9ICIgIEhlbGxvIHRoZXJlLlxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLiIKICAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuSG93IGFyZSB5YT9cbk9oIGdvb2QuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICAgICAgIyBTYW1lLCB3aXRoIGJsYW5rIGxpbmVzLgogICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG5cbiAgSG93IGFyZSB5YT9cbiAgT2ggZ29vZC5cbiIKICAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC5cbiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCiAgICAgICAgICMgTm93IGluZGVudCBvbmUgb2YgdGhlIGJsYW5rIGxpbmVzLgogICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG4gIFxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLlxuIgogICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLlxuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICBkZWYgdGVzdF9kZWRlbnRfdW5ldmVuKHNlbGYpOgogICAgICAgICAjIExpbmVzIGluZGVudGVkIHVuZXZlbmx5LgpAQCAtNTA1LDE4ICs1MDksNTMgQEAKICAgICB3aGlsZSAxOgogICAgICAgICByZXR1cm4gZm9vCiAnJycKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCiAgICAgICAgICMgVW5ldmVuIGluZGVudGF0aW9uIHdpdGggYSBibGFuayBsaW5lLgogICAgICAgICB0ZXh0ID0gIiAgRm9vXG4gICAgQmFyXG5cbiAgIEJhelxuIgogICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAogICAgICAgICAjIFVuZXZlbiBpbmRlbnRhdGlvbiB3aXRoIGEgd2hpdGVzcGFjZS1vbmx5IGxpbmUuCiAgICAgICAgIHRleHQgPSAiICBGb29cbiAgICBCYXJcbiBcbiAgIEJhelxuIgogICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAorICAgICMgZGVkZW50KCkgc2hvdWxkIG5vdCBtYW5nbGUgaW50ZXJuYWwgdGFicworICAgIGRlZiB0ZXN0X2RlZGVudF9wcmVzZXJ2ZV9pbnRlcm5hbF90YWJzKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiAgaGVsbG9cdHRoZXJlXG4gIGhvdyBhcmVcdHlvdT8iCisgICAgICAgIGV4cGVjdCA9ICJoZWxsb1x0dGhlcmVcbmhvdyBhcmVcdHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgaXQgcHJlc2VydmVzIHRhYnMgd2hlbiBpdCdzIG5vdCBtYWtpbmcgYW55CisgICAgICAgICMgY2hhbmdlcyBhdCBhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQoZXhwZWN0KSkKKworICAgICMgZGVkZW50KCkgc2hvdWxkIG5vdCBtYW5nbGUgdGFicyBpbiB0aGUgbWFyZ2luIChpLmUuCisgICAgIyB0YWJzIGFuZCBzcGFjZXMgYm90aCBjb3VudCBhcyBtYXJnaW4sIGJ1dCBhcmUgKm5vdCoKKyAgICAjIGNvbnNpZGVyZWQgZXF1aXZhbGVudCkKKyAgICBkZWYgdGVzdF9kZWRlbnRfcHJlc2VydmVfbWFyZ2luX3RhYnMoc2VsZik6CisgICAgICAgIHRleHQgPSAiICBoZWxsbyB0aGVyZVxuXHRob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCisKKyAgICAgICAgIyBzYW1lIGVmZmVjdCBldmVuIGlmIHdlIGhhdmUgOCBzcGFjZXMKKyAgICAgICAgdGV4dCA9ICIgICAgICAgIGhlbGxvIHRoZXJlXG5cdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIGRlZGVudCgpIG9ubHkgcmVtb3ZlcyB3aGl0ZXNwYWNlIHRoYXQgY2FuIGJlIHVuaWZvcm1seSByZW1vdmVkIQorICAgICAgICB0ZXh0ID0gIlx0aGVsbG8gdGhlcmVcblx0aG93IGFyZSB5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG8gdGhlcmVcbmhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0aGVsbG8gdGhlcmVcbiAgXHRob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgIHRleHQgPSAiICBcdCAgaGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0aGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgZXhwZWN0ID0gImhlbGxvIHRoZXJlXG4gIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWQucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQppbmRleCBlYTM0NWI2Li5jNGMyMWZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZC5weQpAQCAtMTE1LDMgKzExNSw0NiBAQAogICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHRhc2syLCAoaSwpKQogZG9uZS5hY3F1aXJlKCkKIHByaW50ICdhbGwgdGFza3MgZG9uZScKKworIyBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplCitwcmludCAnXG4qKiogQ2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUgKioqJworaWYgdGhyZWFkLnN0YWNrX3NpemUoKSAhPSAwOgorICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbml0aWFsIHN0YWNrX3NpemUgbm90IDAiCisKK3RocmVhZC5zdGFja19zaXplKDApCitpZiB0aHJlYWQuc3RhY2tfc2l6ZSgpICE9IDA6CisgICAgcmFpc2UgVmFsdWVFcnJvciwgInN0YWNrX3NpemUgbm90IHJlc2V0IHRvIGRlZmF1bHQiCisKK2Zyb20gb3MgaW1wb3J0IG5hbWUgYXMgb3NfbmFtZQoraWYgb3NfbmFtZSBpbiAoIm50IiwgIm9zMiIsICJwb3NpeCIpOgorCisgICAgdHNzX3N1cHBvcnRlZCA9IDEKKyAgICB0cnk6CisgICAgICAgIHRocmVhZC5zdGFja19zaXplKDQwOTYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50ICdjYXVnaHQgZXhwZWN0ZWQgVmFsdWVFcnJvciBzZXR0aW5nIHN0YWNrX3NpemUoNDA5NiknCisgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKKyAgICAgICAgdHNzX3N1cHBvcnRlZCA9IDAKKyAgICAgICAgcHJpbnQgJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnCisKKyAgICBpZiB0c3Nfc3VwcG9ydGVkOgorICAgICAgICBmYWlsZWQgPSBsYW1iZGEgcywgZTogcyAhPSBlCisgICAgICAgIGZhaWxfbXNnID0gInN0YWNrX3NpemUoJWQpIGZhaWxlZCAtIHNob3VsZCBzdWNjZWVkIgorICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwLCAwKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFja19zaXplKHRzcykKKyAgICAgICAgICAgIGlmIGZhaWxlZCh0aHJlYWQuc3RhY2tfc2l6ZSgpLCB0c3MpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIGZhaWxfbXNnICUgdHNzCisgICAgICAgICAgICBwcmludCAnc3VjY2Vzc2Z1bGx5IHNldCBzdGFja19zaXplKCVkKScgJSB0c3MKKworICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwKToKKyAgICAgICAgICAgIHByaW50ICd0cnlpbmcgc3RhY2tfc2l6ZSA9ICVkJyAlIHRzcworICAgICAgICAgICAgbmV4dF9pZGVudCA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG51bXRhc2tzKToKKyAgICAgICAgICAgICAgICBuZXd0YXNrKCkKKworICAgICAgICAgICAgcHJpbnQgJ3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZScKKyAgICAgICAgICAgIGRvbmUuYWNxdWlyZSgpCisgICAgICAgICAgICBwcmludCAnYWxsIHRhc2tzIGRvbmUnCisKKyAgICAgICAgIyByZXNldCBzdGFjayBzaXplIHRvIGRlZmF1bHQKKyAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKaW5kZXggMDY0MmQyNS4uNjAyYWQyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKQEAgLTMwLDExICszMCwxMCBAQAogICAgIGlmIHZlcmJvc2U6CiAgICAgICAgIHByaW50ICJ0ZXN0aW5nIGltcG9ydCBoYW5nZXJzIC4uLiIsCiAKLSAgICBmcm9tIHRlc3QgaW1wb3J0IHRocmVhZGVkX2ltcG9ydF9oYW5nZXJzCi0KKyAgICBpbXBvcnQgdGVzdC50aHJlYWRlZF9pbXBvcnRfaGFuZ2VycwogICAgIHRyeToKLSAgICAgICAgaWYgdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCh0aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnMpCisgICAgICAgIGlmIHRlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCh0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9ycykKICAgICAgICAgZWxpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIk9LLiIKICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5CmluZGV4IDQ1OWJhM2EuLjk3NDMzM2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkKQEAgLTIyLDcgKzIyLDcgQEAKIAogaW1wb3J0IHRocmVhZCAjIElmIHRoaXMgZmFpbHMsIHdlIGNhbid0IHRlc3QgdGhpcyBtb2R1bGUKIGltcG9ydCB0aHJlYWRpbmcKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIHRocmVhZGluZ19zZXR1cCwgdGhyZWFkaW5nX2NsZWFudXAKIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0cmFjZWJhY2sgaW1wb3J0IHByaW50X2V4YwogaW1wb3J0IHRlbXBmaWxlCkBAIC00OCw2ICs0OCw3IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0aHJlYWRzID0gW10KKyAgICB0aHJlYWRfaW5mbyA9IHRocmVhZGluZ19zZXR1cCgpCiAKICAgICBwcmludCAiQ3JlYXRpbmciCiAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1RIUkVBRFMpOgpAQCAtNzIsNiArNzMsNyBAQAogICAgIGlmIGVycm9yczoKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZChtc2cpCiAKKyAgICB0aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHN5cywgZ2V0b3B0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CmluZGV4IDdlYjk3NTguLjc5MzM1ZWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC04NSw2ICs4NSwzMiBAQAogICAgICAgICAgICAgcHJpbnQgJ2FsbCB0YXNrcyBkb25lJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bXJ1bm5pbmcuZ2V0KCksIDApCiAKKyAgICAjIHJ1biB3aXRoIGEgc21hbGwoaXNoKSB0aHJlYWQgc3RhY2sgc2l6ZSAoMjU2a0IpCisgICAgZGVmIHRlc3RfdmFyaW91c19vcHNfc21hbGxfc3RhY2soc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnd2l0aCAyNTZrQiB0aHJlYWQgc3RhY2sgc2l6ZS4uLicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMjYyMTQ0KQorICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlc3RfdmFyaW91c19vcHMoKQorICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgwKQorCisgICAgIyBydW4gd2l0aCBhIGxhcmdlIHRocmVhZCBzdGFjayBzaXplICgxTUIpCisgICAgZGVmIHRlc3RfdmFyaW91c19vcHNfbGFyZ2Vfc3RhY2soc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnd2l0aCAxTUIgdGhyZWFkIHN0YWNrIHNpemUuLi4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDB4MTAwMDAwKQorICAgICAgICBleGNlcHQgdGhyZWFkLmVycm9yOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlc3RfdmFyaW91c19vcHMoKQorICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgwKQorCiAgICAgZGVmIHRlc3RfZm9yZWlnbl90aHJlYWQoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBhICJmb3JlaWduIiB0aHJlYWQgY2FuIHVzZSB0aGUgdGhyZWFkaW5nIG1vZHVsZS4KICAgICAgICAgZGVmIGYobXV0ZXgpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CmluZGV4IDc2OGU3YTAuLmY0YmU3NTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKQEAgLTM5LDkgKzM5LDkgQEAKIAogICAgIGRlZiB0ZXN0X3N0cmZ0aW1lX2JvdW5kc19jaGVja2luZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBzdHJmdGltZSgpIGNoZWNrcyB0aGUgYm91bmRzIG9mIHRoZSB2YXJpb3VzIHBhcnRzCi0gICAgICAgICNvZiB0aGUgdGltZSB0dXBsZS4KKyAgICAgICAgI29mIHRoZSB0aW1lIHR1cGxlICgwIGlzIHZhbGlkIGZvciAqYWxsKiB2YWx1ZXMpLgogCi0gICAgICAgICMgQ2hlY2sgeWVhcgorICAgICAgICAjIENoZWNrIHllYXIgWzE5MDAsIG1heChpbnQpXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTg5OSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQogICAgICAgICBpZiB0aW1lLmFjY2VwdDJkeWVhcjoKQEAgLTQ5LDI3ICs0OSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgbW9udGgKKyAgICAgICAgIyBDaGVjayBtb250aCBbMSwgMTJdICsgemVybyBzdXBwb3J0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIC0xLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxMywgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGRheSBvZiBtb250aAorICAgICAgICAjIENoZWNrIGRheSBvZiBtb250aCBbMSwgMzFdICsgemVybyBzdXBwb3J0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIC0xLCAwLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAzMiwgMCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGhvdXIKKyAgICAgICAgIyBDaGVjayBob3VyIFswLCAyM10KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIC0xLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAyNCwgMCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIG1pbnV0ZQorICAgICAgICAjIENoZWNrIG1pbnV0ZSBbMCwgNTldCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAtMSwgMCwgMCwgMSwgLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgNjAsIDAsIDAsIDEsIC0xKSkKLSAgICAgICAgIyBDaGVjayBzZWNvbmQKKyAgICAgICAgIyBDaGVjayBzZWNvbmQgWzAsIDYxXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgLTEsIDAsIDEsIC0xKSkKICAgICAgICAgIyBDOTkgb25seSByZXF1aXJlcyBhbGxvd2luZyBmb3Igb25lIGxlYXAgc2Vjb25kLCBidXQgUHl0aG9uJ3MgZG9jcyBzYXkKQEAgLTgyLDE3ICs4MiwyNSBAQAogICAgICAgICAjICBtb2R1bG8uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAtMiwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIGRheSBvZiB0aGUgeWVhcgorICAgICAgICAjIENoZWNrIGRheSBvZiB0aGUgeWVhciBbMSwgMzY2XSArIHplcm8gc3VwcG9ydAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAtMSwgLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMzY3LCAtMSkpCi0gICAgICAgICMgQ2hlY2sgZGF5bGlnaHQgc2F2aW5ncyBmbGFnCisgICAgICAgICMgQ2hlY2sgZGF5bGlnaHQgc2F2aW5ncyBmbGFnIFstMSwgMV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0yKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDIpKQogCisgICAgZGVmIHRlc3RfZGVmYXVsdF92YWx1ZXNfZm9yX3plcm8oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdXNpbmcgYWxsIHplcm9zIHVzZXMgdGhlIHByb3BlciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIyBObyB0ZXN0IGZvciBkYXlsaWdodCBzYXZpbmdzIHNpbmNlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY2hhbmdlIG91dHB1dAorICAgICAgICAjIGJhc2VkIG9uIGl0cyB2YWx1ZS4KKyAgICAgICAgZXhwZWN0ZWQgPSAiMjAwMCAwMSAwMSAwMCAwMCAwMCAxIDAwMSIKKyAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZSgiJVkgJW0gJWQgJUggJU0gJVMgJXcgJWoiLCAoMCwpKjkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpCisKICAgICBkZWYgdGVzdF9zdHJwdGltZShzZWxmKToKICAgICAgICAgdHQgPSB0aW1lLmdtdGltZShzZWxmLnQpCiAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLApAQCAtMTkzLDEzICsyMDEsMTcgQEAKICAgICAgICAgdGltZS5jdGltZShOb25lKQogCiAgICAgZGVmIHRlc3RfZ210aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgotICAgICAgICB0MCA9IHRpbWUubWt0aW1lKHRpbWUuZ210aW1lKCkpCi0gICAgICAgIHQxID0gdGltZS5ta3RpbWUodGltZS5nbXRpbWUoTm9uZSkpCisgICAgICAgIGd0MCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgZ3QxID0gdGltZS5nbXRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShndDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUoZ3QxKQogICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQogCiAgICAgZGVmIHRlc3RfbG9jYWx0aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgotICAgICAgICB0MCA9IHRpbWUubWt0aW1lKHRpbWUubG9jYWx0aW1lKCkpCi0gICAgICAgIHQxID0gdGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoTm9uZSkpCisgICAgICAgIGx0MCA9IHRpbWUubG9jYWx0aW1lKCkKKyAgICAgICAgbHQxID0gdGltZS5sb2NhbHRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShsdDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUobHQxKQogICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKaW5kZXggNDMwOWU4Yy4uMmIzMmI5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQpAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgnd3d3LnB5dGhvbi5vcmcnLCA4MCkKKyAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgnd3d3LnB5dGhvbi5vcmcuJywgODApCiAgICAgICAgIHNlbGYuYWRkcl9sb2NhbCAgPSAoJzEyNy4wLjAuMScsIDI1MzM5KQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKaW5kZXggNGY5NDZmNy4uMDhhZWM4ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CkBAIC0yNDQsOCArMjQ0LDggQEAKICAgICAgICAgc2VsZi5ydW5fdGVzdChvbmVfaW5zdHJfbGluZSkKICAgICBkZWYgdGVzdF8wNF9ub19wb3BfYmxvY2tzKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF9ibG9ja3MpCi0jIyAgICBkZWYgdGVzdF8wNV9ub19wb3BfdG9wcyhzZWxmKToKLSMjICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQorICAgIGRlZiB0ZXN0XzA1X25vX3BvcF90b3BzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQogICAgIGRlZiB0ZXN0XzA2X2NhbGwoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3QoY2FsbCkKICAgICBkZWYgdGVzdF8wN19yYWlzZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggMWI1OWY5OC4uYjNjNWE1MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTMxLDggKzMxLDkgQEAKICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQogICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pICMgdGhpcmQgbGluZSBoYXMgY2FyZXQKICAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJyZXR1cm4geCEiKQorICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAorICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIiEiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQogCiAgICAgZGVmIHRlc3Rfbm9jYXJldChzZWxmKToKICAgICAgICAgaWYgaXNfanl0aG9uOgpAQCAtNDcsOCArNDgsOSBAQAogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRhdGlvbkVycm9yKQogICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uc3RyaXAoKSA9PSAicHJpbnQgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKQorICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLmZpbmQoIjIiKSA9PSBlcnJbMl0uZmluZCgiXiIpKQogCiAgICAgZGVmIHRlc3RfYnVnNzM3NDczKHNlbGYpOgogICAgICAgICBpbXBvcnQgc3lzLCBvcywgdGVtcGZpbGUsIHRpbWUKQEAgLTEwOSw2ICsxMTEsNDUgQEAKICAgICAgICAgbHN0ID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShlLl9fY2xhc3NfXywgZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFsnS2V5Ym9hcmRJbnRlcnJ1cHRcbiddKQogCisgICAgIyBTdHJpbmcgZXhjZXB0aW9ucyBhcmUgZGVwcmVjYXRlZCwgYnV0IGxlZ2FsLiAgVGhlIHF1aXJreSBmb3JtIHdpdGgKKyAgICAjIHNlcGFyYXRlICJ0eXBlIiBhbmQgInZhbHVlIiB0ZW5kcyB0byBicmVhayB0aGluZ3MsIGJlY2F1c2UKKyAgICAjICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZSkKKyAgICAjIGFuZCBhIHN0cmluZyBjYW5ub3QgYmUgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGlzc3ViY2xhc3MuCisgICAgIworICAgICMgTm90ZSB0aGF0IHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlIGRvIG5vdCBnZXQgc2V0IGlmIGFuCisgICAgIyBleGNlcHRpb24gaXMgY2F1Z2h0LCBzbyB3ZSBzb3J0IG9mIGNoZWF0IGFuZCBqdXN0IGVtdWxhdGUgdGhlbS4KKyAgICAjCisgICAgIyB0ZXN0X3N0cmluZ19leGNlcHRpb24xIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAjCisgICAgIyA+Pj4gcmFpc2UgIlN0cmluZyBFeGNlcHRpb24iCisgICAgIworICAgICMgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMiBpcyBlcXVpdmFsZW50IHRvCisgICAgIworICAgICMgPj4+IHJhaXNlICJTdHJpbmcgRXhjZXB0aW9uIiwgIlN0cmluZyBWYWx1ZSIKKyAgICAjCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4Y2VwdGlvbjEoc2VsZik6CisgICAgICAgIHN0cl90eXBlID0gIlN0cmluZyBFeGNlcHRpb24iCisgICAgICAgIGVyciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoc3RyX3R5cGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBzdHJfdHlwZSArICdcbicpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMihzZWxmKToKKyAgICAgICAgc3RyX3R5cGUgPSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAgICAgc3RyX3ZhbHVlID0gIlN0cmluZyBWYWx1ZSIKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShzdHJfdHlwZSwgc3RyX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyclswXSwgc3RyX3R5cGUgKyAnOiAnICsgc3RyX3ZhbHVlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9leGNlcHRpb25fb25seV9iYWRfX3N0cl9fKHNlbGYpOgorICAgICAgICBjbGFzcyBYKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShYLCBYKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHN0cl92YWx1ZSA9ICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSBYLl9fbmFtZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBYLl9fbmFtZV9fICsgJzogJyArIHN0cl92YWx1ZSArICdcbicpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUcmFjZWJhY2tDYXNlcykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKaW5kZXggYzU3NWMwYy4uMmQyOTljMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CkBAIC0yMzMsNiArMjMzLDcgQEAKIHRyeTogYnVmZmVyKCdhc2RmJywgLTEpCiBleGNlcHQgVmFsdWVFcnJvcjogcGFzcwogZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlcignYXNkZicsIC0xKSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvciIKK2NtcChidWZmZXIoImFiYyIpLCBidWZmZXIoImRlZiIpKSAjIHVzZWQgdG8gcmFpc2UgYSB3YXJuaW5nOiB0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEsIDAsIG9yIDEKIAogdHJ5OiBidWZmZXIoTm9uZSkKIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKQEAgLTI3NiwzICsyNzcsMTAgQEAKIHRyeTogYVswOjFdID0gJ2cnCiBleGNlcHQgVHlwZUVycm9yOiBwYXNzCiBlbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyIHNsaWNlIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIKKworIyBhcnJheS5hcnJheSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGEgY2hhciBidWZmZXIsCisjIHNvbWV0aGluZyB3aGljaCBpbnQoKSB1c2VzIGZvciBjb252ZXJzaW9uLgoraW1wb3J0IGFycmF5Cit0cnk6IGludChidWZmZXIoYXJyYXkuYXJyYXkoJ2MnKSkpCitleGNlcHQgVHlwZUVycm9yIDpwYXNzCitlbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiY2hhciBidWZmZXIgKGF0IEMgbGV2ZWwpIG5vdCB3b3JraW5nIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IDAzNGI5ZDAuLjY3MjE4YjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTY3NiwxMSArNjc2LDExIEBACiAgICAgICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQogICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCiAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6ICAjIEdFVAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC1sZW5ndGgiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LXR5cGUiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LUxlbmd0aCIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtVHlwZSIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKICAgICAgICAgICAgIGVsc2U6ICAjIFBPU1QKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1sZW5ndGgiXSwgIjAiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1MZW5ndGgiXSwgIjAiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LVR5cGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCiAgICAgICAgICAgICAjIFhYWCB0aGUgZGV0YWlscyBvZiBIb3N0IGNvdWxkIGJlIGJldHRlciB0ZXN0ZWQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sICJleGFtcGxlLmNvbSIpCkBAIC02OTIsOCArNjkyLDggQEAKICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiSG9zdCIsICJiYXoiKQogICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgImZvbyIpCiAgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LWxlbmd0aCJdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1MZW5ndGgiXSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1UeXBlIl0sICJiYXIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwgImJheiIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siU3BhbSJdLCAiZm9vIikKIApAQCAtODQ3LDcgKzg0Nyw3IEBACiAgICAgICAgICAgICA0MDcsICdQcm94eS1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGF1dGhfaGFuZGxlcikKICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKLSAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiUHJveHktYXV0aG9yaXphdGlvbiIsCisgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGF1dGhfaGFuZGxlciwgIlByb3h5LUF1dGhvcml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbTozMTI4L3Byb3RlY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJveHkuZXhhbXBsZS5jb206MzEyOCIsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKaW5kZXggZGMzZDM2ZC4uMDBjZjIwMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vd3d3LnNhZGZsa2pzYXNhZGYuY29tLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLmludmFsaWQvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC4vIikKIAogCiBjbGFzcyBPdGhlck5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xNjAsOCArMTYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybGxpYjIkIikKICAgICAgICAgdXJscyA9IFsKICAgICAgICAgICAgICMgVGhhbmtzIHRvIEZyZWQgZm9yIGZpbmRpbmcgdGhlc2UhCi0gICAgICAgICAgICAnZ29waGVyOi8vZ29waGVyLmxpYi5uY3N1LmVkdS8xMS9saWJyYXJ5L3N0YWNrcy9BbGV4JywKLSAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIudnQuZWR1OjEwMDEwLzEwLzMzJywKKyAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIubGliLm5jc3UuZWR1Li8xMS9saWJyYXJ5L3N0YWNrcy9BbGV4JywKKyAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIudnQuZWR1LjoxMDAxMC8xMC8zMycsCiAgICAgICAgICAgICBdCiAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQogCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogICAgICAgICAgICAgICAgICMgWFhYIGJ1Zywgc2hvdWxkIHJhaXNlIFVSTEVycm9yCiAgICAgICAgICAgICAgICAgIygnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgdXJsbGliMi5VUkxFcnJvcikKLSAgICAgICAgICAgICAgICAoJ2ZpbGU6Ly9ub25zZW5zZW5hbWUvZXRjL3Bhc3N3ZCcsIE5vbmUsIChPU0Vycm9yLCBzb2NrZXQuZXJyb3IpKQorICAgICAgICAgICAgICAgICgnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgKEVudmlyb25tZW50RXJyb3IsIHNvY2tldC5lcnJvcikpCiAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0yMzksNyArMjM5LDkgQEAKICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgc29ja2V0LmVycm9yLCBPU0Vycm9yKSwgZXJyOgogICAgICAgICAgICAgICAgIGRlYnVnKGVycikKICAgICAgICAgICAgICAgICBpZiBleHBlY3RlZF9lcnI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGVyciwgZXhwZWN0ZWRfZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gKCJEaWRuJ3QgZ2V0IGV4cGVjdGVkIGVycm9yKHMpICVzIGZvciAlcyAlcywgZ290ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfZXJyLCB1cmwsIHJlcSwgZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpLCBtc2cpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGJ1ZiA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCkBAIC0yNTksNyArMjYxLDYgQEAKICAgICAgICAgcmV0dXJuIGhhbmRsZXJzCiAKIAotCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVSTFRpbWVvdXRUZXN0LCB1cmxvcGVuTmV0d29ya1Rlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQppbmRleCA4MDc2MWRmLi45MTA1YWZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly93d3cuc2FkZmxranNhc2FkZi5jb20vIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5pbnZhbGlkLyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC4vIikKIAogY2xhc3MgdXJscmV0cmlldmVOZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3RzIHVybGxpYi51cmxyZXRyaWV2ZSB1c2luZyB0aGUgbmV0d29yay4iIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXVpZC5weSBiL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF91dWlkLnB5CkBAIC0wLDAgKzEsNDM0IEBACitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1dWlkCisKK2RlZiBpbXBvcnRhYmxlKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIFRlc3RVVUlEKFRlc3RDYXNlKToKKyAgICBsYXN0X25vZGUgPSBOb25lCisgICAgc291cmNlMm5vZGUgPSB7fQorCisgICAgZGVmIHRlc3RfVVVJRChzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGFzY2VuZGluZyA9IFtdCisgICAgICAgIGZvciAoc3RyaW5nLCBjdXJseSwgaGV4LCBieXRlcywgZmllbGRzLCBpbnRlZ2VyLCB1cm4sCisgICAgICAgICAgICAgdGltZSwgY2xvY2tfc2VxLCB2YXJpYW50LCB2ZXJzaW9uKSBpbiBbCisgICAgICAgICAgICAoJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgJ3swMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB9JywKKyAgICAgICAgICAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLAorICAgICAgICAgICAgICdcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCcsCisgICAgICAgICAgICAgKDAsIDAsIDAsIDAsIDAsIDApLAorICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgMCwgMCwgdXVpZC5SRVNFUlZFRF9OQ1MsIE5vbmUpLAorICAgICAgICAgICAgKCcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgICd7MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmfScsCisgICAgICAgICAgICAgJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAnXDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG5ceDBiXHgwY1x4MGRceDBlXHgwZicsCisgICAgICAgICAgICAgKDB4MDAwMTAyMDNMLCAweDA0MDUsIDB4MDYwNywgOCwgOSwgMHgwYTBiMGMwZDBlMGZMKSwKKyAgICAgICAgICAgICAweDAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAweDYwNzA0MDUwMDAxMDIwM0wsIDB4ODA5LCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgJ3swMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2R9JywKKyAgICAgICAgICAgICAnMDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgICdceDAyXHhkOVx4ZTZceGQ1XHg5NFx4NjdceDM4XHgyZVx4OGZceDliXHg5M1x4MDBceGE2XHg0YVx4YzNceGNkJywKKyAgICAgICAgICAgICAoMHgwMmQ5ZTZkNUwsIDB4OTQ2NywgMHgzODJlLCAweDhmLCAweDliLCAweDkzMDBhNjRhYzNjZEwpLAorICAgICAgICAgICAgIDB4MDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2RMLAorICAgICAgICAgICAgICd1cm46dXVpZDowMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgIDB4ODJlOTQ2NzAyZDllNmQ1TCwgMHhmOWIsIHV1aWQuUkZDXzQxMjIsIDMpLAorICAgICAgICAgICAgKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgICd7MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4fScsCisgICAgICAgICAgICAgJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4JywKKyAgICAgICAgICAgICAnXHgxMlx4MzRceDU2XHg3OCcqNCwKKyAgICAgICAgICAgICAoMHgxMjM0NTY3OCwgMHgxMjM0LCAweDU2NzgsIDB4MTIsIDB4MzQsIDB4NTY3ODEyMzQ1Njc4KSwKKyAgICAgICAgICAgICAweDEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4LAorICAgICAgICAgICAgICd1cm46dXVpZDoxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgIDB4Njc4MTIzNDEyMzQ1Njc4TCwgMHgxMjM0LCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTA5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDEwXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTA5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODEwTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDExXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMUwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODExTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTI5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDEyXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMkwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTI5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODEyTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTQ5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDE0XHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxNEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTQ5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODE0TCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgJ3s3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDJ9JywKKyAgICAgICAgICAgICAnN2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgICdceDdkXHg0NFx4NDhceDQwXHg5ZFx4YzBceDExXHhkMVx4YjJceDQ1XHg1Zlx4ZmRceGNlXHg3NFx4ZmFceGQyJywKKyAgICAgICAgICAgICAoMHg3ZDQ0NDg0MEwsIDB4OWRjMCwgMHgxMWQxLCAweGIyLCAweDQ1LCAweDVmZmRjZTc0ZmFkMkwpLAorICAgICAgICAgICAgIDB4N2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDJMLAorICAgICAgICAgICAgICd1cm46dXVpZDo3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgIDB4MWQxOWRjMDdkNDQ0ODQwTCwgMHgzMjQ1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAne2U5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5Zn0nLAorICAgICAgICAgICAgICdlOTAyODkzYTlkMjIzYzdlYTdiOGQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgJ1x4ZTlceDAyXHg4OVx4M2FceDlkXHgyMlx4M2NceDdlXHhhN1x4YjhceGQ2XHhlM1x4MTNceGI3XHgxZFx4OWYnLAorICAgICAgICAgICAgICgweGU5MDI4OTNhTCwgMHg5ZDIyLCAweDNjN2UsIDB4YTcsIDB4YjgsIDB4ZDZlMzEzYjcxZDlmTCksCisgICAgICAgICAgICAgMHhlOTAyODkzYTlkMjIzYzdlYTdiOGQ2ZTMxM2I3MWQ5ZkwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOmU5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgMHhjN2U5ZDIyZTkwMjg5M2FMLCAweDI3YjgsIHV1aWQuUkZDXzQxMjIsIDMpLAorICAgICAgICAgICAgKCdlYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgICd7ZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmfScsCisgICAgICAgICAgICAgJ2ViNDI0MDI2NmY1NDRlZjhhNGQwYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAnXHhlYlx4NDJceDQwXHgyNlx4NmZceDU0XHg0ZVx4ZjhceGE0XHhkMFx4YmJceDY1XHg4YVx4MWZceGM2XHhjZicsCisgICAgICAgICAgICAgKDB4ZWI0MjQwMjZMLCAweDZmNTQsIDB4NGVmOCwgMHhhNCwgMHhkMCwgMHhiYjY1OGExZmM2Y2ZMKSwKKyAgICAgICAgICAgICAweGViNDI0MDI2NmY1NDRlZjhhNGQwYmI2NThhMWZjNmNmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAweGVmODZmNTRlYjQyNDAyNkwsIDB4MjRkMCwgdXVpZC5SRkNfNDEyMiwgNCksCisgICAgICAgICAgICAoJ2Y4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgJ3tmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjZ9JywKKyAgICAgICAgICAgICAnZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgICdceGY4XHgxZFx4NGZceGFlXHg3ZFx4ZWNceDExXHhkMFx4YTdceDY1XHgwMFx4YTBceGM5XHgxZVx4NmJceGY2JywKKyAgICAgICAgICAgICAoMHhmODFkNGZhZUwsIDB4N2RlYywgMHgxMWQwLCAweGE3LCAweDY1LCAweDAwYTBjOTFlNmJmNkwpLAorICAgICAgICAgICAgIDB4ZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjZMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgIDB4MWQwN2RlY2Y4MWQ0ZmFlTCwgMHgyNzY1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAne2ZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYX0nLAorICAgICAgICAgICAgICdmZmZlZmRmY2ZmZmVmZmZlZmZmZWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgJ1x4ZmZceGZlXHhmZFx4ZmNceGZmXHhmZVx4ZmZceGZlXHhmZlx4ZmVceGZmXHhmZVx4ZmRceGZjXHhmYlx4ZmEnLAorICAgICAgICAgICAgICgweGZmZmVmZGZjTCwgMHhmZmZlLCAweGZmZmUsIDB4ZmYsIDB4ZmUsIDB4ZmZmZWZkZmNmYmZhTCksCisgICAgICAgICAgICAgMHhmZmZlZmRmY2ZmZmVmZmZlZmZmZWZmZmVmZGZjZmJmYUwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOmZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgMHhmZmVmZmZlZmZmZWZkZmNMLCAweDNmZmUsIHV1aWQuUkVTRVJWRURfRlVUVVJFLCBOb25lKSwKKyAgICAgICAgICAgICgnZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAne2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZn0nLAorICAgICAgICAgICAgICdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicsCisgICAgICAgICAgICAgJ1x4ZmYnKjE2LAorICAgICAgICAgICAgICgweGZmZmZmZmZmTCwgMHhmZmZmTCwgMHhmZmZmTCwgMHhmZiwgMHhmZiwgMHhmZmZmZmZmZmZmZmZMKSwKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZiwgdXVpZC5SRVNFUlZFRF9GVVRVUkUsIE5vbmUpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWl2YWxlbnRzID0gW10KKyAgICAgICAgICAgICMgQ29uc3RydWN0IGVhY2ggVVVJRCBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzLgorICAgICAgICAgICAgZm9yIHUgaW4gW3V1aWQuVVVJRChzdHJpbmcpLCB1dWlkLlVVSUQoY3VybHkpLCB1dWlkLlVVSUQoaGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICB1dWlkLlVVSUQoYnl0ZXM9Ynl0ZXMpLCB1dWlkLlVVSUQoZmllbGRzPWZpZWxkcyksCisgICAgICAgICAgICAgICAgICAgICAgdXVpZC5VVUlEKGludD1pbnRlZ2VyKSwgdXVpZC5VVUlEKHVybildOgorICAgICAgICAgICAgICAgICMgVGVzdCBhbGwgY29udmVyc2lvbnMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIFVVSUQgb2JqZWN0LgorICAgICAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgc3RyaW5nKQorICAgICAgICAgICAgICAgIGVxdWFsKGludCh1KSwgaW50ZWdlcikKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmJ5dGVzLCBieXRlcykKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmZpZWxkcywgZmllbGRzKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZV9sb3csIGZpZWxkc1swXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWVfbWlkLCBmaWVsZHNbMV0pCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lX2hpX3ZlcnNpb24sIGZpZWxkc1syXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcV9oaV92YXJpYW50LCBmaWVsZHNbM10pCisgICAgICAgICAgICAgICAgZXF1YWwodS5jbG9ja19zZXFfbG93LCBmaWVsZHNbNF0pCisgICAgICAgICAgICAgICAgZXF1YWwodS5ub2RlLCBmaWVsZHNbNV0pCisgICAgICAgICAgICAgICAgZXF1YWwodS5oZXgsIGhleCkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmludCwgaW50ZWdlcikKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnVybiwgdXJuKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZSwgdGltZSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcSwgY2xvY2tfc2VxKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdmFyaWFudCkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIHZlcnNpb24pCisgICAgICAgICAgICAgICAgZXF1aXZhbGVudHMuYXBwZW5kKHUpCisKKyAgICAgICAgICAgICMgRGlmZmVyZW50IGNvbnN0cnVjdGlvbiBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIFVVSUQuCisgICAgICAgICAgICBmb3IgdSBpbiBlcXVpdmFsZW50czoKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiBlcXVpdmFsZW50czoKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwodSwgdikKKyAgICAgICAgICAgIGFzY2VuZGluZy5hcHBlbmQodSkKKworICAgICAgICAjIFRlc3QgY29tcGFyaXNvbiBvZiBVVUlEcy4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFzY2VuZGluZykpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKGFzY2VuZGluZykpOgorICAgICAgICAgICAgICAgIGVxdWFsKGNtcChpLCBqKSwgY21wKGFzY2VuZGluZ1tpXSwgYXNjZW5kaW5nW2pdKSkKKworICAgICAgICAjIFRlc3Qgc29ydGluZyBvZiBVVUlEcyAoYWJvdmUgbGlzdCBpcyBpbiBhc2NlbmRpbmcgb3JkZXIpLgorICAgICAgICByZXNvcnRlZCA9IGFzY2VuZGluZ1s6XQorICAgICAgICByZXNvcnRlZC5yZXZlcnNlKCkKKyAgICAgICAgcmVzb3J0ZWQuc29ydCgpCisgICAgICAgIGVxdWFsKGFzY2VuZGluZywgcmVzb3J0ZWQpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICBiYWR2YWx1ZSA9IGxhbWJkYSBmOiBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmKQorICAgICAgICBiYWR0eXBlID0gbGFtYmRhIGY6IHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZikKKworICAgICAgICAjIEJhZGx5IGZvcm1lZCBoZXggc3RyaW5ncy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnYWJjJykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3JykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODknKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OHoyMzQ1Njc4JykpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgYnl0ZXMuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPSdhYmMnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J1wwJyoxNSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPSdcMCcqMTcpKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGZpZWxkcy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsIDIsIDMsIDQsIDUpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCAyLCAzLCA0LCA1LCA2LCA3KSkpCisKKyAgICAgICAgIyBGaWVsZCB2YWx1ZXMgb3V0IG9mIHJhbmdlLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KC0xLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMHgxMDAwMDAwMDBMLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgLTEsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAweDEwMDAwTCwgMCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIC0xLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMHgxMDAwMEwsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAtMSwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDB4MTAwTCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDAsIC0xLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMHgxMDBMLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMCwgLTEpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAwLCAweDEwMDAwMDAwMDAwMDBMKSkpCisKKyAgICAgICAgIyBWZXJzaW9uIG51bWJlciBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249MCkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249NikpCisKKyAgICAgICAgIyBJbnRlZ2VyIHZhbHVlIG91dCBvZiByYW5nZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PS0xKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PTE8PDEyOEwpKQorCisgICAgICAgICMgTXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgaGV4LCBieXRlcywgZmllbGRzLCBpbnQuCisgICAgICAgIGgsIGIsIGYsIGkgPSAnMDAnKjE2LCAnXDAnKjE2LCAoMCwgMCwgMCwgMCwgMCwgMCksIDAKKyAgICAgICAgdXVpZC5VVUlEKGgpCisgICAgICAgIHV1aWQuVVVJRChoZXg9aCkKKyAgICAgICAgdXVpZC5VVUlEKGJ5dGVzPWIpCisgICAgICAgIHV1aWQuVVVJRChmaWVsZHM9ZikKKyAgICAgICAgdXVpZC5VVUlEKGludD1pKQorCisgICAgICAgICMgV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAocG9zaXRpb25hbCkuCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBmKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBmLCBpKSkKKworICAgICAgICAjIER1cGxpY2F0ZSBhcmd1bWVudHMgKG5hbWVkKS4KKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaGV4PWgsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPWIsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaGV4PWgsIGZpZWxkcz1mLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKworICAgICAgICAjIER1cGxpY2F0ZSBhcmd1bWVudHMgKHBvc2l0aW9uYWwgYW5kIG5hbWVkKS4KKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaGV4PWgsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGJ5dGVzPWIsIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBieXRlcz1iLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaGV4PWgsIGZpZWxkcz1mLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgYnl0ZXM9YiwgaW50PWksIGZpZWxkcz1mKSkKKworICAgICAgICAjIEltbXV0YWJpbGl0eS4KKyAgICAgICAgdSA9IHV1aWQuVVVJRChoKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnaGV4JywgaCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdieXRlcycsIGIpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnZmllbGRzJywgZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdpbnQnLCBpKSkKKworICAgIGRlZiBjaGVja19ub2RlKHNlbGYsIG5vZGUsIHNvdXJjZSk6CisgICAgICAgIGluZGl2aWR1YWxfZ3JvdXBfYml0ID0gKG5vZGUgPj4gNDBMKSAmIDEKKyAgICAgICAgdW5pdmVyc2FsX2xvY2FsX2JpdCA9IChub2RlID4+IDQwTCkgJiAyCisgICAgICAgIG1lc3NhZ2UgPSAiJTAxMnggZG9lc24ndCBsb29rIGxpa2UgYSByZWFsIE1BQyBhZGRyZXNzIiAlIG5vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRpdmlkdWFsX2dyb3VwX2JpdCwgMCwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml2ZXJzYWxfbG9jYWxfYml0LCAwLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5vZGUsIDAsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobm9kZSwgMHhmZmZmZmZmZmZmZmZMLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSBub2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8obm9kZSA8ICgxTCA8PCA0OCksIG1lc3NhZ2UpCisKKyAgICAgICAgVGVzdFVVSUQuc291cmNlMm5vZGVbc291cmNlXSA9IG5vZGUKKyAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlOgorICAgICAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlICE9IG5vZGU6CisgICAgICAgICAgICAgICAgbXNnID0gImRpZmZlcmVudCBzb3VyY2VzIGRpc2FncmVlIG9uIG5vZGU6XG4iCisgICAgICAgICAgICAgICAgZm9yIHMsIG4gaW4gVGVzdFVVSUQuc291cmNlMm5vZGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICAgIGZyb20gc291cmNlICVyLCBub2RlIHdhcyAlMDEyeFxuIiAlIChzLCBuKQorICAgICAgICAgICAgICAgICMgVGhlcmUncyBhY3R1YWxseSBubyByZWFzb24gdG8gZXhwZWN0IHRoZSBNQUMgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgIyB0byBhZ3JlZSBhY3Jvc3MgdmFyaW91cyBtZXRob2RzIC0tIGUuZy4sIGEgYm94IG1heSBoYXZlCisgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMsIGFuZCBkaWZmZXJlbnQgd2F5cyBvZiBnZXR0aW5nCisgICAgICAgICAgICAgICAgIyBhIE1BQyBhZGRyZXNzIG1heSBmYXZvciBkaWZmZXJlbnQgSFcuCisgICAgICAgICAgICAgICAgIyNzZWxmLmZhaWwobXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVGVzdFVVSUQubGFzdF9ub2RlID0gbm9kZQorCisgICAgZGVmIHRlc3RfaWZjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisiIiIgICAgV0FSTklORzogdXVpZC5faWZjb25maWdfZ2V0bm9kZSBpcyB1bnJlbGlhYmxlIG9uIG1hbnkgcGxhdGZvcm1zLgorICAgICAgICBJdCBpcyBkaXNhYmxlZCB1bnRpbCB0aGUgY29kZSBhbmQvb3IgdGVzdCBjYW4gYmUgZml4ZWQgcHJvcGVybHkuIiIiCisgICAgICAgIHJldHVybgorCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBub2RlID0gdXVpZC5faWZjb25maWdfZ2V0bm9kZSgpCisgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaWZjb25maWcnKQorCisgICAgZGVmIHRlc3RfaXBjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIG5vZGUgPSB1dWlkLl9pcGNvbmZpZ19nZXRub2RlKCkKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUsICdpcGNvbmZpZycpCisKKyAgICBkZWYgdGVzdF9uZXRiaW9zX2dldG5vZGUoc2VsZik6CisgICAgICAgIGlmIGltcG9ydGFibGUoJ3dpbjMyd25ldCcpIGFuZCBpbXBvcnRhYmxlKCduZXRiaW9zJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fbmV0Ymlvc19nZXRub2RlKCksICduZXRiaW9zJykKKworICAgIGRlZiB0ZXN0X3JhbmRvbV9nZXRub2RlKHNlbGYpOgorICAgICAgICBub2RlID0gdXVpZC5fcmFuZG9tX2dldG5vZGUoKQorICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSBub2RlKQorICAgICAgICBzZWxmLmFzc2VydF8obm9kZSA8ICgxTCA8PDQ4KSkKKworICAgIGRlZiB0ZXN0X3VuaXhkbGxfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisiIiIgICAgV0FSTklORzogdXVpZC5fdW5peGRsbF9nZXRub2RlIGlzIHVucmVsaWFibGUgb24gbWFueSBwbGF0Zm9ybXMuCisgICAgICAgIEl0IGlzIGRpc2FibGVkIHVudGlsIHRoZSBjb2RlIGFuZC9vciB0ZXN0IGNhbiBiZSBmaXhlZCBwcm9wZXJseS4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIGltcG9ydGFibGUoJ2N0eXBlcycpIGFuZCBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fdW5peGRsbF9nZXRub2RlKCksICd1bml4ZGxsJykKKworICAgIGRlZiB0ZXN0X3dpbmRsbF9nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnY3R5cGVzJykgYW5kIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZSh1dWlkLl93aW5kbGxfZ2V0bm9kZSgpLCAnd2luZGxsJykKKworICAgIGRlZiB0ZXN0X2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAorIiIiICAgIFdBUk5JTkc6IHV1aWQuZ2V0bm9kZSBpcyB1bnJlbGlhYmxlIG9uIG1hbnkgcGxhdGZvcm1zLgorICAgICAgICBJdCBpcyBkaXNhYmxlZCB1bnRpbCB0aGUgY29kZSBhbmQvb3IgdGVzdCBjYW4gYmUgZml4ZWQgcHJvcGVybHkuIiIiCisgICAgICAgIHJldHVybgorCisgICAgICAgIG5vZGUxID0gdXVpZC5nZXRub2RlKCkKKyAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUxLCAiZ2V0bm9kZTEiKQorCisgICAgICAgICMgVGVzdCBpdCBhZ2FpbiB0byBlbnN1cmUgY29uc2lzdGVuY3kuCisgICAgICAgIG5vZGUyID0gdXVpZC5nZXRub2RlKCkKKyAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUyLCAiZ2V0bm9kZTIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9kZTEsIG5vZGUyKQorCisgICAgZGVmIHRlc3RfdXVpZDEoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgTWFrZSBzdXJlIHV1aWQ0KCkgZ2VuZXJhdGVzIFVVSURzIHRoYXQgYXJlIGFjdHVhbGx5IHZlcnNpb24gMS4KKyAgICAgICAgZm9yIHUgaW4gW3V1aWQudXVpZDEoKSBmb3IgaSBpbiByYW5nZSgxMCldOgorICAgICAgICAgICAgZXF1YWwodS52YXJpYW50LCB1dWlkLlJGQ180MTIyKQorICAgICAgICAgICAgZXF1YWwodS52ZXJzaW9uLCAxKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBub2RlIElEIGFwcGVhcnMgaW4gdGhlIFVVSUQuCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDApCisgICAgICAgIGVxdWFsKHUubm9kZSwgMCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4ZmZmZmZmZmZmZmZmKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4ZmZmZmZmZmZmZmZmKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBjbG9jayBzZXF1ZW5jZSBhcHBlYXJzIGluIHRoZSBVVUlELgorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYywgMCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfCB1LmNsb2NrX3NlcV9sb3csIDApCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4MTIzNDU2Nzg5YWJjLCAweDEyMzQpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKCgodS5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2YpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1LmNsb2NrX3NlcV9sb3csIDB4MTIzNCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMsIDB4M2ZmZikKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2xvY2tfc2VxX2xvdywgMHgzZmZmKQorCisgICAgZGVmIHRlc3RfdXVpZDMoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgVGVzdCBzb21lIGtub3duIHZlcnNpb24tMyBVVUlEcy4KKyAgICAgICAgZm9yIHUsIHYgaW4gWyh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9VUkwsICdodHRwOi8vcHl0aG9uLm9yZy8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAnOWZlOGU4YzQtYWFhOC0zMmE5LWE1NWMtNDUzNWE4OGI3NDhkJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9PSUQsICcxLjMuNi4xJyksCisgICAgICAgICAgICAgICAgICAgICAgJ2RkMWExY2VmLTEzZDUtMzY4YS1hZDgyLWVjYTcxYWNkNGNkMScpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfWDUwMCwgJ2M9Y2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNjU4ZDMwMDItZGI2Yi0zMDQwLWExZDEtOGRkZDdkMTg5YTRkJyksCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDMpCisgICAgICAgICAgICBlcXVhbCh1LCB1dWlkLlVVSUQodikpCisgICAgICAgICAgICBlcXVhbChzdHIodSksIHYpCisKKyAgICBkZWYgdGVzdF91dWlkNChzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdXVpZDQoKSBnZW5lcmF0ZXMgVVVJRHMgdGhhdCBhcmUgYWN0dWFsbHkgdmVyc2lvbiA0LgorICAgICAgICBmb3IgdSBpbiBbdXVpZC51dWlkNCgpIGZvciBpIGluIHJhbmdlKDEwKV06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDQpCisKKyAgICBkZWYgdGVzdF91dWlkNShzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBUZXN0IHNvbWUga25vd24gdmVyc2lvbi01IFVVSURzLgorICAgICAgICBmb3IgdSwgdiBpbiBbKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICAgICAgICAgICc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgJ2h0dHA6Ly9weXRob24ub3JnLycpLAorICAgICAgICAgICAgICAgICAgICAgICc0YzU2NWYwZC0zZjVhLTU4OTAtYjQxYi0yMGNmNDc3MDFjNWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX09JRCwgJzEuMy42LjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnMTQ0N2ZhNjEtNTI3Ny01ZmVmLWE5YjMtZmJjNmU0NGY0YWYzJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9YNTAwLCAnYz1jYScpLAorICAgICAgICAgICAgICAgICAgICAgICdjYzk1N2RkMS1hOTcyLTUzNDktOThjZC04NzQxOTAwMDI3OTgnKSwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgNSkKKyAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKKyAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0VVVJRCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YWl0My5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkKaW5kZXggZjZhNDFhNi4uOWRlNjRiMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YWl0My5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5CkBAIC0yLDggKzIsOSBAQAogIiIiCiAKIGltcG9ydCBvcworaW1wb3J0IHRpbWUKIGZyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuCiAKIHRyeToKICAgICBvcy5mb3JrCkBAIC0xNywxNiArMTgsMjEgQEAKIAogY2xhc3MgV2FpdDNUZXN0KEZvcmtXYWl0KToKICAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0MygwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXQzKCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDMob3MuV05PSEFORykKICAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCisKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydXNhZ2UpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoV2FpdDNUZXN0KQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5IGIvTGliL3Rlc3QvdGVzdF93YWl0NC5weQppbmRleCAwMjdlNWMzLi45ZjdmYzE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKQEAgLTIsOCArMiw5IEBACiAiIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgdGltZQogZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIAogdHJ5OgogICAgIG9zLmZvcmsKQEAgLTE3LDEzICsxOCwyMCBAQAogCiBjbGFzcyBXYWl0NFRlc3QoRm9ya1dhaXQpOgogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6Ci0gICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDQoY3BpZCwgMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0NCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChXYWl0NFRlc3QpCisgICAgcmVhcF9jaGlsZHJlbigpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CmluZGV4IDVkMDUxYTUuLmE3Y2NiNmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQpAQCAtODEsNiArODEsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cubWVzc2FnZSwgdGV4dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuY2F0ZWdvcnksICdVc2VyV2FybmluZycpCiAKKyAgICBkZWYgdGVzdF9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIFVzZXMgdGhlIHByaXZhdGUgX3NldG9wdGlvbigpIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHBhcnNpbmcKKyAgICAgICAgIyBvZiBjb21tYW5kLWxpbmUgd2FybmluZyBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2FybmluZ3MuX09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5fc2V0b3B0aW9uLCAnMToyOjM6NDo1OjYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3YXJuaW5ncy5fT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLl9zZXRvcHRpb24sICdib2d1czo6V2FybmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdhcm5pbmdzLl9PcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuX3NldG9wdGlvbiwgJ2lnbm9yZToyOjo0Oi01JykKKyAgICAgICAgd2FybmluZ3MuX3NldG9wdGlvbignZXJyb3I6Oldhcm5pbmc6OjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgd2FybmluZ3Mud2FybiwgJ2NvbnZlcnQgdG8gZXJyb3InKQorCisKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICAjIE9ic2N1cmUgaGFjayBzbyB0aGF0IHRoaXMgdGVzdCBwYXNzZXMgYWZ0ZXIgcmVsb2FkcyBvciByZXBlYXRlZCBjYWxscwogICAgICMgdG8gdGVzdF9tYWluIChyZWdydGVzdCAtUikuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnJlZy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CmluZGV4IGE5YmM5NjIuLjU4MzBmZDYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CkBAIC0xNTEsMyArMTUxLDYgQEAKIGVsc2U6CiAgICAgcHJpbnQgIlJlbW90ZSByZWdpc3RyeSBjYWxscyBjYW4gYmUgdGVzdGVkIHVzaW5nIiwKICAgICBwcmludCAiJ3Rlc3Rfd2lucmVnLnB5IC0tcmVtb3RlIFxcXFxtYWNoaW5lX25hbWUnIgorICAgICMgcGVyZm9ybSBtaW5pbWFsIENvbm5lY3RSZWdpc3RyeSB0ZXN0IHdoaWNoIGp1c3QgaW52b2tlcyBpdAorICAgIGggPSBDb25uZWN0UmVnaXN0cnkoTm9uZSwgSEtFWV9MT0NBTF9NQUNISU5FKQorICAgIGguQ2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYzI3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKQEAgLTAsMCArMSw2MTUgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyAgICAjIEJhY2t3YXJkIGNvbXBhdCBmb3IgMi4xCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0U3VpdGUsIFRlc3RDYXNlLCBtYWtlU3VpdGUKK2Zyb20gd3NnaXJlZi51dGlsIGltcG9ydCBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzCitmcm9tIHdzZ2lyZWYuaGVhZGVycyBpbXBvcnQgSGVhZGVycworZnJvbSB3c2dpcmVmLmhhbmRsZXJzIGltcG9ydCBCYXNlSGFuZGxlciwgQmFzZUNHSUhhbmRsZXIKK2Zyb20gd3NnaXJlZiBpbXBvcnQgdXRpbAorZnJvbSB3c2dpcmVmLnZhbGlkYXRlIGltcG9ydCB2YWxpZGF0b3IKK2Zyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBXU0dJU2VydmVyLCBXU0dJUmVxdWVzdEhhbmRsZXIsIGRlbW9fYXBwCitmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgbWFrZV9zZXJ2ZXIKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgQmFzZVNlcnZlcgoraW1wb3J0IHJlLCBzeXMKKworCitjbGFzcyBNb2NrU2VydmVyKFdTR0lTZXJ2ZXIpOgorICAgICIiIk5vbi1zb2NrZXQgSFRUUCBzZXJ2ZXIiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcyk6CisgICAgICAgIEJhc2VTZXJ2ZXIuX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpCisgICAgICAgIHNlbGYuc2VydmVyX2JpbmQoKQorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zZXJ2ZXJfYWRkcmVzcworICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gaG9zdAorICAgICAgICBzZWxmLnNlcnZlcl9wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorCisKK2NsYXNzIE1vY2tIYW5kbGVyKFdTR0lSZXF1ZXN0SGFuZGxlcik6CisgICAgIiIiTm9uLXNvY2tldCBIVFRQIGhhbmRsZXIiIiIKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNlbGYucmVxdWVzdAorICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKKworCisKKworZGVmIGhlbGxvX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICBzdGFydF9yZXNwb25zZSgiMjAwIE9LIiwgWworICAgICAgICAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSwKKyAgICAgICAgKCdEYXRlJywnTW9uLCAwNSBKdW4gMjAwNiAxODo0OTo1NCBHTVQnKQorICAgIF0pCisgICAgcmV0dXJuIFsiSGVsbG8sIHdvcmxkISJdCisKK2RlZiBydW5fYW1vY2soYXBwPWhlbGxvX2FwcCwgZGF0YT0iR0VUIC8gSFRUUC8xLjBcblxuIik6CisgICAgc2VydmVyID0gbWFrZV9zZXJ2ZXIoIiIsIDgwLCBhcHAsIE1vY2tTZXJ2ZXIsIE1vY2tIYW5kbGVyKQorICAgIGlucCwgb3V0LCBlcnIsIG9sZGVyciA9IFN0cmluZ0lPKGRhdGEpLCBTdHJpbmdJTygpLCBTdHJpbmdJTygpLCBzeXMuc3RkZXJyCisgICAgc3lzLnN0ZGVyciA9IGVycgorCisgICAgdHJ5OgorICAgICAgICBzZXJ2ZXIuZmluaXNoX3JlcXVlc3QoKGlucCxvdXQpLCAoIjEyNy4wLjAuMSIsODg4OCkpCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnN0ZGVyciA9IG9sZGVycgorCisgICAgcmV0dXJuIG91dC5nZXR2YWx1ZSgpLCBlcnIuZ2V0dmFsdWUoKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiBjb21wYXJlX2dlbmVyaWNfaXRlcihtYWtlX2l0LG1hdGNoKToKKyAgICAiIiJVdGlsaXR5IHRvIGNvbXBhcmUgYSBnZW5lcmljIDIuMS8yLjIrIGl0ZXJhdG9yIHdpdGggYW4gaXRlcmFibGUKKworICAgIElmIHJ1bm5pbmcgdW5kZXIgUHl0aG9uIDIuMissIHRoaXMgdGVzdHMgdGhlIGl0ZXJhdG9yIHVzaW5nIGl0ZXIoKS9uZXh0KCksCisgICAgYXMgd2VsbCBhcyBfX2dldGl0ZW1fXy4gICdtYWtlX2l0JyBtdXN0IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgZnJlc2gKKyAgICBpdGVyYXRvciB0byBiZSB0ZXN0ZWQgKHNpbmNlIHRoaXMgbWF5IHRlc3QgdGhlIGl0ZXJhdG9yIHR3aWNlKS4iIiIKKworICAgIGl0ID0gbWFrZV9pdCgpCisgICAgbiA9IDAKKyAgICBmb3IgaXRlbSBpbiBtYXRjaDoKKyAgICAgICAgaWYgbm90IGl0W25dPT1pdGVtOiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICBuKz0xCisgICAgdHJ5OgorICAgICAgICBpdFtuXQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRvbyBtYW55IGl0ZW1zIGZyb20gX19nZXRpdGVtX18iLGl0KQorCisgICAgdHJ5OgorICAgICAgICBpdGVyLCBTdG9wSXRlcmF0aW9uCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgICMgT25seSB0ZXN0IGl0ZXIgbW9kZSB1bmRlciAyLjIrCisgICAgICAgIGl0ID0gbWFrZV9pdCgpCisgICAgICAgIGlmIG5vdCBpdGVyKGl0KSBpcyBpdDogcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgZm9yIGl0ZW0gaW4gbWF0Y2g6CisgICAgICAgICAgICBpZiBub3QgaXQubmV4dCgpPT1pdGVtOiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVG9vIG1hbnkgaXRlbXMgZnJvbSAubmV4dCgpIixpdCkKKworCisKKworCisKK2NsYXNzIEludGVncmF0aW9uVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX2hlbGxvKHNlbGYsIG91dCwgaGFzX2xlbmd0aD1UcnVlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsCisgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJTZXJ2ZXI6IFdTR0lTZXJ2ZXIvMC4xIFB5dGhvbi8iK3N5cy52ZXJzaW9uLnNwbGl0KClbMF0rIlxyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJEYXRlOiBNb24sIDA1IEp1biAyMDA2IDE4OjQ5OjU0IEdNVFxyXG4iICsKKyAgICAgICAgICAgIChoYXNfbGVuZ3RoIGFuZCAgIkNvbnRlbnQtTGVuZ3RoOiAxM1xyXG4iIG9yICIiKSArCisgICAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAgICJIZWxsbywgd29ybGQhIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wbGFpbl9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2soKQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCkKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRlZF9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2sodmFsaWRhdG9yKGhlbGxvX2FwcCkpCisgICAgICAgICMgdGhlIG1pZGRsZXdhcmUgZG9lc24ndCBzdXBwb3J0IGxlbigpLCBzbyBjb250ZW50LWxlbmd0aCBpc24ndCB0aGVyZQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCwgaGFzX2xlbmd0aD1GYWxzZSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV92YWxpZGF0aW9uX2Vycm9yKHNlbGYpOgorICAgICAgICBkZWYgYmFkX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSkKKyAgICAgICAgICAgIHJldHVybiBbIkhlbGxvLCB3b3JsZCEiXQorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoYmFkX2FwcCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhvdXQuZW5kc3dpdGgoCisgICAgICAgICAgICAiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuICBQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4iCisgICAgICAgICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBlcnIuc3BsaXRsaW5lcygpWy0yXSwKKyAgICAgICAgICAgICJBc3NlcnRpb25FcnJvcjogSGVhZGVycyAoKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpKSBtdXN0IgorICAgICAgICAgICAgIiBiZSBvZiB0eXBlIGxpc3Q6IDx0eXBlICd0dXBsZSc+IgorICAgICAgICApCisKKworCisKKworCitjbGFzcyBVdGlsaXR5VGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrU2hpZnQoc2VsZixzbl9pbixwaV9pbixwYXJ0LHNuX291dCxwaV9vdXQpOgorICAgICAgICBlbnYgPSB7J1NDUklQVF9OQU1FJzpzbl9pbiwnUEFUSF9JTkZPJzpwaV9pbn0KKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLnNoaWZ0X3BhdGhfaW5mbyhlbnYpLHBhcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydQQVRIX0lORk8nXSxwaV9vdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydTQ1JJUFRfTkFNRSddLHNuX291dCkKKyAgICAgICAgcmV0dXJuIGVudgorCisgICAgZGVmIGNoZWNrRGVmYXVsdChzZWxmLCBrZXksIHZhbHVlLCBhbHQ9Tm9uZSk6CisgICAgICAgICMgQ2hlY2sgZGVmYXVsdGluZyB3aGVuIGVtcHR5CisgICAgICAgIGVudiA9IHt9CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsU3RyaW5nSU8pOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZW52W2tleV0sU3RyaW5nSU8pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba2V5XSx2YWx1ZSkKKworICAgICAgICAjIENoZWNrIGV4aXN0aW5nIHZhbHVlCisgICAgICAgIGVudiA9IHtrZXk6YWx0fQorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZW52W2tleV0gaXMgYWx0KQorCisgICAgZGVmIGNoZWNrQ3Jvc3NEZWZhdWx0KHNlbGYsa2V5LHZhbHVlLCoqa3cpOgorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3dba2V5XSx2YWx1ZSkKKworICAgIGRlZiBjaGVja0FwcFVSSShzZWxmLHVyaSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuYXBwbGljYXRpb25fdXJpKGt3KSx1cmkpCisKKyAgICBkZWYgY2hlY2tSZXFVUkkoc2VsZix1cmkscXVlcnk9MSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwucmVxdWVzdF91cmkoa3cscXVlcnkpLHVyaSkKKworCisKKworCisKKyAgICBkZWYgY2hlY2tGVyhzZWxmLHRleHQsc2l6ZSxtYXRjaCk6CisKKyAgICAgICAgZGVmIG1ha2VfaXQodGV4dD10ZXh0LHNpemU9c2l6ZSk6CisgICAgICAgICAgICByZXR1cm4gdXRpbC5GaWxlV3JhcHBlcihTdHJpbmdJTyh0ZXh0KSxzaXplKQorCisgICAgICAgIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpCisKKyAgICAgICAgaXQgPSBtYWtlX2l0KCkKKyAgICAgICAgc2VsZi5mYWlsSWYoaXQuZmlsZWxpa2UuY2xvc2VkKQorCisgICAgICAgIGZvciBpdGVtIGluIGl0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuZmFpbElmKGl0LmZpbGVsaWtlLmNsb3NlZCkKKworICAgICAgICBpdC5jbG9zZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdC5maWxlbGlrZS5jbG9zZWQpCisKKworICAgIGRlZiB0ZXN0U2ltcGxlU2hpZnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsJy8nLCAnJywgJy8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcnLCcveCcsICd4JywgJy94JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnLycsJycsIE5vbmUsICcvJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EnLCcveC95JywgJ3gnLCAnL2EveCcsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EnLCcveC8nLCAgJ3gnLCAnL2EveCcsICcvJykKKworCisgICAgZGVmIHRlc3ROb3JtYWxpemVkU2hpZnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4uL3knLCAnLi4nLCAnL2EnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsICcvLi4veScsICcuLicsICcnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy95JywgJ3knLCAnL2EvYi95JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvL3kvJywgJ3knLCAnL2EvYi95JywgJy8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veScsICd5JywgJy9hL2IveScsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veS8nLCAneScsICcvYS9iL3knLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLy8uLy4uLy95Ly4vLycsICcuLicsICcvYScsICcveS8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy8vJywgJycsICcvYS9iLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4vLycsICcnLCAnL2EvYi8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy94Ly8nLCAneCcsICcvYS9iL3gnLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLicsIE5vbmUsICcvYS9iJywgJycpCisKKworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFsKKyAgICAgICAgICAgICgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BPUlQnLCAnODAnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKSwKKyAgICAgICAgICAgICgnSFRUUF9IT1NUJywnMTI3LjAuMC4xJyksCisgICAgICAgICAgICAoJ1JFUVVFU1RfTUVUSE9EJywnR0VUJyksCisgICAgICAgICAgICAoJ1NDUklQVF9OQU1FJywnJyksCisgICAgICAgICAgICAoJ1BBVEhfSU5GTycsJy8nKSwKKyAgICAgICAgICAgICgnd3NnaS52ZXJzaW9uJywgKDEsMCkpLAorICAgICAgICAgICAgKCd3c2dpLnJ1bl9vbmNlJywgMCksCisgICAgICAgICAgICAoJ3dzZ2kubXVsdGl0aHJlYWQnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5tdWx0aXByb2Nlc3MnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5pbnB1dCcsIFN0cmluZ0lPKCIiKSksCisgICAgICAgICAgICAoJ3dzZ2kuZXJyb3JzJywgU3RyaW5nSU8oKSksCisgICAgICAgICAgICAoJ3dzZ2kudXJsX3NjaGVtZScsJ2h0dHAnKSwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tEZWZhdWx0KGtleSx2YWx1ZSkKKworCisgICAgZGVmIHRlc3RDcm9zc0RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdIVFRQX0hPU1QnLCJmb28uYmFyIixTRVJWRVJfTkFNRT0iZm9vLmJhciIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0ib24iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwcyIsSFRUUFM9IjEiKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwcyIsSFRUUFM9InllcyIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHAiLEhUVFBTPSJmb28iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdTRVJWRVJfUE9SVCcsIjgwIixIVFRQUz0iZm9vIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnU0VSVkVSX1BPUlQnLCI0NDMiLEhUVFBTPSJvbiIpCisKKworICAgIGRlZiB0ZXN0R3Vlc3NTY2hlbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoe30pLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6ImZvbyJ9KSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJvbiJ9KSwgImh0dHBzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoieWVzIn0pLCAiaHR0cHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiIxIn0pLCAiaHR0cHMiKQorCisKKworCisKKyAgICBkZWYgdGVzdEFwcFVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovL3NwYW0uZXhhbXBsZS5jb206MjA3MS8iLAorICAgICAgICAgICAgSFRUUF9IT1NUPSJzcGFtLmV4YW1wbGUuY29tOjIwNzEiLCBTRVJWRVJfUE9SVD0iMjA3MSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly9zcGFtLmV4YW1wbGUuY29tLyIsCisgICAgICAgICAgICBTRVJWRVJfTkFNRT0ic3BhbS5leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIiwKKyAgICAgICAgICAgIEhUVFBfSE9TVD0iMTI3LjAuMC4xIiwgU0VSVkVSX05BTUU9InNwYW0uZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwczovLzEyNy4wLjAuMS8iLCBIVFRQUz0ib24iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xOjgwMDAvIiwgU0VSVkVSX1BPUlQ9IjgwMDAiLAorICAgICAgICAgICAgSFRUUF9IT1NUPU5vbmUpCisKKyAgICBkZWYgdGVzdFJlcVVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtIiwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtP3NheT1uaSIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIsUVVFUllfU1RSSU5HPSJzYXk9bmkiKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0iLCAwLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0ic2F5PW5pIikKKworICAgIGRlZiB0ZXN0RmlsZVdyYXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tGVygieHl6Iio1MCwgMTIwLCBbInh5eiIqNDAsInh5eiIqMTBdKQorCisgICAgZGVmIHRlc3RIb3BCeUhvcChzZWxmKToKKyAgICAgICAgZm9yIGhvcCBpbiAoCisgICAgICAgICAgICAiQ29ubmVjdGlvbiBLZWVwLUFsaXZlIFByb3h5LUF1dGhlbnRpY2F0ZSBQcm94eS1BdXRob3JpemF0aW9uICIKKyAgICAgICAgICAgICJURSBUcmFpbGVycyBUcmFuc2Zlci1FbmNvZGluZyBVcGdyYWRlIgorICAgICAgICApLnNwbGl0KCk6CisgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisKKyAgICAgICAgIyBOb3QgY29tcHJlaGVuc2l2ZSwganVzdCBhIGZldyByYW5kb20gaGVhZGVyIG5hbWVzCisgICAgICAgIGZvciBob3AgaW4gKAorICAgICAgICAgICAgIkFjY2VwdCBDYWNoZS1Db250cm9sIERhdGUgUHJhZ21hIFRyYWlsZXIgVmlhIFdhcm5pbmciCisgICAgICAgICkuc3BsaXQoKToKKyAgICAgICAgICAgIGZvciBhbHQgaW4gaG9wLCBob3AudGl0bGUoKSwgaG9wLnVwcGVyKCksIGhvcC5sb3dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQorCitjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE1hcHBpbmdJbnRlcmZhY2Uoc2VsZik6CisgICAgICAgIHRlc3QgPSBbKCd4JywneScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihIZWFkZXJzKFtdKSksMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oSGVhZGVycyh0ZXN0WzpdKSksMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLmtleXMoKSwgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS52YWx1ZXMoKSwgWyd5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS5pdGVtcygpLCB0ZXN0KQorICAgICAgICBzZWxmLmZhaWxJZihIZWFkZXJzKHRlc3QpLml0ZW1zKCkgaXMgdGVzdCkgICMgbXVzdCBiZSBjb3B5IQorCisgICAgICAgIGg9SGVhZGVycyhbXSkKKyAgICAgICAgZGVsIGhbJ2ZvbyddICAgIyBzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yCisKKyAgICAgICAgaFsnRm9vJ10gPSAnYmFyJworICAgICAgICBmb3IgbSBpbiBoLmhhc19rZXksIGguX19jb250YWluc19fLCBoLmdldCwgaC5nZXRfYWxsLCBoLl9fZ2V0aXRlbV9fOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ2ZvbycpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZvbycpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZPTycpKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYobSgnYmFyJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwnYmFyJykKKyAgICAgICAgaFsnZm9vJ10gPSAnYmF6JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ0ZPTyddLCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0X2FsbCgnZm9vJyksWydiYXonXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJmb28iLCJ3aGVlIiksICJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnNldGRlZmF1bHQoImZvbyIsIndoZWUiKSwgImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zZXRkZWZhdWx0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJmb28iXSwiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJ6b28iXSwid2hlZSIpCisKKyAgICBkZWYgdGVzdFJlcXVpcmVMaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEhlYWRlcnMsICJmb28iKQorCisKKyAgICBkZWYgdGVzdEV4dHJhcyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcnMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdcclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2ZvbycsJ2JhcicsYmF6PSJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwgJ2JhcjsgYmF6PSJzcGFtIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdmb286IGJhcjsgYmF6PSJzcGFtIlxyXG5cclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ0ZvbycsJ2JhcicsY2hlZXNlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXRfYWxsKCdmb28nKSwKKyAgICAgICAgICAgIFsnYmFyOyBiYXo9InNwYW0iJywgJ2JhcjsgY2hlZXNlJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaCksCisgICAgICAgICAgICAnZm9vOiBiYXI7IGJhej0ic3BhbSJcclxuJworICAgICAgICAgICAgJ0ZvbzogYmFyOyBjaGVlc2VcclxuJworICAgICAgICAgICAgJ1xyXG4nCisgICAgICAgICkKKworCitjbGFzcyBFcnJvckhhbmRsZXIoQmFzZUNHSUhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwqKmt3KToKKyAgICAgICAgc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgQmFzZUNHSUhhbmRsZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBTdHJpbmdJTygnJyksIFN0cmluZ0lPKCksIFN0cmluZ0lPKCksIGt3LAorICAgICAgICAgICAgbXVsdGl0aHJlYWQ9VHJ1ZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorCitjbGFzcyBUZXN0SGFuZGxlcihFcnJvckhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyLCB3L2Vycm9yIHBhc3N0aHJ1IiIiCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZSAgICMgZm9yIHRlc3RpbmcsIHdlIHdhbnQgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcKKworCisKKworCisKKworCisKKworCitjbGFzcyBIYW5kbGVyVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrRW52aXJvbkF0dHJzKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZm9yIGF0dHIgaW4gWworICAgICAgICAgICAgJ3ZlcnNpb24nLCdtdWx0aXRocmVhZCcsJ211bHRpcHJvY2VzcycsJ3J1bl9vbmNlJywnZmlsZV93cmFwcGVyJworICAgICAgICBdOgorICAgICAgICAgICAgaWYgYXR0cj09J2ZpbGVfd3JhcHBlcicgYW5kIGhhbmRsZXIud3NnaV9maWxlX3dyYXBwZXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKGhhbmRsZXIsJ3dzZ2lfJythdHRyKSxlbnZbJ3dzZ2kuJythdHRyXSkKKworICAgIGRlZiBjaGVja09TRW52aXJvbihzZWxmLGhhbmRsZXIpOgorICAgICAgICBlbXB0eSA9IHt9OyBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVtcHR5KQorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZnJvbSBvcyBpbXBvcnQgZW52aXJvbgorICAgICAgICBmb3Igayx2IGluIGVudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBlbXB0eS5oYXNfa2V5KGspOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52W2tdLHYpCisgICAgICAgIGZvciBrLHYgaW4gZW1wdHkuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbnYuaGFzX2tleShrKSkKKworICAgIGRlZiB0ZXN0RW52aXJvbihzZWxmKToKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFg9IlkiKQorICAgICAgICBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmNoZWNrRW52aXJvbkF0dHJzKGgpCisgICAgICAgIHNlbGYuY2hlY2tPU0Vudmlyb24oaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bIlgiXSwiWSIpCisKKyAgICBkZWYgdGVzdENHSUVudmlyb24oc2VsZik6CisgICAgICAgIGggPSBCYXNlQ0dJSGFuZGxlcihOb25lLE5vbmUsTm9uZSx7fSkKKyAgICAgICAgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgZm9yIGtleSBpbiAnd3NnaS51cmxfc2NoZW1lJywgJ3dzZ2kuaW5wdXQnLCAnd3NnaS5lcnJvcnMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGguZW52aXJvbi5oYXNfa2V5KGtleSkpCisKKyAgICBkZWYgdGVzdFNjaGVtZShzZWxmKToKKyAgICAgICAgaD1UZXN0SGFuZGxlcihIVFRQUz0ib24iKTsgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddLCdodHRwcycpCisgICAgICAgIGg9VGVzdEhhbmRsZXIoKTsgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddLCdodHRwJykKKworCisgICAgZGVmIHRlc3RBYnN0cmFjdE1ldGhvZHMoc2VsZik6CisgICAgICAgIGggPSBCYXNlSGFuZGxlcigpCisgICAgICAgIGZvciBuYW1lIGluIFsKKyAgICAgICAgICAgICdfZmx1c2gnLCdnZXRfc3RkaW4nLCdnZXRfc3RkZXJyJywnYWRkX2NnaV92YXJzJworICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgZ2V0YXR0cihoLG5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBoLl93cml0ZSwgInRlc3QiKQorCisKKyAgICBkZWYgdGVzdENvbnRlbnRMZW5ndGgoc2VsZik6CisgICAgICAgICMgRGVtbyBvbmUgcmVhc29uIGl0ZXJhdGlvbiBpcyBiZXR0ZXIgdGhhbiB3cml0ZSgpLi4uICA7KQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDEoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW2VbJ3dzZ2kudXJsX3NjaGVtZSddXQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDIoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pKGVbJ3dzZ2kudXJsX3NjaGVtZSddKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4odHJpdmlhbF9hcHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiA0XHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisgICAgICAgIGggPSBUZXN0SGFuZGxlcigpCisgICAgICAgIGgucnVuKHRyaXZpYWxfYXBwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisKKworCisKKworCisgICAgZGVmIHRlc3RCYXNpY0Vycm9yT3V0cHV0KHNlbGYpOgorCisgICAgICAgIGRlZiBub25fZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICBzKCcyMDAgT0snLFtdKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgZGVmIGVycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBoYW5kbGVyIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4obm9uX2Vycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogMFxyXG4iCisgICAgICAgICAgICAiXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRlcnIuZ2V0dmFsdWUoKSwiIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4oZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAlc1xyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJWRcclxuIgorICAgICAgICAgICAgIlxyXG4lcyIgJSAoaC5lcnJvcl9zdGF0dXMsbGVuKGguZXJyb3JfYm9keSksaC5lcnJvcl9ib2R5KSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpPD4tMSkKKworICAgIGRlZiB0ZXN0RXJyb3JBZnRlck91dHB1dChzZWxmKToKKyAgICAgICAgTVNHID0gIlNvbWUgb3V0cHV0IGhhcyBiZWVuIHNlbnQiCisgICAgICAgIGRlZiBlcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoIjIwMCBPSyIsW10pKE1TRykKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIHNob3VsZCBiZSBjYXVnaHQgYnkgaGFuZGxlciIpCisKKyAgICAgICAgaCA9IEVycm9ySGFuZGxlcigpCisgICAgICAgIGgucnVuKGVycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIitNU0cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIik8Pi0xKQorCisKKyAgICBkZWYgdGVzdEhlYWRlckZvcm1hdHMoc2VsZik6CisKKyAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBzdGRwYXQgPSAoCisgICAgICAgICAgICByIkhUVFAvJXMgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgIHIiRGF0ZTogXHd7M30sIFsgMDEyM11cZCBcd3szfSBcZHs0fSBcZFxkOlxkXGQ6XGRcZCBHTVRcclxuIgorICAgICAgICAgICAgciIlcyIgciJDb250ZW50LUxlbmd0aDogMFxyXG4iIHIiXHJcbiIKKyAgICAgICAgKQorICAgICAgICBzaG9ydHBhdCA9ICgKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iICJDb250ZW50LUxlbmd0aDogMFxyXG4iICJcclxuIgorICAgICAgICApCisKKyAgICAgICAgZm9yIHNzdyBpbiAiRm9vQmFyLzEuMCIsIE5vbmU6CisgICAgICAgICAgICBzdyA9IHNzdyBhbmQgIlNlcnZlcjogJXNcclxuIiAlIHNzdyBvciAiIgorCisgICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiAiMS4wIiwgIjEuMSI6CisgICAgICAgICAgICAgICAgZm9yIHByb3RvIGluICJIVFRQLzAuOSIsICJIVFRQLzEuMCIsICJIVFRQLzEuMSI6CisKKyAgICAgICAgICAgICAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFNFUlZFUl9QUk9UT0NPTD1wcm90bykKKyAgICAgICAgICAgICAgICAgICAgaC5vcmlnaW5fc2VydmVyID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaC5odHRwX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGguc2VydmVyX3NvZnR3YXJlID0gc3N3CisgICAgICAgICAgICAgICAgICAgIGgucnVuKG5vbl9lcnJvcl9hcHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvcnRwYXQsaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKworICAgICAgICAgICAgICAgICAgICBoID0gVGVzdEhhbmRsZXIoU0VSVkVSX1BST1RPQ09MPXByb3RvKQorICAgICAgICAgICAgICAgICAgICBoLm9yaWdpbl9zZXJ2ZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGguaHR0cF92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBoLnNlcnZlcl9zb2Z0d2FyZSA9IHNzdworICAgICAgICAgICAgICAgICAgICBoLnJ1bihub25fZXJyb3JfYXBwKQorICAgICAgICAgICAgICAgICAgICBpZiBwcm90bz09IkhUVFAvMC45IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwiIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5tYXRjaChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RkcGF0JSh2ZXJzaW9uLHN3KSwgaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworIyBUaGlzIGVwaWxvZ3VlIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBQeXRob24gMi41IHJlZ3J0ZXN0IG1vZHVsZQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3N1aXRlCisgICAgcnVuX3N1aXRlKAorICAgICAgICB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHN5cy5tb2R1bGVzW19fbmFtZV9fXSkKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIHRoZSBhYm92ZSBsaW5lcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKaW5kZXggODYwNTJkNy4uNzhhZGI0MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKQEAgLTEsNCArMSw0IEBACi0jIHhtbGNvcmUuZXRyZWUgdGVzdC4gIFRoaXMgZmlsZSBjb250YWlucyBlbm91Z2ggdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQKKyMgeG1sLmV0cmVlIHRlc3QuICBUaGlzIGZpbGUgY29udGFpbnMgZW5vdWdoIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0CiAjIGFsbCBpbmNsdWRlZCBjb21wb25lbnRzIHdvcmsgYXMgdGhleSBzaG91bGQuICBGb3IgYSBtb3JlIGV4dGVuc2l2ZQogIyB0ZXN0IHN1aXRlLCBzZWUgdGhlIHNlbGZ0ZXN0IHNjcmlwdCBpbiB0aGUgRWxlbWVudFRyZWUgZGlzdHJpYnV0aW9uLgogCkBAIC02LDggKzYsNiBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi1mcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCi0KIFNBTVBMRV9YTUwgPSAiIiIKIDxib2R5PgogICA8dGFnPnRleHQ8L3RhZz4KQEAgLTMyLDkgKzMwLDkgQEAKICAgICAiIiIKICAgICBJbXBvcnQgc2FuaXR5LgogCi0gICAgPj4+IGZyb20geG1sY29yZS5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKLSAgICA+Pj4gZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAgICAgIiIiCiAKIGRlZiBjaGVja19tZXRob2QobWV0aG9kKToKQEAgLTYxLDYgKzU5LDggQEAKICAgICAiIiIKICAgICBUZXN0IGVsZW1lbnQgdHJlZSBpbnRlcmZhY2UuCiAKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKICAgICA+Pj4gZWxlbWVudCA9IEVULkVsZW1lbnQoInRhZyIsIGtleT0idmFsdWUiKQogICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZWxlbWVudCkKIApAQCAtMTA4LDYgKzEwOCw4IEBACiAgICAgIiIiCiAgICAgVGVzdCBmaW5kIG1ldGhvZHMgKGluY2x1ZGluZyB4cGF0aCBzeW50YXgpLgogCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCiAgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKICAgICA+Pj4gZWxlbS5maW5kKCJ0YWciKS50YWcKICAgICAndGFnJwpAQCAtMTc0LDYgKzE3Niw4IEBACiBkZWYgcGFyc2VsaXRlcmFsKCk6CiAgICAgciIiIgogCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCiAgICAgPj4+IGVsZW1lbnQgPSBFVC5YTUwoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCiAgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpLndyaXRlKHN5cy5zdGRvdXQpCiAgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CkBAIC0xOTUsMTggKzE5OSwyMCBAQAogICAgICdib2R5JwogICAgICIiIgogCi1kZWYgY2hlY2tfZW5jb2RpbmcoZW5jb2RpbmcpOgorCitkZWYgY2hlY2tfZW5jb2RpbmcoRVQsIGVuY29kaW5nKToKICAgICAiIiIKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImFzY2lpIikKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoInVzLWFzY2lpIikKLSAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImlzby04ODU5LTEiKQotICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMTUiKQotICAgID4+PiBjaGVja19lbmNvZGluZygiY3A0MzciKQotICAgID4+PiBjaGVja19lbmNvZGluZygibWFjLXJvbWFuIikKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJhc2NpaSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAidXMtYXNjaWkiKQorICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImlzby04ODU5LTEiKQorICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImlzby04ODU5LTE1IikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJjcDQzNyIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAibWFjLXJvbWFuIikKICAgICAiIiIKLSAgICBFVC5YTUwoCi0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSclcyc/Pjx4bWwgLz4iICUgZW5jb2RpbmcKLSAgICAgICAgKQorICAgIEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nJXMnPz48eG1sIC8+IiAlIGVuY29kaW5nKQorCiAKICMKICMgeGluY2x1ZGUgdGVzdHMgKHNhbXBsZXMgZnJvbSBhcHBlbmRpeCBDIG9mIHRoZSB4aW5jbHVkZSBzcGVjaWZpY2F0aW9uKQpAQCAtMjgyLDE0ICsyODgsMTYgQEAKICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgIHJhaXNlIElPRXJyb3IoInJlc291cmNlIG5vdCBmb3VuZCIpCiAgICAgaWYgcGFyc2UgPT0gInhtbCI6Ci0gICAgICAgIHJldHVybiBFVC5YTUwoZGF0YSkKKyAgICAgICAgZnJvbSB4bWwuZXRyZWUuRWxlbWVudFRyZWUgaW1wb3J0IFhNTAorICAgICAgICByZXR1cm4gWE1MKGRhdGEpCiAgICAgcmV0dXJuIGRhdGEKIAogZGVmIHhpbmNsdWRlKCk6CiAgICAgciIiIgogICAgIEJhc2ljIGluY2x1c2lvbiBleGFtcGxlIChYSW5jbHVkZSBDLjEpCiAKLSAgICA+Pj4gZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCiAKICAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkMxLnhtbCIpCiAgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CmluZGV4IDU4N2VhOTkuLjU2ZTdmZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQpAQCAtMSwxMCArMSwxMCBAQAotIyB4bWxjb3JlLmV0cmVlIHRlc3QgZm9yIGNFbGVtZW50VHJlZQorIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCiAKIGltcG9ydCBkb2N0ZXN0LCBzeXMKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBjRWxlbWVudFRyZWUgYXMgRVQKK2Zyb20geG1sLmV0cmVlIGltcG9ydCBjRWxlbWVudFRyZWUgYXMgRVQKIAogU0FNUExFX1hNTCA9ICIiIgogPGJvZHk+CkBAIC0zMCw3ICszMCw3IEBACiAgICAgIiIiCiAgICAgSW1wb3J0IHNhbml0eS4KIAotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IGNFbGVtZW50VHJlZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgY0VsZW1lbnRUcmVlCiAgICAgIiIiCiAKIGRlZiBjaGVja19tZXRob2QobWV0aG9kKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQppbmRleCAwMjQxMzQ4Li41NDY4NGYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CkBAIC00LDcgKzQsNyBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHpsaWIgPSBOb25lCiAKLWltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QKK2ltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QsIHN5cywgc2h1dGlsCiAKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCkBAIC0yOCwxNCArMjgsNzAgQEAKICAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikKICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIikKICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQogICAgICAgICB6aXBmcC5jbG9zZSgpCiAKICAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQogICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgc2VsZi5kYXRhKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpLCBzZWxmLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgic3RyZmlsZSIpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgIyBQcmludCB0aGUgWklQIGRpcmVjdG9yeQorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gZnAKKworICAgICAgICAgICAgemlwZnAucHJpbnRkaXIoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgIGRpcmVjdG9yeSA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdGaWxlIE5hbWUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydF8oJ01vZGlmaWVkJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdTaXplJyBpbiBsaW5lc1swXSkKKworICAgICAgICBmbiwgZGF0ZSwgdGltZSwgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZm4sICdhbm90aGVyLm5hbWUnKQorICAgICAgICAjIFhYWDogdGltZXN0YW1wIGlzIG5vdCB0ZXN0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2l6ZSwgc3RyKGxlbihzZWxmLmRhdGEpKSkKKworICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAorICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorCisgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKKyAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgIG5hbWVzID0gWyBpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorICAgICAgICBmb3IgaSBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIGNoZWNrIGdldGluZm8KKyAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiLCAic3RyZmlsZSIpOgorICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8obm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLmZpbGVuYW1lLCBubSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgdGVzdHppcCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICB6aXBmcC50ZXN0emlwKCkKKworCiAgICAgICAgIHppcGZwLmNsb3NlKCkKIAorCisKKwogICAgIGRlZiB0ZXN0U3RvcmVkKHNlbGYpOgogICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKICAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCkBAIC01OSw2ICsxMTUsMTk3IEBACiAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCiAgICAgICAgIG9zLnJlbW92ZShURVNURk4yKQogCitjbGFzcyBUZXN0WmlwNjRJblNtYWxsRmlsZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhlc2UgdGVzdHMgdGVzdCB0aGUgWklQNjQgZnVuY3Rpb25hbGl0eSB3aXRob3V0IHVzaW5nIGxhcmdlIGZpbGVzLAorICAgICMgc2VlIHRlc3RfemlwZmlsZTY0IGZvciBwcm9wZXIgdGVzdHMuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX2xpbWl0ID0gemlwZmlsZS5aSVA2NF9MSU1JVAorICAgICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gNQorCisgICAgICAgIGxpbmVfZ2VuID0gKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSBmb3IgaSBpbiByYW5nZSgwLCAxMDAwKSkKKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKGxpbmVfZ2VuKQorCisgICAgICAgICMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICAgICAgICBmcCA9IG9wZW4oVEVTVEZOLCAid2IiKQorICAgICAgICBmcC53cml0ZShzZWxmLmRhdGEpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiBsYXJnZUZpbGVFeGNlcHRpb25UZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5MYXJnZVppcEZpbGUsCisgICAgICAgICAgICAgICAgemlwZnAud3JpdGUsIFRFU1RGTiwgImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiBsYXJnZUZpbGVFeGNlcHRpb25UZXN0MihzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuTGFyZ2VaaXBGaWxlLAorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiwgc2VsZi5kYXRhKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdExhcmdlRmlsZUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLmxhcmdlRmlsZUV4Y2VwdGlvblRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICAgICAgc2VsZi5sYXJnZUZpbGVFeGNlcHRpb25UZXN0MihmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgemlwVGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uLCBhbGxvd1ppcDY0PVRydWUpCisgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpCisgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorICAgICAgICB6aXBmcC53cml0ZXN0cigic3RyZmlsZSIsIHNlbGYuZGF0YSkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKFRFU1RGTiksIHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiKSwgc2VsZi5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoInN0cmZpbGUiKSwgc2VsZi5kYXRhKQorCisgICAgICAgICMgUHJpbnQgdGhlIFpJUCBkaXJlY3RvcnkKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZwCisKKyAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKKworICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCisgICAgICAgIGxpbmVzID0gZGlyZWN0b3J5LnNwbGl0bGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obGluZXMpLCA0KSAjIE51bWJlciBvZiBmaWxlcyArIGhlYWRlcgorCisgICAgICAgIHNlbGYuYXNzZXJ0XygnRmlsZSBOYW1lJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdNb2RpZmllZCcgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0XygnU2l6ZScgaW4gbGluZXNbMF0pCisKKyAgICAgICAgZm4sIGRhdGUsIHRpbWUsIHNpemUgPSBsaW5lc1sxXS5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZuLCAnYW5vdGhlci5uYW1lJykKKyAgICAgICAgIyBYWFg6IHRpbWVzdGFtcCBpcyBub3QgdGVzdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNpemUsIHN0cihsZW4oc2VsZi5kYXRhKSkpCisKKyAgICAgICAgIyBDaGVjayB0aGUgbmFtZWxpc3QKKyAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKworICAgICAgICAjIENoZWNrIGluZm9saXN0CisgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQorICAgICAgICBuYW1lcyA9IFsgaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvcyBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKyAgICAgICAgZm9yIGkgaW4gaW5mb3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCisKKyAgICAgICAgIyBjaGVjayBnZXRpbmZvCisgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKG5tKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5maWxlbmFtZSwgbm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRlc3R6aXAgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgemlwZnAudGVzdHppcCgpCisKKworICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFN0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisKKyAgICBpZiB6bGliOgorICAgICAgICBkZWYgdGVzdERlZmxhdGVkKHNlbGYpOgorICAgICAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICAgICAgc2VsZi56aXBUZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgZGVmIHRlc3RBYnNvbHV0ZUFyY25hbWVzKHNlbGYpOgorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCwgYWxsb3daaXA2ND1UcnVlKQorICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICIvYWJzb2x1dGUiKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAubmFtZWxpc3QoKSwgWyJhYnNvbHV0ZSJdKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IHNlbGYuX2xpbWl0CisgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisgICAgICAgIG9zLnJlbW92ZShURVNURk4yKQorCitjbGFzcyBQeVppcEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RXcml0ZVB5ZmlsZShzZWxmKToKKyAgICAgICAgemlwZnAgID0gemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpCisgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5weWMnKSBvciBmbi5lbmRzd2l0aCgnLnB5bycpOgorICAgICAgICAgICAgZm4gPSBmbls6LTFdCisKKyAgICAgICAgemlwZnAud3JpdGVweShmbikKKworICAgICAgICBibiA9IG9zLnBhdGguYmFzZW5hbWUoZm4pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisKKyAgICAgICAgemlwZnAgID0gemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpCisgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5weWMnKSBvciBmbi5lbmRzd2l0aCgnLnB5bycpOgorICAgICAgICAgICAgZm4gPSBmbls6LTFdCisKKyAgICAgICAgemlwZnAud3JpdGVweShmbiwgInRlc3RwYWNrYWdlIikKKworICAgICAgICBibiA9ICIlcy8lcyIlKCJ0ZXN0cGFja2FnZSIsIG9zLnBhdGguYmFzZW5hbWUoZm4pKQorICAgICAgICBzZWxmLmFzc2VydF8oYm4gbm90IGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0V3JpdGVQeXRob25QYWNrYWdlKHNlbGYpOgorICAgICAgICBpbXBvcnQgZW1haWwKKyAgICAgICAgcGFja2FnZWRpciA9IG9zLnBhdGguZGlybmFtZShlbWFpbC5fX2ZpbGVfXykKKworICAgICAgICB6aXBmcCAgPSB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikKKyAgICAgICAgemlwZnAud3JpdGVweShwYWNrYWdlZGlyKQorCisgICAgICAgICMgQ2hlY2sgZm9yIGEgY291cGxlIG9mIG1vZHVsZXMgYXQgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgaGllYXJhcmNoeQorICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdlbWFpbC9fX2luaXRfXy5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9fX2luaXRfXy5weWMnIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oJ2VtYWlsL21pbWUvdGV4dC5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9taW1lL3RleHQucHljJyBpbiBuYW1lcykKKworICAgIGRlZiB0ZXN0V3JpdGVQeXRob25EaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTjIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDEucHkiKSwgInciKQorICAgICAgICAgICAgZnAud3JpdGUoInByaW50IDQyXG4iKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKFRFU1RGTjIsICJtb2QyLnB5IiksICJ3IikKKyAgICAgICAgICAgIGZwLndyaXRlKCJwcmludCA0MiAqIDQyXG4iKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKFRFU1RGTjIsICJtb2QyLnR4dCIpLCAidyIpCisgICAgICAgICAgICBmcC53cml0ZSgiYmxhIGJsYSBibGFcbiIpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgICAgIHppcGZwICA9IHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKQorICAgICAgICAgICAgemlwZnAud3JpdGVweShURVNURk4yKQorCisgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnbW9kMS5weWMnIGluIG5hbWVzIG9yICdtb2QxLnB5bycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oJ21vZDIucHljJyBpbiBuYW1lcyBvciAnbW9kMi5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdtb2QyLnR4dCcgbm90IGluIG5hbWVzKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTjIpCisKKworCiBjbGFzcyBPdGhlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdENsb3NlRXJyb25lb3VzRmlsZShzZWxmKToKICAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIFppcEZpbGUgY29uc3RydWN0b3IgY2xvc2VzIHRoZSBmaWxlIG9iamVjdApAQCAtMTAzLDcgKzM1MCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi50ZXN0emlwKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUsIE90aGVyVGVzdHMpCisgICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUsIFRlc3RaaXA2NEluU21hbGxGaWxlcywgT3RoZXJUZXN0cywgUHlaaXBGaWxlVGVzdHMpCisgICAgI3J1bl91bml0dGVzdChUZXN0WmlwNjRJblNtYWxsRmlsZXMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlNjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5Y2YzOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5CkBAIC0wLDAgKzEsMTAxIEBACisjIFRlc3RzIG9mIHRoZSBmdWxsIFpJUDY0IGZ1bmN0aW9uYWxpdHkgb2YgemlwZmlsZQorIyBUaGUgdGVzdF9zdXBwb3J0LnJlcXVpcmVzIGNhbGwgaXMgdGhlIG9ubHkgcmVhc29uIGZvciBrZWVwaW5nIHRoaXMgc2VwYXJhdGUKKyMgZnJvbSB0ZXN0X3ppcGZpbGUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisjIFhYWChubm9yd2l0eik6IGRpc2FibGUgdGhpcyB0ZXN0IGJ5IGxvb2tpbmcgZm9yIGV4dHJhIGxhcmdmaWxlIHJlc291cmNlCisjIHdoaWNoIGRvZXNuJ3QgZXhpc3QuICBUaGlzIHRlc3QgdGFrZXMgb3ZlciAzMCBtaW51dGVzIHRvIHJ1biBpbiBnZW5lcmFsCisjIGFuZCByZXF1aXJlcyBtb3JlIGRpc2sgc3BhY2UgdGhhbiBtb3N0IG9mIHRoZSBidWlsZGJvdHMuCit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoCisgICAgICAgICdleHRyYWxhcmdlZmlsZScsCisgICAgICAgICd0ZXN0IHJlcXVpcmVzIGxvYWRzIG9mIGRpc2stc3BhY2UgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lIHRvIHJ1bicKKyAgICApCisKKyMgV2UgY2FuIHRlc3QgcGFydCBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgemxpYi4KK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK2ltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3lzCisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CisKK1RFU1RGTjIgPSBURVNURk4gKyAiMiIKKworIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgY2FuIHBhc3MgYmVmb3JlIHdlIHByaW50IGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCitfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA1ICogNjAKKworY2xhc3MgVGVzdHNXaXRoU291cmNlRmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSB0ZXN0IGRhdGEuCisgICAgICAgICMgeHJhbmdlKCkgaXMgaW1wb3J0YW50IGhlcmUgLS0gZG9uJ3Qgd2FudCB0byBjcmVhdGUgaW1tb3J0YWwgc3BhY2UKKyAgICAgICAgIyBmb3IgYSBtaWxsaW9uIGludHMuCisgICAgICAgIGxpbmVfZ2VuID0gKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSBmb3IgaSBpbiB4cmFuZ2UoMTAwMDAwMCkpCisgICAgICAgIHNlbGYuZGF0YSA9ICdcbicuam9pbihsaW5lX2dlbikKKworICAgICAgICAjIEFuZCB3cml0ZSBpdCB0byBhIGZpbGUuCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICJ3YiIpCisgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHppcFRlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUuCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQ9VHJ1ZSkKKworICAgICAgICAjIEl0IHdpbGwgY29udGFpbiBlbm91Z2ggY29waWVzIG9mIHNlbGYuZGF0YSB0byByZWFjaCBhYm91dCA2R0Igb2YKKyAgICAgICAgIyByYXcgZGF0YSB0byBzdG9yZS4KKyAgICAgICAgZmlsZWNvdW50ID0gNioxMDI0KiozIC8vIGxlbihzZWxmLmRhdGEpCisKKyAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShmaWxlY291bnQpOgorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInRlc3RmbiVkIiAlIG51bSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICAgICcgIHppcFRlc3Qgc3RpbGwgd3JpdGluZyAlZCBvZiAlZCwgYmUgcGF0aWVudC4uLicgJQorICAgICAgICAgICAgICAgICAgIChudW0sIGZpbGVjb3VudCkpCisgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGZpbGVjb3VudCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoInRlc3RmbiVkIiAlIG51bSksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgICMgUHJpbnQgc3RpbGwgd29ya2luZyBtZXNzYWdlIHNpbmNlIHRoaXMgdGVzdCBjYW4gYmUgcmVhbGx5IHNsb3cKKyAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sICgKKyAgICAgICAgICAgICAgICAgICAnICB6aXBUZXN0IHN0aWxsIHJlYWRpbmcgJWQgb2YgJWQsIGJlIHBhdGllbnQuLi4nICUKKyAgICAgICAgICAgICAgICAgICAobnVtLCBmaWxlY291bnQpKQorICAgICAgICAgICAgICAgIHN5cy5fX3N0ZG91dF9fLmZsdXNoKCkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RTdG9yZWQoc2VsZik6CisgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgIyBnaWdhYnl0ZXMgb2YgZGlzayBzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgorICAgICAgICBmb3IgZiBpbiBUZW1wb3JhcnlGaWxlKCksIFRFU1RGTjI6CisgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgaWYgemxpYjoKKyAgICAgICAgZGVmIHRlc3REZWZsYXRlZChzZWxmKToKKyAgICAgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgICAgICMgZ2lnYWJ5dGVzIG9mIGRpc2sgc3BhY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KKyAgICAgICAgICAgIGZvciBmIGluIFRlbXBvcmFyeUZpbGUoKSwgVEVTVEZOMjoKKyAgICAgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBURVNURk4sIFRFU1RGTjI6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCBjY2JjOGZkLi40NDQwOTQyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0zMDIsNjMgKzMwMiw2NSBAQAogICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby5mbHVzaCgpLCAiIikgIyBSZXR1cm5zIG5vdGhpbmcKIAotICAgIGRlZiB0ZXN0X2NvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKLSAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKLSAgICAgICAgZGF0YTEgPSBIQU1MRVRfU0NFTkUuc3dhcGNhc2UoKQotICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCi0gICAgICAgIGJ1ZnMwID0gW10KLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICBpZiBoYXNhdHRyKHpsaWIuY29tcHJlc3NvYmooKSwgImNvcHkiKToKKyAgICAgICAgZGVmIHRlc3RfY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgICAgIGRhdGEwID0gSEFNTEVUX1NDRU5FCisgICAgICAgICAgICBkYXRhMSA9IEhBTUxFVF9TQ0VORS5zd2FwY2FzZSgpCisgICAgICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgICAgICBidWZzMCA9IFtdCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQogCi0gICAgICAgIGMxID0gYzAuY29weSgpCi0gICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KKyAgICAgICAgICAgIGMxID0gYzAuY29weSgpCisgICAgICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCiAKLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKLSAgICAgICAgYnVmczAuYXBwZW5kKGMwLmZsdXNoKCkpCi0gICAgICAgIHMwID0gJycuam9pbihidWZzMCkKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5jb21wcmVzcyhkYXRhMCkpCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuZmx1c2goKSkKKyAgICAgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKIAotICAgICAgICBidWZzMS5hcHBlbmQoYzEuY29tcHJlc3MoZGF0YTEpKQotICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKLSAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorICAgICAgICAgICAgYnVmczEuYXBwZW5kKGMxLmNvbXByZXNzKGRhdGExKSkKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5mbHVzaCgpKQorICAgICAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHMwKSxkYXRhMCtkYXRhMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQogCi0gICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgotICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKLSAgICAgICAgYyA9IHpsaWIuY29tcHJlc3NvYmooKQotICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKLSAgICAgICAgYy5mbHVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGMuY29weSkKKyAgICAgICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgICAgIGMuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYy5jb3B5KQogCi0gICAgZGVmIHRlc3RfZGVjb21wcmVzc2NvcHkoc2VsZik6Ci0gICAgICAgICMgVGVzdCBjb3B5aW5nIGEgZGVjb21wcmVzc2lvbiBvYmplY3QKLSAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORQotICAgICAgICBjb21wID0gemxpYi5jb21wcmVzcyhkYXRhKQorICAgIGlmIGhhc2F0dHIoemxpYi5kZWNvbXByZXNzb2JqKCksICJjb3B5Iik6CisgICAgICAgIGRlZiB0ZXN0X2RlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBkZWNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORQorICAgICAgICAgICAgY29tcCA9IHpsaWIuY29tcHJlc3MoZGF0YSkKIAotICAgICAgICBkMCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgICAgIGJ1ZnMwID0gW10KLSAgICAgICAgYnVmczAuYXBwZW5kKGQwLmRlY29tcHJlc3MoY29tcFs6MzJdKSkKKyAgICAgICAgICAgIGQwID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbOjMyXSkpCiAKLSAgICAgICAgZDEgPSBkMC5jb3B5KCkKLSAgICAgICAgYnVmczEgPSBidWZzMFs6XQorICAgICAgICAgICAgZDEgPSBkMC5jb3B5KCkKKyAgICAgICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KIAotICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzMyOl0pKQotICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzMyOl0pKQorICAgICAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQogCi0gICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCi0gICAgICAgIHMxID0gJycuam9pbihidWZzMSkKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxzMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxzMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAsZGF0YSkKIAotICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgotICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKLSAgICAgICAgZGF0YSA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQotICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKLSAgICAgICAgZC5kZWNvbXByZXNzKGRhdGEpCi0gICAgICAgIGQuZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCisgICAgICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGQuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgZC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCiAKIGRlZiBnZW5ibG9jayhzZWVkLCBsZW5ndGgsIHN0ZXA9MTAyNCwgZ2VuZXJhdG9yPXJhbmRvbSk6CiAgICAgIiIibGVuZ3RoLWJ5dGUgc3RyZWFtIG9mIHJhbmRvbSBkYXRhIGZyb20gYSBzZWVkIChpbiBzdGVwLWJ5dGUgYmxvY2tzKS4iIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXh0d3JhcC5weSBiL0xpYi90ZXh0d3JhcC5weQppbmRleCA3YzY4MjgwLi5jY2ZmMmFiIDEwMDY0NAotLS0gYS9MaWIvdGV4dHdyYXAucHkKKysrIGIvTGliL3RleHR3cmFwLnB5CkBAIC0zMTcsNDEgKzMxNyw1OCBAQAogCiAjIC0tIExvb3NlbHkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorX3doaXRlc3BhY2Vfb25seV9yZSA9IHJlLmNvbXBpbGUoJ15bIFx0XSskJywgcmUuTVVMVElMSU5FKQorX2xlYWRpbmdfd2hpdGVzcGFjZV9yZSA9IHJlLmNvbXBpbGUoJyheWyBcdF0qKSg/OlteIFx0XG5dKScsIHJlLk1VTFRJTElORSkKKwogZGVmIGRlZGVudCh0ZXh0KToKLSAgICAiIiJkZWRlbnQodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nCisgICAgIiIiUmVtb3ZlIGFueSBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZSBpbiBgdGV4dGAuCiAKLSAgICBSZW1vdmUgYW55IHdoaXRlc3BhY2UgdGhhbiBjYW4gYmUgdW5pZm9ybWx5IHJlbW92ZWQgZnJvbSB0aGUgbGVmdAotICAgIG9mIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLgorICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0CisgICAgZWRnZSBvZiB0aGUgZGlzcGxheSwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyB0aGVtIGluIHRoZSBzb3VyY2UgY29kZQorICAgIGluIGluZGVudGVkIGZvcm0uCiAKLSAgICBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoCi0gICAgdGhlIGxlZnQgZWRnZSBvZiBzY3JlZW4vd2hhdGV2ZXIsIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgaXQgaW4gdGhlCi0gICAgc291cmNlIGNvZGUgaW4gaW5kZW50ZWQgZm9ybS4KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgICAgIGRlZiB0ZXN0KCk6Ci0gICAgICAgICAgICAjIGVuZCBmaXJzdCBsaW5lIHdpdGggXCB0byBhdm9pZCB0aGUgZW1wdHkgbGluZSEKLSAgICAgICAgICAgIHMgPSAnJydcCi0gICAgICAgICAgICBoZWxsbwotICAgICAgICAgICAgICB3b3JsZAotICAgICAgICAgICAgJycnCi0gICAgICAgICAgICBwcmludCByZXByKHMpICAgICAgICAgICMgcHJpbnRzICcgICAgaGVsbG9cbiAgICAgIHdvcmxkXG4gICAgJwotICAgICAgICAgICAgcHJpbnQgcmVwcihkZWRlbnQocykpICAjIHByaW50cyAnaGVsbG9cbiAgd29ybGRcbicKKyAgICBOb3RlIHRoYXQgdGFicyBhbmQgc3BhY2VzIGFyZSBib3RoIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSwgYnV0IHRoZXkKKyAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgIiAgaGVsbG8iIGFuZCAiXHRoZWxsbyIgYXJlCisgICAgY29uc2lkZXJlZCB0byBoYXZlIG5vIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuICAoVGhpcyBiZWhhdmlvdXIgaXMKKyAgICBuZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkKKyAgICBleHBhbmRlZCB0YWJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuKQogICAgICIiIgotICAgIGxpbmVzID0gdGV4dC5leHBhbmR0YWJzKCkuc3BsaXQoJ1xuJykKKyAgICAjIExvb2sgZm9yIHRoZSBsb25nZXN0IGxlYWRpbmcgc3RyaW5nIG9mIHNwYWNlcyBhbmQgdGFicyBjb21tb24gdG8KKyAgICAjIGFsbCBsaW5lcy4KICAgICBtYXJnaW4gPSBOb25lCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIGNvbnRlbnQgPSBsaW5lLmxzdHJpcCgpCi0gICAgICAgIGlmIG5vdCBjb250ZW50OgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaW5kZW50ID0gbGVuKGxpbmUpIC0gbGVuKGNvbnRlbnQpCisgICAgdGV4dCA9IF93aGl0ZXNwYWNlX29ubHlfcmUuc3ViKCcnLCB0ZXh0KQorICAgIGluZGVudHMgPSBfbGVhZGluZ193aGl0ZXNwYWNlX3JlLmZpbmRhbGwodGV4dCkKKyAgICBmb3IgaW5kZW50IGluIGluZGVudHM6CiAgICAgICAgIGlmIG1hcmdpbiBpcyBOb25lOgogICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50CisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgbW9yZSBkZWVwbHkgaW5kZW50ZWQgdGhhbiBwcmV2aW91cyB3aW5uZXI6CisgICAgICAgICMgbm8gY2hhbmdlIChwcmV2aW91cyB3aW5uZXIgaXMgc3RpbGwgb24gdG9wKS4KKyAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOgorICAgICAgICAjIGl0J3MgdGhlIG5ldyB3aW5uZXIuCisgICAgICAgIGVsaWYgbWFyZ2luLnN0YXJ0c3dpdGgoaW5kZW50KToKKyAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudAorCisgICAgICAgICMgQ3VycmVudCBsaW5lIGFuZCBwcmV2aW91cyB3aW5uZXIgaGF2ZSBubyBjb21tb24gd2hpdGVzcGFjZToKKyAgICAgICAgIyB0aGVyZSBpcyBubyBtYXJnaW4uCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtYXJnaW4gPSBtaW4obWFyZ2luLCBpbmRlbnQpCisgICAgICAgICAgICBtYXJnaW4gPSAiIgorICAgICAgICAgICAgYnJlYWsKIAotICAgIGlmIG1hcmdpbiBpcyBub3QgTm9uZSBhbmQgbWFyZ2luID4gMDoKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6Ci0gICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldW21hcmdpbjpdCisgICAgIyBzYW5pdHkgY2hlY2sgKHRlc3RpbmcvZGVidWdnaW5nIG9ubHkpCisgICAgaWYgMCBhbmQgbWFyZ2luOgorICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aChtYXJnaW4pLCBcCisgICAgICAgICAgICAgICAgICAgImxpbmUgPSAlciwgbWFyZ2luID0gJXIiICUgKGxpbmUsIG1hcmdpbikKIAotICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCisgICAgaWYgbWFyZ2luOgorICAgICAgICB0ZXh0ID0gcmUuc3ViKHInKD9tKV4nICsgbWFyZ2luLCAnJywgdGV4dCkKKyAgICByZXR1cm4gdGV4dAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICNwcmludCBkZWRlbnQoIlx0Zm9vXG5cdGJhciIpCisgICAgI3ByaW50IGRlZGVudCgiICBcdGhlbGxvIHRoZXJlXG4gIFx0ICBob3cgYXJlIHlvdT8iKQorICAgIHByaW50IGRlZGVudCgiSGVsbG8gdGhlcmUuXG4gIFRoaXMgaXMgaW5kZW50ZWQuIikKZGlmZiAtLWdpdCBhL0xpYi90aHJlYWRpbmcucHkgYi9MaWIvdGhyZWFkaW5nLnB5CmluZGV4IGMyNzE0MGQuLjU2NTVkZGUgMTAwNjQ0Ci0tLSBhL0xpYi90aHJlYWRpbmcucHkKKysrIGIvTGliL3RocmVhZGluZy5weQpAQCAtMTUsNyArMTUsNyBAQAogIyBSZW5hbWUgc29tZSBzdHVmZiBzbyAiZnJvbSB0aHJlYWRpbmcgaW1wb3J0ICoiIGlzIHNhZmUKIF9fYWxsX18gPSBbJ2FjdGl2ZUNvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50VGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCiAgICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsCi0gICAgICAgICAgICdUaW1lcicsICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJ10KKyAgICAgICAgICAgJ1RpbWVyJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCiAKIF9zdGFydF9uZXdfdGhyZWFkID0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKIF9hbGxvY2F0ZV9sb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2sKQEAgLTcxMyw2ICs3MTMsOCBAQAogICAgIF9hY3RpdmVfbGltYm9fbG9jay5yZWxlYXNlKCkKICAgICByZXR1cm4gYWN0aXZlCiAKK2Zyb20gdGhyZWFkIGltcG9ydCBzdGFja19zaXplCisKICMgQ3JlYXRlIHRoZSBtYWluIHRocmVhZCBvYmplY3QKIAogX01haW5UaHJlYWQoKQpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlLnB5IGIvTGliL3RyYWNlLnB5CmluZGV4IGNhNjI5NGUuLmRiMzZlMWQgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZS5weQorKysgYi9MaWIvdHJhY2UucHkKQEAgLTI4NSw3ICsyODUsNyBAQAogICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gIjxzdHJpbmc+IjoKICAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnB5YyIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIucHlvIik6CisgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKToKICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KIAogICAgICAgICAgICAgaWYgY292ZXJkaXIgaXMgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi90cmFjZWJhY2sucHkgYi9MaWIvdHJhY2ViYWNrLnB5CmluZGV4IGY1YzRiMjkuLmVmZDBmNzUgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZWJhY2sucHkKKysrIGIvTGliL3RyYWNlYmFjay5weQpAQCAtMTUwLDUwICsxNTAsNTMgQEAKIAogICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBleGNlcHRpb24gdHlwZSBhbmQgdmFsdWUgc3VjaCBhcyBnaXZlbiBieQogICAgIHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZgotICAgIHN0cmluZ3MsIGVhY2ggZW5kaW5nIGluIGEgbmV3bGluZS4gIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhCi0gICAgc2luZ2xlIHN0cmluZzsgaG93ZXZlciwgZm9yIFN5bnRheEVycm9yIGV4Y2VwdGlvbnMsIGl0IGNvbnRhaW5zCi0gICAgc2V2ZXJhbCBsaW5lcyB0aGF0ICh3aGVuIHByaW50ZWQpIGRpc3BsYXkgZGV0YWlsZWQgaW5mb3JtYXRpb24KLSAgICBhYm91dCB3aGVyZSB0aGUgc3ludGF4IGVycm9yIG9jY3VycmVkLiAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZwotICAgIHdoaWNoIGV4Y2VwdGlvbiBvY2N1cnJlZCBpcyB0aGUgYWx3YXlzIGxhc3Qgc3RyaW5nIGluIHRoZSBsaXN0LgorICAgIHN0cmluZ3MsIGVhY2ggZW5kaW5nIGluIGEgbmV3bGluZS4KKworICAgIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhIHNpbmdsZSBzdHJpbmc7IGhvd2V2ZXIsIGZvcgorICAgIFN5bnRheEVycm9yIGV4Y2VwdGlvbnMsIGl0IGNvbnRhaW5zIHNldmVyYWwgbGluZXMgdGhhdCAod2hlbgorICAgIHByaW50ZWQpIGRpc3BsYXkgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIHN5bnRheAorICAgIGVycm9yIG9jY3VycmVkLgorCisgICAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24gb2NjdXJyZWQgaXMgYWx3YXlzIHRoZSBsYXN0CisgICAgc3RyaW5nIGluIHRoZSBsaXN0LgorCiAgICAgIiIiCi0gICAgbGlzdCA9IFtdCi0gICAgaWYgKHR5cGUoZXR5cGUpID09IHR5cGVzLkNsYXNzVHlwZQotICAgICAgICBvciAoaXNpbnN0YW5jZShldHlwZSwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXR5cGUsIEJhc2VFeGNlcHRpb24pKSk6Ci0gICAgICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KKworICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KKworICAgIGlmIG5vdCBpc3N1YmNsYXNzKGV0eXBlLCBTeW50YXhFcnJvcik6CisgICAgICAgIHJldHVybiBbX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpXQorCisgICAgIyBJdCB3YXMgYSBzeW50YXggZXJyb3I7IHNob3cgZXhhY3RseSB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZm91bmQuCisgICAgbGluZXMgPSBbXQorICAgIHRyeToKKyAgICAgICAgbXNnLCAoZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBiYWRsaW5lKSA9IHZhbHVlCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcwogICAgIGVsc2U6Ci0gICAgICAgIHN0eXBlID0gZXR5cGUKLSAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICBsaXN0LmFwcGVuZChzdHIoc3R5cGUpICsgJ1xuJykKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSBvciAiPHN0cmluZz4iCisgICAgICAgIGxpbmVzLmFwcGVuZCgnICBGaWxlICIlcyIsIGxpbmUgJWRcbicgJSAoZmlsZW5hbWUsIGxpbmVubykpCisgICAgICAgIGlmIGJhZGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAlc1xuJyAlIGJhZGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZVs6b2Zmc2V0XS5sc3RyaXAoKQorICAgICAgICAgICAgICAgICMgbm9uLXNwYWNlIHdoaXRlc3BhY2UgKGxpa2VzIHRhYnMpIG11c3QgYmUga2VwdCBmb3IgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgY2FyZXRzcGFjZSA9ICgoYy5pc3NwYWNlKCkgYW5kIGMgb3IgJyAnKSBmb3IgYyBpbiBjYXJldHNwYWNlKQorICAgICAgICAgICAgICAgICMgb25seSB0aHJlZSBzcGFjZXMgdG8gYWNjb3VudCBmb3Igb2Zmc2V0MSA9PSBwb3MgMAorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgJXNeXG4nICUgJycuam9pbihjYXJldHNwYWNlKSkKKyAgICAgICAgICAgIHZhbHVlID0gbXNnCisKKyAgICBsaW5lcy5hcHBlbmQoX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpKQorICAgIHJldHVybiBsaW5lcworCitkZWYgX2Zvcm1hdF9maW5hbF9leGNfbGluZShldHlwZSwgdmFsdWUpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYSBzaW5nbGUgbGluZSAtLSBub3JtYWwgY2FzZSBmb3IgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5IiIiCisgICAgdmFsdWVzdHIgPSBfc29tZV9zdHIodmFsdWUpCisgICAgaWYgdmFsdWUgaXMgTm9uZSBvciBub3QgdmFsdWVzdHI6CisgICAgICAgIGxpbmUgPSAiJXNcbiIgJSBldHlwZQogICAgIGVsc2U6Ci0gICAgICAgIGlmIGlzc3ViY2xhc3MoZXR5cGUsIFN5bnRheEVycm9yKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gdmFsdWUKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZTogZmlsZW5hbWUgPSAiPHN0cmluZz4iCi0gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoJyAgRmlsZSAiJXMiLCBsaW5lICVkXG4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsIGxpbmVubykpCi0gICAgICAgICAgICAgICAgaWYgbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgaSA8IGxlbihsaW5lKSBhbmQgbGluZVtpXS5pc3NwYWNlKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKCcgICAgJXNcbicgJSBsaW5lLnN0cmlwKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnICAgICcKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGxpbmVbaTpvZmZzZXQtMV06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYy5pc3NwYWNlKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgJyAnCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZCgnJXNeXG4nICUgcykKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtc2cKLSAgICAgICAgcyA9IF9zb21lX3N0cih2YWx1ZSkKLSAgICAgICAgaWYgczoKLSAgICAgICAgICAgIGxpc3QuYXBwZW5kKCclczogJXNcbicgJSAoc3RyKHN0eXBlKSwgcykpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsaXN0LmFwcGVuZCgnJXNcbicgJSBzdHIoc3R5cGUpKQotICAgIHJldHVybiBsaXN0CisgICAgICAgIGxpbmUgPSAiJXM6ICVzXG4iICUgKGV0eXBlLCB2YWx1ZXN0cikKKyAgICByZXR1cm4gbGluZQogCiBkZWYgX3NvbWVfc3RyKHZhbHVlKToKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdHlwZXMucHkgYi9MaWIvdHlwZXMucHkKaW5kZXggZGI2M2M5Ni4uNWE4OWFkMSAxMDA2NDQKLS0tIGEvTGliL3R5cGVzLnB5CisrKyBiL0xpYi90eXBlcy5weQpAQCAtODQsNCArODQsMTYgQEAKIERpY3RQcm94eVR5cGUgPSB0eXBlKFR5cGVUeXBlLl9fZGljdF9fKQogTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZCkKIAotZGVsIHN5cywgX2YsIF9nLCBfQyAgICAgICAgICAgICAgICAgIyBOb3QgZm9yIGV4cG9ydAorIyBFeHRlbnNpb24gdHlwZXMgZGVmaW5lZCBpbiBhIEMgaGVscGVyIG1vZHVsZS4gIFhYWCBUaGVyZSBtYXkgYmUgbm8KKyMgZXF1aXZhbGVudCBpbiBpbXBsZW1lbnRhdGlvbnMgb3RoZXIgdGhhbiBDUHl0aG9uLCBzbyBpdCBzZWVtcyBiZXR0ZXIgdG8KKyMgbGVhdmUgdGhlbSB1bmRlZmluZWQgdGhlbiB0byBzZXQgdGhlbSB0byBlLmcuIE5vbmUuCit0cnk6CisgICAgaW1wb3J0IF90eXBlcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgR2V0U2V0RGVzY3JpcHRvclR5cGUgPSB0eXBlKF90eXBlcy5IZWxwZXIuZ2V0dGVyKQorICAgIE1lbWJlckRlc2NyaXB0b3JUeXBlID0gdHlwZShfdHlwZXMuSGVscGVyLm1lbWJlcikKKyAgICBkZWwgX3R5cGVzCisKK2RlbCBzeXMsIF9mLCBfZywgX0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZm9yIGV4cG9ydApkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggZjBhZTUzYS4uZDJhNGM0OCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgICAgc2VsZi5wcm94aWVzID0gcHJveGllcwogICAgICAgICBzZWxmLmtleV9maWxlID0geDUwOS5nZXQoJ2tleV9maWxlJykKICAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSB4NTA5LmdldCgnY2VydF9maWxlJykKLSAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1hZ2VudCcsIHNlbGYudmVyc2lvbildCisgICAgICAgIHNlbGYuYWRkaGVhZGVycyA9IFsoJ1VzZXItQWdlbnQnLCBzZWxmLnZlcnNpb24pXQogICAgICAgICBzZWxmLl9fdGVtcGZpbGVzID0gW10KICAgICAgICAgc2VsZi5fX3VubGluayA9IG9zLnVubGluayAjIFNlZSBjbGVhbnVwKCkKICAgICAgICAgc2VsZi50ZW1wY2FjaGUgPSBOb25lCkBAIC0zMTQsOCArMzE0LDggQEAKICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUChob3N0KQogICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZWN0b3IpCi0gICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCi0gICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQorICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKQorICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGgucHV0cmVxdWVzdCgnR0VUJywgc2VsZWN0b3IpCiAgICAgICAgIGlmIHByb3h5X2F1dGg6IGgucHV0aGVhZGVyKCdQcm94eS1BdXRob3JpemF0aW9uJywgJ0Jhc2ljICVzJyAlIHByb3h5X2F1dGgpCkBAIC00MDAsOSArNDAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRfZmlsZSkKICAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScsCisgICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCi0gICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKKyAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ0dFVCcsIHNlbGVjdG9yKQogICAgICAgICAgICAgaWYgcHJveHlfYXV0aDogaC5wdXRoZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb246IEJhc2ljICVzJyAlIHByb3h5X2F1dGgpCkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkYXRhID0gdW5xdW90ZShkYXRhKQotICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LWxlbmd0aDogJWQnICUgbGVuKGRhdGEpKQorICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LUxlbmd0aDogJWQnICUgbGVuKGRhdGEpKQogICAgICAgICBtc2cuYXBwZW5kKCcnKQogICAgICAgICBtc2cuYXBwZW5kKGRhdGEpCiAgICAgICAgIG1zZyA9ICdcbicuam9pbihtc2cpCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDIyNzMxMWMuLjZlZTllMmMgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC0yNjMsMTEgKzI2MywxMSBAQAogCiAgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICAjIHVzZWZ1bCBmb3Igc29tZXRoaW5nIGxpa2UgYXV0aGVudGljYXRpb24KLSAgICAgICAgc2VsZi5oZWFkZXJzW2tleS5jYXBpdGFsaXplKCldID0gdmFsCisgICAgICAgIHNlbGYuaGVhZGVyc1trZXkudGl0bGUoKV0gPSB2YWwKIAogICAgIGRlZiBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgICMgd2lsbCBub3QgYmUgYWRkZWQgdG8gYSByZWRpcmVjdGVkIHJlcXVlc3QKLSAgICAgICAgc2VsZi51bnJlZGlyZWN0ZWRfaGRyc1trZXkuY2FwaXRhbGl6ZSgpXSA9IHZhbAorICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzW2tleS50aXRsZSgpXSA9IHZhbAogCiAgICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgaGVhZGVyX25hbWUpOgogICAgICAgICByZXR1cm4gKGhlYWRlcl9uYW1lIGluIHNlbGYuaGVhZGVycyBvcgpAQCAtMjg2LDcgKzI4Niw3IEBACiBjbGFzcyBPcGVuZXJEaXJlY3RvcjoKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIGNsaWVudF92ZXJzaW9uID0gIlB5dGhvbi11cmxsaWIvJXMiICUgX192ZXJzaW9uX18KLSAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1hZ2VudCcsIGNsaWVudF92ZXJzaW9uKV0KKyAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1BZ2VudCcsIGNsaWVudF92ZXJzaW9uKV0KICAgICAgICAgIyBtYW5hZ2UgdGhlIGluZGl2aWR1YWwgaGFuZGxlcnMKICAgICAgICAgc2VsZi5oYW5kbGVycyA9IFtdCiAgICAgICAgIHNlbGYuaGFuZGxlX29wZW4gPSB7fQpAQCAtNjc1LDcgKzY3NSw3IEBACiAgICAgICAgIGlmIHVzZXIgYW5kIHBhc3N3b3JkOgogICAgICAgICAgICAgdXNlcl9wYXNzID0gJyVzOiVzJyAlICh1bnF1b3RlKHVzZXIpLCB1bnF1b3RlKHBhc3N3b3JkKSkKICAgICAgICAgICAgIGNyZWRzID0gYmFzZTY0LmVuY29kZXN0cmluZyh1c2VyX3Bhc3MpLnN0cmlwKCkKLSAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1hdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBjcmVkcykKKyAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1BdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBjcmVkcykKICAgICAgICAgaG9zdHBvcnQgPSB1bnF1b3RlKGhvc3Rwb3J0KQogICAgICAgICByZXEuc2V0X3Byb3h5KGhvc3Rwb3J0LCBwcm94eV90eXBlKQogICAgICAgICBpZiBvcmlnX3R5cGUgPT0gcHJveHlfdHlwZToKQEAgLTgxOSw3ICs4MTksNyBAQAogCiBjbGFzcyBQcm94eUJhc2ljQXV0aEhhbmRsZXIoQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyLCBCYXNlSGFuZGxlcik6CiAKLSAgICBhdXRoX2hlYWRlciA9ICdQcm94eS1hdXRob3JpemF0aW9uJworICAgIGF1dGhfaGVhZGVyID0gJ1Byb3h5LUF1dGhvcml6YXRpb24nCiAKICAgICBkZWYgaHR0cF9lcnJvcl80MDcoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKICAgICAgICAgIyBodHRwX2Vycm9yX2F1dGhfcmVxZWQgcmVxdWlyZXMgdGhhdCB0aGVyZSBpcyBubyB1c2VyaW5mbyBjb21wb25lbnQgaW4KQEAgLTEwMjIsMjAgKzEwMjIsMjAgQEAKIAogICAgICAgICBpZiByZXF1ZXN0Lmhhc19kYXRhKCk6ICAjIFBPU1QKICAgICAgICAgICAgIGRhdGEgPSByZXF1ZXN0LmdldF9kYXRhKCkKLSAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtdHlwZScpOgorICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC1UeXBlJyk6CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZScsCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnLAogICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKLSAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJyk6CisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LUxlbmd0aCcpOgogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCiAKICAgICAgICAgc2NoZW1lLCBzZWwgPSBzcGxpdHR5cGUocmVxdWVzdC5nZXRfc2VsZWN0b3IoKSkKICAgICAgICAgc2VsX2hvc3QsIHNlbF9wYXRoID0gc3BsaXRob3N0KHNlbCkKICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignSG9zdCcpOgogICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcignSG9zdCcsIHNlbF9ob3N0IG9yIGhvc3QpCiAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZWxmLnBhcmVudC5hZGRoZWFkZXJzOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICBuYW1lID0gbmFtZS50aXRsZSgpCiAgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKG5hbWUpOgogICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIobmFtZSwgdmFsdWUpCiAKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAgICAgICAgIG1vZGlmaWVkID0gZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZShzdGF0cy5zdF9tdGltZSwgdXNlZ210PVRydWUpCiAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZSlbMF0KICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKAotICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZTogJXNcbkNvbnRlbnQtbGVuZ3RoOiAlZFxuTGFzdC1tb2RpZmllZDogJXNcbicgJQorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXNcbkNvbnRlbnQtTGVuZ3RoOiAlZFxuTGFzdC1Nb2RpZmllZDogJXNcbicgJQogICAgICAgICAgICAgKG10eXBlIG9yICd0ZXh0L3BsYWluJywgc2l6ZSwgbW9kaWZpZWQpKSkKICAgICAgICAgaWYgaG9zdDoKICAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKQEAgLTEyNzIsOSArMTI3Miw5IEBACiAgICAgICAgICAgICBoZWFkZXJzID0gIiIKICAgICAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUocmVxLmdldF9mdWxsX3VybCgpKVswXQogICAgICAgICAgICAgaWYgbXR5cGU6Ci0gICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC10eXBlOiAlc1xuIiAlIG10eXBlCisgICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1UeXBlOiAlc1xuIiAlIG10eXBlCiAgICAgICAgICAgICBpZiByZXRybGVuIGlzIG5vdCBOb25lIGFuZCByZXRybGVuID49IDA6Ci0gICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1sZW5ndGg6ICVkXG4iICUgcmV0cmxlbgorICAgICAgICAgICAgICAgIGhlYWRlcnMgKz0gIkNvbnRlbnQtTGVuZ3RoOiAlZFxuIiAlIHJldHJsZW4KICAgICAgICAgICAgIHNmID0gU3RyaW5nSU8oaGVhZGVycykKICAgICAgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShzZikKICAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCmRpZmYgLS1naXQgYS9MaWIvdXVpZC5weSBiL0xpYi91dWlkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdXVpZC5weQpAQCAtMCwwICsxLDUxNSBAQAorciIiIlVVSUQgb2JqZWN0cyAodW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzKSBhY2NvcmRpbmcgdG8gUkZDIDQxMjIuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGltbXV0YWJsZSBVVUlEIG9iamVjdHMgKGNsYXNzIFVVSUQpIGFuZCB0aGUgZnVuY3Rpb25zCit1dWlkMSgpLCB1dWlkMygpLCB1dWlkNCgpLCB1dWlkNSgpIGZvciBnZW5lcmF0aW5nIHZlcnNpb24gMSwgMywgNCwgYW5kIDUKK1VVSURzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMi4KKworSWYgYWxsIHlvdSB3YW50IGlzIGEgdW5pcXVlIElELCB5b3Ugc2hvdWxkIHByb2JhYmx5IGNhbGwgdXVpZDEoKSBvciB1dWlkNCgpLgorTm90ZSB0aGF0IHV1aWQxKCkgbWF5IGNvbXByb21pc2UgcHJpdmFjeSBzaW5jZSBpdCBjcmVhdGVzIGEgVVVJRCBjb250YWluaW5nCit0aGUgY29tcHV0ZXIncyBuZXR3b3JrIGFkZHJlc3MuICB1dWlkNCgpIGNyZWF0ZXMgYSByYW5kb20gVVVJRC4KKworVHlwaWNhbCB1c2FnZToKKworICAgID4+PiBpbXBvcnQgdXVpZAorCisgICAgIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCisgICAgPj4+IHV1aWQudXVpZDEoKQorICAgIFVVSUQoJ2E4MDk4YzFhLWY4NmUtMTFkYS1iZDFhLTAwMTEyNDQ0YmUxZScpCisKKyAgICAjIG1ha2UgYSBVVUlEIHVzaW5nIGFuIE1ENSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQorICAgID4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorICAgIFVVSUQoJzZmYTQ1OWVhLWVlOGEtM2NhNC04OTRlLWRiNzdlMTYwMzU1ZScpCisKKyAgICAjIG1ha2UgYSByYW5kb20gVVVJRAorICAgID4+PiB1dWlkLnV1aWQ0KCkKKyAgICBVVUlEKCcxNmZkMjcwNi04YmFmLTQzM2ItODJlYi04YzdmYWRhODQ3ZGEnKQorCisgICAgIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCisgICAgPj4+IHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCisgICAgVVVJRCgnODg2MzEzZTEtM2I4YS01MzcyLTliOTAtMGM5YWVlMTk5ZTVkJykKKworICAgICMgbWFrZSBhIFVVSUQgZnJvbSBhIHN0cmluZyBvZiBoZXggZGlnaXRzIChicmFjZXMgYW5kIGh5cGhlbnMgaWdub3JlZCkKKyAgICA+Pj4geCA9IHV1aWQuVVVJRCgnezAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZn0nKQorCisgICAgIyBjb252ZXJ0IGEgVVVJRCB0byBhIHN0cmluZyBvZiBoZXggZGlnaXRzIGluIHN0YW5kYXJkIGZvcm0KKyAgICA+Pj4gc3RyKHgpCisgICAgJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicKKworICAgICMgZ2V0IHRoZSByYXcgMTYgYnl0ZXMgb2YgdGhlIFVVSUQKKyAgICA+Pj4geC5ieXRlcworICAgICdceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuXHgwYlx4MGNcclx4MGVceDBmJworCisgICAgIyBtYWtlIGEgVVVJRCBmcm9tIGEgMTYtYnl0ZSBzdHJpbmcKKyAgICA+Pj4gdXVpZC5VVUlEKGJ5dGVzPXguYnl0ZXMpCisgICAgVVVJRCgnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJykKKyIiIgorCitfX2F1dGhvcl9fID0gJ0thLVBpbmcgWWVlIDxwaW5nQHplc3R5LmNhPicKK19fZGF0ZV9fID0gJyREYXRlOiAyMDA2LzA2LzEyIDIzOjE1OjQwICQnLnNwbGl0KClbMV0ucmVwbGFjZSgnLycsICctJykKK19fdmVyc2lvbl9fID0gJyRSZXZpc2lvbjogMS4zMCAkJy5zcGxpdCgpWzFdCisKK1JFU0VSVkVEX05DUywgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgUkVTRVJWRURfRlVUVVJFID0gWworICAgICdyZXNlcnZlZCBmb3IgTkNTIGNvbXBhdGliaWxpdHknLCAnc3BlY2lmaWVkIGluIFJGQyA0MTIyJywKKyAgICAncmVzZXJ2ZWQgZm9yIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5JywgJ3Jlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbiddCisKK2NsYXNzIFVVSUQob2JqZWN0KToKKyAgICAiIiJJbnN0YW5jZXMgb2YgdGhlIFVVSUQgY2xhc3MgcmVwcmVzZW50IFVVSURzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMi4KKyAgICBVVUlEIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgaGFzaGFibGUsIGFuZCB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgorICAgIENvbnZlcnRpbmcgYSBVVUlEIHRvIGEgc3RyaW5nIHdpdGggc3RyKCkgeWllbGRzIHNvbWV0aGluZyBpbiB0aGUgZm9ybQorICAgICcxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMnLiAgVGhlIFVVSUQgY29uc3RydWN0b3IgYWNjZXB0cworICAgIGZvdXIgcG9zc2libGUgZm9ybXM6IGEgc2ltaWxhciBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLCBvciBhCisgICAgc3RyaW5nIG9mIDE2IHJhdyBieXRlcyBhcyBhbiBhcmd1bWVudCBuYW1lZCAnYnl0ZXMnLCBvciBhIHR1cGxlIG9mCisgICAgc2l4IGludGVnZXIgZmllbGRzICh3aXRoIDMyLWJpdCwgMTYtYml0LCAxNi1iaXQsIDgtYml0LCA4LWJpdCwgYW5kCisgICAgNDgtYml0IHZhbHVlcyByZXNwZWN0aXZlbHkpIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdmaWVsZHMnLCBvciBhIHNpbmdsZQorICAgIDEyOC1iaXQgaW50ZWdlciBhcyBhbiBhcmd1bWVudCBuYW1lZCAnaW50Jy4KKworICAgIFVVSURzIGhhdmUgdGhlc2UgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6CisKKyAgICAgICAgYnl0ZXMgICAgICAgdGhlIFVVSUQgYXMgYSAxNi1ieXRlIHN0cmluZworCisgICAgICAgIGZpZWxkcyAgICAgIGEgdHVwbGUgb2YgdGhlIHNpeCBpbnRlZ2VyIGZpZWxkcyBvZiB0aGUgVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIGFsc28gYXZhaWxhYmxlIGFzIHNpeCBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIHR3byBkZXJpdmVkIGF0dHJpYnV0ZXM6CisKKyAgICAgICAgICAgIHRpbWVfbG93ICAgICAgICAgICAgICAgIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX21pZCAgICAgICAgICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX2hpX3ZlcnNpb24gICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCAgICB0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIGNsb2NrX3NlcV9sb3cgICAgICAgICAgIHRoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgbm9kZSAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgNDggYml0cyBvZiB0aGUgVVVJRAorCisgICAgICAgICAgICB0aW1lICAgICAgICAgICAgICAgICAgICB0aGUgNjAtYml0IHRpbWVzdGFtcAorICAgICAgICAgICAgY2xvY2tfc2VxICAgICAgICAgICAgICAgdGhlIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXIKKworICAgICAgICBoZXggICAgICAgICB0aGUgVVVJRCBhcyBhIDMyLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcKKworICAgICAgICBpbnQgICAgICAgICB0aGUgVVVJRCBhcyBhIDEyOC1iaXQgaW50ZWdlcgorCisgICAgICAgIHVybiAgICAgICAgIHRoZSBVVUlEIGFzIGEgVVJOIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMgorCisgICAgICAgIHZhcmlhbnQgICAgIHRoZSBVVUlEIHZhcmlhbnQgKG9uZSBvZiB0aGUgY29uc3RhbnRzIFJFU0VSVkVEX05DUywKKyAgICAgICAgICAgICAgICAgICAgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgb3IgUkVTRVJWRURfRlVUVVJFKQorCisgICAgICAgIHZlcnNpb24gICAgIHRoZSBVVUlEIHZlcnNpb24gbnVtYmVyICgxIHRocm91Z2ggNSwgbWVhbmluZ2Z1bCBvbmx5CisgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHZhcmlhbnQgaXMgUkZDXzQxMjIpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGV4PU5vbmUsIGJ5dGVzPU5vbmUsIGZpZWxkcz1Ob25lLCBpbnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1Ob25lKToKKyAgICAgICAgciIiIkNyZWF0ZSBhIFVVSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb2YgMzIgaGV4YWRlY2ltYWwgZGlnaXRzLAorICAgICAgICBhIHN0cmluZyBvZiAxNiBieXRlcyBhcyB0aGUgJ2J5dGVzJyBhcmd1bWVudCwgYSB0dXBsZSBvZiBzaXgKKyAgICAgICAgaW50ZWdlcnMgKDMyLWJpdCB0aW1lX2xvdywgMTYtYml0IHRpbWVfbWlkLCAxNi1iaXQgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICA4LWJpdCBjbG9ja19zZXFfaGlfdmFyaWFudCwgOC1iaXQgY2xvY2tfc2VxX2xvdywgNDgtYml0IG5vZGUpIGFzCisgICAgICAgIHRoZSAnZmllbGRzJyBhcmd1bWVudCwgb3IgYSBzaW5nbGUgMTI4LWJpdCBpbnRlZ2VyIGFzIHRoZSAnaW50JworICAgICAgICBhcmd1bWVudC4gIFdoZW4gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpcyBnaXZlbiwgY3VybHkgYnJhY2VzLAorICAgICAgICBoeXBoZW5zLCBhbmQgYSBVUk4gcHJlZml4IGFyZSBhbGwgb3B0aW9uYWwuICBGb3IgZXhhbXBsZSwgdGhlc2UKKyAgICAgICAgZXhwcmVzc2lvbnMgYWxsIHlpZWxkIHRoZSBzYW1lIFVVSUQ6CisKKyAgICAgICAgVVVJRCgnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nKQorICAgICAgICBVVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoYnl0ZXM9J1x4MTJceDM0XHg1Nlx4NzgnKjQpCisgICAgICAgIFVVSUQoZmllbGRzPSgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpKQorICAgICAgICBVVUlEKGludD0weDEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4KQorCisgICAgICAgIEV4YWN0bHkgb25lIG9mICdoZXgnLCAnYnl0ZXMnLCAnZmllbGRzJywgb3IgJ2ludCcgbXVzdCBiZSBnaXZlbi4KKyAgICAgICAgVGhlICd2ZXJzaW9uJyBhcmd1bWVudCBpcyBvcHRpb25hbDsgaWYgZ2l2ZW4sIHRoZSByZXN1bHRpbmcgVVVJRAorICAgICAgICB3aWxsIGhhdmUgaXRzIHZhcmlhbnQgYW5kIHZlcnNpb24gbnVtYmVyIHNldCBhY2NvcmRpbmcgdG8gUkZDIDQxMjIsCisgICAgICAgIG92ZXJyaWRpbmcgYml0cyBpbiB0aGUgZ2l2ZW4gJ2hleCcsICdieXRlcycsICdmaWVsZHMnLCBvciAnaW50Jy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgW2hleCwgYnl0ZXMsIGZpZWxkcywgaW50XS5jb3VudChOb25lKSAhPSAzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCduZWVkIGp1c3Qgb25lIG9mIGhleCwgYnl0ZXMsIGZpZWxkcywgb3IgaW50JykKKyAgICAgICAgaWYgaGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaGV4ID0gaGV4LnJlcGxhY2UoJ3VybjonLCAnJykucmVwbGFjZSgndXVpZDonLCAnJykKKyAgICAgICAgICAgIGhleCA9IGhleC5zdHJpcCgne30nKS5yZXBsYWNlKCctJywgJycpCisgICAgICAgICAgICBpZiBsZW4oaGV4KSAhPSAzMjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdiYWRseSBmb3JtZWQgaGV4YWRlY2ltYWwgVVVJRCBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZyhoZXgsIDE2KQorICAgICAgICBpZiBieXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihieXRlcykgIT0gMTY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYnl0ZXMgaXMgbm90IGEgMTYtY2hhciBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZygoJyUwMngnKjE2KSAlIHR1cGxlKG1hcChvcmQsIGJ5dGVzKSksIDE2KQorICAgICAgICBpZiBmaWVsZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oZmllbGRzKSAhPSA2OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkcyBpcyBub3QgYSA2LXR1cGxlJykKKyAgICAgICAgICAgICh0aW1lX2xvdywgdGltZV9taWQsIHRpbWVfaGlfdmVyc2lvbiwKKyAgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCwgY2xvY2tfc2VxX2xvdywgbm9kZSkgPSBmaWVsZHMKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHRpbWVfbG93IDwgMTw8MzJMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDEgb3V0IG9mIHJhbmdlIChuZWVkIGEgMzItYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSB0aW1lX21pZCA8IDE8PDE2TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCAyIG91dCBvZiByYW5nZSAobmVlZCBhIDE2LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gdGltZV9oaV92ZXJzaW9uIDwgMTw8MTZMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTYtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfaGlfdmFyaWFudCA8IDE8PDhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDQgb3V0IG9mIHJhbmdlIChuZWVkIGFuIDgtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfbG93IDwgMTw8OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNSBvdXQgb2YgcmFuZ2UgKG5lZWQgYW4gOC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IG5vZGUgPCAxPDw0OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNiBvdXQgb2YgcmFuZ2UgKG5lZWQgYSA0OC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGNsb2NrX3NlcSA9IChjbG9ja19zZXFfaGlfdmFyaWFudCA8PCA4TCkgfCBjbG9ja19zZXFfbG93CisgICAgICAgICAgICBpbnQgPSAoKHRpbWVfbG93IDw8IDk2TCkgfCAodGltZV9taWQgPDwgODBMKSB8CisgICAgICAgICAgICAgICAgICAgKHRpbWVfaGlfdmVyc2lvbiA8PCA2NEwpIHwgKGNsb2NrX3NlcSA8PCA0OEwpIHwgbm9kZSkKKyAgICAgICAgaWYgaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDAgPD0gaW50IDwgMTw8MTI4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnQgaXMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTI4LWJpdCB2YWx1ZSknKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDEgPD0gdmVyc2lvbiA8PSA1OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2lsbGVnYWwgdmVyc2lvbiBudW1iZXInKQorICAgICAgICAgICAgIyBTZXQgdGhlIHZhcmlhbnQgdG8gUkZDIDQxMjIuCisgICAgICAgICAgICBpbnQgJj0gfigweGMwMDAgPDwgNDhMKQorICAgICAgICAgICAgaW50IHw9IDB4ODAwMCA8PCA0OEwKKyAgICAgICAgICAgICMgU2V0IHRoZSB2ZXJzaW9uIG51bWJlci4KKyAgICAgICAgICAgIGludCAmPSB+KDB4ZjAwMCA8PCA2NEwpCisgICAgICAgICAgICBpbnQgfD0gdmVyc2lvbiA8PCA3NkwKKyAgICAgICAgc2VsZi5fX2RpY3RfX1snaW50J10gPSBpbnQKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVVVJRCk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuaW50LCBvdGhlci5pbnQpCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmludCkKKworICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdVVUlEKCVyKScgJSBzdHIoc2VsZikKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUnKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGhleCA9ICclMDMyeCcgJSBzZWxmLmludAorICAgICAgICByZXR1cm4gJyVzLSVzLSVzLSVzLSVzJyAlICgKKyAgICAgICAgICAgIGhleFs6OF0sIGhleFs4OjEyXSwgaGV4WzEyOjE2XSwgaGV4WzE2OjIwXSwgaGV4WzIwOl0pCisKKyAgICBkZWYgZ2V0X2J5dGVzKHNlbGYpOgorICAgICAgICBieXRlcyA9ICcnCisgICAgICAgIGZvciBzaGlmdCBpbiByYW5nZSgwLCAxMjgsIDgpOgorICAgICAgICAgICAgYnl0ZXMgPSBjaHIoKHNlbGYuaW50ID4+IHNoaWZ0KSAmIDB4ZmYpICsgYnl0ZXMKKyAgICAgICAgcmV0dXJuIGJ5dGVzCisKKyAgICBieXRlcyA9IHByb3BlcnR5KGdldF9ieXRlcykKKworICAgIGRlZiBnZXRfZmllbGRzKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYudGltZV9sb3csIHNlbGYudGltZV9taWQsIHNlbGYudGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIHNlbGYuY2xvY2tfc2VxX2xvdywgc2VsZi5ub2RlKQorCisgICAgZmllbGRzID0gcHJvcGVydHkoZ2V0X2ZpZWxkcykKKworICAgIGRlZiBnZXRfdGltZV9sb3coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCA+PiA5NkwKKworICAgIHRpbWVfbG93ID0gcHJvcGVydHkoZ2V0X3RpbWVfbG93KQorCisgICAgZGVmIGdldF90aW1lX21pZChzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA4MEwpICYgMHhmZmZmCisKKyAgICB0aW1lX21pZCA9IHByb3BlcnR5KGdldF90aW1lX21pZCkKKworICAgIGRlZiBnZXRfdGltZV9oaV92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDY0TCkgJiAweGZmZmYKKworICAgIHRpbWVfaGlfdmVyc2lvbiA9IHByb3BlcnR5KGdldF90aW1lX2hpX3ZlcnNpb24pCisKKyAgICBkZWYgZ2V0X2Nsb2NrX3NlcV9oaV92YXJpYW50KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDU2TCkgJiAweGZmCisKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfaGlfdmFyaWFudCkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxX2xvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA0OEwpICYgMHhmZgorCisgICAgY2xvY2tfc2VxX2xvdyA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfbG93KQorCisgICAgZGVmIGdldF90aW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi50aW1lX2hpX3ZlcnNpb24gJiAweDBmZmZMKSA8PCA0OEwpIHwKKyAgICAgICAgICAgICAgICAoc2VsZi50aW1lX21pZCA8PCAzMkwpIHwgc2VsZi50aW1lX2xvdykKKworICAgIHRpbWUgPSBwcm9wZXJ0eShnZXRfdGltZSkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2ZMKSA8PCA4TCkgfAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2xvdykKKworICAgIGNsb2NrX3NlcSA9IHByb3BlcnR5KGdldF9jbG9ja19zZXEpCisKKyAgICBkZWYgZ2V0X25vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCAmIDB4ZmZmZmZmZmZmZmZmCisKKyAgICBub2RlID0gcHJvcGVydHkoZ2V0X25vZGUpCisKKyAgICBkZWYgZ2V0X2hleChzZWxmKToKKyAgICAgICAgcmV0dXJuICclMDMyeCcgJSBzZWxmLmludAorCisgICAgaGV4ID0gcHJvcGVydHkoZ2V0X2hleCkKKworICAgIGRlZiBnZXRfdXJuKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3Vybjp1dWlkOicgKyBzdHIoc2VsZikKKworICAgIHVybiA9IHByb3BlcnR5KGdldF91cm4pCisKKyAgICBkZWYgZ2V0X3ZhcmlhbnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmludCAmICgweDgwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9OQ1MKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHg0MDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkZDXzQxMjIKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHgyMDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfTUlDUk9TT0ZUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfRlVUVVJFCisKKyAgICB2YXJpYW50ID0gcHJvcGVydHkoZ2V0X3ZhcmlhbnQpCisKKyAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhlIHZlcnNpb24gYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIGZvciBSRkMgNDEyMiBVVUlEcy4KKyAgICAgICAgaWYgc2VsZi52YXJpYW50ID09IFJGQ180MTIyOgorICAgICAgICAgICAgcmV0dXJuIGludCgoc2VsZi5pbnQgPj4gNzZMKSAmIDB4ZikKKworICAgIHZlcnNpb24gPSBwcm9wZXJ0eShnZXRfdmVyc2lvbikKKworZGVmIF9maW5kX21hYyhjb21tYW5kLCBhcmdzLCBod19pZGVudGlmaWVycywgZ2V0X2luZGV4KToKKyAgICBpbXBvcnQgb3MKKyAgICBmb3IgZGlyIGluIFsnJywgJy9zYmluLycsICcvdXNyL3NiaW4nXToKKyAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkaXIsIGNvbW1hbmQpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBMQ19BTEwgdG8gZ2V0IEVuZ2xpc2ggb3V0cHV0LCAyPi9kZXYvbnVsbCB0bworICAgICAgICAgICAgIyBwcmV2ZW50IG91dHB1dCBvbiBzdGRlcnIKKyAgICAgICAgICAgIGNtZCA9ICdMQ19BTEw9QyAlcyAlcyAyPi9kZXYvbnVsbCcgJSAoZXhlY3V0YWJsZSwgYXJncykKKyAgICAgICAgICAgIHBpcGUgPSBvcy5wb3BlbihjbWQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBmb3IgbGluZSBpbiBwaXBlOgorICAgICAgICAgICAgd29yZHMgPSBsaW5lLmxvd2VyKCkuc3BsaXQoKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHdvcmRzKSk6CisgICAgICAgICAgICAgICAgaWYgd29yZHNbaV0gaW4gaHdfaWRlbnRpZmllcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQod29yZHNbZ2V0X2luZGV4KGkpXS5yZXBsYWNlKCc6JywgJycpLCAxNikKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lmY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gVW5peCBieSBydW5uaW5nIGlmY29uZmlnLiIiIgorCisgICAgIyBUaGlzIHdvcmtzIG9uIExpbnV4ICgnJyBvciAnLWEnKSwgVHJ1NjQgKCctYXYnKSwgYnV0IG5vdCBhbGwgVW5peGVzLgorICAgIGZvciBhcmdzIGluICgnJywgJy1hJywgJy1hdicpOgorICAgICAgICBtYWMgPSBfZmluZF9tYWMoJ2lmY29uZmlnJywgYXJncywgWydod2FkZHInLCAnZXRoZXInXSwgbGFtYmRhIGk6IGkrMSkKKyAgICAgICAgaWYgbWFjOgorICAgICAgICAgICAgcmV0dXJuIG1hYworCisgICAgaW1wb3J0IHNvY2tldAorICAgIGlwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKworICAgICMgVHJ5IGdldHRpbmcgdGhlIE1BQyBhZGRyIGZyb20gYXJwIGJhc2VkIG9uIG91ciBJUCBhZGRyZXNzIChTb2xhcmlzKS4KKyAgICBtYWMgPSBfZmluZF9tYWMoJ2FycCcsICctYW4nLCBbaXBfYWRkcl0sIGxhbWJkYSBpOiAtMSkKKyAgICBpZiBtYWM6CisgICAgICAgIHJldHVybiBtYWMKKworICAgICMgVGhpcyBtaWdodCB3b3JrIG9uIEhQLVVYLgorICAgIG1hYyA9IF9maW5kX21hYygnbGFuc2NhbicsICctYWknLCBbJ2xhbjAnXSwgbGFtYmRhIGk6IDApCisgICAgaWYgbWFjOgorICAgICAgICByZXR1cm4gbWFjCisKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lwY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyBieSBydW5uaW5nIGlwY29uZmlnLmV4ZS4iIiIKKyAgICBpbXBvcnQgb3MsIHJlCisgICAgZGlycyA9IFsnJywgcidjOlx3aW5kb3dzXHN5c3RlbTMyJywgcidjOlx3aW5udFxzeXN0ZW0zMiddCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigzMDApCisgICAgICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U3lzdGVtRGlyZWN0b3J5QShidWZmZXIsIDMwMCkKKyAgICAgICAgZGlycy5pbnNlcnQoMCwgYnVmZmVyLnZhbHVlLmRlY29kZSgnbWJjcycpKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlwZSA9IG9zLnBvcGVuKG9zLnBhdGguam9pbihkaXIsICdpcGNvbmZpZycpICsgJyAvYWxsJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3IgbGluZSBpbiBwaXBlOgorICAgICAgICAgICAgdmFsdWUgPSBsaW5lLnNwbGl0KCc6JylbLTFdLnN0cmlwKCkubG93ZXIoKQorICAgICAgICAgICAgaWYgcmUubWF0Y2goJyhbMC05YS1mXVswLTlhLWZdLSl7NX1bMC05YS1mXVswLTlhLWZdJywgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUucmVwbGFjZSgnLScsICcnKSwgMTYpCisKK2RlZiBfbmV0Ymlvc19nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgTmV0QklPUyBjYWxscy4KKyAgICBTZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg2MjMgZm9yIGRldGFpbHMuIiIiCisgICAgaW1wb3J0IHdpbjMyd25ldCwgbmV0YmlvcworICAgIG5jYiA9IG5ldGJpb3MuTkNCKCkKKyAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCRU5VTQorICAgIG5jYi5CdWZmZXIgPSBhZGFwdGVycyA9IG5ldGJpb3MuTEFOQV9FTlVNKCkKKyAgICBhZGFwdGVycy5fcGFjaygpCisgICAgaWYgd2luMzJ3bmV0Lk5ldGJpb3MobmNiKSAhPSAwOgorICAgICAgICByZXR1cm4KKyAgICBhZGFwdGVycy5fdW5wYWNrKCkKKyAgICBmb3IgaSBpbiByYW5nZShhZGFwdGVycy5sZW5ndGgpOgorICAgICAgICBuY2IuUmVzZXQoKQorICAgICAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCUkVTRVQKKyAgICAgICAgbmNiLkxhbmFfbnVtID0gb3JkKGFkYXB0ZXJzLmxhbmFbaV0pCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5jYi5SZXNldCgpCisgICAgICAgIG5jYi5Db21tYW5kID0gbmV0Ymlvcy5OQ0JBU1RBVAorICAgICAgICBuY2IuTGFuYV9udW0gPSBvcmQoYWRhcHRlcnMubGFuYVtpXSkKKyAgICAgICAgbmNiLkNhbGxuYW1lID0gJyonLmxqdXN0KDE2KQorICAgICAgICBuY2IuQnVmZmVyID0gc3RhdHVzID0gbmV0Ymlvcy5BREFQVEVSX1NUQVRVUygpCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHN0YXR1cy5fdW5wYWNrKCkKKyAgICAgICAgYnl0ZXMgPSBtYXAob3JkLCBzdGF0dXMuYWRhcHRlcl9hZGRyZXNzKQorICAgICAgICByZXR1cm4gKChieXRlc1swXTw8NDBMKSArIChieXRlc1sxXTw8MzJMKSArIChieXRlc1syXTw8MjRMKSArCisgICAgICAgICAgICAgICAgKGJ5dGVzWzNdPDwxNkwpICsgKGJ5dGVzWzRdPDw4TCkgKyBieXRlc1s1XSkKKworIyBUaGFua3MgdG8gVGhvbWFzIEhlbGxlciBmb3IgY3R5cGVzIGFuZCBmb3IgaGlzIGhlbHAgd2l0aCBpdHMgdXNlIGhlcmUuCisKKyMgSWYgY3R5cGVzIGlzIGF2YWlsYWJsZSwgdXNlIGl0IHRvIGZpbmQgc3lzdGVtIHJvdXRpbmVzIGZvciBVVUlEIGdlbmVyYXRpb24uCitfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBfdXVpZF9nZW5lcmF0ZV90aW1lID0gX1V1aWRDcmVhdGUgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcywgY3R5cGVzLnV0aWwKKyAgICBfYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDE2KQorCisgICAgIyBUaGUgdXVpZF9nZW5lcmF0ZV8qIHJvdXRpbmVzIGFyZSBwcm92aWRlZCBieSBsaWJ1dWlkIG9uIGF0IGxlYXN0CisgICAgIyBMaW51eCBhbmQgRnJlZUJTRCwgYW5kIHByb3ZpZGVkIGJ5IGxpYmMgb24gTWFjIE9TIFguCisgICAgZm9yIGxpYm5hbWUgaW4gWyd1dWlkJywgJ2MnXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGliID0gY3R5cGVzLkNETEwoY3R5cGVzLnV0aWwuZmluZF9saWJyYXJ5KGxpYm5hbWUpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBoYXNhdHRyKGxpYiwgJ3V1aWRfZ2VuZXJhdGVfcmFuZG9tJyk6CisgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBsaWIudXVpZF9nZW5lcmF0ZV9yYW5kb20KKyAgICAgICAgaWYgaGFzYXR0cihsaWIsICd1dWlkX2dlbmVyYXRlX3RpbWUnKToKKyAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3RpbWUgPSBsaWIudXVpZF9nZW5lcmF0ZV90aW1lCisKKyAgICAjIE9uIFdpbmRvd3MgcHJpb3IgdG8gMjAwMCwgVXVpZENyZWF0ZSBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBPbiBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyLCBVdWlkQ3JlYXRlIG1ha2VzIGEKKyAgICAjIHJhbmRvbSBVVUlEIGFuZCBVdWlkQ3JlYXRlU2VxdWVudGlhbCBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBUaGVzZSByb3V0aW5lcyBhcmUgcHJvdmlkZWQgYnkgdGhlIFJQQyBydW50aW1lLgorICAgICMgTk9URTogIGF0IGxlYXN0IG9uIFRpbSdzIFdpblhQIFBybyBTUDIgZGVza3RvcCBib3gsIHdoaWxlIHRoZSBsYXN0CisgICAgIyA2IGJ5dGVzIHJldHVybmVkIGJ5IFV1aWRDcmVhdGVTZXF1ZW50aWFsIGFyZSBmaXhlZCwgdGhleSBkb24ndCBhcHBlYXIKKyAgICAjIHRvIGJlYXIgYW55IHJlbGF0aW9uc2hpcCB0byB0aGUgTUFDIGFkZHJlc3Mgb2YgYW55IG5ldHdvcmsgZGV2aWNlCisgICAgIyBvbiB0aGUgYm94LgorICAgIHRyeToKKyAgICAgICAgbGliID0gY3R5cGVzLndpbmRsbC5ycGNydDQKKyAgICBleGNlcHQ6CisgICAgICAgIGxpYiA9IE5vbmUKKyAgICBfVXVpZENyZWF0ZSA9IGdldGF0dHIobGliLCAnVXVpZENyZWF0ZVNlcXVlbnRpYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGxpYiwgJ1V1aWRDcmVhdGUnLCBOb25lKSkKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2RlZiBfdW5peGRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFVuaXggdXNpbmcgY3R5cGVzLiIiIgorICAgIF91dWlkX2dlbmVyYXRlX3RpbWUoX2J1ZmZlcikKKyAgICByZXR1cm4gVVVJRChieXRlcz1fYnVmZmVyLnJhdykubm9kZQorCitkZWYgX3dpbmRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgY3R5cGVzLiIiIgorICAgIGlmIF9VdWlkQ3JlYXRlKF9idWZmZXIpID09IDA6CisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KS5ub2RlCisKK2RlZiBfcmFuZG9tX2dldG5vZGUoKToKKyAgICAiIiJHZXQgYSByYW5kb20gbm9kZSBJRCwgd2l0aCBlaWdodGggYml0IHNldCBhcyBzdWdnZXN0ZWQgYnkgUkZDIDQxMjIuIiIiCisgICAgaW1wb3J0IHJhbmRvbQorICAgIHJldHVybiByYW5kb20ucmFuZHJhbmdlKDAsIDE8PDQ4TCkgfCAweDAxMDAwMDAwMDAwMEwKKworX25vZGUgPSBOb25lCisKK2RlZiBnZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIGFzIGEgNDgtYml0IHBvc2l0aXZlIGludGVnZXIuCisKKyAgICBUaGUgZmlyc3QgdGltZSB0aGlzIHJ1bnMsIGl0IG1heSBsYXVuY2ggYSBzZXBhcmF0ZSBwcm9ncmFtLCB3aGljaCBjb3VsZAorICAgIGJlIHF1aXRlIHNsb3cuICBJZiBhbGwgYXR0ZW1wdHMgdG8gb2J0YWluIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGZhaWwsIHdlCisgICAgY2hvb3NlIGEgcmFuZG9tIDQ4LWJpdCBudW1iZXIgd2l0aCBpdHMgZWlnaHRoIGJpdCBzZXQgdG8gMSBhcyByZWNvbW1lbmRlZAorICAgIGluIFJGQyA0MTIyLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9ub2RlCisgICAgaWYgX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBfbm9kZQorCisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBnZXR0ZXJzID0gW193aW5kbGxfZ2V0bm9kZSwgX25ldGJpb3NfZ2V0bm9kZSwgX2lwY29uZmlnX2dldG5vZGVdCisgICAgZWxzZToKKyAgICAgICAgZ2V0dGVycyA9IFtfdW5peGRsbF9nZXRub2RlLCBfaWZjb25maWdfZ2V0bm9kZV0KKworICAgIGZvciBnZXR0ZXIgaW4gZ2V0dGVycyArIFtfcmFuZG9tX2dldG5vZGVdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbm9kZSA9IGdldHRlcigpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIF9ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9ub2RlCisKK2RlZiB1dWlkMShub2RlPU5vbmUsIGNsb2NrX3NlcT1Ob25lKToKKyAgICAiIiJHZW5lcmF0ZSBhIFVVSUQgZnJvbSBhIGhvc3QgSUQsIHNlcXVlbmNlIG51bWJlciwgYW5kIHRoZSBjdXJyZW50IHRpbWUuCisgICAgSWYgJ25vZGUnIGlzIG5vdCBnaXZlbiwgZ2V0bm9kZSgpIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBoYXJkd2FyZQorICAgIGFkZHJlc3MuICBJZiAnY2xvY2tfc2VxJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc2VxdWVuY2UgbnVtYmVyOworICAgIG90aGVyd2lzZSBhIHJhbmRvbSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyIGlzIGNob3Nlbi4iIiIKKworICAgICMgV2hlbiB0aGUgc3lzdGVtIHByb3ZpZGVzIGEgdmVyc2lvbi0xIFVVSUQgZ2VuZXJhdG9yLCB1c2UgaXQgKGJ1dCBkb24ndAorICAgICMgdXNlIFV1aWRDcmVhdGUgaGVyZSBiZWNhdXNlIGl0cyBVVUlEcyBkb24ndCBjb25mb3JtIHRvIFJGQyA0MTIyKS4KKyAgICBpZiBfdXVpZF9nZW5lcmF0ZV90aW1lIGFuZCBub2RlIGlzIGNsb2NrX3NlcSBpcyBOb25lOgorICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgaW1wb3J0IHRpbWUKKyAgICBuYW5vc2Vjb25kcyA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKKyAgICAjIDB4MDFiMjFkZDIxMzgxNDAwMCBpcyB0aGUgbnVtYmVyIG9mIDEwMC1ucyBpbnRlcnZhbHMgYmV0d2VlbiB0aGUKKyAgICAjIFVVSUQgZXBvY2ggMTU4Mi0xMC0xNSAwMDowMDowMCBhbmQgdGhlIFVuaXggZXBvY2ggMTk3MC0wMS0wMSAwMDowMDowMC4KKyAgICB0aW1lc3RhbXAgPSBpbnQobmFub3NlY29uZHMvMTAwKSArIDB4MDFiMjFkZDIxMzgxNDAwMEwKKyAgICBpZiBjbG9ja19zZXEgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBjbG9ja19zZXEgPSByYW5kb20ucmFuZHJhbmdlKDE8PDE0TCkgIyBpbnN0ZWFkIG9mIHN0YWJsZSBzdG9yYWdlCisgICAgdGltZV9sb3cgPSB0aW1lc3RhbXAgJiAweGZmZmZmZmZmTAorICAgIHRpbWVfbWlkID0gKHRpbWVzdGFtcCA+PiAzMkwpICYgMHhmZmZmTAorICAgIHRpbWVfaGlfdmVyc2lvbiA9ICh0aW1lc3RhbXAgPj4gNDhMKSAmIDB4MGZmZkwKKyAgICBjbG9ja19zZXFfbG93ID0gY2xvY2tfc2VxICYgMHhmZkwKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IChjbG9ja19zZXEgPj4gOEwpICYgMHgzZkwKKyAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgIG5vZGUgPSBnZXRub2RlKCkKKyAgICByZXR1cm4gVVVJRChmaWVsZHM9KHRpbWVfbG93LCB0aW1lX21pZCwgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGNsb2NrX3NlcV9sb3csIG5vZGUpLCB2ZXJzaW9uPTEpCisKK2RlZiB1dWlkMyhuYW1lc3BhY2UsIG5hbWUpOgorICAgICIiIkdlbmVyYXRlIGEgVVVJRCBmcm9tIHRoZSBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUuIiIiCisgICAgaW1wb3J0IG1kNQorICAgIGhhc2ggPSBtZDUubWQ1KG5hbWVzcGFjZS5ieXRlcyArIG5hbWUpLmRpZ2VzdCgpCisgICAgcmV0dXJuIFVVSUQoYnl0ZXM9aGFzaFs6MTZdLCB2ZXJzaW9uPTMpCisKK2RlZiB1dWlkNCgpOgorICAgICIiIkdlbmVyYXRlIGEgcmFuZG9tIFVVSUQuIiIiCisKKyAgICAjIFdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBhIHZlcnNpb24tNCBVVUlEIGdlbmVyYXRvciwgdXNlIGl0LgorICAgIGlmIF91dWlkX2dlbmVyYXRlX3JhbmRvbToKKyAgICAgICAgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgIyBPdGhlcndpc2UsIGdldCByYW5kb21uZXNzIGZyb20gdXJhbmRvbSBvciB0aGUgJ3JhbmRvbScgbW9kdWxlLgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPW9zLnVyYW5kb20oMTYpLCB2ZXJzaW9uPTQpCisgICAgZXhjZXB0OgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGJ5dGVzID0gW2NocihyYW5kb20ucmFuZHJhbmdlKDI1NikpIGZvciBpIGluIHJhbmdlKDE2KV0KKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9Ynl0ZXMsIHZlcnNpb249NCkKKworZGVmIHV1aWQ1KG5hbWVzcGFjZSwgbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gdGhlIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lLiIiIgorICAgIGltcG9ydCBzaGEKKyAgICBoYXNoID0gc2hhLnNoYShuYW1lc3BhY2UuYnl0ZXMgKyBuYW1lKS5kaWdlc3QoKQorICAgIHJldHVybiBVVUlEKGJ5dGVzPWhhc2hbOjE2XSwgdmVyc2lvbj01KQorCisjIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgVVVJRHMgYXJlIGZvciB1c2Ugd2l0aCB1dWlkMygpIG9yIHV1aWQ1KCkuCisKK05BTUVTUEFDRV9ETlMgPSBVVUlEKCc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQorTkFNRVNQQUNFX1VSTCA9IFVVSUQoJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCitOQU1FU1BBQ0VfT0lEID0gVVVJRCgnNmJhN2I4MTItOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKK05BTUVTUEFDRV9YNTAwID0gVVVJRCgnNmJhN2I4MTQtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKZGlmZiAtLWdpdCBhL0xpYi93YXJuaW5ncy5weSBiL0xpYi93YXJuaW5ncy5weQppbmRleCBiNWQ3NWU0Li5iN2ZhYzY5IDEwMDY0NAotLS0gYS9MaWIvd2FybmluZ3MucHkKKysrIGIvTGliL3dhcm5pbmdzLnB5CkBAIC00Niw3ICs0Niw3IEBACiAgICAgZmlsZW5hbWUgPSBnbG9iYWxzLmdldCgnX19maWxlX18nKQogICAgIGlmIGZpbGVuYW1lOgogICAgICAgICBmbmwgPSBmaWxlbmFtZS5sb3dlcigpCi0gICAgICAgIGlmIGZubC5lbmRzd2l0aCgiLnB5YyIpIG9yIGZubC5lbmRzd2l0aCgiLnB5byIpOgorICAgICAgICBpZiBmbmwuZW5kc3dpdGgoKCIucHljIiwgIi5weW8iKSk6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KICAgICBlbHNlOgogICAgICAgICBpZiBtb2R1bGUgPT0gIl9fbWFpbl9fIjoKQEAgLTI1NCwxMSArMjU0LDExIEBACiAgICAgICAgICAgICBjYXQgPSBnZXRhdHRyKG0sIGtsYXNzKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoInVua25vd24gd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCi0gICAgaWYgKG5vdCBpc2luc3RhbmNlKGNhdCwgdHlwZXMuQ2xhc3NUeXBlKSBvcgotICAgICAgICBub3QgaXNzdWJjbGFzcyhjYXQsIFdhcm5pbmcpKToKKyAgICBpZiBub3QgaXNzdWJjbGFzcyhjYXQsIFdhcm5pbmcpOgogICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoImludmFsaWQgd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCiAgICAgcmV0dXJuIGNhdAogCiAjIE1vZHVsZSBpbml0aWFsaXphdGlvbgogX3Byb2Nlc3NvcHRpb25zKHN5cy53YXJub3B0aW9ucykKIHNpbXBsZWZpbHRlcigiaWdub3JlIiwgY2F0ZWdvcnk9UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgYXBwZW5kPTEpCitzaW1wbGVmaWx0ZXIoImlnbm9yZSIsIGNhdGVnb3J5PUltcG9ydFdhcm5pbmcsIGFwcGVuZD0xKQpkaWZmIC0tZ2l0IGEvTGliL3dlYmJyb3dzZXIucHkgYi9MaWIvd2ViYnJvd3Nlci5weQppbmRleCA0NjkzZmU3Li43YTFhM2I0IDEwMDY0NAotLS0gYS9MaWIvd2ViYnJvd3Nlci5weQorKysgYi9MaWIvd2ViYnJvd3Nlci5weQpAQCAtOTgsOCArOTgsNyBAQAogaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIjoKICAgICBkZWYgX2lzZXhlY3V0YWJsZShjbWQpOgogICAgICAgICBjbWQgPSBjbWQubG93ZXIoKQotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpIGFuZCAoY21kLmVuZHN3aXRoKCIuZXhlIikgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5lbmRzd2l0aCgiLmJhdCIpKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY21kKSBhbmQgY21kLmVuZHN3aXRoKCgiLmV4ZSIsICIuYmF0IikpOgogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgZm9yIGV4dCBpbiAiLmV4ZSIsICIuYmF0IjoKICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNtZCArIGV4dCk6CkBAIC00MzUsMTMgKzQzNCwxMyBAQAogICAgICMgVGhlIGRlZmF1bHQgR25vbWUgYnJvd3NlcgogICAgIGlmIF9pc2NvbW1hbmQoImdjb25mdG9vbC0yIik6CiAgICAgICAgICMgZ2V0IHRoZSB3ZWIgYnJvd3NlciBzdHJpbmcgZnJvbSBnY29uZnRvb2wKLSAgICAgICAgZ2MgPSAnZ2NvbmZ0b29sLTIgLWcgL2Rlc2t0b3AvZ25vbWUvdXJsLWhhbmRsZXJzL2h0dHAvY29tbWFuZCcKKyAgICAgICAgZ2MgPSAnZ2NvbmZ0b29sLTIgLWcgL2Rlc2t0b3AvZ25vbWUvdXJsLWhhbmRsZXJzL2h0dHAvY29tbWFuZCAyPi9kZXYvbnVsbCcKICAgICAgICAgb3V0ID0gb3MucG9wZW4oZ2MpCiAgICAgICAgIGNvbW1kID0gb3V0LnJlYWQoKS5zdHJpcCgpCiAgICAgICAgIHJldG5jb2RlID0gb3V0LmNsb3NlKCkKIAogICAgICAgICAjIGlmIHN1Y2Nlc3NmdWwsIHJlZ2lzdGVyIGl0Ci0gICAgICAgIGlmIHJldG5jb2RlID09IE5vbmUgYW5kIGxlbihjb21tZCkgIT0gMDoKKyAgICAgICAgaWYgcmV0bmNvZGUgaXMgTm9uZSBhbmQgY29tbWQ6CiAgICAgICAgICAgICByZWdpc3RlcigiZ25vbWUiLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3Nlcihjb21tZCkpCiAKICAgICAjIEZpcnN0LCB0aGUgTW96aWxsYS9OZXRzY2FwZSBicm93c2VycwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYuZWdnLWluZm8gYi9MaWIvd3NnaXJlZi5lZ2ctaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI3ODkzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYuZWdnLWluZm8KQEAgLTAsMCArMSw4IEBACitNZXRhZGF0YS1WZXJzaW9uOiAxLjAKK05hbWU6IHdzZ2lyZWYKK1ZlcnNpb246IDAuMS4yCitTdW1tYXJ5OiBXU0dJIChQRVAgMzMzKSBSZWZlcmVuY2UgTGlicmFyeQorQXV0aG9yOiBQaGlsbGlwIEouIEVieQorQXV0aG9yLWVtYWlsOiB3ZWItc2lnQHB5dGhvbi5vcmcKK0xpY2Vuc2U6IFBTRiBvciBaUEwKK1BsYXRmb3JtOiBVTktOT1dOCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9fX2luaXRfXy5weSBiL0xpYi93c2dpcmVmL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzU3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDIzIEBACisiIiJ3c2dpcmVmIC0tIGEgV1NHSSAoUEVQIDMzMykgUmVmZXJlbmNlIExpYnJhcnkKKworQ3VycmVudCBDb250ZW50czoKKworKiB1dGlsIC0tIE1pc2NlbGxhbmVvdXMgdXNlZnVsIGZ1bmN0aW9ucyBhbmQgd3JhcHBlcnMKKworKiBoZWFkZXJzIC0tIE1hbmFnZSByZXNwb25zZSBoZWFkZXJzCisKKyogaGFuZGxlcnMgLS0gYmFzZSBjbGFzc2VzIGZvciBzZXJ2ZXIvZ2F0ZXdheSBpbXBsZW1lbnRhdGlvbnMKKworKiBzaW1wbGVfc2VydmVyIC0tIGEgc2ltcGxlIEJhc2VIVFRQU2VydmVyIHRoYXQgc3VwcG9ydHMgV1NHSQorCisqIHZhbGlkYXRlIC0tIHZhbGlkYXRpb24gd3JhcHBlciB0aGF0IHNpdHMgYmV0d2VlbiBhbiBhcHAgYW5kIGEgc2VydmVyCisgIHRvIGRldGVjdCBlcnJvcnMgaW4gZWl0aGVyCisKK1RvLURvOgorCisqIGNnaV9nYXRld2F5IC0tIFJ1biBXU0dJIGFwcHMgdW5kZXIgQ0dJIChwZW5kaW5nIGEgZGVwbG95bWVudCBzdGFuZGFyZCkKKworKiBjZ2lfd3JhcHBlciAtLSBSdW4gQ0dJIGFwcHMgdW5kZXIgV1NHSQorCisqIHJvdXRlciAtLSBhIHNpbXBsZSBtaWRkbGV3YXJlIGNvbXBvbmVudCB0aGF0IGhhbmRsZXMgVVJMIHRyYXZlcnNhbAorIiIiCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9oYW5kbGVycy5weSBiL0xpYi93c2dpcmVmL2hhbmRsZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTM3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9oYW5kbGVycy5weQpAQCAtMCwwICsxLDQ5MiBAQAorIiIiQmFzZSBjbGFzc2VzIGZvciBzZXJ2ZXIvZ2F0ZXdheSBpbXBsZW1lbnRhdGlvbnMiIiIKKworZnJvbSB0eXBlcyBpbXBvcnQgU3RyaW5nVHlwZQorZnJvbSB1dGlsIGltcG9ydCBGaWxlV3JhcHBlciwgZ3Vlc3Nfc2NoZW1lLCBpc19ob3BfYnlfaG9wCitmcm9tIGhlYWRlcnMgaW1wb3J0IEhlYWRlcnMKKworaW1wb3J0IHN5cywgb3MsIHRpbWUKKworX19hbGxfXyA9IFsnQmFzZUhhbmRsZXInLCAnU2ltcGxlSGFuZGxlcicsICdCYXNlQ0dJSGFuZGxlcicsICdDR0lIYW5kbGVyJ10KKwordHJ5OgorICAgIGRpY3QKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIGRpY3QoaXRlbXMpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZm9yIGssdiBpbiBpdGVtczoKKyAgICAgICAgICAgIGRba10gPSB2CisgICAgICAgIHJldHVybiBkCisKK3RyeToKKyAgICBUcnVlCisgICAgRmFsc2UKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgVHJ1ZSA9IG5vdCBOb25lCisgICAgRmFsc2UgPSBub3QgVHJ1ZQorCisKKyMgV2Vla2RheSBhbmQgbW9udGggbmFtZXMgZm9yIEhUVFAgZGF0ZS90aW1lIGZvcm1hdHRpbmc7IGFsd2F5cyBFbmdsaXNoIQorX3dlZWtkYXluYW1lID0gWyJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iXQorX21vbnRobmFtZSA9IFtOb25lLCAjIER1bW15IHNvIHdlIGNhbiB1c2UgMS1iYXNlZCBtb250aCBudW1iZXJzCisgICAgICAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdCisKK2RlZiBmb3JtYXRfZGF0ZV90aW1lKHRpbWVzdGFtcCk6CisgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCisgICAgcmV0dXJuICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgIF93ZWVrZGF5bmFtZVt3ZF0sIGRheSwgX21vbnRobmFtZVttb250aF0sIHllYXIsIGhoLCBtbSwgc3MKKyAgICApCisKKworCitjbGFzcyBCYXNlSGFuZGxlcjoKKyAgICAiIiJNYW5hZ2UgdGhlIGludm9jYXRpb24gb2YgYSBXU0dJIGFwcGxpY2F0aW9uIiIiCisKKyAgICAjIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgY2FuIG92ZXJyaWRlIHBlci1zdWJjbGFzcyBvciBwZXItaW5zdGFuY2UKKyAgICB3c2dpX3ZlcnNpb24gPSAoMSwwKQorICAgIHdzZ2lfbXVsdGl0aHJlYWQgPSBUcnVlCisgICAgd3NnaV9tdWx0aXByb2Nlc3MgPSBUcnVlCisgICAgd3NnaV9ydW5fb25jZSA9IEZhbHNlCisKKyAgICBvcmlnaW5fc2VydmVyID0gVHJ1ZSAgICAjIFdlIGFyZSB0cmFuc21pdHRpbmcgZGlyZWN0IHRvIGNsaWVudAorICAgIGh0dHBfdmVyc2lvbiAgPSAiMS4wIiAgICMgVmVyc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXNwb25zZQorICAgIHNlcnZlcl9zb2Z0d2FyZSA9IE5vbmUgICMgU3RyaW5nIG5hbWUgb2Ygc2VydmVyIHNvZnR3YXJlLCBpZiBhbnkKKworICAgICMgb3NfZW52aXJvbiBpcyB1c2VkIHRvIHN1cHBseSBjb25maWd1cmF0aW9uIGZyb20gdGhlIE9TIGVudmlyb25tZW50OgorICAgICMgYnkgZGVmYXVsdCBpdCdzIGEgY29weSBvZiAnb3MuZW52aXJvbicgYXMgb2YgaW1wb3J0IHRpbWUsIGJ1dCB5b3UgY2FuCisgICAgIyBvdmVycmlkZSB0aGlzIGluIGUuZy4geW91ciBfX2luaXRfXyBtZXRob2QuCisgICAgb3NfZW52aXJvbiA9IGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKQorCisgICAgIyBDb2xsYWJvcmF0b3IgY2xhc3NlcworICAgIHdzZ2lfZmlsZV93cmFwcGVyID0gRmlsZVdyYXBwZXIgICAgICMgc2V0IHRvIE5vbmUgdG8gZGlzYWJsZQorICAgIGhlYWRlcnNfY2xhc3MgPSBIZWFkZXJzICAgICAgICAgICAgICMgbXVzdCBiZSBhIEhlYWRlcnMtbGlrZSBjbGFzcworCisgICAgIyBFcnJvciBoYW5kbGluZyAoYWxzbyBwZXItc3ViY2xhc3Mgb3IgcGVyLWluc3RhbmNlKQorICAgIHRyYWNlYmFja19saW1pdCA9IE5vbmUgICMgUHJpbnQgZW50aXJlIHRyYWNlYmFjayB0byBzZWxmLmdldF9zdGRlcnIoKQorICAgIGVycm9yX3N0YXR1cyA9ICI1MDAgRHVkZSwgdGhpcyBpcyB3aGFjayEiCisgICAgZXJyb3JfaGVhZGVycyA9IFsoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKV0KKyAgICBlcnJvcl9ib2R5ID0gIkEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuIgorCisgICAgIyBTdGF0ZSB2YXJpYWJsZXMgKGRvbid0IG1lc3Mgd2l0aCB0aGVzZSkKKyAgICBzdGF0dXMgPSByZXN1bHQgPSBOb25lCisgICAgaGVhZGVyc19zZW50ID0gRmFsc2UKKyAgICBoZWFkZXJzID0gTm9uZQorICAgIGJ5dGVzX3NlbnQgPSAwCisKKworCisKKworCisKKworICAgIGRlZiBydW4oc2VsZiwgYXBwbGljYXRpb24pOgorICAgICAgICAiIiJJbnZva2UgdGhlIGFwcGxpY2F0aW9uIiIiCisgICAgICAgICMgTm90ZSB0byBzZWxmOiBkb24ndCBtb3ZlIHRoZSBjbG9zZSgpISAgQXN5bmNocm9ub3VzIHNlcnZlcnMgc2hvdWxkbid0CisgICAgICAgICMgY2FsbCBjbG9zZSgpIGZyb20gZmluaXNoX3Jlc3BvbnNlKCksIHNvIGlmIHlvdSBjbG9zZSgpIGFueXdoZXJlIGJ1dAorICAgICAgICAjIHRoZSBkb3VibGUtZXJyb3IgYnJhbmNoIGhlcmUsIHlvdSdsbCBicmVhayBhc3luY2hyb25vdXMgc2VydmVycyBieQorICAgICAgICAjIHByZW1hdHVyZWx5IGNsb3NpbmcuICBBc3luYyBzZXJ2ZXJzIG11c3QgcmV0dXJuIGZyb20gJ3J1bigpJyB3aXRob3V0CisgICAgICAgICMgY2xvc2luZyBpZiB0aGVyZSBtaWdodCBzdGlsbCBiZSBvdXRwdXQgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBhcHBsaWNhdGlvbihzZWxmLmVudmlyb24sIHNlbGYuc3RhcnRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXNwb25zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcigpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSBnZXQgYW4gZXJyb3IgaGFuZGxpbmcgYW4gZXJyb3IsIGp1c3QgZ2l2ZSB1cCBhbHJlYWR5IQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlICAgIyAuLi5hbmQgbGV0IHRoZSBhY3R1YWwgc2VydmVyIGZpZ3VyZSBpdCBvdXQuCisKKworICAgIGRlZiBzZXR1cF9lbnZpcm9uKHNlbGYpOgorICAgICAgICAiIiJTZXQgdXAgdGhlIGVudmlyb25tZW50IGZvciBvbmUgcmVxdWVzdCIiIgorCisgICAgICAgIGVudiA9IHNlbGYuZW52aXJvbiA9IHNlbGYub3NfZW52aXJvbi5jb3B5KCkKKyAgICAgICAgc2VsZi5hZGRfY2dpX3ZhcnMoKQorCisgICAgICAgIGVudlsnd3NnaS5pbnB1dCddICAgICAgICA9IHNlbGYuZ2V0X3N0ZGluKCkKKyAgICAgICAgZW52Wyd3c2dpLmVycm9ycyddICAgICAgID0gc2VsZi5nZXRfc3RkZXJyKCkKKyAgICAgICAgZW52Wyd3c2dpLnZlcnNpb24nXSAgICAgID0gc2VsZi53c2dpX3ZlcnNpb24KKyAgICAgICAgZW52Wyd3c2dpLnJ1bl9vbmNlJ10gICAgID0gc2VsZi53c2dpX3J1bl9vbmNlCisgICAgICAgIGVudlsnd3NnaS51cmxfc2NoZW1lJ10gICA9IHNlbGYuZ2V0X3NjaGVtZSgpCisgICAgICAgIGVudlsnd3NnaS5tdWx0aXRocmVhZCddICA9IHNlbGYud3NnaV9tdWx0aXRocmVhZAorICAgICAgICBlbnZbJ3dzZ2kubXVsdGlwcm9jZXNzJ10gPSBzZWxmLndzZ2lfbXVsdGlwcm9jZXNzCisKKyAgICAgICAgaWYgc2VsZi53c2dpX2ZpbGVfd3JhcHBlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudlsnd3NnaS5maWxlX3dyYXBwZXInXSA9IHNlbGYud3NnaV9maWxlX3dyYXBwZXIKKworICAgICAgICBpZiBzZWxmLm9yaWdpbl9zZXJ2ZXIgYW5kIHNlbGYuc2VydmVyX3NvZnR3YXJlOgorICAgICAgICAgICAgZW52LnNldGRlZmF1bHQoJ1NFUlZFUl9TT0ZUV0FSRScsc2VsZi5zZXJ2ZXJfc29mdHdhcmUpCisKKworICAgIGRlZiBmaW5pc2hfcmVzcG9uc2Uoc2VsZik6CisgICAgICAgICIiIlNlbmQgYW55IGl0ZXJhYmxlIGRhdGEsIHRoZW4gY2xvc2Ugc2VsZiBhbmQgdGhlIGl0ZXJhYmxlCisKKyAgICAgICAgU3ViY2xhc3NlcyBpbnRlbmRlZCBmb3IgdXNlIGluIGFzeW5jaHJvbm91cyBzZXJ2ZXJzIHdpbGwKKyAgICAgICAgd2FudCB0byByZWRlZmluZSB0aGlzIG1ldGhvZCwgc3VjaCB0aGF0IGl0IHNldHMgdXAgY2FsbGJhY2tzCisgICAgICAgIGluIHRoZSBldmVudCBsb29wIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZGF0YSwgYW5kIHRvIGNhbGwKKyAgICAgICAgJ3NlbGYuY2xvc2UoKScgb25jZSB0aGUgcmVzcG9uc2UgaXMgZmluaXNoZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5yZXN1bHRfaXNfZmlsZSgpIG9yIG5vdCBzZWxmLnNlbmRmaWxlKCk6CisgICAgICAgICAgICBmb3IgZGF0YSBpbiBzZWxmLnJlc3VsdDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBzZWxmLmZpbmlzaF9jb250ZW50KCkKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKworICAgIGRlZiBnZXRfc2NoZW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFVSTCBzY2hlbWUgYmVpbmcgdXNlZCIiIgorICAgICAgICByZXR1cm4gZ3Vlc3Nfc2NoZW1lKHNlbGYuZW52aXJvbikKKworCisgICAgZGVmIHNldF9jb250ZW50X2xlbmd0aChzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSBDb250ZW50LUxlbmd0aCBvciBzd2l0Y2ggdG8gY2h1bmtlZCBlbmNvZGluZyBpZiBwb3NzaWJsZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBibG9ja3MgPSBsZW4oc2VsZi5yZXN1bHQpCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLEF0dHJpYnV0ZUVycm9yLE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYmxvY2tzPT0xOgorICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IHN0cihzZWxmLmJ5dGVzX3NlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIFRyeSBmb3IgY2h1bmtlZCBlbmNvZGluZyBpZiBvcmlnaW4gc2VydmVyIGFuZCBjbGllbnQgaXMgMS4xCisKKworICAgIGRlZiBjbGVhbnVwX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIk1ha2UgYW55IG5lY2Vzc2FyeSBoZWFkZXIgY2hhbmdlcyBvciBkZWZhdWx0cworCisgICAgICAgIFN1YmNsYXNzZXMgY2FuIGV4dGVuZCB0aGlzIHRvIGFkZCBvdGhlciBkZWZhdWx0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcnMuaGFzX2tleSgnQ29udGVudC1MZW5ndGgnKToKKyAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRlbnRfbGVuZ3RoKCkKKworICAgIGRlZiBzdGFydF9yZXNwb25zZShzZWxmLCBzdGF0dXMsIGhlYWRlcnMsZXhjX2luZm89Tm9uZSk6CisgICAgICAgICIiIidzdGFydF9yZXNwb25zZSgpJyBjYWxsYWJsZSBhcyBzcGVjaWZpZWQgYnkgUEVQIDMzMyIiIgorCisgICAgICAgIGlmIGV4Y19pbmZvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgICAgICAgICAjIFJlLXJhaXNlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpZiBoZWFkZXJzIHNlbnQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUgICAgICAgICMgYXZvaWQgZGFuZ2xpbmcgY2lyY3VsYXIgcmVmCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkhlYWRlcnMgYWxyZWFkeSBzZXQhIikKKworICAgICAgICBhc3NlcnQgdHlwZShzdGF0dXMpIGlzIFN0cmluZ1R5cGUsIlN0YXR1cyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICBhc3NlcnQgbGVuKHN0YXR1cyk+PTQsIlN0YXR1cyBtdXN0IGJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyIKKyAgICAgICAgYXNzZXJ0IGludChzdGF0dXNbOjNdKSwiU3RhdHVzIG1lc3NhZ2UgbXVzdCBiZWdpbiB3LzMtZGlnaXQgY29kZSIKKyAgICAgICAgYXNzZXJ0IHN0YXR1c1szXT09IiAiLCAiU3RhdHVzIG1lc3NhZ2UgbXVzdCBoYXZlIGEgc3BhY2UgYWZ0ZXIgY29kZSIKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgZm9yIG5hbWUsdmFsIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUobmFtZSkgaXMgU3RyaW5nVHlwZSwiSGVhZGVyIG5hbWVzIG11c3QgYmUgc3RyaW5ncyIKKyAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSh2YWwpIGlzIFN0cmluZ1R5cGUsIkhlYWRlciB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgICAgIGFzc2VydCBub3QgaXNfaG9wX2J5X2hvcChuYW1lKSwiSG9wLWJ5LWhvcCBoZWFkZXJzIG5vdCBhbGxvd2VkIgorICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cworICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLmhlYWRlcnNfY2xhc3MoaGVhZGVycykKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGUKKworCisgICAgZGVmIHNlbmRfcHJlYW1ibGUoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IHZlcnNpb24vc3RhdHVzL2RhdGUvc2VydmVyLCB2aWEgc2VsZi5fd3JpdGUoKSIiIgorICAgICAgICBpZiBzZWxmLm9yaWdpbl9zZXJ2ZXI6CisgICAgICAgICAgICBpZiBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgnSFRUUC8lcyAlc1xyXG4nICUgKHNlbGYuaHR0cF92ZXJzaW9uLHNlbGYuc3RhdHVzKSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzLmhhc19rZXkoJ0RhdGUnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZTogJXNcclxuJyAlIGZvcm1hdF9kYXRlX3RpbWUodGltZS50aW1lKCkpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlcnZlcl9zb2Z0d2FyZSBhbmQgbm90IHNlbGYuaGVhZGVycy5oYXNfa2V5KCdTZXJ2ZXInKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1NlcnZlcjogJXNcclxuJyAlIHNlbGYuc2VydmVyX3NvZnR3YXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1N0YXR1czogJXNcclxuJyAlIHNlbGYuc3RhdHVzKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiInd3JpdGUoKScgY2FsbGFibGUgYXMgc3BlY2lmaWVkIGJ5IFBFUCAzMzMiIiIKKworICAgICAgICBhc3NlcnQgdHlwZShkYXRhKSBpcyBTdHJpbmdUeXBlLCJ3cml0ZSgpIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nIgorCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXR1czoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ3cml0ZSgpIGJlZm9yZSBzdGFydF9yZXNwb25zZSgpIikKKworICAgICAgICBlbGlmIG5vdCBzZWxmLmhlYWRlcnNfc2VudDoKKyAgICAgICAgICAgICMgQmVmb3JlIHRoZSBmaXJzdCBvdXRwdXQsIHNlbmQgdGhlIHN0b3JlZCBoZWFkZXJzCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSBsZW4oZGF0YSkgICAgIyBtYWtlIHN1cmUgd2Uga25vdyBjb250ZW50LWxlbmd0aAorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcnMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ieXRlc19zZW50ICs9IGxlbihkYXRhKQorCisgICAgICAgICMgWFhYIGNoZWNrIENvbnRlbnQtTGVuZ3RoIGFuZCB0cnVuY2F0ZSBpZiB0b28gbWFueSBieXRlcyB3cml0dGVuPworICAgICAgICBzZWxmLl93cml0ZShkYXRhKQorICAgICAgICBzZWxmLl9mbHVzaCgpCisKKworICAgIGRlZiBzZW5kZmlsZShzZWxmKToKKyAgICAgICAgIiIiUGxhdGZvcm0tc3BlY2lmaWMgZmlsZSB0cmFuc21pc3Npb24KKworICAgICAgICBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHN1cHBvcnQgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgZmlsZSB0cmFuc21pc3Npb24uICBJdCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgYXBwbGljYXRpb24ncworICAgICAgICByZXR1cm4gaXRlcmFibGUgKCdzZWxmLnJlc3VsdCcpIGlzIGFuIGluc3RhbmNlIG9mCisgICAgICAgICdzZWxmLndzZ2lfZmlsZV93cmFwcGVyJy4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBpdCB3YXMgYWJsZSB0byBhY3R1YWxseQorICAgICAgICB0cmFuc21pdCB0aGUgd3JhcHBlZCBmaWxlLWxpa2Ugb2JqZWN0IHVzaW5nIGEgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgYXBwcm9hY2guICBJdCBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgaWYgbm9ybWFsIGl0ZXJhdGlvbgorICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiAgQW4gZXhjZXB0aW9uIGNhbiBiZSByYWlzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgdGhhdCB0cmFuc21pc3Npb24gd2FzIGF0dGVtcHRlZCwgYnV0IGZhaWxlZC4KKworICAgICAgICBOT1RFOiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCAnc2VsZi5zZW5kX2hlYWRlcnMoKScgaWYKKyAgICAgICAgJ3NlbGYuaGVhZGVyc19zZW50JyBpcyBmYWxzZSBhbmQgaXQgaXMgZ29pbmcgdG8gYXR0ZW1wdCBkaXJlY3QKKyAgICAgICAgdHJhbnNtaXNzaW9uIG9mIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlICAgIyBObyBwbGF0Zm9ybS1zcGVjaWZpYyB0cmFuc21pc3Npb24gYnkgZGVmYXVsdAorCisKKyAgICBkZWYgZmluaXNoX2NvbnRlbnQoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBoZWFkZXJzIGFuZCBjb250ZW50IGhhdmUgYm90aCBiZWVuIHNlbnQiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gIjAiCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzICMgWFhYIGNoZWNrIGlmIGNvbnRlbnQtbGVuZ3RoIHdhcyB0b28gc2hvcnQ/CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBpdGVyYWJsZSAoaWYgbmVlZGVkKSBhbmQgcmVzZXQgYWxsIGluc3RhbmNlIHZhcnMKKworICAgICAgICBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGFsc28gZHJvcCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucmVzdWx0LCdjbG9zZScpOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0LmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gc2VsZi5oZWFkZXJzID0gc2VsZi5zdGF0dXMgPSBzZWxmLmVudmlyb24gPSBOb25lCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSAwOyBzZWxmLmhlYWRlcnNfc2VudCA9IEZhbHNlCisKKworICAgIGRlZiBzZW5kX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IGhlYWRlcnMgdG8gdGhlIGNsaWVudCwgdmlhIHNlbGYuX3dyaXRlKCkiIiIKKyAgICAgICAgc2VsZi5jbGVhbnVwX2hlYWRlcnMoKQorICAgICAgICBzZWxmLmhlYWRlcnNfc2VudCA9IFRydWUKKyAgICAgICAgaWYgbm90IHNlbGYub3JpZ2luX3NlcnZlciBvciBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9wcmVhbWJsZSgpCisgICAgICAgICAgICBzZWxmLl93cml0ZShzdHIoc2VsZi5oZWFkZXJzKSkKKworCisgICAgZGVmIHJlc3VsdF9pc19maWxlKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmICdzZWxmLnJlc3VsdCcgaXMgYW4gaW5zdGFuY2Ugb2YgJ3NlbGYud3NnaV9maWxlX3dyYXBwZXInIiIiCisgICAgICAgIHdyYXBwZXIgPSBzZWxmLndzZ2lfZmlsZV93cmFwcGVyCisgICAgICAgIHJldHVybiB3cmFwcGVyIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKHNlbGYucmVzdWx0LHdyYXBwZXIpCisKKworICAgIGRlZiBjbGllbnRfaXNfbW9kZXJuKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmIGNsaWVudCBjYW4gYWNjZXB0IHN0YXR1cyBhbmQgaGVhZGVycyIiIgorICAgICAgICByZXR1cm4gc2VsZi5lbnZpcm9uWydTRVJWRVJfUFJPVE9DT0wnXS51cHBlcigpICE9ICdIVFRQLzAuOScKKworCisgICAgZGVmIGxvZ19leGNlcHRpb24oc2VsZixleGNfaW5mbyk6CisgICAgICAgICIiIkxvZyB0aGUgJ2V4Y19pbmZvJyB0dXBsZSBpbiB0aGUgc2VydmVyIGxvZworCisgICAgICAgIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldGFyZ2V0IHRoZSBvdXRwdXQgb3IgY2hhbmdlIGl0cyBmb3JtYXQuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRyYWNlYmFjayBpbXBvcnQgcHJpbnRfZXhjZXB0aW9uCisgICAgICAgICAgICBzdGRlcnIgPSBzZWxmLmdldF9zdGRlcnIoKQorICAgICAgICAgICAgcHJpbnRfZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGV4Y19pbmZvWzBdLCBleGNfaW5mb1sxXSwgZXhjX2luZm9bMl0sCisgICAgICAgICAgICAgICAgc2VsZi50cmFjZWJhY2tfbGltaXQsIHN0ZGVycgorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgIiIiTG9nIGN1cnJlbnQgZXJyb3IsIGFuZCBzZW5kIGVycm9yIG91dHB1dCB0byBjbGllbnQgaWYgcG9zc2libGUiIiIKKyAgICAgICAgc2VsZi5sb2dfZXhjZXB0aW9uKHN5cy5leGNfaW5mbygpKQorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHNlbGYuZXJyb3Jfb3V0cHV0KHNlbGYuZW52aXJvbiwgc2VsZi5zdGFydF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Jlc3BvbnNlKCkKKyAgICAgICAgIyBYWFggZWxzZTogYXR0ZW1wdCBhZHZhbmNlZCByZWNvdmVyeSB0ZWNobmlxdWVzIGZvciBIVE1MIG9yIHRleHQ/CisKKyAgICBkZWYgZXJyb3Jfb3V0cHV0KHNlbGYsIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgIiIiV1NHSSBtaW5pLWFwcCB0byBjcmVhdGUgZXJyb3Igb3V0cHV0CisKKyAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBqdXN0IHVzZXMgdGhlICdlcnJvcl9zdGF0dXMnLCAnZXJyb3JfaGVhZGVycycsCisgICAgICAgIGFuZCAnZXJyb3JfYm9keScgYXR0cmlidXRlcyB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgcGFnZS4gIEl0IGNhbgorICAgICAgICBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgZGlhZ25vc3RpY3MsCisgICAgICAgIGNob29zZSBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBsYW5ndWFnZSwgZXRjLgorCisgICAgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQncyBub3QgcmVjb21tZW5kZWQgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlIHRvCisgICAgICAgIHNwaXQgb3V0IGRpYWdub3N0aWNzIHRvIGFueSBvbGQgdXNlcjsgaWRlYWxseSwgeW91IHNob3VsZCBoYXZlIHRvIGRvCisgICAgICAgIHNvbWV0aGluZyBzcGVjaWFsIHRvIGVuYWJsZSBkaWFnbm9zdGljIG91dHB1dCwgd2hpY2ggaXMgd2h5IHdlIGRvbid0CisgICAgICAgIGluY2x1ZGUgYW55IGhlcmUhCisgICAgICAgICIiIgorICAgICAgICBzdGFydF9yZXNwb25zZShzZWxmLmVycm9yX3N0YXR1cyxzZWxmLmVycm9yX2hlYWRlcnNbOl0sc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIHJldHVybiBbc2VsZi5lcnJvcl9ib2R5XQorCisKKyAgICAjIFB1cmUgYWJzdHJhY3QgbWV0aG9kczsgKm11c3QqIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcworCisgICAgZGVmIF93cml0ZShzZWxmLGRhdGEpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBidWZmZXIgZGF0YSBmb3Igc2VuZCB0byBjbGllbnQKKworICAgICAgICBJdCdzIG9rYXkgaWYgdGhpcyBtZXRob2QgYWN0dWFsbHkgdHJhbnNtaXRzIHRoZSBkYXRhOyBCYXNlSGFuZGxlcgorICAgICAgICBqdXN0IHNlcGFyYXRlcyB3cml0ZSBhbmQgZmx1c2ggb3BlcmF0aW9ucyBmb3IgZ3JlYXRlciBlZmZpY2llbmN5CisgICAgICAgIHdoZW4gdGhlIHVuZGVybHlpbmcgc3lzdGVtIGFjdHVhbGx5IGhhcyBzdWNoIGEgZGlzdGluY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBmb3JjZSBzZW5kaW5nIG9mIHJlY2VudCAnX3dyaXRlKCknIGNhbGxzCisKKyAgICAgICAgSXQncyBva2F5IGlmIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AgKGkuZS4sIGlmICdfd3JpdGUoKScgYWN0dWFsbHkKKyAgICAgICAgc2VuZHMgdGhlIGRhdGEuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZ2V0X3N0ZGluKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuaW5wdXQnIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuZXJyb3JzJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgYWRkX2NnaV92YXJzKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBpbnNlcnQgQ0dJIHZhcmlhYmxlcyBpbiAnc2VsZi5lbnZpcm9uJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworCisKKworCisKKworCisKKworY2xhc3MgU2ltcGxlSGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgIiIiSGFuZGxlciB0aGF0J3MganVzdCBpbml0aWFsaXplZCB3aXRoIHN0cmVhbXMsIGVudmlyb25tZW50LCBldGMuCisKKyAgICBUaGlzIGhhbmRsZXIgc3ViY2xhc3MgaXMgaW50ZW5kZWQgZm9yIHN5bmNocm9ub3VzIEhUVFAvMS4wIG9yaWdpbiBzZXJ2ZXJzLAorICAgIGFuZCBoYW5kbGVzIHNlbmRpbmcgdGhlIGVudGlyZSByZXNwb25zZSBvdXRwdXQsIGdpdmVuIHRoZSBjb3JyZWN0IGlucHV0cy4KKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gU2ltcGxlSGFuZGxlcigKKyAgICAgICAgICAgIGlucCxvdXQsZXJyLGVudiwgbXVsdGl0aHJlYWQ9RmFsc2UsIG11bHRpcHJvY2Vzcz1UcnVlCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5ydW4oYXBwKSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsc3RkaW4sc3Rkb3V0LHN0ZGVycixlbnZpcm9uLAorICAgICAgICBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9RmFsc2UKKyAgICApOgorICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKKyAgICAgICAgc2VsZi5iYXNlX2VudiA9IGVudmlyb24KKyAgICAgICAgc2VsZi53c2dpX211bHRpdGhyZWFkID0gbXVsdGl0aHJlYWQKKyAgICAgICAgc2VsZi53c2dpX211bHRpcHJvY2VzcyA9IG11bHRpcHJvY2VzcworCisgICAgZGVmIGdldF9zdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RkaW4KKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRlcnIKKworICAgIGRlZiBhZGRfY2dpX3ZhcnMoc2VsZik6CisgICAgICAgIHNlbGYuZW52aXJvbi51cGRhdGUoc2VsZi5iYXNlX2VudikKKworICAgIGRlZiBfd3JpdGUoc2VsZixkYXRhKToKKyAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5fd3JpdGUgPSBzZWxmLnN0ZG91dC53cml0ZQorCisgICAgZGVmIF9mbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5zdGRvdXQuZmx1c2goKQorICAgICAgICBzZWxmLl9mbHVzaCA9IHNlbGYuc3Rkb3V0LmZsdXNoCisKKworY2xhc3MgQmFzZUNHSUhhbmRsZXIoU2ltcGxlSGFuZGxlcik6CisKKyAgICAiIiJDR0ktbGlrZSBzeXN0ZW1zIHVzaW5nIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBlbnZpcm9uIG1hcHBpbmcKKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gQmFzZUNHSUhhbmRsZXIoaW5wLG91dCxlcnIsZW52KQorICAgICAgICBoYW5kbGVyLnJ1bihhcHApCisKKyAgICBUaGlzIGhhbmRsZXIgY2xhc3MgaXMgdXNlZnVsIGZvciBnYXRld2F5IHByb3RvY29scyBsaWtlIFJlYWR5RXhlYyBhbmQKKyAgICBGYXN0Q0dJLCB0aGF0IGhhdmUgdXNhYmxlIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBhbiBlbnZpcm9ubWVudAorICAgIG1hcHBpbmcuICBJdCdzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yIENHSUhhbmRsZXIsIHdoaWNoIGp1c3QgdXNlcworICAgIHN5cy5zdGRpbiwgb3MuZW52aXJvbiwgYW5kIHNvIG9uLgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGFsc28gdGFrZXMga2V5d29yZCBhcmd1bWVudHMgJ211bHRpdGhyZWFkJyBhbmQKKyAgICAnbXVsdGlwcm9jZXNzJyAoZGVmYXVsdGluZyB0byAnVHJ1ZScgYW5kICdGYWxzZScgcmVzcGVjdGl2ZWx5KSB0byBjb250cm9sCisgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2VudCB0byB0aGUgYXBwbGljYXRpb24uICBJdCBzZXRzICdvcmlnaW5fc2VydmVyJyB0bworICAgIEZhbHNlICh0byBlbmFibGUgQ0dJLWxpa2Ugb3V0cHV0KSwgYW5kIGFzc3VtZXMgdGhhdCAnd3NnaS5ydW5fb25jZScgaXMKKyAgICBGYWxzZS4KKyAgICAiIiIKKworICAgIG9yaWdpbl9zZXJ2ZXIgPSBGYWxzZQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBDR0lIYW5kbGVyKEJhc2VDR0lIYW5kbGVyKToKKworICAgICIiIkNHSS1iYXNlZCBpbnZvY2F0aW9uIHZpYSBzeXMuc3RkaW4vc3Rkb3V0L3N0ZGVyciBhbmQgb3MuZW52aXJvbgorCisgICAgVXNhZ2U6OgorCisgICAgICAgIENHSUhhbmRsZXIoKS5ydW4oYXBwKQorCisgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGNsYXNzIGFuZCBCYXNlQ0dJSGFuZGxlciBpcyB0aGF0IGl0IGFsd2F5cworICAgIHVzZXMgJ3dzZ2kucnVuX29uY2UnIG9mICdUcnVlJywgJ3dzZ2kubXVsdGl0aHJlYWQnIG9mICdGYWxzZScsIGFuZAorICAgICd3c2dpLm11bHRpcHJvY2Vzcycgb2YgJ1RydWUnLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgaW5pdGlhbGl6YXRpb24KKyAgICBwYXJhbWV0ZXJzLCBidXQgYWx3YXlzIHVzZXMgJ3N5cy5zdGRpbicsICdvcy5lbnZpcm9uJywgYW5kIGZyaWVuZHMuCisKKyAgICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSBhbnkgb2YgdGhlc2UgcGFyYW1ldGVycywgdXNlIEJhc2VDR0lIYW5kbGVyCisgICAgaW5zdGVhZC4KKyAgICAiIiIKKworICAgIHdzZ2lfcnVuX29uY2UgPSBUcnVlCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEJhc2VDR0lIYW5kbGVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyLCBkaWN0KG9zLmVudmlyb24uaXRlbXMoKSksCisgICAgICAgICAgICBtdWx0aXRocmVhZD1GYWxzZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisjCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9oZWFkZXJzLnB5IGIvTGliL3dzZ2lyZWYvaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZlYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYvaGVhZGVycy5weQpAQCAtMCwwICsxLDIwNSBAQAorIiIiTWFuYWdlIEhUVFAgUmVzcG9uc2UgSGVhZGVycworCitNdWNoIG9mIHRoaXMgbW9kdWxlIGlzIHJlZC1oYW5kZWRseSBwaWxmZXJlZCBmcm9tIGVtYWlsLk1lc3NhZ2UgaW4gdGhlIHN0ZGxpYiwKK3NvIHBvcnRpb25zIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kIHdlcmUKK3dyaXR0ZW4gYnkgQmFycnkgV2Fyc2F3LgorIiIiCisKK2Zyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlLCBUdXBsZVR5cGUKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGBzcGVjaWFsJyBjaGFyYWN0ZXJzIGluIHBhcmFtZXRlcnMsIHRoZQorIyBleGlzdGFuY2Ugb2Ygd2hpY2ggZm9yY2UgcXVvdGluZyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlLgoraW1wb3J0IHJlCit0c3BlY2lhbHMgPSByZS5jb21waWxlKHInWyBcKFwpPD5ALDs6XFwiL1xbXF1cPz1dJykKKworZGVmIF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWU9Tm9uZSwgcXVvdGU9MSk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCByZXR1cm4gYSBrZXk9dmFsdWUgcGFpci4KKworICAgIFRoaXMgd2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIGxlbih2YWx1ZSkgPiAwOgorICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoJyInLCByJ1wiJykKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcz0lcycgJSAocGFyYW0sIHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYXJhbQorCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIEhlYWRlcnM6CisKKyAgICAiIiJNYW5hZ2UgYSBjb2xsZWN0aW9uIG9mIEhUVFAgcmVzcG9uc2UgaGVhZGVycyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsaGVhZGVycyk6CisgICAgICAgIGlmIHR5cGUoaGVhZGVycykgaXMgbm90IExpc3RUeXBlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJIZWFkZXJzIG11c3QgYmUgYSBsaXN0IG9mIG5hbWUvdmFsdWUgdHVwbGVzIikKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IGhlYWRlcnMKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBoZWFkZXJzLCBpbmNsdWRpbmcgZHVwbGljYXRlcy4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9oZWFkZXJzKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbCk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuIiIiCisgICAgICAgIGRlbCBzZWxmW25hbWVdCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLCB2YWwpKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBoZWFkZXIsIGlmIHByZXNlbnQuCisKKyAgICAgICAgRG9lcyAqbm90KiByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBzZWxmLl9oZWFkZXJzWzpdID0gW2t2IGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzIGlmIGt2WzBdLmxvd2VyKCk8Pm5hbWVdCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixuYW1lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJworCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgaGVhZGVyIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzLCB0aGUgZmlyc3QgZXhhY3RseSB3aGljaAorICAgICAgICBvY2N1cnJhbmNlIGdldHMgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLiAgVXNlIGdldGFsbCgpIHRvIGdldCBhbGwKKyAgICAgICAgdGhlIHZhbHVlcyBtYXRjaGluZyBhIGhlYWRlciBmaWVsZCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpCisKKworCisKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkgaXMgbm90IE5vbmUKKworICAgIF9fY29udGFpbnNfXyA9IGhhc19rZXkKKworCisgICAgZGVmIGdldF9hbGwoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBmaWVsZC4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3Qgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4gIEFueQorICAgICAgICBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyIGxpc3QuCisgICAgICAgIElmIG5vIGZpZWxkcyBleGlzdCB3aXRoIHRoZSBnaXZlbiBuYW1lLCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIHJldHVybiBba3ZbMV0gZm9yIGt2IGluIHNlbGYuX2hlYWRlcnMgaWYga3ZbMF0ubG93ZXIoKT09bmFtZV0KKworCisgICAgZGVmIGdldChzZWxmLG5hbWUsZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJywgb3IgcmV0dXJuICdkZWZhdWx0JyIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGZvciBrLHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKT09bmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGhlYWRlciBmaWVsZCBuYW1lcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3QsIG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW2sgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworCisKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGhlYWRlciB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0LCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt2IGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgdGhlIGhlYWRlciBmaWVsZHMgYW5kIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCwgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzWzpdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSGVhZGVycyglcykiICUgYHNlbGYuX2hlYWRlcnNgCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIic3RyKCkgcmV0dXJucyB0aGUgZm9ybWF0dGVkIGhlYWRlcnMsIGNvbXBsZXRlIHdpdGggZW5kIGxpbmUsCisgICAgICAgIHN1aXRhYmxlIGZvciBkaXJlY3QgSFRUUCB0cmFuc21pc3Npb24uIiIiCisgICAgICAgIHJldHVybiAnXHJcbicuam9pbihbIiVzOiAlcyIgJSBrdiBmb3Iga3YgaW4gc2VsZi5faGVhZGVyc10rWycnLCcnXSkKKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgICIiIlJldHVybiBmaXJzdCBtYXRjaGluZyBoZWFkZXIgdmFsdWUgZm9yICduYW1lJywgb3IgJ3ZhbHVlJworCisgICAgICAgIElmIHRoZXJlIGlzIG5vIGhlYWRlciBuYW1lZCAnbmFtZScsIGFkZCBhIG5ldyBoZWFkZXIgd2l0aCBuYW1lICduYW1lJworICAgICAgICBhbmQgdmFsdWUgJ3ZhbHVlJy4iIiIKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXQobmFtZSkKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgobmFtZSx2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworCisgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwgX25hbWUsIF92YWx1ZSwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuCisKKyAgICAgICAgX25hbWUgaXMgdGhlIGhlYWRlciBmaWVsZCB0byBhZGQuICBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBzZXQKKyAgICAgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgaGVhZGVyIGZpZWxkLCB3aXRoIHVuZGVyc2NvcmVzIGNvbnZlcnRlZAorICAgICAgICB0byBkYXNoZXMuICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgYXMga2V5PSJ2YWx1ZSIgdW5sZXNzCisgICAgICAgIHZhbHVlIGlzIE5vbmUsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUga2V5IHdpbGwgYmUgYWRkZWQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKworICAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRoZSBjb3JyZXNwb25kaW5nICdlbWFpbC5NZXNzYWdlJyBtZXRob2QsIHRoaXMgZG9lcworICAgICAgICAqbm90KiBoYW5kbGUgJyhjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpJyB0dXBsZXM6IGFsbCB2YWx1ZXMgbXVzdCBiZQorICAgICAgICBzdHJpbmdzIG9yIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIGlmIF92YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChfdmFsdWUpCisgICAgICAgIGZvciBrLCB2IGluIF9wYXJhbXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoay5yZXBsYWNlKCdfJywgJy0nKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKF9mb3JtYXRwYXJhbShrLnJlcGxhY2UoJ18nLCAnLScpLCB2KSkKKyAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKF9uYW1lLCAiOyAiLmpvaW4ocGFydHMpKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKyMKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTk2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJCYXNlSFRUUFNlcnZlciB0aGF0IGltcGxlbWVudHMgdGhlIFB5dGhvbiBXU0dJIHByb3RvY29sIChQRVAgMzMzLCByZXYgMS4yMSkKKworVGhpcyBpcyBib3RoIGFuIGV4YW1wbGUgb2YgaG93IFdTR0kgY2FuIGJlIGltcGxlbWVudGVkLCBhbmQgYSBiYXNpcyBmb3IgcnVubmluZworc2ltcGxlIHdlYiBhcHBsaWNhdGlvbnMgb24gYSBsb2NhbCBtYWNoaW5lLCBzdWNoIGFzIG1pZ2h0IGJlIGRvbmUgd2hlbiB0ZXN0aW5nCitvciBkZWJ1Z2dpbmcgYW4gYXBwbGljYXRpb24uICBJdCBoYXMgbm90IGJlZW4gcmV2aWV3ZWQgZm9yIHNlY3VyaXR5IGlzc3VlcywKK2hvd2V2ZXIsIGFuZCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgInJlYWwiIHdlYiBzZXJ2ZXIgZm9yCitwcm9kdWN0aW9uIHVzZS4KKworRm9yIGV4YW1wbGUgdXNhZ2UsIHNlZSB0aGUgJ2lmIF9fbmFtZV9fPT0iX19tYWluX18iJyBibG9jayBhdCB0aGUgZW5kIG9mIHRoZQorbW9kdWxlLiAgU2VlIGFsc28gdGhlIEJhc2VIVFRQU2VydmVyIG1vZHVsZSBkb2NzIGZvciBvdGhlciBBUEkgaW5mb3JtYXRpb24uCisiIiIKKworZnJvbSBCYXNlSFRUUFNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgoraW1wb3J0IHVybGxpYiwgc3lzCitmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IFNpbXBsZUhhbmRsZXIKKworX192ZXJzaW9uX18gPSAiMC4xIgorX19hbGxfXyA9IFsnV1NHSVNlcnZlcicsICdXU0dJUmVxdWVzdEhhbmRsZXInLCAnZGVtb19hcHAnLCAnbWFrZV9zZXJ2ZXInXQorCisKK3NlcnZlcl92ZXJzaW9uID0gIldTR0lTZXJ2ZXIvIiArIF9fdmVyc2lvbl9fCitzeXNfdmVyc2lvbiA9ICJQeXRob24vIiArIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KK3NvZnR3YXJlX3ZlcnNpb24gPSBzZXJ2ZXJfdmVyc2lvbiArICcgJyArIHN5c192ZXJzaW9uCisKKworY2xhc3MgU2VydmVySGFuZGxlcihTaW1wbGVIYW5kbGVyKToKKworICAgIHNlcnZlcl9zb2Z0d2FyZSA9IHNvZnR3YXJlX3ZlcnNpb24KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X2hhbmRsZXIubG9nX3JlcXVlc3QoCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMuc3BsaXQoJyAnLDEpWzBdLCBzZWxmLmJ5dGVzX3NlbnQKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIFNpbXBsZUhhbmRsZXIuY2xvc2Uoc2VsZikKKworCisKKworCitjbGFzcyBXU0dJU2VydmVyKEhUVFBTZXJ2ZXIpOgorCisgICAgIiIiQmFzZUhUVFBTZXJ2ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBQeXRob24gV1NHSSBwcm90b2NvbCIiIgorCisgICAgYXBwbGljYXRpb24gPSBOb25lCisKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKKyAgICAgICAgSFRUUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQorICAgICAgICBzZWxmLnNldHVwX2Vudmlyb24oKQorCisgICAgZGVmIHNldHVwX2Vudmlyb24oc2VsZik6CisgICAgICAgICMgU2V0IHVwIGJhc2UgZW52aXJvbm1lbnQKKyAgICAgICAgZW52ID0gc2VsZi5iYXNlX2Vudmlyb24gPSB7fQorICAgICAgICBlbnZbJ1NFUlZFUl9OQU1FJ10gPSBzZWxmLnNlcnZlcl9uYW1lCisgICAgICAgIGVudlsnR0FURVdBWV9JTlRFUkZBQ0UnXSA9ICdDR0kvMS4xJworICAgICAgICBlbnZbJ1NFUlZFUl9QT1JUJ10gPSBzdHIoc2VsZi5zZXJ2ZXJfcG9ydCkKKyAgICAgICAgZW52WydSRU1PVEVfSE9TVCddPScnCisgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXT0nJworICAgICAgICBlbnZbJ1NDUklQVF9OQU1FJ10gPSAnJworCisgICAgZGVmIGdldF9hcHAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFwcGxpY2F0aW9uCisKKyAgICBkZWYgc2V0X2FwcChzZWxmLGFwcGxpY2F0aW9uKToKKyAgICAgICAgc2VsZi5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBXU0dJUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisKKyAgICBzZXJ2ZXJfdmVyc2lvbiA9ICJXU0dJU2VydmVyLyIgKyBfX3ZlcnNpb25fXworCisgICAgZGVmIGdldF9lbnZpcm9uKHNlbGYpOgorICAgICAgICBlbnYgPSBzZWxmLnNlcnZlci5iYXNlX2Vudmlyb24uY29weSgpCisgICAgICAgIGVudlsnU0VSVkVSX1BST1RPQ09MJ10gPSBzZWxmLnJlcXVlc3RfdmVyc2lvbgorICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSBzZWxmLmNvbW1hbmQKKyAgICAgICAgaWYgJz8nIGluIHNlbGYucGF0aDoKKyAgICAgICAgICAgIHBhdGgscXVlcnkgPSBzZWxmLnBhdGguc3BsaXQoJz8nLDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoLHF1ZXJ5ID0gc2VsZi5wYXRoLCcnCisKKyAgICAgICAgZW52WydQQVRIX0lORk8nXSA9IHVybGxpYi51bnF1b3RlKHBhdGgpCisgICAgICAgIGVudlsnUVVFUllfU1RSSU5HJ10gPSBxdWVyeQorCisgICAgICAgIGhvc3QgPSBzZWxmLmFkZHJlc3Nfc3RyaW5nKCkKKyAgICAgICAgaWYgaG9zdCAhPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdOgorICAgICAgICAgICAgZW52WydSRU1PVEVfSE9TVCddID0gaG9zdAorICAgICAgICBlbnZbJ1JFTU9URV9BRERSJ10gPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdCisKKyAgICAgICAgaWYgc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9UWVBFJ10gPSBzZWxmLmhlYWRlcnMudHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlaGVhZGVyCisKKyAgICAgICAgbGVuZ3RoID0gc2VsZi5oZWFkZXJzLmdldGhlYWRlcignY29udGVudC1sZW5ndGgnKQorICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ10gPSBsZW5ndGgKKworICAgICAgICBmb3IgaCBpbiBzZWxmLmhlYWRlcnMuaGVhZGVyczoKKyAgICAgICAgICAgIGssdiA9IGguc3BsaXQoJzonLDEpCisgICAgICAgICAgICBrPWsucmVwbGFjZSgnLScsJ18nKS51cHBlcigpOyB2PXYuc3RyaXAoKQorICAgICAgICAgICAgaWYgayBpbiBlbnY6CisgICAgICAgICAgICAgICAgY29udGludWUgICAgICAgICAgICAgICAgICAgICMgc2tpcCBjb250ZW50IGxlbmd0aCwgdHlwZSxldGMuCisgICAgICAgICAgICBpZiAnSFRUUF8nK2sgaW4gZW52OgorICAgICAgICAgICAgICAgIGVudlsnSFRUUF8nK2tdICs9ICcsJyt2ICAgICAjIGNvbW1hLXNlcGFyYXRlIG11bHRpcGxlIGhlYWRlcnMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW52WydIVFRQXycra10gPSB2CisgICAgICAgIHJldHVybiBlbnYKKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIGEgc2luZ2xlIEhUVFAgcmVxdWVzdCIiIgorCisgICAgICAgIHNlbGYucmF3X3JlcXVlc3RsaW5lID0gc2VsZi5yZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKTogIyBBbiBlcnJvciBjb2RlIGhhcyBiZWVuIHNlbnQsIGp1c3QgZXhpdAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCisgICAgICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlLCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5yZXF1ZXN0X2hhbmRsZXIgPSBzZWxmICAgICAgIyBiYWNrcG9pbnRlciBmb3IgbG9nZ2luZworICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIGRlbW9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgIHByaW50ID4+c3Rkb3V0LCAiSGVsbG8gd29ybGQhIgorICAgIHByaW50ID4+c3Rkb3V0CisgICAgaCA9IGVudmlyb24uaXRlbXMoKTsgaC5zb3J0KCkKKyAgICBmb3Igayx2IGluIGg6CisgICAgICAgIHByaW50ID4+c3Rkb3V0LCBrLCc9JyxgdmAKKyAgICBzdGFydF9yZXNwb25zZSgiMjAwIE9LIiwgWygnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpXSkKKyAgICByZXR1cm4gW3N0ZG91dC5nZXR2YWx1ZSgpXQorCisKK2RlZiBtYWtlX3NlcnZlcigKKyAgICBob3N0LCBwb3J0LCBhcHAsIHNlcnZlcl9jbGFzcz1XU0dJU2VydmVyLCBoYW5kbGVyX2NsYXNzPVdTR0lSZXF1ZXN0SGFuZGxlcgorKToKKyAgICAiIiJDcmVhdGUgYSBuZXcgV1NHSSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGBob3N0YCBhbmQgYHBvcnRgIGZvciBgYXBwYCIiIgorICAgIHNlcnZlciA9IHNlcnZlcl9jbGFzcygoaG9zdCwgcG9ydCksIGhhbmRsZXJfY2xhc3MpCisgICAgc2VydmVyLnNldF9hcHAoYXBwKQorICAgIHJldHVybiBzZXJ2ZXIKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQorICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICBwcmludCAiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iCisgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICB3ZWJicm93c2VyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC94eXo/YWJjJykKKyAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKKworCisKKworCisKKworCisKKworCisKKyMKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3V0aWwucHkgYi9MaWIvd3NnaXJlZi91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDliODcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi91dGlsLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJNaXNjZWxsYW5lb3VzIFdTR0ktcmVsYXRlZCBVdGlsaXRpZXMiIiIKKworaW1wb3J0IHBvc2l4cGF0aAorCitfX2FsbF9fID0gWworICAgICdGaWxlV3JhcHBlcicsICdndWVzc19zY2hlbWUnLCAnYXBwbGljYXRpb25fdXJpJywgJ3JlcXVlc3RfdXJpJywKKyAgICAnc2hpZnRfcGF0aF9pbmZvJywgJ3NldHVwX3Rlc3RpbmdfZGVmYXVsdHMnLAorXQorCisKK2NsYXNzIEZpbGVXcmFwcGVyOgorICAgICIiIldyYXBwZXIgdG8gY29udmVydCBmaWxlLWxpa2Ugb2JqZWN0cyB0byBpdGVyYWJsZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbGlrZSwgYmxrc2l6ZT04MTkyKToKKyAgICAgICAgc2VsZi5maWxlbGlrZSA9IGZpbGVsaWtlCisgICAgICAgIHNlbGYuYmxrc2l6ZSA9IGJsa3NpemUKKyAgICAgICAgaWYgaGFzYXR0cihmaWxlbGlrZSwnY2xvc2UnKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBmaWxlbGlrZS5jbG9zZQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKworCisKKworCisKKworZGVmIGd1ZXNzX3NjaGVtZShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gYSBndWVzcyBmb3Igd2hldGhlciAnd3NnaS51cmxfc2NoZW1lJyBzaG91bGQgYmUgJ2h0dHAnIG9yICdodHRwcycKKyAgICAiIiIKKyAgICBpZiBlbnZpcm9uLmdldCgiSFRUUFMiKSBpbiAoJ3llcycsJ29uJywnMScpOgorICAgICAgICByZXR1cm4gJ2h0dHBzJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnaHR0cCcKKworZGVmIGFwcGxpY2F0aW9uX3VyaShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBVUkkgKG5vIFBBVEhfSU5GTyBvciBRVUVSWV9TVFJJTkcpIiIiCisgICAgdXJsID0gZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10rJzovLycKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgcXVvdGUKKworICAgIGlmIGVudmlyb24uZ2V0KCdIVFRQX0hPU1QnKToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ0hUVFBfSE9TVCddCisgICAgZWxzZToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ1NFUlZFUl9OQU1FJ10KKworICAgICAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnNDQzJzoKKyAgICAgICAgICAgICAgICB1cmwgKz0gJzonICsgZW52aXJvblsnU0VSVkVSX1BPUlQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnODAnOgorICAgICAgICAgICAgICAgIHVybCArPSAnOicgKyBlbnZpcm9uWydTRVJWRVJfUE9SVCddCisKKyAgICB1cmwgKz0gcXVvdGUoZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJykgb3IgJy8nKQorICAgIHJldHVybiB1cmwKKworZGVmIHJlcXVlc3RfdXJpKGVudmlyb24sIGluY2x1ZGVfcXVlcnk9MSk6CisgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHJlcXVlc3QgVVJJLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nIiIiCisgICAgdXJsID0gYXBwbGljYXRpb25fdXJpKGVudmlyb24pCisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHF1b3RlCisgICAgcGF0aF9pbmZvID0gcXVvdGUoZW52aXJvbi5nZXQoJ1BBVEhfSU5GTycsJycpKQorICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgdXJsICs9IHBhdGhfaW5mb1sxOl0KKyAgICBlbHNlOgorICAgICAgICB1cmwgKz0gcGF0aF9pbmZvCisgICAgaWYgaW5jbHVkZV9xdWVyeSBhbmQgZW52aXJvbi5nZXQoJ1FVRVJZX1NUUklORycpOgorICAgICAgICB1cmwgKz0gJz8nICsgZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICByZXR1cm4gdXJsCisKK2RlZiBzaGlmdF9wYXRoX2luZm8oZW52aXJvbik6CisgICAgIiIiU2hpZnQgYSBuYW1lIGZyb20gUEFUSF9JTkZPIHRvIFNDUklQVF9OQU1FLCByZXR1cm5pbmcgaXQKKworICAgIElmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgcGF0aCBzZWdtZW50cyBpbiBQQVRIX0lORk8sIHJldHVybiBOb25lLgorICAgIE5vdGU6ICdlbnZpcm9uJyBpcyBtb2RpZmllZCBpbi1wbGFjZTsgdXNlIGEgY29weSBpZiB5b3UgbmVlZCB0byBrZWVwCisgICAgdGhlIG9yaWdpbmFsIFBBVEhfSU5GTyBvciBTQ1JJUFRfTkFNRS4KKworICAgIE5vdGU6IHdoZW4gUEFUSF9JTkZPIGlzIGp1c3QgYSAnLycsIHRoaXMgcmV0dXJucyAnJyBhbmQgYXBwZW5kcyBhIHRyYWlsaW5nCisgICAgJy8nIHRvIFNDUklQVF9OQU1FLCBldmVuIHRob3VnaCBlbXB0eSBwYXRoIHNlZ21lbnRzIGFyZSBub3JtYWxseSBpZ25vcmVkLAorICAgIGFuZCBTQ1JJUFRfTkFNRSBkb2Vzbid0IG5vcm1hbGx5IGVuZCBpbiBhICcvJy4gIFRoaXMgaXMgaW50ZW50aW9uYWwKKyAgICBiZWhhdmlvciwgdG8gZW5zdXJlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICcveCcgYW5kICcveC8nIHdoZW4gdHJhdmVyc2luZyB0byBvYmplY3RzLgorICAgICIiIgorICAgIHBhdGhfaW5mbyA9IGVudmlyb24uZ2V0KCdQQVRIX0lORk8nLCcnKQorICAgIGlmIG5vdCBwYXRoX2luZm86CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBwYXRoX3BhcnRzID0gcGF0aF9pbmZvLnNwbGl0KCcvJykKKyAgICBwYXRoX3BhcnRzWzE6LTFdID0gW3AgZm9yIHAgaW4gcGF0aF9wYXJ0c1sxOi0xXSBpZiBwIGFuZCBwPD4nLiddCisgICAgbmFtZSA9IHBhdGhfcGFydHNbMV0KKyAgICBkZWwgcGF0aF9wYXJ0c1sxXQorCisgICAgc2NyaXB0X25hbWUgPSBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnLCcnKQorICAgIHNjcmlwdF9uYW1lID0gcG9zaXhwYXRoLm5vcm1wYXRoKHNjcmlwdF9uYW1lKycvJytuYW1lKQorICAgIGlmIHNjcmlwdF9uYW1lLmVuZHN3aXRoKCcvJyk6CisgICAgICAgIHNjcmlwdF9uYW1lID0gc2NyaXB0X25hbWVbOi0xXQorICAgIGlmIG5vdCBuYW1lIGFuZCBub3Qgc2NyaXB0X25hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgc2NyaXB0X25hbWUgKz0gJy8nCisKKyAgICBlbnZpcm9uWydTQ1JJUFRfTkFNRSddID0gc2NyaXB0X25hbWUKKyAgICBlbnZpcm9uWydQQVRIX0lORk8nXSAgID0gJy8nLmpvaW4ocGF0aF9wYXJ0cykKKworICAgICMgU3BlY2lhbCBjYXNlOiAnLy4nIG9uIFBBVEhfSU5GTyBkb2Vzbid0IGdldCBzdHJpcHBlZCwKKyAgICAjIGJlY2F1c2Ugd2UgZG9uJ3Qgc3RyaXAgdGhlIGxhc3QgZWxlbWVudCBvZiBQQVRIX0lORk8KKyAgICAjIGlmIHRoZXJlJ3Mgb25seSBvbmUgcGF0aCBwYXJ0IGxlZnQuICBJbnN0ZWFkIG9mIGZpeGluZyB0aGlzCisgICAgIyBhYm92ZSwgd2UgZml4IGl0IGhlcmUgc28gdGhhdCBQQVRIX0lORk8gZ2V0cyBub3JtYWxpemVkIHRvCisgICAgIyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGVudmlyb24uCisgICAgaWYgbmFtZT09Jy4nOgorICAgICAgICBuYW1lID0gTm9uZQorICAgIHJldHVybiBuYW1lCisKK2RlZiBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudmlyb24pOgorICAgICIiIlVwZGF0ZSAnZW52aXJvbicgd2l0aCB0cml2aWFsIGRlZmF1bHRzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisKKyAgICBUaGlzIGFkZHMgdmFyaW91cyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBXU0dJLCBpbmNsdWRpbmcgSFRUUF9IT1NULAorICAgIFNFUlZFUl9OQU1FLCBTRVJWRVJfUE9SVCwgUkVRVUVTVF9NRVRIT0QsIFNDUklQVF9OQU1FLCBQQVRIX0lORk8sCisgICAgYW5kIGFsbCBvZiB0aGUgd3NnaS4qIHZhcmlhYmxlcy4gIEl0IG9ubHkgc3VwcGxpZXMgZGVmYXVsdCB2YWx1ZXMsCisgICAgYW5kIGRvZXMgbm90IHJlcGxhY2UgYW55IGV4aXN0aW5nIHNldHRpbmdzIGZvciB0aGVzZSB2YXJpYWJsZXMuCisKKyAgICBUaGlzIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVuaXQgdGVzdHMgb2YgV1NHSQorICAgIHNlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyB0byBzZXQgdXAgZHVtbXkgZW52aXJvbm1lbnRzLiAgSXQgc2hvdWxkICpub3QqCisgICAgYmUgdXNlZCBieSBhY3R1YWwgV1NHSSBzZXJ2ZXJzIG9yIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIGRhdGEgaXMgZmFrZSEKKyAgICAiIiIKKworICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKQorCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdIVFRQX0hPU1QnLGVudmlyb25bJ1NFUlZFUl9OQU1FJ10pCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdSRVFVRVNUX01FVEhPRCcsJ0dFVCcpCisKKyAgICBpZiAnU0NSSVBUX05BTUUnIG5vdCBpbiBlbnZpcm9uIGFuZCAnUEFUSF9JTkZPJyBub3QgaW4gZW52aXJvbjoKKyAgICAgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTQ1JJUFRfTkFNRScsJycpCisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnUEFUSF9JTkZPJywnLycpCisKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kudmVyc2lvbicsICgxLDApKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5ydW5fb25jZScsIDApCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLm11bHRpdGhyZWFkJywgMCkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kubXVsdGlwcm9jZXNzJywgMCkKKworICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLmlucHV0JywgU3RyaW5nSU8oIiIpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5lcnJvcnMnLCBTdHJpbmdJTygpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJyxndWVzc19zY2hlbWUoZW52aXJvbikpCisKKyAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXT09J2h0dHAnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzgwJykKKyAgICBlbGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddPT0naHR0cHMnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzQ0MycpCisKKworCisKK19ob3BwaXNoID0geworICAgICdjb25uZWN0aW9uJzoxLCAna2VlcC1hbGl2ZSc6MSwgJ3Byb3h5LWF1dGhlbnRpY2F0ZSc6MSwKKyAgICAncHJveHktYXV0aG9yaXphdGlvbic6MSwgJ3RlJzoxLCAndHJhaWxlcnMnOjEsICd0cmFuc2Zlci1lbmNvZGluZyc6MSwKKyAgICAndXBncmFkZSc6MQorfS5oYXNfa2V5CisKK2RlZiBpc19ob3BfYnlfaG9wKGhlYWRlcl9uYW1lKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnaGVhZGVyX25hbWUnIGlzIGFuIEhUVFAvMS4xICJIb3AtYnktSG9wIiBoZWFkZXIiIiIKKyAgICByZXR1cm4gX2hvcHBpc2goaGVhZGVyX25hbWUubG93ZXIoKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkgYi9MaWIvd3NnaXJlZi92YWxpZGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FiOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3dzZ2lyZWYvdmFsaWRhdGUucHkKQEAgLTAsMCArMSw0MzIgQEAKKyMgKGMpIDIwMDUgSWFuIEJpY2tpbmcgYW5kIGNvbnRyaWJ1dG9yczsgd3JpdHRlbiBmb3IgUGFzdGUgKGh0dHA6Ly9weXRob25wYXN0ZS5vcmcpCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyMgQWxzbyBsaWNlbmNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIDIuMDogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2FwYWNoZTIuMC5waHAKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50CisiIiIKK01pZGRsZXdhcmUgdG8gY2hlY2sgZm9yIG9iZWRpZW5jZSB0byB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uLgorCitTb21lIG9mIHRoZSB0aGluZ3MgdGhpcyBjaGVja3M6CisKKyogU2lnbmF0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgc3RhcnRfcmVzcG9uc2UgKGluY2x1ZGluZyB0aGF0CisgIGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgdXNlZCkuCisKKyogRW52aXJvbm1lbnQgY2hlY2tzOgorCisgIC0gRW52aXJvbm1lbnQgaXMgYSBkaWN0aW9uYXJ5IChhbmQgbm90IGEgc3ViY2xhc3MpLgorCisgIC0gVGhhdCBhbGwgdGhlIHJlcXVpcmVkIGtleXMgYXJlIGluIHRoZSBlbnZpcm9ubWVudDogUkVRVUVTVF9NRVRIT0QsCisgICAgU0VSVkVSX05BTUUsIFNFUlZFUl9QT1JULCB3c2dpLnZlcnNpb24sIHdzZ2kuaW5wdXQsIHdzZ2kuZXJyb3JzLAorICAgIHdzZ2kubXVsdGl0aHJlYWQsIHdzZ2kubXVsdGlwcm9jZXNzLCB3c2dpLnJ1bl9vbmNlCisKKyAgLSBUaGF0IEhUVFBfQ09OVEVOVF9UWVBFIGFuZCBIVFRQX0NPTlRFTlRfTEVOR1RIIGFyZSBub3QgaW4gdGhlCisgICAgZW52aXJvbm1lbnQgKHRoZXNlIGhlYWRlcnMgc2hvdWxkIGFwcGVhciBhcyBDT05URU5UX0xFTkdUSCBhbmQKKyAgICBDT05URU5UX1RZUEUpLgorCisgIC0gV2FybnMgaWYgUVVFUllfU1RSSU5HIGlzIG1pc3NpbmcsIGFzIHRoZSBjZ2kgbW9kdWxlIGFjdHMKKyAgICB1bnByZWRpY3RhYmx5IGluIHRoYXQgY2FzZS4KKworICAtIFRoYXQgQ0dJLXN0eWxlIHZhcmlhYmxlcyAodGhhdCBkb24ndCBjb250YWluIGEgLikgaGF2ZQorICAgIChub24tdW5pY29kZSkgc3RyaW5nIHZhbHVlcworCisgIC0gVGhhdCB3c2dpLnZlcnNpb24gaXMgYSB0dXBsZQorCisgIC0gVGhhdCB3c2dpLnVybF9zY2hlbWUgaXMgJ2h0dHAnIG9yICdodHRwcycgKEBAOiBpcyB0aGlzIHRvbworICAgIHJlc3RyaWN0aXZlPykKKworICAtIFdhcm5zIGlmIHRoZSBSRVFVRVNUX01FVEhPRCBpcyBub3Qga25vd24gKEBAOiBwcm9iYWJseSB0b28KKyAgICByZXN0cmljdGl2ZSkuCisKKyAgLSBUaGF0IFNDUklQVF9OQU1FIGFuZCBQQVRIX0lORk8gYXJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggLworCisgIC0gVGhhdCBhdCBsZWFzdCBvbmUgb2YgU0NSSVBUX05BTUUgb3IgUEFUSF9JTkZPIGFyZSBzZXQuCisKKyAgLSBUaGF0IENPTlRFTlRfTEVOR1RIIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KKworICAtIFRoYXQgU0NSSVBUX05BTUUgaXMgbm90ICcvJyAoaXQgc2hvdWxkIGJlICcnLCBhbmQgUEFUSF9JTkZPIHNob3VsZAorICAgIGJlICcvJykuCisKKyAgLSBUaGF0IHdzZ2kuaW5wdXQgaGFzIHRoZSBtZXRob2RzIHJlYWQsIHJlYWRsaW5lLCByZWFkbGluZXMsIGFuZAorICAgIF9faXRlcl9fCisKKyAgLSBUaGF0IHdzZ2kuZXJyb3JzIGhhcyB0aGUgbWV0aG9kcyBmbHVzaCwgd3JpdGUsIHdyaXRlbGluZXMKKworKiBUaGUgc3RhdHVzIGlzIGEgc3RyaW5nLCBjb250YWlucyBhIHNwYWNlLCBzdGFydHMgd2l0aCBhbiBpbnRlZ2VyLAorICBhbmQgdGhhdCBpbnRlZ2VyIGlzIGluIHJhbmdlICg+IDEwMCkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBpcyBhIGxpc3QgKG5vdCBhIHN1YmNsYXNzLCBub3QgYW5vdGhlciBraW5kIG9mCisgIHNlcXVlbmNlKS4KKworKiBUaGF0IHRoZSBpdGVtcyBvZiB0aGUgaGVhZGVycyBhcmUgdHVwbGVzIG9mIHN0cmluZ3MuCisKKyogVGhhdCB0aGVyZSBpcyBubyAnc3RhdHVzJyBoZWFkZXIgKHRoYXQgaXMgdXNlZCBpbiBDR0ksIGJ1dCBub3QgaW4KKyAgV1NHSSkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBkb24ndCBjb250YWluIG5ld2xpbmVzIG9yIGNvbG9ucywgZW5kIGluIF8gb3IgLSwgb3IKKyAgY29udGFpbiBjaGFyYWN0ZXJzIGNvZGVzIGJlbG93IDAzNy4KKworKiBUaGF0IENvbnRlbnQtVHlwZSBpcyBnaXZlbiBpZiB0aGVyZSBpcyBjb250ZW50IChDR0kgb2Z0ZW4gaGFzIGEKKyAgZGVmYXVsdCBjb250ZW50IHR5cGUsIGJ1dCBXU0dJIGRvZXMgbm90KS4KKworKiBUaGF0IG5vIENvbnRlbnQtVHlwZSBpcyBnaXZlbiB3aGVuIHRoZXJlIGlzIG5vIGNvbnRlbnQgKEBAOiBpcyB0aGlzCisgIHRvbyByZXN0cmljdGl2ZT8pCisKKyogVGhhdCB0aGUgZXhjX2luZm8gYXJndW1lbnQgdG8gc3RhcnRfcmVzcG9uc2UgaXMgYSB0dXBsZSBvciBOb25lLgorCisqIFRoYXQgYWxsIGNhbGxzIHRvIHRoZSB3cml0ZXIgYXJlIHdpdGggc3RyaW5ncywgYW5kIG5vIG90aGVyIG1ldGhvZHMKKyAgb24gdGhlIHdyaXRlciBhcmUgYWNjZXNzZWQuCisKKyogVGhhdCB3c2dpLmlucHV0IGlzIHVzZWQgcHJvcGVybHk6CisKKyAgLSAucmVhZCgpIGlzIGNhbGxlZCB3aXRoIHplcm8gb3Igb25lIGFyZ3VtZW50CisKKyAgLSBUaGF0IGl0IHJldHVybnMgYSBzdHJpbmcKKworICAtIFRoYXQgcmVhZGxpbmUsIHJlYWRsaW5lcywgYW5kIF9faXRlcl9fIHJldHVybiBzdHJpbmdzCisKKyAgLSBUaGF0IC5jbG9zZSgpIGlzIG5vdCBjYWxsZWQKKworICAtIE5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkCisKKyogVGhhdCB3c2dpLmVycm9ycyBpcyB1c2VkIHByb3Blcmx5OgorCisgIC0gLndyaXRlKCkgYW5kIC53cml0ZWxpbmVzKCkgaXMgY2FsbGVkIHdpdGggYSBzdHJpbmcKKworICAtIFRoYXQgLmNsb3NlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkLgorCisqIFRoZSByZXNwb25zZSBpdGVyYXRvcjoKKworICAtIFRoYXQgaXQgaXMgbm90IGEgc3RyaW5nIChpdCBzaG91bGQgYmUgYSBsaXN0IG9mIGEgc2luZ2xlIHN0cmluZzsgYQorICAgIHN0cmluZyB3aWxsIHdvcmssIGJ1dCBwZXJmb3JtIGhvcnJpYmx5KS4KKworICAtIFRoYXQgLm5leHQoKSByZXR1cm5zIGEgc3RyaW5nCisKKyAgLSBUaGF0IHRoZSBpdGVyYXRvciBpcyBub3QgaXRlcmF0ZWQgb3ZlciB1bnRpbCBzdGFydF9yZXNwb25zZSBoYXMKKyAgICBiZWVuIGNhbGxlZCAodGhhdCBjYW4gc2lnbmFsIGVpdGhlciBhIHNlcnZlciBvciBhcHBsaWNhdGlvbgorICAgIGVycm9yKS4KKworICAtIFRoYXQgLmNsb3NlKCkgaXMgY2FsbGVkIChkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbiwgb25seSBwcmludHMgdG8KKyAgICBzeXMuc3RkZXJyLCBiZWNhdXNlIHdlIG9ubHkga25vdyBpdCBpc24ndCBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0CisgICAgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQpLgorIiIiCitfX2FsbF9fID0gWyd2YWxpZGF0b3InXQorCisKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0eXBlcyBpbXBvcnQgRGljdFR5cGUsIFN0cmluZ1R5cGUsIFR1cGxlVHlwZSwgTGlzdFR5cGUKK2ltcG9ydCB3YXJuaW5ncworCitoZWFkZXJfcmUgPSByZS5jb21waWxlKHInXlthLXpBLVpdW2EtekEtWjAtOVwtX10qJCcpCitiYWRfaGVhZGVyX3ZhbHVlX3JlID0gcmUuY29tcGlsZShyJ1tcMDAwLVwwMzddJykKKworY2xhc3MgV1NHSVdhcm5pbmcoV2FybmluZyk6CisgICAgIiIiCisgICAgUmFpc2VkIGluIHJlc3BvbnNlIHRvIFdTR0ktc3BlYy1yZWxhdGVkIHdhcm5pbmdzCisgICAgIiIiCisKK2RlZiBhc3NlcnRfKGNvbmQsICphcmdzKToKKyAgICBpZiBub3QgY29uZDoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoKmFyZ3MpCisKK2RlZiB2YWxpZGF0b3IoYXBwbGljYXRpb24pOgorCisgICAgIiIiCisgICAgV2hlbiBhcHBsaWVkIGJldHdlZW4gYSBXU0dJIHNlcnZlciBhbmQgYSBXU0dJIGFwcGxpY2F0aW9uLCB0aGlzCisgICAgbWlkZGxld2FyZSB3aWxsIGNoZWNrIGZvciBXU0dJIGNvbXBsaWFuY3kgb24gYSBudW1iZXIgb2YgbGV2ZWxzLgorICAgIFRoaXMgbWlkZGxld2FyZSBkb2VzIG5vdCBtb2RpZnkgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgaW4gYW55CisgICAgd2F5LCBidXQgd2lsbCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvciBpZiBhbnl0aGluZyBzZWVtcyBvZmYKKyAgICAoZXhjZXB0IGZvciBhIGZhaWx1cmUgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIGl0ZXJhdG9yLCB3aGljaAorICAgIHdpbGwgYmUgcHJpbnRlZCB0byBzdGRlcnIgLS0gdGhlcmUncyBubyB3YXkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgYXQgdGhhdCBwb2ludCkuCisgICAgIiIiCisKKyAgICBkZWYgbGludF9hcHAoKmFyZ3MsICoqa3cpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyLCAiVHdvIGFyZ3VtZW50cyByZXF1aXJlZCIpCisgICAgICAgIGFzc2VydF8obm90IGt3LCAiTm8ga2V5d29yZCBhcmd1bWVudHMgYWxsb3dlZCIpCisgICAgICAgIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlID0gYXJncworCisgICAgICAgIGNoZWNrX2Vudmlyb24oZW52aXJvbikKKworICAgICAgICAjIFdlIHVzZSB0aGlzIHRvIGNoZWNrIGlmIHRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIHdpdGhvdXQKKyAgICAgICAgIyBjYWxsaW5nIHN0YXJ0X3Jlc3BvbnNlOgorICAgICAgICBzdGFydF9yZXNwb25zZV9zdGFydGVkID0gW10KKworICAgICAgICBkZWYgc3RhcnRfcmVzcG9uc2Vfd3JhcHBlcigqYXJncywgKiprdyk6CisgICAgICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyIG9yIGxlbihhcmdzKSA9PSAzLCAoCisgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50czogJXMiICUgKGFyZ3MsKSkpCisgICAgICAgICAgICBhc3NlcnRfKG5vdCBrdywgIk5vIGtleXdvcmQgYXJndW1lbnRzIGFsbG93ZWQiKQorICAgICAgICAgICAgc3RhdHVzID0gYXJnc1swXQorICAgICAgICAgICAgaGVhZGVycyA9IGFyZ3NbMV0KKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gYXJnc1syXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUKKworICAgICAgICAgICAgY2hlY2tfc3RhdHVzKHN0YXR1cykKKyAgICAgICAgICAgIGNoZWNrX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgICAgIGNoZWNrX2NvbnRlbnRfdHlwZShzdGF0dXMsIGhlYWRlcnMpCisgICAgICAgICAgICBjaGVja19leGNfaW5mbyhleGNfaW5mbykKKworICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2Vfc3RhcnRlZC5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBXcml0ZVdyYXBwZXIoc3RhcnRfcmVzcG9uc2UoKmFyZ3MpKQorCisgICAgICAgIGVudmlyb25bJ3dzZ2kuaW5wdXQnXSA9IElucHV0V3JhcHBlcihlbnZpcm9uWyd3c2dpLmlucHV0J10pCisgICAgICAgIGVudmlyb25bJ3dzZ2kuZXJyb3JzJ10gPSBFcnJvcldyYXBwZXIoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICAgICBpdGVyYXRvciA9IGFwcGxpY2F0aW9uKGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlX3dyYXBwZXIpCisgICAgICAgIGFzc2VydF8oaXRlcmF0b3IgaXMgbm90IE5vbmUgYW5kIGl0ZXJhdG9yICE9IEZhbHNlLAorICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiBtdXN0IHJldHVybiBhbiBpdGVyYXRvciwgaWYgb25seSBhbiBlbXB0eSBsaXN0IikKKworICAgICAgICBjaGVja19pdGVyYXRvcihpdGVyYXRvcikKKworICAgICAgICByZXR1cm4gSXRlcmF0b3JXcmFwcGVyKGl0ZXJhdG9yLCBzdGFydF9yZXNwb25zZV9zdGFydGVkKQorCisgICAgcmV0dXJuIGxpbnRfYXBwCisKK2NsYXNzIElucHV0V3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2lucHV0KToKKyAgICAgICAgc2VsZi5pbnB1dCA9IHdzZ2lfaW5wdXQKKworICAgIGRlZiByZWFkKHNlbGYsICphcmdzKToKKyAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPD0gMSkKKyAgICAgICAgdiA9IHNlbGYuaW5wdXQucmVhZCgqYXJncykKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHYpIGlzIHR5cGUoIiIpKQorICAgICAgICByZXR1cm4gdgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICB2ID0gc2VsZi5pbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGFzc2VydF8odHlwZSh2KSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA8PSAxKQorICAgICAgICBsaW5lcyA9IHNlbGYuaW5wdXQucmVhZGxpbmVzKCphcmdzKQorICAgICAgICBhc3NlcnRfKHR5cGUobGluZXMpIGlzIHR5cGUoW10pKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGFzc2VydF8odHlwZShsaW5lKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgYXNzZXJ0XygwLCAiaW5wdXQuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBFcnJvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9lcnJvcnMpOgorICAgICAgICBzZWxmLmVycm9ycyA9IHdzZ2lfZXJyb3JzCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi5lcnJvcnMud3JpdGUocykKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcnMuZmx1c2goKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgc2VxKToKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VxOgorICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBhc3NlcnRfKDAsICJlcnJvcnMuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBXcml0ZVdyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV93cml0ZXIpOgorICAgICAgICBzZWxmLndyaXRlciA9IHdzZ2lfd3JpdGVyCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi53cml0ZXIocykKKworY2xhc3MgUGFydGlhbEl0ZXJhdG9yV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2l0ZXJhdG9yKToKKyAgICAgICAgc2VsZi5pdGVyYXRvciA9IHdzZ2lfaXRlcmF0b3IKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIyBXZSB3YW50IHRvIG1ha2Ugc3VyZSBfX2l0ZXJfXyBpcyBjYWxsZWQKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yV3JhcHBlcihzZWxmLml0ZXJhdG9yLCBOb25lKQorCitjbGFzcyBJdGVyYXRvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9pdGVyYXRvciwgY2hlY2tfc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yID0gd3NnaV9pdGVyYXRvcgorICAgICAgICBzZWxmLml0ZXJhdG9yID0gaXRlcih3c2dpX2l0ZXJhdG9yKQorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgPSBjaGVja19zdGFydF9yZXNwb25zZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGFzc2VydF8obm90IHNlbGYuY2xvc2VkLAorICAgICAgICAgICAgIkl0ZXJhdG9yIHJlYWQgYWZ0ZXIgY2xvc2VkIikKKyAgICAgICAgdiA9IHNlbGYuaXRlcmF0b3IubmV4dCgpCisgICAgICAgIGlmIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnRfKHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIGFuZCB3ZSBzdGFydGVkIGl0ZXJhdGluZyBvdmVyIGl0cyBib2R5LCBidXQgc3RhcnRfcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQiKQorICAgICAgICAgICAgc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vcmlnaW5hbF9pdGVyYXRvciwgJ2Nsb3NlJyk6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yLmNsb3NlKCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAgICAgICAgICJJdGVyYXRvciBnYXJiYWdlIGNvbGxlY3RlZCB3aXRob3V0IGJlaW5nIGNsb3NlZCIpCisgICAgICAgIGFzc2VydF8oc2VsZi5jbG9zZWQsCisgICAgICAgICAgICAiSXRlcmF0b3IgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aG91dCBiZWluZyBjbG9zZWQiKQorCitkZWYgY2hlY2tfZW52aXJvbihlbnZpcm9uKToKKyAgICBhc3NlcnRfKHR5cGUoZW52aXJvbikgaXMgRGljdFR5cGUsCisgICAgICAgICJFbnZpcm9ubWVudCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGU6ICVyIChlbnZpcm9ubWVudDogJXIpIgorICAgICAgICAlICh0eXBlKGVudmlyb24pLCBlbnZpcm9uKSkKKworICAgIGZvciBrZXkgaW4gWydSRVFVRVNUX01FVEhPRCcsICdTRVJWRVJfTkFNRScsICdTRVJWRVJfUE9SVCcsCisgICAgICAgICAgICAgICAgJ3dzZ2kudmVyc2lvbicsICd3c2dpLmlucHV0JywgJ3dzZ2kuZXJyb3JzJywKKyAgICAgICAgICAgICAgICAnd3NnaS5tdWx0aXRocmVhZCcsICd3c2dpLm11bHRpcHJvY2VzcycsCisgICAgICAgICAgICAgICAgJ3dzZ2kucnVuX29uY2UnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgaW4gZW52aXJvbiwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudCBtaXNzaW5nIHJlcXVpcmVkIGtleTogJXIiICUgKGtleSwpKQorCisgICAgZm9yIGtleSBpbiBbJ0hUVFBfQ09OVEVOVF9UWVBFJywgJ0hUVFBfQ09OVEVOVF9MRU5HVEgnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgbm90IGluIGVudmlyb24sCisgICAgICAgICAgICAiRW52aXJvbm1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBrZXk6ICVzICIKKyAgICAgICAgICAgICIodXNlICVzIGluc3RlYWQpIiAlIChrZXksIGtleVs1Ol0pKQorCisgICAgaWYgJ1FVRVJZX1NUUklORycgbm90IGluIGVudmlyb246CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HIGlzIG5vdCBpbiB0aGUgV1NHSSBlbnZpcm9ubWVudDsgdGhlIGNnaSAnCisgICAgICAgICAgICAnbW9kdWxlIHdpbGwgdXNlIHN5cy5hcmd2IHdoZW4gdGhpcyB2YXJpYWJsZSBpcyBtaXNzaW5nLCAnCisgICAgICAgICAgICAnc28gYXBwbGljYXRpb24gZXJyb3JzIGFyZSBtb3JlIGxpa2VseScsCisgICAgICAgICAgICBXU0dJV2FybmluZykKKworICAgIGZvciBrZXkgaW4gZW52aXJvbi5rZXlzKCk6CisgICAgICAgIGlmICcuJyBpbiBrZXk6CisgICAgICAgICAgICAjIEV4dGVuc2lvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgdHlwZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKGVudmlyb25ba2V5XSkgaXMgU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudGFsIHZhcmlhYmxlICVzIGlzIG5vdCBhIHN0cmluZzogJXIgKHZhbHVlOiAlcikiCisgICAgICAgICAgICAlIChrZXksIHR5cGUoZW52aXJvbltrZXldKSwgZW52aXJvbltrZXldKSkKKworICAgIGFzc2VydF8odHlwZShlbnZpcm9uWyd3c2dpLnZlcnNpb24nXSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAid3NnaS52ZXJzaW9uIHNob3VsZCBiZSBhIHR1cGxlICglcikiICUgKGVudmlyb25bJ3dzZ2kudmVyc2lvbiddLCkpCisgICAgYXNzZXJ0XyhlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSBpbiAoJ2h0dHAnLCAnaHR0cHMnKSwKKyAgICAgICAgIndzZ2kudXJsX3NjaGVtZSB1bmtub3duOiAlciIgJSBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSkKKworICAgIGNoZWNrX2lucHV0KGVudmlyb25bJ3dzZ2kuaW5wdXQnXSkKKyAgICBjaGVja19lcnJvcnMoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICMgQEA6IHRoZXNlIG5lZWQgZmlsbGluZyBvdXQ6CisgICAgaWYgZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXSBub3QgaW4gKAorICAgICAgICAnR0VUJywgJ0hFQUQnLCAnUE9TVCcsICdPUFRJT05TJywnUFVUJywnREVMRVRFJywnVFJBQ0UnKToKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJVbmtub3duIFJFUVVFU1RfTUVUSE9EOiAlciIgJSBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddLAorICAgICAgICAgICAgV1NHSVdhcm5pbmcpCisKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKQorICAgICAgICAgICAgb3IgZW52aXJvblsnU0NSSVBUX05BTUUnXS5zdGFydHN3aXRoKCcvJyksCisgICAgICAgICJTQ1JJUFRfTkFNRSBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnU0NSSVBUX05BTUUnXSkKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnUEFUSF9JTkZPJykKKyAgICAgICAgICAgIG9yIGVudmlyb25bJ1BBVEhfSU5GTyddLnN0YXJ0c3dpdGgoJy8nKSwKKyAgICAgICAgIlBBVEhfSU5GTyBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnUEFUSF9JTkZPJ10pCisgICAgaWYgZW52aXJvbi5nZXQoJ0NPTlRFTlRfTEVOR1RIJyk6CisgICAgICAgIGFzc2VydF8oaW50KGVudmlyb25bJ0NPTlRFTlRfTEVOR1RIJ10pID49IDAsCisgICAgICAgICAgICAiSW52YWxpZCBDT05URU5UX0xFTkdUSDogJXIiICUgZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXSkKKworICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgYXNzZXJ0XyhlbnZpcm9uLmhhc19rZXkoJ1BBVEhfSU5GTycpLAorICAgICAgICAgICAgIk9uZSBvZiBTQ1JJUFRfTkFNRSBvciBQQVRIX0lORk8gYXJlIHJlcXVpcmVkIChQQVRIX0lORk8gIgorICAgICAgICAgICAgInNob3VsZCBhdCBsZWFzdCBiZSAnLycgaWYgU0NSSVBUX05BTUUgaXMgZW1wdHkpIikKKyAgICBhc3NlcnRfKGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpICE9ICcvJywKKyAgICAgICAgIlNDUklQVF9OQU1FIGNhbm5vdCBiZSAnLyc7IGl0IHNob3VsZCBpbnN0ZWFkIGJlICcnLCBhbmQgIgorICAgICAgICAiUEFUSF9JTkZPIHNob3VsZCBiZSAnLyciKQorCitkZWYgY2hlY2tfaW5wdXQod3NnaV9pbnB1dCk6CisgICAgZm9yIGF0dHIgaW4gWydyZWFkJywgJ3JlYWRsaW5lJywgJ3JlYWRsaW5lcycsICdfX2l0ZXJfXyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9pbnB1dCwgYXR0ciksCisgICAgICAgICAgICAid3NnaS5pbnB1dCAoJXIpIGRvZXNuJ3QgaGF2ZSB0aGUgYXR0cmlidXRlICVzIgorICAgICAgICAgICAgJSAod3NnaV9pbnB1dCwgYXR0cikpCisKK2RlZiBjaGVja19lcnJvcnMod3NnaV9lcnJvcnMpOgorICAgIGZvciBhdHRyIGluIFsnZmx1c2gnLCAnd3JpdGUnLCAnd3JpdGVsaW5lcyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9lcnJvcnMsIGF0dHIpLAorICAgICAgICAgICAgIndzZ2kuZXJyb3JzICglcikgZG9lc24ndCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXMiCisgICAgICAgICAgICAlICh3c2dpX2Vycm9ycywgYXR0cikpCisKK2RlZiBjaGVja19zdGF0dXMoc3RhdHVzKToKKyAgICBhc3NlcnRfKHR5cGUoc3RhdHVzKSBpcyBTdHJpbmdUeXBlLAorICAgICAgICAiU3RhdHVzIG11c3QgYmUgYSBzdHJpbmcgKG5vdCAlcikiICUgc3RhdHVzKQorICAgICMgSW1wbGljaXRseSBjaGVjayB0aGF0IHdlIGNhbiB0dXJuIGl0IGludG8gYW4gaW50ZWdlcjoKKyAgICBzdGF0dXNfY29kZSA9IHN0YXR1cy5zcGxpdChOb25lLCAxKVswXQorICAgIGFzc2VydF8obGVuKHN0YXR1c19jb2RlKSA9PSAzLAorICAgICAgICAiU3RhdHVzIGNvZGVzIG11c3QgYmUgdGhyZWUgY2hhcmFjdGVyczogJXIiICUgc3RhdHVzX2NvZGUpCisgICAgc3RhdHVzX2ludCA9IGludChzdGF0dXNfY29kZSkKKyAgICBhc3NlcnRfKHN0YXR1c19pbnQgPj0gMTAwLCAiU3RhdHVzIGNvZGUgaXMgaW52YWxpZDogJXIiICUgc3RhdHVzX2ludCkKKyAgICBpZiBsZW4oc3RhdHVzKSA8IDQgb3Igc3RhdHVzWzNdICE9ICcgJzoKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGUgc3RhdHVzIHN0cmluZyAoJXIpIHNob3VsZCBiZSBhIHRocmVlLWRpZ2l0IGludGVnZXIgIgorICAgICAgICAgICAgImZvbGxvd2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGFuZCBhIHN0YXR1cyBleHBsYW5hdGlvbiIKKyAgICAgICAgICAgICUgc3RhdHVzLCBXU0dJV2FybmluZykKKworZGVmIGNoZWNrX2hlYWRlcnMoaGVhZGVycyk6CisgICAgYXNzZXJ0Xyh0eXBlKGhlYWRlcnMpIGlzIExpc3RUeXBlLAorICAgICAgICAiSGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSBsaXN0OiAlciIKKyAgICAgICAgJSAoaGVhZGVycywgdHlwZShoZWFkZXJzKSkpCisgICAgaGVhZGVyX25hbWVzID0ge30KKyAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOgorICAgICAgICBhc3NlcnRfKHR5cGUoaXRlbSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAgICAgIkluZGl2aWR1YWwgaGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSB0dXBsZTogJXIiCisgICAgICAgICAgICAlIChpdGVtLCB0eXBlKGl0ZW0pKSkKKyAgICAgICAgYXNzZXJ0XyhsZW4oaXRlbSkgPT0gMikKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtCisgICAgICAgIGFzc2VydF8obmFtZS5sb3dlcigpICE9ICdzdGF0dXMnLAorICAgICAgICAgICAgIlRoZSBTdGF0dXMgaGVhZGVyIGNhbm5vdCBiZSB1c2VkOyBpdCBjb25mbGljdHMgd2l0aCBDR0kgIgorICAgICAgICAgICAgInNjcmlwdCwgYW5kIEhUVFAgc3RhdHVzIGlzIG5vdCBnaXZlbiB0aHJvdWdoIGhlYWRlcnMgIgorICAgICAgICAgICAgIih2YWx1ZTogJXIpLiIgJSB2YWx1ZSkKKyAgICAgICAgaGVhZGVyX25hbWVzW25hbWUubG93ZXIoKV0gPSBOb25lCisgICAgICAgIGFzc2VydF8oJ1xuJyBub3QgaW4gbmFtZSBhbmQgJzonIG5vdCBpbiBuYW1lLAorICAgICAgICAgICAgIkhlYWRlciBuYW1lcyBtYXkgbm90IGNvbnRhaW4gJzonIG9yICdcXG4nOiAlciIgJSBuYW1lKQorICAgICAgICBhc3NlcnRfKGhlYWRlcl9yZS5zZWFyY2gobmFtZSksICJCYWQgaGVhZGVyIG5hbWU6ICVyIiAlIG5hbWUpCisgICAgICAgIGFzc2VydF8obm90IG5hbWUuZW5kc3dpdGgoJy0nKSBhbmQgbm90IG5hbWUuZW5kc3dpdGgoJ18nKSwKKyAgICAgICAgICAgICJOYW1lcyBtYXkgbm90IGVuZCBpbiAnLScgb3IgJ18nOiAlciIgJSBuYW1lKQorICAgICAgICBpZiBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICBhc3NlcnRfKDAsICJCYWQgaGVhZGVyIHZhbHVlOiAlciAoYmFkIGNoYXI6ICVyKSIKKyAgICAgICAgICAgICUgKHZhbHVlLCBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSkuZ3JvdXAoMCkpKQorCitkZWYgY2hlY2tfY29udGVudF90eXBlKHN0YXR1cywgaGVhZGVycyk6CisgICAgY29kZSA9IGludChzdGF0dXMuc3BsaXQoTm9uZSwgMSlbMF0pCisgICAgIyBAQDogbmVlZCBvbmUgbW9yZSBwZXJzb24gdG8gdmVyaWZ5IHRoaXMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDI2MTYKKyAgICAjICAgICBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwKKyAgICBOT19NRVNTQUdFX0JPRFkgPSAoMjA0LCAzMDQpCisgICAgZm9yIG5hbWUsIHZhbHVlIGluIGhlYWRlcnM6CisgICAgICAgIGlmIG5hbWUubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGlmIGNvZGUgbm90IGluIE5PX01FU1NBR0VfQk9EWToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGFzc2VydF8oMCwgKCJDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGEgJXMgcmVzcG9uc2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBtdXN0IG5vdCByZXR1cm4gY29udGVudC4iKSAlIGNvZGUpCisgICAgaWYgY29kZSBub3QgaW4gTk9fTUVTU0FHRV9CT0RZOgorICAgICAgICBhc3NlcnRfKDAsICJObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGhlYWRlcnMgKCVzKSIgJSBoZWFkZXJzKQorCitkZWYgY2hlY2tfZXhjX2luZm8oZXhjX2luZm8pOgorICAgIGFzc2VydF8oZXhjX2luZm8gaXMgTm9uZSBvciB0eXBlKGV4Y19pbmZvKSBpcyB0eXBlKCgpKSwKKyAgICAgICAgImV4Y19pbmZvICglcikgaXMgbm90IGEgdHVwbGU6ICVyIiAlIChleGNfaW5mbywgdHlwZShleGNfaW5mbykpKQorICAgICMgTW9yZSBleGNfaW5mbyBjaGVja3M/CisKK2RlZiBjaGVja19pdGVyYXRvcihpdGVyYXRvcik6CisgICAgIyBUZWNobmljYWxseSBhIHN0cmluZyBpcyBsZWdhbCwgd2hpY2ggaXMgd2h5IGl0J3MgYSByZWFsbHkgYmFkCisgICAgIyBpZGVhLCBiZWNhdXNlIGl0IG1heSBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQKKyAgICAjIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIKKyAgICBhc3NlcnRfKG5vdCBpc2luc3RhbmNlKGl0ZXJhdG9yLCBzdHIpLAorICAgICAgICAiWW91IHNob3VsZCBub3QgcmV0dXJuIGEgc3RyaW5nIGFzIHlvdXIgYXBwbGljYXRpb24gaXRlcmF0b3IsICIKKyAgICAgICAgImluc3RlYWQgcmV0dXJuIGEgc2luZ2xlLWl0ZW0gbGlzdCBjb250YWluaW5nIHRoYXQgc3RyaW5nLiIpCmRpZmYgLS1naXQgYS9MaWIveG1sLnB5IGIvTGliL3htbC9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBMaWIveG1sLnB5CnJlbmFtZSB0byBMaWIveG1sL19faW5pdF9fLnB5CmluZGV4IDczOTNjNjYuLmZhNWU4Y2QgMTAwNjQ0Ci0tLSBhL0xpYi94bWwucHkKKysrIGIvTGliL3htbC9fX2luaXRfXy5weQpAQCAtMTYsOCArMTYsNiBAQAogCiAiIiIKIAotaW1wb3J0IHN5cwotaW1wb3J0IHhtbGNvcmUKIAogX19hbGxfXyA9IFsiZG9tIiwgInBhcnNlcnMiLCAic2F4IiwgImV0cmVlIl0KIApAQCAtMjksMTAgKzI3LDExIEBACiAKIF9NSU5JTVVNX1hNTFBMVVNfVkVSU0lPTiA9ICgwLCA4LCA0KQogCisKIHRyeToKICAgICBpbXBvcnQgX3htbHBsdXMKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBzeXMubW9kdWxlc1tfX25hbWVfX10gPSB4bWxjb3JlCisgICAgcGFzcwogZWxzZToKICAgICB0cnk6CiAgICAgICAgIHYgPSBfeG1scGx1cy52ZXJzaW9uX2luZm8KQEAgLTQxLDcgKzQwLDggQEAKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIGlmIHYgPj0gX01JTklNVU1fWE1MUExVU19WRVJTSU9OOgotICAgICAgICAgICAgX3htbHBsdXMuX19wYXRoX18uZXh0ZW5kKHhtbGNvcmUuX19wYXRoX18pCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBfeG1scGx1cy5fX3BhdGhfXy5leHRlbmQoX19wYXRoX18pCiAgICAgICAgICAgICBzeXMubW9kdWxlc1tfX25hbWVfX10gPSBfeG1scGx1cwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZGVsIHYKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9Ob2RlRmlsdGVyLnB5IGIvTGliL3htbC9kb20vTm9kZUZpbHRlci5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL05vZGVGaWx0ZXIucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL05vZGVGaWx0ZXIucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9fX2luaXRfXy5weSBiL0xpYi94bWwvZG9tL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9fX2luaXRfXy5weQpyZW5hbWUgdG8gTGliL3htbC9kb20vX19pbml0X18ucHkKaW5kZXggMDAyY2RiNy4uNjM2M2QwMCAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL19faW5pdF9fLnB5CisrKyBiL0xpYi94bWwvZG9tL19faW5pdF9fLnB5CkBAIC0xMzYsNCArMTM2LDQgQEAKIEVNUFRZX05BTUVTUEFDRSA9IE5vbmUKIEVNUFRZX1BSRUZJWCA9IE5vbmUKIAotZnJvbSAuZG9tcmVnIGltcG9ydCBnZXRET01JbXBsZW1lbnRhdGlvbixyZWdpc3RlckRPTUltcGxlbWVudGF0aW9uCitmcm9tIGRvbXJlZyBpbXBvcnQgZ2V0RE9NSW1wbGVtZW50YXRpb24scmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL2RvbXJlZy5weSBiL0xpYi94bWwvZG9tL2RvbXJlZy5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9kb20vZG9tcmVnLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9kb21yZWcucHkKaW5kZXggZDYwZWQ2NC4uNjg0YzQzNiAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL2RvbXJlZy5weQorKysgYi9MaWIveG1sL2RvbS9kb21yZWcucHkKQEAgLTIsNyArMiw3IEBACiBkaXJlY3RseS4gSW5zdGVhZCwgdGhlIGZ1bmN0aW9ucyBnZXRET01JbXBsZW1lbnRhdGlvbiBhbmQKIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGltcG9ydGVkIGZyb20geG1sLmRvbS4iIiIKIAotZnJvbSB4bWxjb3JlLmRvbS5taW5pY29tcGF0IGltcG9ydCAqICAjIGlzaW5zdGFuY2UsIFN0cmluZ1R5cGVzCitmcm9tIHhtbC5kb20ubWluaWNvbXBhdCBpbXBvcnQgKiAgIyBpc2luc3RhbmNlLCBTdHJpbmdUeXBlcwogCiAjIFRoaXMgaXMgYSBsaXN0IG9mIHdlbGwta25vd24gaW1wbGVtZW50YXRpb25zLiAgV2VsbC1rbm93biBuYW1lcwogIyBzaG91bGQgYmUgcHVibGlzaGVkIGJ5IHBvc3RpbmcgdG8geG1sLXNpZ0BweXRob24ub3JnLCBhbmQgYXJlCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5IGIvTGliL3htbC9kb20vZXhwYXRidWlsZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL2V4cGF0YnVpbGRlci5weQppbmRleCAzMmZmYTQxLi5hMmY4YTMzIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5CisrKyBiL0xpYi94bWwvZG9tL2V4cGF0YnVpbGRlci5weQpAQCAtMjcsMTMgKzI3LDEzIEBACiAjICAgICAgY2FsbGluZyBhbnkgbWV0aG9kcyBvbiB0aGUgbm9kZSBvYmplY3QgaWYgaXQgZXhpc3RzLiAgKEEgcmF0aGVyCiAjICAgICAgbmljZSBzcGVlZHVwIGlzIGFjaGlldmVkIHRoaXMgd2F5IGFzIHdlbGwhKQogCi1mcm9tIHhtbGNvcmUuZG9tIGltcG9ydCB4bWxidWlsZGVyLCBtaW5pZG9tLCBOb2RlCi1mcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFCi1mcm9tIHhtbGNvcmUucGFyc2VycyBpbXBvcnQgZXhwYXQKLWZyb20geG1sY29yZS5kb20ubWluaWRvbSBpbXBvcnQgX2FwcGVuZF9jaGlsZCwgX3NldF9hdHRyaWJ1dGVfbm9kZQotZnJvbSB4bWxjb3JlLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCitmcm9tIHhtbC5kb20gaW1wb3J0IHhtbGJ1aWxkZXIsIG1pbmlkb20sIE5vZGUKK2Zyb20geG1sLmRvbSBpbXBvcnQgRU1QVFlfTkFNRVNQQUNFLCBFTVBUWV9QUkVGSVgsIFhNTE5TX05BTUVTUEFDRQorZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKK2Zyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBfYXBwZW5kX2NoaWxkLCBfc2V0X2F0dHJpYnV0ZV9ub2RlCitmcm9tIHhtbC5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgogCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCiAKIFRFWFRfTk9ERSA9IE5vZGUuVEVYVF9OT0RFCiBDREFUQV9TRUNUSU9OX05PREUgPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkgYi9MaWIveG1sL2RvbS9taW5pY29tcGF0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9taW5pY29tcGF0LnB5CmluZGV4IGY5OWI3ZmUuLmQ0OTFmYjYgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CisrKyBiL0xpYi94bWwvZG9tL21pbmljb21wYXQucHkKQEAgLTM4LDcgKzM4LDcgQEAKIAogX19hbGxfXyA9IFsiTm9kZUxpc3QiLCAiRW1wdHlOb2RlTGlzdCIsICJTdHJpbmdUeXBlcyIsICJkZWZwcm9wZXJ0eSJdCiAKLWltcG9ydCB4bWxjb3JlLmRvbQoraW1wb3J0IHhtbC5kb20KIAogdHJ5OgogICAgIHVuaWNvZGUKQEAgLTcxLDYgKzcxLDcgQEAKICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICAgc2VsZls6XSA9IHN0YXRlCiAKKwogY2xhc3MgRW1wdHlOb2RlTGlzdCh0dXBsZSk6CiAgICAgX19zbG90c19fID0gKCkKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkgYi9MaWIveG1sL2RvbS9taW5pZG9tLnB5CnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9taW5pZG9tLnB5CmluZGV4IGE4YWJkMTQuLjNhMzU3ODEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5CisrKyBiL0xpYi94bWwvZG9tL21pbmlkb20ucHkKQEAgLTE0LDIyICsxNCwyMiBAQAogICogU0FYIDIgbmFtZXNwYWNlcwogIiIiCiAKLWltcG9ydCB4bWxjb3JlLmRvbQoraW1wb3J0IHhtbC5kb20KIAotZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgRU1QVFlfTkFNRVNQQUNFLCBFTVBUWV9QUkVGSVgsIFhNTE5TX05BTUVTUEFDRSwgZG9tcmVnCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKLWZyb20geG1sY29yZS5kb20ueG1sYnVpbGRlciBpbXBvcnQgRE9NSW1wbGVtZW50YXRpb25MUywgRG9jdW1lbnRMUworZnJvbSB4bWwuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFLCBkb21yZWcKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCitmcm9tIHhtbC5kb20ueG1sYnVpbGRlciBpbXBvcnQgRE9NSW1wbGVtZW50YXRpb25MUywgRG9jdW1lbnRMUwogCiAjIFRoaXMgaXMgdXNlZCBieSB0aGUgSUQtY2FjaGUgaW52YWxpZGF0aW9uIGNoZWNrczsgdGhlIGxpc3QgaXNuJ3QKICMgYWN0dWFsbHkgY29tcGxldGUsIHNpbmNlIHRoZSBub2RlcyBiZWluZyBjaGVja2VkIHdpbGwgbmV2ZXIgYmUgdGhlCiAjIERPQ1VNRU5UX05PREUgb3IgRE9DVU1FTlRfRlJBR01FTlRfTk9ERS4gIChUaGUgbm9kZSBiZWluZyBjaGVja2VkIGlzCiAjIHRoZSBub2RlIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQsIG5vdCB0aGUgbm9kZSBiZWluZyBtb2RpZmllZC4pCiAjCi1fbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4gPSAoeG1sY29yZS5kb20uTm9kZS5FTEVNRU5UX05PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sY29yZS5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCitfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4gPSAoeG1sLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKQogCiAKLWNsYXNzIE5vZGUoeG1sY29yZS5kb20uTm9kZSk6CitjbGFzcyBOb2RlKHhtbC5kb20uTm9kZSk6CiAgICAgbmFtZXNwYWNlVVJJID0gTm9uZSAjIHRoaXMgaXMgbm9uLW51bGwgb25seSBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKICAgICBwYXJlbnROb2RlID0gTm9uZQogICAgIG93bmVyRG9jdW1lbnQgPSBOb25lCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgICAgICAjIyMgVGhlIERPTSBkb2VzIG5vdCBjbGVhcmx5IHNwZWNpZnkgd2hhdCB0byByZXR1cm4gaW4gdGhpcyBjYXNlCiAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQKICAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobmV3Q2hpbGQpLCByZXByKHNlbGYpKSkKICAgICAgICAgaWYgbmV3Q2hpbGQucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIG5ld0NoaWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobmV3Q2hpbGQpCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgocmVmQ2hpbGQpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW46CiAgICAgICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCiAgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMuaW5zZXJ0KGluZGV4LCBuZXdDaGlsZCkKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAgICAgIyMjIFRoZSBET00gZG9lcyBub3QgY2xlYXJseSBzcGVjaWZ5IHdoYXQgdG8gcmV0dXJuIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgcmV0dXJuIG5vZGUKICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihub2RlKSwgcmVwcihzZWxmKSkpCiAgICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW46CiAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgc2VsZi5yZW1vdmVDaGlsZChvbGRDaGlsZCkKICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc2VydEJlZm9yZShuZXdDaGlsZCwgcmVmQ2hpbGQpCiAgICAgICAgIGlmIG5ld0NoaWxkLm5vZGVUeXBlIG5vdCBpbiBzZWxmLl9jaGlsZF9ub2RlX3R5cGVzOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5ld0NoaWxkKSwgcmVwcihzZWxmKSkpCiAgICAgICAgIGlmIG5ld0NoaWxkIGlzIG9sZENoaWxkOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgob2xkQ2hpbGQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIHNlbGYuY2hpbGROb2Rlc1tpbmRleF0gPSBuZXdDaGlsZAogICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlID0gc2VsZgogICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5yZW1vdmUob2xkQ2hpbGQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIGlmIG9sZENoaWxkLm5leHRTaWJsaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgb2xkQ2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nCiAgICAgICAgIGlmIG9sZENoaWxkLnByZXZpb3VzU2libGluZyBpcyBub3QgTm9uZToKQEAgLTM4Niw3ICszODYsNyBAQAogICAgICAgICBuc3VyaSA9IHNlbGYubmFtZXNwYWNlVVJJCiAgICAgICAgIGlmIHByZWZpeCA9PSAieG1sbnMiOgogICAgICAgICAgICAgaWYgbnN1cmkgYW5kIG5zdXJpICE9IFhNTE5TX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCiAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiAneG1sbnMnIHByZWZpeCBmb3IgdGhlIHdyb25nIG5hbWVzcGFjZSIpCiAgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCiAgICAgICAgIGRbJ3ByZWZpeCddID0gcHJlZml4CkBAIC01NjQsNyArNTY0LDcgQEAKICAgICAgICAgICAgICAgICBuLl9fZGljdF9fWydvd25lckVsZW1lbnQnXSA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiBuCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKIAogICAgIGRlZiByZW1vdmVOYW1lZEl0ZW1OUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CiAgICAgICAgIG4gPSBzZWxmLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKQpAQCAtNTc2LDExICs1NzYsMTEgQEAKICAgICAgICAgICAgICAgICBuLl9fZGljdF9fWydvd25lckVsZW1lbnQnXSA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiBuCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKIAogICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgbm9kZSk6CiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIEF0dHIpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKICAgICAgICAgb2xkID0gc2VsZi5fYXR0cnMuZ2V0KG5vZGUubmFtZSkKICAgICAgICAgaWYgb2xkOgpAQCAtNzMxLDcgKzczMSw3IEBACiAKICAgICBkZWYgc2V0QXR0cmlidXRlTm9kZShzZWxmLCBhdHRyKToKICAgICAgICAgaWYgYXR0ci5vd25lckVsZW1lbnQgbm90IGluIChOb25lLCBzZWxmKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkludXNlQXR0cmlidXRlRXJyKCJhdHRyaWJ1dGUgbm9kZSBhbHJlYWR5IG93bmVkIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW51c2VBdHRyaWJ1dGVFcnIoImF0dHJpYnV0ZSBub2RlIGFscmVhZHkgb3duZWQiKQogICAgICAgICBvbGQxID0gc2VsZi5fYXR0cnMuZ2V0KGF0dHIubmFtZSwgTm9uZSkKICAgICAgICAgaWYgb2xkMSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHNlbGYucmVtb3ZlQXR0cmlidXRlTm9kZShvbGQxKQpAQCAtNzUzLDIzICs3NTMsMjMgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYXR0ciA9IHNlbGYuX2F0dHJzW25hbWVdCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKIAogICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGF0dHIgPSBzZWxmLl9hdHRyc05TWyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSldCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKIAogICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOb2RlKHNlbGYsIG5vZGUpOgogICAgICAgICBpZiBub2RlIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5fYXR0cnNbbm9kZS5uYW1lXQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCiAgICAgICAgIG5vZGUudW5saW5rKCkKICAgICAgICAgIyBSZXN0b3JlIHRoaXMgc2luY2UgdGhlIG5vZGUgaXMgc3RpbGwgdXNlZnVsIGFuZCBvdGhlcndpc2UKQEAgLTgzNyw5ICs4MzcsOSBAQAogCiAgICAgZGVmIHNldElkQXR0cmlidXRlTm9kZShzZWxmLCBpZEF0dHIpOgogICAgICAgICBpZiBpZEF0dHIgaXMgTm9uZSBvciBub3Qgc2VsZi5pc1NhbWVOb2RlKGlkQXR0ci5vd25lckVsZW1lbnQpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIGlmIF9nZXRfY29udGFpbmluZ19lbnRyZWYoc2VsZikgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoKQogICAgICAgICBpZiBub3QgaWRBdHRyLl9pc19pZDoKICAgICAgICAgICAgIGlkQXR0ci5fX2RpY3RfX1snX2lzX2lkJ10gPSBUcnVlCiAgICAgICAgICAgICBzZWxmLl9tYWdpY19pZF9ub2RlcyArPSAxCkBAIC04ODAsMjIgKzg4MCwyMiBAQAogICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBjYW5ub3QgaGF2ZSBjaGlsZHJlbiIpCiAKICAgICBkZWYgaGFzQ2hpbGROb2RlcyhzZWxmKToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKICAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5ld0NoaWxkLCByZWZDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKIAogICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKAogICAgICAgICAgICAgc2VsZi5ub2RlTmFtZSArICIgbm9kZXMgZG8gbm90IGhhdmUgY2hpbGRyZW4iKQogCiAgICAgZGVmIHJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBkbyBub3QgaGF2ZSBjaGlsZHJlbiIpCiAKIApAQCAtOTYxLDExICs5NjEsMTEgQEAKIAogICAgIGRlZiBzdWJzdHJpbmdEYXRhKHNlbGYsIG9mZnNldCwgY291bnQpOgogICAgICAgICBpZiBvZmZzZXQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQogICAgICAgICBpZiBjb3VudCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvZmZzZXQ6b2Zmc2V0K2NvdW50XQogCiAgICAgZGVmIGFwcGVuZERhdGEoc2VsZiwgYXJnKToKQEAgLTk3MywzMCArOTczLDMwIEBACiAKICAgICBkZWYgaW5zZXJ0RGF0YShzZWxmLCBvZmZzZXQsIGFyZyk6CiAgICAgICAgIGlmIG9mZnNldCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQogICAgICAgICBpZiBvZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCiAgICAgICAgIGlmIGFyZzoKICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIlcyVzJXMiICUgKAogICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6b2Zmc2V0XSwgYXJnLCBzZWxmLmRhdGFbb2Zmc2V0Ol0pCiAKICAgICBkZWYgZGVsZXRlRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50KToKICAgICAgICAgaWYgb2Zmc2V0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKICAgICAgICAgaWYgY291bnQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIGNvdW50OgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzpvZmZzZXRdICsgc2VsZi5kYXRhW29mZnNldCtjb3VudDpdCiAKICAgICBkZWYgcmVwbGFjZURhdGEoc2VsZiwgb2Zmc2V0LCBjb3VudCwgYXJnKToKICAgICAgICAgaWYgb2Zmc2V0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKICAgICAgICAgaWYgY291bnQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIGNvdW50OgogICAgICAgICAgICAgc2VsZi5kYXRhID0gIiVzJXMlcyIgJSAoCiAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpvZmZzZXRdLCBhcmcsIHNlbGYuZGF0YVtvZmZzZXQrY291bnQ6XSkKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAKICAgICBkZWYgc3BsaXRUZXh0KHNlbGYsIG9mZnNldCk6CiAgICAgICAgIGlmIG9mZnNldCA8IDAgb3Igb2Zmc2V0ID4gbGVuKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImlsbGVnYWwgb2Zmc2V0IHZhbHVlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJpbGxlZ2FsIG9mZnNldCB2YWx1ZSIpCiAgICAgICAgIG5ld1RleHQgPSBzZWxmLl9fY2xhc3NfXygpCiAgICAgICAgIG5ld1RleHQuZGF0YSA9IHNlbGYuZGF0YVtvZmZzZXQ6XQogICAgICAgICBuZXdUZXh0Lm93bmVyRG9jdW1lbnQgPSBzZWxmLm93bmVyRG9jdW1lbnQKQEAgLTExODUsMTkgKzExODUsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBkZWYgcmVtb3ZlTmFtZWRJdGVtKHNlbGYsIG5hbWUpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAogICAgICAgICAgICAgIk5hbWVkTm9kZU1hcCBpbnN0YW5jZSBpcyByZWFkLW9ubHkiKQogCiAgICAgZGVmIHJlbW92ZU5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKIAogICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgbm9kZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCiAgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCiAKICAgICBkZWYgc2V0TmFtZWRJdGVtTlMoc2VsZiwgbm9kZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCiAgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKICAgICAgICAgICAgIGNsb25lID0gRG9jdW1lbnRUeXBlKE5vbmUpCiAgICAgICAgICAgICBjbG9uZS5uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgICAgICBjbG9uZS5ub2RlTmFtZSA9IHNlbGYubmFtZQotICAgICAgICAgICAgb3BlcmF0aW9uID0geG1sY29yZS5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECisgICAgICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAogICAgICAgICAgICAgaWYgZGVlcDoKICAgICAgICAgICAgICAgICBjbG9uZS5lbnRpdGllcy5fc2VxID0gW10KICAgICAgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcSA9IFtdCkBAIC0xMzExLDE5ICsxMzExLDE5IEBACiAgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb24KIAogICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBuZXdDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICJjYW5ub3QgYXBwZW5kIGNoaWxkcmVuIHRvIGFuIGVudGl0eSBub2RlIikKIAogICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCBpbnNlcnQgY2hpbGRyZW4gYmVsb3cgYW4gZW50aXR5IG5vZGUiKQogCiAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCByZW1vdmUgY2hpbGRyZW4gZnJvbSBhbiBlbnRpdHkgbm9kZSIpCiAKICAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICJjYW5ub3QgcmVwbGFjZSBjaGlsZHJlbiBvZiBhbiBlbnRpdHkgbm9kZSIpCiAKIGNsYXNzIE5vdGF0aW9uKElkZW50aWZpZWQsIENoaWxkbGVzcywgTm9kZSk6CkBAIC0xMzU1LDcgKzEzNTUsNyBAQAogCiAgICAgZGVmIGNyZWF0ZURvY3VtZW50KHNlbGYsIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgZG9jdHlwZSk6CiAgICAgICAgIGlmIGRvY3R5cGUgYW5kIGRvY3R5cGUucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLldyb25nRG9jdW1lbnRFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoCiAgICAgICAgICAgICAgICAgImRvY3R5cGUgb2JqZWN0IG93bmVkIGJ5IGFub3RoZXIgRE9NIHRyZWUiKQogICAgICAgICBkb2MgPSBzZWxmLl9jcmVhdGVfZG9jdW1lbnQoKQogCkBAIC0xMzc2LDE1ICsxMzc2LDE1IEBACiAgICAgICAgICAgICAjIE51bGwgdGhlIGRvY3VtZW50IGlzIHJldHVybmVkIHdpdGhvdXQgYSBkb2N1bWVudCBlbGVtZW50CiAgICAgICAgICAgICAjIE90aGVyd2lzZSBpZiBkb2N0eXBlIG9yIG5hbWVzcGFjZVVSSSBhcmUgbm90IE5vbmUKICAgICAgICAgICAgICMgVGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBhYm92ZSBwcm9ibGVtCi0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbnZhbGlkQ2hhcmFjdGVyRXJyKCJFbGVtZW50IHdpdGggbm8gbmFtZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkludmFsaWRDaGFyYWN0ZXJFcnIoIkVsZW1lbnQgd2l0aCBubyBuYW1lIikKIAogICAgICAgICBpZiBhZGRfcm9vdF9lbGVtZW50OgogICAgICAgICAgICAgcHJlZml4LCBsb2NhbG5hbWUgPSBfbnNzcGxpdChxdWFsaWZpZWROYW1lKQogICAgICAgICAgICAgaWYgcHJlZml4ID09ICJ4bWwiIFwKICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKCJpbGxlZ2FsIHVzZSBvZiAneG1sJyBwcmVmaXgiKQorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKCJpbGxlZ2FsIHVzZSBvZiAneG1sJyBwcmVmaXgiKQogICAgICAgICAgICAgaWYgcHJlZml4IGFuZCBub3QgbmFtZXNwYWNlVVJJOgotICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mIHByZWZpeCB3aXRob3V0IG5hbWVzcGFjZXMiKQogICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKQogICAgICAgICAgICAgaWYgZG9jdHlwZToKQEAgLTE1MzMsNyArMTUzMyw3IEBACiAKICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobm9kZSksIHJlcHIoc2VsZikpKQogICAgICAgICBpZiBub2RlLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlIG5leHQgdGVzdCBzaW5jZSB0aGlzCkBAIC0xNTQzLDcgKzE1NDMsNyBAQAogCiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgXAogICAgICAgICAgICBhbmQgc2VsZi5fZ2V0X2RvY3VtZW50RWxlbWVudCgpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAidHdvIGRvY3VtZW50IGVsZW1lbnRzIGRpc2FsbG93ZWQiKQogICAgICAgICByZXR1cm4gTm9kZS5hcHBlbmRDaGlsZChzZWxmLCBub2RlKQogCkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMucmVtb3ZlKG9sZENoaWxkKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBvbGRDaGlsZC5uZXh0U2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKICAgICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZSA9IE5vbmUKICAgICAgICAgaWYgc2VsZi5kb2N1bWVudEVsZW1lbnQgaXMgb2xkQ2hpbGQ6CkBAIC0xNTg3LDcgKzE1ODcsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydCBjbG9uZS5kb2N0eXBlIGlzIE5vbmUKICAgICAgICAgICAgICAgICBjbG9uZS5kb2N0eXBlID0gY2hpbGRjbG9uZQogICAgICAgICAgICAgY2hpbGRjbG9uZS5wYXJlbnROb2RlID0gY2xvbmUKLSAgICAgICAgc2VsZi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcih4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsCisgICAgICAgIHNlbGYuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIoeG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgY2xvbmUpCiAgICAgICAgIHJldHVybiBjbG9uZQogCkBAIC0xNzI5LDkgKzE3MjksOSBAQAogCiAgICAgZGVmIGltcG9ydE5vZGUoc2VsZiwgbm9kZSwgZGVlcCk6CiAgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IG5vZGVzIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IG5vZGVzIikKICAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IHR5cGUgbm9kZXMiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgdHlwZSBub2RlcyIpCiAgICAgICAgIHJldHVybiBfY2xvbmVfbm9kZShub2RlLCBkZWVwLCBzZWxmKQogCiAgICAgZGVmIHdyaXRleG1sKHNlbGYsIHdyaXRlciwgaW5kZW50PSIiLCBhZGRpbmRlbnQ9IiIsIG5ld2w9IiIsCkBAIC0xNzQ3LDI0ICsxNzQ3LDI0IEBACiAKICAgICBkZWYgcmVuYW1lTm9kZShzZWxmLCBuLCBuYW1lc3BhY2VVUkksIG5hbWUpOgogICAgICAgICBpZiBuLm93bmVyRG9jdW1lbnQgaXMgbm90IHNlbGY6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAogICAgICAgICAgICAgICAgICJjYW5ub3QgcmVuYW1lIG5vZGVzIGZyb20gb3RoZXIgZG9jdW1lbnRzO1xuIgogICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyxcbmZvdW5kICVzIiAlIChzZWxmLCBuLm93bmVyRG9jdW1lbnQpKQogICAgICAgICBpZiBuLm5vZGVUeXBlIG5vdCBpbiAoTm9kZS5FTEVNRU5UX05PREUsIE5vZGUuQVRUUklCVVRFX05PREUpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgInJlbmFtZU5vZGUoKSBvbmx5IGFwcGxpZXMgdG8gZWxlbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzIikKICAgICAgICAgaWYgbmFtZXNwYWNlVVJJICE9IEVNUFRZX05BTUVTUEFDRToKICAgICAgICAgICAgIGlmICc6JyBpbiBuYW1lOgogICAgICAgICAgICAgICAgIHByZWZpeCwgbG9jYWxOYW1lID0gbmFtZS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgaWYgKCAgcHJlZml4ID09ICJ4bWxucyIKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbGNvcmUuZG9tLlhNTE5TX05BTUVTUEFDRSk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbC5kb20uWE1MTlNfTkFNRVNQQUNFKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCiAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgJ3htbG5zJyBwcmVmaXgiKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiAoICBuYW1lID09ICJ4bWxucyIKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbGNvcmUuZG9tLlhNTE5TX05BTUVTUEFDRQorICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sLmRvbS5YTUxOU19OQU1FU1BBQ0UKICAgICAgICAgICAgICAgICAgICAgICBhbmQgbi5ub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiB0aGUgJ3htbG5zJyBhdHRyaWJ1dGUiKQogICAgICAgICAgICAgICAgIHByZWZpeCA9IE5vbmUKICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBuYW1lCkBAIC0xODEwLDkgKzE4MTAsOSBAQAogICAgIENhbGxlZCBieSBOb2RlLmNsb25lTm9kZSBhbmQgRG9jdW1lbnQuaW1wb3J0Tm9kZQogICAgICIiIgogICAgIGlmIG5vZGUub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKG5ld093bmVyRG9jdW1lbnQpOgotICAgICAgICBvcGVyYXRpb24gPSB4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKKyAgICAgICAgb3BlcmF0aW9uID0geG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKICAgICBlbHNlOgotICAgICAgICBvcGVyYXRpb24gPSB4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRAorICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECiAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhub2RlLm5hbWVzcGFjZVVSSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lKQpAQCAtMTg0OSw3ICsxODQ5LDcgQEAKICAgICAgICAgY2xvbmUudmFsdWUgPSBub2RlLnZhbHVlCiAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICBhc3NlcnQgbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBuZXdPd25lckRvY3VtZW50Ci0gICAgICAgIG9wZXJhdGlvbiA9IHhtbGNvcmUuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECisgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKICAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZSgKICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNJZCwgbm9kZS5zeXN0ZW1JZCkKICAgICAgICAgY2xvbmUub3duZXJEb2N1bWVudCA9IG5ld093bmVyRG9jdW1lbnQKQEAgLTE4NzYsNyArMTg3Niw3IEBACiAgICAgICAgICMgTm90ZSB0aGUgY2xvbmluZyBvZiBEb2N1bWVudCBhbmQgRG9jdW1lbnRUeXBlIG5vZGVzIGlzCiAgICAgICAgICMgaW1wbGVtZW5ldGF0aW9uIHNwZWNpZmljLiAgbWluaWRvbSBoYW5kbGVzIHRob3NlIGNhc2VzCiAgICAgICAgICMgZGlyZWN0bHkgaW4gdGhlIGNsb25lTm9kZSgpIG1ldGhvZHMuCi0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigiQ2Fubm90IGNsb25lIG5vZGUgJXMiICUgcmVwcihub2RlKSkKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoIkNhbm5vdCBjbG9uZSBub2RlICVzIiAlIHJlcHIobm9kZSkpCiAKICAgICAjIENoZWNrIGZvciBfY2FsbF91c2VyX2RhdGFfaGFuZGxlcigpIHNpbmNlIHRoaXMgY291bGQgY29uY2VpdmFibHkKICAgICAjIHVzZWQgd2l0aCBvdGhlciBET00gaW1wbGVtZW50YXRpb25zIChvbmUgb2YgdGhlIEZvdXJUaG91Z2h0CkBAIC0xOTA5LDIwICsxOTA5LDIwIEBACiBkZWYgcGFyc2UoZmlsZSwgcGFyc2VyPU5vbmUsIGJ1ZnNpemU9Tm9uZSk6CiAgICAgIiIiUGFyc2UgYSBmaWxlIGludG8gYSBET00gYnkgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QuIiIiCiAgICAgaWYgcGFyc2VyIGlzIE5vbmUgYW5kIG5vdCBidWZzaXplOgotICAgICAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKICAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZShmaWxlKQogICAgIGVsc2U6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IHB1bGxkb20KKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCiAgICAgICAgIHJldHVybiBfZG9fcHVsbGRvbV9wYXJzZShwdWxsZG9tLnBhcnNlLCAoZmlsZSwpLAogICAgICAgICAgICAgeydwYXJzZXInOiBwYXJzZXIsICdidWZzaXplJzogYnVmc2l6ZX0pCiAKIGRlZiBwYXJzZVN0cmluZyhzdHJpbmcsIHBhcnNlcj1Ob25lKToKICAgICAiIiJQYXJzZSBhIGZpbGUgaW50byBhIERPTSBmcm9tIGEgc3RyaW5nLiIiIgogICAgIGlmIHBhcnNlciBpcyBOb25lOgotICAgICAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKICAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZVN0cmluZyhzdHJpbmcpCiAgICAgZWxzZToKLSAgICAgICAgZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgcHVsbGRvbQorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KICAgICAgICAgcmV0dXJuIF9kb19wdWxsZG9tX3BhcnNlKHB1bGxkb20ucGFyc2VTdHJpbmcsIChzdHJpbmcsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncGFyc2VyJzogcGFyc2VyfSkKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL3B1bGxkb20ucHkgYi9MaWIveG1sL2RvbS9wdWxsZG9tLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9wdWxsZG9tLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9wdWxsZG9tLnB5CmluZGV4IGRhZDM3MTguLjE4ZjQ5YjUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9wdWxsZG9tLnB5CisrKyBiL0xpYi94bWwvZG9tL3B1bGxkb20ucHkKQEAgLTEsNSArMSw1IEBACi1pbXBvcnQgeG1sY29yZS5zYXgKLWltcG9ydCB4bWxjb3JlLnNheC5oYW5kbGVyCitpbXBvcnQgeG1sLnNheAoraW1wb3J0IHhtbC5zYXguaGFuZGxlcgogaW1wb3J0IHR5cGVzCiAKIHRyeToKQEAgLTE2LDEyICsxNiwxMiBAQAogSUdOT1JBQkxFX1dISVRFU1BBQ0UgPSAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiCiBDSEFSQUNURVJTID0gIkNIQVJBQ1RFUlMiCiAKLWNsYXNzIFB1bGxET00oeG1sY29yZS5zYXguQ29udGVudEhhbmRsZXIpOgorY2xhc3MgUHVsbERPTSh4bWwuc2F4LkNvbnRlbnRIYW5kbGVyKToKICAgICBfbG9jYXRvciA9IE5vbmUKICAgICBkb2N1bWVudCA9IE5vbmUKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkb2N1bWVudEZhY3Rvcnk9Tm9uZSk6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IFhNTF9OQU1FU1BBQ0UKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBYTUxfTkFNRVNQQUNFCiAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0gZG9jdW1lbnRGYWN0b3J5CiAgICAgICAgIHNlbGYuZmlyc3RFdmVudCA9IFtOb25lLCBOb25lXQogICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYuZmlyc3RFdmVudApAQCAtMTY0LDggKzE2NCw4IEBACiAKICAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKICAgICAgICAgaWYgc2VsZi5kb2N1bWVudEZhY3RvcnkgaXMgTm9uZToKLSAgICAgICAgICAgIGltcG9ydCB4bWxjb3JlLmRvbS5taW5pZG9tCi0gICAgICAgICAgICBzZWxmLmRvY3VtZW50RmFjdG9yeSA9IHhtbGNvcmUuZG9tLm1pbmlkb20uRG9jdW1lbnQuaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGltcG9ydCB4bWwuZG9tLm1pbmlkb20KKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0geG1sLmRvbS5taW5pZG9tLkRvY3VtZW50LmltcGxlbWVudGF0aW9uCiAKICAgICBkZWYgYnVpbGREb2N1bWVudChzZWxmLCB1cmksIHRhZ25hbWUpOgogICAgICAgICAjIENhbid0IGRvIHRoYXQgaW4gc3RhcnREb2N1bWVudCwgc2luY2Ugd2UgbmVlZCB0aGUgdGFnbmFtZQpAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnB1bGxkb20gPSBQdWxsRE9NKCkKICAgICAgICAgIyBUaGlzIGNvbnRlbnQgaGFuZGxlciByZWxpZXMgb24gbmFtZXNwYWNlIHN1cHBvcnQKLSAgICAgICAgc2VsZi5wYXJzZXIuc2V0RmVhdHVyZSh4bWxjb3JlLnNheC5oYW5kbGVyLmZlYXR1cmVfbmFtZXNwYWNlcywgMSkKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0RmVhdHVyZSh4bWwuc2F4LmhhbmRsZXIuZmVhdHVyZV9uYW1lc3BhY2VzLCAxKQogICAgICAgICBzZWxmLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcihzZWxmLnB1bGxkb20pCiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcG9zKToKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHN0cmVhbSA9IHN0cmVhbV9vcl9zdHJpbmcKICAgICBpZiBub3QgcGFyc2VyOgotICAgICAgICBwYXJzZXIgPSB4bWxjb3JlLnNheC5tYWtlX3BhcnNlcigpCisgICAgICAgIHBhcnNlciA9IHhtbC5zYXgubWFrZV9wYXJzZXIoKQogICAgIHJldHVybiBET01FdmVudFN0cmVhbShzdHJlYW0sIHBhcnNlciwgYnVmc2l6ZSkKIAogZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgcGFyc2VyPU5vbmUpOgpAQCAtMzQ3LDUgKzM0Nyw1IEBACiAgICAgYnVmc2l6ZSA9IGxlbihzdHJpbmcpCiAgICAgYnVmID0gU3RyaW5nSU8oc3RyaW5nKQogICAgIGlmIG5vdCBwYXJzZXI6Ci0gICAgICAgIHBhcnNlciA9IHhtbGNvcmUuc2F4Lm1ha2VfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyID0geG1sLnNheC5tYWtlX3BhcnNlcigpCiAgICAgcmV0dXJuIERPTUV2ZW50U3RyZWFtKGJ1ZiwgcGFyc2VyLCBidWZzaXplKQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkgYi9MaWIveG1sL2RvbS94bWxidWlsZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS94bWxidWlsZGVyLnB5CmluZGV4IDY1NjZkM2MuLmFjMWQ0NDggMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CisrKyBiL0xpYi94bWwvZG9tL3htbGJ1aWxkZXIucHkKQEAgLTEsOSArMSw5IEBACiAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRE9NIExldmVsIDMgJ0xTLUxvYWQnIGZlYXR1cmUuIiIiCiAKIGltcG9ydCBjb3B5Ci1pbXBvcnQgeG1sY29yZS5kb20KK2ltcG9ydCB4bWwuZG9tCiAKLWZyb20geG1sY29yZS5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgorZnJvbSB4bWwuZG9tLk5vZGVGaWx0ZXIgaW1wb3J0IE5vZGVGaWx0ZXIKIAogCiBfX2FsbF9fID0gWyJET01CdWlsZGVyIiwgIkRPTUVudGl0eVJlc29sdmVyIiwgIkRPTUlucHV0U291cmNlIl0KQEAgLTc4LDEzICs3OCwxMyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2VsZi5fc2V0dGluZ3NbKF9uYW1lX3hmb3JtKG5hbWUpLCBzdGF0ZSldCiAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZmVhdHVyZTogJXIiICUgKG5hbWUsKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNldHRpbmdzOgogICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYuX29wdGlvbnMsIG5hbWUsIHZhbHVlKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoInVua25vd24gZmVhdHVyZTogIiArIHJlcHIobmFtZSkpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCJ1bmtub3duIGZlYXR1cmU6ICIgKyByZXByKG5hbWUpKQogCiAgICAgZGVmIHN1cHBvcnRzRmVhdHVyZShzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fb3B0aW9ucywgX25hbWVfeGZvcm0obmFtZSkpCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuZW50aXRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY2RhdGFfc2VjdGlvbnMpKQotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoImZlYXR1cmUgJXMgbm90IGtub3duIiAlIHJlcHIobmFtZSkpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCJmZWF0dXJlICVzIG5vdCBrbm93biIgJSByZXByKG5hbWUpKQogCiAgICAgZGVmIHBhcnNlVVJJKHNlbGYsIHVyaSk6CiAgICAgICAgIGlmIHNlbGYuZW50aXR5UmVzb2x2ZXI6CkBAIC0yMDAsOCArMjAwLDggQEAKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiSGF2ZW4ndCB3cml0dGVuIHRoaXMgeWV0Li4uIikKIAogICAgIGRlZiBfcGFyc2VfYnl0ZXN0cmVhbShzZWxmLCBzdHJlYW0sIG9wdGlvbnMpOgotICAgICAgICBpbXBvcnQgeG1sY29yZS5kb20uZXhwYXRidWlsZGVyCi0gICAgICAgIGJ1aWxkZXIgPSB4bWxjb3JlLmRvbS5leHBhdGJ1aWxkZXIubWFrZUJ1aWxkZXIob3B0aW9ucykKKyAgICAgICAgaW1wb3J0IHhtbC5kb20uZXhwYXRidWlsZGVyCisgICAgICAgIGJ1aWxkZXIgPSB4bWwuZG9tLmV4cGF0YnVpbGRlci5tYWtlQnVpbGRlcihvcHRpb25zKQogICAgICAgICByZXR1cm4gYnVpbGRlci5wYXJzZUZpbGUoc3RyZWFtKQogCiAKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICByZXR1cm4gRmFsc2UKICAgICBkZWYgX3NldF9hc3luYyhzZWxmLCBhc3luYyk6CiAgICAgICAgIGlmIGFzeW5jOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgImFzeW5jaHJvbm91cyBkb2N1bWVudCBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpAQCAtMzU5LDcgKzM1OSw3IEBACiAgICAgICAgIGlmIHNub2RlIGlzIE5vbmU6CiAgICAgICAgICAgICBzbm9kZSA9IHNlbGYKICAgICAgICAgZWxpZiBzbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBzZWxmOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uV3JvbmdEb2N1bWVudEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoKQogICAgICAgICByZXR1cm4gc25vZGUudG94bWwoKQogCiAKQEAgLTM2OSwxMiArMzY5LDEyIEBACiAKICAgICBkZWYgY3JlYXRlRE9NQnVpbGRlcihzZWxmLCBtb2RlLCBzY2hlbWFUeXBlKToKICAgICAgICAgaWYgc2NoZW1hVHlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICJzY2hlbWFUeXBlIG5vdCB5ZXQgc3VwcG9ydGVkIikKICAgICAgICAgaWYgbW9kZSA9PSBzZWxmLk1PREVfU1lOQ0hST05PVVM6CiAgICAgICAgICAgICByZXR1cm4gRE9NQnVpbGRlcigpCiAgICAgICAgIGlmIG1vZGUgPT0gc2VsZi5NT0RFX0FTWU5DSFJPTk9VUzoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAogICAgICAgICAgICAgICAgICJhc3luY2hyb25vdXMgYnVpbGRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIHZhbHVlIGZvciBtb2RlIikKIApkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CnJlbmFtZSB0byBMaWIveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CmluZGV4IGQ3Zjg1YjMuLjk3NGNjMjEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKQEAgLTQ5LDcgKzQ5LDcgQEAKICMjCiAKIGltcG9ydCBjb3B5Ci1mcm9tIC4gaW1wb3J0IEVsZW1lbnRUcmVlCitpbXBvcnQgRWxlbWVudFRyZWUKIAogWElOQ0xVREUgPSAie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGV9IgogCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9ldHJlZS9FbGVtZW50UGF0aC5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRQYXRoLnB5CnJlbmFtZSB0byBMaWIveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9ldHJlZS9FbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudFRyZWUucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKaW5kZXggYjM5NzYwZWEuLjdkYmM3MmUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRUcmVlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAidG9zdHJpbmciLAogICAgICJUcmVlQnVpbGRlciIsCiAgICAgIlZFUlNJT04iLCAiWE1MIiwKLSAgICAiWE1MVHJlZUJ1aWxkZXIiLAorICAgICJYTUxQYXJzZXIiLCAiWE1MVHJlZUJ1aWxkZXIiLAogICAgIF0KIAogIyMKQEAgLTExMTIsNyArMTExMiw3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaHRtbD0wLCB0YXJnZXQ9Tm9uZSk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgICAgICAgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCBleHBhdDsgdXNlIFNpbXBsZVhNTFRyZWVCdWlsZGVyIGluc3RlYWQiCkBAIC0xMTk0LDcgKzExOTQsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX3RhcmdldC5kYXRhKHNlbGYuZW50aXR5W3RleHRbMTotMV1dKQogICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIGZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgICAgICAgICAgICAgIGZyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0CiAgICAgICAgICAgICAgICAgcmFpc2UgZXhwYXQuZXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgZW50aXR5ICVzOiBsaW5lICVkLCBjb2x1bW4gJWQiICUKICAgICAgICAgICAgICAgICAgICAgKHRleHQsIHNlbGYuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIsCkBAIC0xMjU1LDMgKzEyNTUsNiBAQAogICAgICAgICB0cmVlID0gc2VsZi5fdGFyZ2V0LmNsb3NlKCkKICAgICAgICAgZGVsIHNlbGYuX3RhcmdldCwgc2VsZi5fcGFyc2VyICMgZ2V0IHJpZCBvZiBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgIHJldHVybiB0cmVlCisKKyMgY29tcGF0aWJpbGl0eQorWE1MUGFyc2VyID0gWE1MVHJlZUJ1aWxkZXIKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL19faW5pdF9fLnB5IGIvTGliL3htbC9ldHJlZS9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvX19pbml0X18ucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL2NFbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9ldHJlZS9jRWxlbWVudFRyZWUucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9wYXJzZXJzL19faW5pdF9fLnB5IGIvTGliL3htbC9wYXJzZXJzL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9wYXJzZXJzL19faW5pdF9fLnB5CnJlbmFtZSB0byBMaWIveG1sL3BhcnNlcnMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3BhcnNlcnMvZXhwYXQucHkgYi9MaWIveG1sL3BhcnNlcnMvZXhwYXQucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3BhcnNlcnMvZXhwYXQucHkKcmVuYW1lIHRvIExpYi94bWwvcGFyc2Vycy9leHBhdC5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvc2F4L19faW5pdF9fLnB5IGIvTGliL3htbC9zYXgvX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L19faW5pdF9fLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9fX2luaXRfXy5weQppbmRleCA4YWZiZGIwLi42YjFiMWJhIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgvX19pbml0X18ucHkKKysrIGIvTGliL3htbC9zYXgvX19pbml0X18ucHkKQEAgLTE5LDExICsxOSwxMSBAQAogZXhwYXRyZWFkZXIgLS0gRHJpdmVyIHRoYXQgYWxsb3dzIHVzZSBvZiB0aGUgRXhwYXQgcGFyc2VyIHdpdGggU0FYLgogIiIiCiAKLWZyb20gLnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UKLWZyb20gLmhhbmRsZXIgaW1wb3J0IENvbnRlbnRIYW5kbGVyLCBFcnJvckhhbmRsZXIKLWZyb20gLl9leGNlcHRpb25zIGltcG9ydCAoU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQVhSZWFkZXJOb3RBdmFpbGFibGUpCitmcm9tIHhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UKK2Zyb20gaGFuZGxlciBpbXBvcnQgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlcgorZnJvbSBfZXhjZXB0aW9ucyBpbXBvcnQgU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhSZWFkZXJOb3RBdmFpbGFibGUKIAogCiBkZWYgcGFyc2Uoc291cmNlLCBoYW5kbGVyLCBlcnJvckhhbmRsZXI9RXJyb3JIYW5kbGVyKCkpOgpAQCAtNTEsMTIgKzUxLDEyIEBACiAjIHRoaXMgaXMgdGhlIHBhcnNlciBsaXN0IHVzZWQgYnkgdGhlIG1ha2VfcGFyc2VyIGZ1bmN0aW9uIGlmIG5vCiAjIGFsdGVybmF0aXZlcyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb24KIAotZGVmYXVsdF9wYXJzZXJfbGlzdCA9IFsieG1sY29yZS5zYXguZXhwYXRyZWFkZXIiXQorZGVmYXVsdF9wYXJzZXJfbGlzdCA9IFsieG1sLnNheC5leHBhdHJlYWRlciJdCiAKICMgdGVsbCBtb2R1bGVmaW5kZXIgdGhhdCBpbXBvcnRpbmcgc2F4IHBvdGVudGlhbGx5IGltcG9ydHMgZXhwYXRyZWFkZXIKIF9mYWxzZSA9IDAKIGlmIF9mYWxzZToKLSAgICBpbXBvcnQgeG1sY29yZS5zYXguZXhwYXRyZWFkZXIKKyAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgogCiBpbXBvcnQgb3MsIHN5cwogaWYgb3MuZW52aXJvbi5oYXNfa2V5KCJQWV9TQVhfUEFSU0VSIik6CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvX2V4Y2VwdGlvbnMucHkgYi9MaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L19leGNlcHRpb25zLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9fZXhjZXB0aW9ucy5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvc2F4L2V4cGF0cmVhZGVyLnB5IGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L2V4cGF0cmVhZGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9leHBhdHJlYWRlci5weQppbmRleCA2ZmJkMjJlLi5iYjljMjk0IDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgvZXhwYXRyZWFkZXIucHkKKysrIGIvTGliL3htbC9zYXgvZXhwYXRyZWFkZXIucHkKQEAgLTUsMjcgKzUsMjcgQEAKIAogdmVyc2lvbiA9ICIwLjIwIgogCi1mcm9tIHhtbGNvcmUuc2F4Ll9leGNlcHRpb25zIGltcG9ydCAqCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfdmFsaWRhdGlvbiwgZmVhdHVyZV9uYW1lc3BhY2VzCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfbmFtZXNwYWNlX3ByZWZpeGVzCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfZXh0ZXJuYWxfZ2VzLCBmZWF0dXJlX2V4dGVybmFsX3BlcwotZnJvbSB4bWxjb3JlLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcKLWZyb20geG1sY29yZS5zYXguaGFuZGxlciBpbXBvcnQgcHJvcGVydHlfeG1sX3N0cmluZywgcHJvcGVydHlfaW50ZXJuaW5nX2RpY3QKK2Zyb20geG1sLnNheC5fZXhjZXB0aW9ucyBpbXBvcnQgKgorZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfdmFsaWRhdGlvbiwgZmVhdHVyZV9uYW1lc3BhY2VzCitmcm9tIHhtbC5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX2V4dGVybmFsX2dlcywgZmVhdHVyZV9leHRlcm5hbF9wZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBwcm9wZXJ0eV94bWxfc3RyaW5nLCBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdAogCi0jIHhtbGNvcmUucGFyc2Vycy5leHBhdCBkb2VzIG5vdCByYWlzZSBJbXBvcnRFcnJvciBpbiBKeXRob24KKyMgeG1sLnBhcnNlcnMuZXhwYXQgZG9lcyBub3QgcmFpc2UgSW1wb3J0RXJyb3IgaW4gSnl0aG9uCiBpbXBvcnQgc3lzCiBpZiBzeXMucGxhdGZvcm1bOjRdID09ICJqYXZhIjoKICAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoImV4cGF0IG5vdCBhdmFpbGFibGUgaW4gSmF2YSIsIE5vbmUpCiBkZWwgc3lzCiAKIHRyeToKLSAgICBmcm9tIHhtbGNvcmUucGFyc2VycyBpbXBvcnQgZXhwYXQKKyAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCiBlbHNlOgogICAgIGlmIG5vdCBoYXNhdHRyKGV4cGF0LCAiUGFyc2VyQ3JlYXRlIik6CiAgICAgICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCi1mcm9tIHhtbGNvcmUuc2F4IGltcG9ydCB4bWxyZWFkZXIsIHNheHV0aWxzLCBoYW5kbGVyCitmcm9tIHhtbC5zYXggaW1wb3J0IHhtbHJlYWRlciwgc2F4dXRpbHMsIGhhbmRsZXIKIAogQXR0cmlidXRlc0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc0ltcGwKIEF0dHJpYnV0ZXNOU0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc05TSW1wbApAQCAtNDA3LDggKzQwNyw4IEBACiAjIC0tLQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCB4bWxjb3JlLnNheAorICAgIGltcG9ydCB4bWwuc2F4CiAgICAgcCA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIHAuc2V0Q29udGVudEhhbmRsZXIoeG1sY29yZS5zYXguWE1MR2VuZXJhdG9yKCkpCi0gICAgcC5zZXRFcnJvckhhbmRsZXIoeG1sY29yZS5zYXguRXJyb3JIYW5kbGVyKCkpCisgICAgcC5zZXRDb250ZW50SGFuZGxlcih4bWwuc2F4LlhNTEdlbmVyYXRvcigpKQorICAgIHAuc2V0RXJyb3JIYW5kbGVyKHhtbC5zYXguRXJyb3JIYW5kbGVyKCkpCiAgICAgcC5wYXJzZSgiLi4vLi4vLi4vaGFtbGV0LnhtbCIpCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvaGFuZGxlci5weSBiL0xpYi94bWwvc2F4L2hhbmRsZXIucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3NheC9oYW5kbGVyLnB5CnJlbmFtZSB0byBMaWIveG1sL3NheC9oYW5kbGVyLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvc2F4dXRpbHMucHkgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9zYXgvc2F4dXRpbHMucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L3NheHV0aWxzLnB5CmluZGV4IDg4MGRlODAuLmE0OTY1MTkgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL3NheC9zYXh1dGlscy5weQorKysgYi9MaWIveG1sL3NheC9zYXh1dGlscy5weQpAQCAtNCw4ICs0LDggQEAKICIiIgogCiBpbXBvcnQgb3MsIHVybHBhcnNlLCB1cmxsaWIsIHR5cGVzCi1mcm9tIC4gaW1wb3J0IGhhbmRsZXIKLWZyb20gLiBpbXBvcnQgeG1scmVhZGVyCitpbXBvcnQgaGFuZGxlcgoraW1wb3J0IHhtbHJlYWRlcgogCiB0cnk6CiAgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlXQpAQCAtNjgsNiArNjgsOCBAQAogICAgIHRoZSBvcHRpb25hbCBlbnRpdGllcyBwYXJhbWV0ZXIuICBUaGUga2V5cyBhbmQgdmFsdWVzIG11c3QgYWxsIGJlCiAgICAgc3RyaW5nczsgZWFjaCBrZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICIiIgorICAgIGVudGl0aWVzID0gZW50aXRpZXMuY29weSgpCisgICAgZW50aXRpZXMudXBkYXRlKHsnXG4nOiAnJiMxMDsnLCAnXHInOiAnJiMxMzsnLCAnXHQnOicmIzk7J30pCiAgICAgZGF0YSA9IGVzY2FwZShkYXRhLCBlbnRpdGllcykKICAgICBpZiAnIicgaW4gZGF0YToKICAgICAgICAgaWYgIiciIGluIGRhdGE6CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgveG1scmVhZGVyLnB5IGIvTGliL3htbC9zYXgveG1scmVhZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3NheC94bWxyZWFkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L3htbHJlYWRlci5weQppbmRleCAxY2FkZTY1Li45YTIzNjFlIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9zYXgveG1scmVhZGVyLnB5CisrKyBiL0xpYi94bWwvc2F4L3htbHJlYWRlci5weQpAQCAtMSw5ICsxLDkgQEAKICIiIkFuIFhNTCBSZWFkZXIgaXMgdGhlIFNBWCAyIG5hbWUgZm9yIGFuIFhNTCBwYXJzZXIuIFhNTCBQYXJzZXJzCiBzaG91bGQgYmUgYmFzZWQgb24gdGhpcyBjb2RlLiAiIiIKIAotZnJvbSAuIGltcG9ydCBoYW5kbGVyCitpbXBvcnQgaGFuZGxlcgogCi1mcm9tIC5fZXhjZXB0aW9ucyBpbXBvcnQgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uCitmcm9tIF9leGNlcHRpb25zIGltcG9ydCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KIAogCiAjID09PT09IFhNTFJFQURFUiA9PT09PQpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIFhNTFJlYWRlci5fX2luaXRfXyhzZWxmKQogCiAgICAgZGVmIHBhcnNlKHNlbGYsIHNvdXJjZSk6Ci0gICAgICAgIGZyb20gLiBpbXBvcnQgc2F4dXRpbHMKKyAgICAgICAgaW1wb3J0IHNheHV0aWxzCiAgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSkKIAogICAgICAgICBzZWxmLnByZXBhcmVQYXJzZXIoc291cmNlKQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvX19pbml0X18ucHkgYi9MaWIveG1sY29yZS9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2ZDhkZC4uMDAwMDAwMAotLS0gYS9MaWIveG1sY29yZS9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSIiIkNvcmUgWE1MIHN1cHBvcnQgZm9yIFB5dGhvbi4KLQotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGZvdXIgc3ViLXBhY2thZ2VzOgotCi1kb20gLS0gVGhlIFczQyBEb2N1bWVudCBPYmplY3QgTW9kZWwuICBUaGlzIHN1cHBvcnRzIERPTSBMZXZlbCAxICsKLSAgICAgICBOYW1lc3BhY2VzLgotCi1wYXJzZXJzIC0tIFB5dGhvbiB3cmFwcGVycyBmb3IgWE1MIHBhcnNlcnMgKGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEV4cGF0KS4KLQotc2F4IC0tIFRoZSBTaW1wbGUgQVBJIGZvciBYTUwsIGRldmVsb3BlZCBieSBYTUwtRGV2LCBsZWQgYnkgRGF2aWQKLSAgICAgICBNZWdnaW5zb24gYW5kIHBvcnRlZCB0byBQeXRob24gYnkgTGFycyBNYXJpdXMgR2Fyc2hvbC4gIFRoaXMKLSAgICAgICBzdXBwb3J0cyB0aGUgU0FYIDIgQVBJLgotCi1ldHJlZSAtLSBUaGUgRWxlbWVudFRyZWUgWE1MIGxpYnJhcnkuICBUaGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBmdWxsCi0gICAgICAgRWxlbWVudFRyZWUgWE1MIHJlbGVhc2UuCi0KLSIiIgotCi0KLV9fYWxsX18gPSBbImRvbSIsICJwYXJzZXJzIiwgInNheCIsICJldHJlZSJdCmRpZmYgLS1naXQgYS9MaWIvemlwZmlsZS5weSBiL0xpYi96aXBmaWxlLnB5CmluZGV4IDE2OGQyNDUuLjVjM2ZmZjMgMTAwNjQ0Ci0tLSBhL0xpYi96aXBmaWxlLnB5CisrKyBiL0xpYi96aXBmaWxlLnB5CkBAIC0xLDcgKzEsOCBAQAotIlJlYWQgYW5kIHdyaXRlIFpJUCBmaWxlcy4iCi0KKyIiIgorUmVhZCBhbmQgd3JpdGUgWklQIGZpbGVzLgorIiIiCiBpbXBvcnQgc3RydWN0LCBvcywgdGltZSwgc3lzCi1pbXBvcnQgYmluYXNjaWkKK2ltcG9ydCBiaW5hc2NpaSwgY1N0cmluZ0lPCiAKIHRyeToKICAgICBpbXBvcnQgemxpYiAjIFdlIG1heSBuZWVkIGl0cyBjb21wcmVzc2lvbiBtZXRob2QKQEAgLTksMTIgKzEwLDIyIEBACiAgICAgemxpYiA9IE5vbmUKIAogX19hbGxfXyA9IFsiQmFkWmlwZmlsZSIsICJlcnJvciIsICJaSVBfU1RPUkVEIiwgIlpJUF9ERUZMQVRFRCIsICJpc196aXBmaWxlIiwKLSAgICAgICAgICAgIlppcEluZm8iLCAiWmlwRmlsZSIsICJQeVppcEZpbGUiXQorICAgICAgICAgICAiWmlwSW5mbyIsICJaaXBGaWxlIiwgIlB5WmlwRmlsZSIsICJMYXJnZVppcEZpbGUiIF0KIAogY2xhc3MgQmFkWmlwZmlsZShFeGNlcHRpb24pOgogICAgIHBhc3MKKworCitjbGFzcyBMYXJnZVppcEZpbGUoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBSYWlzZWQgd2hlbiB3cml0aW5nIGEgemlwZmlsZSwgdGhlIHppcGZpbGUgcmVxdWlyZXMgWklQNjQgZXh0ZW5zaW9ucworICAgIGFuZCB0aG9zZSBleHRlbnNpb25zIGFyZSBkaXNhYmxlZC4KKyAgICAiIiIKKwogZXJyb3IgPSBCYWRaaXBmaWxlICAgICAgIyBUaGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGlzIG1vZHVsZQogCitaSVA2NF9MSU1JVD0gKDEgPDwgMzEpIC0gMQorCiAjIGNvbnN0YW50cyBmb3IgWmlwIGZpbGUgY29tcHJlc3Npb24gbWV0aG9kcwogWklQX1NUT1JFRCA9IDAKIFpJUF9ERUZMQVRFRCA9IDgKQEAgLTI3LDYgKzM4LDExIEBACiBzdHJpbmdDZW50cmFsRGlyID0gIlBLXDAwMVwwMDIiICAgIyBtYWdpYyBudW1iZXIgZm9yIGNlbnRyYWwgZGlyZWN0b3J5CiBzdHJ1Y3RGaWxlSGVhZGVyID0gIjw0czJCNEhsTEwySCIgICMgMTIgaXRlbXMsIGZpbGUgaGVhZGVyIHJlY29yZCwgMzAgYnl0ZXMKIHN0cmluZ0ZpbGVIZWFkZXIgPSAiUEtcMDAzXDAwNCIgICAjIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIKK3N0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IgPSAiPDRzbHFsIiAjIDQgaXRlbXMsIGxvY2F0ZSBaaXA2NCBoZWFkZXIsIDIwIGJ5dGVzCitzdHJpbmdFbmRBcmNoaXZlNjRMb2NhdG9yID0gIlBLXHgwNlx4MDciICMgbWFnaWMgdG9rZW4gZm9yIGxvY2F0b3IgaGVhZGVyCitzdHJ1Y3RFbmRBcmNoaXZlNjQgPSAiPDRzcWhobGxxcXFxIiAjIDEwIGl0ZW1zLCBlbmQgb2YgYXJjaGl2ZSAoWmlwNjQpLCA1NiBieXRlcworc3RyaW5nRW5kQXJjaGl2ZTY0ID0gIlBLXHgwNlx4MDYiICMgbWFnaWMgdG9rZW4gZm9yIFppcDY0IGhlYWRlcgorCiAKICMgaW5kZXhlcyBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKIF9DRF9TSUdOQVRVUkUgPSAwCkBAIC03NSw2ICs5MSw0MCBAQAogICAgICAgICBwYXNzCiAgICAgcmV0dXJuIEZhbHNlCiAKK2RlZiBfRW5kUmVjRGF0YTY0KGZwaW4sIG9mZnNldCwgZW5kcmVjKToKKyAgICAiIiIKKyAgICBSZWFkIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzIGFuZCB1c2UgdGhhdCB0byB1cGRhdGUgZW5kcmVjCisgICAgIiIiCisgICAgbG9jYXRvclNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvcikKKyAgICBmcGluLnNlZWsob2Zmc2V0IC0gbG9jYXRvclNpemUsIDIpCisgICAgZGF0YSA9IGZwaW4ucmVhZChsb2NhdG9yU2l6ZSkKKyAgICBzaWcsIGRpc2tubywgcmVsb2ZmLCBkaXNrcyA9IHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciwgZGF0YSkKKyAgICBpZiBzaWcgIT0gc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvcjoKKyAgICAgICAgcmV0dXJuIGVuZHJlYworCisgICAgaWYgZGlza25vICE9IDAgb3IgZGlza3MgIT0gMToKKyAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiemlwZmlsZXMgdGhhdCBzcGFuIG11bHRpcGxlIGRpc2tzIGFyZSBub3Qgc3VwcG9ydGVkIikKKworICAgICMgQXNzdW1lIG5vICd6aXA2NCBleHRlbnNpYmxlIGRhdGEnCisgICAgZW5kQXJjaGl2ZVNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0KQorICAgIGZwaW4uc2VlayhvZmZzZXQgLSBsb2NhdG9yU2l6ZSAtIGVuZEFyY2hpdmVTaXplLCAyKQorICAgIGRhdGEgPSBmcGluLnJlYWQoZW5kQXJjaGl2ZVNpemUpCisgICAgc2lnLCBzeiwgY3JlYXRlX3ZlcnNpb24sIHJlYWRfdmVyc2lvbiwgZGlza19udW0sIGRpc2tfZGlyLCBcCisgICAgICAgICAgICBkaXJjb3VudCwgZGlyY291bnQyLCBkaXJzaXplLCBkaXJvZmZzZXQgPSBcCisgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmU2NCwgZGF0YSkKKyAgICBpZiBzaWcgIT0gc3RyaW5nRW5kQXJjaGl2ZTY0OgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICAjIFVwZGF0ZSB0aGUgb3JpZ2luYWwgZW5kcmVjIHVzaW5nIGRhdGEgZnJvbSB0aGUgWklQNjQgcmVjb3JkCisgICAgZW5kcmVjWzFdID0gZGlza19udW0KKyAgICBlbmRyZWNbMl0gPSBkaXNrX2RpcgorICAgIGVuZHJlY1szXSA9IGRpcmNvdW50CisgICAgZW5kcmVjWzRdID0gZGlyY291bnQyCisgICAgZW5kcmVjWzVdID0gZGlyc2l6ZQorICAgIGVuZHJlY1s2XSA9IGRpcm9mZnNldAorICAgIHJldHVybiBlbmRyZWMKKworCiBkZWYgX0VuZFJlY0RhdGEoZnBpbik6CiAgICAgIiIiUmV0dXJuIGRhdGEgZnJvbSB0aGUgIkVuZCBvZiBDZW50cmFsIERpcmVjdG9yeSIgcmVjb3JkLCBvciBOb25lLgogCkBAIC04OCw2ICsxMzgsOCBAQAogICAgICAgICBlbmRyZWMgPSBsaXN0KGVuZHJlYykKICAgICAgICAgZW5kcmVjLmFwcGVuZCgiIikgICAgICAgICAgICAgICAjIEFwcGVuZCB0aGUgYXJjaGl2ZSBjb21tZW50CiAgICAgICAgIGVuZHJlYy5hcHBlbmQoZmlsZXNpemUgLSAyMikgICAgIyBBcHBlbmQgdGhlIHJlY29yZCBzdGFydCBvZmZzZXQKKyAgICAgICAgaWYgZW5kcmVjWy00XSA9PSAtMSBvciBlbmRyZWNbLTRdID09IDB4ZmZmZmZmZmY6CisgICAgICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCAtMjIsIGVuZHJlYykKICAgICAgICAgcmV0dXJuIGVuZHJlYwogICAgICMgU2VhcmNoIHRoZSBsYXN0IEVORF9CTE9DSyBieXRlcyBvZiB0aGUgZmlsZSBmb3IgdGhlIHJlY29yZCBzaWduYXR1cmUuCiAgICAgIyBUaGUgY29tbWVudCBpcyBhcHBlbmRlZCB0byB0aGUgWklQIGZpbGUgYW5kIGhhcyBhIDE2IGJpdCBsZW5ndGguCkBAIC0xMDYsMjUgKzE1OCw1MCBAQAogICAgICAgICAgICAgIyBBcHBlbmQgdGhlIGFyY2hpdmUgY29tbWVudCBhbmQgc3RhcnQgb2Zmc2V0CiAgICAgICAgICAgICBlbmRyZWMuYXBwZW5kKGNvbW1lbnQpCiAgICAgICAgICAgICBlbmRyZWMuYXBwZW5kKGZpbGVzaXplIC0gRU5EX0JMT0NLICsgc3RhcnQpCisgICAgICAgICAgICBpZiBlbmRyZWNbLTRdID09IC0xIG9yIGVuZHJlY1stNF0gPT0gMHhmZmZmZmZmZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCAtIEVORF9CTE9DSyArIHN0YXJ0LCBlbmRyZWMpCiAgICAgICAgICAgICByZXR1cm4gZW5kcmVjCiAgICAgcmV0dXJuICAgICAgIyBFcnJvciwgcmV0dXJuIE5vbmUKIAogCi1jbGFzcyBaaXBJbmZvOgorY2xhc3MgWmlwSW5mbyAob2JqZWN0KToKICAgICAiIiJDbGFzcyB3aXRoIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyBlYWNoIGZpbGUgaW4gdGhlIFpJUCBhcmNoaXZlLiIiIgogCisgICAgX19zbG90c19fID0gKAorICAgICAgICAgICAgJ29yaWdfZmlsZW5hbWUnLAorICAgICAgICAgICAgJ2ZpbGVuYW1lJywKKyAgICAgICAgICAgICdkYXRlX3RpbWUnLAorICAgICAgICAgICAgJ2NvbXByZXNzX3R5cGUnLAorICAgICAgICAgICAgJ2NvbW1lbnQnLAorICAgICAgICAgICAgJ2V4dHJhJywKKyAgICAgICAgICAgICdjcmVhdGVfc3lzdGVtJywKKyAgICAgICAgICAgICdjcmVhdGVfdmVyc2lvbicsCisgICAgICAgICAgICAnZXh0cmFjdF92ZXJzaW9uJywKKyAgICAgICAgICAgICdyZXNlcnZlZCcsCisgICAgICAgICAgICAnZmxhZ19iaXRzJywKKyAgICAgICAgICAgICd2b2x1bWUnLAorICAgICAgICAgICAgJ2ludGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2V4dGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2hlYWRlcl9vZmZzZXQnLAorICAgICAgICAgICAgJ0NSQycsCisgICAgICAgICAgICAnY29tcHJlc3Nfc2l6ZScsCisgICAgICAgICAgICAnZmlsZV9zaXplJywKKyAgICAgICAgKQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPSJOb05hbWUiLCBkYXRlX3RpbWU9KDE5ODAsMSwxLDAsMCwwKSk6CiAgICAgICAgIHNlbGYub3JpZ19maWxlbmFtZSA9IGZpbGVuYW1lICAgIyBPcmlnaW5hbCBmaWxlIG5hbWUgaW4gYXJjaGl2ZQotIyBUZXJtaW5hdGUgdGhlIGZpbGUgbmFtZSBhdCB0aGUgZmlyc3QgbnVsbCBieXRlLiAgTnVsbCBieXRlcyBpbiBmaWxlCi0jIG5hbWVzIGFyZSB1c2VkIGFzIHRyaWNrcyBieSB2aXJ1c2VzIGluIGFyY2hpdmVzLgorCisgICAgICAgICMgVGVybWluYXRlIHRoZSBmaWxlIG5hbWUgYXQgdGhlIGZpcnN0IG51bGwgYnl0ZS4gIE51bGwgYnl0ZXMgaW4gZmlsZQorICAgICAgICAjIG5hbWVzIGFyZSB1c2VkIGFzIHRyaWNrcyBieSB2aXJ1c2VzIGluIGFyY2hpdmVzLgogICAgICAgICBudWxsX2J5dGUgPSBmaWxlbmFtZS5maW5kKGNocigwKSkKICAgICAgICAgaWYgbnVsbF9ieXRlID49IDA6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzA6bnVsbF9ieXRlXQotIyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHBhdGhzIGluIGdlbmVyYXRlZCBaSVAgZmlsZXMgYWx3YXlzIHVzZQotIyBmb3J3YXJkIHNsYXNoZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFzIHJlcXVpcmVkIGJ5IHRoZQotIyBaSVAgZm9ybWF0IHNwZWNpZmljYXRpb24uCi0gICAgICAgIGlmIG9zLnNlcCAhPSAiLyI6CisgICAgICAgICMgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSBwYXRocyBpbiBnZW5lcmF0ZWQgWklQIGZpbGVzIGFsd2F5cyB1c2UKKyAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAjIFpJUCBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgaWYgb3Muc2VwICE9ICIvIiBhbmQgb3Muc2VwIGluIGZpbGVuYW1lOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQorCiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZSAgICAgICAgIyBOb3JtYWxpemVkIGZpbGUgbmFtZQogICAgICAgICBzZWxmLmRhdGVfdGltZSA9IGRhdGVfdGltZSAgICAgICMgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMKICAgICAgICAgIyBTdGFuZGFyZCB2YWx1ZXM6CkBAIC0xNDUsNyArMjIyLDYgQEAKICAgICAgICAgc2VsZi5leHRlcm5hbF9hdHRyID0gMCAgICAgICAgICAjIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwogICAgICAgICAjIE90aGVyIGF0dHJpYnV0ZXMgYXJlIHNldCBieSBjbGFzcyBaaXBGaWxlOgogICAgICAgICAjIGhlYWRlcl9vZmZzZXQgICAgICAgICBCeXRlIG9mZnNldCB0byB0aGUgZmlsZSBoZWFkZXIKLSAgICAgICAgIyBmaWxlX29mZnNldCAgICAgICAgICAgQnl0ZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGRhdGEKICAgICAgICAgIyBDUkMgICAgICAgICAgICAgICAgICAgQ1JDLTMyIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZQogICAgICAgICAjIGNvbXByZXNzX3NpemUgICAgICAgICBTaXplIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUKICAgICAgICAgIyBmaWxlX3NpemUgICAgICAgICAgICAgU2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUKQEAgLTE2MiwyOSArMjM4LDg1IEBACiAgICAgICAgICAgICBDUkMgPSBzZWxmLkNSQwogICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IHNlbGYuY29tcHJlc3Nfc2l6ZQogICAgICAgICAgICAgZmlsZV9zaXplID0gc2VsZi5maWxlX3NpemUKKworICAgICAgICBleHRyYSA9IHNlbGYuZXh0cmEKKworICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAjIEZpbGUgaXMgbGFyZ2VyIHRoYW4gd2hhdCBmaXRzIGludG8gYSA0IGJ5dGUgaW50ZWdlciwKKyAgICAgICAgICAgICMgZmFsbCBiYWNrIHRvIHRoZSBaSVA2NCBleHRlbnNpb24KKyAgICAgICAgICAgIGZtdCA9ICc8aGhxcScKKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmEgKyBzdHJ1Y3QucGFjayhmbXQsCisgICAgICAgICAgICAgICAgICAgIDEsIHN0cnVjdC5jYWxjc2l6ZShmbXQpLTQsIGZpbGVfc2l6ZSwgY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IDB4ZmZmZmZmZmYgIyAtMQorICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYgIyAtMQorICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHNlbGYuZXh0cmFjdF92ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVfdmVyc2lvbiA9IG1heCg0NSwgc2VsZi5leHRyYWN0X3ZlcnNpb24pCisKICAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soc3RydWN0RmlsZUhlYWRlciwgc3RyaW5nRmlsZUhlYWRlciwKICAgICAgICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24sIHNlbGYucmVzZXJ2ZWQsIHNlbGYuZmxhZ19iaXRzLAogICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsIENSQywKICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICBsZW4oc2VsZi5maWxlbmFtZSksIGxlbihzZWxmLmV4dHJhKSkKLSAgICAgICAgcmV0dXJuIGhlYWRlciArIHNlbGYuZmlsZW5hbWUgKyBzZWxmLmV4dHJhCisgICAgICAgICAgICAgICAgIGxlbihzZWxmLmZpbGVuYW1lKSwgbGVuKGV4dHJhKSkKKyAgICAgICAgcmV0dXJuIGhlYWRlciArIHNlbGYuZmlsZW5hbWUgKyBleHRyYQorCisgICAgZGVmIF9kZWNvZGVFeHRyYShzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gZGVjb2RlIHRoZSBleHRyYSBmaWVsZC4KKyAgICAgICAgZXh0cmEgPSBzZWxmLmV4dHJhCisgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2sKKyAgICAgICAgd2hpbGUgZXh0cmE6CisgICAgICAgICAgICB0cCwgbG4gPSB1bnBhY2soJzxoaCcsIGV4dHJhWzo0XSkKKyAgICAgICAgICAgIGlmIHRwID09IDE6CisgICAgICAgICAgICAgICAgaWYgbG4gPj0gMjQ6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPHFxcScsIGV4dHJhWzQ6MjhdKQorICAgICAgICAgICAgICAgIGVsaWYgbG4gPT0gMTY6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPHFxJywgZXh0cmFbNDoyMF0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSA4OgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSB1bnBhY2soJzxxJywgZXh0cmFbNDoxMl0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSAoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNvcnJ1cHQgZXh0cmEgZmllbGQgJXMiJShsbiwpCisKKyAgICAgICAgICAgICAgICBpZHggPSAwCisKKyAgICAgICAgICAgICAgICAjIFpJUDY0IGV4dGVuc2lvbiAobGFyZ2UgZmlsZXMgYW5kL29yIGxhcmdlIGFyY2hpdmVzKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZV9zaXplID09IC0xIG9yIHNlbGYuZmlsZV9zaXplID09IDB4RkZGRkZGRkZMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfc2l6ZSA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCArPSAxCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbXByZXNzX3NpemUgPT0gLTEgb3Igc2VsZi5jb21wcmVzc19zaXplID09IDB4RkZGRkZGRkZMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3NpemUgPSBjb3VudHNbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZHggKz0gMQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJfb2Zmc2V0ID09IC0xIG9yIHNlbGYuaGVhZGVyX29mZnNldCA9PSAweGZmZmZmZmZmTDoKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gc2VsZi5oZWFkZXJfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyX29mZnNldCA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCs9MQorCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhW2xuKzQ6XQogCiAKIGNsYXNzIFppcEZpbGU6CiAgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgogCi0gICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQpCisgICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQsIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICAgIGZpbGU6IEVpdGhlciB0aGUgcGF0aCB0byB0aGUgZmlsZSwgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgIElmIGl0IGlzIGEgcGF0aCwgdGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQgYW5kIGNsb3NlZCBieSBaaXBGaWxlLgogICAgIG1vZGU6IFRoZSBtb2RlIGNhbiBiZSBlaXRoZXIgcmVhZCAiciIsIHdyaXRlICJ3IiBvciBhcHBlbmQgImEiLgogICAgIGNvbXByZXNzaW9uOiBaSVBfU1RPUkVEIChubyBjb21wcmVzc2lvbikgb3IgWklQX0RFRkxBVEVEIChyZXF1aXJlcyB6bGliKS4KKyAgICBhbGxvd1ppcDY0OiBpZiBUcnVlIFppcEZpbGUgd2lsbCBjcmVhdGUgZmlsZXMgd2l0aCBaSVA2NCBleHRlbnNpb25zIHdoZW4KKyAgICAgICAgICAgICAgICBuZWVkZWQsIG90aGVyd2lzZSBpdCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoaXMgd291bGQKKyAgICAgICAgICAgICAgICBiZSBuZWNlc3NhcnkuCisKICAgICAiIiIKIAogICAgIGZwID0gTm9uZSAgICAgICAgICAgICAgICAgICAjIFNldCBoZXJlIHNpbmNlIF9fZGVsX18gY2hlY2tzIGl0CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCwgYWxsb3daaXA2ND1GYWxzZSk6CiAgICAgICAgICIiIk9wZW4gdGhlIFpJUCBmaWxlIHdpdGggbW9kZSByZWFkICJyIiwgd3JpdGUgInciIG9yIGFwcGVuZCAiYSIuIiIiCisgICAgICAgIHNlbGYuX2FsbG93WmlwNjQgPSBhbGxvd1ppcDY0CisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IEZhbHNlCiAgICAgICAgIGlmIGNvbXByZXNzaW9uID09IFpJUF9TVE9SRUQ6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsaWYgY29tcHJlc3Npb24gPT0gWklQX0RFRkxBVEVEOgpAQCAtMjUwLDcgKzM4MiwxMCBAQAogICAgICAgICBvZmZzZXRfY2QgPSBlbmRyZWNbNl0gICAjIG9mZnNldCBvZiBjZW50cmFsIGRpcmVjdG9yeQogICAgICAgICBzZWxmLmNvbW1lbnQgPSBlbmRyZWNbOF0gICAgICAgICMgYXJjaGl2ZSBjb21tZW50CiAgICAgICAgICMgZW5kcmVjWzldIGlzIHRoZSBvZmZzZXQgb2YgdGhlICJFbmQgb2YgQ2VudHJhbCBEaXIiIHJlY29yZAotICAgICAgICB4ID0gZW5kcmVjWzldIC0gc2l6ZV9jZAorICAgICAgICBpZiBlbmRyZWNbOV0gPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgIHggPSBlbmRyZWNbOV0gLSBzaXplX2NkIC0gNTYgLSAyMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IGVuZHJlY1s5XSAtIHNpemVfY2QKICAgICAgICAgIyAiY29uY2F0IiBpcyB6ZXJvLCB1bmxlc3MgemlwIHdhcyBjb25jYXRlbmF0ZWQgdG8gYW5vdGhlciBmaWxlCiAgICAgICAgIGNvbmNhdCA9IHggLSBvZmZzZXRfY2QKICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+IDI6CkBAIC0yNTgsNiArMzkzLDggQEAKICAgICAgICAgIyBzZWxmLnN0YXJ0X2RpcjogIFBvc2l0aW9uIG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CiAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gb2Zmc2V0X2NkICsgY29uY2F0CiAgICAgICAgIGZwLnNlZWsoc2VsZi5zdGFydF9kaXIsIDApCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKHNpemVfY2QpCisgICAgICAgIGZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCiAgICAgICAgIHRvdGFsID0gMAogICAgICAgICB3aGlsZSB0b3RhbCA8IHNpemVfY2Q6CiAgICAgICAgICAgICBjZW50ZGlyID0gZnAucmVhZCg0NikKQEAgLTI3NSw4ICs0MTIsNyBAQAogICAgICAgICAgICAgdG90YWwgPSAodG90YWwgKyBjZW50ZGlyW19DRF9GSUxFTkFNRV9MRU5HVEhdCiAgICAgICAgICAgICAgICAgICAgICArIGNlbnRkaXJbX0NEX0VYVFJBX0ZJRUxEX0xFTkdUSF0KICAgICAgICAgICAgICAgICAgICAgICsgY2VudGRpcltfQ0RfQ09NTUVOVF9MRU5HVEhdKQotICAgICAgICAgICAgeC5oZWFkZXJfb2Zmc2V0ID0gY2VudGRpcltfQ0RfTE9DQUxfSEVBREVSX09GRlNFVF0gKyBjb25jYXQKLSAgICAgICAgICAgICMgZmlsZV9vZmZzZXQgbXVzdCBiZSBjb21wdXRlZCBiZWxvdy4uLgorICAgICAgICAgICAgeC5oZWFkZXJfb2Zmc2V0ID0gY2VudGRpcltfQ0RfTE9DQUxfSEVBREVSX09GRlNFVF0KICAgICAgICAgICAgICh4LmNyZWF0ZV92ZXJzaW9uLCB4LmNyZWF0ZV9zeXN0ZW0sIHguZXh0cmFjdF92ZXJzaW9uLCB4LnJlc2VydmVkLAogICAgICAgICAgICAgICAgIHguZmxhZ19iaXRzLCB4LmNvbXByZXNzX3R5cGUsIHQsIGQsCiAgICAgICAgICAgICAgICAgeC5DUkMsIHguY29tcHJlc3Nfc2l6ZSwgeC5maWxlX3NpemUpID0gY2VudGRpclsxOjEyXQpAQCAtMjg0LDI4ICs0MjAsMTQgQEAKICAgICAgICAgICAgICMgQ29udmVydCBkYXRlL3RpbWUgY29kZSB0byAoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpCiAgICAgICAgICAgICB4LmRhdGVfdGltZSA9ICggKGQ+PjkpKzE5ODAsIChkPj41KSYweEYsIGQmMHgxRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Pj4xMSwgKHQ+PjUpJjB4M0YsICh0JjB4MUYpICogMiApCisKKyAgICAgICAgICAgIHguX2RlY29kZUV4dHJhKCkKKyAgICAgICAgICAgIHguaGVhZGVyX29mZnNldCA9IHguaGVhZGVyX29mZnNldCArIGNvbmNhdAogICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoeCkKICAgICAgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t4LmZpbGVuYW1lXSA9IHgKICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPiAyOgogICAgICAgICAgICAgICAgIHByaW50ICJ0b3RhbCIsIHRvdGFsCi0gICAgICAgIGZvciBkYXRhIGluIHNlbGYuZmlsZWxpc3Q6Ci0gICAgICAgICAgICBmcC5zZWVrKGRhdGEuaGVhZGVyX29mZnNldCwgMCkKLSAgICAgICAgICAgIGZoZWFkZXIgPSBmcC5yZWFkKDMwKQotICAgICAgICAgICAgaWYgZmhlYWRlclswOjRdICE9IHN0cmluZ0ZpbGVIZWFkZXI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgIkJhZCBtYWdpYyBudW1iZXIgZm9yIGZpbGUgaGVhZGVyIgotICAgICAgICAgICAgZmhlYWRlciA9IHN0cnVjdC51bnBhY2soc3RydWN0RmlsZUhlYWRlciwgZmhlYWRlcikKLSAgICAgICAgICAgICMgZmlsZV9vZmZzZXQgaXMgY29tcHV0ZWQgaGVyZSwgc2luY2UgdGhlIGV4dHJhIGZpZWxkIGZvcgotICAgICAgICAgICAgIyB0aGUgY2VudHJhbCBkaXJlY3RvcnkgYW5kIGZvciB0aGUgbG9jYWwgZmlsZSBoZWFkZXIKLSAgICAgICAgICAgICMgcmVmZXIgdG8gZGlmZmVyZW50IGZpZWxkcywgYW5kIHRoZXkgY2FuIGhhdmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAjIGxlbmd0aHMKLSAgICAgICAgICAgIGRhdGEuZmlsZV9vZmZzZXQgPSAoZGF0YS5oZWFkZXJfb2Zmc2V0ICsgMzAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaGVhZGVyW19GSF9GSUxFTkFNRV9MRU5HVEhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKLSAgICAgICAgICAgIGZuYW1lID0gZnAucmVhZChmaGVhZGVyW19GSF9GSUxFTkFNRV9MRU5HVEhdKQotICAgICAgICAgICAgaWYgZm5hbWUgIT0gZGF0YS5vcmlnX2ZpbGVuYW1lOgotICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAotICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm9yaWdfZmlsZW5hbWUsIGZuYW1lKQorCiAKICAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4iIiIKQEAgLTMzNCw2ICs0NTYsNyBAQAogICAgICAgICAgICAgZXhjZXB0IEJhZFppcGZpbGU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHppbmZvLmZpbGVuYW1lCiAKKwogICAgIGRlZiBnZXRpbmZvKHNlbGYsIG5hbWUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGluc3RhbmNlIG9mIFppcEluZm8gZ2l2ZW4gJ25hbWUnLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5OYW1lVG9JbmZvW25hbWVdCkBAIC0zNDcsNyArNDcwLDI0IEBACiAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byByZWFkIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIgogICAgICAgICB6aW5mbyA9IHNlbGYuZ2V0aW5mbyhuYW1lKQogICAgICAgICBmaWxlcG9zID0gc2VsZi5mcC50ZWxsKCkKLSAgICAgICAgc2VsZi5mcC5zZWVrKHppbmZvLmZpbGVfb2Zmc2V0LCAwKQorCisgICAgICAgIHNlbGYuZnAuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQorCisgICAgICAgICMgU2tpcCB0aGUgZmlsZSBoZWFkZXI6CisgICAgICAgIGZoZWFkZXIgPSBzZWxmLmZwLnJlYWQoMzApCisgICAgICAgIGlmIGZoZWFkZXJbMDo0XSAhPSBzdHJpbmdGaWxlSGVhZGVyOgorICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgIkJhZCBtYWdpYyBudW1iZXIgZm9yIGZpbGUgaGVhZGVyIgorCisgICAgICAgIGZoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEZpbGVIZWFkZXIsIGZoZWFkZXIpCisgICAgICAgIGZuYW1lID0gc2VsZi5mcC5yZWFkKGZoZWFkZXJbX0ZIX0ZJTEVOQU1FX0xFTkdUSF0pCisgICAgICAgIGlmIGZoZWFkZXJbX0ZIX0VYVFJBX0ZJRUxEX0xFTkdUSF06CisgICAgICAgICAgICBzZWxmLmZwLnJlYWQoZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKKworICAgICAgICBpZiBmbmFtZSAhPSB6aW5mby5vcmlnX2ZpbGVuYW1lOgorICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5vcmlnX2ZpbGVuYW1lLCBmbmFtZSkKKwogICAgICAgICBieXRlcyA9IHNlbGYuZnAucmVhZCh6aW5mby5jb21wcmVzc19zaXplKQogICAgICAgICBzZWxmLmZwLnNlZWsoZmlsZXBvcywgMCkKICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfU1RPUkVEOgpAQCAtMzg4LDYgKzUyOCwxMiBAQAogICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlIG5vdCBpbiAoWklQX1NUT1JFRCwgWklQX0RFRkxBVEVEKToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAogICAgICAgICAgICAgICAgICAgIlRoYXQgY29tcHJlc3Npb24gbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQiCisgICAgICAgIGlmIHppbmZvLmZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQorICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIlppcGZpbGUgc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUsIGNvbXByZXNzX3R5cGU9Tm9uZSk6CiAgICAgICAgICIiIlB1dCB0aGUgYnl0ZXMgZnJvbSBmaWxlbmFtZSBpbnRvIHRoZSBhcmNoaXZlIHVuZGVyIHRoZSBuYW1lCkBAIC00MDcsMTYgKzU1MywxOSBAQAogICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCi0gICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgInJiIikKKworICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCiAgICAgICAgIHppbmZvLmZsYWdfYml0cyA9IDB4MDAKICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJyYiIpCiAgICAgICAgICMgTXVzdCBvdmVyd3JpdGUgQ1JDIGFuZCBzaXplcyB3aXRoIGNvcnJlY3QgZGF0YSBsYXRlcgogICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCiAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplID0gMAogICAgICAgICB6aW5mby5maWxlX3NpemUgPSBmaWxlX3NpemUgPSAwCiAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcigpKQotICAgICAgICB6aW5mby5maWxlX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICAgIyBTdGFydCBvZiBmaWxlIGJ5dGVzCiAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgogICAgICAgICAgICAgY21wciA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0RFRkFVTFRfQ09NUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgIHpsaWIuREVGTEFURUQsIC0xNSkKQEAgLTQ2MSw4ICs2MTAsMTAgQEAKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB6aW5mbyA9IHppbmZvX29yX2FyY25hbWUKLSAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKICAgICAgICAgemluZm8uZmlsZV9zaXplID0gbGVuKGJ5dGVzKSAgICAgICAgICAgICMgVW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKICAgICAgICAgemluZm8uQ1JDID0gYmluYXNjaWkuY3JjMzIoYnl0ZXMpICAgICAgICMgQ1JDLTMyIGNoZWNrc3VtCiAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgogICAgICAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9ERUZBVUxUX0NPTVBSRVNTSU9OLApAQCAtNDczLDggKzYyNCw4IEBACiAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gemluZm8uZmlsZV9zaXplCiAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBieXRlcwogICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoKSkKLSAgICAgICAgemluZm8uZmlsZV9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAgICMgU3RhcnQgb2YgZmlsZSBieXRlcwogICAgICAgICBzZWxmLmZwLndyaXRlKGJ5dGVzKQorICAgICAgICBzZWxmLmZwLmZsdXNoKCkKICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHgwODoKICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoc3RydWN0LnBhY2soIjxsTEwiLCB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsCkBAIC00OTEsNyArNjQyLDggQEAKICAgICAgICAgcmVjb3Jkcy4iIiIKICAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYubW9kZSBpbiAoInciLCAiYSIpOiAgICAgICAgICAgICAjIHdyaXRlIGVuZGluZyByZWNvcmRzCisKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICgidyIsICJhIikgYW5kIHNlbGYuX2RpZE1vZGlmeTogIyB3cml0ZSBlbmRpbmcgcmVjb3JkcwogICAgICAgICAgICAgY291bnQgPSAwCiAgICAgICAgICAgICBwb3MxID0gc2VsZi5mcC50ZWxsKCkKICAgICAgICAgICAgIGZvciB6aW5mbyBpbiBzZWxmLmZpbGVsaXN0OiAgICAgICAgICMgd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkKQEAgLTQ5OSwyMyArNjUxLDczIEBACiAgICAgICAgICAgICAgICAgZHQgPSB6aW5mby5kYXRlX3RpbWUKICAgICAgICAgICAgICAgICBkb3NkYXRlID0gKGR0WzBdIC0gMTk4MCkgPDwgOSB8IGR0WzFdIDw8IDUgfCBkdFsyXQogICAgICAgICAgICAgICAgIGRvc3RpbWUgPSBkdFszXSA8PCAxMSB8IGR0WzRdIDw8IDUgfCAoZHRbNV0gLy8gMikKKyAgICAgICAgICAgICAgICBleHRyYSA9IFtdCisgICAgICAgICAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3IgemluZm8uY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uZmlsZV9zaXplKQorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZiAjLTEKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYgIy0xCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gemluZm8uZmlsZV9zaXplCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSB6aW5mby5jb21wcmVzc19zaXplCisKKyAgICAgICAgICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5oZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0ID0gLTEgICMgc3RydWN0ICJsIiBmb3JtYXQ6ICAzMiBvbmUgYml0cworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQgPSB6aW5mby5oZWFkZXJfb2Zmc2V0CisKKyAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gemluZm8uZXh0cmEKKyAgICAgICAgICAgICAgICBpZiBleHRyYToKKyAgICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgYSBaSVA2NCBmaWVsZCB0byB0aGUgZXh0cmEncworICAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxoaCcgKyAncScqbGVuKGV4dHJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA4KmxlbihleHRyYSksICpleHRyYSkgKyBleHRyYV9kYXRhCisKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5leHRyYWN0X3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5jcmVhdGVfdmVyc2lvbikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSB6aW5mby5leHRyYWN0X3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3ZlcnNpb24gPSB6aW5mby5jcmVhdGVfdmVyc2lvbgorCiAgICAgICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC5wYWNrKHN0cnVjdENlbnRyYWxEaXIsCi0gICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCB6aW5mby5jcmVhdGVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIHppbmZvLmV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCiAgICAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCi0gICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsIHppbmZvLmZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGxlbih6aW5mby5maWxlbmFtZSksIGxlbih6aW5mby5leHRyYSksIGxlbih6aW5mby5jb21tZW50KSwKKyAgICAgICAgICAgICAgICAgIHppbmZvLkNSQywgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgbGVuKHppbmZvLmZpbGVuYW1lKSwgbGVuKGV4dHJhX2RhdGEpLCBsZW4oemluZm8uY29tbWVudCksCiAgICAgICAgICAgICAgICAgICAwLCB6aW5mby5pbnRlcm5hbF9hdHRyLCB6aW5mby5leHRlcm5hbF9hdHRyLAotICAgICAgICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShjZW50ZGlyKQogICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5leHRyYSkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGV4dHJhX2RhdGEpCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5jb21tZW50KQorCiAgICAgICAgICAgICBwb3MyID0gc2VsZi5mcC50ZWxsKCkKICAgICAgICAgICAgICMgV3JpdGUgZW5kLW9mLXppcC1hcmNoaXZlIHJlY29yZAotICAgICAgICAgICAgZW5kcmVjID0gc3RydWN0LnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgc3RyaW5nRW5kQXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGNvdW50LCBjb3VudCwgcG9zMiAtIHBvczEsIHBvczEsIDApCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKGVuZHJlYykKKyAgICAgICAgICAgIGlmIHBvczEgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAjIE5lZWQgdG8gd3JpdGUgdGhlIFpJUDY0IGVuZC1vZi1hcmNoaXZlIHJlY29yZHMKKyAgICAgICAgICAgICAgICB6aXA2NGVuZHJlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0LCBzdHJpbmdFbmRBcmNoaXZlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICA0NCwgNDUsIDQ1LCAwLCAwLCBjb3VudCwgY291bnQsIHBvczIgLSBwb3MxLCBwb3MxKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemlwNjRlbmRyZWMpCisKKyAgICAgICAgICAgICAgICB6aXA2NGxvY3JlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3IsIDAsIHBvczIsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGxvY3JlYykKKworICAgICAgICAgICAgICAgICMgWFhYIFdoeSBpcyBgcG9zM2AgY29tcHV0ZWQgbmV4dD8gIEl0J3MgbmV2ZXIgcmVmZXJlbmNlZC4KKyAgICAgICAgICAgICAgICBwb3MzID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgICAgICBlbmRyZWMgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCBzdHJpbmdFbmRBcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGNvdW50LCBjb3VudCwgcG9zMiAtIHBvczEsIC0xLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZW5kcmVjKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgY291bnQsIGNvdW50LCBwb3MyIC0gcG9zMSwgcG9zMSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGVuZHJlYykKICAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQogICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZVBhc3NlZDoKICAgICAgICAgICAgIHNlbGYuZnAuY2xvc2UoKQpAQCAtNjE5LDMgKzgyMSw4MCBAQAogICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgIGFyY2hpdmVuYW1lID0gIiVzLyVzIiAlIChiYXNlbmFtZSwgYXJjaGl2ZW5hbWUpCiAgICAgICAgIHJldHVybiAoZm5hbWUsIGFyY2hpdmVuYW1lKQorCisKK2RlZiBtYWluKGFyZ3MgPSBOb25lKToKKyAgICBpbXBvcnQgdGV4dHdyYXAKKyAgICBVU0FHRT10ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgIHppcGZpbGUucHkgLWwgemlwZmlsZS56aXAgICAgICAgICMgU2hvdyBsaXN0aW5nIG9mIGEgemlwZmlsZQorICAgICAgICAgICAgemlwZmlsZS5weSAtdCB6aXBmaWxlLnppcCAgICAgICAgIyBUZXN0IGlmIGEgemlwZmlsZSBpcyB2YWxpZAorICAgICAgICAgICAgemlwZmlsZS5weSAtZSB6aXBmaWxlLnppcCB0YXJnZXQgIyBFeHRyYWN0IHppcGZpbGUgaW50byB0YXJnZXQgZGlyCisgICAgICAgICAgICB6aXBmaWxlLnB5IC1jIHppcGZpbGUuemlwIHNyYyAuLi4gIyBDcmVhdGUgemlwZmlsZSBmcm9tIHNvdXJjZXMKKyAgICAgICAgIiIiKQorICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgaWYgbm90IGFyZ3Mgb3IgYXJnc1swXSBub3QgaW4gKCctbCcsICctYycsICctZScsICctdCcpOgorICAgICAgICBwcmludCBVU0FHRQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaWYgYXJnc1swXSA9PSAnLWwnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICB6ZiA9IFppcEZpbGUoYXJnc1sxXSwgJ3InKQorICAgICAgICB6Zi5wcmludGRpcigpCisgICAgICAgIHpmLmNsb3NlKCkKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLXQnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICB6ZiA9IFppcEZpbGUoYXJnc1sxXSwgJ3InKQorICAgICAgICB6Zi50ZXN0emlwKCkKKyAgICAgICAgcHJpbnQgIkRvbmUgdGVzdGluZyIKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLWUnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAncicpCisgICAgICAgIG91dCA9IGFyZ3NbMl0KKyAgICAgICAgZm9yIHBhdGggaW4gemYubmFtZWxpc3QoKToKKyAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLi8nKToKKyAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoWzI6XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGd0ID0gb3MucGF0aC5qb2luKG91dCwgcGF0aCkKKworICAgICAgICAgICAgdGd0ZGlyID0gb3MucGF0aC5kaXJuYW1lKHRndCkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0Z3RkaXIpOgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHRndGRpcikKKyAgICAgICAgICAgIGZwID0gb3Blbih0Z3QsICd3YicpCisgICAgICAgICAgICBmcC53cml0ZSh6Zi5yZWFkKHBhdGgpKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICB6Zi5jbG9zZSgpCisKKyAgICBlbGlmIGFyZ3NbMF0gPT0gJy1jJzoKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIGRlZiBhZGRUb1ppcCh6ZiwgcGF0aCwgemlwcGF0aCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICB6Zi53cml0ZShwYXRoLCB6aXBwYXRoLCBaSVBfREVGTEFURUQpCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIG5tIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGFkZFRvWmlwKHpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwYXRoLCBubSksIG9zLnBhdGguam9pbih6aXBwYXRoLCBubSkpCisgICAgICAgICAgICAjIGVsc2U6IGlnbm9yZQorCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAndycsIGFsbG93WmlwNjQ9VHJ1ZSkKKyAgICAgICAgZm9yIHNyYyBpbiBhcmdzWzI6XToKKyAgICAgICAgICAgIGFkZFRvWmlwKHpmLCBzcmMsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKKworICAgICAgICB6Zi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dCBiL01hYy9CdWlsZFNjcmlwdC9SRUFETUUudHh0CmluZGV4IGM1NTZkZTgzLi40MWRmMGU0IDEwMDY0NAotLS0gYS9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dAorKysgYi9NYWMvQnVpbGRTY3JpcHQvUkVBRE1FLnR4dApAQCAtOCwxNSArOCw0NyBAQAogYW4gSW5zdGFsbGVyIHBhY2thZ2UgZnJvbSB0aGUgaW5zdGFsbGF0aW9uIHBsdXMgb3RoZXIgZmlsZXMgaW4gYGByZXNvdXJjZXNgYCAKIGFuZCBgYHNjcmlwdHNgYCBhbmQgcGxhY2VkIHRoYXQgb24gYSBgYC5kbWdgYCBkaXNrIGltYWdlLgogCi1IZXJlIGFyZSB0aGUgc3RlcHMgeW91IG5lZCB0byBmb2xsb3cgdG8gYnVpbGQgYSBNYWNQeXRob24gaW5zdGFsbGVyOgorUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLQogCi0tIFJ1biBgYC4vYnVpbGQtaW5zdGFsbGVyLnB5YGAuIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgbnVtYmVyIG9mIGFyZ3VtZW50cwotICB0byBzcGVjaWZ5IGxvY2F0aW9ucyBvZiB2YXJpb3VzIGZpbGVzLiBQbGVhc2Ugc2VlIHRoZSB0b3Agb2YKKyogQSBNYWNPUyBYIDEwLjQgKG9yIGxhdGVyKQorCisqIFhDb2RlIDIuMiAob3IgbGF0ZXIpLCB3aXRoIHRoZSB1bml2ZXJzYWwgU0RLCisKKyogTm8gRmluayAoaW4gYGAvc3dgYCkgb3IgRGFyd2luUG9ydHMgKGluIGBgL29wdC9sb2NhbGBgKSwgdGhvc2UgY291bGQKKyAgaW50ZXJmZXJlIHdpdGggdGhlIGJ1aWxkLgorCisqIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcmVsZWFzZSBtdXN0IGJlIGF2YWlsYWJsZSBvbiBweXRob24ub3JnCisgIGJlY2F1c2UgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGluc3RhbGxlci4KKworCitUaGUgUmVjaXBlCistLS0tLS0tLS0tCisKK0hlcmUgYXJlIHRoZSBzdGVwcyB5b3UgbmVlZCB0byBmb2xsb3cgdG8gYnVpbGQgYSBNYWNQeXRob24gaW5zdGFsbGVyOgorCisqICBSdW4gYGAuL2J1aWxkLWluc3RhbGxlci5weWBgLiBPcHRpb25hbGx5IHlvdSBjYW4gcGFzcyBhIG51bWJlciBvZiBhcmd1bWVudHMKKyAgIHRvIHNwZWNpZnkgbG9jYXRpb25zIG9mIHZhcmlvdXMgZmlsZXMuIFBsZWFzZSBzZWUgdGhlIHRvcCBvZgogICBgYGJ1aWxkLWluc3RhbGxlci5weWBgIGZvciBpdHMgdXNhZ2UuCi0tIFdoZW4gZG9uZSB0aGUgc2NyaXB0IHdpbGwgdGVsbCB5b3Ugd2hlcmUgdGhlIERNRyBpbWFnZSBpcy4KIAotVGhlIHNjcmlwdCBuZWVkcyB0byBiZSBydW4gb24gTWFjIE9TIFggMTAuNCB3aXRoIFhjb2RlIDIuMiBvciBsYXRlciBhbmQKLXRoZSAxMC40dSBTREsuCisgIFJ1bm5pbmcgdGhpcyBzY3JpcHQgdGFrZXMgc29tZSB0aW1lLCBJIHdpbGwgbm90IG9ubHkgYnVpbGQgUHl0aG9uIGl0c2VsZgorICBidXQgYWxzbyBzb21lIDN0aC1wYXJ0eSBsaWJyYXJpZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBleHRlbnNpb25zLgorCisqIFdoZW4gZG9uZSB0aGUgc2NyaXB0IHdpbGwgdGVsbCB5b3Ugd2hlcmUgdGhlIERNRyBpbWFnZSBpcyAoYnkgZGVmYXVsdAorICBzb21ld2hlcmUgaW4gYGAvdG1wL19weWBgKS4KKworVGVzdGluZworLS0tLS0tLQorCitUaGUgcmVzdWx0aW5nIGJpbmFyaWVzIHNob3VsZCB3b3JrIG9uIE1hY09TWCAxMC4zLjkgb3IgbGF0ZXIuIEkgdXN1YWxseSBydW4KK3RoZSBpbnN0YWxsZXIgb24gYSAxMC4zLjksIGEgMTAuNC54IFBQQyBhbmQgYSAxMC40LnggSW50ZWwgc3lzdGVtIGFuZCB0aGVuCitydW4gdGhlIHRlc3RzdWl0ZSB0byBtYWtlIHN1cmUuCisKKworQW5ub3VuY2VtZW50cworLS0tLS0tLS0tLS0tLQorCisoVGhpcyBpcyBtb3N0bHkgb2YgaGlzdG9yaWMgaW50ZXJlc3QpCiAKIFdoZW4gYWxsIGlzIGRvbmUsIGFubm91bmNlbWVudHMgY2FuIGJlIHBvc3RlZCB0byBhdCBsZWFzdCB0aGUgZm9sbG93aW5nCiBwbGFjZXM6CmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5IGIvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQppbmRleCAwNWFmZTk4Li4wODMyMDliIDEwMDc1NQotLS0gYS9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CisrKyBiL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKQEAgLTY3LDYgKzY3LDggQEAKIFNES1BBVEg9Ii9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsiCiAjU0RLUEFUSD0iLyIKIAorQVJDSExJU1Q9KCdpMzg2JywgJ3BwYycsKQorCiAjIFNvdXJjZSBkaXJlY3RvcnkgKGFzdW1lIHdlJ3JlIGluIE1hYy9CdWlsZFNjcmlwdCkKIFNSQ0RJUj1vcy5wYXRoLmRpcm5hbWUoCiAgICAgICAgIG9zLnBhdGguZGlybmFtZSgKQEAgLTkxLDYgKzkzLDI2IEBACiAjIGJhdHRlcmllcyBpbmNsdWRlZCBweXRob24uCiBMSUJSQVJZX1JFQ0lQRVM9WwogICAgIGRpY3QoCisgICAgICAgIG5hbWU9IkJ6aXAyIDEuMC4zIiwKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3LmJ6aXAub3JnLzEuMC4zL2J6aXAyLTEuMC4zLnRhci5neiIsCisgICAgICAgIGNvbmZpZ3VyZT1Ob25lLAorICAgICAgICBpbnN0YWxsPSdtYWtlIGluc3RhbGwgUFJFRklYPSVzL3Vzci9sb2NhbC8gQ0ZMQUdTPSItYXJjaCAlcyAtaXN5c3Jvb3QgJXMiJyUoCisgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAorICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oQVJDSExJU1QpLAorICAgICAgICAgICAgU0RLUEFUSCwKKyAgICAgICAgKSwKKyAgICApLAorICAgIGRpY3QoCisgICAgICAgIG5hbWU9IlpMaWIgMS4yLjMiLAorICAgICAgICB1cmw9Imh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliLTEuMi4zLnRhci5neiIsCisgICAgICAgIGNvbmZpZ3VyZT1Ob25lLAorICAgICAgICBpbnN0YWxsPSdtYWtlIGluc3RhbGwgcHJlZml4PSVzL3Vzci9sb2NhbC8gQ0ZMQUdTPSItYXJjaCAlcyAtaXN5c3Jvb3QgJXMiJyUoCisgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAorICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oQVJDSExJU1QpLAorICAgICAgICAgICAgU0RLUEFUSCwKKyAgICAgICAgKSwKKyAgICApLAorICAgIGRpY3QoCiAgICAgICAgICMgTm90ZSB0aGF0IEdOVSByZWFkbGluZSBpcyBHUEwnZCBzb2Z0d2FyZQogICAgICAgICBuYW1lPSJHTlUgUmVhZGxpbmUgNS4xLjQiLAogICAgICAgICB1cmw9Imh0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTUuMS50YXIuZ3oiICwKQEAgLTIzNiw3ICsyNTgsNyBAQAogICAgICAgICAgICAgTWFjIE9TIFggMTAuMyB0byBlbnN1cmUgdGhhdCB5b3UgY2FuIGJ1aWxkIG5ldyBweXRob24gZXh0ZW5zaW9ucwogICAgICAgICAgICAgdXNpbmcgdGhhdCBjb3B5IG9mIHB5dGhvbiBhZnRlciBpbnN0YWxsaW5nIHRoaXMgdmVyc2lvbiBvZgogICAgICAgICAgICAgcHl0aG9uLgotICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAiIiIsCiAgICAgICAgIHBvc3RmbGlnaHQ9Ii4uL1Rvb2xzL2ZpeGFwcGxlcHl0aG9uMjMucHkiLAogICAgICAgICB0b3BkaXI9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yayIsCiAgICAgICAgIHNvdXJjZT0iL2VtcHR5LWRpciIsCkBAIC00ODYsNDggKzUwOCw0OSBAQAogICAgICAgICBydW5Db21tYW5kKCdwYXRjaCAtcCVzIDwgJXMnJShyZWNpcGUuZ2V0KCdwYXRjaGxldmVsJywgMSksCiAgICAgICAgICAgICBzaGVsbFF1b3RlKGZuKSwpKQogCi0gICAgY29uZmlndXJlX2FyZ3MgPSBbCi0gICAgICAgICItLXByZWZpeD0vdXNyL2xvY2FsIiwKLSAgICAgICAgIi0tZW5hYmxlLXN0YXRpYyIsCi0gICAgICAgICItLWRpc2FibGUtc2hhcmVkIiwKLSAgICAgICAgIyJDUFA9Z2NjIC1hcmNoICVzIC1FIiUoJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QsKSwpLAotICAgIF0KKyAgICBpZiBjb25maWd1cmUgaXMgbm90IE5vbmU6CisgICAgICAgIGNvbmZpZ3VyZV9hcmdzID0gWworICAgICAgICAgICAgIi0tcHJlZml4PS91c3IvbG9jYWwiLAorICAgICAgICAgICAgIi0tZW5hYmxlLXN0YXRpYyIsCisgICAgICAgICAgICAiLS1kaXNhYmxlLXNoYXJlZCIsCisgICAgICAgICAgICAjIkNQUD1nY2MgLWFyY2ggJXMgLUUiJSgnIC1hcmNoICcuam9pbihhcmNoTGlzdCwpLCksCisgICAgICAgIF0KIAotICAgIGlmICdjb25maWd1cmVfcHJlJyBpbiByZWNpcGU6Ci0gICAgICAgIGFyZ3MgPSBsaXN0KHJlY2lwZVsnY29uZmlndXJlX3ByZSddKQotICAgICAgICBpZiAnLS1kaXNhYmxlLXN0YXRpYycgaW4gYXJnczoKLSAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLnJlbW92ZSgnLS1lbmFibGUtc3RhdGljJykKLSAgICAgICAgaWYgJy0tZW5hYmxlLXNoYXJlZCcgaW4gYXJnczoKLSAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLnJlbW92ZSgnLS1kaXNhYmxlLXNoYXJlZCcpCi0gICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChhcmdzKQorICAgICAgICBpZiAnY29uZmlndXJlX3ByZScgaW4gcmVjaXBlOgorICAgICAgICAgICAgYXJncyA9IGxpc3QocmVjaXBlWydjb25maWd1cmVfcHJlJ10pCisgICAgICAgICAgICBpZiAnLS1kaXNhYmxlLXN0YXRpYycgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBjb25maWd1cmVfYXJncy5yZW1vdmUoJy0tZW5hYmxlLXN0YXRpYycpCisgICAgICAgICAgICBpZiAnLS1lbmFibGUtc2hhcmVkJyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLnJlbW92ZSgnLS1kaXNhYmxlLXNoYXJlZCcpCisgICAgICAgICAgICBjb25maWd1cmVfYXJncy5leHRlbmQoYXJncykKIAotICAgIGlmIHJlY2lwZS5nZXQoJ3VzZUxERmxhZ3MnLCAxKToKLSAgICAgICAgY29uZmlndXJlX2FyZ3MuZXh0ZW5kKFsKLSAgICAgICAgICAgICJDRkxBR1M9LWFyY2ggJXMgLWlzeXNyb290ICVzIC1JJXMvdXNyL2xvY2FsL2luY2x1ZGUiJSgKLSAgICAgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpLAorICAgICAgICBpZiByZWNpcGUuZ2V0KCd1c2VMREZsYWdzJywgMSk6CisgICAgICAgICAgICBjb25maWd1cmVfYXJncy5leHRlbmQoWworICAgICAgICAgICAgICAgICJDRkxBR1M9LWFyY2ggJXMgLWlzeXNyb290ICVzIC1JJXMvdXNyL2xvY2FsL2luY2x1ZGUiJSgKKyAgICAgICAgICAgICAgICAgICAgICAgICcgLWFyY2ggJy5qb2luKGFyY2hMaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoU0RLUEFUSClbMTotMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLCksCisgICAgICAgICAgICAgICAgIkxERkxBR1M9LXN5c2xpYnJvb3QsJXMgLUwlcy91c3IvbG9jYWwvbGliIC1hcmNoICVzIiUoCiAgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoU0RLUEFUSClbMTotMV0sCi0gICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sKSwKLSAgICAgICAgICAgICJMREZMQUdTPS1zeXNsaWJyb290LCVzIC1MJXMvdXNyL2xvY2FsL2xpYiAtYXJjaCAlcyIlKAotICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoU0RLUEFUSClbMTotMV0sCi0gICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwKLSAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCkpLAotICAgICAgICBdKQotICAgIGVsc2U6Ci0gICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChbCi0gICAgICAgICAgICAiQ0ZMQUdTPS1hcmNoICVzIC1pc3lzcm9vdCAlcyAtSSVzL3Vzci9sb2NhbC9pbmNsdWRlIiUoCi0gICAgICAgICAgICAgICAgICAgICcgLWFyY2ggJy5qb2luKGFyY2hMaXN0KSwKLSAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKVsxOi0xXSwKLSAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwpLAotICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLAorICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCkpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChbCisgICAgICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAorICAgICAgICAgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKVsxOi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sKSwKKyAgICAgICAgICAgIF0pCiAKLSAgICBpZiAnY29uZmlndXJlX3Bvc3QnIGluIHJlY2lwZToKLSAgICAgICAgY29uZmlndXJlX2FyZ3MgPSBjb25maWd1cmVfYXJncyA9IGxpc3QocmVjaXBlWydjb25maWd1cmVfcG9zdCddKQorICAgICAgICBpZiAnY29uZmlndXJlX3Bvc3QnIGluIHJlY2lwZToKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzID0gY29uZmlndXJlX2FyZ3MgPSBsaXN0KHJlY2lwZVsnY29uZmlndXJlX3Bvc3QnXSkKIAotICAgIGNvbmZpZ3VyZV9hcmdzLmluc2VydCgwLCBjb25maWd1cmUpCi0gICAgY29uZmlndXJlX2FyZ3MgPSBbIHNoZWxsUXVvdGUoYSkgZm9yIGEgaW4gY29uZmlndXJlX2FyZ3MgXQorICAgICAgICBjb25maWd1cmVfYXJncy5pbnNlcnQoMCwgY29uZmlndXJlKQorICAgICAgICBjb25maWd1cmVfYXJncyA9IFsgc2hlbGxRdW90ZShhKSBmb3IgYSBpbiBjb25maWd1cmVfYXJncyBdCiAKLSAgICBwcmludCAiUnVubmluZyBjb25maWd1cmUgZm9yICVzIiUobmFtZSwpCi0gICAgcnVuQ29tbWFuZCgnICcuam9pbihjb25maWd1cmVfYXJncykgKyAnIDI+JjEnKQorICAgICAgICBwcmludCAiUnVubmluZyBjb25maWd1cmUgZm9yICVzIiUobmFtZSwpCisgICAgICAgIHJ1bkNvbW1hbmQoJyAnLmpvaW4oY29uZmlndXJlX2FyZ3MpICsgJyAyPiYxJykKIAogICAgIHByaW50ICJSdW5uaW5nIGluc3RhbGwgZm9yICVzIiUobmFtZSwpCiAgICAgcnVuQ29tbWFuZCgneyAnICsgaW5zdGFsbCArICcgO30gMj4mMScpCkBAIC01NTAsNyArNTczLDcgQEAKICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4odW5pdmVyc2FsLCAndXNyJywgJ2xvY2FsJywgJ2luY2x1ZGUnKSkKIAogICAgIGZvciByZWNpcGUgaW4gTElCUkFSWV9SRUNJUEVTOgotICAgICAgICBidWlsZFJlY2lwZShyZWNpcGUsIHVuaXZlcnNhbCwgKCdpMzg2JywgJ3BwYycsKSkKKyAgICAgICAgYnVpbGRSZWNpcGUocmVjaXBlLCB1bml2ZXJzYWwsIEFSQ0hMSVNUKQogCiAKIApAQCAtNjg2LDYgKzcwOSw5IEBACiAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcsICcxMC4zIG9yIGxhdGVyJykKICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCckQVJDSElURUNUVVJFUycsICJpMzg2LCBwcGMiKQogICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJyRJTlNUQUxMX1NJWkUnLCBpbnN0YWxsU2l6ZSgpKQorCisgICAgIyBUaGlzIG9uZSBpcyBub3QgaGFuZHkgYXMgYSB0ZW1wbGF0ZSB2YXJpYWJsZQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJyRQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSJywgJy9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yaycpCiAgICAgZnAgPSBvcGVuKG91dFBhdGgsICd3YicpCiAgICAgZnAud3JpdGUoZGF0YSkKICAgICBmcC5jbG9zZSgpCkBAIC03MDMsNyArNzI5LDEwIEBACiBkZWYgcGFja2FnZUZyb21SZWNpcGUodGFyZ2V0RGlyLCByZWNpcGUpOgogICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCiAgICAgdHJ5OgotICAgICAgICBwa2duYW1lID0gcmVjaXBlWyduYW1lJ10KKyAgICAgICAgIyBUaGUgbWFqb3IgdmVyc2lvbiAoc3VjaCBhcyAyLjUpIGlzIGluY2x1ZGVkIGluIHRoZSBwYWNha2dlIG5hbWUKKyAgICAgICAgIyBiZWNhdXNlIGhhdmVpbmcgdHdvIHZlcnNpb24gb2YgcHl0aG9uIGluc3RhbGxlZCBhdCB0aGUgc2FtZSB0aW1lIGlzCisgICAgICAgICMgY29tbW9uLgorICAgICAgICBwa2duYW1lID0gJyVzLSVzJyUocmVjaXBlWyduYW1lJ10sIGdldFZlcnNpb24oKSkKICAgICAgICAgc3JjZGlyICA9IHJlY2lwZS5nZXQoJ3NvdXJjZScpCiAgICAgICAgIHBrZ3Jvb3QgPSByZWNpcGUuZ2V0KCd0b3BkaXInLCBzcmNkaXIpCiAgICAgICAgIHBvc3RmbGlnaHQgPSByZWNpcGUuZ2V0KCdwb3N0ZmxpZ2h0JykKQEAgLTgwNCw3ICs4MzMsNyBAQAogICAgICAgICAgICAgSUZQa2dGbGFnQ29tcG9uZW50RGlyZWN0b3J5PSJDb250ZW50cy9QYWNrYWdlcyIsCiAgICAgICAgICAgICBJRlBrZ0ZsYWdQYWNrYWdlTGlzdD1bCiAgICAgICAgICAgICAgICAgZGljdCgKLSAgICAgICAgICAgICAgICAgICAgSUZQa2dGbGFnUGFja2FnZUxvY2F0aW9uPSclcy5wa2cnJShpdGVtWyduYW1lJ10pLAorICAgICAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdQYWNrYWdlTG9jYXRpb249JyVzLSVzLnBrZyclKGl0ZW1bJ25hbWUnXSwgZ2V0VmVyc2lvbigpKSwKICAgICAgICAgICAgICAgICAgICAgSUZQa2dGbGFnUGFja2FnZVNlbGVjdGlvbj0nc2VsZWN0ZWQnCiAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIFBLR19SRUNJUEVTCkBAIC04MTIsNiArODQxLDcgQEAKICAgICAgICAgICAgIElGUGtnRm9ybWF0VmVyc2lvbj0wLjEwMDAwMDAwMTQ5MDExNjEyLAogICAgICAgICAgICAgSUZQa2dGbGFnQmFja2dyb3VuZFNjYWxpbmc9InByb3BvcnRpb25hbCIsCiAgICAgICAgICAgICBJRlBrZ0ZsYWdCYWNrZ3JvdW5kQWxpZ25tZW50PSJsZWZ0IiwKKyAgICAgICAgICAgIElGUGtnRmxhZ0F1dGhvcml6YXRpb25BY3Rpb249IlJvb3RBdXRob3JpemF0aW9uIiwKICAgICAgICAgKQogCiAgICAgd3JpdGVQbGlzdChwbCwgcGF0aCkKQEAgLTg1OSw3ICs4ODksNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcGF0Y2hGaWxlKG9zLnBhdGguam9pbigncmVzb3VyY2VzJywgZm4pLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgZm4pKQogCi0gICAgc2h1dGlsLmNvcHkoIi4uLy4uLy4uL0xJQ0VOU0UiLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgJ0xpY2Vuc2UudHh0JykpCisgICAgc2h1dGlsLmNvcHkoIi4uLy4uL0xJQ0VOU0UiLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgJ0xpY2Vuc2UudHh0JykpCiAKIAogZGVmIGluc3RhbGxTaXplKGNsZWFyPUZhbHNlLCBfc2F2ZWQ9W10pOgpAQCAtOTkwLDcgKzEwMjAsNyBAQAogICAgIGJ1aWxkUHl0aG9uRG9jcygpCiAgICAgZm4gPSBvcy5wYXRoLmpvaW4oV09SS0RJUiwgIl9yb290IiwgIkFwcGxpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgIk1hY1B5dGhvbiAlcyIlKGdldFZlcnNpb24oKSwpLCAiVXBkYXRlIFNoZWxsIFByb2ZpbGUuY29tbWFuZCIpCi0gICAgc2h1dGlsLmNvcHkoInNjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlIiwgIGZuKQorICAgIHBhdGNoRmlsZSgic2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUiLCAgZm4pCiAgICAgb3MuY2htb2QoZm4sIDA3NTUpCiAKICAgICBmb2xkZXIgPSBvcy5wYXRoLmpvaW4oV09SS0RJUiwgIl9yb290IiwgIkFwcGxpY2F0aW9ucyIsICJNYWNQeXRob24gJXMiJSgKQEAgLTEwMDUsNyArMTAzNSw3IEBACiAgICAgcGF0Y2hGaWxlKCdyZXNvdXJjZXMvUmVhZE1lLnR4dCcsIG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJywgJ1JlYWRNZS50eHQnKSkKIAogICAgICMgRGl0dG8gZm9yIHRoZSBsaWNlbnNlIGZpbGUuCi0gICAgc2h1dGlsLmNvcHkoJy4uLy4uLy4uL0xJQ0VOU0UnLCBvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2luc3RhbGxlcicsICdMaWNlbnNlLnR4dCcpKQorICAgIHNodXRpbC5jb3B5KCcuLi8uLi9MSUNFTlNFJywgb3MucGF0aC5qb2luKFdPUktESVIsICdpbnN0YWxsZXInLCAnTGljZW5zZS50eHQnKSkKIAogICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2luc3RhbGxlcicsICdCdWlsZC50eHQnKSwgJ3cnKQogICAgIHByaW50ID4+IGZwLCAiIyBCVUlMRCBJTkZPIgpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZiBiL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvV2VsY29tZS5ydGYKaW5kZXggY2I2NWYwOS4uZDA3ZTEwNCAxMDA2NDQKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZgorKysgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1dlbGNvbWUucnRmCkBAIC0xLDQgKzEsNCBAQAote1xydGYxXG1hY1xhbnNpY3BnMTAwMDBcY29jb2FydGY4MjRcY29jb2FzdWJydGYzMzAKK3tccnRmMVxtYWNcYW5zaWNwZzEwMDAwXGNvY29hcnRmODI0XGNvY29hc3VicnRmNDEwCiB7XGZvbnR0YmxcZjBcZnN3aXNzXGZjaGFyc2V0NzcgSGVsdmV0aWNhO1xmMVxmc3dpc3NcZmNoYXJzZXQ3NyBIZWx2ZXRpY2EtQm9sZDt9CiB7XGNvbG9ydGJsO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTI1NTt9CiBccGFwZXJ3MTE5MDBccGFwZXJoMTY4NDBcbWFyZ2wxNDQwXG1hcmdyMTQ0MFx2aWV3dzk5MjBcdmlld2gxMDY2MFx2aWV3a2luZDAKQEAgLTEyLDQgKzEyLDcgQEAKIFwKIE1hY1B5dGhvbiBjb25zaXN0cyBvZiB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlIGludGVycHJldGVyLCBwbHVzIGEgc2V0IG9mIHByb2dyYW1zIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIGl0IGZvciBNYWMgdXNlcnMgKGFuIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuIGFwcGxldCBidWlsZGVyKSwgcGx1cyBhIHNldCBvZiBwcmUtYnVpbHQgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBvcGVuIHVwIHNwZWNpZmljIE1hY2ludG9zaCB0ZWNobm9sb2dpZXMgdG8gUHl0aG9uIHByb2dyYW1zIChDYXJib24sIEFwcGxlU2NyaXB0LCBRdWlja3RpbWUsIG1vcmUpLlwKIFwKLVNlZSB0aGUgUmVhZE1lIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24ufQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1NlZSB0aGUgUmVhZE1lIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXAorXAorXAorVGhpcyBwYWNrYWdlIHdpbGwgYnkgZGVmYXVsdCB1cGRhdGUgeW91ciBzaGVsbCBwcm9maWxlIHRvIGVuc3VyZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBQeXRob24gaXMgb24gdGhlIHNlYXJjaCBwYXRoIG9mIHlvdXIgc2hlbGwuIFBsZWFzZSBkZXNlbGVjdCB0aGUgIlNoZWxsIHByb2ZpbGUgdXBkYXRlciIgcGFja2FnZSBvbiB0aGUgcGFja2FnZSBjdXN0b21pemF0aW9uIHNjcmVlbiAgaWYgeW91IHdhbnQgdG8gYXZvaWQgdGhpcyBtb2RpZmljYXRpb24uIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LmZyYW1ld29yayBiL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrCmluZGV4IDUzMmU3NDUuLmI3OTZhMTAgMTAwNzU1Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrCisrKyBiL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrCkBAIC00LDcgKzQsNyBAQAogIwogCiBQWVZFUj0iQFBZVkVSQCIKLUZXSz0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zL0BQWVZFUkAvIgorRldLPSIvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQFBZVkVSQCIKIAogIiR7RldLfS9iaW4vcHl0aG9uIiAtV2kgLXR0IFwKICAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfS9jb21waWxlYWxsLnB5IiBcCmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUgYi9NYWMvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUKaW5kZXggNDhiZjcwMS4uYzQyZTExZSAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlCisrKyBiL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQucGF0Y2gtcHJvZmlsZQpAQCAtNSwxNCArNSwyNyBAQAogZWNobyAiVGhlc2UgY2hhbmdlcyB3aWxsIGJlIGVmZmVjdGl2ZSBvbmx5IGluIHNoZWxsIHdpbmRvd3MgdGhhdCB5b3Ugb3BlbiIKIGVjaG8gImFmdGVyIHJ1bm5pbmcgdGhpcyBzY3JpcHQuIgogCi1QWVZFUj1AUFlWRVJACitQWVZFUj0yLjUKIFBZVEhPTl9ST09UPSIvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudCIKIAoraWYgWyBgaWQgLXVyYCA9IDAgXTsgdGhlbgorCSMgUnVuIGZyb20gdGhlIGluc3RhbGxlciwgZG8gc29tZSB0cmlja2VyeSB0byBmZXRjaCB0aGUgaW5mb3JtYXRpb24KKwkjIHdlIG5lZWQuCisJdGhlU2hlbGw9ImBmaW5nZXIgJFVTRVIgfCBncmVwIFNoZWxsOiB8IGhlYWQgIC0xIHwgYXdrICd7IHByaW50ICRORiB9J2AiCisKK2Vsc2UKKwl0aGVTaGVsbD0iJHtTSEVMTH0iCitmaQorCiAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5ICR7UFlUSE9OX1JPT1R9L2JpbiBpcyBvbiB0aGUgdXNlcnMgUEFUSC4KLUJTSD0iYGJhc2VuYW1lICIke1NIRUxMfSJgIgorQlNIPSJgYmFzZW5hbWUgIiR7dGhlU2hlbGx9ImAiCiBjYXNlICIke0JTSH0iIGluCiBiYXNofGtzaHxzaHwqY3NoKQotCVA9ImAke1NIRUxMfSAtYyAnZWNobyAkUEFUSCdgIgorCWlmIFsgYGlkIC11cmAgPSAwIF07IHRoZW4KKwkJUD1gc3UgLSAke1VTRVJ9IC1jICdlY2hvIEEtWC00LVhAQCRQQVRIQEBYLTQtWC1BJyB8IGdyZXAgJ0EtWC00LVhAQC4qQEBYLTQtWC1BJyB8IHNlZCAtZSAncy9eQS1YLTQtWEBALy9nJyAtZSAncy9AQFgtNC1YLUEkLy9nJ2AKKwllbHNlCisJCVA9ImAoZXhlYyAtbCAke3RoZVNoZWxsfSAtYyAnZWNobyAkUEFUSCcpYCIKKwlmaQogCTs7CiAqKQogCWVjaG8gIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHBhdGNoICRCU0ggc2hlbGxzIgpAQCAtNDIsMTAgKzU1LDE1IEBACiAJZWNobyAiIyBTZXR0aW5nIFBBVEggZm9yIE1hY1B5dGhvbiAke1BZVkVSfSIgPj4gIiR7SE9NRX0vLmNzaHJjIgogCWVjaG8gIiMgVGhlIG9yZ2luYWwgdmVyc2lvbiBpcyBzYXZlZCBpbiAuY3NocmMucHlzYXZlIiA+PiAiJHtIT01FfS8uY3NocmMiCiAJZWNobyAic2V0IHBhdGg9KCR7UFlUSE9OX1JPT1R9L2JpbiAiJyRwYXRoJyIpIiA+PiAiJHtIT01FfS8uY3NocmMiCisJaWYgWyBgaWQgLXVyYCA9IDAgXTsgdGhlbgorCQljaG93biAiJHtVU0VSfSIgIiR7SE9NRX0vLmNzaHJjIgorCWZpCiAJZXhpdCAwCiAJOzsKIGJhc2gpCi0JaWYgWyAtZSAiJHtIT01FfS8ucHJvZmlsZSIgXTsgdGhlbgorCWlmIFsgLWUgIiR7SE9NRX0vLmJhc2hfcHJvZmlsZSIgXTsgdGhlbgorCQlQUj0iJHtIT01FfS8uYmFzaF9wcm9maWxlIgorCWVsaWYgWyAtZSAiJHtIT01FfS8ucHJvZmlsZSIgXTsgdGhlbgogCQlQUj0iJHtIT01FfS8ucHJvZmlsZSIKIAllbHNlCiAJCVBSPSIke0hPTUV9Ly5iYXNoX3Byb2ZpbGUiCkBAIC02Niw2ICs4NCw2IEBACiBlY2hvICdQQVRIPSInIiR7UFlUSE9OX1JPT1R9L2JpbiInOiR7UEFUSH0iJyA+PiAiJHtQUn0iCiBlY2hvICdleHBvcnQgUEFUSCcgPj4gIiR7UFJ9IgogaWYgWyBgaWQgLXVyYCA9IDAgXTsgdGhlbgotCWNob3duICIke0xPR05BTUV9IiAiJHtQUn0iCisJY2hvd24gIiR7VVNFUn0iICIke1BSfSIKIGZpCiBleGl0IDAKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0Lmh0bWwgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC5odG1sCmluZGV4IDAxNGUyYWQuLjVlNGZhYzcgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2FwcGxlc2NyaXB0Lmh0bWwKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQuaHRtbApAQCAtNCw2ICs0LDEwIEBACiA8aDE+VXNpbmcgdGhlIE9wZW4gU2NyaXB0aW5nIEFyY2hpdGVjdHVyZSBmcm9tIFB5dGhvbjwvaDE+CiA8aHI+CiAKKzxwPjxiPk5PVEU6PC9iPiB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgT1NBIHN1cHBvcnQgdGhhdCBpcyBzaGlwcGVkIHdpdGgKK3RoZSBjb3JlIHB5dGhvbiBkaXN0cmlidXRpb24uIE1vc3QgdXNlcnMgYXJlIGJldHRlciBvZiB3aXRoIHRoZSBtb3JlIAordXNlcmZyaWVuZGx5IDxhIGhyZWY9Imh0dHA6Ly9mcmVlc3BhY2UudmlyZ2luLm5ldC9oYW1pc2guc2FuZGVyc29uL2FwcHNjcmlwdC5odG1sIj5hcHBzY3JpcHQgbGlicmFyeTwvYT4uCisKIDxwPk9TQSBzdXBwb3J0IGluIFB5dGhvbiBpcyBzdGlsbCBub3QgMTAwJSBjb21wbGV0ZSwgYnV0CiB0aGVyZSBpcyBhbHJlYWR5IGVub3VnaCBpbiBwbGFjZSB0byBhbGxvdyB5b3UgdG8gZG8gc29tZSBuaWZ0eSB0aGluZ3MKIHdpdGggb3RoZXIgcHJvZ3JhbXMgZnJvbSB5b3VyIHB5dGhvbiBwcm9ncmFtLiA8L3A+IApAQCAtMzU1LDQgKzM1OSw0IEBACiAKIAogPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL01hYy9EZW1vL2NhbGxkbGwvcmVhZG1lIGIvTWFjL0RlbW8vY2FsbGRsbC9yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjRkZmUuLjAwMDAwMDAKLS0tIGEvTWFjL0RlbW8vY2FsbGRsbC9yZWFkbWUKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1QcmVsaW1pbmFyeSBub3Rlcy9kb2N1bWVudGF0aW9uIGZvciB0aGUgY2FsbGRsbCBtb2R1bGUsIHZlcnNpb24gMC4yLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ2FsbGRsbCBhbGxvd3MgeW91IHRvIGNhbGwgcmFuZG9tIEMgZnVuY3Rpb25zIGZyb20gcHl0aG9uIHdpdGhvdXQgd3JpdGluZyBhbnkKLUMgY29kZS4gSXQgaXMgbWFpbmx5IG1lYW50IHRvIGNhbGwgTWFjT1MgdG9vbGJveCByb3V0aW5lcyBmb3Igd2hpY2ggbm8gUHl0aG9uCi13cmFwcGVyIG1vZHVsZSBpcyBhdmFpbGFibGUuIEl0IGlzIGFsc28gaW5jb21wbGV0ZSwgaW4gdGhhdCBvbmx5IGEgZmV3IGFyZ3VtZW50Ci10eXBlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4gUGxlYXNlIGxldCBtZSBrbm93IHdoaWNoIG90aGVyIGFyZ3VtZW50IHR5cGVzCi15b3UgbmVlZCwgYW5kL29yIHdoZXRoZXIgeW91IGhhdmUgYW55IGlkZWFzIG9uIGEgZ2VuZXJhbCAiZXNjYXBlIiBhbGxvd2luZyBwZW9wbGUKLXRvIHBhc3MgYW55dGhpbmcuCi0KLVRoZSBtb2R1bGUgZXhwb3J0cyB0aHJlZSBmdW5jdGlvbnM6Ci0tIHN5bXRhYmxlID0gZ2V0bGlicmFyeShsaWJyYXJ5bmFtZSkKLQlHZXQgYSByZWZlcmVuY2UgdG8gaW1wb3J0IGxpYnJhcnkgbGlicmFyeW5hbWUuICJJbnRlcmZhY2VMaWIiIGlzIHRoZSBtb3N0IGNvbW1vbmx5Ci0JdXNlZCBvbmUsIGNvbnRhaW5pbmcgbW9zdCB0b29sYm94IHJvdXRpbmVzLiBUaGUgc3ltYm9sIHRhYmxlIGNhbiBiZSB1c2VkCi0JdG8gbG9va3VwIHJvdXRpbmVzIHRvIGJlIHBhc3NlZCB0byBuZXdjYWxsOiAic3ltdGFibGUuV2FpdE5leHRFdmVudCIgd2lsbAotCXJldHVybiB0aGUgYWRkcmVzcyBvZiByb3V0aW5lIFdhaXROZXh0RXZlbnQuIGFuZCBzbyB3aWxsICJzeW10YWJsZVsnV2FpdE5leHRFdmVudCddIi4KLQlUaGUgc3ltdGFibGUgaXMgYSBtYXBwaW5nLCBzbyB5b3UgY2FuIHVzZSBrZXlzKCkgYW5kIGxlbiguLi4pIHRvIGluc3BlY3QgaXQuCi0tIHN5bXRhYmxlID0gZ2V0ZGlza2ZyYWdtZW50KGZpbGUpCi0JTG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUgKGdpdmVuIGJ5IGZzc3BlYyBvciBmaWxlbmFtZSkgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0bwotCWl0cyBzeW1ib2x0YWJsZS4KLS0gY2FsbGFibGUgPSBuZXdjYWxsKHJvdXRpbmUsIHJldHVybnR5cGUsIFthcmd0eXBlLCAuLi5dKQotCVJldHVybiBhIGNhbGxhYmxlIG9iamVjdC4gWW91IHNwZWNpZnkgdGhlIEMgcm91dGluZSB0byBiZSBjYWxsZWQgKGFzIGV4cGxhaW5lZCBhYm92ZSksCi0JdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGFyZ3VtZW50IHR5cGVzLiBUaGUgcmVzdWx0aW5nIG9iamVjdCBjYW4KLQliZSBjYWxsZWQgZnJvbSBQeXRob24gY29kZSBpbiB0aGUgbm9ybWFsIHdheSwgYW5kIHR5cGVjaGVja2luZyBvbiBhcmd1bWVudHMgaXMKLQlwZXJmb3JtZWQgKGJ1dCwgb2YgY291cnNlLCBpZiB5b3Ugc3BlY2lmeSBpbmNvcnJlY3QgYXJndW1lbnQgdHlwZXMgaW4gdGhpcyBjYWxsCi0JeW91IG1heSB3ZWxsIGNyYXNoIHlvdXIgbWFjaGluZSkuIFByaW50aW5nIGEgY2FsbGFibGUgd2lsbCBnaXZlIHlvdSBhIGRlc2NyaXB0aW9uCi0Jb2YgdGhlIChDLSkgY2FsbGluZyBzZXF1ZW5jZS4KLQotVGhlIEMgcmV0dXJuIHZhbHVlIGNhbiBiZSBvbmUgb2YgJ05vbmUnLCAnQnl0ZScsICdTaG9ydCcsICdMb25nJywgJ1BzdHJpbmcnIChhIHBhc2NhbAotc3RyaW5nIHJldHVybmVkIGJ5IGFkZHJlc3MsIGNvcGllZCB0byBhIFB5dGhvbiBzdHJpbmcpLCAnQ29iamVjdCcgKGEgd3JhcHBlciBhcm91bmQgYSB2b2lkCi1wb2ludGVyKSwgJ0hhbmRsZScgKGEgbmV3IGhhbmRsZSwgcmV0dXJuZWQgYXMgYSBSZXMuUmVzb3VyY2Ugb2JqZWN0KSBvciAnT1NFcnInICh3aGljaCByYWlzZXMKLU1hY09TLkVycm9yIGlmIG5vbi16ZXJvKS4KLQotQXJndW1lbnRzIGNhbiBiZSBhbnkgb2YgJ0luQnl0ZScsICdJblNob3J0JywgJ0luTG9uZycsICdJblN0cmluZycgKGEgcHl0aG9uIHN0cmluZywgd2l0aCB0aGUKLWFkZHJlc3Mgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBDIHJvdXRpbmUsIHNvIGJlIGNhcmVmdWwhKSwgJ0luUHN0cmluZycgKGEgcHl0aG9uIHN0cmluZyBjb3BpZWQKLXRvIGEgU3RyMjU1IGFuZCBwYXNzZWQgYnkgYWRkcmVzcyksICAnSW5Db2JqZWN0JywgJ0luSGFuZGxlJywgJ091dEJ5dGUnIChzdG9yYWdlIGlzIGFsbG9jYXRlZCBmb3IKLWEgc2luZ2xlIGJ5dGUsIHRoZSBhZGRyZXNzIHBhc3NlZCB0byBDIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIHJldHVybmVkIHRvIFB5dGhvbiksICdPdXRTaG9ydCcsCi0nT3V0TG9uZycsICdPdXRQc3RyaW5nJyAoYWdhaW46IHN0b3JhZ2UgcHJlLWFsbG9jYXRlZCBhbmQgdGhlIGFkZHJlc3MgcGFzc2VkIHRvIEMpLCAnT3V0Q29iamVjdCcKLShzdG9yYWdlIGZvciBhIHZvaWQgKiBpcyBhbGxvY2F0ZWQsIHRoaXMgdm9pZCAqKiBpcyBwYXNzZWQgdG8gQyBhbmQgdGhlIHJlc3VsdGluZyB2b2lkICogaXMKLWVuY2Fwc3VsYXRlZCBpbiB0aGUgQ29iamVjdCByZXR1cm5lZCkgb3IgJ091dEhhbmRsZScgKGRpdHRvLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgaXMgdXN1YWxseSAqbm90Kgotd2hhdCB5b3UgdXNlLCB5b3Ugbm9ybWFsbHkgdXNlICdJbkhhbmRsZScgYmVjYXVzZSBtb3N0IHRvb2xib3ggY2FsbHMgZXhwZWN0IHlvdSB0byBwcmVhbGxvY2F0ZQotdGhlIGhhbmRsZSkuCi0KLUFsbCB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQgKGZyb20gdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIE91dCBhcmd1bWVudHMpIGFyZSBjb2xsZWN0ZWQuIElmIHRoZXJlCi1hcmVuJ3QgYW55IE5vbmUgaXMgcmV0dXJuZWQsIGlmIHRoZXJlIGlzIG9uZSB2YWx1ZSB0aGlzIHZhbHVlIGlzIHJldHVybmVkLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKLXZhbHVlcyBhIHR1cGxlIGlzIHJldHVybmVkLgotCi1UaGVyZSBpcyB0ZXN0IGNvZGUgaW4gdGVzdGNhbGxkbGwucHksIGFuZCBhIG1pbmltYWwgZXhhbXBsZSBpbiBzYW1wbGVjYWxsZGxsLnB5LgpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vY2FsbGRsbC9zYW1wbGVjYWxsZGxsLnB5IGIvTWFjL0RlbW8vY2FsbGRsbC9zYW1wbGVjYWxsZGxsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTViYjVjLi4wMDAwMDAwCi0tLSBhL01hYy9EZW1vL2NhbGxkbGwvc2FtcGxlY2FsbGRsbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMKLSMgVGVzdCBjYWxsZGxsLiBUZWxsIHRoZSB1c2VyIGhvdyBvZnRlbiBtZW51cyBmbGFzaCwgYW5kIGxldCBoZXIgY2hhbmdlIGl0LgotIwotCi1pbXBvcnQgY2FsbGRsbAotaW1wb3J0IHN5cwotCi0jIE9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgbGlicmFyeSB3aXRoIHRoZSB0b29sYm94IGNhbGxzCi1pbnRlcmZhY2VsaWIgPSBjYWxsZGxsLmdldGxpYnJhcnkoJ0ludGVyZmFjZUxpYicpCi0KLSMgR2V0IHRoZSByb3V0aW5lcyB3ZSBuZWVkIChzZWUgTG93TWVtLmggZm9yIGRldGFpbHMpCi1MTUdldE1lbnVGbGFzaCA9IGNhbGxkbGwubmV3Y2FsbChpbnRlcmZhY2VsaWIuTE1HZXRNZW51Rmxhc2gsICdTaG9ydCcpCi1MTVNldE1lbnVGbGFzaCA9IGNhbGxkbGwubmV3Y2FsbChpbnRlcmZhY2VsaWIuTE1TZXRNZW51Rmxhc2gsICdOb25lJywgJ0luU2hvcnQnKQotCi1wcmludCAiTWVudXMgY3VycmVudGx5IGZsYXNoIixMTUdldE1lbnVGbGFzaCgpLCJ0aW1lcy4iCi1wcmludCAiSG93IG9mdGVuIHdvdWxkIHlvdSBsaWtlIHRoZW0gdG8gZmxhc2g/IiwKLQotIyBOb3RlOiB3ZSB1c2UgaW5wdXQoKSwgc28geW91IGNhbiB0cnkgcGFzc2luZyBub24taW50ZWdlciBvYmplY3RzCi1uZXdmbGFzaCA9IGlucHV0KCkKLUxNU2V0TWVudUZsYXNoKG5ld2ZsYXNoKQotCi1wcmludCAiT2theSwgbWVudXMgbm93IGZsYXNoIiwgTE1HZXRNZW51Rmxhc2goKSwidGltZXMuIgotCi1zeXMuZXhpdCgxKSAgICMgU28gdGhlIHdpbmRvdyBzdGF5cyBvbi1zY3JlZW4KZGlmZiAtLWdpdCBhL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkgYi9NYWMvRGVtby9jYWxsZGxsL3Rlc3RjYWxsZGxsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2OTY0Li4wMDAwMDAwCi0tLSBhL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotaW1wb3J0IGNhbGxkbGwKLWltcG9ydCBtYWNmcwotaW1wb3J0IHN5cwotaW1wb3J0IE1hY09TCi1mcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0KLWZzcywgb2sgPSBtYWNmcy5Qcm9tcHRHZXRGaWxlKCJTaG93IG1lIGNhbGxkbGwucHBjLnNsYiIpCi0KLWxpYiA9IGNhbGxkbGwuZ2V0ZGlza2ZyYWdtZW50KGZzcywgJ2NhbGxkbGwucHBjLnNsYicpCi0KLWNkbGxfYl9iYmJiYmJiYiA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9iX2JiYmJiYmJiLCAnQnl0ZScsICdJbkJ5dGUnLCAnSW5CeXRlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luQnl0ZScsICdJbkJ5dGUnLCdJbkJ5dGUnLCAnSW5CeXRlJywnSW5CeXRlJywgJ0luQnl0ZScpCi1jZGxsX2hfaGhoaGhoaGggPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfaF9oaGhoaGhoaCwgJ1Nob3J0JywgJ0luU2hvcnQnLCAnSW5TaG9ydCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnKQotY2RsbF9sX2xsbGxsbGxsID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2xfbGxsbGxsbGwsICdMb25nJywgJ0luTG9uZycsICdJbkxvbmcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5Mb25nJywgJ0luTG9uZycsJ0luTG9uZycsICdJbkxvbmcnLCdJbkxvbmcnLCAnSW5Mb25nJykKLQotY2RsbF9OX3Nzc3Nzc3NzID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fc3Nzc3Nzc3MsICdOb25lJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJykKLQotY2RsbF9vX2wgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfb19sLCAnT1NFcnInLCAnSW5Mb25nJykKLQotY2RsbF9OX3BwID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fcHAsICdOb25lJywgJ0luUHN0cmluZycsICdPdXRQc3RyaW5nJykKLQotY2RsbF9OX2JiID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fYmIsICdOb25lJywgJ0luQnl0ZScsICdPdXRCeXRlJykKLWNkbGxfTl9oaCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9OX2hoLCAnTm9uZScsICdJblNob3J0JywgJ091dFNob3J0JykKLWNkbGxfTl9sbCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9OX2xsLCAnTm9uZScsICdJbkxvbmcnLCAnT3V0TG9uZycpCi1jZGxsX05fc0ggPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfTl9zSCwgJ05vbmUnLCAnSW5TdHJpbmcnLCAnSW5IYW5kbGUnKQotCi1wcmludCAnVGVzdCBjZGxsX2JfYmJiYmJiYmInCi1ydiA9IGNkbGxfYl9iYmJiYmJiYigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQotaWYgcnYgPT0gMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX2JfYmJiYmJiYmIgbmVnYXRpdmUnCi1ydiA9IGNkbGxfYl9iYmJiYmJiYigtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCi1pZiBydiA9PSAtMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX2hfaGhoaGhoaGgnCi1ydiA9IGNkbGxfaF9oaGhoaGhoaCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQotaWYgcnYgPT0gMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX2hfaGhoaGhoaGggbmVnYXRpdmUnCi1ydiA9IGNkbGxfaF9oaGhoaGhoaCgtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCi1pZiBydiA9PSAtMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX2xfbGxsbGxsbGwnCi1ydiA9IGNkbGxfbF9sbGxsbGxsbCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQotaWYgcnYgPT0gMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX2xfbGxsbGxsbGwgbmVnYXRpdmUnCi1ydiA9IGNkbGxfbF9sbGxsbGxsbCgtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCi1pZiBydiA9PSAtMzY6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX05fc3Nzc3Nzc3MnCi1wcmludCAnU2hvdWxkIHByaW50IG9uZSB0d28gdGhyZWUgZm91ciBmaXZlIHNpeCBzZXZlbiBlaWdodCcKLXJ2ID0gY2RsbF9OX3Nzc3Nzc3NzKCdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnKQotaWYgcnYgPT0gTm9uZToKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfb19sKDApJwotcnYgPSBjZGxsX29fbCgwKQotaWYgcnYgPT0gTm9uZToKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRXJyb3IsIHJldHVybmVkJywgcnYKLQotcHJpbnQgJ1Rlc3QgY2RsbF9vX2woLTEwMCknCi10cnk6Ci0gICAgcnYgPSBjZGxsX29fbCgtMTAwKQotICAgIHByaW50ICdFcnJvciwgZGlkIG5vdCByYWlzZSBleGNlcHRpb24sIHJldHVybmVkJywgcnYKLWV4Y2VwdCBNYWNPUy5FcnJvciwgYXJnOgotICAgIGlmIGFyZ1swXSA9PSAtMTAwOgotICAgICAgICBwcmludCAnb2suJwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdFcnJvciwgcmV0dXJuZWQgaW5jb3JyZWN0IGV4Y2VwdGlvbiBhcmc6JywgYXJnWzBdCi0KLXByaW50ICdUZXN0IGNkbGxfTl9wcCcKLXJ2ID0gY2RsbF9OX3BwKCdwYXNjYWwgc3RyaW5nJykKLWlmIHJ2ID09ICdXYXM6IHBhc2NhbCBzdHJpbmcnOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcmVwcihydikKLQotcHJpbnQgJ1Rlc3QgY2RsbF9OX2JiJwotcnYgPSBjZGxsX05fYmIoLTEwMCkKLWlmIHJ2ID09IC0xMDA6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX05faGgnCi1ydiA9IGNkbGxfTl9oaCgtMTAwKQotaWYgcnYgPT0gLTEwMDoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfTl9sbCcKLXJ2ID0gY2RsbF9OX2xsKC0xMDApCi1pZiBydiA9PSAtMTAwOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQotcHJpbnQgJ1Rlc3QgY2RsbF9OX3NIJwotaCA9IFJlcy5SZXNvdXJjZSgneHl6JykKLXJ2ID0gY2RsbF9OX3NIKCduZXcgZGF0YScsIGgpCi1pZiBydiA9PSBOb25lIGFuZCBoLmRhdGEgPT0gJ25ldyBkYXRhJzoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCBydiBpcycsIHJ2LCAnYW5kIGhhbmRsZSBkYXRhIGlzJywgcmVwcihydi5kYXRhKQotc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2luZGV4Lmh0bWwgYi9NYWMvRGVtby9pbmRleC5odG1sCmluZGV4IDQ0M2NjZTkuLjllMDFlOWYgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2luZGV4Lmh0bWwKKysrIGIvTWFjL0RlbW8vaW5kZXguaHRtbApAQCAtMywxNSArMywxNiBAQAogPEgxPjxJTUcgU1JDPSJodG1sLmljb25zL3B5dGhvbi5naWYiPk1hY2ludG9zaCBQeXRob24gY3Jhc2ggY291cnNlPC9IMT4KIDxIUj4KIAotVGhpcyBzZXQgb2YgZG9jdW1lbnRzIHByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byB2YXJpb3VzIGFzcGVjdHMgb2YKKzxwPlRoaXMgc2V0IG9mIGRvY3VtZW50cyBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gdmFyaW91cyBhc3BlY3RzIG9mCiBQeXRob24gcHJvZ3JhbW1pbmcgb24gdGhlIE1hYy4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSByZWFkZXIgaXMKIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBQeXRob24gYW5kLCB0byBzb21lIGV4dGVudCwgd2l0aCBNYWNPUyBUb29sYm94CiBwcm9ncmFtbWluZy4gT3RoZXIgcmVhZGVycyBtYXkgZmluZCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGVyZSB0b28sCi15b3VyIG1pbGVhZ2UgbWF5IHZhcnkuIDxwPgoreW91ciBtaWxlYWdlIG1heSB2YXJ5LiA8L3A+CiAKLVRoZXJlIGlzIGEgY29tcGFuaW9uIGRvY3VtZW50IDxhIGhyZWY9InVzaW5nLmh0bWwiPlVzaW5nIFB5dGhvbiBvbiB0aGUgTWFjPC9hPgotd2hpY2ggeW91IHNob3VsZCByZWFkIGJlZm9yZSBzdGFydGluZyBoZXJlOiBpdCBleHBsYWlucyB0aGUgYmFzaWNzIG9mIHVzaW5nCi1weXRob24gb24gdGhlIE1hY2ludG9zaC4gPHA+Cis8cD5BcyB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIHJldmVhbHMgdG8gdGhlIGNhcmVmdWwgb2JzZXJ2ZXIgdGhlc2UgZXhhbXBsZXMKK2FyZSBkYXRlZCwgbW9zdCBvZiB0aGVtIHdlcmUgd3JpdHRpbmcgYmVmb3JlIE9TWCBhbmQgaGF2ZW4ndCBiZWVuIHVwZGF0ZWQKK2FmdGVyd2FyZHMuIFRoZXkgc3RpbGwgc2hvdyBob3cgdG8gdXNlIHRoZSBDYXJib24gd3JhcHBlcnMgYnV0IGFyZW4ndCAKK25lY2Vzc2FyaWx5IHRoZSBiZXN0IHdheSB0byB1c2UgdGhlIENhcmJvbiBBUEkncyBpbiBPU1guPC9wPgogCiBBbm90aGVyIHNldCBvZiBNYWNpbnRvc2gtc2F2dnkgZXhhbXBsZXMsIG1vcmUgYWltZWQgYXQgYmVnaW5uZXJzLCBpcwogbWFpbnRhaW5lZCBieSBKb3NlcGggU3Ryb3V0LCBhdCBQeXRob24gVGlkYml0cyBpbiA8QQpAQCAtMjcsMTAgKzI4LDkgQEAKIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvIj5kb2N1bWVudGF0aW9uPC9hPiBzZWN0aW9uIG9uIHRoZQogd2Vic2VydmVyLiA8cD4KIAotVGhlIFcgd2lkZ2V0IHNldCBieSBKdXN0IHZhbiBSb3NzdW0sIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFB5dGhvbiBJREUsIGRvZXMgbm90Ci1oYXZlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gYXMgb2YgdGhpcyB3cml0aW5nLCBidXQgQ29ycmFuIFdlYnN0ZXIgaGFzCi1kb2N1bWVudGVkIG1vc3Qgb2YgaXQgb24gaGlzCi08QSBIUkVGPSJodHRwOi8vd3d3Lm5ldmFkYS5lZHUvfmN3ZWJzdGVyL1B5dGhvbi8iPlB5dGhvbiBQYWdlPC9BPi4gPHA+Cis8cD5UaGUgVyB3aWRnZXQgc2V0IGJ5IEp1c3QgdmFuIFJvc3N1bSwgZG9lcyBub3QgaGF2ZSBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGFzIAorb2YgdGhpcyB3cml0aW5nLCBidXQgQ29ycmFuIFdlYnN0ZXIgaGFzIGRvY3VtZW50ZWQgbW9zdCBvZiBpdCBvbiBoaXMKKzxBIEhSRUY9Imh0dHA6Ly93d3cubmV2YWRhLmVkdS9+Y3dlYnN0ZXIvUHl0aG9uLyI+UHl0aG9uIFBhZ2U8L0E+LjwvcD4KIAogVGhlcmUgYXJlIGFsc28gc29tZSBkb2N1bWVudGF0aW9uIGxpbmtzLCBhcyB3ZWxsIGFzIG90aGVyIE1hY1B5dGhvbi1yZWxhdGVkCiBwYWdlcywgaW4gdGhlCmRpZmYgLS1naXQgYS9NYWMvSURMRS9jb25maWctbWFpbi5kZWYgYi9NYWMvSURMRS9jb25maWctbWFpbi5kZWYKaW5kZXggMWNkYzBjNS4uNDY5MWE4NSAxMDA2NDQKLS0tIGEvTWFjL0lETEUvY29uZmlnLW1haW4uZGVmCisrKyBiL01hYy9JRExFL2NvbmZpZy1tYWluLmRlZgpAQCAtNzEsNyArNzEsNyBAQAogCiBbS2V5c10KIGRlZmF1bHQ9IDEKLW5hbWU9IElETEUgQ2xhc3NpYyBNYWMKK25hbWU9IElETEUgQ2xhc3NpYyBPU1gKIAogW0hpc3RvcnldCiBjeWNsaWM9MQpkaWZmIC0tZ2l0IGEvTWFjL01ha2VmaWxlLmluIGIvTWFjL01ha2VmaWxlLmluCmluZGV4IDgyNTE0YjIuLjExZjE0MzggMTAwNjQ0Ci0tLSBhL01hYy9NYWtlZmlsZS5pbgorKysgYi9NYWMvTWFrZWZpbGUuaW4KQEAgLTUsNyArNSw3IEBACiBWRVJTSU9OPUBWRVJTSU9OQAogYnVpbGRkaXIgPSAuLgogc3JjZGlyPUBzcmNkaXJACi1wcmVmaXg9L0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyQoVkVSU0lPTikKK3ByZWZpeD1AcHJlZml4QAogTElCREVTVD0kKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikKIFJVTlNIQVJFRD1AUlVOU0hBUkVEQAogQlVJTERFWEU9QEJVSUxERVhFRVhUQApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWFjb3Ntb2R1bGUuYyBiL01hYy9Nb2R1bGVzL01hY09TLmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTWFjL01vZHVsZXMvbWFjb3Ntb2R1bGUuYwpyZW5hbWUgdG8gTWFjL01vZHVsZXMvTWFjT1MuYwppbmRleCBlZDg2ZmQwLi40ZWFiYjM5IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tYWNvc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL01hY09TLmMKQEAgLTM3NSw2ICszNzUsNyBAQAogCQkJCS8qIEFuZCB0cnkgYWdhaW4uLi4gKi8KIAkJCQloID0gR2V0UmVzb3VyY2UoJ0VzdHInLCBlcnIpOwogCQkJfQorCQkJUHlfREVDUkVGKG0pOwogCQl9CiAJfQogCS8qCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hZS9fQUVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jCmluZGV4IDY4YmUzYmYuLmZkNmViY2MgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jCkBAIC04MjksMjEgKzgyOSwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19nZXRfZGF0YShBRURlc2NPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7CisJUHlPYmplY3QgKnJlczsKKwlTaXplIHNpemU7CisJY2hhciAqcHRyOworCU9TRXJyIGVycjsKIAotCSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0JICAgICAgICAgICAgU2l6ZSBzaXplOwotCSAgICAgICAgICAgIGNoYXIgKnB0cjsKLQkgICAgICAgICAgICBPU0VyciBlcnI7Ci0KLQkgICAgICAgICAgICBzaXplID0gQUVHZXREZXNjRGF0YVNpemUoJnNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICBpZiAoIChlcnI9QUVHZXREZXNjRGF0YSgmc2VsZi0+b2JfaXRzZWxmLCBwdHIsIHNpemUpKSA8IDAgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JICAgICAgICAgICAgcmV0dXJuIHJlczsKLQkgICAgICAgICAgICAKKwlzaXplID0gQUVHZXREZXNjRGF0YVNpemUoJnNlbGYtPm9iX2l0c2VsZik7CisJaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIChwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpKSA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCAoZXJyPUFFR2V0RGVzY0RhdGEoJnNlbGYtPm9iX2l0c2VsZiwgcHRyLCBzaXplKSkgPCAwICkKKwkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisJcmV0dXJuIHJlczsKIH0KIAogI2RlZmluZSBBRURlc2Nfc2V0X2RhdGEgTlVMTApAQCAtMTQzMSwxNCArMTQyOSwxMSBAQAogCVB5T2JqZWN0ICptOwogCVB5T2JqZWN0ICpkOwogCi0KLQotCSAgICAgICAgdXBwX0FFSWRsZVByb2MgPSBOZXdBRUlkbGVVUFAoQUVJZGxlUHJvYyk7Ci0JICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciA9IE5ld0FFRXZlbnRIYW5kbGVyVVBQKEdlbmVyaWNFdmVudEhhbmRsZXIpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXdCb3Jyb3dlZCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQUVEZXNjLCBBRURlc2NfQ29udmVydCk7Ci0KKyAgICAgICAgdXBwX0FFSWRsZVByb2MgPSBOZXdBRUlkbGVVUFAoQUVJZGxlUHJvYyk7CisgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXdCb3Jyb3dlZCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKIAogCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUUiLCBBRV9tZXRob2RzKTsKIAlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubSBiL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubQppbmRleCBmYzM5MzdiLi5iYTM3NWJhIDEwMDc1NQotLS0gYS9NYWMvUHl0aG9uTGF1bmNoZXIvRmlsZVNldHRpbmdzLm0KKysrIGIvTWFjL1B5dGhvbkxhdW5jaGVyL0ZpbGVTZXR0aW5ncy5tCkBAIC0yNDUsMTIgKzI0NSwyNiBAQAogICAgIGlmICh2YWx1ZSkgd2l0aF90ZXJtaW5hbCA9IFt2YWx1ZSBib29sVmFsdWVdOwogfQogCistIChOU1N0cmluZyopX3JlcGxhY2VTaW5nbGVRdW90ZXM6IChOU1N0cmluZyopc3RyaW5nCit7CisJLyogUmVwbGFjZSBhbGwgc2luZ2xlLXF1b3RlcyBieSAnIiciJywgdGhhdCB3YXkgc2hlbGxxdW90aW5nIHdpbGwKKwkgKiBiZSBjb3JyZWN0IHdoZW4gdGhlIHJlc3VsdCB2YWx1ZSBpcyBkZWxpbWl0ZWQgIHVzaW5nIHNpbmdsZSBxdW90ZXMuCisJICovCisJTlNBcnJheSogY29tcG9uZW50cyA9IFtzdHJpbmcgY29tcG9uZW50c1NlcGFyYXRlZEJ5U3RyaW5nOkAiJyJdOworCisJcmV0dXJuIFtjb21wb25lbnRzIGNvbXBvbmVudHNKb2luZWRCeVN0cmluZzpAIidcIidcIiciXTsKK30KKwogLSAoTlNTdHJpbmcgKiljb21tYW5kTGluZUZvclNjcmlwdDogKE5TU3RyaW5nICopc2NyaXB0CiB7CiAgICAgTlNTdHJpbmcgKmN1cl9pbnRlcnAgPSBOVUxMOworICAgIE5TU3RyaW5nKiBzY3JpcHRfZGlyID0gTlVMTDsKICAgICBjaGFyIGhhc2hiYW5nYnVmWzEwMjRdOwogICAgIEZJTEUgKmZwOwogICAgIGNoYXIgKnA7CisKKyAgICBzY3JpcHRfZGlyID0gW3NjcmlwdCBzdWJzdHJpbmdUb0luZGV4OgorCSAgICBbc2NyaXB0IGxlbmd0aF0tW1tzY3JpcHQgbGFzdFBhdGhDb21wb25lbnRdIGxlbmd0aF1dOwogICAgIAogICAgIGlmIChob25vdXJoYXNoYmFuZyAmJgogICAgICAgIChmcD1mb3Blbihbc2NyaXB0IGNTdHJpbmddLCAiciIpKSAmJgpAQCAtMjY2LDggKzI4MCw5IEBACiAgICAgICAgIGN1cl9pbnRlcnAgPSBpbnRlcnByZXRlcjsKICAgICAgICAgCiAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OgotICAgICAgICBAIlwiJUBcIiVzJXMlcyVzJXMlcyAlQCBcIiVAXCIgJUAgJXMiLAotICAgICAgICBjdXJfaW50ZXJwLAorICAgICAgICBAImNkICclQCcgJiYgJyVAJyVzJXMlcyVzJXMlcyAlQCAnJUAnICVAICVzIiwKKyAgICAJW3NlbGYgX3JlcGxhY2VTaW5nbGVRdW90ZXM6c2NyaXB0X2Rpcl0sCisgICAgICAgIFtzZWxmIF9yZXBsYWNlU2luZ2xlUXVvdGVzOmN1cl9pbnRlcnBdLAogICAgICAgICBkZWJ1Zz8iIC1kIjoiIiwKICAgICAgICAgdmVyYm9zZT8iIC12IjoiIiwKICAgICAgICAgaW5zcGVjdD8iIC1pIjoiIiwKQEAgLTI3NSw3ICsyOTAsNyBAQAogICAgICAgICBub3NpdGU/IiAtUyI6IiIsCiAgICAgICAgIHRhYnM/IiAtdCI6IiIsCiAgICAgICAgIG90aGVycywKLSAgICAgICAgc2NyaXB0LAorICAgICAgICBbc2VsZiBfcmVwbGFjZVNpbmdsZVF1b3RlczpzY3JpcHRdLAogICAgICAgICBzY3JpcHRhcmdzLAogICAgICAgICB3aXRoX3Rlcm1pbmFsPyAiJiYgZWNobyBFeGl0IHN0YXR1czogJD8gJiYgZXhpdCAxIiA6ICIgJiJdOwogfQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL2ZpeGFwcGxlcHl0aG9uMjMucHkgYi9NYWMvVG9vbHMvZml4YXBwbGVweXRob24yMy5weQppbmRleCBlZjM1MmNlLi5mYjg2NDVhIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvZml4YXBwbGVweXRob24yMy5weQorKysgYi9NYWMvVG9vbHMvZml4YXBwbGVweXRob24yMy5weQpAQCAtOTQsOSArOTQsMTkgQEAKICAgICBlbHNlOgogICAgICAgICBkb19hcHBseSA9IFRydWUKICAgICAjIEZpcnN0IGNoZWNrIE9TIHZlcnNpb24KKyAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAjIEFsbCBpbnRlbCBtYWNzIGFyZSBmaW5lCisgICAgICAgIHByaW50ICJmaXhhcHBseXB5dGhvbjIzOiBubyBmaXggaXMgbmVlZGVkIG9uIE1hY09TWCBvbiBJbnRlbCIKKyAgICAgICAgc3lzLmV4aXQoMCkKKwogICAgIGlmIGdlc3RhbHQuZ2VzdGFsdCgnc3lzdicpIDwgMHgxMDMwOgogICAgICAgICBwcmludCAnZml4YXBwbGVweXRob24yMzogbm8gZml4IG5lZWRlZCBvbiBNYWNPU1ggPCAxMC4zJwogICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgaWYgZ2VzdGFsdC5nZXN0YWx0KCdzeXN2JykgPj0gMHgxMDQwOgorICAgICAgICBwcmludCAnZml4YXBwbGVweXRob24yMzogbm8gZml4IG5lZWRlZCBvbiBNYWNPU1ggPj0gMTAuNCcKKyAgICAgICAgc3lzLmV4aXQoMCkKKwogICAgICMgVGVzdCB0aGF0IGEgZnJhbWV3b3JrIFB5dGhvbiBpcyBpbmRlZWQgaW5zdGFsbGVkCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKE1BS0VGSUxFKToKICAgICAgICAgcHJpbnQgJ2ZpeGFwcGxlcHl0aG9uMjM6IFB5dGhvbiBmcmFtZXdvcmsgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGluc3RhbGxlZCAoPyksIG5vdGhpbmcgZml4ZWQnCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggZjgyMjgzOC4uNzRjZThhOCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtMzE4LDYgKzMxOCw3IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBvYmplY3RzIHRoYXQgZ2V0IGxpbmtlZCBpbnRvIHRoZSBQeXRob24gbGlicmFyeQogTElCUkFSWV9PQkpTPQlcCisJCU1vZHVsZXMvX3R5cGVzbW9kdWxlLm8gXAogCQlNb2R1bGVzL2dldGJ1aWxkaW5mby5vIFwKIAkJJChQQVJTRVJfT0JKUykgXAogCQkkKE9CSkVDVF9PQkpTKSBcCkBAIC0zNTQsNiArMzU1LDcgQEAKICQoTElCUkFSWSk6ICQoTElCUkFSWV9PQkpTKQogCS1ybSAtZiAkQAogCSQoQVIpIGNyICRAIE1vZHVsZXMvZ2V0YnVpbGRpbmZvLm8KKwkkKEFSKSBjciAkQCBNb2R1bGVzL190eXBlc21vZHVsZS5vCiAJJChBUikgY3IgJEAgJChQQVJTRVJfT0JKUykKIAkkKEFSKSBjciAkQCAkKE9CSkVDVF9PQkpTKQogCSQoQVIpIGNyICRAICQoUFlUSE9OX09CSlMpCkBAIC00ODYsNyArNDg4LDcgQEAKIAogJChBU1RfQyk6ICQoQVNUX0FTREwpICQoQVNETEdFTl9GSUxFUykKIAkkKEFTRExHRU4pIC1jICQoQVNUX0NfRElSKSAkKEFTVF9BU0RMKQotCQorCiBQeXRob24vY29tcGlsZS5vIFB5dGhvbi9zeW10YWJsZS5vOiAkKEdSQU1NQVJfSCkgJChBU1RfSCkKIAogUHl0aG9uL2dldHBsYXRmb3JtLm86ICQoc3JjZGlyKS9QeXRob24vZ2V0cGxhdGZvcm0uYwpAQCAtNjUxLDE2ICs2NTMsMTEgQEAKIAllbHNlIHRydWU7IFwKIAlmaQogCShjZCAkKERFU1RESVIpJChCSU5ESVIpOyAkKExOKSBweXRob24kKFZFUlNJT04pJChFWEUpICQoUFlUSE9OKSkKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXNmIHB5dGhvbiQoVkVSU0lPTiktY29uZmlnIHB5dGhvbi1jb25maWcpCiAKICMgSW5zdGFsbCB0aGUgaW50ZXJwcmV0ZXIgd2l0aCAkKFZFUlNJT04pIGFmZml4ZWQKICMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKIGFsdGJpbmluc3RhbGw6CSQoQlVJTERQWVRIT04pCi0JQGlmIHRlc3QgIiQoUFlUSE9ORlJBTUVXT1JLRElSKSIgIT0gbm8tZnJhbWV3b3JrOyB0aGVuIFwKLQkJaWYgdGVzdCAhIC1mICQoREVTVERJUikkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zL0N1cnJlbnQvUmVzb3VyY2VzL0luZm8ucGxpc3Q7IHRoZW4gXAotCQkJZWNobyAnRnJhbWV3b3JrIGJ1aWxkOiB1c2UgIm1ha2UgZnJhbWV3b3JraW5zdGFsbCIgaW4gc3RlYWQgb2YgIm1ha2UgaW5zdGFsbCInOyBcCi0JCQlleGl0IDE7IFwKLQkJZmk7IFwKLQlmaQogCUBmb3IgaSBpbiAkKEJJTkRJUikgJChMSUJESVIpOyBcCiAJZG8gXAogCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCkBAIC03MDAsNyArNjk3LDcgQEAKIEVYVFJBUExBVERJUj0gQEVYVFJBUExBVERJUkAKIEVYVFJBTUFDSERFUFBBVEg9QEVYVFJBTUFDSERFUFBBVEhACiBNQUNIREVQUz0JJChQTEFURElSKSAkKEVYVFJBUExBVERJUikKLVhNTExJQlNVQkRJUlM9ICB4bWxjb3JlIHhtbGNvcmUvZG9tIHhtbGNvcmUvZXRyZWUgeG1sY29yZS9wYXJzZXJzIHhtbGNvcmUvc2F4CitYTUxMSUJTVUJESVJTPSAgeG1sIHhtbC9kb20geG1sL2V0cmVlIHhtbC9wYXJzZXJzIHhtbC9zYXgKIFBMQVRNQUNESVJTPSBwbGF0LW1hYyBwbGF0LW1hYy9DYXJib24gcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzIFwKIAlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMgXAogCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2FycmlvciBcCkBAIC03MDksMTQgKzcwNiwxNCBAQAogCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZSBcCiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcyBcCiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cyBcCi0JcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsIAogUExBVE1BQ1BBVEg9OnBsYXQtbWFjOnBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcwotTElCU1VCRElSUz0JbGliLW9sZCBsaWItdGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3Qvb3V0cHV0IHRlc3QvZGF0YSBcCitMSUJTVUJESVJTPQlsaWItdGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3Qvb3V0cHV0IHRlc3QvZGF0YSBcCiAJCXRlc3QvZGVjaW1hbHRlc3RkYXRhIFwKIAkJZW5jb2RpbmdzIGNvbXBpbGVyIGhvdHNob3QgXAogCQllbWFpbCBlbWFpbC9taW1lIGVtYWlsL3Rlc3QgZW1haWwvdGVzdC9kYXRhIFwKIAkJc3FsaXRlMyBzcWxpdGUzL3Rlc3QgXAotCQlsb2dnaW5nIGJzZGRiIGJzZGRiL3Rlc3QgY3N2IFwKKwkJbG9nZ2luZyBic2RkYiBic2RkYi90ZXN0IGNzdiB3c2dpcmVmIFwKIAkJY3R5cGVzIGN0eXBlcy90ZXN0IGN0eXBlcy9tYWNob2xpYiBpZGxlbGliIGlkbGVsaWIvSWNvbnMgXAogCQlkaXN0dXRpbHMgZGlzdHV0aWxzL2NvbW1hbmQgZGlzdHV0aWxzL3Rlc3RzICQoWE1MTElCU1VCRElSUykgXAogCQlzZXR1cHRvb2xzIHNldHVwdG9vbHMvY29tbWFuZCBzZXR1cHRvb2xzL3Rlc3RzIHNldHVwdG9vbHMuZWdnLWluZm8gXApAQCAtNzQxLDcgKzczOCw3IEBACiAJCWVsc2UJdHJ1ZTsgXAogCQlmaTsgXAogCWRvbmUKLQlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5ICQoc3JjZGlyKS9MaWIvKi5kb2M7IFwKKwlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5ICQoc3JjZGlyKS9MaWIvKi5kb2MgJChzcmNkaXIpL0xpYi8qLmVnZy1pbmZvIDsgXAogCWRvIFwKIAkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAogCQkJJChJTlNUQUxMX1NDUklQVCkgJCRpICQoREVTVERJUikkKExJQkRFU1QpOyBcCkBAIC04NTcsOCArODU0LDggQEAKIAkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvaW5zdGFsbC1zaCAkKERFU1RESVIpJChMSUJQTCkvaW5zdGFsbC1zaAogCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCiAJIyBpcyBub3QgYXZhaWxhYmxlIGluIGNvbmZpZ3VyZQotCXNlZCAtZSAicyxAQklORElSQCwkKEJJTkRJUiksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKLQkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uLWNvbmZpZworCXNlZCAtZSAicyxARVhFTkFNRUAsJChCSU5ESVIpL3B5dGhvbiQoVkVSU0lPTikkKEVYRSksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKS1jb25maWcKIAlybSBweXRob24tY29uZmlnCiAJQGlmIFsgLXMgTW9kdWxlcy9weXRob24uZXhwIC1hIFwKIAkJImBlY2hvICQoTUFDSERFUCkgfCBzZWQgJ3MvXlwoLi4uXCkuKi9cMS8nYCIgPSAiYWl4IiBdOyB0aGVuIFwKQEAgLTkzOSw3ICs5MzYsMTAgQEAKIAkkKElOU1RBTExfU0hBUkVEKSAkKExETElCUkFSWSkgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLUFJFRklYKS8kKExETElCUkFSWSkKIAogIyBUaGlzIGluc3RhbGxzIE1hYy9MaWIgaW50byB0aGUgZnJhbWV3b3JrCisjIEluc3RhbGwgYSBudW1iZXIgb2Ygc3ltbGlua3MgdG8ga2VlcCBzb2Z0d2FyZSB0aGF0IGV4cGVjdHMgYSBub3JtYWwgdW5peAorIyBpbnN0YWxsICh3aGljaCBpbmNsdWRlcyBweXRob24tY29uZmlnKSBoYXBweS4KIGZyYW1ld29ya2luc3RhbGxtYWNsaWI6CisJbG4gLWZzICIuLi8uLi8uLi9QeXRob24iICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy9saWJweXRob24kKFZFUlNJT04pLmEiCiAJY2QgTWFjICYmICQoTUFLRSkgaW5zdGFsbG1hY3N1YnRyZWUgREVTVERJUj0iJChERVNURElSKSIKIAogIyBUaGlzIGluc3RhbGxzIHRoZSBJREUsIHRoZSBMYXVuY2hlciBhbmQgb3RoZXIgYXBwcyBpbnRvIC9BcHBsaWNhdGlvbnMKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCBlMzBjYzYxLi5lMTNiNTk0IDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0yNCw2ICsyNCw3IEBACiBKYXNvbiBBc2JhaHIKIERhdmlkIEFzY2hlcgogUGV0ZXIgxXN0cmFuZAorQ2hyaXMgQXRMZWUKIEpvaG4gQXljb2NrCiBEb25vdmFuIEJhYXJkYQogQXR0aWxhIEJhYm8KQEAgLTIwMiw4ICsyMDMsMTAgQEAKIFJ1c3NlbGwgRmlubgogTmlscyBGaXNjaGJlY2sKIEZyZWRlcmlrIEZpeAorTWF0dCBGbGVtaW5nCiBIZXJu4W4gTWFydO1uZXogRm9mZmFuaQogRG91ZyBGb3J0CitKb2huIEZvdWh5CiBNYXJ0aW4gRnJhbmtsaW4KIFJvYmluIEZyaWVkcmljaAogSXZhbiBGcm9obmUKQEAgLTQzMiw2ICs0MzUsNyBAQAogVGFrYWhpcm8gTmFrYXlhbWEKIFRyYXZlcnMgTmFyYW4KIEZyZWRyaWsgTmVocgorVG9ueSBOZWxzb24KIENoYWQgTmV0emVyCiBNYXggTmV1bmj2ZmZlcgogR2VvcmdlIE5ldmlsbGUtTmVpbApAQCAtNTI3LDYgKzUzMSw3IEBACiBTYXNraWEgdmFuIFJvc3N1bQogRG9uYWxkIFdhbGxhY2UgUm91c2UgSUkKIExpYW0gUm91dHQKK1NhbSBSdWJ5CiBQYXVsIFJ1YmluCiBBdWR1biBTLiBSdW5kZQogSmVmZiBSdXNoCkBAIC02MjAsNiArNjI1LDcgQEAKIEpvaG4gVHJvbXAKIEphc29uIFRyb3dicmlkZ2UKIEFudGhvbnkgVHVpbmluZ2EKK0NocmlzdG9waGVyIFR1ciBMZXNuaWV3c2tpLUxhYXMKIFN0ZXBoZW4gVHVybmVyCiBCaWxsIFR1dHQKIERvb2JlZSBSLiBUemVjawpkaWZmIC0tZ2l0IGEvTWlzYy9SRUFETUUuY292ZXJpdHkgYi9NaXNjL1JFQURNRS5jb3Zlcml0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWUxYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvTWlzYy9SRUFETUUuY292ZXJpdHkKQEAgLTAsMCArMSwyMiBAQAorCitDb3Zlcml0eSBoYXMgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCAoUHJldmVudCkgd2hpY2ggaXMgc2ltaWxhciB0byBLbG9jd29yay4KK1RoZXkgcnVuIHRoZWlyIHRvb2wgb24gdGhlIFB5dGhvbiBzb3VyY2UgY29kZSAoU1ZOIGhlYWQpIG9uIGEgZGFpbHkgYmFzaXMuCitUaGUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGF0OgorCisgICAgIGh0dHA6Ly9zY2FuLmNvdmVyaXR5LmNvbS8KKworQWJvdXQgMjAgcGVvcGxlIGhhdmUgYWNjZXNzIHRvIHRoZSBhbmFseXNpcyByZXBvcnRzLiAgT3RoZXIKK3Blb3BsZSBjYW4gYmUgYWRkZWQgYnkgcmVxdWVzdC4KKworUHJldmVudCB3YXMgZmlyc3QgcnVuIG9uIHRoZSBQeXRob24gMi41IHNvdXJjZSBjb2RlIGluIE1hcmNoIDIwMDYuCitUaGVyZSB3ZXJlIG9yaWdpbmFsbHkgYWJvdXQgMTAwIGRlZmVjdHMgcmVwb3J0ZWQuICBTb21lIG9mIHRoZXNlCit3ZXJlIGZhbHNlIHBvc2l0aXZlcy4gIE92ZXIgNzAgaXNzdWVzIHdlcmUgdW5jb3ZlcmVkLgorCitFYWNoIHdhcm5pbmcgaGFzIGEgdW5pcXVlIGlkIGFuZCBjb21tZW50cyB0aGF0IGNhbiBiZSBtYWRlIG9uIGl0LgorV2hlbiBjaGVja2luZyBpbiBjaGFuZ2VzIGR1ZSB0byBhIHdhcm5pbmcsIHRoZSB1bmlxdWUgaWQKK2FzIHJlcG9ydGVkIGJ5IHRoZSB0b29sIHdhcyBhZGRlZCB0byB0aGUgU1ZOIGNvbW1pdCBtZXNzYWdlLgorCitGYWxzZSBwb3NpdGl2ZXMgd2VyZSBhbm5vdGF0ZWQgc28gdGhhdCB0aGUgY29tbWVudHMgY2FuCitiZSByZXZpZXdlZCBhbmQgcmV2ZXJzZWQgaWYgdGhlIGFuYWx5c2lzIHdhcyBpbmNvcnJlY3QuCisKK0NvbnRhY3QgcHl0aG9uLWRldkBweXRob24ub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvTWlzYy9SRUFETUUua2xvY3dvcmsgYi9NaXNjL1JFQURNRS5rbG9jd29yawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI3MTVlCi0tLSAvZGV2L251bGwKKysrIGIvTWlzYy9SRUFETUUua2xvY3dvcmsKQEAgLTAsMCArMSwyNiBAQAorCitLbG9jd29yayBoYXMgYSBzdGF0aWMgYW5hbHlzaXMgdG9vbCAoSzcpIHdoaWNoIGlzIHNpbWlsYXIgdG8gQ292ZXJpdHkuCitUaGV5IHdpbGwgcnVuIHRoZWlyIHRvb2wgb24gdGhlIFB5dGhvbiBzb3VyY2UgY29kZSBvbiBkZW1hbmQuCitUaGUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGF0OgorCisgICAgIGh0dHBzOi8vb3BlbnNvdXJjZS5rbG9jd29yay5jb20vCisKK0N1cnJlbnRseSwgb25seSBOZWFsIE5vcndpdHogaGFzIGFjY2VzcyB0byB0aGUgYW5hbHlzaXMgcmVwb3J0cy4gIE90aGVyCitwZW9wbGUgY2FuIGJlIGFkZGVkIGJ5IHJlcXVlc3QuCisKK0s3IHdhcyBmaXJzdCBydW4gb24gdGhlIFB5dGhvbiAyLjUgc291cmNlIGNvZGUgaW4gbWlkLUp1bHkgMjAwNi4KK1RoaXMgaXMgYWZ0ZXIgQ292ZXJpdHkgaGFkIGJlZW4gbWFraW5nIHRoZWlyIHJlc3VsdHMgYXZhaWxhYmxlLgorVGhlcmUgd2VyZSBvcmlnaW5hbGx5IDE3NSBkZWZlY3RzIHJlcG9ydGVkLiAgTW9zdCBvZiB0aGVzZQord2VyZSBmYWxzZSBwb3NpdGl2ZXMuICBIb3dldmVyLCB0aGVyZSB3ZXJlIG51bWVyb3VzIHJlYWwgaXNzdWVzIAorYWxzbyB1bmNvdmVyZWQuCisKK0VhY2ggd2FybmluZyBoYXMgYSB1bmlxdWUgaWQgYW5kIGNvbW1lbnRzIHRoYXQgY2FuIGJlIG1hZGUgb24gaXQuCitXaGVuIGNoZWNraW5nIGluIGNoYW5nZXMgZHVlIHRvIGEgSzcgcmVwb3J0LCB0aGUgdW5pcXVlIGlkCithcyByZXBvcnRlZCBieSB0aGUgdG9vbCB3YXMgYWRkZWQgdG8gdGhlIFNWTiBjb21taXQgbWVzc2FnZS4KK0EgY29tbWVudCB3YXMgYWRkZWQgdG8gdGhlIEs3IHdhcm5pbmcgaW5kaWNhdGluZyB0aGUgU1ZOIHJldmlzaW9uCitpbiBhZGRpdGlvbiB0byBhbnkgYW5hbHlzaXMuCisKK0ZhbHNlIHBvc2l0aXZlcyB3ZXJlIGFsc28gYW5ub3RhdGVkIHNvIHRoYXQgdGhlIGNvbW1lbnRzIGNhbgorYmUgcmV2aWV3ZWQgYW5kIHJldmVyc2VkIGlmIHRoZSBhbmFseXNpcyB3YXMgaW5jb3JyZWN0LgorCitDb250YWN0IHB5dGhvbi1kZXZAcHl0aG9uLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL01pc2MvUlBNL3B5dGhvbi0yLjUuc3BlYyBiL01pc2MvUlBNL3B5dGhvbi0yLjUuc3BlYwppbmRleCBlMDUwNDU0Li5hZmJiMDllIDEwMDY0NAotLS0gYS9NaXNjL1JQTS9weXRob24tMi41LnNwZWMKKysrIGIvTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjCkBAIC0zMyw3ICszMyw3IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogJWRlZmluZSBuYW1lIHB5dGhvbgotJWRlZmluZSB2ZXJzaW9uIDIuNWEyCislZGVmaW5lIHZlcnNpb24gMi41YjMKICVkZWZpbmUgbGlidmVycyAyLjUKICVkZWZpbmUgcmVsZWFzZSAxcHlkb3RvcmcKICVkZWZpbmUgX19wcmVmaXggL3VzcgpkaWZmIC0tZ2l0IGEvTWlzYy9WaW0vcHl0aG9uLnZpbSBiL01pc2MvVmltL3B5dGhvbi52aW0KaW5kZXggOTcxMTA3Ni4uZDgzNTcyYSAxMDA2NDQKLS0tIGEvTWlzYy9WaW0vcHl0aG9uLnZpbQorKysgYi9NaXNjL1ZpbS9weXRob24udmltCkBAIC04NSw3ICs4NSw3IEBACiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBMb29rdXBFcnJvciBPU0Vycm9yIERlcHJlY2F0aW9uV2FybmluZwogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgVW5pY29kZUVycm9yIFVuaWNvZGVFbmNvZGVFcnJvcgogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgRmxvYXRpbmdQb2ludEVycm9yIFJlZmVyZW5jZUVycm9yIE5hbWVFcnJvcgotICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgT3ZlcmZsb3dXYXJuaW5nIElPRXJyb3IgU3ludGF4RXJyb3IKKyAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIElPRXJyb3IgU3ludGF4RXJyb3IKICAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIEZ1dHVyZVdhcm5pbmcgSW1wb3J0V2FybmluZyBTeXN0ZW1FeGl0CiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBFeGNlcHRpb24gRU9GRXJyb3IgU3RhbmRhcmRFcnJvciBWYWx1ZUVycm9yCiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBUYWJFcnJvciBLZXlFcnJvciBaZXJvRGl2aXNpb25FcnJvciBTeXN0ZW1FcnJvcgpkaWZmIC0tZ2l0IGEvTWlzYy9idWlsZC5zaCBiL01pc2MvYnVpbGQuc2gKaW5kZXggZGU1MTUzOS4uZmY0NmJiYSAxMDA3NTUKLS0tIGEvTWlzYy9idWlsZC5zaAorKysgYi9NaXNjL2J1aWxkLnNoCkBAIC01NCwxMyArNTQsMTkgQEAKIElOU1RBTExfRElSPSIvdG1wL3B5dGhvbi10ZXN0L2xvY2FsIgogUlNZTkNfT1BUUz0iLWFDIC1lIHNzaCIKIAorIyBBbHdheXMgcnVuIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBQeXRob24uCitQWVRIT049JElOU1RBTExfRElSL2Jpbi9weXRob24KKworIyBQeXRob24gb3B0aW9ucyBhbmQgcmVncmVzc2lvbiB0ZXN0IHByb2dyYW0gdGhhdCBzaG91bGQgYWx3YXlzIGJlIHJ1bi4KK1JFR1JURVNUX0FSR1M9Ii1FIC10dCAkSU5TVEFMTF9ESVIvbGliL3B5dGhvbjIuNS90ZXN0L3JlZ3J0ZXN0LnB5IgorCiBSRUZMT0c9ImJ1aWxkL3JlZmxvZy50eHQub3V0IgogIyBUaGVzZSB0ZXN0cyBhcmUgbm90IHN0YWJsZSBhbmQgZmFsc2VseSByZXBvcnQgbGVha3Mgc29tZXRpbWVzLgogIyBUaGUgZW50aXJlIGxlYWsgcmVwb3J0IHdpbGwgYmUgbWFpbGVkIGlmIGFueSB0ZXN0IG5vdCBpbiB0aGlzIGxpc3QgbGVha3MuCiAjIE5vdGU6IHRlc3RfWFhYIChub25lIGN1cnJlbnRseSkgcmVhbGx5IGxlYWssIGJ1dCBhcmUgZGlzYWJsZWQKICMgc28gd2UgZG9uJ3Qgc2VuZCBzcGFtLiAgQW55IHRlc3Qgd2hpY2ggcmVhbGx5IGxlYWtzIHNob3VsZCBvbmx5IAogIyBiZSBsaXN0ZWQgaGVyZSBpZiB0aGVyZSBhcmUgYWxzbyB0ZXN0IGNhc2VzIHVuZGVyIExpYi90ZXN0L2xlYWtlcnMuCi1MRUFLWV9URVNUUz0idGVzdF8oY3R5cGVzfGZpbGVjbXB8c29ja2V0fHRocmVhZGVkdGVtcGZpbGV8dGhyZWFkaW5nfHVybGxpYjIpIgorTEVBS1lfVEVTVFM9InRlc3RfKFhYWCkiICAjIEN1cnJlbnRseSBubyB0ZXN0cyBzaG91bGQgcmVwb3J0IHNwdXJpb3VzIGxlYWtzLgogCiAjIFNraXAgdGhlc2UgdGVzdHMgYWx0b2dldGhlciB3aGVuIGxvb2tpbmcgZm9yIGxlYWtzLiAgVGhlc2UgdGVzdHMKICMgZG8gbm90IG5lZWQgdG8gYmUgc3RvcmVkIGFib3ZlIGluIExFQUtZX1RFU1RTIHRvby4KQEAgLTE1NSwyMSArMTYxLDMxIEBACiAgICAgICAgICAgICBtYWtlIGluc3RhbGwgPiYgYnVpbGQvJEYKICAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIkluc3RhbGxpbmciICIkRiIgJHN0YXJ0CiAKKyAgICAgICAgICAgIGlmIFsgISAteCAkUFlUSE9OIF07IHRoZW4KKyAgICAgICAgICAgICAgICBsbiAtcyAke1BZVEhPTn0yLiogJFBZVEhPTgorICAgICAgICAgICAgZmkKKwogICAgICAgICAgICAgIyMgbWFrZSBhbmQgcnVuIGJhc2ljIHRlc3RzCiAgICAgICAgICAgICBGPW1ha2UtdGVzdC5vdXQKICAgICAgICAgICAgIHN0YXJ0PWBjdXJyZW50X3RpbWVgCi0gICAgICAgICAgICBtYWtlIHRlc3QgPiYgYnVpbGQvJEYKKyAgICAgICAgICAgICRQWVRIT04gJFJFR1JURVNUX0FSR1MgPiYgYnVpbGQvJEYKICAgICAgICAgICAgIE5VTV9GQUlMVVJFUz1gZ3JlcCAtaWMgIiBmYWlsZWQ6IiBidWlsZC8kRmAKICAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3RpbmcgYmFzaWNzICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKLSAgICAgICAgICAgICMjIEZJWE1FOiBzaG91bGQgbWFpbCBzaW5jZSAtdWFsbCBiZWxvdyBzaG91bGQgZmluZCBzYW1lIHByb2JsZW1zCiAgICAgICAgICAgICBtYWlsX29uX2ZhaWx1cmUgImJhc2ljcyIgYnVpbGQvJEYKIAorICAgICAgICAgICAgRj1tYWtlLXRlc3Qtb3B0Lm91dAorICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKKyAgICAgICAgICAgICRQWVRIT04gLU8gJFJFR1JURVNUX0FSR1MgPiYgYnVpbGQvJEYKKyAgICAgICAgICAgIE5VTV9GQUlMVVJFUz1gZ3JlcCAtaWMgIiBmYWlsZWQ6IiBidWlsZC8kRmAKKyAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3Rpbmcgb3B0ICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKKyAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAib3B0IiBidWlsZC8kRgorCiAgICAgICAgICAgICAjIyBydW4gdGhlIHRlc3RzIGxvb2tpbmcgZm9yIGxlYWtzCiAgICAgICAgICAgICBGPW1ha2UtdGVzdC1yZWZsZWFrLm91dAogICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKICAgICAgICAgICAgICMjIGVuc3VyZSB0aGF0IHRoZSByZWZsb2cgZXhpc3RzIHNvIHRoZSBncmVwIGRvZXNuJ3QgZmFpbAogICAgICAgICAgICAgdG91Y2ggJFJFRkxPRwotICAgICAgICAgICAgLi9weXRob24gLi9MaWIvdGVzdC9yZWdydGVzdC5weSAtUiA0OjM6JFJFRkxPRyAtdSBuZXR3b3JrICRMRUFLWV9TS0lQUyA+JiBidWlsZC8kRgorICAgICAgICAgICAgJFBZVEhPTiAkUkVHUlRFU1RfQVJHUyAtUiA0OjM6JFJFRkxPRyAtdSBuZXR3b3JrICRMRUFLWV9TS0lQUyA+JiBidWlsZC8kRgogICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBlZ3JlcCAtdmMgIiRMRUFLWV9URVNUUyIgJFJFRkxPR2AKICAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3RpbmcgcmVmbGVha3MgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAogICAgICAgICAgICAgbWFpbF9vbl9mYWlsdXJlICJyZWZsZWFrIiAkUkVGTE9HCkBAIC0xNzksNyArMTk1LDcgQEAKICAgICAgICAgICAgIHN0YXJ0PWBjdXJyZW50X3RpbWVgCiAgICAgICAgICAgICAjIyBza2lwIGN1cnNlcyB3aGVuIHJ1bm5pbmcgZnJvbSBjcm9uIHNpbmNlIHRoZXJlJ3Mgbm8gdGVybWluYWwKICAgICAgICAgICAgICMjIHNraXAgc291bmQgc2luY2UgaXQncyBub3Qgc2V0dXAgb24gdGhlIFBTRiBib3ggKC9kZXYvZHNwKQotICAgICAgICAgICAgLi9weXRob24gLUUgLXR0IC4vTGliL3Rlc3QvcmVncnRlc3QucHkgLXVhbGwgLXggdGVzdF9jdXJzZXMgdGVzdF9saW51eGF1ZGlvZGV2IHRlc3Rfb3NzYXVkaW9kZXYgPiYgYnVpbGQvJEYKKyAgICAgICAgICAgICRQWVRIT04gJFJFR1JURVNUX0FSR1MgLXVhbGwgLXggdGVzdF9jdXJzZXMgdGVzdF9saW51eGF1ZGlvZGV2IHRlc3Rfb3NzYXVkaW9kZXYgPiYgYnVpbGQvJEYKICAgICAgICAgICAgIE5VTV9GQUlMVVJFUz1gZ3JlcCAtaWMgIiBmYWlsZWQ6IiBidWlsZC8kRmAKICAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMgIlRlc3RpbmcgYWxsIGV4Y2VwdCBjdXJzZXMgYW5kIHNvdW5kICgkTlVNX0ZBSUxVUkVTIGZhaWx1cmVzKSIgIiRGIiAkc3RhcnQKICAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAiYWxsIiBidWlsZC8kRgpAQCAtMTg5LDcgKzIwNSw3IEBACiAKIAogIyMgbWFrZSBkb2MKLWNkIERvYworY2QgJERJUi9Eb2MKIEY9Im1ha2UtZG9jLm91dCIKIHN0YXJ0PWBjdXJyZW50X3RpbWVgCiBtYWtlID4mIC4uL2J1aWxkLyRGCmRpZmYgLS1naXQgYS9NaXNjL2NoZWF0c2hlZXQgYi9NaXNjL2NoZWF0c2hlZXQKaW5kZXggMDI0NTQ1ZC4uYjBlMWNjZSAxMDA2NDQKLS0tIGEvTWlzYy9jaGVhdHNoZWV0CisrKyBiL01pc2MvY2hlYXRzaGVldApAQCAtMTEyNSw3ICsxMTI1LDYgQEAKICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nCiAgICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcKICAgICAgICAgICAgICAgU3ludGF4V2FybmluZwotICAgICAgICAgICAgICBPdmVyZmxvd1dhcm5pbmcKICAgICAgICAgICAgICAgUnVudGltZVdhcm5pbmcKICAgICAgICAgICAgICAgRnV0dXJlV2FybmluZwogCmRpZmYgLS1naXQgYS9NaXNjL3B5dGhvbi1jb25maWcuaW4gYi9NaXNjL3B5dGhvbi1jb25maWcuaW4KaW5kZXggMjRlNjk5ZS4uZTAyMTVhMiAxMDA2NDQKLS0tIGEvTWlzYy9weXRob24tY29uZmlnLmluCisrKyBiL01pc2MvcHl0aG9uLWNvbmZpZy5pbgpAQCAtMSw0ICsxLDQgQEAKLSMhQEJJTkRJUkAvcHl0aG9uCisjIUBFWEVOQU1FQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKQEAgLTM2LDEzICszNiwxNCBAQAogICAgIHByaW50IHN5c2NvbmZpZy5FWEVDX1BSRUZJWAogCiBlbGlmIG9wdCBpbiAoJy0taW5jbHVkZXMnLCAnLS1jZmxhZ3MnKToKLSAgICBmbGFncyA9IFsnLUknK2RpciBmb3IgZGlyIGluIGdldHZhcignSU5DTERJUlNUT01BS0UnKS5zcGxpdCgpXQorICAgIGZsYWdzID0gWyctSScgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMoKSwKKyAgICAgICAgICAgICAnLUknICsgc3lzY29uZmlnLmdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9VHJ1ZSldCiAgICAgaWYgb3B0ID09ICctLWNmbGFncyc6CiAgICAgICAgIGZsYWdzLmV4dGVuZChnZXR2YXIoJ0NGTEFHUycpLnNwbGl0KCkpCiAgICAgcHJpbnQgJyAnLmpvaW4oZmxhZ3MpCiAKIGVsaWYgb3B0IGluICgnLS1saWJzJywgJy0tbGRmbGFncycpOgotICAgIGxpYnMgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xJQlMnKS5zcGxpdCgpCisgICAgbGlicyA9IGdldHZhcignTElCUycpLnNwbGl0KCkgKyBnZXR2YXIoJ1NZU0xJQlMnKS5zcGxpdCgpCiAgICAgbGlicy5hcHBlbmQoJy1scHl0aG9uJytweXZlcikKICAgICBpZiBvcHQgPT0gJy0tbGRmbGFncyc6CiAgICAgICAgIGxpYnMuaW5zZXJ0KDAsICctTCcgKyBnZXR2YXIoJ0xJQlBMJykpCmRpZmYgLS1naXQgYS9NaXNjL3ZhbGdyaW5kLXB5dGhvbi5zdXBwIGIvTWlzYy92YWxncmluZC1weXRob24uc3VwcAppbmRleCAyNjg4Zjc5Li40YTY3MTBlIDEwMDY0NAotLS0gYS9NaXNjL3ZhbGdyaW5kLXB5dGhvbi5zdXBwCisrKyBiL01pc2MvdmFsZ3JpbmQtcHl0aG9uLnN1cHAKQEAgLTEzNCw2ICsxMzQsMTUgQEAKICMjIwogCiB7CisgICBHZW5lcmljIGdlbnRvbyBsZCBwcm9ibGVtcworICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi9saWIvbGQtMi4zLjQuc28KKyAgIG9iajovbGliL2xkLTIuMy40LnNvCisgICBvYmo6L2xpYi9sZC0yLjMuNC5zbworICAgb2JqOi9saWIvbGQtMi4zLjQuc28KK30KKworewogICAgREJNIHByb2JsZW1zLCBzZWUgdGVzdF9kYm0KICAgIE1lbWNoZWNrOlBhcmFtCiAgICB3cml0ZShidWYpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL1NldHVwLmRpc3QgYi9Nb2R1bGVzL1NldHVwLmRpc3QKaW5kZXggMWIyNTAyZC4uNDZmNDI1MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9TZXR1cC5kaXN0CisrKyBiL01vZHVsZXMvU2V0dXAuZGlzdApAQCAtNTksNyArNTksNyBAQAogIwogIyBJbiBhZGRpdGlvbiwgKnN0YXRpYyogZXhwbGljaXRseSBkZWNsYXJlcyB0aGUgZm9sbG93aW5nIG1vZHVsZXMgdG8KICMgYmUgc3RhdGljLiAgTGluZXMgY29udGFpbmluZyAiKnN0YXRpYyoiIGFuZCAiKnNoYXJlZCoiIG1heSB0aHVzCi0jIGFsdGVybmF0ZSB0aG91Z2hvdXQgdGhpcyBmaWxlLgorIyBhbHRlcm5hdGUgdGhyb3VnaG91dCB0aGlzIGZpbGUuCiAKICMgTk9URTogQXMgYSBzdGFuZGFyZCBwb2xpY3ksIGFzIG1hbnkgbW9kdWxlcyBhcyBjYW4gYmUgc3VwcG9ydGVkIGJ5IGEKICMgcGxhdGZvcm0gc2hvdWxkIGJlIHByZXNlbnQuICBUaGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggYWxsIG1vZHVsZXMKQEAgLTIzNCwxNiArMjM0LDE5IEBACiAjcmdiaW1nIHJnYmltZ21vZHVsZS5jCSMgUmVhZCBTR0kgUkdCIGltYWdlIGZpbGVzIChidXQgY29kZWQgcG9ydGFibHkpCiAKIAotIyBUaGUgbWQ1IG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUKKyMgTm90ZSB0aGF0IHRoZSBfbWQ1IGFuZCBfc2hhIG1vZHVsZXMgYXJlIG5vcm1hbGx5IG9ubHkgYnVpbHQgaWYgdGhlCisjIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBPcGVuU1NMIGxpYnMgY29udGFpbmluZyBhbiBvcHRpbWl6ZWQgdmVyc2lvbi4KKworIyBUaGUgX21kNSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1CiAjIE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQyAxMzIxLiAgVGhlIG5lY2Vzc2FyeSBmaWxlcwogIyBtZDUuYyBhbmQgbWQ1LmggYXJlIGluY2x1ZGVkIGhlcmUuCiAKLSNtZDUgbWQ1bW9kdWxlLmMgbWQ1LmMKKyNfbWQ1IG1kNW1vZHVsZS5jIG1kNS5jCiAKIAotIyBUaGUgc2hhIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBTSEEgY2hlY2tzdW0gYWxnb3JpdGhtLgorIyBUaGUgX3NoYSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgU0hBIGNoZWNrc3VtIGFsZ29yaXRobS4KICMgKE5JU1QncyBTZWN1cmUgSGFzaCBBbGdvcml0aG0uKQotI3NoYSBzaGFtb2R1bGUuYworI19zaGEgc2hhbW9kdWxlLmMKIAogCiAjIFNHSSBJUklYIHNwZWNpZmljIG1vZHVsZXMgLS0gb2ZmIGJ5IGRlZmF1bHQuCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ic2RkYi5jIGIvTW9kdWxlcy9fYnNkZGIuYwppbmRleCA5MjIwODY2Li4yYTNhYzVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ic2RkYi5jCisrKyBiL01vZHVsZXMvX2JzZGRiLmMKQEAgLTk4LDEyICs5OCwxMiBAQAogI2Vycm9yICJlZWshIERCVkVSIGNhbid0IGhhbmRsZSBtaW5vciB2ZXJzaW9ucyA+IDkiCiAjZW5kaWYKIAotI2RlZmluZSBQWV9CU0REQl9WRVJTSU9OICI0LjQuNCIKKyNkZWZpbmUgUFlfQlNEREJfVkVSU0lPTiAiNC40LjUiCiBzdGF0aWMgY2hhciAqcmNzX2lkID0gIiRJZCQiOwogCiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotI2RlZmluZSBQeV9zc2l6ZV90ICAgICAgaW50Cit0eXBlZGVmIGludCBQeV9zc2l6ZV90OwogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1RIUkVBRApAQCAtNTI4LDYgKzUyOCw3IEBACiAgICAgUHlPYmplY3QgKmVyck9iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVyclR1cGxlID0gTlVMTDsKICAgICBpbnQgZXhjZXB0aW9uUmFpc2VkID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfbGVmdDsKIAogICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzZnVsLCBubyBlcnJvciAqLyAgICAgIGJyZWFrOwpAQCAtNTM1LDEyICs1MzYsMTUgQEAKICNpZiAoREJWRVIgPCA0MSkKICAgICAgICAgY2FzZSBEQl9JTkNPTVBMRVRFOgogI2lmIElOQ09NUExFVEVfSVNfV0FSTklORwotICAgICAgICAgICAgb3VyX3N0cmxjcHkoZXJyVHh0LCBkYl9zdHJlcnJvcihlcnIpLCBzaXplb2YoZXJyVHh0KSk7Ci0gICAgICAgICAgICBpZiAoX2RiX2Vycm1zZ1swXSkgeworICAgICAgICAgICAgYnl0ZXNfbGVmdCA9IG91cl9zdHJsY3B5KGVyclR4dCwgZGJfc3RyZXJyb3IoZXJyKSwgc2l6ZW9mKGVyclR4dCkpOworICAgICAgICAgICAgLyogRW5zdXJlIHRoYXQgYnl0ZXNfbGVmdCBuZXZlciBnb2VzIG5lZ2F0aXZlICovCisgICAgICAgICAgICBpZiAoX2RiX2Vycm1zZ1swXSAmJiBieXRlc19sZWZ0IDwgKHNpemVvZihlcnJUeHQpIC0gNCkpIHsKKyAgICAgICAgICAgICAgICBieXRlc19sZWZ0ID0gc2l6ZW9mKGVyclR4dCkgLSBieXRlc19sZWZ0IC0gNCAtIDE7CisJCWFzc2VydChieXRlc19sZWZ0ID49IDApOwogICAgICAgICAgICAgICAgIHN0cmNhdChlcnJUeHQsICIgLS0gIik7Ci0gICAgICAgICAgICAgICAgc3RyY2F0KGVyclR4dCwgX2RiX2Vycm1zZyk7Ci0gICAgICAgICAgICAgICAgX2RiX2Vycm1zZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgc3RybmNhdChlcnJUeHQsIF9kYl9lcnJtc2csIGJ5dGVzX2xlZnQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgX2RiX2Vycm1zZ1swXSA9IDA7CiAjaWZkZWYgSEFWRV9XQVJOSU5HUwogICAgICAgICAgICAgZXhjZXB0aW9uUmFpc2VkID0gUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywgZXJyVHh0KTsKICNlbHNlCkBAIC01ODgsMTIgKzU5MiwxNSBAQAogICAgIH0KIAogICAgIGlmIChlcnJPYmogIT0gTlVMTCkgewotICAgICAgICBvdXJfc3RybGNweShlcnJUeHQsIGRiX3N0cmVycm9yKGVyciksIHNpemVvZihlcnJUeHQpKTsKLSAgICAgICAgaWYgKF9kYl9lcnJtc2dbMF0pIHsKKyAgICAgICAgYnl0ZXNfbGVmdCA9IG91cl9zdHJsY3B5KGVyclR4dCwgZGJfc3RyZXJyb3IoZXJyKSwgc2l6ZW9mKGVyclR4dCkpOworICAgICAgICAvKiBFbnN1cmUgdGhhdCBieXRlc19sZWZ0IG5ldmVyIGdvZXMgbmVnYXRpdmUgKi8KKyAgICAgICAgaWYgKF9kYl9lcnJtc2dbMF0gJiYgYnl0ZXNfbGVmdCA8IChzaXplb2YoZXJyVHh0KSAtIDQpKSB7CisgICAgICAgICAgICBieXRlc19sZWZ0ID0gc2l6ZW9mKGVyclR4dCkgLSBieXRlc19sZWZ0IC0gNCAtIDE7CisgICAgICAgICAgICBhc3NlcnQoYnl0ZXNfbGVmdCA+PSAwKTsKICAgICAgICAgICAgIHN0cmNhdChlcnJUeHQsICIgLS0gIik7Ci0gICAgICAgICAgICBzdHJjYXQoZXJyVHh0LCBfZGJfZXJybXNnKTsKLSAgICAgICAgICAgIF9kYl9lcnJtc2dbMF0gPSAwOworICAgICAgICAgICAgc3RybmNhdChlcnJUeHQsIF9kYl9lcnJtc2csIGJ5dGVzX2xlZnQpOwogICAgICAgICB9CisgICAgICAgIF9kYl9lcnJtc2dbMF0gPSAwOwogCiAJZXJyVHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBlcnJUeHQpOwogICAgICAgICBQeUVycl9TZXRPYmplY3QoZXJyT2JqLCBlcnJUdXBsZSk7CkBAIC03OTgsMTAgKzgwNSwxMiBAQAogCiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwogICAgIGVyciA9IGRiX2NyZWF0ZSgmc2VsZi0+ZGIsIGRiX2VudiwgZmxhZ3MpOwotICAgIHNlbGYtPmRiLT5zZXRfZXJyY2FsbChzZWxmLT5kYiwgX2RiX2Vycm9yQ2FsbGJhY2spOworICAgIGlmIChzZWxmLT5kYiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmRiLT5zZXRfZXJyY2FsbChzZWxmLT5kYiwgX2RiX2Vycm9yQ2FsbGJhY2spOwogI2lmIChEQlZFUiA+PSAzMykKLSAgICBzZWxmLT5kYi0+YXBwX3ByaXZhdGUgPSAodm9pZCopc2VsZjsKKyAgICAgICAgc2VsZi0+ZGItPmFwcF9wcml2YXRlID0gKHZvaWQqKXNlbGY7CiAjZW5kaWYKKyAgICB9CiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKICAgICAvKiBUT0RPIGFkZCBhIHdlYWtyZWYoc2VsZikgdG8gdGhlIHNlbGYtPm15ZW52b2JqLT5vcGVuX2NoaWxkX3dlYWtyZWZzCiAgICAgICogbGlzdCBzbyB0aGF0IGEgREJFbnYgY2FuIHJlZnVzZSB0byBjbG9zZSB3aXRob3V0IGFib3J0aW5nIGFueSBvcGVuCkBAIC0yNjgxLDEyICsyNjkwLDEzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBNYXBwaW5nIGFuZCBEaWN0aW9uYXJ5LWxpa2UgYWNjZXNzIHJvdXRpbmVzICovCiAKLVB5X3NzaXplX3QgREJfbGVuZ3RoKERCT2JqZWN0KiBzZWxmKQorUHlfc3NpemVfdCBEQl9sZW5ndGgoUHlPYmplY3QqIF9zZWxmKQogewogICAgIGludCBlcnI7CiAgICAgUHlfc3NpemVfdCBzaXplID0gMDsKICAgICBpbnQgZmxhZ3MgPSAwOwogICAgIHZvaWQqIHNwOworICAgIERCT2JqZWN0KiBzZWxmID0gKERCT2JqZWN0Kilfc2VsZjsKIAogICAgIGlmIChzZWxmLT5kYiA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICp0ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIDAsICJEQiBvYmplY3QgaGFzIGJlZW4gY2xvc2VkIik7CkBAIC0yNzIwLDYgKzI3MzAsOCBAQAogICAgICAqLwogICAgIGlmIChzaXplID09IDAgJiYgKGZsYWdzICYgREJfRkFTVF9TVEFUKSkgewogICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGlmICghZXJyKQorICAgICAgICAgICAgZnJlZShzcCk7CiAgICAgICAgIGdvdG8gcmVkb19zdGF0X2Zvcl9sZW5ndGg7CiAgICAgfQogCkBAIC0zODY0LDcgKzM4NzYsNyBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJmaWxlIiwgImRhdGFiYXNlIiwgInR4biIsICJmbGFncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3N8T2k6ZGJyZW1vdmUiLCBrd25hbWVzLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ek9pOmRicmVtb3ZlIiwga3duYW1lcywKIAkJJmZpbGUsICZkYXRhYmFzZSwgJnR4bm9iaiwgJmZsYWdzKSkgewogCXJldHVybiBOVUxMOwogICAgIH0KQEAgLTM4OTIsNyArMzkwNCw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgImZpbGUiLCAiZGF0YWJhc2UiLCAibmV3bmFtZSIsICJ0eG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsIE5VTEwgfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNzc3xPaTpkYnJlbmFtZSIsIGt3bmFtZXMsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3pzfE9pOmRicmVuYW1lIiwga3duYW1lcywKIAkJJmZpbGUsICZkYXRhYmFzZSwgJm5ld25hbWUsICZ0eG5vYmosICZmbGFncykpIHsKIAlyZXR1cm4gTlVMTDsKICAgICB9CkBAIC01MTUzLDExICs1MTY1LDcgQEAKIAogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBEQl9tYXBwaW5nID0gewotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAgIChpbnF1aXJ5KURCX2xlbmd0aCwgICAgICAgICAgLyptcF9sZW5ndGgqLwotI2Vsc2UKLSAgICAgICAgKGxlbmZ1bmMpREJfbGVuZ3RoLCAgICAgICAgICAvKm1wX2xlbmd0aCovCi0jZW5kaWYKKyAgICAgICAgREJfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAvKm1wX2xlbmd0aCovCiAgICAgICAgIChiaW5hcnlmdW5jKURCX3N1YnNjcmlwdCwgICAgLyptcF9zdWJzY3JpcHQqLwogICAgICAgICAob2Jqb2JqYXJncHJvYylEQl9hc3Nfc3ViLCAgIC8qbXBfYXNzX3N1YnNjcmlwdCovCiB9OwpAQCAtNTU2MCwxNSArNTU2OCwxMyBAQAogc3RhdGljIFB5T2JqZWN0KgogREJTZXF1ZW5jZV9jb25zdHJ1Y3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQogewotICAgIFB5T2JqZWN0KiBkYm9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QqIGRib2JqOwogICAgIGludCBmbGFncyA9IDA7CiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgImRiIiwgImZsYWdzIiwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfGk6REJTZXF1ZW5jZSIsIGt3bmFtZXMsICZkYm9iaiwgJmZsYWdzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGRib2JqID09IFB5X05vbmUpCi0gICAgICAgIGRib2JqID0gTlVMTDsKLSAgICBlbHNlIGlmIChkYm9iaiAmJiAhREJPYmplY3RfQ2hlY2soZGJvYmopKSB7CisgICAgaWYgKCFEQk9iamVjdF9DaGVjayhkYm9iaikpIHsKICAgICAgICAgbWFrZVR5cGVFcnJvcigiREIiLCBkYm9iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggMzJmYTgyZi4uNDA1ZmQ3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTQ3OSwxNSArNDc5LDIwIEBACiAJICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNvbnN0IGNoYXIgKmRhdGE7Ci0gICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3VtZWQ7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBpbnQgZmluYWwgPSAwOworICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6Om1iY3NfZGVjb2RlIiwKLQkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHppOm1iY3NfZGVjb2RlIiwKKwkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzLCAmZmluYWwpKQogCXJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9EZWNvZGVNQkNTKGRhdGEsIHNpemUsIGVycm9ycyksCi0JCSAgICAgICBzaXplKTsKKyAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZU1CQ1NTdGF0ZWZ1bCgKKwlkYXRhLCBzaXplLCBlcnJvcnMsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgaWYgKCFkZWNvZGVkKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBmaW5hbCA/IHNpemUgOiBjb25zdW1lZCk7CiB9CiAKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCBhMDc0NGZmLi43NmQ4OGRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTEsMyArMSw4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCiAvKgogICBUb0RvOgogCkBAIC0zNDIsNiArMzQ3LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX3JlcGVhdChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBsZW5ndGgpCiB7CisJaWYgKGxlbmd0aCA8IDApCisJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQorCQkJCSAgICAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgPj0gMCwgbm90ICVkIiwKKyNlbHNlCisJCQkJICAgICJBcnJheSBsZW5ndGggbXVzdCBiZSA+PSAwLCBub3QgJXpkIiwKKyNlbmRpZgorCQkJCSAgICBsZW5ndGgpOwogCXJldHVybiBDcmVhdGVBcnJheVR5cGUoc2VsZiwgbGVuZ3RoKTsKIH0KIApAQCAtMTM3MSwxMyArMTM4NCwyMCBAQAogCQlQeV9ERUNSRUYocmVzdWx0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOworCWlmIChmbXQgPT0gTlVMTCkgeworCQlQeV9ERUNSRUYocmVzdWx0KTsKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkgICAgICJfdHlwZV8gJyVzJyBub3Qgc3VwcG9ydGVkIiwKKwkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHByb3RvKSk7CisJCXJldHVybiBOVUxMOworCX0KKwogCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCiAJCShQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOwogCWlmICghc3RnZGljdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmbXQgPSBnZXRlbnRyeShQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKLQogCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CiAJc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OwogCXN0Z2RpY3QtPmxlbmd0aCA9IDA7CkBAIC0xNjIwLDkgKzE2NDAsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5BcmdzOyArK2kpIHsKIAkJUHlPYmplY3QgKnRwID0gUHlUdXBsZV9HRVRfSVRFTShvYiwgaSk7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0cCk7CiAJCVB5T2JqZWN0ICpjbnYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRwLCAiZnJvbV9wYXJhbSIpOwotCQlpZiAoIWRpY3QgfHwgIWNudikKKwkJaWYgKCFjbnYpCiAJCQlnb3RvIGFyZ3R5cGVzX2Vycm9yXzE7CiAJCVB5VHVwbGVfU0VUX0lURU0oY29udmVydGVycywgaSwgY252KTsKIAl9CkBAIC0xNjMzLDcgKzE2NTIsNyBAQAogCVB5X1hERUNSRUYoY29udmVydGVycyk7CiAJUHlfREVDUkVGKG9iKTsKIAlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJpdGVtICVkIGluIF9hcmd0eXBlc18gaXMgbm90IGEgdmFsaWQgQyB0eXBlIiwgaSsxKTsKKwkJICAgICAiaXRlbSAlZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsIGkrMSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE4MDksMjMgKzE4MjgsNTMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXVuaXF1ZV9rZXkoQ0RhdGFPYmplY3QgKnRhcmdldCwgaW50IGluZGV4KQordW5pcXVlX2tleShDRGF0YU9iamVjdCAqdGFyZ2V0LCBQeV9zc2l6ZV90IGluZGV4KQogewotCWNoYXIgc3RyaW5nWzI1Nl07IC8qIFhYWCBpcyB0aGF0IGVub3VnaD8gKi8KKwljaGFyIHN0cmluZ1syNTZdOwogCWNoYXIgKmNwID0gc3RyaW5nOwotCSpjcCsrID0gaW5kZXggKyAnMCc7CisJc2l6ZV90IGJ5dGVzX2xlZnQ7CisKKwlhc3NlcnQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKKwljcCArPSBzcHJpbnRmKGNwLCAiJXgiLCBpbmRleCk7CisjZWxzZQorCWNwICs9IHNwcmludGYoY3AsICIleCIsIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworI2VuZGlmCiAJd2hpbGUgKHRhcmdldC0+Yl9iYXNlKSB7Ci0JCSpjcCsrID0gdGFyZ2V0LT5iX2luZGV4ICsgJzAnOworCQlieXRlc19sZWZ0ID0gc2l6ZW9mKHN0cmluZykgLSAoY3AgLSBzdHJpbmcpIC0gMTsKKwkJLyogSGV4IGZvcm1hdCBuZWVkcyAyIGNoYXJhY3RlcnMgcGVyIGJ5dGUgKi8KKwkJaWYgKGJ5dGVzX2xlZnQgPCBzaXplb2YoUHlfc3NpemVfdCkgKiAyKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkJCQkJImN0eXBlcyBvYmplY3Qgc3RydWN0dXJlIHRvbyBkZWVwIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisJCWNwICs9IHNwcmludGYoY3AsICI6JXgiLCAoaW50KXRhcmdldC0+Yl9pbmRleCk7CisjZWxzZQorCQljcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgUHlfU0FGRV9ET1dOQ0FTVCh0YXJnZXQtPmJfaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworI2VuZGlmCiAJCXRhcmdldCA9IHRhcmdldC0+Yl9iYXNlOwogCX0KIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyaW5nLCBjcC1zdHJpbmcpOwogfQotLyogS2VlcCBhIHJlZmVyZW5jZSB0byAna2VlcCcgaW4gdGhlICd0YXJnZXQnLCBhdCBpbmRleCAnaW5kZXgnICovCisKIC8qCi0gKiBLZWVwUmVmIHRyYXZlbHMgdGhlIHRhcmdldCdzIGJfYmFzZSBwb2ludGVyIGRvd24gdG8gdGhlIHJvb3QsCi0gKiBidWlsZGluZyBhIHNlcXVlbmNlIG9mIGluZGV4ZXMgZHVyaW5nIHRoZSBwYXRoLiAgVGhlIGluZGV4ZXMsIHdoaWNoIGFyZSBhCi0gKiBjb3VwbGUgb2Ygc21hbGwgaW50ZWdlcnMsIGFyZSB1c2VkIHRvIGJ1aWxkIGEgYnl0ZSBzdHJpbmcgdXNhYmxlIGFzCi0gKiBrZXkgaW50IHRoZSByb290IG9iamVjdCdzIF9vYmplY3RzIGRpY3QuCisgKiBLZWVwIGEgcmVmZXJlbmNlIHRvICdrZWVwJyBpbiB0aGUgJ3RhcmdldCcsIGF0IGluZGV4ICdpbmRleCcuCisgKgorICogSWYgJ2tlZXAnIGlzIE5vbmUsIGRvIG5vdGhpbmcuCisgKgorICogT3RoZXJ3aXNlIGNyZWF0ZSBhIGRpY3Rpb25hcnkgKGlmIGl0IGRvZXMgbm90IHlldCBleGlzdCkgaWQgdGhlIHJvb3QKKyAqIG9iamVjdHMgJ2Jfb2JqZWN0cycgaXRlbSwgd2hpY2ggd2lsbCBzdG9yZSB0aGUgJ2tlZXAnIG9iamVjdCB1bmRlciBhIHVuaXF1ZQorICoga2V5LgorICoKKyAqIFRoZSB1bmlxdWVfa2V5IGhlbHBlciB0cmF2ZWxzIHRoZSB0YXJnZXQncyBiX2Jhc2UgcG9pbnRlciBkb3duIHRvIHRoZSByb290LAorICogYnVpbGRpbmcgYSBzdHJpbmcgY29udGFpbmluZyBoZXgtZm9ybWF0dGVkIGluZGV4ZXMgZm91bmQgZHVyaW5nIHRyYXZlcnNhbCwKKyAqIHNlcGFyYXRlZCBieSBjb2xvbnMuCisgKgorICogVGhlIGluZGV4IHR1cGxlIGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgcm9vdCBvYmplY3QncyBiX29iamVjdHMgZGljdC4KKyAqCisgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHN0ZWFscyBhIHJlZmNvdW50IG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgZXZlbiBpZiBpdAorICogZmFpbHMhCiAgKi8KIHN0YXRpYyBpbnQKIEtlZXBSZWYoQ0RhdGFPYmplY3QgKnRhcmdldCwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKmtlZXApCkBAIC0xODQ2LDYgKzE4OTUsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7CisJaWYgKGtleSA9PSBOVUxMKSB7CisJCVB5X0RFQ1JFRihrZWVwKTsKKwkJcmV0dXJuIC0xOworCX0KIAlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOwogCVB5X0RFQ1JFRihrZXkpOwogCVB5X0RFQ1JFRihrZWVwKTsKQEAgLTIxMzQsNyArMjE4Nyw3IEBACiAJCQlQeV9ERUNSRUYob2IpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfSBlbHNlIGlmICh2YWx1ZSA9PSBQeV9Ob25lICYmIFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKSB7Ci0JCQkqKHZvaWQgKiopZHN0LT5iX3B0ciA9IE5VTEw7CisJCQkqKHZvaWQgKiopcHRyID0gTlVMTDsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXJldHVybiBQeV9Ob25lOwogCQl9IGVsc2UgewpAQCAtMjYxMSwxMSArMjY2NCwxMSBAQAogCiAJKih2b2lkICoqKXNlbGYtPmJfcHRyID0gYWRkcmVzczsKIAorCVB5X0lOQ1JFRigoUHlPYmplY3QgKilkbGwpOyAvKiBmb3IgS2VlcFJlZiAqLwogCWlmICgtMSA9PSBLZWVwUmVmKChDRGF0YU9iamVjdCAqKXNlbGYsIDAsIGRsbCkpIHsKIAkJUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKWRsbCk7IC8qIGZvciBLZWVwUmVmIGFib3ZlICovCiAKIAlQeV9JTkNSRUYoc2VsZik7CiAJc2VsZi0+Y2FsbGFibGUgPSAoUHlPYmplY3QgKilzZWxmOwpAQCAtMjc1MSwxMSArMjgwNCwxMSBAQAogCSAgIGNvcnJlY3RseS4uLgogCSovCiAKKwlQeV9JTkNSRUYoKFB5T2JqZWN0ICopc2VsZik7IC8qIGZvciBLZWVwUmVmICovCiAJaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgKFB5T2JqZWN0ICopc2VsZikpIHsKIAkJUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKXNlbGYpOyAvKiBmb3IgS2VlcFJlZiBhYm92ZSAqLwogCiAJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CkBAIC0zNTIwLDYgKzM1NzMsNyBAQAogCWludCBvZmZzZXQsIHNpemU7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAorCiAJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5iX2xlbmd0aCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKIAkJCQkiaW52YWxpZCBpbmRleCIpOwpAQCAtNDAxOSw3ICs0MDczLDggQEAKIFBvaW50ZXJfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgpCiB7CiAJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlpbnQgc2l6ZSwgb2Zmc2V0OworCWludCBzaXplOworCVB5X3NzaXplX3Qgb2Zmc2V0OwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CiAKQEAgLTQwMjksOSArNDA4NCw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCiAJc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CiAJYXNzZXJ0KHN0Z2RpY3QpOworCWFzc2VydChzdGdkaWN0LT5wcm90byk7CiAJCiAJcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKIAkvKiBYWFhYWFggTUFLRSBTVVJFIFBST1RPIElTIE5PVCBOVUxMISAqLwpAQCAtNDAzOSw3ICs0MDk0LDcgQEAKIAlzaXplID0gaXRlbWRpY3QtPnNpemU7CiAJb2Zmc2V0ID0gaW5kZXggKiBpdGVtZGljdC0+c2l6ZTsKIAotCXJldHVybiBDRGF0YV9nZXQoc3RnZGljdC0+cHJvdG8sIHN0Z2RpY3QtPmdldGZ1bmMsIChQeU9iamVjdCAqKXNlbGYsCisJcmV0dXJuIENEYXRhX2dldChwcm90bywgc3RnZGljdC0+Z2V0ZnVuYywgKFB5T2JqZWN0ICopc2VsZiwKIAkJCSBpbmRleCwgc2l6ZSwgKCooY2hhciAqKilzZWxmLT5iX3B0cikgKyBvZmZzZXQpOwogfQogCkBAIC00MDQ4LDcgKzQxMDMsOSBAQAogewogCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemU7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKwlQeV9zc2l6ZV90IG9mZnNldDsKKwlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7CisJUHlPYmplY3QgKnByb3RvOwogCiAJaWYgKHZhbHVlID09IE5VTEwpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKQEAgLTQwNjMsMTYgKzQxMjAsMTcgQEAKIAl9CiAJCiAJc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJImludmFsaWQgaW5kZXgiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzaXplID0gc3RnZGljdC0+c2l6ZSAvIHN0Z2RpY3QtPmxlbmd0aDsKKwlhc3NlcnQoc3RnZGljdCk7CisJYXNzZXJ0KHN0Z2RpY3QtPnByb3RvKTsKIAotCS8qIFhYWFhYIE1ha2Ugc3VyZSBwcm90byBpcyBOT1QgTlVMTCEgKi8KLQlyZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKLQkJCSBpbmRleCwgc2l6ZSwgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKKwlwcm90byA9IHN0Z2RpY3QtPnByb3RvOworCS8qIFhYWFhYWCBNQUtFIFNVUkUgUFJPVE8gSVMgTk9UIE5VTEwhICovCisJaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisJc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOworCW9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisKKwlyZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKKwkJCSBpbmRleCwgc2l6ZSwgKCooY2hhciAqKilzZWxmLT5iX3B0cikgKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDA4OSw4ICs0MTQ3LDggQEAKIAlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKIAlhc3NlcnQoc3RnZGljdCk7CiAJcmV0dXJuIENEYXRhX0Zyb21CYXNlT2JqKHN0Z2RpY3QtPnByb3RvLAotCQkJCSAgIChQeU9iamVjdCAqKXNlbGYsIDAsCi0JCQkJICAgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKKwkJCQkgKFB5T2JqZWN0ICopc2VsZiwgMCwKKwkJCQkgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKIH0KIAogc3RhdGljIGludApAQCAtNDQzNyw3ICs0NDk1LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNhc3Qodm9pZCAqcHRyLCBQeU9iamVjdCAqY3R5cGUpCitjYXN0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnNyYywgUHlPYmplY3QgKmN0eXBlKQogewogCUNEYXRhT2JqZWN0ICpyZXN1bHQ7CiAJaWYgKDAgPT0gY2FzdF9jaGVja19wb2ludGVydHlwZShjdHlwZSkpCkBAIC00NDQ1LDkgKzQ1MDMsNDYgQEAKIAlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKIAlpZiAocmVzdWx0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOworCisJLyoKKwkgIFRoZSBjYXN0ZWQgb2JqZWN0cyAnX29iamVjdHMnIG1lbWJlcjoKKworCSAgSXQgbXVzdCBjZXJ0YWlubHkgY29udGFpbiB0aGUgc291cmNlIG9iamVjdHMgb25lLgorCSAgSXQgbXVzdCBjb250YWluIHRoZSBzb3VyY2Ugb2JqZWN0IGl0c2VsZi4KKwkgKi8KKwlpZiAoQ0RhdGFPYmplY3RfQ2hlY2soc3JjKSkgeworCQlDRGF0YU9iamVjdCAqb2JqID0gKENEYXRhT2JqZWN0ICopc3JjOworCQkvKiBDRGF0YV9HZXRDb250YWluZXIgd2lsbCBpbml0aWFsaXplIHNyYy5iX29iamVjdHMsIHdlIG5lZWQKKwkJICAgdGhpcyBzbyBpdCBjYW4gYmUgc2hhcmVkICovCisJCUNEYXRhX0dldENvbnRhaW5lcihvYmopOworCQkvKiBCdXQgd2UgbmVlZCBhIGRpY3Rpb25hcnkhICovCisJCWlmIChvYmotPmJfb2JqZWN0cyA9PSBQeV9Ob25lKSB7CisJCQlQeV9ERUNSRUYoUHlfTm9uZSk7CisJCQlvYmotPmJfb2JqZWN0cyA9IFB5RGljdF9OZXcoKTsKKwkJCWlmIChvYmotPmJfb2JqZWN0cyA9PSBOVUxMKQorCQkJCWdvdG8gZmFpbGVkOworCQl9CisJCXJlc3VsdC0+Yl9vYmplY3RzID0gb2JqLT5iX29iamVjdHM7CisJCWlmIChyZXN1bHQtPmJfb2JqZWN0cykgeworCQkJUHlPYmplY3QgKmluZGV4OworCQkJaW50IHJjOworCQkJUHlfSU5DUkVGKG9iai0+Yl9vYmplY3RzKTsKKwkJCWluZGV4ID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopc3JjKTsKKwkJCWlmIChpbmRleCA9PSBOVUxMKQorCQkJCWdvdG8gZmFpbGVkOworCQkJcmMgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQtPmJfb2JqZWN0cywgaW5kZXgsIHNyYyk7CisJCQlQeV9ERUNSRUYoaW5kZXgpOworCQkJaWYgKHJjID09IC0xKQorCQkJCWdvdG8gZmFpbGVkOworCQl9CisJfQogCS8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCiAJbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworCisgIGZhaWxlZDoKKwlQeV9ERUNSRUYocmVzdWx0KTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCkBAIC00NDY5LDcgKzQ1NjQsOSBAQAogICAgb2JfdHlwZSBpcyB0aGUgbWV0YXR5cGUgKHRoZSAndHlwZScpLCBkZWZhdWx0cyB0byBQeVR5cGVfVHlwZSwKICAgIHRwX2Jhc2UgaXMgdGhlIGJhc2UgdHlwZSwgZGVmYXVsdHMgdG8gJ29iamVjdCcgYWthIFB5QmFzZU9iamVjdF9UeXBlLgogKi8KKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5RXZhbF9Jbml0VGhyZWFkcygpOworI2VuZGlmCiAJbSA9IFB5X0luaXRNb2R1bGUzKCJfY3R5cGVzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2NzKTsKIAlpZiAoIW0pCiAJCXJldHVybjsKQEAgLTQ1NzksNyArNDY3Niw3IEBACiAjZW5kaWYKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0NERUNMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfQ0RFQ0wpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1BZVEhPTkFQSSIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1BZVEhPTkFQSSkpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIwLjkuOS42Iik7CisJUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMC4wIik7CiAKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1tb3ZlX2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtbW92ZSkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbXNldF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbXNldCkpOwpAQCAtNDYxNywxMyArNDcxNCwxNCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHJlcGxhY2VtZW50cyBmb3IgYnJva2VuIFB5dGhvbiBhcGkgZnVuY3Rpb25zCisgKiByZXBsYWNlbWVudHMgZm9yIGJyb2tlbiBQeXRob24gYXBpIGZ1bmN0aW9ucyAoaW4gUHl0aG9uIDIuMykuCisgKiBTZWUgIzEwNDcyNjkgQnVmZmVyIG92ZXJ3cml0ZSBpbiBQeVVuaWNvZGVfQXNXaWRlQ2hhcgogICovCiAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIAogUHlPYmplY3QgKk15X1B5VW5pY29kZV9Gcm9tV2lkZUNoYXIocmVnaXN0ZXIgY29uc3Qgd2NoYXJfdCAqdywKLQkJCQkgICAgaW50IHNpemUpCisJCQkJICAgIFB5X3NzaXplX3Qgc2l6ZSkKIHsKICAgICBQeVVuaWNvZGVPYmplY3QgKnVuaWNvZGU7CiAKQEAgLTQ2NTUsNyArNDc1Myw3IEBACiAKIGludCBNeV9QeVVuaWNvZGVfQXNXaWRlQ2hhcihQeVVuaWNvZGVPYmplY3QgKnVuaWNvZGUsCiAJCQkgICAgcmVnaXN0ZXIgd2NoYXJfdCAqdywKLQkJCSAgICBpbnQgc2l6ZSkKKwkJCSAgICBQeV9zc2l6ZV90IHNpemUpCiB7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkgewogCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IGIxMGQ2ZmUuLjk5Y2M3YTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTEsMyArMSw4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCiAjaW5jbHVkZSA8UHl0aG9uLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggNGJhZjNhYS4uYzA5MWQ4OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtMSwzICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAiY29tcGlsZS5oIiAvKiByZXF1aXJlZCBvbmx5IGZvciAyLjMsIGFzIGl0IHNlZW1zICovCiAjaW5jbHVkZSAiZnJhbWVvYmplY3QuaCIKQEAgLTEyMyw3ICsxMjcsOSBAQAogCVB5T2JqZWN0ICpyZXN1bHQ7CiAJUHlPYmplY3QgKmFyZ2xpc3QgPSBOVUxMOwogCWludCBuQXJnczsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfU1RBVEUgc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworI2VuZGlmCiAKIAluQXJncyA9IFB5U2VxdWVuY2VfTGVuZ3RoKGNvbnZlcnRlcnMpOwogCS8qIEhtLiBXaGF0IHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yPwpAQCAtMjMxLDggKzIzNyw5IEBACiAJUHlfWERFQ1JFRihyZXN1bHQpOwogICBEb25lOgogCVB5X1hERUNSRUYoYXJnbGlzdCk7Ci0JCisjaWZkZWYgV0lUSF9USFJFQUQKIAlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGNsb3N1cmVfZmNuKGZmaV9jaWYgKmNpZiwKQEAgLTM0MSw3ICszNDgsOSBAQAogc3RhdGljIHZvaWQgTG9hZFB5dGhvbih2b2lkKQogewogCWlmICghUHlfSXNJbml0aWFsaXplZCgpKSB7CisjaWZkZWYgV0lUSF9USFJFQUQKIAkJUHlFdmFsX0luaXRUaHJlYWRzKCk7CisjZW5kaWYKIAkJUHlfSW5pdGlhbGl6ZSgpOwogCX0KIH0KQEAgLTM5MywxMiArNDAyLDE4IEBACiAJCQkgTFBWT0lEICpwcHYpCiB7CiAJbG9uZyByZXN1bHQ7CisjaWZkZWYgV0lUSF9USFJFQUQKIAlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworI2VuZGlmCiAKIAlMb2FkUHl0aG9uKCk7CisjaWZkZWYgV0lUSF9USFJFQUQKIAlzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisjZW5kaWYKIAlyZXN1bHQgPSBDYWxsX0dldENsYXNzT2JqZWN0KHJjbHNpZCwgcmlpZCwgcHB2KTsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CisjZW5kaWYKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC00NTAsOSArNDY1LDEzIEBACiBTVERBUEkgRGxsQ2FuVW5sb2FkTm93KHZvaWQpCiB7CiAJbG9uZyByZXN1bHQ7CisjaWZkZWYgV0lUSF9USFJFQUQKIAlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyNlbmRpZgogCXJlc3VsdCA9IENhbGxfQ2FuVW5sb2FkTm93KCk7CisjaWZkZWYgV0lUSF9USFJFQUQKIAlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworI2VuZGlmCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwppbmRleCA4MTA4NDk4Li5kNmY4NzViIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwpAQCAtMSwzICsxLDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKIC8qCiAgKiBIaXN0b3J5OiBGaXJzdCB2ZXJzaW9uIGRhdGVkIGZyb20gMy85NywgZGVyaXZlZCBmcm9tIG15IFNDTUxJQiB2ZXJzaW9uCiAgKiBmb3Igd2luMTYuCkBAIC02MTIsNyArNjE3LDkgQEAKIAkJCQkgIHZvaWQgKnJlc21lbSwKIAkJCQkgIGludCBhcmdjb3VudCkKIHsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5VGhyZWFkU3RhdGUgKl9zYXZlID0gTlVMTDsgLyogRm9yIFB5X0JMT0NLX1RIUkVBRFMgYW5kIFB5X1VOQkxPQ0tfVEhSRUFEUyAqLworI2VuZGlmCiAJZmZpX2NpZiBjaWY7CiAJaW50IGNjOwogI2lmZGVmIE1TX1dJTjMyCkBAIC02NDQsOCArNjUxLDEwIEBACiAJCXJldHVybiAtMTsKIAl9CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAogCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCiAJCVB5X1VOQkxPQ0tfVEhSRUFEUworI2VuZGlmCiAjaWZkZWYgTVNfV0lOMzIKICNpZm5kZWYgRE9OVF9VU0VfU0VICiAJX190cnkgewpAQCAtNjYyLDggKzY3MSwxMCBAQAogCX0KICNlbmRpZgogI2VuZGlmCisjaWZkZWYgV0lUSF9USFJFQUQKIAlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQogCQlQeV9CTE9DS19USFJFQURTCisjZW5kaWYKICNpZmRlZiBNU19XSU4zMgogI2lmbmRlZiBET05UX1VTRV9TRUgKIAlpZiAoZHdFeGNlcHRpb25Db2RlKSB7CkBAIC04MDQsMTQgKzgxNSwyMiBAQAogCVB5T2JqZWN0ICpvYmo7CiAJVENIQVIgKnRleHQ7CiAKKwkvKiBXZSBhYnNvbHV0ZWx5IGhhdmUgdG8gcmVsZWFzZSB0aGUgR0lMIGR1cmluZyBDT00gbWV0aG9kIGNhbGxzLAorCSAgIG90aGVyd2lzZSB3ZSBtYXkgZ2V0IGEgZGVhZGxvY2shCisJKi8KKyNpZmRlZiBXSVRIX1RIUkVBRAorCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyNlbmRpZgorCiAJaHIgPSBwSXVuay0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwSXVuaywgJklJRF9JU3VwcG9ydEVycm9ySW5mbywgKHZvaWQgKiopJnBzZWkpOwogCWlmIChGQUlMRUQoaHIpKQogCQlnb3RvIGZhaWxlZDsKKwogCWhyID0gcHNlaS0+bHBWdGJsLT5JbnRlcmZhY2VTdXBwb3J0c0Vycm9ySW5mbyhwc2VpLCByaWlkKTsKIAlwc2VpLT5scFZ0YmwtPlJlbGVhc2UocHNlaSk7Ci0KIAlpZiAoRkFJTEVEKGhyKSkKIAkJZ290byBmYWlsZWQ7CisKIAlociA9IEdldEVycm9ySW5mbygwLCAmcGVpKTsKIAlpZiAoaHIgIT0gU19PSykKIAkJZ290byBmYWlsZWQ7CkBAIC04MjIsMjQgKzg0MSwyNyBAQAogCXBlaS0+bHBWdGJsLT5HZXRIZWxwRmlsZShwZWksICZoZWxwZmlsZSk7CiAJcGVpLT5scFZ0YmwtPkdldFNvdXJjZShwZWksICZzb3VyY2UpOwogCisJcGVpLT5scFZ0YmwtPlJlbGVhc2UocGVpKTsKKwogICBmYWlsZWQ6Ci0JaWYgKHBlaSkKLQkJcGVpLT5scFZ0YmwtPlJlbGVhc2UocGVpKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorCVB5X0VORF9BTExPV19USFJFQURTCisjZW5kaWYKIAogCXByb2dpZCA9IE5VTEw7CiAJUHJvZ0lERnJvbUNMU0lEKCZndWlkLCAmcHJvZ2lkKTsKIAotLyogWFhYIElzIENPTUVycm9yIGRlcml2ZWQgZnJvbSBXaW5kb3dzRXJyb3Igb3Igbm90PyAqLwogCXRleHQgPSBGb3JtYXRFcnJvcihlcnJjb2RlKTsKKwlvYmogPSBQeV9CdWlsZFZhbHVlKAogI2lmZGVmIF9VTklDT0RFCi0Jb2JqID0gUHlfQnVpbGRWYWx1ZSgiaXUodXV1aXUpIiwKKwkJIml1KHV1dWl1KSIsCiAjZWxzZQotCW9iaiA9IFB5X0J1aWxkVmFsdWUoImlzKHV1dWl1KSIsCisJCSJpcyh1dXVpdSkiLAogI2VuZGlmCi0JCQkgICAgZXJyY29kZSwKLQkJCSAgICB0ZXh0LAotCQkJICAgIGRlc2NyLCBzb3VyY2UsIGhlbHBmaWxlLCBoZWxwY29udGV4dCwKLQkJCSAgICBwcm9naWQpOworCQllcnJjb2RlLAorCQl0ZXh0LAorCQlkZXNjciwgc291cmNlLCBoZWxwZmlsZSwgaGVscGNvbnRleHQsCisJCXByb2dpZCk7CiAJaWYgKG9iaikgewogCQlQeUVycl9TZXRPYmplY3QoQ29tRXJyb3IsIG9iaik7CiAJCVB5X0RFQ1JFRihvYmopOwpAQCAtMTEzOCw3ICsxMTYwLDcgQEAKIH0KIAogc3RhdGljIGNoYXIgY29weV9jb21fcG9pbnRlcl9kb2NbXSA9Ci0iQ29weUNvbVBvaW50ZXIoYSwgYikgLT4gaW50ZWdlclxuIjsKKyJDb3B5Q29tUG9pbnRlcihzcmMsIGRzdCkgLT4gSFJFU1VMVCB2YWx1ZVxuIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvcHlfY29tX3BvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtMTQ0NCw3ICsxNDY2LDcyIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIFB5T2JqZWN0ICoKK3Jlc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJQ0RhdGFPYmplY3QgKm9iajsKKwlTdGdEaWN0T2JqZWN0ICpkaWN0OworCVB5X3NzaXplX3Qgc2l6ZTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisJCQkgICAgICAiT2k6cmVzaXplIiwKKyNlbHNlCisJCQkgICAgICAiT246cmVzaXplIiwKKyNlbmRpZgorCQkJICAgICAgKFB5T2JqZWN0ICopJm9iaiwgJnNpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKW9iaik7CisJaWYgKGRpY3QgPT0gTlVMTCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJleGNlcHRlZCBjdHlwZXMgaW5zdGFuY2UiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChzaXplIDwgZGljdC0+c2l6ZSkgeworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDAKKwkJCSAgICAgIm1pbmltdW0gc2l6ZSBpcyAlZCIsCisjZWxzZQorCQkJICAgICAibWluaW11bSBzaXplIGlzICV6ZCIsCisjZW5kaWYKKwkJCSAgICAgZGljdC0+c2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAob2JqLT5iX25lZWRzZnJlZSA9PSAwKSB7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorCQkJICAgICAiTWVtb3J5IGNhbm5vdCBiZSByZXNpemVkIGJlY2F1c2UgdGhpcyBvYmplY3QgZG9lc24ndCBvd24gaXQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChzaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisJCS8qIGludGVybmFsIGRlZmF1bHQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLworCQlvYmotPmJfc2l6ZSA9IHNpemU7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKG9iai0+Yl9zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisJCS8qIFdlIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG9iamVjdHMgZGVmYXVsdCBidWZmZXIsIGJ1dCBpdAorCQkgICBpc24ndCBsYXJnZSBlbm91Z2ggYW55IG1vcmUuICovCisJCXZvaWQgKnB0ciA9IFB5TWVtX01hbGxvYyhzaXplKTsKKwkJaWYgKHB0ciA9PSBOVUxMKQorCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisJCW1lbXNldChwdHIsIDAsIHNpemUpOworCQltZW1tb3ZlKHB0ciwgb2JqLT5iX3B0ciwgb2JqLT5iX3NpemUpOworCQlvYmotPmJfcHRyID0gcHRyOworCQlvYmotPmJfc2l6ZSA9IHNpemU7CisJfSBlbHNlIHsKKwkJdm9pZCAqIHB0ciA9IFB5TWVtX1JlYWxsb2Mob2JqLT5iX3B0ciwgc2l6ZSk7CisJCWlmIChwdHIgPT0gTlVMTCkKKwkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCQlvYmotPmJfcHRyID0gcHRyOworCQlvYmotPmJfc2l6ZSA9IHNpemU7CisJfQorICBkb25lOgorCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKK30KKwogUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKKwl7InJlc2l6ZSIsIHJlc2l6ZSwgTUVUSF9WQVJBUkdTLCAiUmVzaXplIHRoZSBtZW1vcnkgYnVmZmVyIG9mIGEgY3R5cGVzIGluc3RhbmNlIn0sCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIAl7InNldF9jb252ZXJzaW9uX21vZGUiLCBzZXRfY29udmVyc2lvbl9tb2RlLCBNRVRIX1ZBUkFSR1MsIHNldF9jb252ZXJzaW9uX21vZGVfZG9jfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCmluZGV4IGFlMDI5MGYuLjM1OTViMDUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKQEAgLTEsMyArMSw3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiAjaW5jbHVkZSA8ZmZpLmg+CkBAIC02MSwxMCArNjUsMTAgQEAKIAl9CiAJaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KIAkgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCi0jaWZkZWYgTVNfV0lOMzIKKyNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKIAkgICAgJiYgZGljdC0+c2l6ZSAqIDggPT0gKnBmaWVsZF9zaXplIC8qIE1TVkMgKi8KICNlbHNlCi0JICAgICYmIGRpY3QtPnNpemUgKiA4IDw9ICpwZmllbGRfc2l6ZSAvKiBHQ0MgKi8KKwkgICAgJiYgZGljdC0+c2l6ZSAqIDggPD0gKnBmaWVsZF9zaXplIC8qIEdDQywgTUlOR1cgKi8KICNlbmRpZgogCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSAqcGZpZWxkX3NpemUpIHsKIAkJLyogY29udGludWUgYml0IGZpZWxkICovCkBAIC0xMjAsNyArMTI0LDcgQEAKIAlzZWxmLT5nZXRmdW5jID0gZ2V0ZnVuYzsKIAlzZWxmLT5pbmRleCA9IGluZGV4OwogCi0JUHlfWElOQ1JFRihwcm90byk7CisJUHlfSU5DUkVGKHByb3RvKTsKIAlzZWxmLT5wcm90byA9IHByb3RvOwogCiAJc3dpdGNoIChmaWVsZHR5cGUpIHsKQEAgLTE0ODIsMTYgKzE0ODYsMjcgQEAKIAkJKih2b2lkICoqKXB0ciA9IE5VTEw7CiAJCV9SRVQodmFsdWUpOwogCX0KLQkKLQl2ID0gUHlMb25nX0FzVm9pZFB0cih2YWx1ZSk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJLyogcHJldmVudCB0aGUgU3lzdGVtRXJyb3I6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiAqLwotCQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlciIpOwotCQl9CisKKwlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJjYW5ub3QgYmUgY29udmVydGVkIHRvIHBvaW50ZXIiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCisjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORworCXYgPSAodm9pZCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CisjZWxzZQorI2lmbmRlZiBIQVZFX0xPTkdfTE9ORworIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2Yodm9pZCopID4gc2l6ZW9mKGxvbmcpLCBidXQgbm8gbG9uZyBsb25nIgorI2VsaWYgU0laRU9GX0xPTkdfTE9ORyA8IFNJWkVPRl9WT0lEX1AKKyMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgorI2VuZGlmCisJdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CisjZW5kaWYKKworCWlmIChQeUVycl9PY2N1cnJlZCgpKQorCQlyZXR1cm4gTlVMTDsKKwogCSoodm9pZCAqKilwdHIgPSB2OwogCV9SRVQodmFsdWUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCmluZGV4IDc5ODg1OTUuLjMwM2VkYTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKQEAgLTEsNCArMSw2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQogdHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKQEAgLTU5LDcgKzYxLDcgQEAKIAlQeV9zc2l6ZV90IGJfbGVuZ3RoOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkICovCiAJUHlfc3NpemVfdCBiX2luZGV4OwkvKiBpbmRleCBvZiB0aGlzIG9iamVjdCBpbnRvIGJhc2UncwogCQkJCSAgIGJfb2JqZWN0IGxpc3QgKi8KLQlQeU9iamVjdCAqYl9vYmplY3RzOwkvKiBsaXN0IG9mIHJlZmVyZW5jZXMgd2UgbmVlZCB0byBrZWVwICovCisJUHlPYmplY3QgKmJfb2JqZWN0czsJLyogZGljdGlvbmFyeSBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCwgb3IgUHlfTm9uZSAqLwogCXVuaW9uIHZhbHVlIGJfdmFsdWU7CiB9OwogCkBAIC0xODEsNiArMTgzLDcgQEAKIAlQeU9iamVjdCAqcHJvdG87CQkvKiBhIHR5cGUgb3IgTlVMTCAqLwogCUdFVEZVTkMgZ2V0ZnVuYzsJCS8qIGdldHRlciBmdW5jdGlvbiBpZiBwcm90byBpcyBOVUxMICovCiAJU0VURlVOQyBzZXRmdW5jOwkJLyogc2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KKwlpbnQgYW5vbnltb3VzOwogfSBDRmllbGRPYmplY3Q7CiAKIC8qIEEgc3ViY2xhc3Mgb2YgUHlEaWN0T2JqZWN0LCB1c2VkIGFzIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IG9mIGN0eXBlcwpAQCAtMzc0LDggKzM3Nyw4IEBACiAjICB1bmRlZiBQeVVuaWNvZGVfQXNXaWRlQ2hhcgogIyAgZGVmaW5lIFB5VW5pY29kZV9Bc1dpZGVDaGFyIE15X1B5VW5pY29kZV9Bc1dpZGVDaGFyCiAKLWV4dGVybiBQeU9iamVjdCAqTXlfUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihjb25zdCB3Y2hhcl90ICosIGludCk7Ci1leHRlcm4gaW50IE15X1B5VW5pY29kZV9Bc1dpZGVDaGFyKFB5VW5pY29kZU9iamVjdCAqLCB3Y2hhcl90ICosIGludCk7CitleHRlcm4gUHlPYmplY3QgKk15X1B5VW5pY29kZV9Gcm9tV2lkZUNoYXIoY29uc3Qgd2NoYXJfdCAqLCBQeV9zc2l6ZV90KTsKK2V4dGVybiBpbnQgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIoUHlVbmljb2RlT2JqZWN0ICosIHdjaGFyX3QgKiwgUHlfc3NpemVfdCk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzX2RsZmNuLmggYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzX2RsZmNuLmgKaW5kZXggN2Y2MzJjNS4uZDhiZjkwNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlc19kbGZjbi5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXNfZGxmY24uaApAQCAtMSw0ICsxLDYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBfQ1RZUEVTX0RMRkNOX0hfCiAjZGVmaW5lIF9DVFlQRVNfRExGQ05fSF8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUKaW5kZXggOWZkZDY1NC4uOWVkZWQ1YSAxMDA3NTUKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUKQEAgLTkzNCw3ICs5MzQsNyBAQAogICAgIGVsc2UKICAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKICAgICBmaQotICAgIGNkICRhY19wb3BkaXIKKyAgICBjZCAiJGFjX3BvcGRpciIKICAgZG9uZQogZmkKIApAQCAtMTk3Myw4ICsxOTczLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjAzMiw4ICsyMDMxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjE0OSw4ICsyMTQ3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjIwNCw4ICsyMjAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjI1MCw4ICsyMjQ2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjI5NSw4ICsyMjkwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjYyMyw4ICsyNjE3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjc5NCw4ICsyNzg3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjg2Miw4ICsyODU0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzA0Nyw4ICszMDM4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzExMSw4ICszMTAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzI5MCw4ICszMjc5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzQwOCw4ICszMzk2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzQ4Myw2ICszNDcwLDEyIEBACiAKIFRBUkdFVERJUj0idW5rbm93biIKIGNhc2UgIiRob3N0IiBpbgorbWlwcyotKi1vcGVuYnNkKikgVEFSR0VUPU1JUFM7IFRBUkdFVERJUj1taXBzOzsKK3NwYXJjLSotb3BlbmJzZCopIFRBUkdFVD1TUEFSQzsgVEFSR0VURElSPXNwYXJjOzsKK3NwYXJjNjQtKi1vcGVuYnNkKikgVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmM7OworYWxwaGEqLSotb3BlbmJzZCopIFRBUkdFVD1BTFBIQTsgVEFSR0VURElSPWFscGhhOzsKK202OGstKi1vcGVuYnNkKikgVEFSR0VUPU02OEs7IFRBUkdFVERJUj1tNjhrOzsKK3Bvd2VycGMtKi1vcGVuYnNkKikgVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjOzsKIGkqODYtKi1kYXJ3aW4qKSBUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotbGludXgqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1nbnUqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKQEAgLTM1NzUsOCArMzU2OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTM3NzcsOCArMzc2OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTM4NDEsOCArMzgzMiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTM5MjMsOCArMzkxMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQwNjUsOCArNDA1NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQyMDIsOCArNDE5MCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQyNjUsOCArNDI1Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQzMDYsOCArNDI5Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQzNjMsOCArNDM0OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ0MDQsOCArNDM4OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ0NjksOCArNDQ1Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ1MDEsMTAgKzQ0ODMsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNDYxNiw4ICs0NTk2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDY3OSw4ICs0NjU4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDcyMCw4ICs0Njk4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDc3Nyw4ICs0NzU0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDgxOCw4ICs0Nzk0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDg4Myw4ICs0ODU4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDkxNSwxMCArNDg4OSw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC01MDQ4LDggKzUwMjAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC01MDkxLDggKzUwNjIsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC01MTQ5LDggKzUxMTksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC01MjgyLDggKzUyNTEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC01MzQ5LDggKzUzMTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC02MzA5LDExICs2Mjc2LDYgQEAKIAogCiAKLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0gICAgcm0gLWYgIiRhY19maWxlIgotICBmaQogICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAogICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CiAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCkBAIC02MzUyLDYgKzYzMTQsMTIgQEAKIAkgZmk7OwogICAgICAgZXNhYwogICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKIF9BQ0VPRgogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKICAgc2VkICIkYWNfdnBzdWIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKaW5kZXggYTBkNzUxMy4uMzg0OTU5ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKQEAgLTIxLDYgKzIxLDEyIEBACiAKIFRBUkdFVERJUj0idW5rbm93biIKIGNhc2UgIiRob3N0IiBpbgorbWlwcyotKi1vcGVuYnNkKikgVEFSR0VUPU1JUFM7IFRBUkdFVERJUj1taXBzOzsKK3NwYXJjLSotb3BlbmJzZCopIFRBUkdFVD1TUEFSQzsgVEFSR0VURElSPXNwYXJjOzsKK3NwYXJjNjQtKi1vcGVuYnNkKikgVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmM7OworYWxwaGEqLSotb3BlbmJzZCopIFRBUkdFVD1BTFBIQTsgVEFSR0VURElSPWFscGhhOzsKK202OGstKi1vcGVuYnNkKikgVEFSR0VUPU02OEs7IFRBUkdFVERJUj1tNjhrOzsKK3Bvd2VycGMtKi1vcGVuYnNkKikgVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjOzsKIGkqODYtKi1kYXJ3aW4qKSBUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotbGludXgqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1nbnUqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUwppbmRleCBjNWU1NWI1Li5kOTFiZGMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZGFyd2luLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2Rhcndpbi5TCkBAIC0zNSw2ICszNSwxMyBAQAogI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgogI2luY2x1ZGUgPGZmaS5oPgogCisjaWZkZWYgUHlPYmpDX1NUUklDVF9ERUJVR0dJTkcKKyAgLyogWFhYOiBEZWJ1Z2dpbmcgb2Ygc3RhY2sgYWxpZ25tZW50LCB0byBiZSByZW1vdmVkICovCisjZGVmaW5lIEFTU0VSVF9TVEFDS19BTElHTkVEIG1vdmRxYSAtMTYoJWVzcCksICV4bW0wCisjZWxzZQorI2RlZmluZSBBU1NFUlRfU1RBQ0tfQUxJR05FRCAKKyNlbmRpZgorCiAudGV4dAogCiAuZ2xvYmwgX2ZmaV9wcmVwX2FyZ3MKQEAgLTQ3LDMwICs1NCw0MSBAQAogICAgICAgICBwdXNobCAlZWJwCiAuTENGSTA6CiAgICAgICAgIG1vdmwgICVlc3AsJWVicAorCXN1YmwgICQ4LCVlc3AKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAogLkxDRkkxOgogCS8qIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4gICovCiAJbW92bCAgMTYoJWVicCksJWVjeAogCXN1YmwgICVlY3gsJWVzcAogCisJQVNTRVJUX1NUQUNLX0FMSUdORUQKKwogCW1vdmwgICVlc3AsJWVheAogCiAJLyogUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uICAqLworCXN1YmwgICQ4LCVlc3AKIAlwdXNobCAxMiglZWJwKQogCXB1c2hsICVlYXgKIAljYWxsICAqOCglZWJwKQogCisJQVNTRVJUX1NUQUNLX0FMSUdORUQKKwogCS8qIFJldHVybiBzdGFjayB0byBwcmV2aW91cyBzdGF0ZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24gICovCi0JYWRkbCAgJDgsJWVzcAkKKwlhZGRsICAkMTYsJWVzcAorCisJQVNTRVJUX1NUQUNLX0FMSUdORUQKIAogCWNhbGwgICoyOCglZWJwKQotCi0JLyogUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzICAqLworCQorCS8qIFhYWDogcmV0dXJuIHJldHVybnMgcmV0dXJuIHdpdGggJ3JldCAkNCcsIHRoYXQgdXBzZXRzIHRoZSBzdGFjayEgKi8KIAltb3ZsICAxNiglZWJwKSwlZWN4CiAJYWRkbCAgJWVjeCwlZXNwCiAKKwogCS8qIExvYWQgJWVjeCB3aXRoIHRoZSByZXR1cm4gdHlwZSBjb2RlICAqLwogCW1vdmwgIDIwKCVlYnApLCVlY3gJCiAKKwogCS8qIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLiAgKi8KIAljbXBsICAkMCwyNCglZWJwKQogCWpuZSAgIHJldGludApAQCAtMTE3LDE3ICsxMzUsNDcgQEAKIAkKIHJldGludDY0OgkKIAljbXBsICAkRkZJX1RZUEVfU0lOVDY0LCVlY3gKLSAgICAgICAgam5lICAgcmV0c3RydWN0CisgICAgICAgIGpuZSAgIHJldHN0cnVjdDFiCiAJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KIAltb3ZsICAyNCglZWJwKSwlZWN4CQogCW1vdmwgICVlYXgsMCglZWN4KQogCW1vdmwgICVlZHgsNCglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldHN0cnVjdDFiOgorICAgY21wbCAkRkZJX1RZUEVfU0lOVDgsJWVjeAorICAgam5lICByZXRzdHJ1Y3QyYgorICAgbW92bCAyNCglZWJwKSwlZWN4CisgICBtb3ZiICAlYWwsMCglZWN4KQorICAgam1wICBlcGlsb2d1ZQorCityZXRzdHJ1Y3QyYjoKKyAgIGNtcGwgJEZGSV9UWVBFX1NJTlQxNiwlZWN4CisgICBqbmUgIHJldHN0cnVjdAorICAgbW92bCAyNCglZWJwKSwlZWN4CisgICBtb3Z3ICVheCwwKCVlY3gpCisgICBqbXAgIGVwaWxvZ3VlCiAJCiByZXRzdHJ1Y3Q6CisgICBjbXBsICRGRklfVFlQRV9TVFJVQ1QsJWVjeAorICAgam5lICBub3JldHZhbAogCS8qIE5vdGhpbmcgdG8gZG8hICAqLwogCisJc3VibCAkNCwlZXNwCisKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAorCisJYWRkbCAkOCwlZXNwCisJbW92bCAlZWJwLCAlZXNwCisJcG9wbCAlZWJwCisJcmV0CisKIG5vcmV0dmFsOgogZXBpbG9ndWU6CisJQVNTRVJUX1NUQUNLX0FMSUdORUQKKwlhZGRsICQ4LCAlZXNwCisKKwogICAgICAgICBtb3ZsICVlYnAsJWVzcAogICAgICAgICBwb3BsICVlYnAKICAgICAgICAgcmV0CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaV9kYXJ3aW4uYwppbmRleCA0ZjgyYjNhLi5jOTc0MmQ4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmlfZGFyd2luLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCiAgICAgewogICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKLSNpZiAhZGVmaW5lZChYODZfV0lOMzIpIAorI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgICYmICFkZWZpbmVkKFg4Nl9EQVJXSU4pCiAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CiAjZW5kaWYKICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NJTlQ2NDsKICAgICAgIGJyZWFrOwogCi0jaWYgZGVmaW5lZCBYODZfV0lOMzIgIAorI2lmIGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9EQVJXSU4pCiAKICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKICAgICAgIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDEpCkBAIC0xODYsMTAgKzE4NiwxMSBAQAogICAgIH0KIAogICAvKiBEYXJ3aW46IFRoZSBzdGFjayBuZWVkcyB0byBiZSBhbGlnbmVkIHRvIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgKi8KLSNpZiAwCisjaWYgMQogICBjaWYtPmJ5dGVzID0gKGNpZi0+Ynl0ZXMgKyAxNSkgJiB+MHhGOwogI2VuZGlmCiAKKwogICByZXR1cm4gRkZJX09LOwogfQogCkBAIC0yMjEsNyArMjIyLDYgQEAKIAkgICAgICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZSkKIHsKICAgZXh0ZW5kZWRfY2lmIGVjaWY7Ci0gIGludCBmbGFnczsKIAogICBlY2lmLmNpZiA9IGNpZjsKICAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CkBAIC0yMzgsMjAgKzIzOCw2IEBACiAgIGVsc2UKICAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKIAotICBmbGFncyA9IGNpZi0+ZmxhZ3M7Ci0gIGlmIChmbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpIHsKLSAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA4KSB7Ci0JZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7Ci0gICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDQpIHsKLSAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7Ci0gICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDIpIHsKLSAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7Ci0gICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDEpIHsKLSAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7Ci0gICAgfQotICB9Ci0KLSAgCiAgIHN3aXRjaCAoY2lmLT5hYmkpIAogICAgIHsKICAgICBjYXNlIEZGSV9TWVNWOgpAQCAtMjYwLDggKzI0Niw4IEBACiAgICAgICAgKiBibG9jayBpcyBhIG11bHRpcGxlIG9mIDE2LiBUaGVuIGFkZCA4IHRvIGNvbXBlbnNhdGUgZm9yIGxvY2FsIHZhcmlhYmxlcwogICAgICAgICogaW4gZmZpX2NhbGxfU1lTVi4KICAgICAgICAqLwotICAgICAgZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgQUxJR04oY2lmLT5ieXRlcywgMTYpICs4LCAKLQkJICAgIGZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgCisJCSAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOwogICAgICAgLypAPXVzZWRlZkAqLwogICAgICAgYnJlYWs7CiAjaWZkZWYgWDg2X1dJTjMyCkBAIC0yODEsOCArMjY3LDYgQEAKIAogLyoqIHByaXZhdGUgbWVtYmVycyAqKi8KIAotc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWIChjaGFyICpzdGFjaywgdm9pZCAqKnJldCwKLQkJCQkJIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYpOwogc3RhdGljIHZvaWQgZmZpX2Nsb3N1cmVfU1lTViAoZmZpX2Nsb3N1cmUgKikKICAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKICNpZiAhRkZJX05PX1JBV19BUEkKQEAgLTI5MCw4MyArMjc0LDggQEAKICAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKICNlbmRpZgogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGp1bXBlZCB0byBieSB0aGUgdHJhbXBvbGluZSAqLwotCi1zdGF0aWMgdm9pZAotZmZpX2Nsb3N1cmVfU1lTViAoY2xvc3VyZSkKLSAgICAgZmZpX2Nsb3N1cmUgKmNsb3N1cmU7Ci17Ci0gIC8vIHRoaXMgaXMgb3VyIHJldHVybiB2YWx1ZSBzdG9yYWdlCi0gIGxvbmcgZG91YmxlICByZXM7Ci0KLSAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCi0gIGZmaV9jaWYgICAgICAgKmNpZjsKLSAgdm9pZCAgICAgICAgICoqYXJnX2FyZWE7Ci0gIHVuc2lnbmVkIHNob3J0IHJ0eXBlOwotICB2b2lkICAgICAgICAgICpyZXNwID0gKHZvaWQqKSZyZXM7Ci0gIHZvaWQgKmFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpOwotCi0gIGNpZiAgICAgICAgID0gY2xvc3VyZS0+Y2lmOwotICBhcmdfYXJlYSAgICA9ICh2b2lkKiopIGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCopKTsgIAotCi0gIC8qIHRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgQVJHX0FSRUEsIHN1Y2ggdGhhdCBlYWNoCi0gICAqIGVsZW1lbnQgaW4gdGhhdCBhcnJheSBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAqIHZhbHVlIG9uIHRoZSBzdGFjazsgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0gICAqIGEgc3RydWN0dXJlLCBpdCB3aWxsIHJlLXNldCBSRVNQIHRvIHBvaW50IHRvIHRoZQotICAgKiBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MuICAqLwotCi0gIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihhcmdzLCAodm9pZCoqKSZyZXNwLCBhcmdfYXJlYSwgY2lmKTsKLSAgCi0gIChjbG9zdXJlLT5mdW4pIChjaWYsIHJlc3AsIGFyZ19hcmVhLCBjbG9zdXJlLT51c2VyX2RhdGEpOwotCi0gIHJ0eXBlID0gY2lmLT5mbGFnczsKLQotICBpZiAoIXJldHZhbF9vbl9zdGFjayhjaWYtPnJ0eXBlKSAmJiBjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkgewotICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gOCkgewotICAgICAgICAgcnR5cGUgPSBGRklfVFlQRV9TSU5UNjQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgcnR5cGUgPSBGRklfVFlQRV9JTlQ7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBub3csIGRvIGEgZ2VuZXJpYyByZXR1cm4gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHJ0eXBlICovCi0gIGlmIChydHlwZSA9PSBGRklfVFlQRV9JTlQpCi0gICAgewotICAgICAgYXNtICgibW92bCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0ZMT0FUKQotICAgIHsKLSAgICAgIGFzbSAoImZsZHMgKCUwKSIgOiA6ICJyIiAocmVzcCkgOiAic3QiICk7Ci0gICAgfQotICBlbHNlIGlmIChydHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCi0gICAgewotICAgICAgYXNtICgiZmxkbCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCi0gICAgewotICAgICAgYXNtICgiZmxkdCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQ2NCkKLSAgICB7Ci0gICAgICBhc20gKCJtb3ZsIDAoJTApLCUlZWF4OyIKLQkgICAibW92bCA0KCUwKSwlJWVkeCIgCi0JICAgOiA6ICJyIihyZXNwKQotCSAgIDogImVheCIsICJlZHgiKTsKLSAgICB9Ci0jaWZkZWYgWDg2X1dJTjMyCi0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQ4KSAvKiAxLWJ5dGUgc3RydWN0ICAqLwotICAgIHsKLSAgICAgIGFzbSAoIm1vdnNibCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQxNikgLyogMi1ieXRlcyBzdHJ1Y3QgKi8KLSAgICB7Ci0gICAgICBhc20gKCJtb3Zzd2wgKCUwKSwlJWVheCIgOiA6ICJyIiAocmVzcCkgOiAiZWF4Iik7Ci0gICAgfQotI2VuZGlmCi19Ci0KIC8qQC1leHBvcnRoZWFkZXJAKi8KLXN0YXRpYyB2b2lkIAorc3RhdGljIGlubGluZSB2b2lkIAogZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGNoYXIgKnN0YWNrLCB2b2lkICoqcnZhbHVlLAogCQkJICAgIHZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZikKIC8qQD1leHBvcnRoZWFkZXJAKi8KQEAgLTQwNyw2ICszMTYsODEgQEAKICAgcmV0dXJuOwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGp1bXBlZCB0byBieSB0aGUgdHJhbXBvbGluZSAqLworCitzdGF0aWMgdm9pZAorZmZpX2Nsb3N1cmVfU1lTViAoY2xvc3VyZSkKKyAgICAgZmZpX2Nsb3N1cmUgKmNsb3N1cmU7Cit7CisgIC8vIHRoaXMgaXMgb3VyIHJldHVybiB2YWx1ZSBzdG9yYWdlCisgIGxvbmcgZG91YmxlICByZXM7CisKKyAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCisgIGZmaV9jaWYgICAgICAgKmNpZjsKKyAgdm9pZCAgICAgICAgICoqYXJnX2FyZWE7CisgIHZvaWQgICAgICAgICAgKnJlc3AgPSAodm9pZCopJnJlczsKKyAgdm9pZCAqYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7CisKKworICBjaWYgICAgICAgICA9IGNsb3N1cmUtPmNpZjsKKyAgYXJnX2FyZWEgICAgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7ICAKKworICAvKiB0aGlzIGNhbGwgd2lsbCBpbml0aWFsaXplIEFSR19BUkVBLCBzdWNoIHRoYXQgZWFjaAorICAgKiBlbGVtZW50IGluIHRoYXQgYXJyYXkgcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIAorICAgKiB2YWx1ZSBvbiB0aGUgc3RhY2s7IGFuZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAgKiBhIHN0cnVjdHVyZSwgaXQgd2lsbCByZS1zZXQgUkVTUCB0byBwb2ludCB0byB0aGUKKyAgICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KKworICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgKHZvaWQqKikmcmVzcCwgYXJnX2FyZWEsIGNpZik7CisgIAorICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCByZXNwLCBhcmdfYXJlYSwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICAvKiBub3csIGRvIGEgZ2VuZXJpYyByZXR1cm4gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHJ0eXBlICovCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX0lOVCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9GTE9BVCkKKyAgICB7CisgICAgICBhc20gKCJmbGRzICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiApOworICAgIH0KKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9ET1VCTEUpCisgICAgeworICAgICAgYXNtICgiZmxkbCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKKyAgICB9CisgIGVsc2UgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGR0ICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TSU5UNjQpCisgICAgeworICAgICAgYXNtICgibW92bCAwKCUwKSwlJWVheDsiCisJICAgIm1vdmwgNCglMCksJSVlZHgiIAorCSAgIDogOiAiciIocmVzcCkKKwkgICA6ICJlYXgiLCAiZWR4Iik7CisgICAgfQorI2lmIGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9EQVJXSU4pCisgIGVsc2UgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU0lOVDgpIC8qIDEtYnl0ZSBzdHJ1Y3QgICovCisgICAgeworICAgICAgYXNtICgibW92c2JsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TSU5UMTYpIC8qIDItYnl0ZXMgc3RydWN0ICovCisgICAgeworICAgICAgYXNtICgibW92c3dsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyNlbmRpZgorCisgIGVsc2UgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIGFzbSAoImxlYSAtOCglZWJwKSwlZXNwOyIKKwkgICAicG9wICVlc2k7IgorCSAgICJwb3AgJWVkaTsiCisJICAgInBvcCAlZWJwOyIKKwkgICAicmV0ICQ0Iik7IAorICAgIH0KK30KKworCiAvKiBIb3cgdG8gbWFrZSBhIHRyYW1wb2xpbmUuICBEZXJpdmVkIGZyb20gZ2NjL2NvbmZpZy9pMzg2L2kzODYuYy4gKi8KIAogI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgpIFwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYwppbmRleCBlNTYwMGIyLi45YWY2YjcxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jCkBAIC0yMjcsMTEgKzIyNyw3IEBACiAgIHZvaWQgICAgICAgICAqKmFyZ19hcmVhOwogICB1bnNpZ25lZCBzaG9ydCBydHlwZTsKICAgdm9pZCAgICAgICAgICAqcmVzcCA9ICh2b2lkKikmcmVzOwotLy8jaWZkZWYgX01TQ19WRVIKICAgdm9pZCAqYXJncyA9ICZhcmdwWzFdOwotLy8jZWxzZQotLy8gIHZvaWQgKmFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpOwotLy8jZW5kaWYKIAogICBjaWYgICAgICAgICA9IGNsb3N1cmUtPmNpZjsKICAgYXJnX2FyZWEgICAgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7ICAKQEAgLTM1MywxMCArMzQ5LDYgQEAKIAogLyogSG93IHRvIG1ha2UgYSB0cmFtcG9saW5lLiAgRGVyaXZlZCBmcm9tIGdjYy9jb25maWcvaTM4Ni9pMzg2LmMuICovCiAKLS8qIE1PViBFRFgsIEVTUCBpcyAweDhiIDB4ZDQgKi8KLQotLy8jaWZkZWYgX01TQ19WRVIKLQogI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgsQllURVMpIFwKIHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCiAgICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXApAQCAtMzY1LDI2ICszNTcsMTMgQEAKICAgICoodW5zaWduZWQgY2hhciopICAmX190cmFtcFswXSA9IDB4Yjk7IFwKICAgICoodW5zaWduZWQgaW50KikgICAmX190cmFtcFsxXSA9IF9fY3R4OyAvKiBtb3YgZWN4LCBfX2N0eCAqLyBcCiAgICAqKHVuc2lnbmVkIGNoYXIqKSAgJl9fdHJhbXBbNV0gPSAweDhiOyBcCi0gICAqKHVuc2lnbmVkIGNoYXIqKSAgJl9fdHJhbXBbNl0gPSAweGQ0OyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAgJl9fdHJhbXBbNl0gPSAweGQ0OyAvKiBtb3YgZWR4LCBlc3AgKi8gXAogICAgKih1bnNpZ25lZCBjaGFyKikgICZfX3RyYW1wWzddID0gMHhlODsgXAogICAgKih1bnNpZ25lZCBpbnQqKSAgICZfX3RyYW1wWzhdID0gX19kaXM7IC8qIGNhbGwgX19mdW4gICovIFwKICAgICoodW5zaWduZWQgY2hhciopICAmX190cmFtcFsxMl0gPSAweEMyOyAvKiByZXQgQllURVMgKi8gXAogICAgKih1bnNpZ25lZCBzaG9ydCopICZfX3RyYW1wWzEzXSA9IEJZVEVTOyBcCiAgfQogCi0vLyNlbHNlCi0vLyNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYLEJZVEVTKSBcCi0vLyh7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsgXAotLy8gICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXAotLy8gICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAotLy8gICB1bnNpZ25lZCBpbnQgIF9fZGlzID0gX19mdW4gLSAoKHVuc2lnbmVkIGludCkgX190cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpOyBcCi0vLyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzBdID0gMHhiODsgXAotLy8gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFsxXSA9IF9fY3R4OyAvKiBtb3ZsIF9fY3R4LCAlZWF4ICovIFwKLS8vICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFs1XSA9IDB4ZTk7IFwKLS8vICAgKih1bnNpZ25lZCBpbnQqKSAgJl9fdHJhbXBbNl0gPSBfX2RpczsgLyogam1wIF9fZnVuICAqLyBcCi0vLyB9KQotLy8jZW5kaWYKLQogLyogdGhlIGNpZiBtdXN0IGFscmVhZHkgYmUgcHJlcCdlZCAqLwogCiBmZmlfc3RhdHVzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpY29uZmlnLmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpY29uZmlnLmgKaW5kZXggMjViNjMwNS4uYzE0ZjY1MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaWNvbmZpZy5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmljb25maWcuaApAQCAtMyw4ICszLDEwIEBACiAvKiBmZmljb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovCiAvKiBmZmljb25maWcuaC5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwogCi0vKiBEZWZpbmVzIGZvciBNU1ZDICovCisvKiBEZWZpbmUgdGhpcyBmb3IgTVNWQywgYnV0IG5vdCBmb3IgbWluZ3czMiEgKi8KKyNpZmRlZiBfTVNDX1ZFUgogI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpIC8qICovCisjZW5kaWYKICNkZWZpbmUgYWxsb2NhIF9hbGxvY2EKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZml0YXJnZXQuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZml0YXJnZXQuaAppbmRleCA1N2QyNzViLi43OGMwYzM3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpdGFyZ2V0LmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oCkBAIC03MSwxMSArNzEsNyBAQAogI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDI0CiAjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCiAjZWxzZQotI2lmZGVmIF9NU0NfVkVSCi0jIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDE1Ci0jZWxzZQotIyBkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAxMAotI2VuZGlmCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMTUKICNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDEJLyogeDg2IGhhcyBuYXRpdmUgcmF3IGFwaSBzdXBwb3J0ICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFmMmIyLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9taW5nd2luMzIuUworKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgd2luMzIuUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiAgUmVkIEhhdCwgSW5jLgotCSAgICAgQ29weXJpZ2h0IChjKSAyMDAxICBKb2huIEJlbml0b24KLQkgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUmFuaml0IE1hdGhldwotCQkJCi0gCi0gICBYODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKLSAKLSAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gCi0gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAKLSNkZWZpbmUgTElCRkZJX0FTTQotI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgotI2luY2x1ZGUgPGZmaS5oPgotIAotLnRleHQKLSAKLS5nbG9ibCBmZmlfcHJlcF9hcmdzCi0gCi0gICAgICAgICMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCi0gICAgICAgIC5iYWxpZ24gMTYKLS5nbG9ibCBfZmZpX2NhbGxfU1lTVgotIAotX2ZmaV9jYWxsX1NZU1Y6Ci0gICAgICAgIHB1c2hsICVlYnAKLSAgICAgICAgbW92bCAgJWVzcCwlZWJwCi0gCi0gICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgotICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgc3VibCAgJWVjeCwlZXNwCi0gCi0gICAgICAgIG1vdmwgICVlc3AsJWVheAotIAotICAgICAgICAjIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgotICAgICAgICBwdXNobCAxMiglZWJwKQotICAgICAgICBwdXNobCAlZWF4Ci0gICAgICAgIGNhbGwgICo4KCVlYnApCi0gCi0gICAgICAgICMgUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbgotICAgICAgICBhZGRsICAkOCwlZXNwCi0gCi0gICAgICAgICMgRklYTUU6IEFsaWduIHRoZSBzdGFjayB0byBhIDEyOC1iaXQgYm91bmRhcnkgdG8gYXZvaWQKLSAgICAgICAgIyBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaGl0cy4KLQotCWNhbGwgICoyOCglZWJwKQotIAotICAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2Ugd2UgcHVzaGVkIGZvciB0aGUgYXJncwotICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4Ci0gICAgICAgIGFkZGwgICVlY3gsJWVzcAotIAotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSByZXR1cm4gdHlwZSBjb2RlCi0gICAgICAgIG1vdmwgIDIwKCVlYnApLCVlY3gKLSAKLSAgICAgICAgIyBJZiB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaXMgTlVMTCwgYXNzdW1lIG5vIHJldHVybiB2YWx1ZS4KLSAgICAgICAgY21wbCAgJDAsMjQoJWVicCkKLSAgICAgICAgam5lICAgcmV0aW50Ci0gCi0gICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCi0gICAgICAgICMgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotICAgICAgICBjbXBsICAkMiwlZWN4ICAjIEZsb2F0X3R5cGUKLSAgICAgICAgam5lICAgbm9yZXR2YWwKLSAgICAgICAgZnN0cCAgJXN0KDApCi0gCi0gICAgICAgIGptcCAgIGVwaWxvZ3VlCi0gCi1yZXRpbnQ6Ci0gICAgICAgIGNtcGwgICQxLCVlY3ggICAgIyBJbnRfdHlwZQotICAgICAgICBqbmUgICByZXRmbG9hdAotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKLSAgICAgICAgam1wICAgZXBpbG9ndWUKLSAKLXJldGZsb2F0OgotICAgICAgICBjbXBsICAkMiwlZWN4ICAgIyBGbG9hdF90eXBlCi0gICAgICAgIGpuZSAgIHJldGRvdWJsZSAgIAotICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKLSAgICAgICAgZnN0cHMgKCVlY3gpCi0gICAgICAgIGptcCAgIGVwaWxvZ3VlCi0gCi1yZXRkb3VibGU6Ci0gICAgICAgIGNtcGwgICQzLCVlY3ggICAgICMgRG91YmxlX3R5cGUKLSAgICAgICAgam5lICAgcmV0bG9uZ2RvdWJsZQotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBmc3RwbCAoJWVjeCkKLSAgICAgICAgam1wICAgZXBpbG9ndWUKLSAKLXJldGxvbmdkb3VibGU6Ci0gICAgICAgIGNtcGwgICQ0LCVlY3ggICAgICMgTG9uZ2RvdWJsZV90eXBlCi0gICAgICAgIGpuZSAgIHJldGludDY0Ci0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIGZzdHB0ICglZWN4KQotICAgICAgICBqbXAgICBlcGlsb2d1ZQotIAotcmV0aW50NjQ6Ci0gICAgICAgIGNtcGwgICQxMiwlZWN4ICAgICAgIyBTSU5UNjRfdHlwZQotICAgICAgICBqbmUgICByZXRzdHJ1Y3QKLSAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKLSAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCi0gICAgICAgIG1vdmwgICVlZHgsNCglZWN4KQotIAotcmV0c3RydWN0OgotICAgICAgICAjIE5vdGhpbmcgdG8gZG8hCi0gCi1ub3JldHZhbDoKLWVwaWxvZ3VlOgotICAgICAgICBtb3ZsICVlYnAsJWVzcAotICAgICAgICBwb3BsICVlYnAKLSAgICAgICAgcmV0Ci0gCi0uZmZpX2NhbGxfU1lTVl9lbmQ6Ci0KLSAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KLSAgICAgICAgLmJhbGlnbiAxNgotLmdsb2JsIF9mZmlfY2FsbF9TVERDQUxMCi0KLV9mZmlfY2FsbF9TVERDQUxMOgotICAgICAgICBwdXNobCAlZWJwCi0gICAgICAgIG1vdmwgICVlc3AsJWVicAotCi0gICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgotICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4IAotICAgICAgICBzdWJsICAlZWN4LCVlc3AKLQotICAgICAgICBtb3ZsICAlZXNwLCVlYXgKLQotICAgICAgICAjIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgotICAgICAgICBwdXNobCAxMiglZWJwKQotICAgICAgICBwdXNobCAlZWF4Ci0gICAgICAgIGNhbGwgICo4KCVlYnApCi0KLSAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCi0gICAgICAgIGFkZGwgICQ4LCVlc3AKLQotICAgICAgICAjIEZJWE1FOiBBbGlnbiB0aGUgc3RhY2sgdG8gYSAxMjgtYml0IGJvdW5kYXJ5IHRvIGF2b2lkCi0gICAgICAgICMgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGhpdHMuCi0KLSAgICAgICAgY2FsbCAgKjI4KCVlYnApCi0KLSAgICAgICAgIyBzdGRjYWxsIGZ1bmN0aW9ucyBwb3AgYXJndW1lbnRzIG9mZiB0aGUgc3RhY2sgdGhlbXNlbHZlcwotCi0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKLSAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAotCi0gICAgICAgICMgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCi0gICAgICAgIGNtcGwgICQwLDI0KCVlYnApCi0gICAgICAgIGpuZSAgIHNjX3JldGludAotCi0gICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCi0gICAgICAgICMgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgIyBGbG9hdF90eXBlCi0gICAgICAgIGpuZSAgIHNjX25vcmV0dmFsCi0gICAgICAgIGZzdHAgICVzdCgwKQotCi0gICAgICAgIGptcCAgIHNjX2VwaWxvZ3VlCi0KLXNjX3JldGludDoKLSAgICAgICAgY21wbCAgJDEsJWVjeCAgICAgICAjIEludF90eXBlCi0gICAgICAgIGpuZSAgIHNjX3JldGZsb2F0Ci0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQotICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQotCi1zY19yZXRmbG9hdDoKLSAgICAgICAgY21wbCAgJDIsJWVjeCAgICAgICAjIEZsb2F0X3R5cGUKLSAgICAgICAgam5lICAgc2NfcmV0ZG91YmxlCi0gICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBmc3RwcyAoJWVjeCkKLSAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKLQotc2NfcmV0ZG91YmxlOgotICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgICMgRG91YmxlX3R5cGUKLSAgICAgICAgam5lICAgc2NfcmV0bG9uZ2RvdWJsZQotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBmc3RwbCAoJWVjeCkKLSAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKLQotc2NfcmV0bG9uZ2RvdWJsZToKLSAgICAgICAgY21wbCAgJDQsJWVjeCAgICAgICMgTG9uZ2RvdWJsZV90eXBlIAotICAgICAgICBqbmUgICBzY19yZXRpbnQ2NAotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBmc3RwdCAoJWVjeCkKLSAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKLQotc2NfcmV0aW50NjQ6Ci0gICAgICAgIGNtcGwgICQxMiwlZWN4ICAgICAgIyBTSU5UNjRfVHlwZQotICAgICAgICBqbmUgICBzY19yZXRzdHJ1Y3QKLSAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKLSAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCi0gICAgICAgIG1vdmwgICVlZHgsNCglZWN4KQotCi1zY19yZXRzdHJ1Y3Q6Ci0gICAgICAgICMgTm90aGluZyB0byBkbyEKLQotc2Nfbm9yZXR2YWw6Ci1zY19lcGlsb2d1ZToKLSAgICAgICAgbW92bCAlZWJwLCVlc3AKLSAgICAgICAgcG9wbCAlZWJwCi0gICAgICAgIHJldAotCi0uZmZpX2NhbGxfU1REQ0FMTF9lbmQ6Ci0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9tYWxsb2NfY2xvc3VyZS5jIGIvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMKaW5kZXggMjllOWY0Yy4uNGNkNWRkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMKQEAgLTEsMyArMSw3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgPFB5dGhvbi5oPgogI2luY2x1ZGUgPGZmaS5oPgogI2lmZGVmIE1TX1dJTjMyCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jIGIvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYwppbmRleCBjMWMzMGYxLi5iNGQ4MTk2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKQEAgLTEsMyArMSw3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgPGZmaS5oPgogI2lmZGVmIE1TX1dJTjMyCkBAIC0xMjgsNDIgKzEzMiwxNDggQEAKIAlpZiAoIVB5VHlwZV9DaGVjayhvYmopKQogCQlyZXR1cm4gTlVMTDsKIAl0eXBlID0gKFB5VHlwZU9iamVjdCAqKW9iajsKLQlpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVN0Z0RpY3RfQ2hlY2sodHlwZS0+dHBfZGljdCkpCisJaWYgKCF0eXBlLT50cF9kaWN0IHx8ICFTdGdEaWN0X0NoZWNrRXhhY3QodHlwZS0+dHBfZGljdCkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAoU3RnRGljdE9iamVjdCAqKXR5cGUtPnRwX2RpY3Q7CiB9CiAKIC8qIE1heSByZXR1cm4gTlVMTCwgYnV0IGRvZXMgbm90IHNldCBhbiBleGNlcHRpb24hICovCisvKgorICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLCBzbyB3ZSBkb24ndCBjYWxsIFB5VHlwZV9zdGdkaWN0CisgIGFib3ZlIGJ1dCBpbmxpbmUgdGhlIGNvZGUsIGFuZCBhdm9pZCB0aGUgUHlUeXBlX0NoZWNrKCkuCisqLwogU3RnRGljdE9iamVjdCAqCiBQeU9iamVjdF9zdGdkaWN0KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmLT5vYl90eXBlKTsKKwlQeVR5cGVPYmplY3QgKnR5cGUgPSBzZWxmLT5vYl90eXBlOworCWlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OwogfQogCi0jaWYgMAotLyogd29yayBpbiBwcm9ncmVzczogYW5vbnltb3VzIHN0cnVjdHVyZSBmaWVsZHMgKi8KLWludAotR2V0RmllbGRzKFB5T2JqZWN0ICpkZXNjLCBpbnQgKnBpbmRleCwgaW50ICpwc2l6ZSwgaW50ICpwb2Zmc2V0LCBpbnQgKnBhbGlnbiwgaW50IHBhY2spOwotCisvKiBkZXNjciBpcyB0aGUgZGVzY3JpcHRvciBmb3IgYSBmaWVsZCBtYXJrZWQgYXMgYW5vbnltb3VzLiAgR2V0IGFsbCB0aGUKKyBfZmllbGRzXyBkZXNjcmlwdG9ycyBmcm9tIGRlc2NyLT5wcm90bywgY3JlYXRlIG5ldyBkZXNjcmlwdG9ycyB3aXRoIG9mZnNldAorIGFuZCBpbmRleCBhZGp1c3RlZCwgYW5kIHN0dWZmIHRoZW0gaW50byB0eXBlLgorICovCitzdGF0aWMgaW50CitNYWtlRmllbGRzKFB5T2JqZWN0ICp0eXBlLCBDRmllbGRPYmplY3QgKmRlc2NyLAorCSAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgb2Zmc2V0KQogewotCWludCBpOwotCVB5T2JqZWN0ICp0dXBsZXMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRlc2MsICJfZmllbGRzXyIpOwotCWlmICh0dXBsZXMgPT0gTlVMTCkKKwlQeV9zc2l6ZV90IGk7CisJUHlPYmplY3QgKmZpZWxkczsKKwlQeU9iamVjdCAqZmllbGRsaXN0OworCisJZmllbGRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkZXNjci0+cHJvdG8sICJfZmllbGRzXyIpOworCWlmIChmaWVsZHMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwotCWlmICghUHlUdXBsZV9DaGVjayh0dXBsZXMpKQotCQlyZXR1cm4gLTE7IC8qIGxlYWsgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRSh0dXBsZXMpOyArK2kpIHsKLQkJY2hhciAqZm5hbWU7Ci0JCVB5T2JqZWN0ICpkdW1teTsKLQkJQ0ZpZWxkT2JqZWN0ICpmaWVsZDsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVR1cGxlX0dFVF9JVEVNKHR1cGxlcywgaSk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAic08iLCAmZm5hbWUsICZkdW1teSkpCi0JCQlyZXR1cm4gLTE7IC8qIGxlYWsgKi8KLQkJZmllbGQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRlc2MsIGZuYW1lKTsKLQkJUHlfREVDUkVGKGZpZWxkKTsKKwlmaWVsZGxpc3QgPSBQeVNlcXVlbmNlX0Zhc3QoZmllbGRzLCAiX2ZpZWxkc18gbXVzdCBiZSBhIHNlcXVlbmNlIik7CisJUHlfREVDUkVGKGZpZWxkcyk7CisJaWYgKGZpZWxkbGlzdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZpZWxkbGlzdCk7ICsraSkgeworCQlQeU9iamVjdCAqcGFpciA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmaWVsZGxpc3QsIGkpOyAvKiBib3Jyb3dlZCAqLworCQlQeU9iamVjdCAqZm5hbWUsICpmdHlwZTsKKwkJQ0ZpZWxkT2JqZWN0ICpmZGVzY3I7CisJCUNGaWVsZE9iamVjdCAqbmV3X2Rlc2NyOworCQkvKiBDb252ZXJ0IHRvIFB5QXJnX1VucGFja1R1cGxlLi4uICovCisJCWlmICghUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT08iLCAmZm5hbWUsICZmdHlwZSkpIHsKKwkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKGRlc2NyLT5wcm90bywgZm5hbWUpOworCQlpZiAoZmRlc2NyID09IE5VTEwpIHsKKwkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChmZGVzY3ItPm9iX3R5cGUgIT0gJkNGaWVsZF9UeXBlKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5leHBlY3RlZCB0eXBlIik7CisJCQlQeV9ERUNSRUYoZmRlc2NyKTsKKwkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChmZGVzY3ItPmFub255bW91cykgeworCQkJaW50IHJjID0gTWFrZUZpZWxkcyh0eXBlLCBmZGVzY3IsCisJCQkJCSAgICBpbmRleCArIGZkZXNjci0+aW5kZXgsCisJCQkJCSAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7CisJCQlQeV9ERUNSRUYoZmRlc2NyKTsKKwkJCWlmIChyYyA9PSAtMSkgeworCQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisgCQluZXdfZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmQ0ZpZWxkX1R5cGUsIE5VTEwpOworCQlhc3NlcnQobmV3X2Rlc2NyLT5vYl90eXBlID09ICZDRmllbGRfVHlwZSk7CisJCWlmIChuZXdfZGVzY3IgPT0gTlVMTCkgeworCQkJUHlfREVDUkVGKGZkZXNjcik7CisJCQlQeV9ERUNSRUYoZmllbGRsaXN0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorIAkJbmV3X2Rlc2NyLT5zaXplID0gZmRlc2NyLT5zaXplOworIAkJbmV3X2Rlc2NyLT5vZmZzZXQgPSBmZGVzY3ItPm9mZnNldCArIG9mZnNldDsKKyAJCW5ld19kZXNjci0+aW5kZXggPSBmZGVzY3ItPmluZGV4ICsgaW5kZXg7CisgCQluZXdfZGVzY3ItPnByb3RvID0gZmRlc2NyLT5wcm90bzsKKyAJCVB5X1hJTkNSRUYobmV3X2Rlc2NyLT5wcm90byk7CisgCQluZXdfZGVzY3ItPmdldGZ1bmMgPSBmZGVzY3ItPmdldGZ1bmM7CisgCQluZXdfZGVzY3ItPnNldGZ1bmMgPSBmZGVzY3ItPnNldGZ1bmM7CisKKyAgCQlQeV9ERUNSRUYoZmRlc2NyKTsKKwkJCisJCWlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHR5cGUsIGZuYW1lLCAoUHlPYmplY3QgKiluZXdfZGVzY3IpKSB7CisJCQlQeV9ERUNSRUYoZmllbGRsaXN0KTsKKwkJCVB5X0RFQ1JFRihuZXdfZGVzY3IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCVB5X0RFQ1JFRihuZXdfZGVzY3IpOwogCX0KKwlQeV9ERUNSRUYoZmllbGRsaXN0KTsKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZgorCisvKiBJdGVyYXRlIG92ZXIgdGhlIG5hbWVzIGluIHRoZSB0eXBlJ3MgX2Fub255bW91c18gYXR0cmlidXRlLCBpZiBwcmVzZW50LAorICovCitzdGF0aWMgaW50CitNYWtlQW5vbkZpZWxkcyhQeU9iamVjdCAqdHlwZSkKK3sKKwlQeU9iamVjdCAqYW5vbjsKKwlQeU9iamVjdCAqYW5vbl9uYW1lczsKKwlQeV9zc2l6ZV90IGk7CisKKwlhbm9uID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX2Fub255bW91c18iKTsKKwlpZiAoYW5vbiA9PSBOVUxMKSB7CisJCVB5RXJyX0NsZWFyKCk7CisJCXJldHVybiAwOworCX0KKwlhbm9uX25hbWVzID0gUHlTZXF1ZW5jZV9GYXN0KGFub24sICJfYW5vbnltb3VzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKwlQeV9ERUNSRUYoYW5vbik7CisJaWYgKGFub25fbmFtZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7CisJCVB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KKwkJQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKKwkJaWYgKGRlc2NyID09IE5VTEwpIHsKKwkJCVB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhc3NlcnQoZGVzY3ItPm9iX3R5cGUgPT0gJkNGaWVsZF9UeXBlKTsKKwkJZGVzY3ItPmFub255bW91cyA9IDE7CisKKwkJLyogZGVzY3IgaXMgaW4gdGhlIGZpZWxkIGRlc2NyaXB0b3IuICovCisJCWlmICgtMSA9PSBNYWtlRmllbGRzKHR5cGUsIChDRmllbGRPYmplY3QgKilkZXNjciwKKwkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5pbmRleCwKKwkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5vZmZzZXQpKSB7CisJCQlQeV9ERUNSRUYoZGVzY3IpOworCQkJUHlfREVDUkVGKGFub25fbmFtZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCVB5X0RFQ1JFRihkZXNjcik7CisJfQorCisJUHlfREVDUkVGKGFub25fbmFtZXMpOworCXJldHVybiAwOworfQogCiAvKgogICBSZXRyaXZlIHRoZSAob3B0aW9uYWwpIF9wYWNrXyBhdHRyaWJ1dGUgZnJvbSBhIHR5cGUsIHRoZSBfZmllbGRzXyBhdHRyaWJ1dGUsCkBAIC0zNjYsNSArNDc2LDUgQEAKIAlzdGdkaWN0LT5zaXplID0gc2l6ZTsKIAlzdGdkaWN0LT5hbGlnbiA9IHRvdGFsX2FsaWduOwogCXN0Z2RpY3QtPmxlbmd0aCA9IGxlbjsJLyogQUREIGZmaV9vZnM/ICovCi0JcmV0dXJuIDA7CisJcmV0dXJuIE1ha2VBbm9uRmllbGRzKHR5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMgYi9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYwppbmRleCA3MWQ3YTY5Li5lYzU1YzhlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYwpAQCAtNDMsOCArNDMsOCBAQAogCWRlbF9jdXJ0ZXJtIGRlbHNjcmVlbiBkdXB3aW4gaW5jaG5zdHIgaW5jaHN0ciBpbm5zdHIga2V5b2sKIAltY3ByaW50IG12YWRkY2huc3RyIG12YWRkY2hzdHIgbXZjaGdhdCBtdmN1ciBtdmluY2huc3RyCiAJbXZpbmNoc3RyIG12aW5uc3RyIG1tdndhZGRjaG5zdHIgbXZ3YWRkY2hzdHIgbXZ3Y2hnYXQKLQltdndnZXRuc3RyIG12d2luY2huc3RyIG12d2luY2hzdHIgbXZ3aW5uc3RyIG5ld3Rlcm0KLQlyZXNpemV0ZXJtIHJlc3RhcnR0ZXJtIHJpcG9mZmxpbmUgc2NyX2R1bXAKKwltdndpbmNobnN0ciBtdndpbmNoc3RyIG12d2lubnN0ciBuZXd0ZXJtCisJcmVzdGFydHRlcm0gcmlwb2ZmbGluZSBzY3JfZHVtcAogCXNjcl9pbml0IHNjcl9yZXN0b3JlIHNjcl9zZXQgc2NybCBzZXRfY3VydGVybSBzZXRfdGVybSBzZXR0ZXJtCiAJdGdldGVudCB0Z2V0ZmxhZyB0Z2V0bnVtIHRnZXRzdHIgdGdvdG8gdGltZW91dCB0cHV0cwogCXZpZGF0dHIgdmlkcHV0cyB3YWRkY2huc3RyIHdhZGRjaHN0ciB3Y2hnYXQKQEAgLTgxOSwxNCArODE5LDE3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpO3kseCIsJnksJngpKQogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworI2lmZGVmIFNUUklDVF9TWVNWX0NVUlNFUworICAgIHJ0bjIgPSB3bW92ZShzZWxmLT53aW4seSx4KT09RVJSID8gRVJSIDogd2dldG5zdHIoc2VsZi0+d2luLCBydG4sIDEwMjMpOworI2Vsc2UKICAgICBydG4yID0gbXZ3Z2V0bnN0cihzZWxmLT53aW4seSx4LHJ0biwgMTAyMyk7CisjZW5kaWYKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIGJyZWFrOwogICBjYXNlIDM6CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpaTt5LHgsbiIsICZ5LCAmeCwgJm4pKQogICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgU1RSSUNUX1NZU1ZfQ1VSU0VTCi0gLyogVW50ZXN0ZWQgKi8KICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgcnRuMiA9IHdtb3ZlKHNlbGYtPndpbix5LHgpPT1FUlIgPyBFUlIgOgogICAgICAgd2dldG5zdHIoc2VsZi0+d2luLCBydG4sIE1JTihuLCAxMDIzKSk7CkBAIC04MzgsNyArODQxLDcgQEAKICNlbmRpZgogICAgIGJyZWFrOwogICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnZXRzdHIgcmVxdWlyZXMgMCB0byAyIGFyZ3VtZW50cyIpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnZXRzdHIgcmVxdWlyZXMgMCB0byAzIGFyZ3VtZW50cyIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIGlmIChydG4yID09IEVSUikKQEAgLTE5NTAsNiArMTk1MywyOSBAQAogICByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihpbnRyZmx1c2goTlVMTCxjaCksICJpbnRyZmx1c2giKTsKIH0KIAorI2lmZGVmIEhBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRAorc3RhdGljIFB5T2JqZWN0ICoKK1B5Q3Vyc2VzX0lzX1Rlcm1fUmVzaXplZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgIGludCBsaW5lczsKKyAgaW50IGNvbHVtbnM7CisgIGludCByZXN1bHQ7CisKKyAgUHlDdXJzZXNJbml0aWFsaXNlZAorCisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpaTppc190ZXJtX3Jlc2l6ZWQiLCAmbGluZXMsICZjb2x1bW5zKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmVzdWx0ID0gaXNfdGVybV9yZXNpemVkKGxpbmVzLCBjb2x1bW5zKTsKKyAgaWYgKHJlc3VsdCA9PSBUUlVFKSB7CisgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgIHJldHVybiBQeV9UcnVlOworICB9IGVsc2UgeworICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgcmV0dXJuIFB5X0ZhbHNlOworICB9Cit9CisjZW5kaWYgLyogSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVEICovCisKICNpZiAhZGVmaW5lZChfX05ldEJTRF9fKQogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q3Vyc2VzX0tleU5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtMjE3MCw2ICsyMTk2LDM5IEBACiAgIH0KIH0KIAorI2lmZGVmIEhBVkVfQ1VSU0VTX1JFU0laRVRFUk0KK3N0YXRpYyBQeU9iamVjdCAqCitQeUN1cnNlc19SZXNpemVUZXJtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgaW50IGxpbmVzOworICBpbnQgY29sdW1uczsKKworICBQeUN1cnNlc0luaXRpYWxpc2VkCisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOnJlc2l6ZXRlcm0iLCAmbGluZXMsICZjb2x1bW5zKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihyZXNpemV0ZXJtKGxpbmVzLCBjb2x1bW5zKSwgInJlc2l6ZXRlcm0iKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NVUlNFU19SRVNJWkVfVEVSTQorc3RhdGljIFB5T2JqZWN0ICoKK1B5Q3Vyc2VzX1Jlc2l6ZV9UZXJtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgaW50IGxpbmVzOworICBpbnQgY29sdW1uczsKKworICBQeUN1cnNlc0luaXRpYWxpc2VkCisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOnJlc2l6ZV90ZXJtIiwgJmxpbmVzLCAmY29sdW1ucykpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIFB5Q3Vyc2VzQ2hlY2tFUlIocmVzaXplX3Rlcm0obGluZXMsIGNvbHVtbnMpLCAicmVzaXplX3Rlcm0iKTsKK30KKyNlbmRpZiAvKiBIQVZFX0NVUlNFU19SRVNJWkVfVEVSTSAqLworCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDdXJzZXNfc2V0c3l4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTI0MTQsNiArMjQ3Myw5IEBACiAgIHsiaW5pdHNjciIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19Jbml0U2NyLCBNRVRIX05PQVJHU30sCiAgIHsiaW50cmZsdXNoIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19JbnRyRmx1c2gsIE1FVEhfVkFSQVJHU30sCiAgIHsiaXNlbmR3aW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19pc2VuZHdpbiwgTUVUSF9OT0FSR1N9LAorI2lmZGVmIEhBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRAorICB7ImlzX3Rlcm1fcmVzaXplZCIsICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfSXNfVGVybV9SZXNpemVkLCBNRVRIX1ZBUkFSR1N9LAorI2VuZGlmCiAjaWYgIWRlZmluZWQoX19OZXRCU0RfXykKICAgeyJrZXluYW1lIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX0tleU5hbWUsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKQEAgLTI0NDEsNiArMjUwMywxMiBAQAogICB7InJlc2V0X3Byb2dfbW9kZSIsICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfcmVzZXRfcHJvZ19tb2RlLCBNRVRIX05PQVJHU30sCiAgIHsicmVzZXRfc2hlbGxfbW9kZSIsICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19yZXNldF9zaGVsbF9tb2RlLCBNRVRIX05PQVJHU30sCiAgIHsicmVzZXR0eSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19yZXNldHR5LCBNRVRIX05PQVJHU30sCisjaWZkZWYgSEFWRV9DVVJTRVNfUkVTSVpFVEVSTQorICB7InJlc2l6ZXRlcm0iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfUmVzaXplVGVybSwgTUVUSF9WQVJBUkdTfSwKKyNlbmRpZgorI2lmZGVmIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNCisgIHsicmVzaXplX3Rlcm0iLCAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19SZXNpemVfVGVybSwgTUVUSF9WQVJBUkdTfSwKKyNlbmRpZgogICB7InNhdmV0dHkiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfc2F2ZXR0eSwgTUVUSF9OT0FSR1N9LAogICB7InNldHN5eCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfc2V0c3l4LCBNRVRIX1ZBUkFSR1N9LAogICB7InNldHVwdGVybSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfc2V0dXB0ZXJtLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKaW5kZXggZGRhNTA0Mi4uZmUzMGYzMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYworKysgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCkBAIC03MTcsNyArNzE3LDggQEAKIExPQ0FMKGludCkKIGNoZWNrcGF0aChQeU9iamVjdCogdGFnKQogewotICAgIGludCBpLCBjaGVjayA9IDE7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBjaGVjayA9IDE7CiAKICAgICAvKiBjaGVjayBpZiBhIHRhZyBjb250YWlucyBhbiB4cGF0aCBjaGFyYWN0ZXIgKi8KIApAQCAtMTE4MCw3ICsxMTgxLDcgQEAKIGVsZW1lbnRfc2V0c2xpY2UoUHlPYmplY3QqIHNlbGZfLCBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgUHlPYmplY3QqIGl0ZW0pCiB7CiAgICAgRWxlbWVudE9iamVjdCogc2VsZiA9IChFbGVtZW50T2JqZWN0Kikgc2VsZl87Ci0gICAgaW50IGksIG5ldywgb2xkOworICAgIFB5X3NzaXplX3QgaSwgbmV3LCBvbGQ7CiAgICAgUHlPYmplY3QqIHJlY3ljbGUgPSBOVUxMOwogCiAgICAgaWYgKCFzZWxmLT5leHRyYSkKQEAgLTE0MjYsNyArMTQyNyw3IEBACiAgICAgUHlPYmplY3QqIGRhdGE7IC8qIGRhdGEgY29sbGVjdG9yIChzdHJpbmcgb3IgbGlzdCksIG9yIE5VTEwgKi8KIAogICAgIFB5T2JqZWN0KiBzdGFjazsgLyogZWxlbWVudCBzdGFjayAqLwotICAgIGludCBpbmRleDsgLyogY3VycmVudCBzdGFjayBzaXplICgwPWVtcHR5KSAqLworICAgIFB5X3NzaXplX3QgaW5kZXg7IC8qIGN1cnJlbnQgc3RhY2sgc2l6ZSAoMD1lbXB0eSkgKi8KIAogICAgIC8qIGVsZW1lbnQgdHJhY2luZyAqLwogICAgIFB5T2JqZWN0KiBldmVudHM7IC8qIGxpc3Qgb2YgZXZlbnRzLCBvciBOVUxMIGlmIG5vdCBjb2xsZWN0aW5nICovCkBAIC0xNjA2LDcgKzE2MDcsNyBAQAogICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChkYXRhKSAmJiBQeVN0cmluZ19HRVRfU0laRShkYXRhKSA9PSAxKSB7CiAgICAgICAgICAgICAvKiBleHBhdCBvZnRlbiBnZW5lcmF0ZXMgc2luZ2xlIGNoYXJhY3RlciBkYXRhIHNlY3Rpb25zOyBoYW5kbGUKICAgICAgICAgICAgICAgIHRoZSBtb3N0IGNvbW1vbiBjYXNlIGJ5IHJlc2l6aW5nIHRoZSBleGlzdGluZyBzdHJpbmcuLi4gKi8KLSAgICAgICAgICAgIGludCBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzZWxmLT5kYXRhKTsKICAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzZWxmLT5kYXRhLCBzaXplICsgMSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYtPmRhdGEpW3NpemVdID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRhdGEpWzBdOwpAQCAtMTk4OCw3ICsxOTg5LDcgQEAKICAgICAgICAgUHlfWERFQ1JFRihyZXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdCgKLSAgICAgICAgICAgIFB5RXhjX1N5bnRheEVycm9yLCAidW5kZWZpbmVkIGVudGl0eSAmJXM7OiBsaW5lICVkLCBjb2x1bW4gJWQiLAorICAgICAgICAgICAgUHlFeGNfU3ludGF4RXJyb3IsICJ1bmRlZmluZWQgZW50aXR5ICYlczs6IGxpbmUgJWxkLCBjb2x1bW4gJWxkIiwKICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLAogICAgICAgICAgICAgRVhQQVQoR2V0RXJyb3JMaW5lTnVtYmVyKShzZWxmLT5wYXJzZXIpLAogICAgICAgICAgICAgRVhQQVQoR2V0RXJyb3JDb2x1bW5OdW1iZXIpKHNlbGYtPnBhcnNlcikKQEAgLTIzNDksNyArMjM1MCw3IEBACiAKICAgICBpZiAoIW9rKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdCgKLSAgICAgICAgICAgIFB5RXhjX1N5bnRheEVycm9yLCAiJXM6IGxpbmUgJWQsIGNvbHVtbiAlZCIsCisgICAgICAgICAgICBQeUV4Y19TeW50YXhFcnJvciwgIiVzOiBsaW5lICVsZCwgY29sdW1uICVsZCIsCiAgICAgICAgICAgICBFWFBBVChFcnJvclN0cmluZykoRVhQQVQoR2V0RXJyb3JDb2RlKShzZWxmLT5wYXJzZXIpKSwKICAgICAgICAgICAgIEVYUEFUKEdldEVycm9yTGluZU51bWJlcikoc2VsZi0+cGFyc2VyKSwKICAgICAgICAgICAgIEVYUEFUKEdldEVycm9yQ29sdW1uTnVtYmVyKShzZWxmLT5wYXJzZXIpCkBAIC0yNDU2LDcgKzI0NTcsNyBAQAogewogICAgIC8qIGFjdGl2YXRlIGVsZW1lbnQgZXZlbnQgcmVwb3J0aW5nICovCiAKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgVHJlZUJ1aWxkZXJPYmplY3QqIHRhcmdldDsKIAogICAgIFB5T2JqZWN0KiBldmVudHM7IC8qIGV2ZW50IGNvbGxlY3RvciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faG90c2hvdC5jIGIvTW9kdWxlcy9faG90c2hvdC5jCmluZGV4IDVhODFiZmIuLjZkOTc3NmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hvdHNob3QuYworKysgYi9Nb2R1bGVzL19ob3RzaG90LmMKQEAgLTE0LDcgKzE0LDExIEBACiAgKi8KICNpZmRlZiBNU19XSU5ET1dTCiAjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZkZWYgSEFWRV9ESVJFQ1RfSAogI2luY2x1ZGUgPGRpcmVjdC5oPiAgICAvKiBmb3IgZ2V0Y3dkKCkgKi8KKyNlbmRpZgorCiB0eXBlZGVmIF9faW50NjQgaHNfdGltZTsKICNkZWZpbmUgR0VUVElNRU9GREFZKFBfSFNfVElNRSkgXAogCXsgTEFSR0VfSU5URUdFUiBfdGVtcDsgXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwppbmRleCBjMDE2Y2Q3Li5hYmZjYTRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKLSNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKKyNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IDY0ZTQzZWIuLjcwM2FmMTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMzQsNiArMzQsMTkgQEAKIAogc3RhdGljIGludCBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCk7CiAKKwordm9pZCBfc3FsaXRlM19yZXN1bHRfZXJyb3Ioc3FsaXRlM19jb250ZXh0KiBjdHgsIGNvbnN0IGNoYXIqIGVycm1zZywgaW50IGxlbikKK3sKKyAgICAvKiBpbiBvbGRlciBTUUxpdGUgdmVyc2lvbnMsIGNhbGxpbmcgc3FsaXRlM19yZXN1bHRfZXJyb3IgaW4gY2FsbGJhY2tzCisgICAgICogdHJpZ2dlcnMgYSBidWcgaW4gU1FMaXRlIHRoYXQgbGVhZHMgZWl0aGVyIHRvIGlycml0YXRpbmcgcmVzdWx0cyBvcgorICAgICAqIHNlZ2ZhdWx0cywgZGVwZW5kaW5nIG9uIHRoZSBTUUxpdGUgdmVyc2lvbiAqLworI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAzMDAzCisgICAgc3FsaXRlM19yZXN1bHRfZXJyb3IoY3R4LCBlcnJtc2csIGxlbik7CisjZWxzZQorICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOworI2VuZGlmCit9CisKIGludCBjb25uZWN0aW9uX2luaXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCiB7CiAgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OwpAQCAtNDA1LDggKzQxOCw2IEBACiAgICAgUHlPYmplY3QqIHN0cmluZ3ZhbDsKIAogICAgIGlmICgoIXB5X3ZhbCkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAvKiBFcnJvcnMgaW4gY2FsbGJhY2tzIGFyZSBpZ25vcmVkLCBhbmQgd2UgcmV0dXJuIE5VTEwgKi8KLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKICAgICB9IGVsc2UgaWYgKHB5X3ZhbCA9PSBQeV9Ob25lKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CkBAIC01MTksOCArNTMwLDE3IEBACiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICB9CiAKLSAgICBfc2V0X3Jlc3VsdChjb250ZXh0LCBweV9yZXR2YWwpOwotICAgIFB5X1hERUNSRUYocHlfcmV0dmFsKTsKKyAgICBpZiAocHlfcmV0dmFsKSB7CisgICAgICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7CisgICAgICAgIFB5X0RFQ1JFRihweV9yZXR2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24iLCAtMSk7CisgICAgfQogCiAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKIH0KQEAgLTU0NSw4ICs1NjUsMTMgQEAKICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKIAogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSAwOworICAgICAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgeworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQpAQCAtNTY1LDcgKzU5MCwxMiBAQAogICAgIFB5X0RFQ1JFRihhcmdzKTsKIAogICAgIGlmICghZnVuY3Rpb25fcmVzdWx0KSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIiwgLTEpOwogICAgIH0KIAogZXJyb3I6CkBAIC01OTcsMTMgKzYyNywxNiBAQAogCiAgICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgqYWdncmVnYXRlX2luc3RhbmNlLCAiZmluYWxpemUiLCAiIik7CiAgICAgaWYgKCFmdW5jdGlvbl9yZXN1bHQpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeV9Ob25lOworICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBfc3FsaXRlM19yZXN1bHRfZXJyb3IoY29udGV4dCwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsKICAgICB9CiAKLSAgICBfc2V0X3Jlc3VsdChjb250ZXh0LCBmdW5jdGlvbl9yZXN1bHQpOwotCiBlcnJvcjoKICAgICBQeV9YREVDUkVGKCphZ2dyZWdhdGVfaW5zdGFuY2UpOwogICAgIFB5X1hERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKQEAgLTYzMSw3ICs2NjQsNyBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPnN0YXRlbWVudHMpOyBpKyspIHsKICAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnN0YXRlbWVudHMsIGkpOwotICAgICAgICBpZiAod2Vha3JlZiAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKG5ld19saXN0LCB3ZWFrcmVmKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld19saXN0KTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC02OTksNiArNzMyLDYxIEBACiAgICAgfQogfQogCitpbnQgX2F1dGhvcml6ZXJfY2FsbGJhY2sodm9pZCogdXNlcl9hcmcsIGludCBhY3Rpb24sIGNvbnN0IGNoYXIqIGFyZzEsIGNvbnN0IGNoYXIqIGFyZzIgLCBjb25zdCBjaGFyKiBkYm5hbWUsIGNvbnN0IGNoYXIqIGFjY2Vzc19hdHRlbXB0X3NvdXJjZSkKK3sKKyAgICBQeU9iamVjdCAqcmV0OworICAgIGludCByYzsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlOworCisgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKXVzZXJfYXJnLCAiaXNzc3MiLCBhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgYWNjZXNzX2F0dGVtcHRfc291cmNlKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBTUUxJVEVfREVOWTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmV0KSkgeworICAgICAgICAgICAgcmMgPSAoaW50KVB5SW50X0FzTG9uZyhyZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBTUUxJVEVfREVOWTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICB9CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOworICAgIHJldHVybiByYzsKK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fc2V0X2F1dGhvcml6ZXIoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGF1dGhvcml6ZXJfY2I7CisKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJhdXRob3JpemVyX2NhbGxiYWNrIiwgTlVMTCB9OworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86c2V0X2F1dGhvcml6ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZhdXRob3JpemVyX2NiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByYyA9IHNxbGl0ZTNfc2V0X2F1dGhvcml6ZXIoc2VsZi0+ZGIsIF9hdXRob3JpemVyX2NhbGxiYWNrLCAodm9pZCopYXV0aG9yaXplcl9jYik7CisKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCAiRXJyb3Igc2V0dGluZyBhdXRob3JpemVyIGNhbGxiYWNrIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhdXRob3JpemVyX2NiLCBQeV9Ob25lKTsKKworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKwogaW50IGNoZWNrX3RocmVhZChDb25uZWN0aW9uKiBzZWxmKQogewogICAgIGlmIChzZWxmLT5jaGVja19zYW1lX3RocmVhZCkgewpAQCAtOTc1LDYgKzEwNjMsMjQgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKK2Nvbm5lY3Rpb25faW50ZXJydXB0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOworCisgICAgaWYgKCFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBzcWxpdGUzX2ludGVycnVwdChzZWxmLT5kYik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dmFsID0gUHlfTm9uZTsKKworZmluYWxseToKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9jcmVhdGVfY29sbGF0aW9uKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewogICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKQEAgLTEwNjcsNiArMTE3Myw4IEBACiAgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImNyZWF0ZV9hZ2dyZWdhdGUiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgbmV3IGFnZ3JlZ2F0ZS4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7InNldF9hdXRob3JpemVyIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fc2V0X2F1dGhvcml6ZXIsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBQeURvY19TVFIoIlNldHMgYXV0aG9yaXplciBjYWxsYmFjay4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiZXhlY3V0ZW1hbnkiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlbWFueSwgTUVUSF9WQVJBUkdTLApAQCAtMTA3NSw2ICsxMTgzLDggQEAKICAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLAogICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJpbnRlcnJ1cHQiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9pbnRlcnJ1cHQsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkFib3J0IGFueSBwZW5kaW5nIGRhdGFiYXNlIG9wZXJhdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwppbmRleCA5NWE0OTMxLi5hMmQzY2YyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCkBAIC0xMzcsNiArMTM3LDIyIEBACiAgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwogfQogCitQeU9iamVjdCogX2dldF9jb252ZXJ0ZXIoUHlPYmplY3QqIGtleSkKK3sKKyAgICBQeU9iamVjdCogdXBjYXNlX2tleTsKKyAgICBQeU9iamVjdCogcmV0dmFsOworCisgICAgdXBjYXNlX2tleSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoa2V5LCAidXBwZXIiLCAiIik7CisgICAgaWYgKCF1cGNhc2Vfa2V5KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHZhbCA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIHVwY2FzZV9rZXkpOworICAgIFB5X0RFQ1JFRih1cGNhc2Vfa2V5KTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKIGludCBidWlsZF9yb3dfY2FzdF9tYXAoQ3Vyc29yKiBzZWxmKQogewogICAgIGludCBpOwpAQCAtMTc0LDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBfZ2V0X2NvbnZlcnRlcihrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTk1LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBweV9kZWNsdHlwZSk7CisgICAgICAgICAgICAgICAgY29udmVydGVyID0gX2dldF9jb252ZXJ0ZXIocHlfZGVjbHR5cGUpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihweV9kZWNsdHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyOCw3ICsyNDQsMTAgQEAKICAgICB9CiAKICAgICBmb3IgKHBvcyA9IGNvbG5hbWU7OyBwb3MrKykgewotICAgICAgICBpZiAoKnBvcyA9PSAwIHx8ICpwb3MgPT0gJyAnKSB7CisgICAgICAgIGlmICgqcG9zID09IDAgfHwgKnBvcyA9PSAnWycpIHsKKyAgICAgICAgICAgIGlmICgoKnBvcyA9PSAnWycpICYmIChwb3MgPiBjb2xuYW1lKSAmJiAoKihwb3MtMSkgPT0gJyAnKSkgeworICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbG5hbWUsIHBvcyAtIGNvbG5hbWUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzAyLDIzICszMjEsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gUHlfTm9uZSkgewotICAgICAgICAgICAgdmFsX3N0ciA9IChjb25zdCBjaGFyKilzcWxpdGUzX2NvbHVtbl90ZXh0KHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgbmJ5dGVzID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX2Jsb2Ioc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CiAgICAgICAgICAgICBpZiAoIXZhbF9zdHIpIHsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsX3N0cik7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbF9zdHIsIG5ieXRlcyk7CiAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29udmVydGVyLCAiTyIsIGl0ZW0pOwotICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gbG9nIHRoZXNlIGVycm9ycyAqLwotICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC0zNDYsMTAgKzM2MywxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lID0gc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lID0gIjx1bmtub3duIGNvbHVtbiBuYW1lPiI7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiQ291bGQgbm90IGRlY29kZSB0byBVVEYtOCBjb2x1bW4gJXMgd2l0aCB0ZXh0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICJDb3VsZCBub3QgZGVjb2RlIHRvIFVURi04IGNvbHVtbiAnJXMnIHdpdGggdGV4dCAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lICwgdmFsX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgYnVmKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzczLDcgKzM5MCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJvdywgaSwgY29udmVydGVkKTsKKyAgICAgICAgaWYgKGNvbnZlcnRlZCkgeworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJvdywgaSwgY29udmVydGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyb3csIGksIFB5X05vbmUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKQEAgLTU5OCw2ICs2MjAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGluIGEgdXNlci1kZWZpbmVkIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwppbmRleCA3MWQwYWFhLi42MDY0NTRjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0xLDI1ICsxLDI1IEBACi0vKiBtb2R1bGUuYyAtIHRoZSBtb2R1bGUgaXRzZWxmCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotICoKLSAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gKi8KKyAgICAvKiBtb2R1bGUuYyAtIHRoZSBtb2R1bGUgaXRzZWxmCisgICAgICoKKyAgICAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgICAgICoKKyAgICAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgICAgICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICAgICAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgICAgICoKKyAgICAgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgICAgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgICAgICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICAgICAqCisgICAgICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgICAgICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgICAgICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KIAogI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKQEAgLTQwLDYgKzQwLDcgQEAKICAgICAqTm90U3VwcG9ydGVkRXJyb3IsICpPcHRpbWl6ZWRVbmljb2RlOwogCiBQeU9iamVjdCogY29udmVydGVyczsKK2ludCBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3M7CiAKIHN0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKICAgICAgICAga3dhcmdzKQpAQCAtMTQwLDE0ICsxNDEsNDIgQEAKIAogc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKIHsKLSAgICBQeU9iamVjdCogbmFtZTsKKyAgICBjaGFyKiBvcmlnX25hbWU7CisgICAgY2hhciogbmFtZSA9IE5VTEw7CisgICAgY2hhciogYzsKICAgICBQeU9iamVjdCogY2FsbGFibGU7CisgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJm5hbWUsICZjYWxsYWJsZSkpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPIiwgJm9yaWdfbmFtZSwgJmNhbGxhYmxlKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoUHlEaWN0X1NldEl0ZW0oY29udmVydGVycywgbmFtZSwgY2FsbGFibGUpICE9IDApIHsKKyAgICAvKiBjb252ZXJ0IHRoZSBuYW1lIHRvIGxvd2VyY2FzZSAqLworICAgIG5hbWUgPSBQeU1lbV9NYWxsb2Moc3RybGVuKG9yaWdfbmFtZSkgKyAyKTsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc3RyY3B5KG5hbWUsIG9yaWdfbmFtZSk7CisgICAgZm9yIChjID0gbmFtZTsgKmMgIT0gKGNoYXIpMDsgYysrKSB7CisgICAgICAgICpjID0gKCpjKSAmIDB4REY7CisgICAgfQorCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGNvbnZlcnRlcnMsIG5hbWUsIGNhbGxhYmxlKSAhPSAwKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHZhbCA9IFB5X05vbmU7CitlcnJvcjoKKyAgICBpZiAobmFtZSkgeworICAgICAgICBQeU1lbV9GcmVlKG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgUHlPYmplY3QqIGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE3NCwxMyArMjAzLDY0IEBACiAgICAgeyJyZWdpc3Rlcl9hZGFwdGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBweXNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHB5c3FsaXRlLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0LCBNRVRIX1ZBUkFSR1MsIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvY30sCisgICAgeyJlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyIsICAoUHlDRnVuY3Rpb24pZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJFbmFibGUgb3IgZGlzYWJsZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhyb3dpbmcgZXJyb3JzIHRvIHN0ZGVyci4iKX0sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCitzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7CisgICAgY2hhciogY29uc3RhbnRfbmFtZTsKKyAgICBpbnQgY29uc3RhbnRfdmFsdWU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIEludENvbnN0YW50UGFpcjsKKworc3RhdGljIEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0geworICAgIHsiUEFSU0VfREVDTFRZUEVTIiwgUEFSU0VfREVDTFRZUEVTfSwKKyAgICB7IlBBUlNFX0NPTE5BTUVTIiwgUEFSU0VfQ09MTkFNRVN9LAorCisgICAgeyJTUUxJVEVfT0siLCBTUUxJVEVfT0t9LAorICAgIHsiU1FMSVRFX0RFTlkiLCBTUUxJVEVfREVOWX0sCisgICAgeyJTUUxJVEVfSUdOT1JFIiwgU1FMSVRFX0lHTk9SRX0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX0lOREVYIiwgU1FMSVRFX0NSRUFURV9JTkRFWH0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9UQUJMRX0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfSU5ERVh9LAorICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFIiwgU1FMSVRFX0NSRUFURV9URU1QX1RBQkxFfSwKKyAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9UUklHR0VSIiwgU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVJ9LAorICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVklFV30sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RSSUdHRVJ9LAorICAgIHsiU1FMSVRFX0NSRUFURV9WSUVXIiwgU1FMSVRFX0NSRUFURV9WSUVXfSwKKyAgICB7IlNRTElURV9ERUxFVEUiLCBTUUxJVEVfREVMRVRFfSwKKyAgICB7IlNRTElURV9EUk9QX0lOREVYIiwgU1FMSVRFX0RST1BfSU5ERVh9LAorICAgIHsiU1FMSVRFX0RST1BfVEFCTEUiLCBTUUxJVEVfRFJPUF9UQUJMRX0sCisgICAgeyJTUUxJVEVfRFJPUF9URU1QX0lOREVYIiwgU1FMSVRFX0RST1BfVEVNUF9JTkRFWH0sCisgICAgeyJTUUxJVEVfRFJPUF9URU1QX1RBQkxFIiwgU1FMSVRFX0RST1BfVEVNUF9UQUJMRX0sCisgICAgeyJTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9URU1QX1RSSUdHRVJ9LAorICAgIHsiU1FMSVRFX0RST1BfVEVNUF9WSUVXIiwgU1FMSVRFX0RST1BfVEVNUF9WSUVXfSwKKyAgICB7IlNRTElURV9EUk9QX1RSSUdHRVIiLCBTUUxJVEVfRFJPUF9UUklHR0VSfSwKKyAgICB7IlNRTElURV9EUk9QX1ZJRVciLCBTUUxJVEVfRFJPUF9WSUVXfSwKKyAgICB7IlNRTElURV9JTlNFUlQiLCBTUUxJVEVfSU5TRVJUfSwKKyAgICB7IlNRTElURV9QUkFHTUEiLCBTUUxJVEVfUFJBR01BfSwKKyAgICB7IlNRTElURV9SRUFEIiwgU1FMSVRFX1JFQUR9LAorICAgIHsiU1FMSVRFX1NFTEVDVCIsIFNRTElURV9TRUxFQ1R9LAorICAgIHsiU1FMSVRFX1RSQU5TQUNUSU9OIiwgU1FMSVRFX1RSQU5TQUNUSU9OfSwKKyAgICB7IlNRTElURV9VUERBVEUiLCBTUUxJVEVfVVBEQVRFfSwKKyAgICB7IlNRTElURV9BVFRBQ0giLCBTUUxJVEVfQVRUQUNIfSwKKyAgICB7IlNRTElURV9ERVRBQ0giLCBTUUxJVEVfREVUQUNIfSwKKyNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMQorICAgIHsiU1FMSVRFX0FMVEVSX1RBQkxFIiwgU1FMSVRFX0FMVEVSX1RBQkxFfSwKKyAgICB7IlNRTElURV9SRUlOREVYIiwgU1FMSVRFX1JFSU5ERVh9LAorI2VuZGlmCisjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDAKKyAgICB7IlNRTElURV9BTkFMWVpFIiwgU1FMSVRFX0FOQUxZWkV9LAorI2VuZGlmCisgICAgeyhjaGFyKilOVUxMLCAwfQorfTsKKwogUHlNT0RJTklUX0ZVTkMgaW5pdF9zcWxpdGUzKHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKm1vZHVsZSwgKmRpY3Q7CiAgICAgUHlPYmplY3QgKnRtcF9vYmo7CisgICAgaW50IGk7CiAKICAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJfc3FsaXRlMyIsIG1vZHVsZV9tZXRob2RzKTsKIApAQCAtMjc2LDE3ICszNTYsMTUgQEAKICAgICBPcHRpbWl6ZWRVbmljb2RlID0gKFB5T2JqZWN0KikmUHlDZWxsX1R5cGU7CiAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBPcHRpbWl6ZWRVbmljb2RlKTsKIAotICAgIGlmICghKHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhQQVJTRV9ERUNMVFlQRVMpKSkgewotICAgICAgICBnb3RvIGVycm9yOworICAgIC8qIFNldCBpbnRlZ2VyIGNvbnN0YW50cyAqLworICAgIGZvciAoaSA9IDA7IF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUgIT0gMDsgaSsrKSB7CisgICAgICAgIHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF92YWx1ZSk7CisgICAgICAgIGlmICghdG1wX29iaikgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBfaW50X2NvbnN0YW50c1tpXS5jb25zdGFudF9uYW1lLCB0bXBfb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcF9vYmopOwogICAgIH0KLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfREVDTFRZUEVTIiwgdG1wX29iaik7Ci0gICAgUHlfREVDUkVGKHRtcF9vYmopOwotCi0gICAgaWYgKCEodG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKFBBUlNFX0NPTE5BTUVTKSkpIHsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlBBUlNFX0NPTE5BTUVTIiwgdG1wX29iaik7Ci0gICAgUHlfREVDUkVGKHRtcF9vYmopOwogCiAgICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUFlTUUxJVEVfVkVSU0lPTikpKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0zMDYsNiArMzg0LDggQEAKICAgICAvKiBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGNvbnZlcnRlcnMgKi8KICAgICBjb252ZXJ0ZXJzX2luaXQoZGljdCk7CiAKKyAgICBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MgPSAwOworCiAgICAgLyogT3JpZ2luYWwgY29tbWVudCBmb3JtIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCiAgICAgICogbmVlZGVkIG5vd2FkYXlzIGZvciBQeXRob24gMi4zLzIuNC4KICAgICAgKiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaCBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaAppbmRleCBmM2UyYWExLi5lNTE0YmQxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIFBZU1FMSVRFX01PRFVMRV9ICiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKLSNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi4yLjIiCisjZGVmaW5lIFBZU1FMSVRFX1ZFUlNJT04gIjIuMy4yIgogCiBleHRlcm4gUHlPYmplY3QqIEVycm9yOwogZXh0ZXJuIFB5T2JqZWN0KiBXYXJuaW5nOwpAQCAtNTAsNiArNTAsOCBAQAogICovCiBleHRlcm4gUHlPYmplY3QqIGNvbnZlcnRlcnM7CiAKK2V4dGVybiBpbnQgX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzOworCiAjZGVmaW5lIFBBUlNFX0RFQ0xUWVBFUyAxCiAjZGVmaW5lIFBBUlNFX0NPTE5BTUVTIDIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKaW5kZXggMzM3NDhhNi4uZjVhNzIzMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCkBAIC0zOCw3ICszOCw3IEBACiAKIC8qKgogICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KLSAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJlZCkuCisgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4KICAqLwogaW50IF9zZXRlcnJvcihzcWxpdGUzKiBkYikKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmggYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCmluZGV4IGU5OWE0ZGQuLjdjZTNkNDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApAQCAtMzIsNyArMzIsNyBAQAogCiAvKioKICAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCi0gKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VyZWQpLgorICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvciBvY2N1cnJlZCkuCiAgKi8KIGludCBfc2V0ZXJyb3Ioc3FsaXRlMyogZGIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcmUuYyBiL01vZHVsZXMvX3NyZS5jCmluZGV4IGQ0ZTYwNTEuLjY4ZDUxMWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NyZS5jCisrKyBiL01vZHVsZXMvX3NyZS5jCkBAIC0zOSw2ICszOSw4IEBACiBzdGF0aWMgY2hhciBjb3B5cmlnaHRbXSA9CiAgICAgIiBTUkUgMi4yLjIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIgIjsKIAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIgLyogb2Zmc2V0b2YgKi8KIApAQCAtMjYxLDkgKzI2Myw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRhdGFfc3RhY2tfZ3JvdyhTUkVfU1RBVEUqIHN0YXRlLCBpbnQgc2l6ZSkKK2RhdGFfc3RhY2tfZ3JvdyhTUkVfU1RBVEUqIHN0YXRlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0gICAgaW50IG1pbnNpemUsIGN1cnNpemU7CisgICAgUHlfc3NpemVfdCBtaW5zaXplLCBjdXJzaXplOwogICAgIG1pbnNpemUgPSBzdGF0ZS0+ZGF0YV9zdGFja19iYXNlK3NpemU7CiAgICAgY3Vyc2l6ZSA9IHN0YXRlLT5kYXRhX3N0YWNrX3NpemU7CiAgICAgaWYgKGN1cnNpemUgPCBtaW5zaXplKSB7CkBAIC0zMzUsNyArMzM3LDcgQEAKIHsKICAgICAvKiBjaGVjayBpZiBwb2ludGVyIGlzIGF0IGdpdmVuIHBvc2l0aW9uICovCiAKLSAgICBpbnQgdGhpc3AsIHRoYXRwOworICAgIFB5X3NzaXplX3QgdGhpc3AsIHRoYXRwOwogCiAgICAgc3dpdGNoIChhdCkgewogCkBAIC00NzYsNyArNDc4LDcgQEAKICAgICAgICAgY2FzZSBTUkVfT1BfQklHQ0hBUlNFVDoKICAgICAgICAgICAgIC8qIDxCSUdDSEFSU0VUPiA8YmxvY2tjb3VudD4gPDI1NiBibG9ja2luZGljZXM+IDxibG9ja3M+ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCwgYmxvY2s7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50LCBibG9jazsKICAgICAgICAgICAgIGNvdW50ID0gKihzZXQrKyk7CiAKICAgICAgICAgICAgIGlmIChzaXplb2YoU1JFX0NPREUpID09IDIpIHsKQEAgLTUxMCwxNSArNTEyLDE1IEBACiAgICAgfQogfQogCi1MT0NBTChpbnQpIFNSRV9NQVRDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybik7CitMT0NBTChQeV9zc2l6ZV90KSBTUkVfTUFUQ0goU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4pOwogCi1MT0NBTChpbnQpCi1TUkVfQ09VTlQoU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4sIGludCBtYXhjb3VudCkKK0xPQ0FMKFB5X3NzaXplX3QpCitTUkVfQ09VTlQoU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4sIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7CiAgICAgU1JFX0NPREUgY2hyOwogICAgIFNSRV9DSEFSKiBwdHIgPSAoU1JFX0NIQVIgKilzdGF0ZS0+cHRyOwogICAgIFNSRV9DSEFSKiBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIC8qIGFkanVzdCBlbmQgKi8KICAgICBpZiAobWF4Y291bnQgPCBlbmQgLSBwdHIgJiYgbWF4Y291bnQgIT0gNjU1MzUpCkBAIC02MDgsNyArNjEwLDcgQEAKIAogICAgIFNSRV9DSEFSKiBlbmQgPSBzdGF0ZS0+ZW5kOwogICAgIFNSRV9DSEFSKiBwdHIgPSBzdGF0ZS0+cHRyOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIC8qIGNoZWNrIG1pbmltYWwgbGVuZ3RoICovCiAgICAgaWYgKHBhdHRlcm5bM10gJiYgKGVuZCAtIHB0cikgPCBwYXR0ZXJuWzNdKQpAQCAtNzg1LDEzICs3ODcsMTMgQEAKICAgICB3aGlsZSAoMCkgLyogZ2NjIGRvZXNuJ3QgbGlrZSBsYWJlbHMgYXQgZW5kIG9mIHNjb3BlcyAqLyBcCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgbGFzdF9jdHhfcG9zOwotICAgIGludCBqdW1wOworICAgIFB5X3NzaXplX3QgbGFzdF9jdHhfcG9zOworICAgIFB5X3NzaXplX3QganVtcDsKICAgICBTUkVfQ0hBUiogcHRyOwogICAgIFNSRV9DT0RFKiBwYXR0ZXJuOwotICAgIGludCBjb3VudDsKLSAgICBpbnQgbGFzdG1hcms7Ci0gICAgaW50IGxhc3RpbmRleDsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIFB5X3NzaXplX3QgbGFzdG1hcms7CisgICAgUHlfc3NpemVfdCBsYXN0aW5kZXg7CiAgICAgdW5pb24gewogICAgICAgICBTUkVfQ09ERSBjaHI7CiAgICAgICAgIFNSRV9SRVBFQVQqIHJlcDsKQEAgLTgwMCwxMyArODAyLDEzIEBACiAKIC8qIGNoZWNrIGlmIHN0cmluZyBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLiAgcmV0dXJucyA8MCBmb3IKICAgIGVycm9yLCAwIGZvciBmYWlsdXJlLCBhbmQgMSBmb3Igc3VjY2VzcyAqLwotTE9DQUwoaW50KQorTE9DQUwoUHlfc3NpemVfdCkKIFNSRV9NQVRDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybikKIHsKICAgICBTUkVfQ0hBUiogZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKLSAgICBpbnQgYWxsb2NfcG9zLCBjdHhfcG9zID0gLTE7Ci0gICAgaW50IGksIHJldCA9IDA7Ci0gICAgaW50IGp1bXA7CisgICAgUHlfc3NpemVfdCBhbGxvY19wb3MsIGN0eF9wb3MgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGksIHJldCA9IDA7CisgICAgUHlfc3NpemVfdCBqdW1wOwogCiAgICAgU1JFX01BVENIX0NPTlRFWFQqIGN0eDsKICAgICBTUkVfTUFUQ0hfQ09OVEVYVCogbmV4dGN0eDsKQEAgLTg1MSw3ICs4NTMsNyBAQAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tYXJrIGFycmF5LiAgSWYgaXQgaXMgaW5jcmVhc2VkIGJ5IG1vcmUgdGhhbiAxLAogICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcnZlbmluZyBtYXJrcyBtdXN0IGJlIHNldCB0byBOVUxMIHRvIHNpZ25hbAogICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlc2UgbWFya3MgaGF2ZSBub3QgYmVlbiBlbmNvdW50ZXJlZC4gKi8KLSAgICAgICAgICAgICAgICBpbnQgaiA9IHN0YXRlLT5sYXN0bWFyayArIDE7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBqID0gc3RhdGUtPmxhc3RtYXJrICsgMTsKICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGkpCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tYXJrW2orK10gPSBOVUxMOwogICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0bWFyayA9IGk7CkBAIC0xMDM3LDcgKzEwMzksNyBAQAogICAgICAgICAgICAgICAgc3RyaW5nLiAgY2hlY2sgaWYgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gbWF0Y2hlcywKICAgICAgICAgICAgICAgIGFuZCBiYWNrdHJhY2sgaWYgbm90LiAqLwogCi0gICAgICAgICAgICBpZiAoY3R4LT5jb3VudCA8IChpbnQpIGN0eC0+cGF0dGVyblsxXSkKKyAgICAgICAgICAgIGlmIChjdHgtPmNvdW50IDwgKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblsxXSkKICAgICAgICAgICAgICAgICBSRVRVUk5fRkFJTFVSRTsKIAogICAgICAgICAgICAgaWYgKGN0eC0+cGF0dGVybltjdHgtPnBhdHRlcm5bMF1dID09IFNSRV9PUF9TVUNDRVNTKSB7CkBAIC0xMDUzLDEyICsxMDU1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gY2Fubm90IHBvc3NpYmx5IG1hdGNoICovCiAgICAgICAgICAgICAgICAgY3R4LT51LmNociA9IGN0eC0+cGF0dGVybltjdHgtPnBhdHRlcm5bMF0rMV07CiAgICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3R4LT5jb3VudCA+PSAoaW50KSBjdHgtPnBhdHRlcm5bMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN0eC0+Y291bnQgPj0gKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblsxXSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+cHRyID49IGVuZCB8fCAqY3R4LT5wdHIgIT0gY3R4LT51LmNocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cHRyLS07CiAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvdW50LS07CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y291bnQgPCAoaW50KSBjdHgtPnBhdHRlcm5bMV0pCisgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPmNvdW50IDwgKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cHRyID0gY3R4LT5wdHI7CiAgICAgICAgICAgICAgICAgICAgIERPX0pVTVAoSlVNUF9SRVBFQVRfT05FXzEsIGp1bXBfcmVwZWF0X29uZV8xLApAQCAtMTA3Niw3ICsxMDc4LDcgQEAKIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGNhc2UgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3R4LT5jb3VudCA+PSAoaW50KSBjdHgtPnBhdHRlcm5bMV0pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3R4LT5jb3VudCA+PSAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBjdHgtPnB0cjsKICAgICAgICAgICAgICAgICAgICAgRE9fSlVNUChKVU1QX1JFUEVBVF9PTkVfMiwganVtcF9yZXBlYXRfb25lXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXR0ZXJuK2N0eC0+cGF0dGVyblswXSk7CkBAIC0xMTE2LDcgKzExMTgsNyBAQAogICAgICAgICAgICAgICAgIHJldCA9IFNSRV9DT1VOVChzdGF0ZSwgY3R4LT5wYXR0ZXJuKzMsIGN0eC0+cGF0dGVyblsxXSk7CiAgICAgICAgICAgICAgICAgUkVUVVJOX09OX0VSUk9SKHJldCk7CiAgICAgICAgICAgICAgICAgREFUQV9MT09LVVBfQVQoU1JFX01BVENIX0NPTlRFWFQsIGN0eCwgY3R4X3Bvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpIGN0eC0+cGF0dGVyblsxXSkKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblsxXSkKICAgICAgICAgICAgICAgICAgICAgLyogZGlkbid0IG1hdGNoIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzICovCiAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9GQUlMVVJFOwogICAgICAgICAgICAgICAgIC8qIGFkdmFuY2UgcGFzdCBtaW5pbXVtIG1hdGNoZXMgb2YgcmVwZWF0ICovCkBAIC0xMTMyLDggKzExMzQsOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGNhc2UgKi8KICAgICAgICAgICAgICAgICBMQVNUTUFSS19TQVZFKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChpbnQpY3R4LT5wYXR0ZXJuWzJdID09IDY1NTM1Ci0gICAgICAgICAgICAgICAgICAgICAgIHx8IGN0eC0+Y291bnQgPD0gKGludCljdHgtPnBhdHRlcm5bMl0pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKFB5X3NzaXplX3QpY3R4LT5wYXR0ZXJuWzJdID09IDY1NTM1CisgICAgICAgICAgICAgICAgICAgICAgIHx8IGN0eC0+Y291bnQgPD0gKFB5X3NzaXplX3QpY3R4LT5wYXR0ZXJuWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBjdHgtPnB0cjsKICAgICAgICAgICAgICAgICAgICAgRE9fSlVNUChKVU1QX01JTl9SRVBFQVRfT05FLGp1bXBfbWluX3JlcGVhdF9vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXR0ZXJuK2N0eC0+cGF0dGVyblswXSk7CkBAIC0xMzEyLDcgKzEzMTQsNyBAQAogICAgICAgICAgICAgICAgICAgIGN0eC0+cHRyLCBjdHgtPnBhdHRlcm5bMF0pKTsKICAgICAgICAgICAgIGkgPSBjdHgtPnBhdHRlcm5bMF07CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGdyb3VwcmVmID0gaStpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZ3JvdXByZWYgPSBpK2k7CiAgICAgICAgICAgICAgICAgaWYgKGdyb3VwcmVmID49IHN0YXRlLT5sYXN0bWFyaykgewogICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRkFJTFVSRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTMzNiw3ICsxMzM4LDcgQEAKICAgICAgICAgICAgICAgICAgICBjdHgtPnB0ciwgY3R4LT5wYXR0ZXJuWzBdKSk7CiAgICAgICAgICAgICBpID0gY3R4LT5wYXR0ZXJuWzBdOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBncm91cHJlZiA9IGkraTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGdyb3VwcmVmID0gaStpOwogICAgICAgICAgICAgICAgIGlmIChncm91cHJlZiA+PSBzdGF0ZS0+bGFzdG1hcmspIHsKICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEzNjEsNyArMTM2Myw3IEBACiAgICAgICAgICAgICAvKiA8R1JPVVBSRUZfRVhJU1RTPiA8Z3JvdXA+IDxza2lwPiBjb2RleWVzIDxKVU1QPiBjb2Rlbm8gLi4uICovCiAgICAgICAgICAgICBpID0gY3R4LT5wYXR0ZXJuWzBdOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBncm91cHJlZiA9IGkraTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGdyb3VwcmVmID0gaStpOwogICAgICAgICAgICAgICAgIGlmIChncm91cHJlZiA+PSBzdGF0ZS0+bGFzdG1hcmspIHsKICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXR0ZXJuICs9IGN0eC0+cGF0dGVyblsxXTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDc0LDE0ICsxNDc2LDE0IEBACiAgICAgcmV0dXJuIHJldDsgLyogc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCiB9CiAKLUxPQ0FMKGludCkKK0xPQ0FMKFB5X3NzaXplX3QpCiBTUkVfU0VBUkNIKFNSRV9TVEFURSogc3RhdGUsIFNSRV9DT0RFKiBwYXR0ZXJuKQogewogICAgIFNSRV9DSEFSKiBwdHIgPSAoU1JFX0NIQVIgKilzdGF0ZS0+c3RhcnQ7CiAgICAgU1JFX0NIQVIqIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7Ci0gICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50IHByZWZpeF9sZW4gPSAwOwotICAgIGludCBwcmVmaXhfc2tpcCA9IDA7CisgICAgUHlfc3NpemVfdCBzdGF0dXMgPSAwOworICAgIFB5X3NzaXplX3QgcHJlZml4X2xlbiA9IDA7CisgICAgUHlfc3NpemVfdCBwcmVmaXhfc2tpcCA9IDA7CiAgICAgU1JFX0NPREUqIHByZWZpeCA9IE5VTEw7CiAgICAgU1JFX0NPREUqIGNoYXJzZXQgPSBOVUxMOwogICAgIFNSRV9DT0RFKiBvdmVybGFwID0gTlVMTDsKQEAgLTE1MjMsNyArMTUyNSw3IEBACiAgICAgaWYgKHByZWZpeF9sZW4gPiAxKSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBrbm93biBwcmVmaXguICB1c2UgdGhlIG92ZXJsYXAKICAgICAgICAgICAgdGFibGUgdG8gc2tpcCBmb3J3YXJkIGFzIGZhc3QgYXMgd2UgcG9zc2libHkgY2FuICovCi0gICAgICAgIGludCBpID0gMDsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gMDsKICAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCkgewogICAgICAgICAgICAgZm9yICg7OykgewpAQCAtMTYwNCw3ICsxNjA2LDcgQEAKIH0KIAogTE9DQUwoaW50KQotU1JFX0xJVEVSQUxfVEVNUExBVEUoU1JFX0NIQVIqIHB0ciwgaW50IGxlbikKK1NSRV9MSVRFUkFMX1RFTVBMQVRFKFNSRV9DSEFSKiBwdHIsIFB5X3NzaXplX3QgbGVuKQogewogICAgIC8qIGNoZWNrIGlmIGdpdmVuIHN0cmluZyBpcyBhIGxpdGVyYWwgdGVtcGxhdGUgKGkuZS4gbm8gZXNjYXBlcykgKi8KICAgICB3aGlsZSAobGVuLS0gPiAwKQpAQCAtMTYyNSw3ICsxNjI3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcmVfY29kZXNpemUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzaXplb2YoU1JFX0NPREUpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNpemVvZihTUkVfQ09ERSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTY2MCwxNCArMTY2MiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCoKLWdldHN0cmluZyhQeU9iamVjdCogc3RyaW5nLCBpbnQqIHBfbGVuZ3RoLCBpbnQqIHBfY2hhcnNpemUpCitnZXRzdHJpbmcoUHlPYmplY3QqIHN0cmluZywgUHlfc3NpemVfdCogcF9sZW5ndGgsIGludCogcF9jaGFyc2l6ZSkKIHsKICAgICAvKiBnaXZlbiBhIHB5dGhvbiBvYmplY3QsIHJldHVybiBhIGRhdGEgcG9pbnRlciwgYSBsZW5ndGggKGluCiAgICAgICAgY2hhcmFjdGVycyksIGFuZCBhIGNoYXJhY3RlciBzaXplLiAgcmV0dXJuIE5VTEwgaWYgdGhlIG9iamVjdAogICAgICAgIGlzIG5vdCBhIHN0cmluZyAob3Igbm90IGNvbXBhdGlibGUpICovCiAKICAgICBQeUJ1ZmZlclByb2NzICpidWZmZXI7Ci0gICAgaW50IHNpemUsIGJ5dGVzLCBjaGFyc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGJ5dGVzOworICAgIGludCBjaGFyc2l6ZTsKICAgICB2b2lkKiBwdHI7CiAKICNpZiBkZWZpbmVkKEhBVkVfVU5JQ09ERSkKQEAgLTE3MDYsNyArMTcwOSw3IEBACiAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHN0cmluZykgfHwgYnl0ZXMgPT0gc2l6ZSkKICAgICAgICAgY2hhcnNpemUgPSAxOwogI2lmIGRlZmluZWQoSEFWRV9VTklDT0RFKQotICAgIGVsc2UgaWYgKGJ5dGVzID09IChpbnQpIChzaXplICogc2l6ZW9mKFB5X1VOSUNPREUpKSkKKyAgICBlbHNlIGlmIChieXRlcyA9PSAoUHlfc3NpemVfdCkgKHNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpKQogICAgICAgICBjaGFyc2l6ZSA9IHNpemVvZihQeV9VTklDT0RFKTsKICNlbmRpZgogICAgIGVsc2UgewpAQCAtMTcyNiwxMSArMTcyOSwxMSBAQAogCiBMT0NBTChQeU9iamVjdCopCiBzdGF0ZV9pbml0KFNSRV9TVEFURSogc3RhdGUsIFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFB5T2JqZWN0KiBzdHJpbmcsCi0gICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCkKKyAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQpCiB7CiAgICAgLyogcHJlcGFyZSBzdGF0ZSBvYmplY3QgKi8KIAotICAgIGludCBsZW5ndGg7CisgICAgUHlfc3NpemVfdCBsZW5ndGg7CiAgICAgaW50IGNoYXJzaXplOwogICAgIHZvaWQqIHB0cjsKIApAQCAtMTc5Miw5ICsxNzk1LDkgQEAKICAgICAoKChjaGFyKikobWVtYmVyKSAtIChjaGFyKikoc3RhdGUpLT5iZWdpbm5pbmcpIC8gKHN0YXRlKS0+Y2hhcnNpemUpCiAKIExPQ0FMKFB5T2JqZWN0KikKLXN0YXRlX2dldHNsaWNlKFNSRV9TVEFURSogc3RhdGUsIGludCBpbmRleCwgUHlPYmplY3QqIHN0cmluZywgaW50IGVtcHR5KQorc3RhdGVfZ2V0c2xpY2UoU1JFX1NUQVRFKiBzdGF0ZSwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QqIHN0cmluZywgaW50IGVtcHR5KQogewotICAgIGludCBpLCBqOworICAgIFB5X3NzaXplX3QgaSwgajsKIAogICAgIGluZGV4ID0gKGluZGV4IC0gMSkgKiAyOwogCkBAIC0xODU0LDEwICsxODU3LDEwIEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInBhdHRlcm4iLCAicG9zIiwgImVuZHBvcyIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98aWk6bWF0Y2giLCBrd2xpc3QsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPfG5uOm1hdGNoIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xODkxLDEwICsxODk0LDEwIEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInBhdHRlcm4iLCAicG9zIiwgImVuZHBvcyIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98aWk6c2VhcmNoIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xubjpzZWFyY2giLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTIwMjksMTMgKzIwMzIsMTMgQEAKICAgICBTUkVfU1RBVEUgc3RhdGU7CiAgICAgUHlPYmplY3QqIGxpc3Q7CiAgICAgaW50IHN0YXR1czsKLSAgICBpbnQgaSwgYiwgZTsKKyAgICBQeV9zc2l6ZV90IGksIGIsIGU7CiAKICAgICBQeU9iamVjdCogc3RyaW5nOwotICAgIGludCBzdGFydCA9IDA7Ci0gICAgaW50IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKICAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJzb3VyY2UiLCAicG9zIiwgImVuZHBvcyIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98aWk6ZmluZGFsbCIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98bm46ZmluZGFsbCIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjE1NCwxOCArMjE1NywxOCBAQAogICAgIFB5T2JqZWN0KiBsaXN0OwogICAgIFB5T2JqZWN0KiBpdGVtOwogICAgIGludCBzdGF0dXM7Ci0gICAgaW50IG47Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgaTsKICAgICB2b2lkKiBsYXN0OwogCiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgbWF4c3BsaXQgPSAwOworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInNvdXJjZSIsICJtYXhzcGxpdCIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98aTpzcGxpdCIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98bjpzcGxpdCIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmbWF4c3BsaXQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIDAsIElOVF9NQVgpOworICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIDAsIFBZX1NTSVpFX1RfTUFYKTsKICAgICBpZiAoIXN0cmluZykKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTIyNTksNyArMjI2Miw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCoKIHBhdHRlcm5fc3VieChQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogcHRlbXBsYXRlLCBQeU9iamVjdCogc3RyaW5nLAotICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN1Ym4pCisgICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCwgUHlfc3NpemVfdCBzdWJuKQogewogICAgIFNSRV9TVEFURSBzdGF0ZTsKICAgICBQeU9iamVjdCogbGlzdDsKQEAgLTIyNjksOCArMjI3Miw5IEBACiAgICAgUHlPYmplY3QqIG1hdGNoOwogICAgIHZvaWQqIHB0cjsKICAgICBpbnQgc3RhdHVzOwotICAgIGludCBuOwotICAgIGludCBpLCBiLCBlOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IGksIGIsIGU7CisgICAgaW50IGJpbnQ7CiAgICAgaW50IGZpbHRlcl9pc19jYWxsYWJsZTsKIAogICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKHB0ZW1wbGF0ZSkpIHsKQEAgLTIyODEsNyArMjI4NSw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogaWYgbm90IGNhbGxhYmxlLCBjaGVjayBpZiBpdCdzIGEgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgICAgaW50IGxpdGVyYWw7Ci0gICAgICAgIHB0ciA9IGdldHN0cmluZyhwdGVtcGxhdGUsICZuLCAmYik7CisgICAgICAgIHB0ciA9IGdldHN0cmluZyhwdGVtcGxhdGUsICZuLCAmYmludCk7CisgICAgICAgIGIgPSBiaW50OwogICAgICAgICBpZiAocHRyKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSAxKSB7CiAJCSAgICBsaXRlcmFsID0gc3JlX2xpdGVyYWxfdGVtcGxhdGUoKHVuc2lnbmVkIGNoYXIgKilwdHIsIG4pOwpAQCAtMjMxMCw3ICsyMzE1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIDAsIElOVF9NQVgpOworICAgIHN0cmluZyA9IHN0YXRlX2luaXQoJnN0YXRlLCBzZWxmLCBzdHJpbmcsIDAsIFBZX1NTSVpFX1RfTUFYKTsKICAgICBpZiAoIXN0cmluZykgewogICAgICAgICBQeV9ERUNSRUYoZmlsdGVyKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNDQzLDkgKzI0NDgsOSBAQAogewogICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098aTpzdWIiLCBrd2xpc3QsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xuOnN1YiIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjQ1Nyw5ICsyNDYyLDkgQEAKIHsKICAgICBQeU9iamVjdCogcHRlbXBsYXRlOwogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKICAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJyZXBsIiwgInN0cmluZyIsICJjb3VudCIsIE5VTEwgfTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfGk6c3VibiIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG46c3VibiIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjY0MiwxNSArMjY0NywxNSBAQAogICAgIC8qICJjb21waWxlIiBwYXR0ZXJuIGRlc2NyaXB0b3IgdG8gcGF0dGVybiBvYmplY3QgKi8KIAogICAgIFBhdHRlcm5PYmplY3QqIHNlbGY7Ci0gICAgaW50IGksIG47CisgICAgUHlfc3NpemVfdCBpLCBuOwogCiAgICAgUHlPYmplY3QqIHBhdHRlcm47CiAgICAgaW50IGZsYWdzID0gMDsKICAgICBQeU9iamVjdCogY29kZTsKLSAgICBpbnQgZ3JvdXBzID0gMDsKKyAgICBQeV9zc2l6ZV90IGdyb3VwcyA9IDA7CiAgICAgUHlPYmplY3QqIGdyb3VwaW5kZXggPSBOVUxMOwogICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwID0gTlVMTDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8aU9PIiwgJnBhdHRlcm4sICZmbGFncywKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8bk9PIiwgJnBhdHRlcm4sICZmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmY29kZSwgJmdyb3VwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwaW5kZXgsICZpbmRleGdyb3VwKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNzExLDcgKzI3MTYsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1tYXRjaF9nZXRzbGljZV9ieV9pbmRleChNYXRjaE9iamVjdCogc2VsZiwgaW50IGluZGV4LCBQeU9iamVjdCogZGVmKQorbWF0Y2hfZ2V0c2xpY2VfYnlfaW5kZXgoTWF0Y2hPYmplY3QqIHNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0KiBkZWYpCiB7CiAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5ncm91cHMpIHsKICAgICAgICAgLyogcmFpc2UgSW5kZXhFcnJvciBpZiB3ZSB3ZXJlIGdpdmVuIGEgYmFkIGdyb3VwIG51bWJlciAqLwpAQCAtMjczNSwyMSArMjc0MCwyMSBAQAogICAgICAgICApOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgUHlfc3NpemVfdAogbWF0Y2hfZ2V0aW5kZXgoTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpbmRleCkKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICAgICBpZiAoUHlJbnRfQ2hlY2soaW5kZXgpKQotICAgICAgICByZXR1cm4gKGludCkgUHlJbnRfQVNfTE9ORyhpbmRleCk7CisgICAgICAgIHJldHVybiBQeUludF9Bc1NzaXplX3QoaW5kZXgpOwogCiAgICAgaSA9IC0xOwogCiAgICAgaWYgKHNlbGYtPnBhdHRlcm4tPmdyb3VwaW5kZXgpIHsKICAgICAgICAgaW5kZXggPSBQeU9iamVjdF9HZXRJdGVtKHNlbGYtPnBhdHRlcm4tPmdyb3VwaW5kZXgsIGluZGV4KTsKICAgICAgICAgaWYgKGluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2soaW5kZXgpKQotICAgICAgICAgICAgICAgIGkgPSAoaW50KSBQeUludF9BU19MT05HKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhpbmRleCkgfHwgUHlMb25nX0NoZWNrKGluZGV4KSkKKyAgICAgICAgICAgICAgICBpID0gUHlJbnRfQXNTc2l6ZV90KGluZGV4KTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihpbmRleCk7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTI3NzgsNyArMjc4Myw3IEBACiBtYXRjaF9ncm91cChNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgUHlPYmplY3QqIHJlc3VsdDsKLSAgICBpbnQgaSwgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGksIHNpemU7CiAKICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKIApAQCAtMjgxMyw3ICsyODE4LDcgQEAKIG1hdGNoX2dyb3VwcyhNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdykKIHsKICAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIGludCBpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogCiAgICAgUHlPYmplY3QqIGRlZiA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAiZGVmYXVsdCIsIE5VTEwgfTsKQEAgLTI4NDIsNyArMjg0Nyw3IEBACiB7CiAgICAgUHlPYmplY3QqIHJlc3VsdDsKICAgICBQeU9iamVjdCoga2V5czsKLSAgICBpbnQgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleDsKIAogICAgIFB5T2JqZWN0KiBkZWYgPSBQeV9Ob25lOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgImRlZmF1bHQiLCBOVUxMIH07CkBAIC0yODg4LDcgKzI4OTMsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogbWF0Y2hfc3RhcnQoTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIGludCBpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogCiAgICAgUHlPYmplY3QqIGluZGV4XyA9IFB5X0ZhbHNlOyAvKiB6ZXJvICovCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhcnQiLCAwLCAxLCAmaW5kZXhfKSkKQEAgLTI5MTEsNyArMjkxNiw3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRjaF9lbmQoTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIGludCBpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogCiAgICAgUHlPYmplY3QqIGluZGV4XyA9IFB5X0ZhbHNlOyAvKiB6ZXJvICovCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZW5kIiwgMCwgMSwgJmluZGV4XykpCkBAIC0yOTMyLDcgKzI5MzcsNyBAQAogfQogCiBMT0NBTChQeU9iamVjdCopCi1fcGFpcihpbnQgaTEsIGludCBpMikKK19wYWlyKFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIpCiB7CiAgICAgUHlPYmplY3QqIHBhaXI7CiAgICAgUHlPYmplY3QqIGl0ZW07CkBAIC0yOTQxLDEyICsyOTQ2LDEyIEBACiAgICAgaWYgKCFwYWlyKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZyhpMSk7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Tc2l6ZV90KGkxKTsKICAgICBpZiAoIWl0ZW0pCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShwYWlyLCAwLCBpdGVtKTsKIAotICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZyhpMik7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Tc2l6ZV90KGkyKTsKICAgICBpZiAoIWl0ZW0pCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShwYWlyLCAxLCBpdGVtKTsKQEAgLTI5NjEsNyArMjk2Niw3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRjaF9zcGFuKE1hdGNoT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLSAgICBpbnQgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleDsKIAogICAgIFB5T2JqZWN0KiBpbmRleF8gPSBQeV9GYWxzZTsgLyogemVybyAqLwogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNwYW4iLCAwLCAxLCAmaW5kZXhfKSkKQEAgLTI5ODYsNyArMjk5MSw3IEBACiB7CiAgICAgUHlPYmplY3QqIHJlZ3M7CiAgICAgUHlPYmplY3QqIGl0ZW07Ci0gICAgaW50IGluZGV4OworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICByZWdzID0gUHlUdXBsZV9OZXcoc2VsZi0+Z3JvdXBzKTsKICAgICBpZiAoIXJlZ3MpCkBAIC0zMDEyLDcgKzMwMTcsNyBAQAogewogI2lmZGVmIFVTRV9CVUlMVElOX0NPUFkKICAgICBNYXRjaE9iamVjdCogY29weTsKLSAgICBpbnQgc2xvdHMsIG9mZnNldDsKKyAgICBQeV9zc2l6ZV90IHNsb3RzLCBvZmZzZXQ7CiAKICAgICBzbG90cyA9IDIgKiAoc2VsZi0+cGF0dGVybi0+Z3JvdXBzKzEpOwogCkBAIC0zMDI5LDcgKzMwMzQsNyBAQAogICAgIFB5X1hJTkNSRUYoc2VsZi0+cmVncyk7CiAKICAgICBtZW1jcHkoKGNoYXIqKSBjb3B5ICsgb2Zmc2V0LCAoY2hhciopIHNlbGYgKyBvZmZzZXQsCi0gICAgICAgICAgIHNpemVvZihNYXRjaE9iamVjdCkgKyBzbG90cyAqIHNpemVvZihpbnQpIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgc2l6ZW9mKE1hdGNoT2JqZWN0KSArIHNsb3RzICogc2l6ZW9mKFB5X3NzaXplX3QpIC0gb2Zmc2V0KTsKIAogICAgIHJldHVybiAoUHlPYmplY3QqKSBjb3B5OwogI2Vsc2UKQEAgLTMxNDQsNyArMzE0OSw3IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1hdGNoX1R5cGUgPSB7CiAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCiAgICAgMCwgIl8iIFNSRV9NT0RVTEUgIi5TUkVfTWF0Y2giLAotICAgIHNpemVvZihNYXRjaE9iamVjdCksIHNpemVvZihpbnQpLAorICAgIHNpemVvZihNYXRjaE9iamVjdCksIHNpemVvZihQeV9zc2l6ZV90KSwKICAgICAoZGVzdHJ1Y3RvciltYXRjaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwogICAgIDAsIC8qdHBfcHJpbnQqLwogICAgIChnZXRhdHRyZnVuYyltYXRjaF9nZXRhdHRyIC8qdHBfZ2V0YXR0ciovCkBAIC0zMTU2LDcgKzMxNjEsNyBAQAogICAgIC8qIGNyZWF0ZSBtYXRjaCBvYmplY3QgKGZyb20gc3RhdGUgb2JqZWN0KSAqLwogCiAgICAgTWF0Y2hPYmplY3QqIG1hdGNoOwotICAgIGludCBpLCBqOworICAgIFB5X3NzaXplX3QgaSwgajsKICAgICBjaGFyKiBiYXNlOwogICAgIGludCBuOwogCkBAIC0zMzI5LDkgKzMzMzQsOSBAQAogICAgIFNjYW5uZXJPYmplY3QqIHNlbGY7CiAKICAgICBQeU9iamVjdCogc3RyaW5nOwotICAgIGludCBzdGFydCA9IDA7Ci0gICAgaW50IGVuZCA9IElOVF9NQVg7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGlpOnNjYW5uZXIiLCAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQorICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG5uOnNjYW5uZXIiLCAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIGNyZWF0ZSBzY2FubmVyIG9iamVjdCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3NsLmMgYi9Nb2R1bGVzL19zc2wuYwppbmRleCBmNDkzOTFkLi4zYjkxYjI0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zc2wuYworKysgYi9Nb2R1bGVzL19zc2wuYwpAQCAtMjYsNiArMjYsMTIgQEAKIC8qIEluY2x1ZGUgc3ltYm9scyBmcm9tIF9zb2NrZXQgbW9kdWxlICovCiAjaW5jbHVkZSAic29ja2V0bW9kdWxlLmgiCiAKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTF9IKSAKKyNpbmNsdWRlIDxwb2xsLmg+CisjZWxpZiBkZWZpbmVkKEhBVkVfU1lTX1BPTExfSCkKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisKIC8qIEluY2x1ZGUgT3BlblNTTCBoZWFkZXIgZmlsZXMgKi8KICNpbmNsdWRlICJvcGVuc3NsL3JzYS5oIgogI2luY2x1ZGUgIm9wZW5zc2wvY3J5cHRvLmgiCkBAIC0zNTEsNyArMzU3LDcgQEAKIAlQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKLS8qIElmIHRoZSBzb2NrZXQgaGFzIGEgdGltZW91dCwgZG8gYSBzZWxlY3QoKSBvbiB0aGUgc29ja2V0LgorLyogSWYgdGhlIHNvY2tldCBoYXMgYSB0aW1lb3V0LCBkbyBhIHNlbGVjdCgpL3BvbGwoKSBvbiB0aGUgc29ja2V0LgogICAgVGhlIGFyZ3VtZW50IHdyaXRpbmcgaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24uCiAgICBSZXR1cm5zIG9uZSBvZiB0aGUgcG9zc2liaWxpdGllcyBpbiB0aGUgdGltZW91dF9zdGF0ZSBlbnVtIChhYm92ZSkuCiAgKi8KQEAgLTM3Myw2ICszNzksMjYgQEAKIAlpZiAocy0+c29ja19mZCA8IDApCiAJCXJldHVybiBTT0NLRVRfSEFTX0JFRU5fQ0xPU0VEOwogCisJLyogUHJlZmVyIHBvbGwsIGlmIGF2YWlsYWJsZSwgc2luY2UgeW91IGNhbiBwb2xsKCkgYW55IGZkCisJICogd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIHNlbGVjdCgpLiAqLworI2lmZGVmIEhBVkVfUE9MTAorCXsKKwkJc3RydWN0IHBvbGxmZCBwb2xsZmQ7CisJCWludCB0aW1lb3V0OworCisJCXBvbGxmZC5mZCA9IHMtPnNvY2tfZmQ7CisJCXBvbGxmZC5ldmVudHMgPSB3cml0aW5nID8gUE9MTE9VVCA6IFBPTExJTjsKKworCQkvKiBzLT5zb2NrX3RpbWVvdXQgaXMgaW4gc2Vjb25kcywgdGltZW91dCBpbiBtcyAqLworCQl0aW1lb3V0ID0gKGludCkocy0+c29ja190aW1lb3V0ICogMTAwMCArIDAuNSk7CisJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkJcmMgPSBwb2xsKCZwb2xsZmQsIDEsIHRpbWVvdXQpOworCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworCisJCWdvdG8gbm9ybWFsX3JldHVybjsKKwl9CisjZW5kaWYKKwogCS8qIEd1YXJkIGFnYWluc3Qgc29ja2V0IHRvbyBsYXJnZSBmb3Igc2VsZWN0Ki8KICNpZm5kZWYgUHlfU09DS0VUX0ZEX0NBTl9CRV9HRV9GRF9TRVRTSVpFCiAJaWYgKHMtPnNvY2tfZmQgPj0gRkRfU0VUU0laRSkKQEAgLTM5Myw2ICs0MTksNyBAQAogCQlyYyA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAorbm9ybWFsX3JldHVybjoKIAkvKiBSZXR1cm4gU09DS0VUX1RJTUVEX09VVCBvbiB0aW1lb3V0LCBTT0NLRVRfT1BFUkFUSU9OX09LIG90aGVyd2lzZQogCSAgICh3aGVuIHdlIGFyZSBhYmxlIHRvIHdyaXRlIG9yIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgdG8gcmVhZCkgKi8KIAlyZXR1cm4gcmMgPT0gMCA/IFNPQ0tFVF9IQVNfVElNRURfT1VUIDogU09DS0VUX09QRVJBVElPTl9PSzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3N0cnVjdC5jIGIvTW9kdWxlcy9fc3RydWN0LmMKaW5kZXggZGYyNDNlYy4uOGQwYTNiYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3RydWN0LmMKKysrIGIvTW9kdWxlcy9fc3RydWN0LmMKQEAgLTMxLDYgKzMxLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKnB5aW50X3plcm8gPSBOVUxMOwogI2VuZGlmCiAKKy8qIElmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UgaXMgZGVmaW5lZCwgdGhlIHN0cnVjdCBtb2R1bGUgd2lsbCBhbGxvdyBmbG9hdAorICAgYXJndW1lbnRzIGZvciBpbnRlZ2VyIGZvcm1hdHMgd2l0aCBhIHdhcm5pbmcgZm9yIGJhY2t3YXJkcworICAgY29tcGF0aWJpbGl0eS4gKi8KKworI2RlZmluZSBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFIDEKKworI2lmZGVmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UKKyNkZWZpbmUgRkxPQVRfQ09FUkNFICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiCisjZW5kaWYKKworCiAvKiBUaGUgdHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGVhY2ggZm9ybWF0IGNoYXJhY3RlciBpcyB0YWJsZSBkcml2ZW4gKi8KIHR5cGVkZWYgc3RydWN0IF9mb3JtYXRkZWYgewogCWNoYXIgZm9ybWF0OwpAQCAtMTM1LDYgKzE0NiwyMSBAQAogewogCWxvbmcgeCA9IFB5SW50X0FzTG9uZyh2KTsKIAlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQorCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworCQkJUHlPYmplY3QgKm87CisJCQlpbnQgcmVzOworCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBGTE9BVF9DT0VSQ0UsIDIpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlvID0gUHlOdW1iZXJfSW50KHYpOworCQkJaWYgKG8gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisJCQlyZXMgPSBnZXRfbG9uZyhvLCBwKTsKKwkJCVB5X0RFQ1JFRihvKTsKKwkJCXJldHVybiByZXM7CisJCX0KKyNlbmRpZgogCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAogCQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGFuIGludGVnZXIiKTsKQEAgLTIxNCwxNSArMjQwLDMzIEBACiAvKiBIZWxwZXIgcm91dGluZSB0byBnZXQgYSBQeXRob24gaW50ZWdlciBhbmQgcmFpc2UgdGhlIGFwcHJvcHJpYXRlIGVycm9yCiAgICBpZiBpdCBpc24ndCBvbmUgKi8KIAorI2RlZmluZSBJTlRfT1ZFUkZMT1cgInN0cnVjdCBpbnRlZ2VyIG92ZXJmbG93IG1hc2tpbmcgaXMgZGVwcmVjYXRlZCIKKwogc3RhdGljIGludAogZ2V0X3dyYXBwZWRfbG9uZyhQeU9iamVjdCAqdiwgbG9uZyAqcCkKIHsKIAlpZiAoZ2V0X2xvbmcodiwgcCkgPCAwKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2sodikgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworCQlpZiAoUHlMb25nX0NoZWNrKHYpICYmCisJCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CiAJCQlQeU9iamVjdCAqd3JhcHBlZDsKIAkJCWxvbmcgeDsKIAkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJzdHJ1Y3QgaW50ZWdlciBvdmVyZmxvdyBtYXNraW5nIGlzIGRlcHJlY2F0ZWQiKSA8IDApCisjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQorCQkJaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKwkJCQlQeU9iamVjdCAqbzsKKwkJCQlpbnQgcmVzOworCQkJCVB5RXJyX0NsZWFyKCk7CisJCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJbyA9IFB5TnVtYmVyX0ludCh2KTsKKwkJCQlpZiAobyA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJcmVzID0gZ2V0X3dyYXBwZWRfbG9uZyhvLCBwKTsKKwkJCQlQeV9ERUNSRUYobyk7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIElOVF9PVkVSRkxPVywgMikgPCAwKQogCQkJCXJldHVybiAtMTsKIAkJCXdyYXBwZWQgPSBQeU51bWJlcl9BbmQodiwgcHlsb25nX3Vsb25nX21hc2spOwogCQkJaWYgKHdyYXBwZWQgPT0gTlVMTCkKQEAgLTI0NiwxMCArMjkwLDI1IEBACiAJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogCQlQeU9iamVjdCAqd3JhcHBlZDsKIAkJUHlFcnJfQ2xlYXIoKTsKKyNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCisJCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisJCQlQeU9iamVjdCAqbzsKKwkJCWludCByZXM7CisJCQlQeUVycl9DbGVhcigpOworCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMikgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCW8gPSBQeU51bWJlcl9JbnQodik7CisJCQlpZiAobyA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKwkJCXJlcyA9IGdldF93cmFwcGVkX3Vsb25nKG8sIHApOworCQkJUHlfREVDUkVGKG8pOworCQkJcmV0dXJuIHJlczsKKwkJfQorI2VuZGlmCiAJCXdyYXBwZWQgPSBQeU51bWJlcl9BbmQodiwgcHlsb25nX3Vsb25nX21hc2spOwogCQlpZiAod3JhcHBlZCA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJzdHJ1Y3QgaW50ZWdlciBvdmVyZmxvdyBtYXNraW5nIGlzIGRlcHJlY2F0ZWQiKSA8IDApIHsKKwkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIElOVF9PVkVSRkxPVywgMikgPCAwKSB7CiAJCQlQeV9ERUNSRUYod3JhcHBlZCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTM0NCw4ICs0MDMsOCBAQAogCQlQeV9YREVDUkVGKHB0cmFjZWJhY2spOwogCQlpZiAobXNnID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7Ci0JCXJ2YWwgPSBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhtc2cpKTsKKwkJcnZhbCA9IFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisJCQkJICAgIFB5U3RyaW5nX0FTX1NUUklORyhtc2cpLCAyKTsKIAkJUHlfREVDUkVGKG1zZyk7CiAJCWlmIChydmFsID09IDApCiAJCQlyZXR1cm4gMDsKQEAgLTEzOTYsMjMgKzE0NTUsMTcgQEAKIAkJY29uc3QgY2hhciAqcmVzID0gc3RhcnRmcm9tICsgY29kZS0+b2Zmc2V0OwogCQlpZiAoZS0+Zm9ybWF0ID09ICdzJykgewogCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlcywgY29kZS0+c2l6ZSk7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOwogCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKIAkJCVB5X3NzaXplX3QgbiA9ICoodW5zaWduZWQgY2hhciopcmVzOwogCQkJaWYgKG4gPj0gY29kZS0+c2l6ZSkKIAkJCQluID0gY29kZS0+c2l6ZSAtIDE7CiAJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzICsgMSwgbik7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOwogCQl9IGVsc2UgewogCQkJdiA9IGUtPnVucGFjayhyZXMsIGUpOwotCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSsrLCB2KTsKIAkJfQorCQlpZiAodiA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSsrLCB2KTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTQzOCw3ICsxNDkxLDggQEAKIAlpZiAoaW5wdXRzdHIgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soaW5wdXRzdHIpIHx8CiAJCVB5U3RyaW5nX0dFVF9TSVpFKGlucHV0c3RyKSAhPSBzb3NlbGYtPnNfc2l6ZSkgewogCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkidW5wYWNrIHJlcXVpcmVzIGEgc3RyaW5nIGFyZ3VtZW50IG9mIGxlbmd0aCAlemQiLCBzb3NlbGYtPnNfc2l6ZSk7CisJCQkidW5wYWNrIHJlcXVpcmVzIGEgc3RyaW5nIGFyZ3VtZW50IG9mIGxlbmd0aCAlemQiLAorCQkJc29zZWxmLT5zX3NpemUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0c3RyKSk7CkBAIC0xNTA0LDE3ICsxNTU4LDE4IEBACiBzX3BhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBvZmZzZXQsIGNoYXIqIGJ1ZikKIHsKIAlmb3JtYXRjb2RlICpjb2RlOworCS8qIFhYWChubm9yd2l0eik6IHdoeSBkb2VzIGkgbmVlZCB0byBiZSBhIGxvY2FsPyAgY2FuIHdlIHVzZQorCSAgIHRoZSBvZmZzZXQgcGFyYW1ldGVyIG9yIGRvIHdlIG5lZWQgdGhlIHdpZGVyIHdpZHRoPyAqLwogCVB5X3NzaXplX3QgaTsKIAogCW1lbXNldChidWYsICdcMCcsIHNvc2VsZi0+c19zaXplKTsKIAlpID0gb2Zmc2V0OwogCWZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgewogCQlQeV9zc2l6ZV90IG47Ci0JCVB5T2JqZWN0ICp2OworCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSsrKTsKIAkJY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOwogCQljaGFyICpyZXMgPSBidWYgKyBjb2RlLT5vZmZzZXQ7CiAJCWlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7Ci0JCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOwogCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewogCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKIAkJCQkJCSJhcmd1bWVudCBmb3IgJ3MnIG11c3QgYmUgYSBzdHJpbmciKTsKQEAgLTE1MjYsNyArMTU4MSw2IEBACiAJCQlpZiAobiA+IDApCiAJCQkJbWVtY3B5KHJlcywgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKIAkJfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7Ci0JCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOwogCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewogCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKIAkJCQkJCSJhcmd1bWVudCBmb3IgJ3AnIG11c3QgYmUgYSBzdHJpbmciKTsKQEAgLTE1NDEsNyArMTU5NSw2IEBACiAJCQkJbiA9IDI1NTsKIAkJCSpyZXMgPSBQeV9TQUZFX0RPV05DQVNUKG4sIFB5X3NzaXplX3QsIHVuc2lnbmVkIGNoYXIpOwogCQl9IGVsc2UgewotCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSsrKTsKIAkJCWlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKSB7CiAJCQkJaWYgKFB5TG9uZ19DaGVjayh2KSAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQogCQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCkBAIC0xODE4LDQgKzE4NzEsOCBAQAogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORyIsIDEpOwogI2VuZGlmCisjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQorCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSIsIDEpOworI2VuZGlmCisKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDZiOWRmZmQuLmY1ZjNhYjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtMjk0LDYgKzI5NCwxNiBAQAogCiAjZW5kaWYJLyogaWZkZWYgSEFWRV9MT05HX0xPTkcgKi8KIAorLyogVGVzdCB0dXBsZSBhcmd1bWVudCBwcm9jZXNzaW5nICovCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0YXJnc190dXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJaW50IGEsIGIsIGM7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpKGlpKSIsICZhLCAmYiwgJmMpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgYSwgYiwgYyk7Cit9CisKIC8qIEZ1bmN0aW9ucyB0byBjYWxsIFB5QXJnX1BhcnNlVHVwbGUgd2l0aCBpbnRlZ2VyIGZvcm1hdCBjb2RlcywKICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KICovCkBAIC02OTYsNiArNzA2LDEzIEBACiAjdW5kZWYgQ0hFQ0tfMV9GT1JNQVQKIH0KIAorLyogVGhpcyBpcyBoZXJlIHRvIHByb3ZpZGUgYSBkb2NzdHJpbmcgZm9yIHRlc3RfZGVzY3IuICovCitzdGF0aWMgUHlPYmplY3QgKgordGVzdF93aXRoX2RvY3N0cmluZyhQeU9iamVjdCAqc2VsZikKK3sKKwlQeV9SRVRVUk5fTk9ORTsKK30KKwogc3RhdGljIFB5TWV0aG9kRGVmIFRlc3RNZXRob2RzW10gPSB7CiAJeyJyYWlzZV9leGNlcHRpb24iLAlyYWlzZV9leGNlcHRpb24sCQkgTUVUSF9WQVJBUkdTfSwKIAl7InRlc3RfY29uZmlnIiwJCShQeUNGdW5jdGlvbil0ZXN0X2NvbmZpZywJIE1FVEhfTk9BUkdTfSwKQEAgLTcwNiw3ICs3MjMsMTAgQEAKIAl7InRlc3Rfa19jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X2tfY29kZSwJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfbnVsbF9zdHJpbmdzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLAkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCAoUHlDRnVuY3Rpb24pdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQsIE1FVEhfTk9BUkdTfSwKKwl7InRlc3Rfd2l0aF9kb2NzdHJpbmciLCAoUHlDRnVuY3Rpb24pdGVzdF93aXRoX2RvY3N0cmluZywgTUVUSF9OT0FSR1MsCisJIFB5RG9jX1NUUigiVGhpcyBpcyBhIHByZXR0eSBub3JtYWwgZG9jc3RyaW5nLiIpfSwKIAorCXsiZ2V0YXJnc190dXBsZSIsCWdldGFyZ3NfdHVwbGUsCQkJIE1FVEhfVkFSQVJHU30sCiAJeyJnZXRhcmdzX2IiLAkJZ2V0YXJnc19iLAkJCSBNRVRIX1ZBUkFSR1N9LAogCXsiZ2V0YXJnc19CIiwJCWdldGFyZ3NfQiwJCQkgTUVUSF9WQVJBUkdTfSwKIAl7ImdldGFyZ3NfSCIsCQlnZXRhcmdzX0gsCQkJIE1FVEhfVkFSQVJHU30sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggY2VjODNmNS4uMDg4ZmJiOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtOTMyLDEyICs5MzIsMTMgQEAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewogCQlQeV9VTklDT0RFICppbmJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKTsKLQkJaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworCQlQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwogCQkvKiBUaGlzICNpZmRlZiBhc3N1bWVzIHRoYXQgVGNsIHVzZXMgVUNTLTIuCiAJCSAgIFNlZSBUQ0xfVVRGX01BWCB0ZXN0IGFib3ZlLiAqLwogI2lmIGRlZmluZWQoUHlfVU5JQ09ERV9XSURFKSAmJiBUQ0xfVVRGX01BWCA9PSAzCiAJCVRjbF9VbmlDaGFyICpvdXRidWY7Ci0JCWludCBpOworCQlQeV9zc2l6ZV90IGk7CisJCWFzc2VydChzaXplIDwgc2l6ZSAqIHNpemVvZihUY2xfVW5pQ2hhcikpOwogCQlvdXRidWYgPSAoVGNsX1VuaUNoYXIqKWNrYWxsb2Moc2l6ZSAqIHNpemVvZihUY2xfVW5pQ2hhcikpOwogCQlpZiAoIW91dGJ1ZikgewogCQkJUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTIxMDMsOCArMjEwNCw4IEBACiAJZGF0YSA9IFB5TWVtX05FVyhQeXRob25DbWRfQ2xpZW50RGF0YSwgMSk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeV9YSU5DUkVGKHNlbGYpOwotCVB5X1hJTkNSRUYoZnVuYyk7CisJUHlfSU5DUkVGKHNlbGYpOworCVB5X0lOQ1JFRihmdW5jKTsKIAlkYXRhLT5zZWxmID0gc2VsZnB0cjsKIAlkYXRhLT5mdW5jID0gZnVuYzsKIAkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3R5cGVzbW9kdWxlLmMgYi9Nb2R1bGVzL190eXBlc21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmYyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL190eXBlc21vZHVsZS5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIFRoaXMgZXh0ZW5zaW9uIG1vZHVsZSBleHBvc2VzIHNvbWUgdHlwZXMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgYXQgdGhlCisgKiBDIGxldmVsLiAgSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBidXQgaW5zdGVhZCB0aHJvdWdoIHRoZSBQeXRob24KKyAqIGxldmVsIHR5cGVzIG1vZHVsZXMsIHdoaWNoIGltcG9ydHMgdGhpcy4KKyAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGludCBtZW1iZXI7Cit9IEhlbHBlcjsKKworc3RhdGljIFB5TWVtYmVyRGVmIGhlbHBlcl9tZW1iZXJzW10gPSB7CisgICAgeyAibWVtYmVyIiwgVF9JTlQsICBvZmZzZXRvZihIZWxwZXIsIG1lbWJlciksIFJFQURPTkxZLAorICAgICAgUHlEb2NfU1RSKCJBIG1lbWJlciBkZXNjcmlwdG9yIikKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgUHlPYmplY3QgKgoraGVscGVyX2dldHRlcihIZWxwZXIgKnNlbGYsIHZvaWQgKnVudXNlZCkgCit7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeUdldFNldERlZiBoZWxwZXJfZ2V0c2V0W10gPSB7CisgICAgeyAiZ2V0dGVyIiwgKGdldHRlciloZWxwZXJfZ2V0dGVyLCBOVUxMLAorICAgICAgUHlEb2NfU1RSKCJBIGdldHNldCBkZXNjcmlwdG9yIiksCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIFB5VHlwZU9iamVjdCBIZWxwZXJUeXBlID0geworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsCQkJCQkJLyogb2Jfc2l6ZSAqLworICAgICJfdHlwZXMuSGVscGVyIiwJCQkJLyogdHBfbmFtZSAqLworICAgIHNpemVvZihIZWxwZXIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsCQkJCQkJLyogdHBfZGVhbGxvYyAqLworICAgIDAsCQkJCQkJLyogdHBfcHJpbnQgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KKyAgICAwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsCQkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgCQkJCS8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAJCQkJLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsCQkJCQkJLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLAkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgIAkJCQkJLyogdHBfZG9jICovCisgICAgMCwJCQkJCQkvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsCQkJCQkJLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsCQkJCQkJLyogdHBfaXRlciAqLworICAgIDAsCQkJCQkJLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgIAkJCQkJLyogdHBfbWV0aG9kcyAqLworICAgIGhlbHBlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGhlbHBlcl9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwJCQkJCQkvKiB0cF9iYXNlICovCisgICAgMCwJCQkJCQkvKiB0cF9kaWN0ICovCisgICAgMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsCQkJCQkJLyogdHBfaW5pdCAqLworICAgIDAsCQkJCQkJLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsCQkJCQkJLyogdHBfZnJlZSAqLworfTsKKworUHlNT0RJTklUX0ZVTkMKK2luaXRfdHlwZXModm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbTsKKworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX3R5cGVzIiwgTlVMTCwgIkEgdHlwZXMgbW9kdWxlIGhlbHBlciIpOworICAgIGlmICghbSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmSGVscGVyVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBQeV9JTkNSRUYoJkhlbHBlclR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSGVscGVyIiwgKFB5T2JqZWN0ICopJkhlbHBlclR5cGUpOworfQorCisgICAgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL193ZWFrcmVmLmMgYi9Nb2R1bGVzL193ZWFrcmVmLmMKaW5kZXggMmRmZGMxNC4uMTcxMmYxMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fd2Vha3JlZi5jCisrKyBiL01vZHVsZXMvX3dlYWtyZWYuYwpAQCAtMTcsNyArMTcsNyBAQAogICAgIGlmIChQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMob2JqZWN0LT5vYl90eXBlKSkgewogICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKipsaXN0ID0gR0VUX1dFQUtSRUZTX0xJU1RQVFIob2JqZWN0KTsKIAotICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhfUHlXZWFrcmVmX0dldFdlYWtyZWZDb3VudCgqbGlzdCkpOworICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tU3NpemVfdChfUHlXZWFrcmVmX0dldFdlYWtyZWZDb3VudCgqbGlzdCkpOwogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKDApOwpAQCAtMzcsMTIgKzM3LDEyIEBACiAKICAgICBpZiAoUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKG9iamVjdC0+b2JfdHlwZSkpIHsKICAgICAgICAgUHlXZWFrUmVmZXJlbmNlICoqbGlzdCA9IEdFVF9XRUFLUkVGU19MSVNUUFRSKG9iamVjdCk7Ci0gICAgICAgIGxvbmcgY291bnQgPSBfUHlXZWFrcmVmX0dldFdlYWtyZWZDb3VudCgqbGlzdCk7CisgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBfUHlXZWFrcmVmX0dldFdlYWtyZWZDb3VudCgqbGlzdCk7CiAKICAgICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhjb3VudCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlXZWFrUmVmZXJlbmNlICpjdXJyZW50ID0gKmxpc3Q7Ci0gICAgICAgICAgICBsb25nIGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXN1bHQsIGksIChQeU9iamVjdCAqKSBjdXJyZW50KTsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoY3VycmVudCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKaW5kZXggMTAwYjM0MS4uYjczOWNjOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jCisrKyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogI2lmZGVmIFNURENfSEVBREVSUwogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2Vsc2UgLyogIVNURENfSEVBREVSUyAqLwotI2lmbmRlZiBET05UX0hBVkVfU1lTX1RZUEVTX0gKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkvKiBGb3Igc2l6ZV90ICovCi0jZW5kaWYgLyogRE9OVF9IQVZFX1NZU19UWVBFU19IICovCisjZW5kaWYgLyogSEFWRV9TWVNfVFlQRVNfSCAqLwogI2VuZGlmIC8qICFTVERDX0hFQURFUlMgKi8KIAogc3RydWN0IGFycmF5b2JqZWN0OyAvKiBGb3J3YXJkICovCkBAIC0xNzg1LDYgKzE3ODUsNyBAQAogCShyZWFkYnVmZmVycHJvYylhcnJheV9idWZmZXJfZ2V0cmVhZGJ1ZiwKIAkod3JpdGVidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKIAkoc2VnY291bnRwcm9jKWFycmF5X2J1ZmZlcl9nZXRzZWdjb3VudCwKKwlOVUxMLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKZGlmZiAtLWdpdCBhL01vZHVsZXMvYmluYXNjaWkuYyBiL01vZHVsZXMvYmluYXNjaWkuYwppbmRleCA3MWE5NjI0Li4zYjJjOGIyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2JpbmFzY2lpLmMKKysrIGIvTW9kdWxlcy9iaW5hc2NpaS5jCkBAIC05MDksNyArOTA5LDcgQEAKIAljaGFyKiByZXRidWY7CiAJUHlfc3NpemVfdCBpLCBqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzpiMmFfaGV4IiwgJmFyZ2J1ZiwgJmFyZ2xlbikpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfaGV4IiwgJmFyZ2J1ZiwgJmFyZ2xlbikpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYXJnbGVuKjIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9iejJtb2R1bGUuYyBiL01vZHVsZXMvYnoybW9kdWxlLmMKaW5kZXggOTU3Njg5NS4uYjAwNzVhMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iejJtb2R1bGUuYworKysgYi9Nb2R1bGVzL2J6Mm1vZHVsZS5jCkBAIC0xMzAzLDcgKzEzMDMsMTEgQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSAnVSc6CisjaWZkZWYgX19WTVMKKwkJCQlzZWxmLT5mX3VuaXZfbmV3bGluZSA9IDA7CisjZWxzZQogCQkJCXNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMTsKKyNlbmRpZgogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgpAQCAtMTMzNiw4ICsxMzQwLDEwIEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogCXNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKCFzZWxmLT5sb2NrKQorCWlmICghc2VsZi0+bG9jaykgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwogCQlnb3RvIGVycm9yOworCX0KICNlbmRpZgogCiAJaWYgKG1vZGVfY2hhciA9PSAncicpCkBAIC0xMzU5LDEwICsxMzY1LDEyIEBACiAJcmV0dXJuIDA7CiAKIGVycm9yOgotCVB5X0RFQ1JFRihzZWxmLT5maWxlKTsKKwlQeV9DTEVBUihzZWxmLT5maWxlKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKQorCWlmIChzZWxmLT5sb2NrKSB7CiAJCVB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKKwkJc2VsZi0+bG9jayA9IE5VTEw7CisJfQogI2VuZGlmCiAJcmV0dXJuIC0xOwogfQpAQCAtMTU2Miw3ICsxNTcwLDcgQEAKIAkJfQogCX0KIAotCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKGludCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKKwlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOwogCiAJUkVMRUFTRV9MT0NLKHNlbGYpOwogCXJldHVybiByZXQ7CkBAIC0xNjI4LDcgKzE2MzYsNyBAQAogCX0KIAogCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChpbnQpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisJCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKIAlSRUxFQVNFX0xPQ0soc2VsZik7CiAJcmV0dXJuIHJldDsKQEAgLTE2NzAsOCArMTY3OCwxMCBAQAogCiAjaWZkZWYgV0lUSF9USFJFQUQKIAlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykKKwlpZiAoIXNlbGYtPmxvY2spIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKIAkJZ290byBlcnJvcjsKKwl9CiAjZW5kaWYKIAogCW1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CkBAIC0xNjg2LDggKzE2OTYsMTAgQEAKIAlyZXR1cm4gMDsKIGVycm9yOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spCisJaWYgKHNlbGYtPmxvY2spIHsKIAkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworCQlzZWxmLT5sb2NrID0gTlVMTDsKKwl9CiAjZW5kaWYKIAlyZXR1cm4gLTE7CiB9CkBAIC0xODUyLDcgKzE4NjQsNyBAQAogCX0KIAogCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChpbnQpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisJCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKIAlSRUxFQVNFX0xPQ0soc2VsZik7CiAJcmV0dXJuIHJldDsKQEAgLTE4ODIsOCArMTg5NCwxMCBAQAogCiAjaWZkZWYgV0lUSF9USFJFQUQKIAlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykKKwlpZiAoIXNlbGYtPmxvY2spIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIGxvY2siKTsKIAkJZ290byBlcnJvcjsKKwl9CiAjZW5kaWYKIAogCXNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CkBAIC0xOTAzLDEwICsxOTE3LDEyIEBACiAKIGVycm9yOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spCisJaWYgKHNlbGYtPmxvY2spIHsKIAkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworCQlzZWxmLT5sb2NrID0gTlVMTDsKKwl9CiAjZW5kaWYKLQlQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKKwlQeV9DTEVBUihzZWxmLT51bnVzZWRfZGF0YSk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMDYxLDcgKzIwNzcsNyBAQAogCX0KIAogCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChpbnQpQlpTX1RPVEFMX09VVChienMpKTsKKwkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOwogCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjE0MCw3ICsyMTU2LDcgQEAKIAl9CiAKIAlpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoaW50KUJaU19UT1RBTF9PVVQoYnpzKSk7CisJCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpQlpTX1RPVEFMX09VVChienMpKTsKIAlCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jUGlja2xlLmMgYi9Nb2R1bGVzL2NQaWNrbGUuYwppbmRleCAwZDI5MzYyLi4yNGM5OGNjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NQaWNrbGUuYworKysgYi9Nb2R1bGVzL2NQaWNrbGUuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJZm9yIChpID0gc2VsZi0+bGVuZ3RoLCBwID0gc2VsZi0+ZGF0YSArIGNsZWFydG87CiAJICAgICAtLWkgPj0gY2xlYXJ0bzsKIAkgICAgIHArKykgewotCQlQeV9ERUNSRUYoKnApOworCQlQeV9DTEVBUigqcCk7CiAJfQogCXNlbGYtPmxlbmd0aCA9IGNsZWFydG87CiAKQEAgLTIwOCw2ICsyMDgsNyBAQAogewogCWludCBiaWdnZXI7CiAJc2l6ZV90IG5ieXRlczsKKwlQeU9iamVjdCAqKnRtcDsKIAogCWJpZ2dlciA9IHNlbGYtPnNpemUgPDwgMTsKIAlpZiAoYmlnZ2VyIDw9IDApCS8qIHdhcyAwLCBvciBuZXcgdmFsdWUgb3ZlcmZsb3dzICovCkBAIC0yMTcsMTQgKzIxOCwxNCBAQAogCW5ieXRlcyA9IChzaXplX3QpYmlnZ2VyICogc2l6ZW9mKFB5T2JqZWN0ICopOwogCWlmIChuYnl0ZXMgLyBzaXplb2YoUHlPYmplY3QgKikgIT0gKHNpemVfdCliaWdnZXIpCiAJCWdvdG8gbm9tZW1vcnk7Ci0Jc2VsZi0+ZGF0YSA9IHJlYWxsb2Moc2VsZi0+ZGF0YSwgbmJ5dGVzKTsKLQlpZiAoc2VsZi0+ZGF0YSA9PSBOVUxMKQorCXRtcCA9IHJlYWxsb2Moc2VsZi0+ZGF0YSwgbmJ5dGVzKTsKKwlpZiAodG1wID09IE5VTEwpCiAJCWdvdG8gbm9tZW1vcnk7CisJc2VsZi0+ZGF0YSA9IHRtcDsKIAlzZWxmLT5zaXplID0gYmlnZ2VyOwogCXJldHVybiAwOwogCiAgIG5vbWVtb3J5OgotCXNlbGYtPnNpemUgPSAwOwogCVB5RXJyX05vTWVtb3J5KCk7CiAJcmV0dXJuIC0xOwogfQpAQCAtMjYzNiw3ICsyNjM3LDcgQEAKIAkJCWlmIChpayA+PSBsbSB8fCBpayA9PSAwKSB7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCiAJCQkJCQkiSW52YWxpZCBnZXQgZGF0YSIpOwotCQkJCXJldHVybiBOVUxMOworCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJaWYgKGhhdmVfZ2V0W2lrXSkgLyogd2l0aCBtYXRjaGluZyBnZXQgKi8KIAkJCQlyc2l6ZSArPSBpayA8IDI1NiA/IDIgOiA1OwpAQCAtMjY0OCw3ICsyNjQ5LDcgQEAKIAkJCSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCiAJCQkJCSJVbmV4cGVjdGVkIGRhdGEgaW4gaW50ZXJuYWwgbGlzdCIpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIGVycjsKIAkJfQogCiAJCWVsc2UgeyAvKiBwdXQgKi8KQEAgLTM0MDAsMTEgKzM0MDEsMTEgQEAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlzdHIgPSBQeVN0cmluZ19EZWNvZGVFc2NhcGUocCwgbGVuLCBOVUxMLCAwLCBOVUxMKTsKKwlmcmVlKHMpOwogCWlmIChzdHIpIHsKIAkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7CiAJCXJlcyA9IDA7CiAJfQotCWZyZWUocyk7CiAJcmV0dXJuIHJlczsKIAogICBpbnNlY3VyZToKQEAgLTM2MjgsMTAgKzM2MjksMTQgQEAKIAogICBlcnI6CiAJewotCQlQeU9iamVjdCAqdHAsICp2LCAqdGI7CisJCVB5T2JqZWN0ICp0cCwgKnYsICp0YiwgKnRtcF92YWx1ZTsKIAogCQlQeUVycl9GZXRjaCgmdHAsICZ2LCAmdGIpOwotCQlpZiAoKHI9UHlUdXBsZV9QYWNrKDMsdixjbHMsYXJncykpKSB7CisJCXRtcF92YWx1ZSA9IHY7CisJCS8qIE5VTEwgb2NjdXJzIHdoZW4gdGhlcmUgd2FzIGEgS2V5Ym9hcmRJbnRlcnJ1cHQgKi8KKwkJaWYgKHRtcF92YWx1ZSA9PSBOVUxMKQorCQkJdG1wX3ZhbHVlID0gUHlfTm9uZTsKKwkJaWYgKChyID0gUHlUdXBsZV9QYWNrKDMsIHRtcF92YWx1ZSwgY2xzLCBhcmdzKSkpIHsKIAkJCVB5X1hERUNSRUYodik7CiAJCQl2PXI7CiAJCX0KQEAgLTQxNTksNiArNDE2NCw3IEBACiAJCWludCBsaXN0X2xlbjsKIAogCQlzbGljZT1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCB4KTsKKwkJaWYgKCEgc2xpY2UpIHJldHVybiAtMTsKIAkJbGlzdF9sZW4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CiAJCWk9UHlMaXN0X1NldFNsaWNlKGxpc3QsIGxpc3RfbGVuLCBsaXN0X2xlbiwgc2xpY2UpOwogCQlQeV9ERUNSRUYoc2xpY2UpOwpAQCAtNTE2Myw2ICs1MTY5LDkgQEAKIAlpZiAoISggc2VsZi0+bWVtbyA9IFB5RGljdF9OZXcoKSkpCiAJCWdvdG8gZXJyOwogCisJaWYgKCFzZWxmLT5zdGFjaykKKwkJZ290byBlcnI7CisKIAlQeV9JTkNSRUYoZik7CiAJc2VsZi0+ZmlsZSA9IGY7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCAwYzdkY2E2Li5kNzYxZGNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAvKiBUaGUgYmxvY2sgbGVuZ3RoIG1heSBiZSBzZXQgdG8gYW55IG51bWJlciBvdmVyIDEuICBMYXJnZXIgbnVtYmVycwogICogcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gdGhlIG1lbW9yeSBhbGxvY2F0b3IgYnV0IHRha2UgbW9yZQogICogbWVtb3J5LiAgSWRlYWxseSwgQkxPQ0tMRU4gc2hvdWxkIGJlIHNldCB3aXRoIGFuIGV5ZSB0byB0aGUKLSAqIGxlbmd0aCBvZiBhIGNhY2hlIGxpbmUuICAKKyAqIGxlbmd0aCBvZiBhIGNhY2hlIGxpbmUuCiAgKi8KIAogI2RlZmluZSBCTE9DS0xFTiA2MgpAQCAtMjIsOSArMjIsOSBAQAogICogZWxlbWVudCBpcyBhdCBkLmxlZnRibG9ja1tsZWZ0aW5kZXhdIGFuZCBpdHMgbGFzdCBlbGVtZW50IGlzIGF0CiAgKiBkLnJpZ2h0YmxvY2tbcmlnaHRpbmRleF07IG5vdGUgdGhhdCwgdW5saWtlIGFzIGZvciBQeXRob24gc2xpY2UKICAqIGluZGljZXMsIHRoZXNlIGluZGljZXMgYXJlIGluY2x1c2l2ZSBvbiBib3RoIGVuZHMuICBCeSBiZWluZyBpbmNsdXNpdmUKLSAqIG9uIGJvdGggZW5kcywgYWxnb3JpdGhtcyBmb3IgbGVmdCBhbmQgcmlnaHQgb3BlcmF0aW9ucyBiZWNvbWUgCisgKiBvbiBib3RoIGVuZHMsIGFsZ29yaXRobXMgZm9yIGxlZnQgYW5kIHJpZ2h0IG9wZXJhdGlvbnMgYmVjb21lCiAgKiBzeW1tZXRyaWNhbCB3aGljaCBzaW1wbGlmaWVzIHRoZSBkZXNpZ24uCi0gKiAKKyAqCiAgKiBUaGUgbGlzdCBvZiBibG9ja3MgaXMgbmV2ZXIgZW1wdHksIHNvIGQubGVmdGJsb2NrIGFuZCBkLnJpZ2h0YmxvY2sKICAqIGFyZSBuZXZlciBlcXVhbCB0byBOVUxMLgogICoKQEAgLTM3LDExICszNywxMSBAQAogICogZC5sZWZ0aW5kZXggPT0gQ0VOVEVSKzE7IGFuZCBkLnJpZ2h0aW5kZXggPT0gQ0VOVEVSLgogICogQ2hlY2tpbmcgZm9yIGQubGVuID09IDAgaXMgdGhlIGludGVuZGVkIHdheSB0byBzZWUgd2hldGhlciBkIGlzIGVtcHR5LgogICoKLSAqIFdoZW5ldmVyIGQubGVmdGJsb2NrID09IGQucmlnaHRibG9jaywgCisgKiBXaGVuZXZlciBkLmxlZnRibG9jayA9PSBkLnJpZ2h0YmxvY2ssCiAgKiAgICAgZC5sZWZ0aW5kZXggKyBkLmxlbiAtIDEgPT0gZC5yaWdodGluZGV4LgotICogCisgKgogICogSG93ZXZlciwgd2hlbiBkLmxlZnRibG9jayAhPSBkLnJpZ2h0YmxvY2ssIGQubGVmdGluZGV4IGFuZCBkLnJpZ2h0aW5kZXgKLSAqIGJlY29tZSBpbmRpY2VzIGludG8gZGlzdGluY3QgYmxvY2tzIGFuZCBlaXRoZXIgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSAKKyAqIGJlY29tZSBpbmRpY2VzIGludG8gZGlzdGluY3QgYmxvY2tzIGFuZCBlaXRoZXIgbWF5IGJlIGxhcmdlciB0aGFuIHRoZQogICogb3RoZXIuCiAgKi8KIApAQCAtMzgxLDcgKzM4MSw3IEBACiAJCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKIAogCQlpZiAoZGVxdWUtPmxlbiAhPSBuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgCisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKIAkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgcmVtb3ZlKCkuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtOTIwLDcgKzkyMCw3IEBACiAJCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+cmlnaHRibG9jayAmJiAKKwlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCiAJCSAgaXQtPmluZGV4ID4gaXQtPmRlcXVlLT5yaWdodGluZGV4KSk7CiAKIAlpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAJCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmIAorCWFzc2VydCAoIShpdC0+YiA9PSBpdC0+ZGVxdWUtPmxlZnRibG9jayAmJgogCQkgIGl0LT5pbmRleCA8IGl0LT5kZXF1ZS0+bGVmdGluZGV4KSk7CiAKIAlpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKQEAgLTExMTcsNyArMTExNyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVmZGljdF9yZWR1Y2UoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JLyogX19yZWR1Y2VfXyBtdXN0IHJldHVybnMgYSA1LXR1cGxlIGFzIGZvbGxvd3M6CisJLyogX19yZWR1Y2VfXyBtdXN0IHJldHVybiBhIDUtdHVwbGUgYXMgZm9sbG93czoKIAogCSAgIC0gZmFjdG9yeSBmdW5jdGlvbgogCSAgIC0gdHVwbGUgb2YgYXJncyBmb3IgdGhlIGZhY3RvcnkgZnVuY3Rpb24KQEAgLTExNTUsNiArMTE1NSw3IEBACiAJfQogCXJlc3VsdCA9IFB5VHVwbGVfUGFjayg1LCBkZC0+ZGljdC5vYl90eXBlLCBhcmdzLAogCQkJICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgaXRlbXMpOworCVB5X0RFQ1JFRihpdGVtcyk7CiAJUHlfREVDUkVGKGFyZ3MpOwogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NvbmZpZy5jLmluIGIvTW9kdWxlcy9jb25maWcuYy5pbgppbmRleCBmODExOTkxLi44YzI1ZWVhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NvbmZpZy5jLmluCisrKyBiL01vZHVsZXMvY29uZmlnLmMuaW4KQEAgLTI4LDYgKzI4LDcgQEAKIGV4dGVybiB2b2lkIGluaXRpbXAodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0Z2Modm9pZCk7CiBleHRlcm4gdm9pZCBpbml0X2FzdCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfdHlwZXModm9pZCk7CiAKIHN0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0gewogCkBAIC00Miw2ICs0Myw5IEBACiAJLyogVGhpcyBsaXZlcyBpbiBQeXRob24vUHl0aG9uLWFzdC5jICovCiAJeyJfYXN0IiwgaW5pdF9hc3R9LAogCisJLyogVGhpcyBsaXZlcyBpbiBQeXRob24vX3R5cGVzLmMgKi8KKwl7Il90eXBlcyIsIGluaXRfdHlwZXN9LAorCiAJLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCiAJeyJfX21haW5fXyIsIE5VTEx9LAogCXsiX19idWlsdGluX18iLCBOVUxMfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvY3J5cHRtb2R1bGUuYyBiL01vZHVsZXMvY3J5cHRtb2R1bGUuYwppbmRleCAwNTBhMzU2Li42Mzc3Zjg0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jcnlwdG1vZHVsZS5jCkBAIC01LDYgKzUsOSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpZmRlZiBfX1ZNUworI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjZW5kaWYKIAogLyogTW9kdWxlIGNyeXB0ICovCiAKQEAgLTEyLDcgKzE1LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqY3J5cHRfY3J5cHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCWNoYXIgKndvcmQsICpzYWx0OyAKKyNpZm5kZWYgX19WTVMKIAlleHRlcm4gY2hhciAqIGNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpjcnlwdCIsICZ3b3JkLCAmc2FsdCkpIHsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RsbW9kdWxlLmMgYi9Nb2R1bGVzL2RsbW9kdWxlLmMKaW5kZXggMDk1NTY4MS4uNTYyMmVkOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGxtb2R1bGUuYwpAQCAtNSw2ICs1LDEwIEBACiAKICNpbmNsdWRlIDxkbGZjbi5oPgogCisjaWZkZWYgX19WTVMKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCiAjaWZuZGVmIFJUTERfTEFaWQogI2RlZmluZSBSVExEX0xBWlkgMQogI2VuZGlmCkBAIC03Nyw4ICs4MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKTsKIAlsb25nIGFsaXN0WzEwXTsKIAlsb25nIHJlczsKLQlpbnQgaTsKLQlpbnQgbiA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKwlQeV9zc2l6ZV90IGk7CisJUHlfc3NpemVfdCBuID0gUHlUdXBsZV9TaXplKGFyZ3MpOwogCWlmIChuIDwgMSkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXQgbGVhc3QgYSBuYW1lIGlzIG5lZWRlZCIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE4Niw2ICsxOTAsMjQgQEAKIAkJUHlFcnJfU2V0U3RyaW5nKERsZXJyb3IsIGRsZXJyb3IoKSk7CiAJCXJldHVybiBOVUxMOwogCX0KKyNpZmRlZiBfX1ZNUworCS8qICAgVW5kZXIgT3BlblZNUyBkbG9wZW4gZG9lc24ndCBkbyBhbnkgY2hlY2ssIGp1c3Qgc2F2ZSB0aGUgbmFtZQorCSAqIGZvciBsYXRlciB1c2UsIHNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGZpbGUgaXMgcmVhZGFibGUsCisJICogdGhlIG5hbWUgY2FuIGJlIGEgbG9naWNhbCBvciBhIGZpbGUgZnJvbSBTWVMkU0hBUkUuCisJICovCisJaWYgKGFjY2VzcyhuYW1lLCBSX09LKSkgeworCQljaGFyIGZuYW1lW3N0cmxlbihuYW1lKSArIDIwXTsKKwkJc3RyY3B5KGZuYW1lLCAiU1lTJFNIQVJFOiIpOworCQlzdHJjYXQoZm5hbWUsIG5hbWUpOworCQlzdHJjYXQoZm5hbWUsICIuRVhFIik7CisJCWlmIChhY2Nlc3MoZm5hbWUsIFJfT0spKSB7CisJCQlkbGNsb3NlKGhhbmRsZSk7CisJCQlQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwKKwkJCQkiRmlsZSBub3QgZm91bmQgb3IgcHJvdGVjdGlvbiB2aW9sYXRpb24iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorI2VuZGlmCiAJcmV0dXJuIG5ld2Rsb2JqZWN0KGhhbmRsZSk7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvTWFrZWZpbGUuaW4gYi9Nb2R1bGVzL2V4cGF0L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkwNzM5Li4wMDAwMDAwCi0tLSBhL01vZHVsZXMvZXhwYXQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIHRvcC1sZXZlbCBjb25maWd1cmUgc2NyaXB0IHRvIHByb2R1Y2UgTWFrZWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDAgQ2xhcmsgQ29vcGVyCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiBFWFBBVC4KLSMKLSMgIEVYUEFUIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSAoYmFzZWQgb24gdGhlIE1JVC9YIGxpY2Vuc2UpIGNvbnRhaW5lZAotIyAgaW4gdGhlIGZpbGUgQ09QWUlORyB0aGF0IGNvbWVzIHdpdGggdGhpcyBkaXN0cmlidXRpb24uCi0jCi0jIEVYUEFUIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0jIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0jIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0jIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0jIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0jIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gRVhQQVQuCi0jCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1zdWJkaXIgPSBsaWIKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi1BUyA9IEBBU0AKLUNDID0gQENDQAotRExMVE9PTCA9IEBETExUT09MQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUkFOTElCID0gQFJBTkxJQkAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotTElCUkFSWSA9IGxpYmV4cGF0LmxhCi1TT1VSQ0VTID0geG1scGFyc2UuYyB4bWx0b2suYyB4bWxyb2xlLmMKLU9CSkVDVFMgPSAkKFNPVVJDRVM6LmM9Lm8pCi1MVE9CSkVDVFMgPSAkKFNPVVJDRVM6LmM9LmxvKQotCi1URU1QTEFURVMgPSB4bWx0b2tfaW1wbC5jIHhtbHRva19ucy5jCi1BUElIRUFERVIgPSBleHBhdC5oCi1IRUFERVJTID0gYXNjaWkuaCBpYXNjaWl0YWIuaCB1dGY4dGFiLmggeG1sdG9rLmggYXNjaWl0YWIuaCBsYXRpbjF0YWIuaCBcCi0gICAgICAgICAgbmFtZXRhYi5oIHhtbGRlZi5oIHhtbHJvbGUuaCB4bWx0b2tfaW1wbC5oCi0KLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2NvbmZ0b29scy9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotCi1JTkNMVURFUyA9IC1JJChzcmNkaXIpIC1JLiAtSS4uCi1ERUZTID0gQERFRlNAIC1EUEFDS0FHRT0nIiQoUEFDS0FHRSkiJyAtRFZFUlNJT049JyIkKFBBQ0tBR0UpXyQoVkVSU0lPTikiJwotCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLUNGTEFHUyA9IEBDRkxBR1NACi0KLUxJQlJFVklTSU9OID0gQExJQlJFVklTSU9OQAotTElCQ1VSUkVOVCAgPSBATElCQ1VSUkVOVEAKLUxJQkFHRSAgICAgID0gQExJQkFHRUAKLQotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICAkKENDTEQpIC12ZXJzaW9uLWluZm8gJChMSUJDVVJSRU5UKTokKExJQlJFVklTSU9OKTokKExJQkFHRSkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKFRFTVBMQVRFUykgJChBUElIRUFERVIpICQoSEVBREVSUykgCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci0KLWFsbDogJChMSUJSQVJZKQotCi0uU1VGRklYRVM6IC5jIC5sbyAubwotLlBIT05ZOiBhbGwgY2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLmxvOgotCSQoTFRDT01QSUxFKSAtYyAkPAotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX2J1aWxkZGlyKS9jb25maWd1cmUKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSBjb25maWcuc3RhdHVzCi0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oLmluCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgY29uZmlnLmgKLQotY2xlYW46Ci0Jcm0gLWYgJChMSUJSQVJZKSAqLm8gKi5sbyAqfgotCXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0KLWNoZWNrOgkkKFNVQkRJUlMpCi0JQGVjaG8KLQlAZWNobyBUaGlzIHBhY2thZ2UgZG9lcyBub3QgeWV0IGhhdmUgYSByZWdyZXNzaW9uIHRlc3QuCi0JQGVjaG8KLQotaW5zdGFsbDogJChMSUJSQVJZKSAkKEFQSUhFQURFUikKLQkkKG1raW5zdGFsbGRpcnMpICQobGliZGlyKSAkKGluY2x1ZGVkaXIpCi0JJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoTElCUkFSWSkgJChsaWJkaXIpLyQoTElCUkFSWSkKLQkkKElOU1RBTExfREFUQSkgJChBUElIRUFERVIpICQoaW5jbHVkZWRpcikKLQotdW5pbnN0YWxsOgotCSQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKGxpYmRpcikvJChMSUJSQVJZKTsKLQlybSAtZiAkKGxpYmRpcikvJChBUElIRUFERVIpCi0KLSQoTElCUkFSWSk6ICQoTFRPQkpFQ1RTKQotCSQoTElOSykgLXJwYXRoICQobGliZGlyKSAkKExERkxBR1MpICQoTFRPQkpFQ1RTKQotCi14bWxwYXJzZS5vIFwKLXhtbHBhcnNlLmxvOiB4bWxwYXJzZS5jIGV4cGF0LmggeG1scm9sZS5oIHhtbHRvay5oICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAotCi14bWxyb2xlLm8gXAoteG1scm9sZS5sbzogeG1scm9sZS5jIGFzY2lpLmggeG1scm9sZS5oICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAotCi14bWx0b2subyBcCi14bWx0b2subG86IHhtbHRvay5jIHhtbHRva19pbXBsLmMgeG1sdG9rX25zLmMgXAotICAgICAgICAgIGFzY2lpLmggYXNjaWl0YWIuaCBpYXNjaWl0YWIuaCBsYXRpbjF0YWIuaCBuYW1ldGFiLmggdXRmOHRhYi5oIFwKLSAgICAgICAgICB4bWx0b2suaCB4bWx0b2tfaW1wbC5oICQodG9wX2J1aWxkZGlyKS9jb25maWcuaApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9hbWlnYWNvbmZpZy5oIGIvTW9kdWxlcy9leHBhdC9hbWlnYWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODFhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL2V4cGF0L2FtaWdhY29uZmlnLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmbmRlZiBBTUlHQUNPTkZJR19ICisjZGVmaW5lIEFNSUdBQ09ORklHX0gKKworLyogMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU4gKi8KKyNkZWZpbmUgQllURU9SREVSIDQzMjEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiY29weScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQkNPUFkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNoZWNrLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ0hFQ0tfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBhZ2VzaXplJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtbW92ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImV4cGF0LWJ1Z3NAbWFpbC5saWJleHBhdC5vcmciCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9OQU1FICJleHBhdCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiZXhwYXQgMS45NS44IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMS45NS44IgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuICovCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gc3BlY2lmeSBob3cgbXVjaCBjb250ZXh0IHRvIHJldGFpbiBhcm91bmQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIHBvaW50LiAqLworI2RlZmluZSBYTUxfQ09OVEVYVF9CWVRFUyAxMDI0CisKKy8qIERlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX0RURAorCisvKiBEZWZpbmUgdG8gbWFrZSBYTUwgTmFtZXNwYWNlcyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX05TCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CisKKworI2VuZGlmICAvKiBBTUlHQUNPTkZJR19IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L2V4cGF0LmggYi9Nb2R1bGVzL2V4cGF0L2V4cGF0LmgKaW5kZXggZWNiYTkyZS4uY2YxMTNlZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC9leHBhdC5oCisrKyBiL01vZHVsZXMvZXhwYXQvZXhwYXQuaApAQCAtMiw4ICsyLDggQEAKICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCiAqLwogCi0jaWZuZGVmIFhtbFBhcnNlX0lOQ0xVREVECi0jZGVmaW5lIFhtbFBhcnNlX0lOQ0xVREVEIDEKKyNpZm5kZWYgRXhwYXRfSU5DTFVERUQKKyNkZWZpbmUgRXhwYXRfSU5DTFVERUQgMQogCiAjaWZkZWYgX19WTVMKIC8qICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzCkBAIC0xNyw2ICsxNywxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImV4cGF0X2V4dGVybmFsLmgiCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3Q7CiB0eXBlZGVmIHN0cnVjdCBYTUxfUGFyc2VyU3RydWN0ICpYTUxfUGFyc2VyOwogCkBAIC04Nyw3ICs5MSwxMSBAQAogICBYTUxfRVJST1JfTk9UX1NVU1BFTkRFRCwKICAgWE1MX0VSUk9SX0FCT1JURUQsCiAgIFhNTF9FUlJPUl9GSU5JU0hFRCwKLSAgWE1MX0VSUk9SX1NVU1BFTkRfUEUKKyAgWE1MX0VSUk9SX1NVU1BFTkRfUEUsCisgIC8qIEFkZGVkIGluIDIuMC4gKi8KKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9QUkVGSVhfWE1MTlMsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJCiB9OwogCiBlbnVtIFhNTF9Db250ZW50X1R5cGUgewpAQCAtMjA1LDggKzIxMyw4IEBACiAgICBVUkksIHRoZSBuYW1lc3BhY2Ugc2VwYXJhdG9yIGNoYXJhY3RlciwgYW5kIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQogICAgbmFtZS4gIElmIHRoZSBuYW1lc3BhY2Ugc2VwYXJhdG9yIGlzICdcMCcgdGhlbiB0aGUgbmFtZXNwYWNlIFVSSQogICAgYW5kIHRoZSBsb2NhbCBwYXJ0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIHdpdGhvdXQgYW55IHNlcGFyYXRvci4KLSAgIFdoZW4gYSBuYW1lc3BhY2UgaXMgbm90IGRlY2xhcmVkLCB0aGUgbmFtZSBhbmQgcHJlZml4IHdpbGwgYmUKLSAgIHBhc3NlZCB0aHJvdWdoIHdpdGhvdXQgZXhwYW5zaW9uLgorICAgSXQgaXMgYSBwcm9ncmFtbWluZyBlcnJvciB0byB1c2UgdGhlIHNlcGFyYXRvciAnXDAnIHdpdGggbmFtZXNwYWNlCisgICB0cmlwbGV0cyAoc2VlIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQpLgogKi8KIFhNTFBBUlNFQVBJKFhNTF9QYXJzZXIpCiBYTUxfUGFyc2VyQ3JlYXRlTlMoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLCBYTUxfQ2hhciBuYW1lc3BhY2VTZXBhcmF0b3IpOwpAQCAtODk3LDkgKzkwNSw5IEBACiAgICB3YXMgZGV0ZWN0ZWQ7IG90aGVyd2lzZSB0aGUgbG9jYXRpb24gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0CiAgICBwYXJzZSBldmVudCwgYXMgZGVzY3JpYmVkIGFib3ZlLgogKi8KLVhNTFBBUlNFQVBJKGludCkgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKTsKLVhNTFBBUlNFQVBJKGludCkgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOwotWE1MUEFSU0VBUEkobG9uZykgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgoWE1MX1BhcnNlciBwYXJzZXIpOworWE1MUEFSU0VBUEkoWE1MX1NpemUpIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7CitYTUxQQVJTRUFQSShYTUxfU2l6ZSkgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOworWE1MUEFSU0VBUEkoWE1MX0luZGV4KSBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CiAKIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGV2ZW50LgogICAgUmV0dXJucyAwIGlmIHRoZSBldmVudCBpcyBpbiBhbiBpbnRlcm5hbCBlbnRpdHkuCkBAIC05NzQsNyArOTgyLDggQEAKICAgWE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywKICAgWE1MX0ZFQVRVUkVfTUlOX1NJWkUsCiAgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwKLSAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUgorICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSLAorICBYTUxfRkVBVFVSRV9OUwogICAvKiBBZGRpdGlvbmFsIGZlYXR1cmVzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGlzIGVudW0uICovCiB9OwogCkBAIC05OTMsMTIgKzEwMDIsMTIgQEAKICAgIHJlbGVhc2VzLiBNaWNybyBpcyBidW1wZWQgd2l0aCBlYWNoIHJlbGVhc2UsIGFuZCBzZXQgdG8gMCB3aXRoIGVhY2gKICAgIGNoYW5nZSB0byBtYWpvciBvciBtaW5vciB2ZXJzaW9uLgogKi8KLSNkZWZpbmUgWE1MX01BSk9SX1ZFUlNJT04gMQotI2RlZmluZSBYTUxfTUlOT1JfVkVSU0lPTiA5NQotI2RlZmluZSBYTUxfTUlDUk9fVkVSU0lPTiA4CisjZGVmaW5lIFhNTF9NQUpPUl9WRVJTSU9OIDIKKyNkZWZpbmUgWE1MX01JTk9SX1ZFUlNJT04gMAorI2RlZmluZSBYTUxfTUlDUk9fVkVSU0lPTiAwCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBub3QgWG1sUGFyc2VfSU5DTFVERUQgKi8KKyNlbmRpZiAvKiBub3QgRXhwYXRfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaCBiL01vZHVsZXMvZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaAppbmRleCA0MTQ1Y2FjLi5mMDU0MDE0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L2V4cGF0X2V4dGVybmFsLmgKKysrIGIvTW9kdWxlcy9leHBhdC9leHBhdF9leHRlcm5hbC5oCkBAIC0yLDggKzIsMTUgQEAKICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCiAqLwogCisjaWZuZGVmIEV4cGF0X0V4dGVybmFsX0lOQ0xVREVECisjZGVmaW5lIEV4cGF0X0V4dGVybmFsX0lOQ0xVREVEIDEKKwogLyogRXh0ZXJuYWwgQVBJIGRlZmluaXRpb25zICovCiAKKy8qIE5hbWVzcGFjZSBleHRlcm5hbCBzeW1ib2xzIHRvIGFsbG93IG11bHRpcGxlIGxpYmV4cGF0IHZlcnNpb24gdG8KKyAgIGNvLWV4aXN0LiAqLworI2luY2x1ZGUgInB5ZXhwYXRucy5oIgorCiAjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICYmICFkZWZpbmVkKF9fQkVPU19fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQogI2RlZmluZSBYTUxfVVNFX01TQ19FWFRFTlNJT05TIDEKICNlbmRpZgpAQCAtNjIsNiArNjksNyBAQAogI2VuZGlmCiAjZW5kaWYgIC8qIG5vdCBkZWZpbmVkIFhNTF9TVEFUSUMgKi8KIAorCiAvKiBJZiB3ZSBkaWRuJ3QgZGVmaW5lIGl0IGFib3ZlLCBkZWZpbmUgaXQgYXdheTogKi8KICNpZm5kZWYgWE1MSU1QT1JUCiAjZGVmaW5lIFhNTElNUE9SVApAQCAtOTAsMyArOTgsMjIgQEAKIHR5cGVkZWYgY2hhciBYTUxfQ2hhcjsKIHR5cGVkZWYgY2hhciBYTUxfTENoYXI7CiAjZW5kaWYgLyogWE1MX1VOSUNPREUgKi8KKworI2lmZGVmIFhNTF9MQVJHRV9TSVpFICAvKiBVc2UgbGFyZ2UgaW50ZWdlcnMgZm9yIGZpbGUvc3RyZWFtIHBvc2l0aW9ucy4gKi8KKyNpZiBkZWZpbmVkKFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMpICYmIF9NU0NfVkVSIDwgMTQwMAordHlwZWRlZiBfX2ludDY0IFhNTF9JbmRleDsgCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgWE1MX1NpemU7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgWE1MX0luZGV4OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgWE1MX1NpemU7CisjZW5kaWYKKyNlbHNlCit0eXBlZGVmIGxvbmcgWE1MX0luZGV4OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhNTF9TaXplOworI2VuZGlmIC8qIFhNTF9MQVJHRV9TSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgRXhwYXRfRXh0ZXJuYWxfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvcHlleHBhdG5zLmggYi9Nb2R1bGVzL2V4cGF0L3B5ZXhwYXRucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmQzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL2V4cGF0L3B5ZXhwYXRucy5oCkBAIC0wLDAgKzEsMTI0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBBY3RpdmVTdGF0ZSBTb2Z0d2FyZSBJbmMuCisgKgorICogTmFtZXNwYWNlIGFsbCBleHBhdCBleHBvcnRlZCBzeW1ib2xzIHRvIGF2b2lkIGR5bmFtaWMgbG9hZGluZyBzeW1ib2wKKyAqIGNvbGxpc2lvbnMgd2hlbiBlbWJlZGRpbmcgUHl0aG9uLgorICoKKyAqIFRoZSBQcm9ibGVtOgorICogLSB5b3UgZW1iZWQgUHl0aG9uIGluIHNvbWUgYXBwCisgKiAtIHRoZSBhcHAgZHluYW1pY2FsbHkgbG9hZHMgbGliZXhwYXQgb2YgdmVyc2lvbiBYCisgKiAtIHRoZSBlbWJlZGRlZCBQeXRob24gaW1wb3J0cyBweWV4cGF0ICh3aGljaCB3YXMgYnVpbHQgYWdhaW5zdAorICogICBsaWJleHBhdCB2ZXJzaW9uIFgrbikKKyAqIC0tPiBweWV4cGF0IGdldHMgdGhlIGV4cGF0IHN5bWJvbHMgZnJvbSB0aGUgYWxyZWFkeSBsb2FkZWQgYW5kICpvbGRlcioKKyAqICAgICBsaWJleHBhdDogY3Jhc2ggKFNwZWNpZmljYWxseSB0aGUgY3Jhc2ggd2Ugb2JzZXJ2ZWQgd2FzIGluCisgKiAgICAgZ2V0dGluZyBhbiBvbGQgWE1MX0Vycm9yU3RyaW5nIChmcm9tIHhtbHBhcnNlLmMpIGFuZCB0aGVuIGNhbGxpbmcKKyAqICAgICBpdCB3aXRoIG5ld2VyIHZhbHVlcyBpbiB0aGUgWE1MX0Vycm9yIGVudW06CisgKgorICogICAgICAgLy8gcHlleHBhdC5jLCBsaW5lIDE5NzAKKyAqICAgICAgIC4uLgorICogICAgICAgLy8gQWRkZWQgaW4gRXhwYXQgMS45NS43LgorICogICAgICAgTVlDT05TVChYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgpOworICogICAgICAgLi4uCisgKgorICoKKyAqIFRoZSBTb2x1dGlvbjoKKyAqIFByZWZpeCBhbGwgYSBleHBvcnRlZCBzeW1ib2xzIHdpdGggIlB5RXhwYXRfIi4gVGhpcyBpcyBzaW1pbGFyIHRvCisgKiB3aGF0IE1vemlsbGEgZG9lcyBmb3Igc29tZSBjb21tb24gbGliczoKKyAqIGh0dHA6Ly9seHIubW96aWxsYS5vcmcvc2VhbW9ua2V5L3NvdXJjZS9tb2R1bGVzL2xpYmltZy9wbmcvbW96cG5nY29uZi5oIzExNQorICoKKyAqIFRoZSBsaXN0IG9mIHJlbGV2YW50IGV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIGhhZCB3aXRoIHRoaXMgY29tbWFuZDoKKyAqIAorICAgICAgIG5tIHB5ZXhwYXQuc28gXAorICAgICAgICAgICB8IGdyZXAgLXYgIiBbYS16QlVBXSAiIFwKKyAgICAgICAgICAgfCBncmVwIC12ICJfZmluaVx8X2luaXRcfGluaXRweWV4cGF0IgorICoKKyAqIElmIGFueSBvZiB0aG9zZSBzeW1ib2xzIGFyZSBOT1QgcHJlZml4ZWQgd2l0aCAiUHlFeHBhdF8iIHRoZW4KKyAqIGEgI2RlZmluZSBzaG91bGQgYmUgYWRkZWQgZm9yIGl0IGhlcmUuCisgKi8KKworI2lmbmRlZiBQWUVYUEFUTlNfSAorI2RlZmluZSBQWUVYUEFUTlNfSAorCisjZGVmaW5lIFhNTF9EZWZhdWx0Q3VycmVudCAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfRGVmYXVsdEN1cnJlbnQKKyNkZWZpbmUgWE1MX0Vycm9yU3RyaW5nICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9FcnJvclN0cmluZworI2RlZmluZSBYTUxfRXhwYXRWZXJzaW9uICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0V4cGF0VmVyc2lvbgorI2RlZmluZSBYTUxfRXhwYXRWZXJzaW9uSW5mbyAgICAgICAgICAgIFB5RXhwYXRfWE1MX0V4cGF0VmVyc2lvbkluZm8KKyNkZWZpbmUgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlICBQeUV4cGF0X1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZQorI2RlZmluZSBYTUxfRnJlZUNvbnRlbnRNb2RlbCAgICAgICAgICAgIFB5RXhwYXRfWE1MX0ZyZWVDb250ZW50TW9kZWwKKyNkZWZpbmUgWE1MX0dldEJhc2UgICAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRCYXNlCisjZGVmaW5lIFhNTF9HZXRCdWZmZXIgICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfR2V0QnVmZmVyCisjZGVmaW5lIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50ICAgICAgICAgUHlFeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudAorI2RlZmluZSBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCAgICAgICAgIFB5RXhwYXRfWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgKKyNkZWZpbmUgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgICAgICBQeUV4cGF0X1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyCisjZGVmaW5lIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAgICAgICAgUHlFeHBhdF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIKKyNkZWZpbmUgWE1MX0dldEVycm9yQ29kZSAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRFcnJvckNvZGUKKyNkZWZpbmUgWE1MX0dldEZlYXR1cmVMaXN0ICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRGZWF0dXJlTGlzdAorI2RlZmluZSBYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCAgICAgICAgIFB5RXhwYXRfWE1MX0dldElkQXR0cmlidXRlSW5kZXgKKyNkZWZpbmUgWE1MX0dldElucHV0Q29udGV4dCAgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRJbnB1dENvbnRleHQKKyNkZWZpbmUgWE1MX0dldFBhcnNpbmdTdGF0dXMgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRQYXJzaW5nU3RhdHVzCisjZGVmaW5lIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCAgUHlFeHBhdF9YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQKKyNkZWZpbmUgWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nICAgICBQeUV4cGF0X1htbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZworI2RlZmluZSBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmdOUyAgIFB5RXhwYXRfWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nTlMKKyNkZWZpbmUgWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmcgICAgICBQeUV4cGF0X1htbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nTlMgICAgUHlFeHBhdF9YbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEluaXRFbmNvZGluZyAgICAgICAgICAgICAgICAgUHlFeHBhdF9YbWxJbml0RW5jb2RpbmcKKyNkZWZpbmUgWG1sSW5pdEVuY29kaW5nTlMgICAgICAgICAgICAgICBQeUV4cGF0X1htbEluaXRFbmNvZGluZ05TCisjZGVmaW5lIFhtbEluaXRVbmtub3duRW5jb2RpbmcgICAgICAgICAgUHlFeHBhdF9YbWxJbml0VW5rbm93bkVuY29kaW5nCisjZGVmaW5lIFhtbEluaXRVbmtub3duRW5jb2RpbmdOUyAgICAgICAgUHlFeHBhdF9YbWxJbml0VW5rbm93bkVuY29kaW5nTlMKKyNkZWZpbmUgWE1MX01lbUZyZWUgICAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9NZW1GcmVlCisjZGVmaW5lIFhNTF9NZW1NYWxsb2MgICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfTWVtTWFsbG9jCisjZGVmaW5lIFhNTF9NZW1SZWFsbG9jICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfTWVtUmVhbGxvYworI2RlZmluZSBYTUxfUGFyc2UgICAgICAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlCisjZGVmaW5lIFhNTF9QYXJzZUJ1ZmZlciAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfUGFyc2VCdWZmZXIKKyNkZWZpbmUgWE1MX1BhcnNlckNyZWF0ZSAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9QYXJzZXJDcmVhdGUKKyNkZWZpbmUgWE1MX1BhcnNlckNyZWF0ZV9NTSAgICAgICAgICAgICBQeUV4cGF0X1hNTF9QYXJzZXJDcmVhdGVfTU0KKyNkZWZpbmUgWE1MX1BhcnNlckNyZWF0ZU5TICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9QYXJzZXJDcmVhdGVOUworI2RlZmluZSBYTUxfUGFyc2VyRnJlZSAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlckZyZWUKKyNkZWZpbmUgWE1MX1BhcnNlclJlc2V0ICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9QYXJzZXJSZXNldAorI2RlZmluZSBYbWxQYXJzZVhtbERlY2wgICAgICAgICAgICAgICAgIFB5RXhwYXRfWG1sUGFyc2VYbWxEZWNsCisjZGVmaW5lIFhtbFBhcnNlWG1sRGVjbE5TICAgICAgICAgICAgICAgUHlFeHBhdF9YbWxQYXJzZVhtbERlY2xOUworI2RlZmluZSBYbWxQcm9sb2dTdGF0ZUluaXQgICAgICAgICAgICAgIFB5RXhwYXRfWG1sUHJvbG9nU3RhdGVJbml0CisjZGVmaW5lIFhtbFByb2xvZ1N0YXRlSW5pdEV4dGVybmFsRW50aXR5ICAgIFB5RXhwYXRfWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkKKyNkZWZpbmUgWE1MX1Jlc3VtZVBhcnNlciAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9SZXN1bWVQYXJzZXIKKyNkZWZpbmUgWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciAgICAgICBQeUV4cGF0X1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEJhc2UgICAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRCYXNlCisjZGVmaW5lIFhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyICAgICAgUHlFeHBhdF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgICAgIFB5RXhwYXRfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRDb21tZW50SGFuZGxlciAgICAgICAgICAgUHlFeHBhdF9YTUxfU2V0Q29tbWVudEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldERlZmF1bHRIYW5kbGVyICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQgICAgIFB5RXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kCisjZGVmaW5lIFhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgICAgICAgUHlFeHBhdF9YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIgICAgICAgUHlFeHBhdF9YTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRFbGVtZW50SGFuZGxlciAgICAgICAgICAgUHlFeHBhdF9YTUxfU2V0RWxlbWVudEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVuY29kaW5nICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRFbmNvZGluZworI2RlZmluZSBYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciAgIFB5RXhwYXRfWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciAgICBQeUV4cGF0X1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyICAgICAgICBQeUV4cGF0X1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgIFB5RXhwYXRfWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlciAgICAgICAgUHlFeHBhdF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBQeUV4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyAgUHlFeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnCisjZGVmaW5lIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciAgICAgUHlFeHBhdF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIgICAgICBQeUV4cGF0X1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciAgICAgUHlFeHBhdF9YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyAgICAgICBQeUV4cGF0X1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcKKyNkZWZpbmUgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgUHlFeHBhdF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0ICAgICAgICAgIFB5RXhwYXRfWE1MX1NldFJldHVybk5TVHJpcGxldAorI2RlZmluZSBYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIgICAgIFB5RXhwYXRfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgUHlFeHBhdF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciAgUHlFeHBhdF9YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIgICAgICBQeUV4cGF0X1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyICAgIFB5RXhwYXRfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgICBQeUV4cGF0X1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyICAgIFB5RXhwYXRfWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFVzZXJEYXRhICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRVc2VyRGF0YQorI2RlZmluZSBYTUxfU2V0WG1sRGVjbEhhbmRsZXIgICAgICAgICAgIFB5RXhwYXRfWE1MX1NldFhtbERlY2xIYW5kbGVyCisjZGVmaW5lIFhtbFNpemVPZlVua25vd25FbmNvZGluZyAgICAgICAgUHlFeHBhdF9YbWxTaXplT2ZVbmtub3duRW5jb2RpbmcKKyNkZWZpbmUgWE1MX1N0b3BQYXJzZXIgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9TdG9wUGFyc2VyCisjZGVmaW5lIFhNTF9Vc2VGb3JlaWduRFREICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfVXNlRm9yZWlnbkRURAorI2RlZmluZSBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnICAgICAgIFB5RXhwYXRfWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZworI2RlZmluZSBYbWxVdGYxNkVuY29kZSAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWG1sVXRmMTZFbmNvZGUKKyNkZWZpbmUgWG1sVXRmOEVuY29kZSAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1htbFV0ZjhFbmNvZGUKKworCisjZW5kaWYgLyogIVBZRVhQQVROU19IICovCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYyBiL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYwppbmRleCA0MmQ5NWI3Li44ODI0NzBkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jCkBAIC04LDYgKzgsOCBAQAogI2luY2x1ZGUgIndpbmNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQogI2luY2x1ZGUgIm1hY2NvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3M0X18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKICNlbGlmIGRlZmluZWQoSEFWRV9FWFBBVF9DT05GSUdfSCkKICNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KICNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCkBAIC00NTYsNyArNDU4LDcgQEAKICAgY2hhciAqbV9idWZmZXJFbmQ7CiAgIC8qIGFsbG9jYXRlZCBlbmQgb2YgYnVmZmVyICovCiAgIGNvbnN0IGNoYXIgKm1fYnVmZmVyTGltOwotICBsb25nIG1fcGFyc2VFbmRCeXRlSW5kZXg7CisgIFhNTF9JbmRleCBtX3BhcnNlRW5kQnl0ZUluZGV4OwogICBjb25zdCBjaGFyICptX3BhcnNlRW5kUHRyOwogICBYTUxfQ2hhciAqbV9kYXRhQnVmOwogICBYTUxfQ2hhciAqbV9kYXRhQnVmRW5kOwpAQCAtNjQwLDggKzY0Miw4IEBACiAjZGVmaW5lIGdyb3VwU2l6ZSAocGFyc2VyLT5tX2dyb3VwU2l6ZSkKICNkZWZpbmUgbmFtZXNwYWNlU2VwYXJhdG9yIChwYXJzZXItPm1fbmFtZXNwYWNlU2VwYXJhdG9yKQogI2RlZmluZSBwYXJlbnRQYXJzZXIgKHBhcnNlci0+bV9wYXJlbnRQYXJzZXIpCi0jZGVmaW5lIHBhcnNpbmcgKHBhcnNlci0+bV9wYXJzaW5nU3RhdHVzLnBhcnNpbmcpCi0jZGVmaW5lIGZpbmFsQnVmZmVyIChwYXJzZXItPm1fcGFyc2luZ1N0YXR1cy5maW5hbEJ1ZmZlcikKKyNkZWZpbmUgcHNfcGFyc2luZyAocGFyc2VyLT5tX3BhcnNpbmdTdGF0dXMucGFyc2luZykKKyNkZWZpbmUgcHNfZmluYWxCdWZmZXIgKHBhcnNlci0+bV9wYXJzaW5nU3RhdHVzLmZpbmFsQnVmZmVyKQogI2lmZGVmIFhNTF9EVEQKICNkZWZpbmUgaXNQYXJhbUVudGl0eSAocGFyc2VyLT5tX2lzUGFyYW1FbnRpdHkpCiAjZGVmaW5lIHVzZUZvcmVpZ25EVEQgKHBhcnNlci0+bV91c2VGb3JlaWduRFREKQpAQCAtODUyLDcgKzg1NCw3IEBACiAgIHVua25vd25FbmNvZGluZ1JlbGVhc2UgPSBOVUxMOwogICB1bmtub3duRW5jb2RpbmdEYXRhID0gTlVMTDsKICAgcGFyZW50UGFyc2VyID0gTlVMTDsKLSAgcGFyc2luZyA9IFhNTF9JTklUSUFMSVpFRDsKKyAgcHNfcGFyc2luZyA9IFhNTF9JTklUSUFMSVpFRDsKICNpZmRlZiBYTUxfRFRECiAgIGlzUGFyYW1FbnRpdHkgPSBYTUxfRkFMU0U7CiAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CkBAIC05MTUsNyArOTE3LDcgQEAKICAgICAgWFhYIFRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB3aGljaCBvZiB0aGUKICAgICAgWFhYIHBvc3NpYmxlIGVycm9yIGNhc2VzIGNhdXNlZCB0aGUgWE1MX1NUQVRVU19FUlJPUiByZXR1cm4uCiAgICovCi0gIGlmIChwYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQogICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICBpZiAoZW5jb2RpbmdOYW1lID09IE5VTEwpCiAgICAgcHJvdG9jb2xFbmNvZGluZ05hbWUgPSBOVUxMOwpAQCAtMTE0Myw3ICsxMTQ1LDcgQEAKIHsKICNpZmRlZiBYTUxfRFRECiAgIC8qIGJsb2NrIGFmdGVyIFhNTF9QYXJzZSgpL1hNTF9QYXJzZUJ1ZmZlcigpIGhhcyBiZWVuIGNhbGxlZCAqLwotICBpZiAocGFyc2luZyA9PSBYTUxfUEFSU0lORyB8fCBwYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKICAgICByZXR1cm4gWE1MX0VSUk9SX0NBTlRfQ0hBTkdFX0ZFQVRVUkVfT05DRV9QQVJTSU5HOwogICB1c2VGb3JlaWduRFREID0gdXNlRFREOwogICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0xMTU2LDcgKzExNTgsNyBAQAogWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCkKIHsKICAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCi0gIGlmIChwYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQogICAgIHJldHVybjsKICAgbnNfdHJpcGxldHMgPSBkb19uc3QgPyBYTUxfVFJVRSA6IFhNTF9GQUxTRTsKIH0KQEAgLTE0MDgsNyArMTQxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBwZVBhcnNpbmcpCiB7CiAgIC8qIGJsb2NrIGFmdGVyIFhNTF9QYXJzZSgpL1hNTF9QYXJzZUJ1ZmZlcigpIGhhcyBiZWVuIGNhbGxlZCAqLwotICBpZiAocGFyc2luZyA9PSBYTUxfUEFSU0lORyB8fCBwYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKICAgICByZXR1cm4gMDsKICNpZmRlZiBYTUxfRFRECiAgIHBhcmFtRW50aXR5UGFyc2luZyA9IHBlUGFyc2luZzsKQEAgLTE0MjEsNyArMTQyMyw3IEBACiBlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAogWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKIHsKLSAgc3dpdGNoIChwYXJzaW5nKSB7CisgIHN3aXRjaCAocHNfcGFyc2luZykgewogICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKQEAgLTE0MjksMTEgKzE0MzEsMTEgQEAKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgIGRlZmF1bHQ6Ci0gICAgcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICAgIHBzX3BhcnNpbmcgPSBYTUxfUEFSU0lORzsKICAgfQogCiAgIGlmIChsZW4gPT0gMCkgewotICAgIGZpbmFsQnVmZmVyID0gKFhNTF9Cb29sKWlzRmluYWw7CisgICAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKICAgICBpZiAoIWlzRmluYWwpCiAgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKICAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKQEAgLTE0NDEsMTkgKzE0NDMsMTkgQEAKIAogICAgIC8qIElmIGRhdGEgYXJlIGxlZnQgb3ZlciBmcm9tIGxhc3QgYnVmZmVyLCBhbmQgd2Ugbm93IGtub3cgdGhhdCB0aGVzZQogICAgICAgIGRhdGEgYXJlIHRoZSBmaW5hbCBjaHVuayBvZiBpbnB1dCwgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZW0gYWdhaW4KLSAgICAgICB0byBkZXRlY3QgZXJyb3JzIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24uCisgICAgICAgdG8gZGV0ZWN0IGVycm9ycyBiYXNlZCBvbiB0aGF0IGZhY3QuCiAgICAgKi8KICAgICBlcnJvckNvZGUgPSBwcm9jZXNzb3IocGFyc2VyLCBidWZmZXJQdHIsIHBhcnNlRW5kUHRyLCAmYnVmZmVyUHRyKTsKIAogICAgIGlmIChlcnJvckNvZGUgPT0gWE1MX0VSUk9SX05PTkUpIHsKLSAgICAgIHN3aXRjaCAocGFyc2luZykgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOwogICAgICAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKICAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAogICAgICAgY2FzZSBYTUxfUEFSU0lORzoKLSAgICAgICAgcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKQEAgLTE0NzAsNyArMTQ3Miw3IEBACiAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OwogICAgIHBhcnNlRW5kQnl0ZUluZGV4ICs9IGxlbjsKICAgICBwb3NpdGlvblB0ciA9IHM7Ci0gICAgZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKyAgICBwc19maW5hbEJ1ZmZlciA9IChYTUxfQm9vbClpc0ZpbmFsOwogCiAgICAgZXJyb3JDb2RlID0gcHJvY2Vzc29yKHBhcnNlciwgcywgcGFyc2VFbmRQdHIgPSBzICsgbGVuLCAmZW5kKTsKIApAQCAtMTQ4MCw3ICsxNDgyLDcgQEAKICAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIHN3aXRjaCAocGFyc2luZykgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgICBicmVhazsKQEAgLTE0ODgsMTQgKzE0OTAsMTMgQEAKICAgICAgIGNhc2UgWE1MX1BBUlNJTkc6CiAgICAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfT0s7CiAgICAgICAgIGlmIChpc0ZpbmFsKSB7Ci0gICAgICAgICAgcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOwogICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICBYbWxVcGRhdGVQb3NpdGlvbihlbmNvZGluZywgcG9zaXRpb25QdHIsIGVuZCwgJnBvc2l0aW9uKTsKLSAgICBwb3NpdGlvblB0ciA9IGVuZDsKICAgICBuTGVmdE92ZXIgPSBzICsgbGVuIC0gZW5kOwogICAgIGlmIChuTGVmdE92ZXIpIHsKICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBuTGVmdE92ZXIgPiBidWZmZXJMaW0gLSBidWZmZXIpIHsKQEAgLTE1MTgsOSArMTUxOSwxMyBAQAogICAgICAgICBidWZmZXJMaW0gPSBidWZmZXIgKyBsZW4gKiAyOwogICAgICAgfQogICAgICAgbWVtY3B5KGJ1ZmZlciwgZW5kLCBuTGVmdE92ZXIpOwotICAgICAgYnVmZmVyUHRyID0gYnVmZmVyOwotICAgICAgYnVmZmVyRW5kID0gYnVmZmVyICsgbkxlZnRPdmVyOwogICAgIH0KKyAgICBidWZmZXJQdHIgPSBidWZmZXI7CisgICAgYnVmZmVyRW5kID0gYnVmZmVyICsgbkxlZnRPdmVyOworICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOworICAgIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kOworICAgIGV2ZW50UHRyID0gYnVmZmVyUHRyOworICAgIGV2ZW50RW5kUHRyID0gYnVmZmVyUHRyOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KICNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KQEAgLTE1NDEsNyArMTU0Niw3IEBACiAgIGNvbnN0IGNoYXIgKnN0YXJ0OwogICBlbnVtIFhNTF9TdGF0dXMgcmVzdWx0ID0gWE1MX1NUQVRVU19PSzsKIAotICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOwogICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwpAQCAtMTU0OSw3ICsxNTU0LDcgQEAKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgIGRlZmF1bHQ6Ci0gICAgcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICAgIHBzX3BhcnNpbmcgPSBYTUxfUEFSU0lORzsKICAgfQogCiAgIHN0YXJ0ID0gYnVmZmVyUHRyOwpAQCAtMTU1Nyw3ICsxNTYyLDcgQEAKICAgYnVmZmVyRW5kICs9IGxlbjsKICAgcGFyc2VFbmRQdHIgPSBidWZmZXJFbmQ7CiAgIHBhcnNlRW5kQnl0ZUluZGV4ICs9IGxlbjsKLSAgZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKyAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKIAogICBlcnJvckNvZGUgPSBwcm9jZXNzb3IocGFyc2VyLCBzdGFydCwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOwogCkBAIC0xNTY3LDE0ICsxNTcyLDE0IEBACiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgIH0KICAgZWxzZSB7Ci0gICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CiAgICAgICBicmVhazsKICAgICBjYXNlIFhNTF9JTklUSUFMSVpFRDogCiAgICAgY2FzZSBYTUxfUEFSU0lORzoKICAgICAgIGlmIChpc0ZpbmFsKSB7Ci0gICAgICAgIHBhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAgICAgZGVmYXVsdDogOyAgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KQEAgLTE1ODksNyArMTU5NCw3IEBACiB2b2lkICogWE1MQ0FMTAogWE1MX0dldEJ1ZmZlcihYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbikKIHsKLSAgc3dpdGNoIChwYXJzaW5nKSB7CisgIHN3aXRjaCAocHNfcGFyc2luZykgewogICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKICAgICByZXR1cm4gTlVMTDsKQEAgLTE2MDEsOSArMTYwNiw5IEBACiAKICAgaWYgKGxlbiA+IGJ1ZmZlckxpbSAtIGJ1ZmZlckVuZCkgewogICAgIC8qIEZJWE1FIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICBpbnQgbmVlZGVkU2l6ZSA9IGxlbiArIChidWZmZXJFbmQgLSBidWZmZXJQdHIpOworICAgIGludCBuZWVkZWRTaXplID0gbGVuICsgKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKICNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUwotICAgIGludCBrZWVwID0gYnVmZmVyUHRyIC0gYnVmZmVyOworICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKIAogICAgIGlmIChrZWVwID4gWE1MX0NPTlRFWFRfQllURVMpCiAgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CkBAIC0xNjEyLDcgKzE2MTcsNyBAQAogICAgIGlmIChuZWVkZWRTaXplICA8PSBidWZmZXJMaW0gLSBidWZmZXIpIHsKICNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUwogICAgICAgaWYgKGtlZXAgPCBidWZmZXJQdHIgLSBidWZmZXIpIHsKLSAgICAgICAgaW50IG9mZnNldCA9IChidWZmZXJQdHIgLSBidWZmZXIpIC0ga2VlcDsKKyAgICAgICAgaW50IG9mZnNldCA9IChpbnQpKGJ1ZmZlclB0ciAtIGJ1ZmZlcikgLSBrZWVwOwogICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgJmJ1ZmZlcltvZmZzZXRdLCBidWZmZXJFbmQgLSBidWZmZXJQdHIgKyBrZWVwKTsKICAgICAgICAgYnVmZmVyRW5kIC09IG9mZnNldDsKICAgICAgICAgYnVmZmVyUHRyIC09IG9mZnNldDsKQEAgLTE2MjUsNyArMTYzMCw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgY2hhciAqbmV3QnVmOwotICAgICAgaW50IGJ1ZmZlclNpemUgPSBidWZmZXJMaW0gLSBidWZmZXJQdHI7CisgICAgICBpbnQgYnVmZmVyU2l6ZSA9IChpbnQpKGJ1ZmZlckxpbSAtIGJ1ZmZlclB0cik7CiAgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKQogICAgICAgICBidWZmZXJTaXplID0gSU5JVF9CVUZGRVJfU0laRTsKICAgICAgIGRvIHsKQEAgLTE2MzksNyArMTY0NCw3IEBACiAgICAgICBidWZmZXJMaW0gPSBuZXdCdWYgKyBidWZmZXJTaXplOwogI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCiAgICAgICBpZiAoYnVmZmVyUHRyKSB7Ci0gICAgICAgIGludCBrZWVwID0gYnVmZmVyUHRyIC0gYnVmZmVyOworICAgICAgICBpbnQga2VlcCA9IChpbnQpKGJ1ZmZlclB0ciAtIGJ1ZmZlcik7CiAgICAgICAgIGlmIChrZWVwID4gWE1MX0NPTlRFWFRfQllURVMpCiAgICAgICAgICAga2VlcCA9IFhNTF9DT05URVhUX0JZVEVTOwogICAgICAgICBtZW1jcHkobmV3QnVmLCAmYnVmZmVyUHRyWy1rZWVwXSwgYnVmZmVyRW5kIC0gYnVmZmVyUHRyICsga2VlcCk7CkBAIC0xNjY4LDEzICsxNjczLDEzIEBACiBlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAogWE1MX1N0b3BQYXJzZXIoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHJlc3VtYWJsZSkKIHsKLSAgc3dpdGNoIChwYXJzaW5nKSB7CisgIHN3aXRjaCAocHNfcGFyc2luZykgewogICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgaWYgKHJlc3VtYWJsZSkgewogICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKICAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICAgIH0KLSAgICBwYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CiAgICAgYnJlYWs7CiAgIGNhc2UgWE1MX0ZJTklTSEVEOgogICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9GSU5JU0hFRDsKQEAgLTE2ODcsMTAgKzE2OTIsMTAgQEAKICAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgICAgICB9CiAjZW5kaWYKLSAgICAgIHBhcnNpbmcgPSBYTUxfU1VTUEVOREVEOworICAgICAgcHNfcGFyc2luZyA9IFhNTF9TVVNQRU5ERUQ7CiAgICAgfQogICAgIGVsc2UKLSAgICAgIHBhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgICAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOwogICB9CiAgIHJldHVybiBYTUxfU1RBVFVTX09LOwogfQpAQCAtMTcwMCwxMSArMTcwNSwxMSBAQAogewogICBlbnVtIFhNTF9TdGF0dXMgcmVzdWx0ID0gWE1MX1NUQVRVU19PSzsKIAotICBpZiAocGFyc2luZyAhPSBYTUxfU1VTUEVOREVEKSB7CisgIGlmIChwc19wYXJzaW5nICE9IFhNTF9TVVNQRU5ERUQpIHsKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfTk9UX1NVU1BFTkRFRDsKICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgfQotICBwYXJzaW5nID0gWE1MX1BBUlNJTkc7CisgIHBzX3BhcnNpbmcgPSBYTUxfUEFSU0lORzsKIAogICBlcnJvckNvZGUgPSBwcm9jZXNzb3IocGFyc2VyLCBidWZmZXJQdHIsIHBhcnNlRW5kUHRyLCAmYnVmZmVyUHRyKTsKIApAQCAtMTcxNCwxNCArMTcxOSwxNCBAQAogICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICB9CiAgIGVsc2UgewotICAgIHN3aXRjaCAocGFyc2luZykgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgewogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAogICAgIGNhc2UgWE1MX1BBUlNJTkc6Ci0gICAgICBpZiAoZmluYWxCdWZmZXIpIHsKLSAgICAgICAgcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgIGlmIChwc19maW5hbEJ1ZmZlcikgeworICAgICAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgfQogICAgIGRlZmF1bHQ6IDsKQEAgLTE3NDYsNyArMTc1MSw3IEBACiAgIHJldHVybiBlcnJvckNvZGU7CiB9CiAKLWxvbmcgWE1MQ0FMTAorWE1MX0luZGV4IFhNTENBTEwKIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKQogewogICBpZiAoZXZlbnRQdHIpCkBAIC0xNzU4LDcgKzE3NjMsNyBAQAogWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpCiB7CiAgIGlmIChldmVudEVuZFB0ciAmJiBldmVudFB0cikKLSAgICByZXR1cm4gZXZlbnRFbmRQdHIgLSBldmVudFB0cjsKKyAgICByZXR1cm4gKGludCkoZXZlbnRFbmRQdHIgLSBldmVudFB0cik7CiAgIHJldHVybiAwOwogfQogCkBAIC0xNzY3LDE1ICsxNzcyLDE1IEBACiB7CiAjaWZkZWYgWE1MX0NPTlRFWFRfQllURVMKICAgaWYgKGV2ZW50UHRyICYmIGJ1ZmZlcikgewotICAgICpvZmZzZXQgPSBldmVudFB0ciAtIGJ1ZmZlcjsKLSAgICAqc2l6ZSAgID0gYnVmZmVyRW5kIC0gYnVmZmVyOworICAgICpvZmZzZXQgPSAoaW50KShldmVudFB0ciAtIGJ1ZmZlcik7CisgICAgKnNpemUgICA9IChpbnQpKGJ1ZmZlckVuZCAtIGJ1ZmZlcik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfQogI2VuZGlmIC8qIGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KICAgcmV0dXJuIChjaGFyICopIDA7CiB9CiAKLWludCBYTUxDQUxMCitYTUxfU2l6ZSBYTUxDQUxMCiBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpCiB7CiAgIGlmIChldmVudFB0ciAmJiBldmVudFB0ciA+PSBwb3NpdGlvblB0cikgewpAQCAtMTc4NSw3ICsxNzkwLDcgQEAKICAgcmV0dXJuIHBvc2l0aW9uLmxpbmVOdW1iZXIgKyAxOwogfQogCi1pbnQgWE1MQ0FMTAorWE1MX1NpemUgWE1MQ0FMTAogWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpCiB7CiAgIGlmIChldmVudFB0ciAmJiBldmVudFB0ciA+PSBwb3NpdGlvblB0cikgewpAQCAtMTgzNiw3ICsxODQxLDcgQEAKIGNvbnN0IFhNTF9MQ2hhciAqIFhNTENBTEwKIFhNTF9FcnJvclN0cmluZyhlbnVtIFhNTF9FcnJvciBjb2RlKQogewotICBzdGF0aWMgY29uc3QgWE1MX0xDaGFyICptZXNzYWdlW10gPSB7CisgIHN0YXRpYyBjb25zdCBYTUxfTENoYXIqIGNvbnN0IG1lc3NhZ2VbXSA9IHsKICAgICAwLAogICAgIFhNTF9MKCJvdXQgb2YgbWVtb3J5IiksCiAgICAgWE1MX0woInN5bnRheCBlcnJvciIpLApAQCAtMTg1NCw3ICsxODU5LDcgQEAKICAgICBYTUxfTCgicmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlciIpLAogICAgIFhNTF9MKCJyZWZlcmVuY2UgdG8gYmluYXJ5IGVudGl0eSIpLAogICAgIFhNTF9MKCJyZWZlcmVuY2UgdG8gZXh0ZXJuYWwgZW50aXR5IGluIGF0dHJpYnV0ZSIpLAotICAgIFhNTF9MKCJ4bWwgZGVjbGFyYXRpb24gbm90IGF0IHN0YXJ0IG9mIGV4dGVybmFsIGVudGl0eSIpLAorICAgIFhNTF9MKCJYTUwgb3IgdGV4dCBkZWNsYXJhdGlvbiBub3QgYXQgc3RhcnQgb2YgZW50aXR5IiksCiAgICAgWE1MX0woInVua25vd24gZW5jb2RpbmciKSwKICAgICBYTUxfTCgiZW5jb2Rpbmcgc3BlY2lmaWVkIGluIFhNTCBkZWNsYXJhdGlvbiBpcyBpbmNvcnJlY3QiKSwKICAgICBYTUxfTCgidW5jbG9zZWQgQ0RBVEEgc2VjdGlvbiIpLApAQCAtMTg3NCw3ICsxODc5LDEwIEBACiAgICAgWE1MX0woInBhcnNlciBub3Qgc3VzcGVuZGVkIiksCiAgICAgWE1MX0woInBhcnNpbmcgYWJvcnRlZCIpLAogICAgIFhNTF9MKCJwYXJzaW5nIGZpbmlzaGVkIiksCi0gICAgWE1MX0woImNhbm5vdCBzdXNwZW5kIGluIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkiKQorICAgIFhNTF9MKCJjYW5ub3Qgc3VzcGVuZCBpbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5IiksCisgICAgWE1MX0woInJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUiKSwKKyAgICBYTUxfTCgicmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZCIpLAorICAgIFhNTF9MKCJwcmVmaXggbXVzdCBub3QgYmUgYm91bmQgdG8gb25lIG9mIHRoZSByZXNlcnZlZCBuYW1lc3BhY2UgbmFtZXMiKQogICB9OwogICBpZiAoY29kZSA+IDAgJiYgY29kZSA8IHNpemVvZihtZXNzYWdlKS9zaXplb2YobWVzc2FnZVswXSkpCiAgICAgcmV0dXJuIG1lc3NhZ2VbY29kZV07CkBAIC0xOTE2LDkgKzE5MjQsMTEgQEAKIGNvbnN0IFhNTF9GZWF0dXJlICogWE1MQ0FMTAogWE1MX0dldEZlYXR1cmVMaXN0KHZvaWQpCiB7Ci0gIHN0YXRpYyBYTUxfRmVhdHVyZSBmZWF0dXJlc1tdID0gewotICAgIHtYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVIsICBYTUxfTCgic2l6ZW9mKFhNTF9DaGFyKSIpLCAwfSwKLSAgICB7WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUiwgWE1MX0woInNpemVvZihYTUxfTENoYXIpIiksIDB9LAorICBzdGF0aWMgY29uc3QgWE1MX0ZlYXR1cmUgZmVhdHVyZXNbXSA9IHsKKyAgICB7WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9DSEFSLCAgWE1MX0woInNpemVvZihYTUxfQ2hhcikiKSwKKyAgICAgc2l6ZW9mKFhNTF9DaGFyKX0sCisgICAge1hNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVIsIFhNTF9MKCJzaXplb2YoWE1MX0xDaGFyKSIpLAorICAgICBzaXplb2YoWE1MX0xDaGFyKX0sCiAjaWZkZWYgWE1MX1VOSUNPREUKICAgICB7WE1MX0ZFQVRVUkVfVU5JQ09ERSwgICAgICAgICAgWE1MX0woIlhNTF9VTklDT0RFIiksIDB9LAogI2VuZGlmCkBAIC0xOTM1LDExICsxOTQ1LDEyIEBACiAjaWZkZWYgWE1MX01JTl9TSVpFCiAgICAge1hNTF9GRUFUVVJFX01JTl9TSVpFLCAgICAgICAgIFhNTF9MKCJYTUxfTUlOX1NJWkUiKSwgMH0sCiAjZW5kaWYKKyNpZmRlZiBYTUxfTlMKKyAgICB7WE1MX0ZFQVRVUkVfTlMsICAgICAgICAgICAgICAgWE1MX0woIlhNTF9OUyIpLCAwfSwKKyNlbmRpZgogICAgIHtYTUxfRkVBVFVSRV9FTkQsICAgICAgICAgICAgICBOVUxMLCAwfQogICB9OwogCi0gIGZlYXR1cmVzWzBdLnZhbHVlID0gc2l6ZW9mKFhNTF9DaGFyKTsKLSAgZmVhdHVyZXNbMV0udmFsdWUgPSBzaXplb2YoWE1MX0xDaGFyKTsKICAgcmV0dXJuIGZlYXR1cmVzOwogfQogCkBAIC0yMDAwLDcgKzIwMTEsNyBAQAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQogewogICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCAwLCBlbmNvZGluZywgc3RhcnQsIGVuZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhZmluYWxCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKICAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgewogICAgIGlmICghc3RvcmVSYXdOYW1lcyhwYXJzZXIpKQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CkBAIC0yMDM2LDIxICsyMDQ3LDIxIEBACiAgICAgICAgZG9Db250ZW50IChieSBkZXRlY3RpbmcgWE1MX1RPS19OT05FKSB3aXRob3V0IHByb2Nlc3NpbmcgYW55IHhtbCB0ZXh0CiAgICAgICAgZGVjbGFyYXRpb24gLSBjYXVzaW5nIHRoZSBlcnJvciBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSSBpbiBkb0NvbnRlbnQuCiAgICAgKi8KLSAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWZpbmFsQnVmZmVyKSB7CisgICAgaWYgKG5leHQgPT0gZW5kICYmICFwc19maW5hbEJ1ZmZlcikgewogICAgICAgKmVuZFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgfQogICAgIHN0YXJ0ID0gbmV4dDsKICAgICBicmVhazsKICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6Ci0gICAgaWYgKCFmaW5hbEJ1ZmZlcikgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKICAgICAgICplbmRQdHIgPSBzdGFydDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CiAgICAgZXZlbnRQdHIgPSBzdGFydDsKICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOwogICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgotICAgIGlmICghZmluYWxCdWZmZXIpIHsKKyAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyKSB7CiAgICAgICAqZW5kUHRyID0gc3RhcnQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgfQpAQCAtMjA4MCw3ICsyMDkxLDcgQEAKICAgICAgIHJlc3VsdCA9IHByb2Nlc3NYbWxEZWNsKHBhcnNlciwgMSwgc3RhcnQsIG5leHQpOwogICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIHN3aXRjaCAocGFyc2luZykgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAogICAgICAgICAqZW5kUHRyID0gbmV4dDsKICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwpAQCAtMjA5MiwxMyArMjEwMywxMyBAQAogICAgIH0KICAgICBicmVhazsKICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6Ci0gICAgaWYgKCFmaW5hbEJ1ZmZlcikgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKICAgICAgICplbmRQdHIgPSBzdGFydDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CiAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICBpZiAoIWZpbmFsQnVmZmVyKSB7CisgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgewogICAgICAgKmVuZFB0ciA9IHN0YXJ0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIH0KQEAgLTIxMTYsNyArMjEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKIHsKICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgMSwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIGlmIChyZXN1bHQgPT0gWE1MX0VSUk9SX05PTkUpIHsKICAgICBpZiAoIXN0b3JlUmF3TmFtZXMocGFyc2VyKSkKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwpAQCAtMjMxNSwxMiArMjMyNiwxMiBAQAogICAgICAgICAgICAgWG1sQ29udmVydChlbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tUHRyLCByYXdOYW1lRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAoSUNIQVIgKiopJnRvUHRyLCAoSUNIQVIgKil0YWctPmJ1ZkVuZCAtIDEpOwotICAgICAgICAgICAgY29udkxlbiA9IHRvUHRyIC0gKFhNTF9DaGFyICopdGFnLT5idWY7CisgICAgICAgICAgICBjb252TGVuID0gKGludCkodG9QdHIgLSAoWE1MX0NoYXIgKil0YWctPmJ1Zik7CiAgICAgICAgICAgICBpZiAoZnJvbVB0ciA9PSByYXdOYW1lRW5kKSB7CiAgICAgICAgICAgICAgIHRhZy0+bmFtZS5zdHJMZW4gPSBjb252TGVuOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZlNpemUgPSAodGFnLT5idWZFbmQgLSB0YWctPmJ1ZikgPDwgMTsKKyAgICAgICAgICAgIGJ1ZlNpemUgPSAoaW50KSh0YWctPmJ1ZkVuZCAtIHRhZy0+YnVmKSA8PCAxOwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBjaGFyICp0ZW1wID0gKGNoYXIgKilSRUFMTE9DKHRhZy0+YnVmLCBidWZTaXplKTsKICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKQEAgLTI1MDgsMTIgKzI1MTksMTIgQEAKICAgICAgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CiAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBlbmQsICZkYXRhUHRyLCAoSUNIQVIgKilkYXRhQnVmRW5kKTsKICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1ZikpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopZW5kIC0gKFhNTF9DaGFyICopcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopZW5kIC0gKFhNTF9DaGFyICopcykpOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCiAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7CkBAIC0yNTM4LDcgKzI1NDksNyBAQAogICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7CiAgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CiAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKICAgICAgICAgICAgIGlmIChzID09IG5leHQpCiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgKmV2ZW50UFAgPSBzOwpAQCAtMjU0Nyw3ICsyNTU4LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKiluZXh0IC0gKFhNTF9DaGFyICopcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQogICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKQEAgLTI1NjYsNyArMjU3Nyw3IEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgKmV2ZW50UFAgPSBzID0gbmV4dDsKLSAgICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAogICAgICAgKm5leHRQdHIgPSBuZXh0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwpAQCAtMjgyMiw3ICsyODMzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghc3RlcCkKICAgICAgICAgICAgICAgc3RlcCA9IFBST0JFX1NURVAodXJpSGFzaCwgbWFzaywgbnNBdHRzUG93ZXIpOwotICAgICAgICAgICAgaiA8IHN0ZXAgPyAoIGogKz0gbnNBdHRzU2l6ZSAtIHN0ZXApIDogKGogLT0gc3RlcCk7CisgICAgICAgICAgICBqIDwgc3RlcCA/IChqICs9IG5zQXR0c1NpemUgLSBzdGVwKSA6IChqIC09IHN0ZXApOwogICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODQ1LDggKzI4NTYsMTAgQEAKICAgICAgICAgbnNBdHRzW2pdLmhhc2ggPSB1cmlIYXNoOwogICAgICAgICBuc0F0dHNbal0udXJpTmFtZSA9IHM7CiAKLSAgICAgICAgaWYgKCEtLW5QcmVmaXhlcykKKyAgICAgICAgaWYgKCEtLW5QcmVmaXhlcykgeworICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSAgLyogbm90IHByZWZpeGVkICovCiAgICAgICAgICgoWE1MX0NoYXIgKilzKVstMV0gPSAwOyAgLyogY2xlYXIgZmxhZyAqLwpAQCAtMjg3OSwxNCArMjg5MiwxNCBAQAogICBwcmVmaXhMZW4gPSAwOwogICBpZiAobnNfdHJpcGxldHMgJiYgYmluZGluZy0+cHJlZml4LT5uYW1lKSB7CiAgICAgZm9yICg7IGJpbmRpbmctPnByZWZpeC0+bmFtZVtwcmVmaXhMZW4rK107KQotICAgICAgOworICAgICAgOyAgLyogcHJlZml4TGVuIGluY2x1ZGVzIG51bGwgdGVybWluYXRvciAqLwogICB9CiAgIHRhZ05hbWVQdHItPmxvY2FsUGFydCA9IGxvY2FsUGFydDsKICAgdGFnTmFtZVB0ci0+dXJpTGVuID0gYmluZGluZy0+dXJpTGVuOwogICB0YWdOYW1lUHRyLT5wcmVmaXggPSBiaW5kaW5nLT5wcmVmaXgtPm5hbWU7CiAgIHRhZ05hbWVQdHItPnByZWZpeExlbiA9IHByZWZpeExlbjsKICAgZm9yIChpID0gMDsgbG9jYWxQYXJ0W2krK107KQotICAgIDsKKyAgICA7ICAvKiBpIGluY2x1ZGVzIG51bGwgdGVybWluYXRvciAqLwogICBuID0gaSArIGJpbmRpbmctPnVyaUxlbiArIHByZWZpeExlbjsKICAgaWYgKG4gPiBiaW5kaW5nLT51cmlBbGxvYykgewogICAgIFRBRyAqcDsKQEAgLTI5MDEsMTIgKzI5MTQsMTMgQEAKICAgICBGUkVFKGJpbmRpbmctPnVyaSk7CiAgICAgYmluZGluZy0+dXJpID0gdXJpOwogICB9CisgIC8qIGlmIG5hbWVzcGFjZVNlcGFyYXRvciAhPSAnXDAnIHRoZW4gdXJpIGluY2x1ZGVzIGl0IGFscmVhZHkgKi8KICAgdXJpID0gYmluZGluZy0+dXJpICsgYmluZGluZy0+dXJpTGVuOwogICBtZW1jcHkodXJpLCBsb2NhbFBhcnQsIGkgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgLyogd2UgYWx3YXlzIGhhdmUgYSBuYW1lc3BhY2Ugc2VwYXJhdG9yIGJldHdlZW4gbG9jYWxQYXJ0IGFuZCBwcmVmaXggKi8KICAgaWYgKHByZWZpeExlbikgewotICAgIHVyaSA9IHVyaSArIChpIC0gMSk7Ci0gICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvcikKLSAgICAgICp1cmkgPSBuYW1lc3BhY2VTZXBhcmF0b3I7CisgICAgdXJpICs9IGkgLSAxOworICAgICp1cmkgPSBuYW1lc3BhY2VTZXBhcmF0b3I7ICAvKiByZXBsYWNlIG51bGwgdGVybWluYXRvciAqLwogICAgIG1lbWNweSh1cmkgKyAxLCBiaW5kaW5nLT5wcmVmaXgtPm5hbWUsIHByZWZpeExlbiAqIHNpemVvZihYTUxfQ2hhcikpOwogICB9CiAgIHRhZ05hbWVQdHItPnN0ciA9IGJpbmRpbmctPnVyaTsKQEAgLTI5MjAsNiArMjkzNCwyNiBAQAogYWRkQmluZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgUFJFRklYICpwcmVmaXgsIGNvbnN0IEFUVFJJQlVURV9JRCAqYXR0SWQsCiAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmksIEJJTkRJTkcgKipiaW5kaW5nc1B0cikKIHsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIHhtbE5hbWVzcGFjZVtdID0geworICAgICdoJywgJ3QnLCAndCcsICdwJywgJzonLCAnLycsICcvJywKKyAgICAndycsICd3JywgJ3cnLCAnLicsICd3JywgJzMnLCAnLicsICdvJywgJ3InLCAnZycsICcvJywKKyAgICAnWCcsICdNJywgJ0wnLCAnLycsICcxJywgJzknLCAnOScsICc4JywgJy8nLAorICAgICduJywgJ2EnLCAnbScsICdlJywgJ3MnLCAncCcsICdhJywgJ2MnLCAnZScsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxMZW4gPSAKKyAgICAoaW50KXNpemVvZih4bWxOYW1lc3BhY2UpL3NpemVvZihYTUxfQ2hhcikgLSAxOworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgeG1sbnNOYW1lc3BhY2VbXSA9IHsKKyAgICAnaCcsICd0JywgJ3QnLCAncCcsICc6JywgJy8nLCAnLycsCisgICAgJ3cnLCAndycsICd3JywgJy4nLCAndycsICczJywgJy4nLCAnbycsICdyJywgJ2cnLCAnLycsCisgICAgJzInLCAnMCcsICcwJywgJzAnLCAnLycsICd4JywgJ20nLCAnbCcsICduJywgJ3MnLCAnLycsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxuc0xlbiA9IAorICAgIChpbnQpc2l6ZW9mKHhtbG5zTmFtZXNwYWNlKS9zaXplb2YoWE1MX0NoYXIpIC0gMTsKKworICBYTUxfQm9vbCBtdXN0QmVYTUwgPSBYTUxfRkFMU0U7CisgIFhNTF9Cb29sIGlzWE1MID0gWE1MX1RSVUU7CisgIFhNTF9Cb29sIGlzWE1MTlMgPSBYTUxfVFJVRTsKKyAgCiAgIEJJTkRJTkcgKmI7CiAgIGludCBsZW47CiAKQEAgLTI5MjcsOCArMjk2MSwzOSBAQAogICBpZiAoKnVyaSA9PSBYTUxfVCgnXDAnKSAmJiBwcmVmaXgtPm5hbWUpCiAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVg7CiAKLSAgZm9yIChsZW4gPSAwOyB1cmlbbGVuXTsgbGVuKyspCi0gICAgOworICBpZiAocHJlZml4LT5uYW1lCisgICAgICAmJiBwcmVmaXgtPm5hbWVbMF0gPT0gWE1MX1QoJ3gnKQorICAgICAgJiYgcHJlZml4LT5uYW1lWzFdID09IFhNTF9UKCdtJykKKyAgICAgICYmIHByZWZpeC0+bmFtZVsyXSA9PSBYTUxfVCgnbCcpKSB7CisKKyAgICAvKiBOb3QgYWxsb3dlZCB0byBiaW5kIHhtbG5zICovCisgICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVCgnbicpCisgICAgICAgICYmIHByZWZpeC0+bmFtZVs0XSA9PSBYTUxfVCgncycpCisgICAgICAgICYmIHByZWZpeC0+bmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTE5TOworCisgICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIG11c3RCZVhNTCA9IFhNTF9UUlVFOworICB9CisKKyAgZm9yIChsZW4gPSAwOyB1cmlbbGVuXTsgbGVuKyspIHsKKyAgICBpZiAoaXNYTUwgJiYgKGxlbiA+IHhtbExlbiB8fCB1cmlbbGVuXSAhPSB4bWxOYW1lc3BhY2VbbGVuXSkpCisgICAgICBpc1hNTCA9IFhNTF9GQUxTRTsKKworICAgIGlmICghbXVzdEJlWE1MICYmIGlzWE1MTlMgCisgICAgICAgICYmIChsZW4gPiB4bWxuc0xlbiB8fCB1cmlbbGVuXSAhPSB4bWxuc05hbWVzcGFjZVtsZW5dKSkKKyAgICAgIGlzWE1MTlMgPSBYTUxfRkFMU0U7CisgIH0KKyAgaXNYTUwgPSBpc1hNTCAmJiBsZW4gPT0geG1sTGVuOworICBpc1hNTE5TID0gaXNYTUxOUyAmJiBsZW4gPT0geG1sbnNMZW47CisKKyAgaWYgKG11c3RCZVhNTCAhPSBpc1hNTCkKKyAgICByZXR1cm4gbXVzdEJlWE1MID8gWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwKKyAgICAgICAgICAgICAgICAgICAgIDogWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkk7CisKKyAgaWYgKGlzWE1MTlMpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJOworCiAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCiAgICAgbGVuKys7CiAgIGlmIChmcmVlQmluZGluZ0xpc3QpIHsKQEAgLTI5ODUsNyArMzA1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKIHsKICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9DZGF0YVNlY3Rpb24ocGFyc2VyLCBlbmNvZGluZywgJnN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgaWYgKHN0YXJ0KSB7CkBAIC0zMDQ0LDcgKzMxMDksNyBAQAogICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKICAgICAgICpzdGFydFB0ciA9IG5leHQ7CiAgICAgICAqbmV4dFB0ciA9IG5leHQ7Ci0gICAgICBpZiAocGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKICAgICAgIGVsc2UKICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwpAQCAtMzA2NCw3ICszMTI5LDcgQEAKICAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLCAmcywgbmV4dCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwogICAgICAgICAgICAgKmV2ZW50RW5kUFAgPSBuZXh0OwogICAgICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKSk7CiAgICAgICAgICAgICBpZiAocyA9PSBuZXh0KQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICpldmVudFBQID0gczsKQEAgLTMwNzMsNyArMzEzOCw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKSk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CkBAIC0zMTAwLDcgKzMxNjUsNyBAQAogICAgIH0KIAogICAgICpldmVudFBQID0gcyA9IG5leHQ7Ci0gICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgKm5leHRQdHIgPSBuZXh0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwpAQCAtMzEyNCw3ICszMTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKIHsKICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9JZ25vcmVTZWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsICZzdGFydCwgZW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQogICAgIHJldHVybiByZXN1bHQ7CiAgIGlmIChzdGFydCkgewpAQCAtMzE2OSw3ICszMjM0LDcgQEAKICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogICAgICpzdGFydFB0ciA9IG5leHQ7CiAgICAgKm5leHRQdHIgPSBuZXh0OwotICAgIGlmIChwYXJzaW5nID09IFhNTF9GSU5JU0hFRCkKKyAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CiAgICAgZWxzZQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwpAQCAtMzQwOSw3ICszNDc0LDcgQEAKICAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHN0YXJ0LCBlbmQsICZuZXh0KTsKICAgICBldmVudEVuZFB0ciA9IG5leHQ7CiAgICAgaWYgKHRvayA8PSAwKSB7Ci0gICAgICBpZiAoIWZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKKyAgICAgIGlmICghcHNfZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgewogICAgICAgICAqbmV4dFB0ciA9IHM7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIH0KQEAgLTM0MzIsNyArMzQ5Nyw3IEBACiAgICAgICByZXN1bHQgPSBwcm9jZXNzWG1sRGVjbChwYXJzZXIsIDAsIHN0YXJ0LCBuZXh0KTsKICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCiAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgICAgIHN3aXRjaCAocHNfcGFyc2luZykgewogICAgICAgY2FzZSBYTUxfU1VTUEVOREVEOiAKICAgICAgICAgKm5leHRQdHIgPSBuZXh0OwogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0zNDUyLDcgKzM1MTcsNyBAQAogICAgICAgIHRoZW4sIHdoZW4gdGhpcyByb3V0aW5lIGlzIGVudGVyZWQgdGhlIG5leHQgdGltZSwgWG1sUHJvbG9nVG9rIHdpbGwKICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElELCBzaW5jZSB0aGUgQk9NIGlzIHN0aWxsIGluIHRoZSBidWZmZXIKICAgICAqLwotICAgIGVsc2UgaWYgKHRvayA9PSBYTUxfVE9LX0JPTSAmJiBuZXh0ID09IGVuZCAmJiAhZmluYWxCdWZmZXIpIHsKKyAgICBlbHNlIGlmICh0b2sgPT0gWE1MX1RPS19CT00gJiYgbmV4dCA9PSBlbmQgJiYgIXBzX2ZpbmFsQnVmZmVyKSB7CiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgfQpAQCAtMzQ3Miw3ICszNTM3LDcgQEAKIAogICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOwogICBpZiAodG9rIDw9IDApIHsKLSAgICBpZiAoIWZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKKyAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKICAgICAgICpuZXh0UHRyID0gczsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CkBAIC0zNDk5LDcgKzM1NjQsNyBAQAogCiAgIHByb2Nlc3NvciA9IHByb2xvZ1Byb2Nlc3NvcjsKICAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCAKLSAgICAgICAgICAgICAgICAgIG5leHRQdHIsIChYTUxfQm9vbCkhZmluYWxCdWZmZXIpOworICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCkBAIC0zNTE2LDcgKzM1ODEsNyBAQAogICBmb3IgKDs7KSB7CiAgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuYywgc3RhcnQsIGVuZCwgJm5leHQpOwogICAgIGlmICh0b2sgPD0gMCkgewotICAgICAgaWYgKCFmaW5hbEJ1ZmZlciAmJiB0b2sgIT0gWE1MX1RPS19JTlZBTElEKSB7CisgICAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKICAgICAgICAgKm5leHRQdHIgPSBzOwogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgICB9CkBAIC0zNTQ5LDcgKzM2MTQsNyBAQAogICBjb25zdCBjaGFyICpuZXh0ID0gczsKICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7CiAgIHJldHVybiBkb1Byb2xvZyhwYXJzZXIsIGVuY29kaW5nLCBzLCBlbmQsIHRvaywgbmV4dCwgCi0gICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgIG5leHRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogfQogCiBzdGF0aWMgZW51bSBYTUxfRXJyb3IKQEAgLTM3MzgsNyArMzgwMyw4IEBACiAgICAgICAqLwogI2lmZGVmIFhNTF9EVEQKICAgICAgIGlmIChkb2N0eXBlU3lzaWQgfHwgdXNlRm9yZWlnbkRURCkgewotICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOyAvKiB3aGVuIGRvY1R5cGVTeXNpZCA9PSBOVUxMICovCisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOworICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOwogICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgewogICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCkBAIC0zNzU0LDExICszODIwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5zeXN0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnB1YmxpY0lkKSkKICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOwotICAgICAgICAgIGlmIChkdGQtPnBhcmFtRW50aXR5UmVhZCAmJgotICAgICAgICAgICAgICAhZHRkLT5zdGFuZGFsb25lICYmCi0gICAgICAgICAgICAgIG5vdFN0YW5kYWxvbmVIYW5kbGVyICYmCi0gICAgICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKLSAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkU7CisgICAgICAgICAgaWYgKGR0ZC0+cGFyYW1FbnRpdHlSZWFkKSB7CisgICAgICAgICAgICBpZiAoIWR0ZC0+c3RhbmRhbG9uZSAmJiAKKyAgICAgICAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJiAKKyAgICAgICAgICAgICAgICAhbm90U3RhbmRhbG9uZUhhbmRsZXIoaGFuZGxlckFyZykpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGlmIHdlIGRpZG4ndCByZWFkIHRoZSBmb3JlaWduIERURCB0aGVuIHRoaXMgbWVhbnMgdGhhdCB0aGVyZQorICAgICAgICAgICAgIGlzIG5vIGV4dGVybmFsIHN1YnNldCBhbmQgd2UgbXVzdCByZXNldCBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcworICAgICAgICAgICovCisgICAgICAgICAgZWxzZSBpZiAoIWRvY3R5cGVTeXNpZCkKKyAgICAgICAgICAgIGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gaGFkUGFyYW1FbnRpdHlSZWZzOwogICAgICAgICAgIC8qIGVuZCBvZiBEVEQgLSBubyBuZWVkIHRvIHVwZGF0ZSBkdGQtPmtlZXBQcm9jZXNzaW5nICovCiAgICAgICAgIH0KICAgICAgICAgdXNlRm9yZWlnbkRURCA9IFhNTF9GQUxTRTsKQEAgLTM3NzUsNiArMzg0Nyw3IEBACiAgICAgICAgICBsYXN0IGNoYW5jZSB0byByZWFkIHRoZSBmb3JlaWduIERURAogICAgICAgKi8KICAgICAgIGlmICh1c2VGb3JlaWduRFREKSB7CisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOwogICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOwogICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgewogICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLApAQCAtMzc5MCwxMSArMzg2MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+c3lzdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCiAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKLSAgICAgICAgICBpZiAoZHRkLT5wYXJhbUVudGl0eVJlYWQgJiYKLSAgICAgICAgICAgICAgIWR0ZC0+c3RhbmRhbG9uZSAmJgotICAgICAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJgotICAgICAgICAgICAgICAhbm90U3RhbmRhbG9uZUhhbmRsZXIoaGFuZGxlckFyZykpCi0gICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PVF9TVEFOREFMT05FOworICAgICAgICAgIGlmIChkdGQtPnBhcmFtRW50aXR5UmVhZCkgeworICAgICAgICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYKKyAgICAgICAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJgorICAgICAgICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogaWYgd2UgZGlkbid0IHJlYWQgdGhlIGZvcmVpZ24gRFREIHRoZW4gdGhpcyBtZWFucyB0aGF0IHRoZXJlCisgICAgICAgICAgICAgaXMgbm8gZXh0ZXJuYWwgc3Vic2V0IGFuZCB3ZSBtdXN0IHJlc2V0IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzCisgICAgICAgICAgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IGhhZFBhcmFtRW50aXR5UmVmczsKICAgICAgICAgICAvKiBlbmQgb2YgRFREIC0gbm8gbmVlZCB0byB1cGRhdGUgZHRkLT5rZWVwUHJvY2Vzc2luZyAqLwogICAgICAgICB9CiAgICAgICB9CkBAIC0zOTM1LDcgKzQwMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOwogICAgICAgICBpZiAoZGVjbEVudGl0eSkgewogICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRQdHIgPSBwb29sU3RhcnQoJmR0ZC0+ZW50aXR5VmFsdWVQb29sKTsKLSAgICAgICAgICBkZWNsRW50aXR5LT50ZXh0TGVuID0gcG9vbExlbmd0aCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOworICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRMZW4gPSAoaW50KShwb29sTGVuZ3RoKCZkdGQtPmVudGl0eVZhbHVlUG9vbCkpOwogICAgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+ZW50aXR5VmFsdWVQb29sKTsKICAgICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpIHsKICAgICAgICAgICAgICpldmVudEVuZFBQID0gczsKQEAgLTQ0OTYsNyArNDU3NSw3IEBACiAgICAgaWYgKGhhbmRsZURlZmF1bHQgJiYgZGVmYXVsdEhhbmRsZXIpCiAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKIAotICAgIHN3aXRjaCAocGFyc2luZykgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgewogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC00NTI3LDcgKzQ2MDYsNyBAQAogICAgIGNhc2UgLVhNTF9UT0tfUFJPTE9HX1M6CiAgICAgICBpZiAoZGVmYXVsdEhhbmRsZXIpIHsKICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKLSAgICAgICAgaWYgKHBhcnNpbmcgPT0gWE1MX0ZJTklTSEVEKQorICAgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCiAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOwogICAgICAgfQogICAgICAgKm5leHRQdHIgPSBuZXh0OwpAQCAtNDU1MSwxMyArNDYzMCwxMyBAQAogICAgICAgZXZlbnRQdHIgPSBuZXh0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOwogICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgotICAgICAgaWYgKCFmaW5hbEJ1ZmZlcikgeworICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgewogICAgICAgICAqbmV4dFB0ciA9IHM7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIH0KICAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CiAgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICAgIGlmICghZmluYWxCdWZmZXIpIHsKKyAgICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKICAgICAgICAgKm5leHRQdHIgPSBzOwogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgICB9CkBAIC00NTY2LDcgKzQ2NDUsNyBAQAogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5UOwogICAgIH0KICAgICBldmVudFB0ciA9IHMgPSBuZXh0OwotICAgIHN3aXRjaCAocGFyc2luZykgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgewogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC00NjE5LDggKzQ2OTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5kLCAmbmV4dCwgWE1MX0ZBTFNFKTsKIAogICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7Ci0gICAgaWYgKHRleHRFbmQgIT0gbmV4dCAmJiBwYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpIHsKLSAgICAgIGVudGl0eS0+cHJvY2Vzc2VkID0gbmV4dCAtIHRleHRTdGFydDsKKyAgICBpZiAodGV4dEVuZCAhPSBuZXh0ICYmIHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkgeworICAgICAgZW50aXR5LT5wcm9jZXNzZWQgPSAoaW50KShuZXh0IC0gdGV4dFN0YXJ0KTsKICAgICAgIHByb2Nlc3NvciA9IGludGVybmFsRW50aXR5UHJvY2Vzc29yOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTQ2NjUsOCArNDc0NCw4IEBACiAKICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKICAgICByZXR1cm4gcmVzdWx0OwotICBlbHNlIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7Ci0gICAgZW50aXR5LT5wcm9jZXNzZWQgPSBuZXh0IC0gKGNoYXIgKillbnRpdHktPnRleHRQdHI7CisgIGVsc2UgaWYgKHRleHRFbmQgIT0gbmV4dCAmJiBwc19wYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpIHsKKyAgICBlbnRpdHktPnByb2Nlc3NlZCA9IChpbnQpKG5leHQgLSAoY2hhciAqKWVudGl0eS0+dGV4dFB0cik7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogICBlbHNlIHsKQEAgLTQ2ODMsNyArNDc2Miw3IEBACiAgICAgcHJvY2Vzc29yID0gcHJvbG9nUHJvY2Vzc29yOwogICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7CiAgICAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCBuZXh0UHRyLCAKLSAgICAgICAgICAgICAgICAgICAgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogICB9CiAgIGVsc2UKICNlbmRpZiAvKiBYTUxfRFREICovCkBAIC00NjkxLDcgKzQ3NzAsNyBAQAogICAgIHByb2Nlc3NvciA9IGNvbnRlbnRQcm9jZXNzb3I7CiAgICAgLyogc2VlIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvciB2cyBjb250ZW50UHJvY2Vzc29yICovCiAgICAgcmV0dXJuIGRvQ29udGVudChwYXJzZXIsIHBhcmVudFBhcnNlciA/IDEgOiAwLCBlbmNvZGluZywgcywgZW5kLAotICAgICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7IAorICAgICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7IAogICB9ICAKIH0KIApAQCAtNDgwMCw5ICs0ODc5LDggQEAKICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKICAgICAgICAgZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIG5hbWUsIDApOwogICAgICAgICBwb29sRGlzY2FyZCgmdGVtcDJQb29sKTsKLSAgICAgICAgLyogZmlyc3QsIGRldGVybWluZSBpZiBhIGNoZWNrIGZvciBhbiBleGlzdGluZyBkZWNsYXJhdGlvbiBpcyBuZWVkZWQ7Ci0gICAgICAgICAgIGlmIHllcywgY2hlY2sgdGhhdCB0aGUgZW50aXR5IGV4aXN0cywgYW5kIHRoYXQgaXQgaXMgaW50ZXJuYWwsCi0gICAgICAgICAgIG90aGVyd2lzZSBjYWxsIHRoZSBkZWZhdWx0IGhhbmRsZXIgKGlmIGNhbGxlZCBmcm9tIGNvbnRlbnQpCisgICAgICAgIC8qIEZpcnN0LCBkZXRlcm1pbmUgaWYgYSBjaGVjayBmb3IgYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24gaXMgbmVlZGVkOworICAgICAgICAgICBpZiB5ZXMsIGNoZWNrIHRoYXQgdGhlIGVudGl0eSBleGlzdHMsIGFuZCB0aGF0IGl0IGlzIGludGVybmFsLgogICAgICAgICAqLwogICAgICAgICBpZiAocG9vbCA9PSAmZHRkLT5wb29sKSAgLyogYXJlIHdlIGNhbGxlZCBmcm9tIHByb2xvZz8gKi8KICAgICAgICAgICBjaGVja0VudGl0eURlY2wgPQpAQCAtNDgyMSwxMyArNDg5OSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoIWVudGl0eSkgewotICAgICAgICAgIC8qIGNhbm5vdCByZXBvcnQgc2tpcHBlZCBlbnRpdHkgaGVyZSAtIHNlZSBjb21tZW50cyBvbgotICAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyCisgICAgICAgICAgLyogQ2Fubm90IHJlcG9ydCBza2lwcGVkIGVudGl0eSBoZXJlIC0gc2VlIGNvbW1lbnRzIG9uCisgICAgICAgICAgICAgc2tpcHBlZEVudGl0eUhhbmRsZXIuCiAgICAgICAgICAgaWYgKHNraXBwZWRFbnRpdHlIYW5kbGVyKQogICAgICAgICAgICAgc2tpcHBlZEVudGl0eUhhbmRsZXIoaGFuZGxlckFyZywgbmFtZSwgMCk7CiAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiBDYW5ub3QgY2FsbCB0aGUgZGVmYXVsdCBoYW5kbGVyIGJlY2F1c2UgdGhpcyB3b3VsZCBiZQorICAgICAgICAgICAgIG91dCBvZiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gdGhlIHN0YXJ0RWxlbWVudEhhbmRsZXIuCiAgICAgICAgICAgaWYgKChwb29sID09ICZ0ZW1wUG9vbCkgJiYgZGVmYXVsdEhhbmRsZXIpCiAgICAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBwdHIsIG5leHQpOworICAgICAgICAgICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVudGl0eS0+b3BlbikgewpAQCAtNTEyNywxMiArNTIwOCwxMiBAQAogICAgICAgSUNIQVIgKmRhdGFQdHIgPSAoSUNIQVIgKilkYXRhQnVmOwogICAgICAgWG1sQ29udmVydChlbmMsICZzLCBlbmQsICZkYXRhUHRyLCAoSUNIQVIgKilkYXRhQnVmRW5kKTsKICAgICAgICpldmVudEVuZFBQID0gczsKLSAgICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKTsKKyAgICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIChpbnQpKGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKSk7CiAgICAgICAqZXZlbnRQUCA9IHM7CiAgICAgfSB3aGlsZSAocyAhPSBlbmQpOwogICB9CiAgIGVsc2UKLSAgICBkZWZhdWx0SGFuZGxlcihoYW5kbGVyQXJnLCAoWE1MX0NoYXIgKilzLCAoWE1MX0NoYXIgKillbmQgLSAoWE1MX0NoYXIgKilzKTsKKyAgICBkZWZhdWx0SGFuZGxlcihoYW5kbGVyQXJnLCAoWE1MX0NoYXIgKilzLCAoaW50KSgoWE1MX0NoYXIgKillbmQgLSAoWE1MX0NoYXIgKilzKSk7CiB9CiAKIApAQCAtNTI4Niw3ICs1MzY3LDcgQEAKICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoJz0nKSkpCiAgICAgICByZXR1cm4gTlVMTDsKICAgICBsZW4gPSBkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZy0+dXJpTGVuOwotICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IgIT0gWE1MX1QoJ1wwJykpCisgICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvcikKICAgICAgIGxlbi0tOwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZy0+dXJpW2ldKSkKQEAgLTUzMTIsNyArNTM5Myw3IEBACiAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCc9JykpKQogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbGVuID0gcHJlZml4LT5iaW5kaW5nLT51cmlMZW47Ci0gICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvciAhPSBYTUxfVCgnXDAnKSkKKyAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQogICAgICAgbGVuLS07CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIHByZWZpeC0+YmluZGluZy0+dXJpW2ldKSkKQEAgLTYwMTQsNyArNjA5NSw3IEBACiAgICAgfQogICB9CiAgIGlmIChwb29sLT5ibG9ja3MgJiYgcG9vbC0+c3RhcnQgPT0gcG9vbC0+YmxvY2tzLT5zKSB7Ci0gICAgaW50IGJsb2NrU2l6ZSA9IChwb29sLT5lbmQgLSBwb29sLT5zdGFydCkqMjsKKyAgICBpbnQgYmxvY2tTaXplID0gKGludCkocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpKjI7CiAgICAgcG9vbC0+YmxvY2tzID0gKEJMT0NLICopCiAgICAgICBwb29sLT5tZW0tPnJlYWxsb2NfZmNuKHBvb2wtPmJsb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldG9mKEJMT0NLLCBzKQpAQCAtNjAyOCw3ICs2MTA5LDcgQEAKICAgfQogICBlbHNlIHsKICAgICBCTE9DSyAqdGVtOwotICAgIGludCBibG9ja1NpemUgPSBwb29sLT5lbmQgLSBwb29sLT5zdGFydDsKKyAgICBpbnQgYmxvY2tTaXplID0gKGludCkocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpOwogICAgIGlmIChibG9ja1NpemUgPCBJTklUX0JMT0NLX1NJWkUpCiAgICAgICBibG9ja1NpemUgPSBJTklUX0JMT0NLX1NJWkU7CiAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWxyb2xlLmMgYi9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYwppbmRleCAyNTg3ZmRmLi4xNWQ0ZDhmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYwpAQCAtNiw2ICs2LDggQEAKICNpbmNsdWRlICJ3aW5jb25maWcuaCIKICNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKICNpbmNsdWRlICJtYWNjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zNF9fKQorI2luY2x1ZGUgImFtaWdhY29uZmlnLmgiCiAjZWxzZQogI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKICNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KQEAgLTc5Myw3ICs3OTUsNyBAQAogICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CiAgIGNhc2UgWE1MX1RPS19OQU1FOgogICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlc1tdID0geworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0gewogICAgICAgICBLV19DREFUQSwKICAgICAgICAgS1dfSUQsCiAgICAgICAgIEtXX0lEUkVGLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWx0b2suYyBiL01vZHVsZXMvZXhwYXQveG1sdG9rLmMKaW5kZXggOGI5ZDk5Ny4uZGI5MjI0NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWx0b2suYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5jCkBAIC02LDYgKzYsOCBAQAogI2luY2x1ZGUgIndpbmNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQogI2luY2x1ZGUgIm1hY2NvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3M0X18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKICNlbHNlCiAjaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAogI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgpAQCAtMTQ1MSw3ICsxNDUzLDcgQEAKIHN0YXRpYyBpbnQgRkFTVENBTEwKIGdldEVuY29kaW5nSW5kZXgoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmVuY29kaW5nTmFtZXNbXSA9IHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbmNvZGluZ05hbWVzW10gPSB7CiAgICAgS1dfSVNPXzg4NTlfMSwKICAgICBLV19VU19BU0NJSSwKICAgICBLV19VVEZfOCwKQEAgLTE0ODQsNyArMTQ4Niw3IEBACiAKIAogc3RhdGljIGludAotaW5pdFNjYW4oY29uc3QgRU5DT0RJTkcgKiplbmNvZGluZ1RhYmxlLAoraW5pdFNjYW4oY29uc3QgRU5DT0RJTkcgKiBjb25zdCAqZW5jb2RpbmdUYWJsZSwKICAgICAgICAgIGNvbnN0IElOSVRfRU5DT0RJTkcgKmVuYywKICAgICAgICAgIGludCBzdGF0ZSwKICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmggYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5oCmluZGV4IDFlY2QwNWYuLmNhODY3YWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmgKKysrIGIvTW9kdWxlcy9leHBhdC94bWx0b2suaApAQCAtMTExLDggKzExMSw4IEBACiAKIHR5cGVkZWYgc3RydWN0IHBvc2l0aW9uIHsKICAgLyogZmlyc3QgbGluZSBhbmQgZmlyc3QgY29sdW1uIGFyZSAwIG5vdCAxICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZU51bWJlcjsKLSAgdW5zaWduZWQgbG9uZyBjb2x1bW5OdW1iZXI7CisgIFhNTF9TaXplIGxpbmVOdW1iZXI7CisgIFhNTF9TaXplIGNvbHVtbk51bWJlcjsKIH0gUE9TSVRJT047CiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1sdG9rX2ltcGwuYyBiL01vZHVsZXMvZXhwYXQveG1sdG9rX2ltcGwuYwppbmRleCA0NjU2OWZlLi4wZWU1N2FiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHRva19pbXBsLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWx0b2tfaW1wbC5jCkBAIC0xNzE0LDcgKzE3MTQsNyBAQAogICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBwdHIgLSBzdGFydDsKKyAgICAgIHJldHVybiAoaW50KShwdHIgLSBzdGFydCk7CiAgICAgfQogICB9CiB9CkBAIC0xNzUwLDcgKzE3NTAsNyBAQAogICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCiAjdW5kZWYgTEVBRF9DQVNFCiAgICAgY2FzZSBCVF9MRjoKLSAgICAgIHBvcy0+Y29sdW1uTnVtYmVyID0gKHVuc2lnbmVkKS0xOworICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAoWE1MX1NpemUpLTE7CiAgICAgICBwb3MtPmxpbmVOdW1iZXIrKzsKICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKICAgICAgIGJyZWFrOwpAQCAtMTc1OSw3ICsxNzU5LDcgQEAKICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKICAgICAgIGlmIChwdHIgIT0gZW5kICYmIEJZVEVfVFlQRShlbmMsIHB0cikgPT0gQlRfTEYpCiAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIHBvcy0+Y29sdW1uTnVtYmVyID0gKHVuc2lnbmVkKS0xOworICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAoWE1MX1NpemUpLTE7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWx0b2tfbnMuYyBiL01vZHVsZXMvZXhwYXQveG1sdG9rX25zLmMKaW5kZXggNTYxMGViOS4uZDJmODkzOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWx0b2tfbnMuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHRva19ucy5jCkBAIC0xOSw3ICsxOSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGNvbnN0IEVOQ09ESU5HICpOUyhlbmNvZGluZ3MpW10gPSB7CitzdGF0aWMgY29uc3QgRU5DT0RJTkcgKiBjb25zdCBOUyhlbmNvZGluZ3MpW10gPSB7CiAgICZucyhsYXRpbjFfZW5jb2RpbmcpLmVuYywKICAgJm5zKGFzY2lpX2VuY29kaW5nKS5lbmMsCiAgICZucyh1dGY4X2VuY29kaW5nKS5lbmMsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKaW5kZXggNDc3YWYwNi4uNGU0OWE3ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mY250bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAiZmxvY2soZmQsIG9wZXJhdGlvbilcblwKIFxuXAogUGVyZm9ybSB0aGUgbG9jayBvcGVyYXRpb24gb3Agb24gZmlsZSBkZXNjcmlwdG9yIGZkLiAgU2VlIHRoZSBVbml4IFxuXAotbWFudWFsIGZsb2NrKDMpIGZvciBkZXRhaWxzLiAgKE9uIHNvbWUgc3lzdGVtcywgdGhpcyBmdW5jdGlvbiBpc1xuXAorbWFudWFsIHBhZ2UgZm9yIGZsb2NrKDMpIGZvciBkZXRhaWxzLiAgKE9uIHNvbWUgc3lzdGVtcywgdGhpcyBmdW5jdGlvbiBpc1xuXAogZW11bGF0ZWQgdXNpbmcgZmNudGwoKS4pIik7CiAKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCQlsLmxfdHlwZSA9IEZfV1JMQ0s7CiAJCWVsc2UgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ1bnJlY29nbml6ZWQgZmxvY2sgYXJndW1lbnQiKTsKKwkJCQkJInVucmVjb2duaXplZCBsb2NrZiBhcmd1bWVudCIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJbC5sX3N0YXJ0ID0gbC5sX2xlbiA9IDA7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jIGIvTW9kdWxlcy9mcGVjdGxtb2R1bGUuYwppbmRleCBjNmQ0Zjc3Li43NDM1NGJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMKQEAgLTcwLDYgKzcwLDEwIEBACiAKICNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQogIyAgaW5jbHVkZSA8aWVlZWZwLmg+CisjZWxpZiBkZWZpbmVkKF9fVk1TKQorI2RlZmluZSBfX05FV19TVEFSTEVUCisjaW5jbHVkZSA8c3RhcmxldC5oPgorI2luY2x1ZGUgPGllZWVkZWYuaD4KICNlbmRpZgogCiAjaWZuZGVmIFdBTlRfU0lHRlBFX0hBTkRMRVIKQEAgLTE5MCw2ICsxOTQsMTkgQEAKIAogLyotLSBERUMgQUxQSEEgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNlbGlmIGRlZmluZWQoX19BTFBIQSkgJiYgZGVmaW5lZChfX1ZNUykKKwlJRUVFIGNscm1zazsKKwlJRUVFIHNldG1zazsKKwljbHJtc2suaWVlZSRxX2ZsYWdzID0KKwkJSUVFRSRNX1RSQVBfRU5BQkxFX1VORiB8ICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5FIHwKKwkJIElFRUUkTV9NQVBfVU1aOworCXNldG1zay5pZWVlJHFfZmxhZ3MgPQorCQlJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwgSUVFRSRNX1RSQVBfRU5BQkxFX0RaRSB8CisJCUlFRUUkTV9UUkFQX0VOQUJMRV9PVkY7CisJc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgJnNldG1zaywgMCk7CisJUHlPU19zZXRzaWcoU0lHRlBFLCBoYW5kbGVyKTsKKworLyotLSBIUCBJQTY0IFZNUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZWxpZiBkZWZpbmVkKF9faWE2NCkgJiYgZGVmaW5lZChfX1ZNUykKICAgICBQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOwogCiAvKi0tIENyYXkgVW5pY29zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjQ0LDYgKzI2MSwxNCBAQAogI2lmZGVmIF9fRnJlZUJTRF9fCiAgICAgZnByZXNldHN0aWNreShmcGdldHN0aWNreSgpKTsKICAgICBmcHNldG1hc2soMCk7CisjZWxpZiBkZWZpbmVkKF9fVk1TKQorCUlFRUUgY2xybXNrOworCSBjbHJtc2suaWVlZSRxX2ZsYWdzID0KKwkJSUVFRSRNX1RSQVBfRU5BQkxFX1VORiB8ICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5FIHwKKwkJSUVFRSRNX01BUF9VTVogfCBJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwKKwkJSUVFRSRNX1RSQVBfRU5BQkxFX0RaRSB8IElFRUUkTV9UUkFQX0VOQUJMRV9PVkYgfAorCQlJRUVFJE1fSU5IRVJJVDsKKwlzeXMkaWVlZV9zZXRfZnBfY29udHJvbCgmY2xybXNrLCAwLCAwKTsKICNlbHNlCiAgICAgZnB1dHMoIk9wZXJhdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIsIHN0ZGVycik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0cGF0aC5jIGIvTW9kdWxlcy9nZXRwYXRoLmMKaW5kZXggOGViYTczMC4uNzhiZmFmOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRwYXRoLmMKKysrIGIvTW9kdWxlcy9nZXRwYXRoLmMKQEAgLTk3LDE5ICs5NywxOSBAQAogCiAKICNpZm5kZWYgVkVSU0lPTgotI2lmIGRlZmluZWQoX19WTVMpCi0jZGVmaW5lIFZFUlNJT04gIjJfMSIKLSNlbHNlCiAjZGVmaW5lIFZFUlNJT04gIjIuMSIKICNlbmRpZgotI2VuZGlmCiAKICNpZm5kZWYgVlBBVEgKICNkZWZpbmUgVlBBVEggIi4iCiAjZW5kaWYKIAogI2lmbmRlZiBQUkVGSVgKLSNkZWZpbmUgUFJFRklYICIvdXNyL2xvY2FsIgorIyAgaWZkZWYgX19WTVMKKyMgICAgZGVmaW5lIFBSRUZJWCAiIgorIyAgZWxzZQorIyAgICBkZWZpbmUgUFJFRklYICIvdXNyL2xvY2FsIgorIyAgZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIEVYRUNfUFJFRklYCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwppbmRleCA4NmIxYmJmLi5kOTEzODkwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCisrKyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogewogCWlmICh0ZG8tPm5leHRsaW5rID09IE5VTEwpCiAJCXRkby0+bmV4dGxpbmsgPSB0ZWVkYXRhb2JqZWN0X25ldyh0ZG8tPml0KTsKLQlQeV9JTkNSRUYodGRvLT5uZXh0bGluayk7CisJUHlfWElOQ1JFRih0ZG8tPm5leHRsaW5rKTsKIAlyZXR1cm4gdGRvLT5uZXh0bGluazsKIH0KIApAQCAtNDY4LDcgKzQ2OCw3IEBACiAKIAlpZiAodG8tPmluZGV4ID49IExJTktDRUxMUykgewogCQlsaW5rID0gdGVlZGF0YW9iamVjdF9qdW1wbGluayh0by0+ZGF0YW9iaik7Ci0JCVB5X1hERUNSRUYodG8tPmRhdGFvYmopOworCQlQeV9ERUNSRUYodG8tPmRhdGFvYmopOwogCQl0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopbGluazsKIAkJdG8tPmluZGV4ID0gMDsKIAl9CkBAIC01MjIsNiArNTIyLDEyIEBACiAJaWYgKHRvID09IE5VTEwpIAogCQlnb3RvIGRvbmU7CiAJdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKKwlpZiAoIXRvLT5kYXRhb2JqKSB7CisJCVB5T2JqZWN0X0dDX0RlbCh0byk7CisJCXRvID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKwogCXRvLT5pbmRleCA9IDA7CiAJdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKIAlQeU9iamVjdF9HQ19UcmFjayh0byk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IDIzYTc2MGYuLjNmMzljOWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgaW50ICBvcmlnX2FyZ2M7CiAKIC8qIGNvbW1hbmQgbGluZSBvcHRpb25zICovCi0jZGVmaW5lIEJBU0VfT1BUUyAiYzpkRWhpbTpPU3R1dlZXOnhYIgorI2RlZmluZSBCQVNFX09QVFMgImM6ZEVoaW06T1N0dXZWVzp4WD8iCiAKICNpZm5kZWYgUklTQ09TCiAjZGVmaW5lIFBST0dSQU1fT1BUUyBCQVNFX09QVFMKQEAgLTYxLDcgKzYxLDcgQEAKIC1jIGNtZCA6IHByb2dyYW0gcGFzc2VkIGluIGFzIHN0cmluZyAodGVybWluYXRlcyBvcHRpb24gbGlzdClcblwKIC1kICAgICA6IGRlYnVnIG91dHB1dCBmcm9tIHBhcnNlciAoYWxzbyBQWVRIT05ERUJVRz14KVxuXAogLUUgICAgIDogaWdub3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyAoc3VjaCBhcyBQWVRIT05QQVRIKVxuXAotLWggICAgIDogcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXRcblwKKy1oICAgICA6IHByaW50IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0IChhbHNvIC0taGVscClcblwKIC1pICAgICA6IGluc3BlY3QgaW50ZXJhY3RpdmVseSBhZnRlciBydW5uaW5nIHNjcmlwdCwgKGFsc28gUFlUSE9OSU5TUEVDVD14KVxuXAogICAgICAgICAgYW5kIGZvcmNlIHByb21wdHMsIGV2ZW4gaWYgc3RkaW4gZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdGVybWluYWxcblwKICI7CkBAIC03Niw3ICs3Niw3IEBACiBzdGF0aWMgY2hhciAqdXNhZ2VfMyA9ICJcCiAgICAgICAgICBzZWUgbWFuIHBhZ2UgZm9yIGRldGFpbHMgb24gaW50ZXJuYWwgYnVmZmVyaW5nIHJlbGF0aW5nIHRvICctdSdcblwKIC12ICAgICA6IHZlcmJvc2UgKHRyYWNlIGltcG9ydCBzdGF0ZW1lbnRzKSAoYWxzbyBQWVRIT05WRVJCT1NFPXgpXG5cCi0tViAgICAgOiBwcmludCB0aGUgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG5cCistViAgICAgOiBwcmludCB0aGUgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0IChhbHNvIC0tdmVyc2lvbilcblwKIC1XIGFyZyA6IHdhcm5pbmcgY29udHJvbCAoYXJnIGlzIGFjdGlvbjptZXNzYWdlOmNhdGVnb3J5Om1vZHVsZTpsaW5lbm8pXG5cCiAteCAgICAgOiBza2lwIGZpcnN0IGxpbmUgb2Ygc291cmNlLCBhbGxvd2luZyB1c2Ugb2Ygbm9uLVVuaXggZm9ybXMgb2YgIyFjbWRcblwKIGZpbGUgICA6IHByb2dyYW0gcmVhZCBmcm9tIHNjcmlwdCBmaWxlXG5cCkBAIC0yODEsNiArMjgxLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKIAkJCWhlbHArKzsKIAkJCWJyZWFrOwogCkBAIC00MzEsOSArNDMyLDEwIEBACiAJfQogCiAJaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0JCS8qIEJhY2t1cCBfUHlPU19vcHRpbmQgYW5kIGZvcmNlIHN5cy5hcnZbMF0gPSBtb2R1bGUgKi8KKwkJLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFyZ3ZbMF0gPSAnLWMnCisJCSAgIHNvIHRoYXQgUHlTeXNfU2V0QXJndiBjb3JyZWN0bHkgc2V0cyBzeXMucGF0aFswXSB0byAnJyovCiAJCV9QeU9TX29wdGluZC0tOwotICAgICAgICBhcmd2W19QeU9TX29wdGluZF0gPSBtb2R1bGU7CisJCWFyZ3ZbX1B5T1Nfb3B0aW5kXSA9ICItYyI7CiAJfQogCiAJUHlTeXNfU2V0QXJndihhcmdjLV9QeU9TX29wdGluZCwgYXJnditfUHlPU19vcHRpbmQpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwppbmRleCBkN2E4OTQ0Li5hZmU5OTE2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21tYXBtb2R1bGUuYworKysgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwpAQCAtNTAsNyArNTAsMTAgQEAKICNlbmRpZiAvKiBVTklYICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCiAKIC8qIFByZWZlciBNQVBfQU5PTllNT1VTIHNpbmNlIE1BUF9BTk9OIGlzIGRlcHJlY2F0ZWQgYWNjb3JkaW5nIHRvIG1hbiBwYWdlLiAqLwogI2lmICFkZWZpbmVkKE1BUF9BTk9OWU1PVVMpICYmIGRlZmluZWQoTUFQX0FOT04pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggYzAyODBkZS4uZDk2OGI2YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtNjQsMTQgKzY0LDIxIEBACiAjaW5jbHVkZSAib3NkZWZzLmgiCiAjZW5kaWYKIAorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCisKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX1NUQVRfSCAqLwogCiAjaWZkZWYgSEFWRV9TWVNfV0FJVF9ICiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4JCS8qIEZvciBXTk9IQU5HICovCiAjZW5kaWYKIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKICNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgogCiAjaWZkZWYgSEFWRV9GQ05UTF9ICiAjaW5jbHVkZSA8ZmNudGwuaD4KQEAgLTI0Niw5ICsyNTMsMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgX01TQ19WRVIKKyNpZmRlZiBIQVZFX0RJUkVDVF9ICiAjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lPX0gKICNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9QUk9DRVNTX0gKICNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKICNpbmNsdWRlICJvc2RlZnMuaCIKICNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAkgIC8qIE5lZWRlZCBmb3IgQ3J5cHRvQVBJIG9uIHNvbWUgc3lzdGVtcyAqLwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTEyMjcsNyArMTI0MCw5IEBACiAKICNkZWZpbmUgSVNTTEFTSEEoYykgKChjKSA9PSAnXFwnIHx8IChjKSA9PSAnLycpCiAjZGVmaW5lIElTU0xBU0hXKGMpICgoYykgPT0gTCdcXCcgfHwgKGMpID09IEwnLycpCisjaWZuZGVmIEFSUkFZU0laRQogI2RlZmluZSBBUlJBWVNJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyNlbmRpZgogCiBzdGF0aWMgQk9PTAogSXNVTkNSb290QShjaGFyICpwYXRoLCBpbnQgcGF0aGxlbikKQEAgLTEzODcsNyArMTQwMiw3IEBACiAJCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAJLyogQWNjZXNzIGlzIHBvc3NpYmxlIGlmIGVpdGhlciB3cml0ZSBhY2Nlc3Mgd2Fzbid0IHJlcXVlc3RlZCwgb3IKIAkgICB0aGUgZmlsZSBpc24ndCByZWFkLW9ubHkuICovCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyghKG1vZGUgJiAyKSB8fCAhKGF0dHIgJiYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpKTsKKwlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKCEobW9kZSAmIDIpIHx8ICEoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSk7CiAjZWxzZQogCWludCByZXM7CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6YWNjZXNzIiwgCkBAIC0xODQ3LDYgKzE4NjIsMTUgQEAKIAkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCQkJcmVzdWx0ID0gRmluZE5leHRGaWxlVyhoRmluZEZpbGUsICZ3RmlsZURhdGEpOwogCQkJCVB5X0VORF9BTExPV19USFJFQURTCisJCQkJLyogRmluZE5leHRGaWxlIHNldHMgZXJyb3IgdG8gRVJST1JfTk9fTU9SRV9GSUxFUyBpZgorCQkJCSAgIGl0IGdvdCB0byB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkuICovCisJCQkJaWYgKCFyZXN1bHQgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTk9fTU9SRV9GSUxFUykgeworCQkJCSAgICBQeV9ERUNSRUYoZCk7CisJCQkJICAgIHdpbjMyX2Vycm9yX3VuaWNvZGUoIkZpbmROZXh0RmlsZVciLCB3bmFtZWJ1Zik7CisJCQkJICAgIEZpbmRDbG9zZShoRmluZEZpbGUpOworCQkJCSAgICBmcmVlKHduYW1lYnVmKTsKKwkJCQkgICAgcmV0dXJuIE5VTEw7CisJCQkJfQogCQkJfSB3aGlsZSAocmVzdWx0ID09IFRSVUUpOwogCiAJCQlpZiAoRmluZENsb3NlKGhGaW5kRmlsZSkgPT0gRkFMU0UpIHsKQEAgLTE5MDYsNiArMTkzMCwxNCBAQAogCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCXJlc3VsdCA9IEZpbmROZXh0RmlsZShoRmluZEZpbGUsICZGaWxlRGF0YSk7CiAJCVB5X0VORF9BTExPV19USFJFQURTCisJCS8qIEZpbmROZXh0RmlsZSBzZXRzIGVycm9yIHRvIEVSUk9SX05PX01PUkVfRklMRVMgaWYKKwkJICAgaXQgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeS4gKi8KKwkJaWYgKCFyZXN1bHQgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTk9fTU9SRV9GSUxFUykgeworCQkgICAgUHlfREVDUkVGKGQpOworCQkgICAgd2luMzJfZXJyb3IoIkZpbmROZXh0RmlsZSIsIG5hbWVidWYpOworCQkgICAgRmluZENsb3NlKGhGaW5kRmlsZSk7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQogCX0gd2hpbGUgKHJlc3VsdCA9PSBUUlVFKTsKIAogCWlmIChGaW5kQ2xvc2UoaEZpbmRGaWxlKSA9PSBGQUxTRSkgewpAQCAtNzg2Nyw2ICs3ODk5LDQyIEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIF9fVk1TCisvKiBVc2Ugb3BlbnNzbCByYW5kb20gcm91dGluZSAqLworI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorUHlEb2NfU1RSVkFSKHZtc191cmFuZG9tX19kb2NfXywKKyJ1cmFuZG9tKG4pIC0+IHN0clxuXG5cCitSZXR1cm4gYSBzdHJpbmcgb2YgbiByYW5kb20gYnl0ZXMgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLiIpOworCitzdGF0aWMgUHlPYmplY3QqCit2bXNfdXJhbmRvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJaW50IGhvd01hbnk7CisJUHlPYmplY3QqIHJlc3VsdDsKKworCS8qIFJlYWQgYXJndW1lbnRzICovCisJaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp1cmFuZG9tIiwgJmhvd01hbnkpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoaG93TWFueSA8IDApCisJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKwkJCQkgICAgIm5lZ2F0aXZlIGFyZ3VtZW50IG5vdCBhbGxvd2VkIik7CisKKwkvKiBBbGxvY2F0ZSBieXRlcyAqLworCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGhvd01hbnkpOworCWlmIChyZXN1bHQgIT0gTlVMTCkgeworCQkvKiBHZXQgcmFuZG9tIGRhdGEgKi8KKwkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKCh1bnNpZ25lZCBjaGFyKikKKwkJCQkgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKKwkJCQkgICAgICBob3dNYW55KSA8IDApIHsKKwkJCVB5X0RFQ1JFRihyZXN1bHQpOworCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorCQkJCQkgICAgIlJBTkRfcHNldWRvX2J5dGVzIik7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCiBzdGF0aWMgUHlNZXRob2REZWYgcG9zaXhfbWV0aG9kc1tdID0gewogCXsiYWNjZXNzIiwJcG9zaXhfYWNjZXNzLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X2FjY2Vzc19fZG9jX199LAogI2lmZGVmIEhBVkVfVFRZTkFNRQpAQCAtODE2MCw2ICs4MjI4LDkgQEAKICAjaWZkZWYgTVNfV0lORE9XUwogIAl7InVyYW5kb20iLCB3aW4zMl91cmFuZG9tLCBNRVRIX1ZBUkFSR1MsIHdpbjMyX3VyYW5kb21fX2RvY19ffSwKICAjZW5kaWYKKyAjaWZkZWYgX19WTVMKKyAJeyJ1cmFuZG9tIiwgdm1zX3VyYW5kb20sIE1FVEhfVkFSQVJHUywgdm1zX3VyYW5kb21fX2RvY19ffSwKKyAjZW5kaWYKIAl7TlVMTCwJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvcHlleHBhdC5jIGIvTW9kdWxlcy9weWV4cGF0LmMKaW5kZXggOGExMGJhYi4uNjdmNzAwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9weWV4cGF0LmMKKysrIGIvTW9kdWxlcy9weWV4cGF0LmMKQEAgLTIzOCw2ICsyMzgsMTggQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyogRHVtbXkgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciB1c2VkIHdoZW4gYW4gZXJyb3IgKGV4Y2VwdGlvbikgaGFzCisgICBiZWVuIGRldGVjdGVkLCBhbmQgdGhlIGFjdHVhbCBwYXJzaW5nIGNhbiBiZSB0ZXJtaW5hdGVkIGVhcmx5LgorICAgVGhpcyBpcyBuZWVkZWQgc2luY2UgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciBjYW4ndCBiZSBzYWZlbHkgcmVtb3ZlZAorICAgZnJvbSB3aXRoaW4gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIsIGJ1dCBjYW4gYmUgcmVwbGFjZWQuICBJdCBpcworICAgdXNlZCBvbmx5IGZyb20gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgdHJhbXBvbGluZSwgYW5kIG11c3QgYmUKKyAgIHVzZWQgcmlnaHQgYWZ0ZXIgYGZsYWdfZXJyb3IoKWAgaXMgY2FsbGVkLiAqLworc3RhdGljIHZvaWQKK25vb3BfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKmRhdGEsIGludCBsZW4pIAoreworICAgIC8qIERvIG5vdGhpbmcuICovCit9CisKIHN0YXRpYyB2b2lkCiBmbGFnX2Vycm9yKHhtbHBhcnNlb2JqZWN0ICpzZWxmKQogewpAQCAtNDU3LDYgKzQ2OSw4IEBACiAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgICAgIGZsYWdfZXJyb3Ioc2VsZik7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLT5pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub29wX2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgdGVtcCk7CkBAIC00NjksNiArNDgzLDggQEAKICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICBmbGFnX2Vycm9yKHNlbGYpOworICAgICAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoc2VsZi0+aXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9vcF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQeV9ERUNSRUYodGVtcCk7CkBAIC0xNTQyLDggKzE1NTgsMjIgQEAKICAgICAgICAgeG1saGFuZGxlciBjX2hhbmRsZXIgPSBOVUxMOwogICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dOwogCi0gICAgICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIsIGFuZCBhIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgZGF0YSBoYW5kbGVyIGlzIGFscmVhZHkgYWN0aXZlLCB3ZSBuZWVkIHRvIGJlIG1vcmUKKyAgICAgICAgICAgICAgIGNhcmVmdWwuICBXaGF0IHdlIGNhbiBzYWZlbHkgZG8gaXMgcmVwbGFjZSB0aGUgZXhpc3RpbmcKKyAgICAgICAgICAgICAgIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBhIG5vLW9wCisgICAgICAgICAgICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgcmVmdXNlIHRvIGNhbGwgUHl0aG9uLiAgVGhlIGRvd25zaWRlCisgICAgICAgICAgICAgICBpcyB0aGF0IHRoaXMgZG9lc24ndCBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgY2hhcmFjdGVyCisgICAgICAgICAgICAgICBkYXRhIGhhbmRsZXIgZnJvbSB0aGUgQyBsYXllciBpZiB0aGVyZSdzIGFueSBjYWxsYmFjaworICAgICAgICAgICAgICAgYWN0aXZlLCBzbyBFeHBhdCBkb2VzIGEgbGl0dGxlIG1vcmUgd29yayB0aGFuIGl0CisgICAgICAgICAgICAgICBvdGhlcndpc2Ugd291bGQsIGJ1dCB0aGF0J3MgcmVhbGx5IGFuIG9kZCBjYXNlLiAgQSBtb3JlCisgICAgICAgICAgICAgICBlbGFib3JhdGUgc3lzdGVtIG9mIGhhbmRsZXJzIGFuZCBzdGF0ZSBjb3VsZCByZW1vdmUgdGhlCisgICAgICAgICAgICAgICBDIGhhbmRsZXIgbW9yZSBlZmZlY3RpdmVseS4gKi8KKyAgICAgICAgICAgIGlmIChoYW5kbGVybnVtID09IENoYXJhY3RlckRhdGEgJiYgc2VsZi0+aW5fY2FsbGJhY2spCisgICAgICAgICAgICAgICAgY19oYW5kbGVyID0gbm9vcF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyOwogICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAodiAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9JTkNSRUYodik7CiAgICAgICAgICAgICBjX2hhbmRsZXIgPSBoYW5kbGVyX2luZm9baGFuZGxlcm51bV0uaGFuZGxlcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVhZGxpbmUuYyBiL01vZHVsZXMvcmVhZGxpbmUuYwppbmRleCA4ZmRhMjI4Li45MmYyZDFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3JlYWRsaW5lLmMKKysrIGIvTW9kdWxlcy9yZWFkbGluZS5jCkBAIC0yMCw2ICsyMCwxMiBAQAogI2luY2x1ZGUgPGxvY2FsZS5oPgogI2VuZGlmCiAKKyNpZmRlZiBTQVZFX0xPQ0FMRQorIyAgZGVmaW5lIFJFU1RPUkVfTE9DQUxFKHNsKSB7IHNldGxvY2FsZShMQ19DVFlQRSwgc2wpOyBmcmVlKHNsKTsgfQorI2Vsc2UKKyMgIGRlZmluZSBSRVNUT1JFX0xPQ0FMRShzbCkgCisjZW5kaWYKKwogLyogR05VIHJlYWRsaW5lIGRlZmluaXRpb25zICovCiAjdW5kZWYgSEFWRV9DT05GSUdfSCAvKiBFbHNlIHJlYWRsaW5lL2NoYXJkZWZzLmggaW5jbHVkZXMgc3RyaW5ncy5oICovCiAjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KQEAgLTcyMywxMCArNzI5LDcgQEAKIAkgKi8KIAlybF9pbml0aWFsaXplKCk7CiAKLSNpZmRlZiBTQVZFX0xPQ0FMRQotCXNldGxvY2FsZShMQ19DVFlQRSwgc2F2ZWRfbG9jYWxlKTsgLyogUmVzdG9yZSBsb2NhbGUgKi8KLQlmcmVlKHNhdmVkX2xvY2FsZSk7Ci0jZW5kaWYKKwlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCiB9CiAKIC8qIFdyYXBwZXIgYXJvdW5kIEdOVSByZWFkbGluZSB0aGF0IGhhbmRsZXMgc2lnbmFscyBkaWZmZXJlbnRseS4gKi8KQEAgLTg2NCw3ICs4NjcsOCBAQAogCXAgPSByZWFkbGluZV91bnRpbF9lbnRlcl9vcl9zaWduYWwocHJvbXB0LCAmc2lnbmFsKTsKIAkKIAkvKiB3ZSBnb3QgYW4gaW50ZXJydXB0IHNpZ25hbCAqLwotCWlmKHNpZ25hbCkgeworCWlmIChzaWduYWwpIHsKKwkJUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTg3Myw2ICs4NzcsNyBAQAogCQlwID0gUHlNZW1fTWFsbG9jKDEpOwogCQlpZiAocCAhPSBOVUxMKQogCQkJKnAgPSAnXDAnOworCQlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCiAJCXJldHVybiBwOwogCX0KIApAQCAtOTA1LDEwICs5MTAsNyBAQAogCQlwW24rMV0gPSAnXDAnOwogCX0KIAlmcmVlKHEpOwotI2lmZGVmIFNBVkVfTE9DQUxFCi0Jc2V0bG9jYWxlKExDX0NUWVBFLCBzYXZlZF9sb2NhbGUpOyAvKiBSZXN0b3JlIGxvY2FsZSAqLwotCWZyZWUoc2F2ZWRfbG9jYWxlKTsKLSNlbmRpZgorCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKIAlyZXR1cm4gcDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggZGZhNGU4NS4uOWVhYWU4NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC0zNiw3ICszNiw3IEBACiBleHRlcm4gdm9pZCBiemVybyh2b2lkICosIGludCk7CiAjZW5kaWYKIAotI2lmbmRlZiBET05UX0hBVkVfU1lTX1RZUEVTX0gKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjZW5kaWYKIApAQCAtNDYsMTQgKzQ2LDE0IEBACiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKLSNpbmNsdWRlIDx3aW5zb2NrLmg+CisjICBpbmNsdWRlIDx3aW5zb2NrLmg+CiAjZWxzZQotI2lmZGVmIF9fQkVPU19fCi0jaW5jbHVkZSA8bmV0L3NvY2tldC5oPgotI2RlZmluZSBTT0NLRVQgaW50Ci0jZWxzZQotI2RlZmluZSBTT0NLRVQgaW50Ci0jZW5kaWYKKyMgIGRlZmluZSBTT0NLRVQgaW50CisjICBpZmRlZiBfX0JFT1NfXworIyAgICBpbmNsdWRlIDxuZXQvc29ja2V0Lmg+CisjICBlbGlmIGRlZmluZWQoX19WTVMpCisjICAgIGluY2x1ZGUgPHNvY2tldC5oPgorIyAgZW5kaWYKICNlbmRpZgogCiAKQEAgLTY2OCw3ICs2NjgsNyBAQAogdGhhdCBhcmUgcmVhZHkuXG5cCiBcblwKICoqKiBJTVBPUlRBTlQgTk9USUNFICoqKlxuXAotT24gV2luZG93cywgb25seSBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQ7IG9uIFVuaXgsIGFsbCBmaWxlIGRlc2NyaXB0b3JzLiIpOworT24gV2luZG93cyBhbmQgT3BlblZNUywgb25seSBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQ7IG9uIFVuaXgsIGFsbCBmaWxlIGRlc2NyaXB0b3JzLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VsZWN0X21ldGhvZHNbXSA9IHsKICAgICB7InNlbGVjdCIsCXNlbGVjdF9zZWxlY3QsIE1FVEhfVkFSQVJHUywgc2VsZWN0X2RvY30sCkBAIC02ODIsNyArNjgyLDcgQEAKICJUaGlzIG1vZHVsZSBzdXBwb3J0cyBhc3luY2hyb25vdXMgSS9PIG9uIG11bHRpcGxlIGZpbGUgZGVzY3JpcHRvcnMuXG5cCiBcblwKICoqKiBJTVBPUlRBTlQgTk9USUNFICoqKlxuXAotT24gV2luZG93cywgb25seSBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQ7IG9uIFVuaXgsIGFsbCBmaWxlIGRlc2NyaXB0b3JzLiIpOworT24gV2luZG93cyBhbmQgT3BlblZNUywgb25seSBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQ7IG9uIFVuaXgsIGFsbCBmaWxlIGRlc2NyaXB0b3JzLiIpOwogCiBQeU1PRElOSVRfRlVOQwogaW5pdHNlbGVjdCh2b2lkKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggMjYyYWJlOC4uYmI5OWJkZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC0xNjEsNyArMTYxLDggQEAKICAgICh0aGlzIGluY2x1ZGVzIHRoZSBnZXRhZGRyaW5mbyBlbXVsYXRpb24pIHByb3RlY3QgYWNjZXNzIHdpdGggYSBsb2NrLiAqLwogI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmIChkZWZpbmVkKF9fQVBQTEVfXykgfHwgXAogICAgIChkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiswIDwgNTAzMDAwKSB8fCBcCi0gICAgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCAhZGVmaW5lZChIQVZFX0dFVEFERFJJTkZPKSkKKyAgICBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fVk1TKSB8fCAhZGVmaW5lZChIQVZFX0dFVEFERFJJTkZPKSkKICNkZWZpbmUgVVNFX0dFVEFERFJJTkZPX0xPQ0sKICNlbmRpZgogCkBAIC0xODYsMTUgKzE4Nyw4IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX19WTVMpCi0jaWYgISBkZWZpbmVkKF9TT0NLQUREUl9MRU4pCi0jICAgaWZkZWYgZ2V0YWRkcmluZm8KLSMgICAgICB1bmRlZiBnZXRhZGRyaW5mbwotIyAgIGVuZGlmCi0jICBpbmNsdWRlICJUQ1BJUF9JT0NUTF9ST1VUSU5FIgotI2Vsc2UKICMgIGluY2x1ZGUgPGlvY3RsLmg+CiAjZW5kaWYKLSNlbmRpZgogCiAjaWYgZGVmaW5lZChQWU9TX09TMikKICMgZGVmaW5lICBJTkNMX0RPUwpAQCAtMjM0LDcgKzIyOCw5IEBACiAjZW5kaWYKIAogLyogR2VuZXJpYyBpbmNsdWRlcyAqLworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgogCiAvKiBHZW5lcmljIHNvY2tldCBvYmplY3QgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGVzICovCiAjZGVmaW5lIFB5U29ja2V0X0JVSUxESU5HX1NPQ0tFVApAQCAtMjcwLDcgKzI2Niw5IEBACiAjZWxzZQogCiAvKiBNU19XSU5ET1dTIGluY2x1ZGVzICovCi0jIGluY2x1ZGUgPGZjbnRsLmg+CisjIGlmZGVmIEhBVkVfRkNOVExfSAorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKIAogI2VuZGlmCiAKQEAgLTI5MCw3ICsyODgsNyBAQAogICAgKiBfU1NfQUxJR05TSVpFIGlzIGRlZmluZWQgaW4gc3lzL3NvY2tldC5oIGJ5IDYuNS4yMSwKICAgICogZm9yIGV4YW1wbGUsIGJ1dCBub3QgYnkgNi41LjEwLgogICAgKi8KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPjEyMDAKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPjEyMDEKICAgLyogRG8gbm90IGluY2x1ZGUgYWRkcmluZm8uaCBmb3IgTVNWQzcgb3IgZ3JlYXRlci4gJ2FkZHJpbmZvJyBhbmQKICAgICogRUFJXyogY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluICh0aGUgYWxyZWFkeSBpbmNsdWRlZCkgd3MydGNwaXAuaC4KICAgICovCkBAIC0zNTksMTEgKzM1Nyw2IEBACiAjZGVmaW5lIFNPQ0tFVENMT1NFIGNsb3NlCiAjZW5kaWYKIAotI2lmZGVmIF9fVk1TCi0vKiBUQ1AvSVAgU2VydmljZXMgZm9yIFZNUyB1c2VzIGEgbWF4aW11bSBzZW5kL3JldmMgYnVmZmVyIGxlbmd0aCBvZiA2NTUzNSAqLwotI2RlZmluZSBTRUdNRU5UX1NJWkUgNjU1MzUKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChIQVZFX0JMVUVUT09USF9IKSB8fCBkZWZpbmVkKEhBVkVfQkxVRVRPT1RIX0JMVUVUT09USF9IKQogI2RlZmluZSBVU0VfQkxVRVRPT1RIIDEKICNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQpAQCAtMzc0LDYgKzM2NywxNCBAQAogI2RlZmluZSBfQlRfU09DS0FERFJfTUVNQihzLCBwcm90bykgJigocyktPnNvY2tfYWRkcikKICNkZWZpbmUgX0JUX0wyX01FTUIoc2EsIG1lbWIpICgoc2EpLT5sMmNhcF8jI21lbWIpCiAjZGVmaW5lIF9CVF9SQ19NRU1CKHNhLCBtZW1iKSAoKHNhKS0+cmZjb21tXyMjbWVtYikKKyNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKKyNkZWZpbmUgc29ja2FkZHJfbDIgc29ja2FkZHJfYnQKKyNkZWZpbmUgc29ja2FkZHJfcmMgc29ja2FkZHJfYnQKKyNkZWZpbmUgc29ja2FkZHJfc2NvIHNvY2thZGRyX2J0CisjZGVmaW5lIF9CVF9TT0NLQUREUl9NRU1CKHMsIHByb3RvKSAmKChzKS0+c29ja19hZGRyKQorI2RlZmluZSBfQlRfTDJfTUVNQihzYSwgbWVtYikgKChzYSktPmJ0XyMjbWVtYikKKyNkZWZpbmUgX0JUX1JDX01FTUIoc2EsIG1lbWIpICgoc2EpLT5idF8jI21lbWIpCisjZGVmaW5lIF9CVF9TQ09fTUVNQihzYSwgbWVtYikgKChzYSktPmJ0XyMjbWVtYikKICNlbHNlCiAjZGVmaW5lIF9CVF9TT0NLQUREUl9NRU1CKHMsIHByb3RvKSAoJigocyktPnNvY2tfYWRkcikuYnRfIyNwcm90bykKICNkZWZpbmUgX0JUX0wyX01FTUIoc2EsIG1lbWIpICgoc2EpLT5sMl8jI21lbWIpCkBAIC0zODIsNiArMzgzLDExIEBACiAjZW5kaWYKICNlbmRpZgogCisjaWZkZWYgX19WTVMKKy8qIFRDUC9JUCBTZXJ2aWNlcyBmb3IgVk1TIHVzZXMgYSBtYXhpbXVtIHNlbmQvcmVjdiBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFNFR01FTlRfU0laRSAoMzIgKiAxMDI0IC0xKQorI2VuZGlmCisKIC8qCiAgKiBDb25zdGFudHMgZm9yIGdldG5hbWVpbmZvKCkKICAqLwpAQCAtNDEzLDE0ICs0MTksMjQgQEAKICAgIHRoZXJlIGhhcyB0byBiZSBhIGNpcmN1bGFyIHJlZmVyZW5jZS4gKi8KIHN0YXRpYyBQeVR5cGVPYmplY3Qgc29ja190eXBlOwogCi0vKiBDYW4gd2UgY2FsbCBzZWxlY3QoKSB3aXRoIHRoaXMgc29ja2V0IHdpdGhvdXQgYSBidWZmZXIgb3ZlcnJ1bj8gKi8KKyNpZiBkZWZpbmVkKEhBVkVfUE9MTF9IKQorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKwogI2lmZGVmIFB5X1NPQ0tFVF9GRF9DQU5fQkVfR0VfRkRfU0VUU0laRQogLyogUGxhdGZvcm0gY2FuIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3JzIGJleW9uZCBGRF9TRVRTSVpFICovCiAjZGVmaW5lIElTX1NFTEVDVEFCTEUocykgMQorI2VsaWYgZGVmaW5lZChIQVZFX1BPTEwpCisvKiBJbnN0ZWFkIG9mIHNlbGVjdCgpLCB3ZSdsbCB1c2UgcG9sbCgpIHNpbmNlIHBvbGwoKSB3b3JrcyBvbiBhbnkgZmQuICovCisjZGVmaW5lIElTX1NFTEVDVEFCTEUocykgMQorLyogQ2FuIHdlIGNhbGwgc2VsZWN0KCkgd2l0aCB0aGlzIHNvY2tldCB3aXRob3V0IGEgYnVmZmVyIG92ZXJydW4/ICovCiAjZWxzZQogLyogUE9TSVggc2F5cyBzZWxlY3RpbmcgZmlsZSBkZXNjcmlwdG9ycyBiZXlvbmQgRkRfU0VUU0laRQotICAgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIuICovCi0jZGVmaW5lIElTX1NFTEVDVEFCTEUocykgKChzKS0+c29ja19mZCA8IEZEX1NFVFNJWkUpCisgICBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ci4gIElmIHRoZXJlJ3Mgbm8gdGltZW91dCBsZWZ0LCB3ZSBkb24ndCBoYXZlIHRvCisgICBjYWxsIHNlbGVjdCwgc28gaXQncyBhIHNhZmUsIGxpdHRsZSB3aGl0ZSBsaWUuICovCisjZGVmaW5lIElTX1NFTEVDVEFCTEUocykgKChzKS0+c29ja19mZCA8IEZEX1NFVFNJWkUgfHwgcy0+c29ja190aW1lb3V0IDw9IDAuMCkKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QqCkBAIC02MTYsNiArNjMyLDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKyNpZmRlZiBfX1ZNUworLyogRnVuY3Rpb24gdG8gc2VuZCBpbiBzZWdtZW50cyAqLworc3RhdGljIGludAorc2VuZHNlZ21lbnRlZChpbnQgc29ja19mZCwgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IG4gPSAwOworCWludCByZW1haW5pbmcgPSBsZW47CisKKwl3aGlsZSAocmVtYWluaW5nID4gMCkgeworCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKKworCQlzZWdtZW50ID0gKHJlbWFpbmluZyA+PSBTRUdNRU5UX1NJWkUgPyBTRUdNRU5UX1NJWkUgOiByZW1haW5pbmcpOworCQluID0gc2VuZChzb2NrX2ZkLCBidWYsIHNlZ21lbnQsIGZsYWdzKTsKKwkJaWYgKG4gPCAwKSB7CisJCQlyZXR1cm4gbjsKKwkJfQorCQlyZW1haW5pbmcgLT0gc2VnbWVudDsKKwkJYnVmICs9IHNlZ21lbnQ7CisJfSAvKiBlbmQgd2hpbGUgKi8KKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKwogLyogRnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgc2V0dGluZyBvZiBzb2NrZXQgYmxvY2tpbmcgbW9kZQogICAgaW50ZXJuYWxseS4gYmxvY2sgPSAoMSB8IDApLiAqLwogc3RhdGljIGludApAQCAtNjQwLDggKzY4MCw4IEBACiAJaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKGNhZGRyX3QpJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKICNlbGlmIGRlZmluZWQoX19WTVMpCiAJYmxvY2sgPSAhYmxvY2s7Ci0JaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKGNoYXIgKikmYmxvY2spOwotI2Vsc2UgIC8qICFQWU9TX09TMiAmJiAhX1ZNUyAqLworCWlvY3RsKHMtPnNvY2tfZmQsIEZJT05CSU8sICh1bnNpZ25lZCBpbnQgKikmYmxvY2spOworI2Vsc2UgIC8qICFQWU9TX09TMiAmJiAhX19WTVMgKi8KIAlkZWxheV9mbGFnID0gZmNudGwocy0+c29ja19mZCwgRl9HRVRGTCwgMCk7CiAJaWYgKGJsb2NrKQogCQlkZWxheV9mbGFnICY9ICh+T19OT05CTE9DSyk7CkBAIC02NjQsMTYgKzcwNCwxNCBAQAogCXJldHVybiAxOwogfQogCi0vKiBEbyBhIHNlbGVjdCgpIG9uIHRoZSBzb2NrZXQsIGlmIG5lY2Vzc2FyeSAoc29ja190aW1lb3V0ID4gMCkuCisvKiBEbyBhIHNlbGVjdCgpL3BvbGwoKSBvbiB0aGUgc29ja2V0LCBpZiBuZWNlc3NhcnkgKHNvY2tfdGltZW91dCA+IDApLgogICAgVGhlIGFyZ3VtZW50IHdyaXRpbmcgaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24uCiAgICBUaGlzIGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbjsgd2UnbGwgbGV0IG91ciBjYWxsZXIgZG8gdGhhdAogICAgYWZ0ZXIgdGhleSd2ZSByZWFjcXVpcmVkIHRoZSBpbnRlcnByZXRlciBsb2NrLgotICAgUmV0dXJucyAxIG9uIHRpbWVvdXQsIDAgb3RoZXJ3aXNlLiAqLworICAgUmV0dXJucyAxIG9uIHRpbWVvdXQsIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4gKi8KIHN0YXRpYyBpbnQKIGludGVybmFsX3NlbGVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIGludCB3cml0aW5nKQogewotCWZkX3NldCBmZHM7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CiAJaW50IG47CiAKIAkvKiBOb3RoaW5nIHRvIGRvIHVubGVzcyB3ZSdyZSBpbiB0aW1lb3V0IG1vZGUgKG5vdCBub24tYmxvY2tpbmcpICovCkBAIC02ODQsMTcgKzcyMiw0MCBAQAogCWlmIChzLT5zb2NrX2ZkIDwgMCkKIAkJcmV0dXJuIDA7CiAKLQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyB0byBzZWxlY3QgKi8KLQl0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKLQl0di50dl91c2VjID0gKGludCkoKHMtPnNvY2tfdGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYpOwotCUZEX1pFUk8oJmZkcyk7Ci0JRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOworCS8qIFByZWZlciBwb2xsLCBpZiBhdmFpbGFibGUsIHNpbmNlIHlvdSBjYW4gcG9sbCgpIGFueSBmZAorCSAqIHdoaWNoIGNhbid0IGJlIGRvbmUgd2l0aCBzZWxlY3QoKS4gKi8KKyNpZmRlZiBIQVZFX1BPTEwKKwl7CisJCXN0cnVjdCBwb2xsZmQgcG9sbGZkOworCQlpbnQgdGltZW91dDsKIAotCS8qIFNlZSBpZiB0aGUgc29ja2V0IGlzIHJlYWR5ICovCi0JaWYgKHdyaXRpbmcpCi0JCW4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCBOVUxMLCAmZmRzLCBOVUxMLCAmdHYpOwotCWVsc2UKLQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJCXBvbGxmZC5mZCA9IHMtPnNvY2tfZmQ7CisJCXBvbGxmZC5ldmVudHMgPSB3cml0aW5nID8gUE9MTE9VVCA6IFBPTExJTjsKKworCQkvKiBzLT5zb2NrX3RpbWVvdXQgaXMgaW4gc2Vjb25kcywgdGltZW91dCBpbiBtcyAqLworCQl0aW1lb3V0ID0gKGludCkocy0+c29ja190aW1lb3V0ICogMTAwMCArIDAuNSk7IAorCQluID0gcG9sbCgmcG9sbGZkLCAxLCB0aW1lb3V0KTsKKwl9CisjZWxzZQorCXsKKwkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCisJCWZkX3NldCBmZHM7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQl0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKKwkJdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKKwkJRkRfWkVSTygmZmRzKTsKKwkJRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOworCisJCS8qIFNlZSBpZiB0aGUgc29ja2V0IGlzIHJlYWR5ICovCisJCWlmICh3cml0aW5nKQorCQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsIE5VTEwsICZ0dik7CisJCWVsc2UKKwkJCW4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworCX0KKyNlbmRpZgorCQorCWlmIChuIDwgMCkKKwkJcmV0dXJuIC0xOwogCWlmIChuID09IDApCiAJCXJldHVybiAxOwogCXJldHVybiAwOwpAQCAtMTQ5NCw3ICsxNTU1LDcgQEAKIAkJCSAgICAgICAmYWRkcmxlbik7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTcyMSw2ICsxNzgyLDggQEAKIAkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWcpOwogCX0KICNpZmRlZiBfX1ZNUworCS8qIHNvY2tsZW5fdCBpcyB1bnNpZ25lZCBzbyBubyBuZWdhdGl2ZSB0ZXN0IGlzIG5lZWRlZCwKKwkgICB0ZXN0IGJ1ZmxlbiA9PSAwIGlzIHByZXZpb3VzbHkgZG9uZSAqLwogCWlmIChidWZsZW4gPiAxMDI0KSB7CiAjZWxzZQogCWlmIChidWZsZW4gPD0gMCB8fCBidWZsZW4gPiAxMDI0KSB7CkBAIC0xODYzLDkgKzE5MjYsMTUgQEAKIAlpZiAocy0+c29ja190aW1lb3V0ID4gMC4wKSB7CiAJCWlmIChyZXMgPCAwICYmIGVycm5vID09IEVJTlBST0dSRVNTICYmIElTX1NFTEVDVEFCTEUocykpIHsKIAkJCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7Ci0JCQlyZXMgPSBjb25uZWN0KHMtPnNvY2tfZmQsIGFkZHIsIGFkZHJsZW4pOwotCQkJaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlTQ09OTikKLQkJCQlyZXMgPSAwOworCQkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJCXJlcyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7CisJCQkJaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlTQ09OTikKKwkJCQkJcmVzID0gMDsKKwkJCX0KKwkJCWVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpCisJCQkJcmVzID0gZXJybm87CQkvKiBoYWQgZXJyb3IgKi8KKwkJCWVsc2UKKwkJCQlyZXMgPSBFV09VTERCTE9DSzsJLyogdGltZWQgb3V0ICovCiAJCX0KIAl9CiAKQEAgLTE4OTUsNyArMTk2NCw3IEBACiAJcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBhZGRyLCBhZGRybGVuLCAmdGltZW91dCk7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTkyOSw2ICsxOTk4LDEzIEBACiAJcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBhZGRyLCBhZGRybGVuLCAmdGltZW91dCk7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAorCS8qIFNpZ25hbHMgYXJlIG5vdCBlcnJvcnMgKHRob3VnaCB0aGV5IG1heSByYWlzZSBleGNlcHRpb25zKS4gIEFkYXB0ZWQKKwkgICBmcm9tIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgpLiAqLworI2lmZGVmIEVJTlRSCisJaWYgKHJlcyA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKKwkJcmV0dXJuIE5VTEw7CisjZW5kaWYKKwogCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzKTsKIH0KIApAQCAtMjE0OSwxMCArMjIyNSwxMCBAQAogc3RhdGljIHNzaXplX3QKIHNvY2tfcmVjdl9ndXRzKFB5U29ja2V0U29ja09iamVjdCAqcywgY2hhciogY2J1ZiwgaW50IGxlbiwgaW50IGZsYWdzKQogewotICAgICAgICBzc2l6ZV90IG91dGxlbiA9IDA7CisgICAgICAgIHNzaXplX3Qgb3V0bGVuID0gLTE7CiAgICAgICAgIGludCB0aW1lb3V0OwogI2lmZGVmIF9fVk1TCi0JaW50IHJlbWFpbmluZywgbnJlYWQ7CisJaW50IHJlbWFpbmluZzsKIAljaGFyICpyZWFkX2J1ZjsKICNlbmRpZgogCkBAIC0yMTY4LDcgKzIyNDQsNyBAQAogCQlvdXRsZW4gPSByZWN2KHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MpOwogCVB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAodGltZW91dCkgeworCWlmICh0aW1lb3V0ID09IDEpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMTgzLDYgKzIyNTksNyBAQAogCXJlbWFpbmluZyA9IGxlbjsKIAl3aGlsZSAocmVtYWluaW5nICE9IDApIHsKIAkJdW5zaWduZWQgaW50IHNlZ21lbnQ7CisJCWludCBucmVhZCA9IC0xOwogCiAJCXNlZ21lbnQgPSByZW1haW5pbmcgL1NFR01FTlRfU0laRTsKIAkJaWYgKHNlZ21lbnQgIT0gMCkgewpAQCAtMjE5OCw3ICsyMjc1LDcgQEAKIAkJCW5yZWFkID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOwogCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCWlmICh0aW1lb3V0KSB7CisJCWlmICh0aW1lb3V0ID09IDEpIHsKIAkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0yMjQ3LDcgKzIzMjQsNyBAQAogCS8qIENhbGwgdGhlIGd1dHMgKi8KIAlvdXRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgcmVjdmxlbiwgZmxhZ3MpOwogCWlmIChvdXRsZW4gPCAwKSB7Ci0JCS8qIEFuIGVycm9yIG9jY3VyZWQsIHJlbGVhc2UgdGhlIHN0cmluZyBhbmQgcmV0dXJuIGFuCisJCS8qIEFuIGVycm9yIG9jY3VycmVkLCByZWxlYXNlIHRoZSBzdHJpbmcgYW5kIHJldHVybiBhbgogCQkgICBlcnJvci4gKi8KIAkJUHlfREVDUkVGKGJ1Zik7CiAJCXJldHVybiBOVUxMOwpAQCAtMjM0Niw3ICsyNDIzLDcgQEAKIHsKIAlzb2NrX2FkZHJfdCBhZGRyYnVmOwogCWludCB0aW1lb3V0OwotCXNzaXplX3QgbiA9IDA7CisJc3NpemVfdCBuID0gLTE7CiAJc29ja2xlbl90IGFkZHJsZW47CiAKIAkqYWRkciA9IE5VTEw7CkBAIC0yMzc4LDcgKzI0NTUsNyBAQAogCX0KIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQpIHsKKwlpZiAodGltZW91dCA9PSAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjQ5MywxMCArMjU3MCw3IEBACiBzb2NrX3NlbmQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKIAljaGFyICpidWY7Ci0JaW50IGxlbiwgbiA9IDAsIGZsYWdzID0gMCwgdGltZW91dDsKLSNpZmRlZiBfX1ZNUwotCWludCBzZW5kX2xlbmd0aDsKLSNlbmRpZgorCWludCBsZW4sIG4gPSAtMSwgZmxhZ3MgPSAwLCB0aW1lb3V0OwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOnNlbmQiLCAmYnVmLCAmbGVuLCAmZmxhZ3MpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTI1MDQsNDkgKzI1NzgsMjIgQEAKIAlpZiAoIUlTX1NFTEVDVEFCTEUocykpCiAJCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKIAotI2lmbmRlZiBfX1ZNUwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOwogCWlmICghdGltZW91dCkKKyNpZmRlZiBfX1ZNUworCQluID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworI2Vsc2UKIAkJbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyNlbmRpZgogCVB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAodGltZW91dCkgeworCWlmICh0aW1lb3V0ID09IDEpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAobiA8IDApCiAJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLSNlbHNlCi0JLyogRGl2aWRlIHBhY2tldCBpbnRvIHNtYWxsZXIgc2VnbWVudHMgZm9yCSovCi0JLyogIFRDUC9JUCBTZXJ2aWNlcyBmb3IgT3BlblZNUwkJCSovCi0Jc2VuZF9sZW5ndGggPSBsZW47Ci0Jd2hpbGUgKHNlbmRfbGVuZ3RoICE9IDApIHsKLQkJdW5zaWduZWQgaW50IHNlZ21lbnQ7Ci0KLQkJc2VnbWVudCA9IHNlbmRfbGVuZ3RoIC8gU0VHTUVOVF9TSVpFOwotCQlpZiAoc2VnbWVudCAhPSAwKSB7Ci0JCQlzZWdtZW50ID0gU0VHTUVOVF9TSVpFOwotCQl9Ci0JCWVsc2UgewotCQkJc2VnbWVudCA9IHNlbmRfbGVuZ3RoOwotCQl9Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQkJaWYgKCF0aW1lb3V0KQotCQkJbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBzZWdtZW50LCBmbGFncyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmICh0aW1lb3V0KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChuIDwgMCkgewotCQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCQl9Ci0JCXNlbmRfbGVuZ3RoIC09IHNlZ21lbnQ7Ci0JCWJ1ZiArPSBzZWdtZW50OwotCX0gLyogZW5kIHdoaWxlICovCi0jZW5kaWYgLyogIV9fVk1TICovCiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOwogfQogCkBAIC0yNTY0LDcgKzI2MTEsNyBAQAogc29ja19zZW5kYWxsKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCiB7CiAJY2hhciAqYnVmOwotCWludCBsZW4sIG4gPSAwLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisJaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfGk6c2VuZGFsbCIsICZidWYsICZsZW4sICZmbGFncykpCiAJCXJldHVybiBOVUxMOwpAQCAtMjU3NSw5ICsyNjIyLDE0IEBACiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCWRvIHsKIAkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKwkJbiA9IC0xOwogCQlpZiAodGltZW91dCkKIAkJCWJyZWFrOworI2lmZGVmIF9fVk1TCisJCW4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisjZWxzZQogCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworI2VuZGlmCiAJCWlmIChuIDwgMCkKIAkJCWJyZWFrOwogCQlidWYgKz0gbjsKQEAgLTI1ODUsNyArMjYzNyw3IEBACiAJfSB3aGlsZSAobGVuID4gMCk7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjYxMyw3ICsyNjY1LDcgQEAKIAlQeU9iamVjdCAqYWRkcm87CiAJY2hhciAqYnVmOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsKLQlpbnQgYWRkcmxlbiwgbGVuLCBuID0gMCwgZmxhZ3MsIHRpbWVvdXQ7CisJaW50IGFkZHJsZW4sIGxlbiwgbiA9IC0xLCBmbGFncywgdGltZW91dDsKIAogCWZsYWdzID0gMDsKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjTzpzZW5kdG8iLCAmYnVmLCAmbGVuLCAmYWRkcm8pKSB7CkBAIC0yNjM1LDcgKzI2ODcsNyBAQAogCQluID0gc2VuZHRvKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncywgYWRkciwgYWRkcmxlbik7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwppbmRleCBiN2JmMjBlLi5kM2YzMDlhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwpAQCAtOTEsNyArOTEsNyBAQAogI3VuZGVmIFNFVEkKIAogCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X1hERUNSRUYodik7CisJCVB5X0RFQ1JFRih2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NyZS5oIGIvTW9kdWxlcy9zcmUuaAppbmRleCBiMDdkMjEwLi5kNGFmMDVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NyZS5oCisrKyBiL01vZHVsZXMvc3JlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X1ZBUl9IRUFECi0gICAgaW50IGdyb3VwczsgLyogbXVzdCBiZSBmaXJzdCEgKi8KKyAgICBQeV9zc2l6ZV90IGdyb3VwczsgLyogbXVzdCBiZSBmaXJzdCEgKi8KICAgICBQeU9iamVjdCogZ3JvdXBpbmRleDsKICAgICBQeU9iamVjdCogaW5kZXhncm91cDsKICAgICAvKiBjb21wYXRpYmlsaXR5ICovCkBAIC0zMSw3ICszMSw3IEBACiAgICAgaW50IGZsYWdzOyAvKiBmbGFncyB1c2VkIHdoZW4gY29tcGlsaW5nIHBhdHRlcm4gc291cmNlICovCiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogICAgIC8qIHBhdHRlcm4gY29kZSAqLwotICAgIGludCBjb2Rlc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGNvZGVzaXplOwogICAgIFNSRV9DT0RFIGNvZGVbMV07CiB9IFBhdHRlcm5PYmplY3Q7CiAKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgIFB5T2JqZWN0KiBzdHJpbmc7IC8qIGxpbmsgdG8gdGhlIHRhcmdldCBzdHJpbmcgKG11c3QgYmUgZmlyc3QpICovCiAgICAgUHlPYmplY3QqIHJlZ3M7IC8qIGNhY2hlZCBsaXN0IG9mIG1hdGNoaW5nIHNwYW5zICovCiAgICAgUGF0dGVybk9iamVjdCogcGF0dGVybjsgLyogbGluayB0byB0aGUgcmVnZXggKHBhdHRlcm4pIG9iamVjdCAqLwotICAgIGludCBwb3MsIGVuZHBvczsgLyogY3VycmVudCB0YXJnZXQgc2xpY2UgKi8KLSAgICBpbnQgbGFzdGluZGV4OyAvKiBsYXN0IGluZGV4IG1hcmtlciBzZWVuIGJ5IHRoZSBlbmdpbmUgKC0xIGlmIG5vbmUpICovCi0gICAgaW50IGdyb3VwczsgLyogbnVtYmVyIG9mIGdyb3VwcyAoc3RhcnQvZW5kIG1hcmtzKSAqLwotICAgIGludCBtYXJrWzFdOworICAgIFB5X3NzaXplX3QgcG9zLCBlbmRwb3M7IC8qIGN1cnJlbnQgdGFyZ2V0IHNsaWNlICovCisgICAgUHlfc3NpemVfdCBsYXN0aW5kZXg7IC8qIGxhc3QgaW5kZXggbWFya2VyIHNlZW4gYnkgdGhlIGVuZ2luZSAoLTEgaWYgbm9uZSkgKi8KKyAgICBQeV9zc2l6ZV90IGdyb3VwczsgLyogbnVtYmVyIG9mIGdyb3VwcyAoc3RhcnQvZW5kIG1hcmtzKSAqLworICAgIFB5X3NzaXplX3QgbWFya1sxXTsKIH0gTWF0Y2hPYmplY3Q7CiAKIHR5cGVkZWYgdW5zaWduZWQgaW50ICgqU1JFX1RPTE9XRVJfSE9PSykodW5zaWduZWQgaW50IGNoKTsKQEAgLTU0LDcgKzU0LDcgQEAKICNkZWZpbmUgU1JFX01BUktfU0laRSAyMDAKIAogdHlwZWRlZiBzdHJ1Y3QgU1JFX1JFUEVBVF9UIHsKLSAgICBpbnQgY291bnQ7CisgICAgUHlfc3NpemVfdCBjb3VudDsKICAgICBTUkVfQ09ERSogcGF0dGVybjsgLyogcG9pbnRzIHRvIFJFUEVBVCBvcGVyYXRvciBhcmd1bWVudHMgKi8KICAgICB2b2lkKiBsYXN0X3B0cjsgLyogaGVscGVyIHRvIGNoZWNrIGZvciBpbmZpbml0ZSBsb29wcyAqLwogICAgIHN0cnVjdCBTUkVfUkVQRUFUX1QgKnByZXY7IC8qIHBvaW50cyB0byBwcmV2aW91cyByZXBlYXQgY29udGV4dCAqLwpAQCAtNjgsMTcgKzY4LDE3IEBACiAgICAgdm9pZCogZW5kOyAvKiBlbmQgb2Ygb3JpZ2luYWwgc3RyaW5nICovCiAgICAgLyogYXR0cmlidXRlcyBmb3IgdGhlIG1hdGNoIG9iamVjdCAqLwogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHBvcywgZW5kcG9zOworICAgIFB5X3NzaXplX3QgcG9zLCBlbmRwb3M7CiAgICAgLyogY2hhcmFjdGVyIHNpemUgKi8KICAgICBpbnQgY2hhcnNpemU7CiAgICAgLyogcmVnaXN0ZXJzICovCi0gICAgaW50IGxhc3RpbmRleDsKLSAgICBpbnQgbGFzdG1hcms7CisgICAgUHlfc3NpemVfdCBsYXN0aW5kZXg7CisgICAgUHlfc3NpemVfdCBsYXN0bWFyazsKICAgICB2b2lkKiBtYXJrW1NSRV9NQVJLX1NJWkVdOwogICAgIC8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHVmZiAqLwogICAgIGNoYXIqIGRhdGFfc3RhY2s7Ci0gICAgdW5zaWduZWQgaW50IGRhdGFfc3RhY2tfc2l6ZTsKLSAgICB1bnNpZ25lZCBpbnQgZGF0YV9zdGFja19iYXNlOworICAgIHNpemVfdCBkYXRhX3N0YWNrX3NpemU7CisgICAgc2l6ZV90IGRhdGFfc3RhY2tfYmFzZTsKICAgICAvKiBjdXJyZW50IHJlcGVhdCBjb250ZXh0ICovCiAgICAgU1JFX1JFUEVBVCAqcmVwZWF0OwogICAgIC8qIGhvb2tzICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwppbmRleCA2MTY5NjU4Li40NDhiMTFjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKQEAgLTU4Niw2ICs1ODYsNjAgQEAKIGJlIHJlbGllZCB1cG9uLCBhbmQgdGhlIG51bWJlciBzaG91bGQgYmUgc2VlbiBwdXJlbHkgYXMgYSBtYWdpYyBjb29raWUuXG5cCiBBIHRocmVhZCdzIGlkZW50aXR5IG1heSBiZSByZXVzZWQgZm9yIGFub3RoZXIgdGhyZWFkIGFmdGVyIGl0IGV4aXRzLiIpOwogCitzdGF0aWMgUHlPYmplY3QgKgordGhyZWFkX3N0YWNrX3NpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCXNpemVfdCBvbGRfc2l6ZTsKKwlQeV9zc2l6ZV90IG5ld19zaXplID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnN0YWNrX3NpemUiLCAmbmV3X3NpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuZXdfc2l6ZSA8IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkJInNpemUgbXVzdCBiZSAwIG9yIGEgcG9zaXRpdmUgdmFsdWUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJb2xkX3NpemUgPSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKCk7CisKKwlyYyA9IFB5VGhyZWFkX3NldF9zdGFja3NpemUoKHNpemVfdCkgbmV3X3NpemUpOworCWlmIChyYyA9PSAtMSkgeworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKwkJCSAgICAgInNpemUgbm90IHZhbGlkOiAlemQgYnl0ZXMiLAorCQkJICAgICBuZXdfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAocmMgPT0gLTIpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLAorCQkJCSJzZXR0aW5nIHN0YWNrIHNpemUgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoKFB5X3NzaXplX3QpIG9sZF9zaXplKTsKK30KKworUHlEb2NfU1RSVkFSKHN0YWNrX3NpemVfZG9jLAorInN0YWNrX3NpemUoW3NpemVdKSAtPiBzaXplXG5cCitcblwKK1JldHVybiB0aGUgdGhyZWFkIHN0YWNrIHNpemUgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB0aHJlYWRzLiAgVGhlXG5cCitvcHRpb25hbCBzaXplIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgc3RhY2sgc2l6ZSAoaW4gYnl0ZXMpIHRvIGJlIHVzZWRcblwKK2ZvciBzdWJzZXF1ZW50bHkgY3JlYXRlZCB0aHJlYWRzLCBhbmQgbXVzdCBiZSAwICh1c2UgcGxhdGZvcm0gb3JcblwKK2NvbmZpZ3VyZWQgZGVmYXVsdCkgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIG9mIGF0IGxlYXN0IDMyLDc2OCAoMzJrKS5cblwKK0lmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBUaHJlYWRFcnJvclxuXAorZXhjZXB0aW9uIGlzIHJhaXNlZC4gIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBpcyBpbnZhbGlkLCBhIFZhbHVlRXJyb3JcblwKK2V4Y2VwdGlvbiBpcyByYWlzZWQsIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrIGJ5dGVzXG5cCisgY3VycmVudGx5IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZVxuXAorc3VmZmljaWVudCBzdGFjayBzcGFjZSBmb3IgdGhlIGludGVycHJldGVyIGl0c2VsZi5cblwKK1xuXAorTm90ZSB0aGF0IHNvbWUgcGxhdGZvcm1zIG1heSBoYXZlIHBhcnRpY3VsYXIgcmVzdHJpY3Rpb25zIG9uIHZhbHVlcyBmb3JcblwKK3RoZSBzdGFjayBzaXplLCBzdWNoIGFzIHJlcXVpcmluZyBhIG1pbmltdW0gc3RhY2sgc2l6ZSBsYXJnZXIgdGhhbiAzMmtCIG9yXG5cCityZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbSBtZW1vcnkgcGFnZSBzaXplXG5cCistIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cCisoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvciB0aGUgc3RhY2sgc2l6ZSBpc1xuXAordGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uKS4iKTsKKwogc3RhdGljIFB5TWV0aG9kRGVmIHRocmVhZF9tZXRob2RzW10gPSB7CiAJeyJzdGFydF9uZXdfdGhyZWFkIiwJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkLAogCSAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKQEAgLTYwNSw2ICs2NTksOSBAQAogCSBNRVRIX05PQVJHUywgaW50ZXJydXB0X2RvY30sCiAJeyJnZXRfaWRlbnQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9nZXRfaWRlbnQsIAogCSBNRVRIX05PQVJHUywgZ2V0X2lkZW50X2RvY30sCisJeyJzdGFja19zaXplIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfc3RhY2tfc2l6ZSwKKwkJCQlNRVRIX1ZBUkFSR1MsCisJCQkJc3RhY2tfc2l6ZV9kb2N9LAogI2lmbmRlZiBOT19FWElUX1BST0cKIAl7ImV4aXRfcHJvZyIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfcHJvZywKIAkgTUVUSF9WQVJBUkdTfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGltZW1vZHVsZS5jIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKaW5kZXggODdlNTQzZi4uNDQ0YjczOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKQEAgLTE5LDcgKzE5LDkgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogSEFWRV9TWVNfVFlQRVNfSCAqLwogCiAjaWZkZWYgUVVJQ0tXSU4KICNpbmNsdWRlIDxpby5oPgpAQCAtNDA0LDEzICs0MDYsMzUgQEAKICAgICAgICAgICAgIGluZGV4aW5nIGJsaW5kbHkgaW50byBzb21lIGFycmF5IGZvciBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgIGJ5IHNvbWUgYmFkIGluZGV4IChmaXhlcyBidWcgIzg5NzYyNSkuCiAKLSAgICAgICAgICAgIE5vIGNoZWNrIGZvciB5ZWFyIHNpbmNlIGhhbmRsZWQgaW4gZ2V0dG1hcmcoKS4KKwkgICAgQWxzbyBzdXBwb3J0IHZhbHVlcyBvZiB6ZXJvIGZyb20gUHl0aG9uIGNvZGUgZm9yIGFyZ3VtZW50cyBpbiB3aGljaAorCSAgICB0aGF0IGlzIG91dCBvZiByYW5nZSBieSBmb3JjaW5nIHRoYXQgdmFsdWUgdG8gdGhlIGxvd2VzdCB2YWx1ZSB0aGF0CisJICAgIGlzIHZhbGlkIChmaXhlZCBidWcgIzE1MjA5MTQpLgorCisJICAgIFZhbGlkIHJhbmdlcyBiYXNlZCBvbiB3aGF0IGlzIGFsbG93ZWQgaW4gc3RydWN0IHRtOgorCisJICAgIC0gdG1feWVhcjogWzAsIG1heChpbnQpXSAoMSkKKwkgICAgLSB0bV9tb246IFswLCAxMV0gKDIpCisJICAgIC0gdG1fbWRheTogWzEsIDMxXQorCSAgICAtIHRtX2hvdXI6IFswLCAyM10KKwkgICAgLSB0bV9taW46IFswLCA1OV0KKwkgICAgLSB0bV9zZWM6IFswLCA2MF0KKwkgICAgLSB0bV93ZGF5OiBbMCwgNl0gKDEpCisJICAgIC0gdG1feWRheTogWzAsIDM2NV0gKDIpCisJICAgIC0gdG1faXNkc3Q6IFstbWF4KGludCksIG1heChpbnQpXQorCisJICAgICgxKSBnZXR0bWFyZygpIGhhbmRsZXMgYm91bmRzLWNoZWNraW5nLgorCSAgICAoMikgUHl0aG9uJ3MgYWNjZXB0YWJsZSByYW5nZSBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSByYW5nZSBpbiBDLAorCSAgICAgICAgdGh1cyBuZWVkIHRvIGNoZWNrIGFnYWluc3QgYXV0b21hdGljIGRlY3JlbWVudCBieSBnZXR0bWFyZygpLgogICAgICAgICAqLwotICAgICAgICBpZiAoYnVmLnRtX21vbiA8IDAgfHwgYnVmLnRtX21vbiA+IDExKSB7CisJaWYgKGJ1Zi50bV9tb24gPT0gLTEpCisJICAgIGJ1Zi50bV9tb24gPSAwOworCWVsc2UgaWYgKGJ1Zi50bV9tb24gPCAwIHx8IGJ1Zi50bV9tb24gPiAxMSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb250aCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWYudG1fbWRheSA8IDEgfHwgYnVmLnRtX21kYXkgPiAzMSkgeworCWlmIChidWYudG1fbWRheSA9PSAwKQorCSAgICBidWYudG1fbWRheSA9IDE7CisJZWxzZSBpZiAoYnVmLnRtX21kYXkgPCAwIHx8IGJ1Zi50bV9tZGF5ID4gMzEpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIG1vbnRoIG91dCBvZiByYW5nZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTQzMiw3ICs0NTYsOSBAQAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2Ygd2VlayBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWYudG1feWRheSA8IDAgfHwgYnVmLnRtX3lkYXkgPiAzNjUpIHsKKwlpZiAoYnVmLnRtX3lkYXkgPT0gLTEpCisJICAgIGJ1Zi50bV95ZGF5ID0gMDsKKwllbHNlIGlmIChidWYudG1feWRheSA8IDAgfHwgYnVmLnRtX3lkYXkgPiAzNjUpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIHllYXIgb3V0IG9mIHJhbmdlIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNDY1LDYgKzQ5MSwxNCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlmcmVlKG91dGJ1Zik7CisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIGRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykKKwkJLyogVmlzdWFsU3R1ZGlvIC5ORVQgMjAwNSBkb2VzIHRoaXMgcHJvcGVybHkgKi8KKwkJaWYgKGJ1ZmxlbiA9PSAwICYmIGVycm5vID09IEVJTlZBTCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGZvcm1hdCBzdHJpbmciKTsKKwkJCXJldHVybiAwOworCQl9CisjZW5kaWYKKwkJCiAJfQogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggMDY2MDM1My4uMWIwYmUyOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtMzk1LDYgKzM5NSw3IEBACiAgICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgIGNoYXIgZGVjb21wWzI1Nl07CiAgICAgaW50IGNvZGUsIGluZGV4LCBjb3VudCwgaTsKKyAgICB1bnNpZ25lZCBpbnQgcHJlZml4X2luZGV4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpkZWNvbXBvc2l0aW9uIiwKIAkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCkBAIC00MjgsOSArNDI5LDE1IEBACiAgICAgLyogWFhYOiBjb3VsZCBhbGxvY2F0ZSB0aGUgUHlTdHJpbmcgdXAgZnJvbnQgaW5zdGVhZAogICAgICAgIChzdHJsZW4ocHJlZml4KSArIDUgKiBjb3VudCArIDEgYnl0ZXMpICovCiAKKyAgICAvKiBCYXNlZCBvbiBob3cgaW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSBhbmQgZGVjb21wX2RhdGEgaXMgZ2VuZXJhdGVkCisgICAgICAgZnJvbSBUb29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weSwgaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZQorICAgICAgIHRvIG92ZXJmbG93IGRlY29tcF9wcmVmaXguICovCisgICAgcHJlZml4X2luZGV4ID0gZGVjb21wX2RhdGFbaW5kZXhdICYgMjU1OworICAgIGFzc2VydChwcmVmaXhfaW5kZXggPCAoc2l6ZW9mKGRlY29tcF9wcmVmaXgpL3NpemVvZigqZGVjb21wX3ByZWZpeCkpKTsKKwogICAgIC8qIGNvcHkgcHJlZml4ICovCi0gICAgaSA9IHN0cmxlbihkZWNvbXBfcHJlZml4W2RlY29tcF9kYXRhW2luZGV4XSAmIDI1NV0pOwotICAgIG1lbWNweShkZWNvbXAsIGRlY29tcF9wcmVmaXhbZGVjb21wX2RhdGFbaW5kZXhdICYgMjU1XSwgaSk7CisgICAgaSA9IHN0cmxlbihkZWNvbXBfcHJlZml4W3ByZWZpeF9pbmRleF0pOworICAgIG1lbWNweShkZWNvbXAsIGRlY29tcF9wcmVmaXhbcHJlZml4X2luZGV4XSwgaSk7CiAKICAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgICAgICAgaWYgKGkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IDA2YjA2OTAuLmRhMzFlOGIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC02NTMsNiArNjUzLDcgQEAKICAgICByZXR1cm4gUmV0VmFsOwogfQogCisjaWZkZWYgSEFWRV9aTElCX0NPUFkKIFB5RG9jX1NUUlZBUihjb21wX2NvcHlfX2RvY19fLAogImNvcHkoKSAtLSBSZXR1cm4gYSBjb3B5IG9mIHRoZSBjb21wcmVzc2lvbiBvYmplY3QuIik7CiAKQEAgLTc1NCw2ICs3NTUsNyBAQAogICAgIFB5X1hERUNSRUYocmV0dmFsKTsKICAgICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgogCiBQeURvY19TVFJWQVIoZGVjb21wX2ZsdXNoX19kb2NfXywKICJmbHVzaCggW2xlbmd0aF0gKSAtLSBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbnkgcmVtYWluaW5nXG4iCkBAIC04MjcsOCArODI5LDEwIEBACiAgICAgICAgICAgICAgICAgIGNvbXBfY29tcHJlc3NfX2RvY19ffSwKICAgICB7ImZsdXNoIiwgKGJpbmFyeWZ1bmMpUHlabGliX2ZsdXNoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgIGNvbXBfZmx1c2hfX2RvY19ffSwKKyNpZmRlZiBIQVZFX1pMSUJfQ09QWQogICAgIHsiY29weSIsICAoUHlDRnVuY3Rpb24pUHlabGliX2NvcHksIE1FVEhfTk9BUkdTLAogICAgICAgICAgICAgICBjb21wX2NvcHlfX2RvY19ffSwKKyNlbmRpZgogICAgIHtOVUxMLCBOVUxMfQogfTsKIApAQCAtODM4LDggKzg0MiwxMCBAQAogICAgICAgICAgICAgICAgICAgIGRlY29tcF9kZWNvbXByZXNzX19kb2NfX30sCiAgICAgeyJmbHVzaCIsIChiaW5hcnlmdW5jKVB5WmxpYl91bmZsdXNoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgIGRlY29tcF9mbHVzaF9fZG9jX199LAorI2lmZGVmIEhBVkVfWkxJQl9DT1BZCiAgICAgeyJjb3B5IiwgIChQeUNGdW5jdGlvbilQeVpsaWJfdW5jb3B5LCBNRVRIX05PQVJHUywKICAgICAgICAgICAgICAgZGVjb21wX2NvcHlfX2RvY19ffSwKKyNlbmRpZgogICAgIHtOVUxMLCBOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IDkxYmE4YzIuLmRlODg0NTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTksOSArOSw5IEBACiAvKiBTaG9ydGhhbmRzIHRvIHJldHVybiBjZXJ0YWluIGVycm9ycyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotdHlwZV9lcnJvcihjb25zdCBjaGFyICptc2cpCit0eXBlX2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKm9iaikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2cpOworCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIG1zZywgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTI1LDEwICsxMjUsMTEgQEAKIAkJCXJldHVybiBQeVNlcXVlbmNlX0dldEl0ZW0obywga2V5X3ZhbHVlKTsKIAkJfQogCQllbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkKLQkJCXJldHVybiB0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKKwkJCXJldHVybiB0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0ICIKKwkJCQkJICAiYmUgaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKIAl9CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigidW5zdWJzY3JpcHRhYmxlIG9iamVjdCIpOworCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgdW5zdWJzY3JpcHRhYmxlIiwgbyk7CiB9CiAKIGludApAQCAtMTUzLDEyICsxNTQsMTMgQEAKIAkJCXJldHVybiBQeVNlcXVlbmNlX1NldEl0ZW0obywga2V5X3ZhbHVlLCB2YWx1ZSk7CiAJCX0KIAkJZWxzZSBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2Fzc19pdGVtKSB7Ci0JCQl0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKKwkJCXR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgorCQkJCSAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCi0JdHlwZV9lcnJvcigib2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iik7CisJdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgbyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xODQsMTIgKzE4NiwxMyBAQAogCQkJcmV0dXJuIFB5U2VxdWVuY2VfRGVsSXRlbShvLCBrZXlfdmFsdWUpOwogCQl9CiAJCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgewotCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7CisJCQl0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlICIKKwkJCQkgICAiaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KIAotCXR5cGVfZXJyb3IoIm9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKKwl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgbyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC00MDgsNyArNDExLDggQEAKIGJpbm9wX3R5cGVfZXJyb3IoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjb25zdCBjaGFyICpvcF9uYW1lKQogewogCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgJXM6ICclcycgYW5kICclcyciLAorCQkgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICUuMTAwczogIgorCQkgICAgICInJS4xMDBzJyBhbmQgJyUuMTAwcyciLAogCQkgICAgIG9wX25hbWUsCiAJCSAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKIAkJICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKQEAgLTUxNCwxNCArNTE4LDE0IEBACiAJCVB5RXJyX0Zvcm1hdCgKIAkJCVB5RXhjX1R5cGVFcnJvciwKIAkJCSJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAiCi0JCQkiJyVzJyBhbmQgJyVzJyIsCisJCQkiJyUuMTAwcycgYW5kICclLjEwMHMnIiwKIAkJCXYtPm9iX3R5cGUtPnRwX25hbWUsCiAJCQl3LT5vYl90eXBlLT50cF9uYW1lKTsKIAllbHNlCiAJCVB5RXJyX0Zvcm1hdCgKIAkJCVB5RXhjX1R5cGVFcnJvciwKIAkJCSJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHBvdygpOiAiCi0JCQkiJyVzJywgJyVzJywgJyVzJyIsCisJCQkiJyUuMTAwcycsICclLjEwMHMnLCAnJS4xMDBzJyIsCiAJCQl2LT5vYl90eXBlLT50cF9uYW1lLAogCQkJdy0+b2JfdHlwZS0+dHBfbmFtZSwKIAkJCXotPm9iX3R5cGUtPnRwX25hbWUpOwpAQCAtNTY4LDggKzU3Miw4IEBACiAJCQlyZXR1cm4gTlVMTDsKIAl9CiAJZWxzZSB7Ci0JCXJldHVybiB0eXBlX2Vycm9yKAotCQkJImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQiKTsKKwkJcmV0dXJuIHR5cGVfZXJyb3IoImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5ICIKKwkJCQkgICJub24taW50IG9mIHR5cGUgJyUuMjAwcyciLCBuKTsKIAl9CiAJcmV0dXJuICgqcmVwZWF0ZnVuYykoc2VxLCBjb3VudCk7CiB9CkBAIC03NzYsNyArNzgwLDcgQEAKIAlpZiAobSAmJiBtLT5uYl9uZWdhdGl2ZSkKIAkJcmV0dXJuICgqbS0+bmJfbmVnYXRpdmUpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC0iKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtNzkwLDcgKzc5NCw3IEBACiAJaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCiAJCXJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5ICs6ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTgwNCw3ICs4MDgsNyBAQAogCWlmIChtICYmIG0tPm5iX2ludmVydCkKIAkJcmV0dXJuICgqbS0+bmJfaW52ZXJ0KShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+Iik7CisJcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTgxOCw3ICs4MjIsNyBAQAogCWlmIChtICYmIG0tPm5iX2Fic29sdXRlKQogCQlyZXR1cm4gbS0+bmJfYWJzb2x1dGUobyk7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCkiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICclLjIwMHMnIiwgbyk7CiB9CiAKIC8qIEFkZCBhIGNoZWNrIGZvciBlbWJlZGRlZCBOVUxMLWJ5dGVzIGluIHRoZSBhcmd1bWVudC4gKi8KQEAgLTg5OCw3ICs5MDIsOCBAQAogCWlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKIAkJcmV0dXJuIGludF9mcm9tX3N0cmluZygoY2hhciopYnVmZmVyLCBidWZmZXJfbGVuKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCisJCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOwogfQogCiAvKiBBZGQgYSBjaGVjayBmb3IgZW1iZWRkZWQgTlVMTC1ieXRlcyBpbiB0aGUgYXJndW1lbnQuICovCkBAIC05NjAsNyArOTY1LDggQEAKIAlpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCiAJCXJldHVybiBsb25nX2Zyb21fc3RyaW5nKGJ1ZmZlciwgYnVmZmVyX2xlbik7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigibG9uZygpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigibG9uZygpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCisJCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMDE0LDcgKzEwMjAsNyBAQAogCWlmIChtICYmIG0tPnNxX2xlbmd0aCkKIAkJcmV0dXJuIG0tPnNxX2xlbmd0aChzKTsKIAotCXR5cGVfZXJyb3IoImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7CisJdHlwZV9lcnJvcigib2JqZWN0IG9mIHR5cGUgJyUuMjAwcycgaGFzIG5vIGxlbigpIiwgcyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMDQ3LDcgKzEwNTMsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJUHlfREVDUkVGKHJlc3VsdCk7CiAJfQotCXJldHVybiB0eXBlX2Vycm9yKCJvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWQiLCBzKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMTA3Niw3ICsxMDgyLDcgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJCVB5X0RFQ1JFRihyZXN1bHQpOwogCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigib2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMTAwLDcgKzExMDYsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJUHlfREVDUkVGKHJlc3VsdCk7CiAJfQotCXJldHVybiB0eXBlX2Vycm9yKCJvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWQiLCBzKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMTEyOSw3ICsxMTM1LDcgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJCVB5X0RFQ1JFRihyZXN1bHQpOwogCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigib2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMTUzLDcgKzExNTksNyBAQAogCQlyZXR1cm4gbS0+c3FfaXRlbShzLCBpKTsKIAl9CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigidW5pbmRleGFibGUgb2JqZWN0Iik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyB1bmluZGV4YWJsZSIsIHMpOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMTg4LDcgKzExOTQsNyBAQAogCQlyZXR1cm4gcmVzOwogCX0KIAotCXJldHVybiB0eXBlX2Vycm9yKCJ1bnNsaWNlYWJsZSBvYmplY3QiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuc2xpY2VhYmxlIiwgcyk7CiB9CiAKIGludApAQCAtMTIxNCw3ICsxMjIwLDcgQEAKIAkJcmV0dXJuIG0tPnNxX2Fzc19pdGVtKHMsIGksIG8pOwogCX0KIAotCXR5cGVfZXJyb3IoIm9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCIpOworCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCIsIHMpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTI0MSw3ICsxMjQ3LDcgQEAKIAkJcmV0dXJuIG0tPnNxX2Fzc19pdGVtKHMsIGksIChQeU9iamVjdCAqKU5VTEwpOwogCX0KIAotCXR5cGVfZXJyb3IoIm9iamVjdCBkb2Vzbid0IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIsIHMpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTI4MCw3ICsxMjg2LDcgQEAKIAkJcmV0dXJuIHJlczsKIAl9CiAKLQl0eXBlX2Vycm9yKCJvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGFzc2lnbm1lbnQiKTsKKwl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGFzc2lnbm1lbnQiLCBzKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTEzMDksNyArMTMxNSw3IEBACiAJCX0KIAkJcmV0dXJuIG0tPnNxX2Fzc19zbGljZShzLCBpMSwgaTIsIChQeU9iamVjdCAqKU5VTEwpOwogCX0KLQl0eXBlX2Vycm9yKCJvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIik7CisJdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIsIHMpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTQ0MCw3ICsxNDQ2LDcgQEAKICAJaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwogCWlmIChpdCA9PSBOVUxMKSB7CiAJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlyZXR1cm4gdHlwZV9lcnJvcihtKTsKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG0pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE0NzAsNyArMTQ3Niw3IEBACiAKIAlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKIAlpZiAoaXQgPT0gTlVMTCkgewotCQl0eXBlX2Vycm9yKCJpdGVyYWJsZSBhcmd1bWVudCByZXF1aXJlZCIpOworCQl0eXBlX2Vycm9yKCJhcmd1bWVudCBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBpdGVyYWJsZSIsIHNlcSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE2MDMsNyArMTYwOSw3IEBACiAJaWYgKG0gJiYgbS0+bXBfbGVuZ3RoKQogCQlyZXR1cm4gbS0+bXBfbGVuZ3RoKG8pOwogCi0JdHlwZV9lcnJvcigibGVuKCkgb2YgdW5zaXplZCBvYmplY3QiKTsKKwl0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBvKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE3MDEsNyArMTcwNyw3IEBACiAJCQkJIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyVzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKKwlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCiAJCSAgICAgZnVuYy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNzkwLDcgKzE3OTYsNyBAQAogCX0KIAogCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQl0eXBlX2Vycm9yKCJjYWxsIG9mIG5vbi1jYWxsYWJsZSBhdHRyaWJ1dGUiKTsgCisJCXR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOyAKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTgyOSw3ICsxODM1LDcgQEAKIAl9CiAKIAlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJdHlwZV9lcnJvcigiY2FsbCBvZiBub24tY2FsbGFibGUgYXR0cmlidXRlIik7IAorCQl0eXBlX2Vycm9yKCJhdHRyaWJ1dGUgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgY2FsbGFibGUiLCBmdW5jKTsgCiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTIxNzAsOSArMjE3Niw3IEBACiAJaWYgKGYgPT0gTlVMTCkgewogCQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvKSkKIAkJCXJldHVybiBQeVNlcUl0ZXJfTmV3KG8pOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2UiKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwgbyk7CiAJfQogCWVsc2UgewogCQlQeU9iamVjdCAqcmVzID0gKCpmKShvKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCmluZGV4IGQyNTk3YjkuLjNhMGUzZDUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9idWZmZXJvYmplY3QuYwpAQCAtMTUsOCArMTUsMTYgQEAKIH0gUHlCdWZmZXJPYmplY3Q7CiAKIAorZW51bSBidWZmZXJfdCB7CisgICAgUkVBRF9CVUZGRVIsCisgICAgV1JJVEVfQlVGRkVSLAorICAgIENIQVJfQlVGRkVSLAorICAgIEFOWV9CVUZGRVIsCit9OworCiBzdGF0aWMgaW50Ci1nZXRfYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCB2b2lkICoqcHRyLCBQeV9zc2l6ZV90ICpzaXplKQorZ2V0X2J1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgdm9pZCAqKnB0ciwgUHlfc3NpemVfdCAqc2l6ZSwKKwllbnVtIGJ1ZmZlcl90IGJ1ZmZlcl90eXBlKQogewogCWlmIChzZWxmLT5iX2Jhc2UgPT0gTlVMTCkgewogCQlhc3NlcnQgKHB0ciAhPSBOVUxMKTsKQEAgLTI1LDE3ICszMyw0MyBAQAogCX0KIAllbHNlIHsKIAkJUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotCQlyZWFkYnVmZmVycHJvYyBwcm9jOworCQlyZWFkYnVmZmVycHJvYyBwcm9jID0gMDsKIAkJUHlCdWZmZXJQcm9jcyAqYnAgPSBzZWxmLT5iX2Jhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKIAkJaWYgKCgqYnAtPmJmX2dldHNlZ2NvdW50KShzZWxmLT5iX2Jhc2UsIE5VTEwpICE9IDEpIHsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChzZWxmLT5iX3JlYWRvbmx5KQotCQkJcHJvYyA9IGJwLT5iZl9nZXRyZWFkYnVmZmVyOwotCQllbHNlCi0JCQlwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXR3cml0ZWJ1ZmZlcjsKKwkJaWYgKChidWZmZXJfdHlwZSA9PSBSRUFEX0JVRkZFUikgfHwKKwkJCSgoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikgJiYgc2VsZi0+Yl9yZWFkb25seSkpCisJCSAgICBwcm9jID0gYnAtPmJmX2dldHJlYWRidWZmZXI7CisJCWVsc2UgaWYgKChidWZmZXJfdHlwZSA9PSBXUklURV9CVUZGRVIpIHx8CisJCQkoYnVmZmVyX3R5cGUgPT0gQU5ZX0JVRkZFUikpCisgICAgCQkgICAgcHJvYyA9IChyZWFkYnVmZmVycHJvYylicC0+YmZfZ2V0d3JpdGVidWZmZXI7CisJCWVsc2UgaWYgKGJ1ZmZlcl90eXBlID09IENIQVJfQlVGRkVSKSB7CisJCSAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXRjaGFyYnVmZmVyOworCQl9CisJCWlmICghcHJvYykgeworCQkgICAgY2hhciAqYnVmZmVyX3R5cGVfbmFtZTsKKwkJICAgIHN3aXRjaCAoYnVmZmVyX3R5cGUpIHsKKwkJCWNhc2UgUkVBRF9CVUZGRVI6CisJCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJyZWFkIjsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgV1JJVEVfQlVGRkVSOgorCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAid3JpdGUiOworCQkJICAgIGJyZWFrOworCQkJY2FzZSBDSEFSX0JVRkZFUjoKKwkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gImNoYXIiOworCQkJICAgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gIm5vIjsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgIiVzIGJ1ZmZlciB0eXBlIG5vdCBhdmFpbGFibGUiLAorCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUpOworCQkgICAgcmV0dXJuIDA7CisJCX0KIAkJaWYgKChjb3VudCA9ICgqcHJvYykoc2VsZi0+Yl9iYXNlLCAwLCBwdHIpKSA8IDApCiAJCQlyZXR1cm4gMDsKIAkJLyogYXBwbHkgY29uc3RyYWludHMgdG8gdGhlIHN0YXJ0L2VuZCAqLwpAQCAtMjI0LDE1ICsyNTgsMTUgQEAKIAlQeV9zc2l6ZV90IGxlbl9zZWxmLCBsZW5fb3RoZXIsIG1pbl9sZW47CiAJaW50IGNtcDsKIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcDEsICZsZW5fc2VsZikpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwMSwgJmxlbl9zZWxmLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwotCWlmICghZ2V0X2J1ZihvdGhlciwgJnAyLCAmbGVuX290aGVyKSkKKwlpZiAoIWdldF9idWYob3RoZXIsICZwMiwgJmxlbl9vdGhlciwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiAtMTsKIAltaW5fbGVuID0gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IGxlbl9zZWxmIDogbGVuX290aGVyOwogCWlmIChtaW5fbGVuID4gMCkgewogCQljbXAgPSBtZW1jbXAocDEsIHAyLCBtaW5fbGVuKTsKIAkJaWYgKGNtcCAhPSAwKQotCQkJcmV0dXJuIGNtcDsKKwkJCXJldHVybiBjbXAgPCAwID8gLTEgOiAxOwogCX0KIAlyZXR1cm4gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IC0xIDogKGxlbl9zZWxmID4gbGVuX290aGVyKSA/IDEgOiAwOwogfQpAQCAtMjg0LDcgKzMxOCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiAtMTsKIAlwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwogCWxlbiA9IHNpemU7CkBAIC0zMDMsNyArMzM3LDcgQEAKIHsKIAl2b2lkICpwdHI7CiAJUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyICopcHRyLCBzaXplKTsKIH0KQEAgLTMxNSw3ICszNDksNyBAQAogewogCXZvaWQgKnB0cjsKIAlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gLTE7CiAJcmV0dXJuIHNpemU7CiB9CkBAIC0zNDQsNyArMzc4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0gCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUpKQorIAlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKICAJCXJldHVybiBOVUxMOwogIAogCS8qIG9wdGltaXplIHNwZWNpYWwgY2FzZSAqLwpAQCAtMzgwLDcgKzQxNCw3IEBACiAKIAlpZiAoIGNvdW50IDwgMCApCiAJCWNvdW50ID0gMDsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiBOVUxMOwogCW9iID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSAqIGNvdW50KTsKIAlpZiAoIG9iID09IE5VTEwgKQpAQCAtNDA0LDcgKzQzOCw3IEBACiB7CiAJdm9pZCAqcHRyOwogCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiBOVUxMOwogCWlmICggaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSApIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJidWZmZXIgaW5kZXggb3V0IG9mIHJhbmdlIik7CkBAIC00MTgsNyArNDUyLDcgQEAKIHsKIAl2b2lkICpwdHI7CiAJUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKCBsZWZ0IDwgMCApCiAJCWxlZnQgPSAwOwpAQCAtNDQ2LDcgKzQ4MCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCiAJaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemUpIHsKQEAgLTUxMyw3ICs1NDcsNyBAQAogCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiAtMTsKIAlpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCiAJCXJldHVybiAtMTsKQEAgLTU1Miw3ICs1ODYsNyBAQAogCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSwgUkVBRF9CVUZGRVIpKQogCQlyZXR1cm4gLTE7CiAJcmV0dXJuIHNpemU7CiB9CkBAIC01NjAsMTIgKzU5NCwyMiBAQAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9nZXR3cml0ZWJ1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgsIHZvaWQgKipwcCkKIHsKKwlQeV9zc2l6ZV90IHNpemU7CisKIAlpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKQogCXsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlyZXR1cm4gYnVmZmVyX2dldHJlYWRidWYoc2VsZiwgaWR4LCBwcCk7CisKKwlpZiAoIGlkeCAhPSAwICkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisJCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBXUklURV9CVUZGRVIpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CkBAIC01NzMsNyArNjE3LDcgQEAKIHsKIAl2b2lkICpwdHI7CiAJUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCWlmIChsZW5wKQogCQkqbGVucCA9IHNpemU7CkBAIC01OTAsMTMgKzYzNCwxMiBAQAogCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIENIQVJfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCSpwcCA9IChjb25zdCBjaGFyICopcHRyOwogCXJldHVybiBzaXplOwogfQogCi0KIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBidWZmZXJfYXNfc2VxdWVuY2UgPSB7CiAJKGxlbmZ1bmMpYnVmZmVyX2xlbmd0aCwgLypzcV9sZW5ndGgqLwogCShiaW5hcnlmdW5jKWJ1ZmZlcl9jb25jYXQsIC8qc3FfY29uY2F0Ki8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2VsbG9iamVjdC5jIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKaW5kZXggZGE0OGRlYS4uNjVhMjlhYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jZWxsb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKQEAgLTgsNiArOCw4IEBACiAJUHlDZWxsT2JqZWN0ICpvcDsKIAogCW9wID0gKFB5Q2VsbE9iamVjdCAqKVB5T2JqZWN0X0dDX05ldyhQeUNlbGxPYmplY3QsICZQeUNlbGxfVHlwZSk7CisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCW9wLT5vYl9yZWYgPSBvYmo7CiAJUHlfWElOQ1JFRihvYmopOwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKaW5kZXggZmE4YTNhOS4uMmQ4MDA3MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGFzc29iamVjdC5jCisrKyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwpAQCAtOTMzLDExICs5MzMsOSBAQAogCVB5X0RFQ1JFRihmdW5jKTsKIAlpZiAocmVzID09IE5VTEwpCiAJCXJldHVybiAtMTsKLQlpZiAoUHlJbnRfQ2hlY2socmVzKSkgewotCQlvdXRjb21lID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCWlmIChvdXRjb21lID09IC0xKQotCQkJb3V0Y29tZSA9IC0yOwotCX0KKwlpZiAoUHlJbnRfQ2hlY2socmVzKSB8fCBQeUxvbmdfQ2hlY2socmVzKSkKKwkJLyogVGhpcyBhbHJlYWR5IGNvbnZlcnRzIGEgLTEgcmVzdWx0IHRvIC0yLiAqLworCQlvdXRjb21lID0gcmVzLT5vYl90eXBlLT50cF9oYXNoKHJlcyk7CiAJZWxzZSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJIl9faGFzaF9fKCkgc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKQEAgLTEzNjcsMTAgKzEzNjUsMTMgQEAKIAkJICogYXJndW1lbnQgKi8KIAkJcmVzdWx0ID0gZ2VuZXJpY19iaW5hcnlfb3AodjEsIHcsIG9wbmFtZSk7CiAJfSBlbHNlIHsKKwkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGFmdGVyIGNvZXJjaW9uIikpCisJCSAgICByZXR1cm4gTlVMTDsKIAkJaWYgKHN3YXBwZWQpCiAJCQlyZXN1bHQgPSAodGhpc2Z1bmMpKHcsIHYxKTsKIAkJZWxzZQogCQkJcmVzdWx0ID0gKHRoaXNmdW5jKSh2MSwgdyk7CisJCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwogCX0KIAlQeV9ERUNSRUYoY29lcmNlZCk7CiAJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL09iamVjdHMvY29kZW9iamVjdC5jIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKaW5kZXggYTliY2IwMS4uODk4NzFkNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKQEAgLTU1Niw2ICs1NTYsNyBAQAogICAgICAgICAgICB0aGUgbGluZSBpbmNyZW1lbnRzIGhlcmUsIHRyZWF0aW5nIHRoZW0gYXMgYnl0ZQogICAgICAgICAgICBpbmNyZW1lbnRzIGdldHMgY29uZnVzaW5nLCB0byBzYXkgdGhlIGxlYXN0LiAqLwogCisgICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSAwOwogICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAoYWRkciArICpwID4gbGFzdGkpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL09iamVjdHMvY29tcGxleG9iamVjdC5jIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKaW5kZXggYzZlMzM0My4uYWE4ZmM4MSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMKQEAgLTI3NCwxNiArMjc0LDE2IEBACiB7CiAJY2hhciBmb3JtYXRbMzJdOwogCWlmICh2LT5jdmFsLnJlYWwgPT0gMC4pIHsKLQkJUHlPU19zbnByaW50Zihmb3JtYXQsIDMyLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKLQkJUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmc3osIGZvcm1hdCwgdi0+Y3ZhbC5pbWFnKTsKLQkJc3RybmNhdChidWYsICJqIiwgYnVmc3opOworCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJS4laWciLCBwcmVjaXNpb24pOworCQlQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZzeiAtIDEsIGZvcm1hdCwgdi0+Y3ZhbC5pbWFnKTsKKwkJc3RybmNhdChidWYsICJqIiwgMSk7CiAJfSBlbHNlIHsKIAkJY2hhciByZVs2NF0sIGltWzY0XTsKIAkJLyogRm9ybWF0IGltYWdpbmFyeSBwYXJ0IHdpdGggc2lnbiwgcmVhbCBwYXJ0IHdpdGhvdXQgKi8KLQkJUHlPU19zbnByaW50Zihmb3JtYXQsIDMyLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKLQkJUHlPU19hc2NpaV9mb3JtYXRkKHJlLCA2NCwgZm9ybWF0LCB2LT5jdmFsLnJlYWwpOwotCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgMzIsICIlJSsuJWlnIiwgcHJlY2lzaW9uKTsKLQkJUHlPU19hc2NpaV9mb3JtYXRkKGltLCA2NCwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOworCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJS4laWciLCBwcmVjaXNpb24pOworCQlQeU9TX2FzY2lpX2Zvcm1hdGQocmUsIHNpemVvZihyZSksIGZvcm1hdCwgdi0+Y3ZhbC5yZWFsKTsKKwkJUHlPU19zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJSUrLiVpZyIsIHByZWNpc2lvbik7CisJCVB5T1NfYXNjaWlfZm9ybWF0ZChpbSwgc2l6ZW9mKGltKSwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOwogCQlQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmc3osICIoJXMlc2opIiwgcmUsIGltKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKaW5kZXggNjA2ZWYwNS4uOTE0YjZkMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jCisrKyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwpAQCAtODkyLDEwICs4OTIsMTIgQEAKIHN0YXRpYyB2b2lkCiB3cmFwcGVyX2RlYWxsb2Mod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0sod3ApOworCVB5T2JqZWN0X0dDX1VuVHJhY2sod3ApOworCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4od3ApCiAJUHlfWERFQ1JFRih3cC0+ZGVzY3IpOwogCVB5X1hERUNSRUYod3AtPnNlbGYpOwogCVB5T2JqZWN0X0dDX0RlbCh3cCk7CisJUHlfVFJBU0hDQU5fU0FGRV9FTkQod3ApCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTExNzQsNyArMTE3Niw2IEBACiBwcm9wZXJ0eV9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAJUHlPYmplY3QgKmdldCA9IE5VTEwsICpzZXQgPSBOVUxMLCAqZGVsID0gTlVMTCwgKmRvYyA9IE5VTEw7Ci0JUHlPYmplY3QgKmdldF9kb2MgPSBOVUxMOwogCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmdldCIsICJmc2V0IiwgImZkZWwiLCAiZG9jIiwgMH07CiAJcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKIApAQCAtMTE4OSwyMCArMTE5MCwyMiBAQAogCWlmIChkZWwgPT0gUHlfTm9uZSkKIAkJZGVsID0gTlVMTDsKIAotCS8qIGlmIG5vIGRvY3N0cmluZyBnaXZlbiBhbmQgdGhlIGdldHRlciBoYXMgb25lLCB1c2UgdGhhdCBvbmUgKi8KLQlpZiAoKGRvYyA9PSBOVUxMIHx8IGRvYyA9PSBQeV9Ob25lKSAmJiBnZXQgIT0gTlVMTCAmJiAKLQkgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyhnZXQsICJfX2RvY19fIikpIHsKLQkJaWYgKCEoZ2V0X2RvYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZ2V0LCAiX19kb2NfXyIpKSkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGdldF9kb2MpOyAvKiBpdCBpcyBJTkNSRUYnZCBhZ2FpbiBiZWxvdyAqLwotCQlkb2MgPSBnZXRfZG9jOwotCX0KLQogCVB5X1hJTkNSRUYoZ2V0KTsKIAlQeV9YSU5DUkVGKHNldCk7CiAJUHlfWElOQ1JFRihkZWwpOwogCVB5X1hJTkNSRUYoZG9jKTsKIAorCS8qIGlmIG5vIGRvY3N0cmluZyBnaXZlbiBhbmQgdGhlIGdldHRlciBoYXMgb25lLCB1c2UgdGhhdCBvbmUgKi8KKwlpZiAoKGRvYyA9PSBOVUxMIHx8IGRvYyA9PSBQeV9Ob25lKSAmJiBnZXQgIT0gTlVMTCkgeworCQlQeU9iamVjdCAqZ2V0X2RvYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZ2V0LCAiX19kb2NfXyIpOworCQlpZiAoZ2V0X2RvYyAhPSBOVUxMKSB7CisJCQlQeV9YREVDUkVGKGRvYyk7CisJCQlkb2MgPSBnZXRfZG9jOyAgLyogZ2V0X2RvYyBhbHJlYWR5IElOQ1JFRidkIGJ5IEdldEF0dHIgKi8KKwkJfSBlbHNlIHsKKwkJCVB5RXJyX0NsZWFyKCk7CisJCX0KKwl9CisKIAlncy0+cHJvcF9nZXQgPSBnZXQ7CiAJZ3MtPnByb3Bfc2V0ID0gc2V0OwogCWdzLT5wcm9wX2RlbCA9IGRlbDsKZGlmZiAtLWdpdCBhL09iamVjdHMvZGljdG5vdGVzLnR4dCBiL09iamVjdHMvZGljdG5vdGVzLnR4dAppbmRleCBjYjQ2Y2IxLi5iMGU1OWE3IDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3Rub3Rlcy50eHQKKysrIGIvT2JqZWN0cy9kaWN0bm90ZXMudHh0CkBAIC0yNDMsNyArMjQzLDcgQEAKIENhY2hpbmcgTG9va3VwcwogLS0tLS0tLS0tLS0tLS0tCiBUaGUgaWRlYSBpcyB0byBleHBsb2l0IGtleSBhY2Nlc3MgcGF0dGVybnMgYnkgYW50aWNpcGF0aW5nIGZ1dHVyZSBsb29rdXBzCi1iYXNlZCBvZiBwcmV2aW91cyBsb29rdXBzLgorYmFzZWQgb24gcHJldmlvdXMgbG9va3Vwcy4KIAogVGhlIHNpbXBsZXN0IGluY2FybmF0aW9uIGlzIHRvIHNhdmUgdGhlIG1vc3QgcmVjZW50bHkgYWNjZXNzZWQgZW50cnkuCiBUaGlzIGdpdmVzIG9wdGltYWwgcGVyZm9ybWFuY2UgZm9yIHVzZSBjYXNlcyB3aGVyZSBldmVyeSBnZXQgaXMgZm9sbG93ZWQKZGlmZiAtLWdpdCBhL09iamVjdHMvZGljdG9iamVjdC5jIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKaW5kZXggZjllNDVmZC4uZjNiNmI3ZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKQEAgLTUzMiw3ICs1MzIsNyBAQAogLyogTm90ZSB0aGF0LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBQeURpY3RfR2V0SXRlbSgpIHN1cHByZXNzZXMgYWxsIGVycm9ycwogICogdGhhdCBtYXkgb2NjdXIgKG9yaWdpbmFsbHkgZGljdHMgc3VwcG9ydGVkIG9ubHkgc3RyaW5nIGtleXMsIGFuZCBleGNlcHRpb25zCiAgKiB3ZXJlbid0IHBvc3NpYmxlKS4gIFNvLCB3aGlsZSB0aGUgb3JpZ2luYWwgaW50ZW50IHdhcyB0aGF0IGEgTlVMTCByZXR1cm4KLSAqIG1lYW50IHRoZSBrZXkgd2Fzbid0IHByZXNlbnQsIGl0IHJlYWxpdHkgaXQgY2FuIG1lYW4gdGhhdCwgb3IgdGhhdCBhbiBlcnJvcgorICogbWVhbnQgdGhlIGtleSB3YXNuJ3QgcHJlc2VudCwgaW4gcmVhbGl0eSBpdCBjYW4gbWVhbiB0aGF0LCBvciB0aGF0IGFuIGVycm9yCiAgKiAoc3VwcHJlc3NlZCkgb2NjdXJyZWQgd2hpbGUgY29tcHV0aW5nIHRoZSBrZXkncyBoYXNoLCBvciB0aGF0IHNvbWUgZXJyb3IKICAqIChzdXBwcmVzc2VkKSBvY2N1cnJlZCB3aGVuIGNvbXBhcmluZyBrZXlzIGluIHRoZSBkaWN0J3MgaW50ZXJuYWwgcHJvYmUKICAqIHNlcXVlbmNlLiAgQSBuYXN0eSBleGFtcGxlIG9mIHRoZSBsYXR0ZXIgaXMgd2hlbiBhIFB5dGhvbi1jb2RlZCBjb21wYXJpc29uCkBAIC01NjEsNyArNTYxLDcgQEAKIAkvKiBXZSBjYW4gYXJyaXZlIGhlcmUgd2l0aCBhIE5VTEwgdHN0YXRlIGR1cmluZyBpbml0aWFsaXphdGlvbjoKIAkgICB0cnkgcnVubmluZyAicHl0aG9uIC1XaSIgZm9yIGFuIGV4YW1wbGUgcmVsYXRlZCB0byBzdHJpbmcKIAkgICBpbnRlcm5pbmcuICBMZXQncyBqdXN0IGhvcGUgdGhhdCBubyBleGNlcHRpb24gb2NjdXJzIHRoZW4uLi4gKi8KLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworCXRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiAJaWYgKHRzdGF0ZSAhPSBOVUxMICYmIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgIT0gTlVMTCkgewogCQkvKiBwcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgZXhjZXB0aW9uICovCiAJCVB5T2JqZWN0ICplcnJfdHlwZSwgKmVycl92YWx1ZSwgKmVycl90YjsKQEAgLTU5OSw2ICs1OTksOCBAQAogCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlhc3NlcnQoa2V5KTsKKwlhc3NlcnQodmFsdWUpOwogCW1wID0gKGRpY3RvYmplY3QgKilvcDsKIAlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7CiAJCWhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopa2V5KS0+b2Jfc2hhc2g7CkBAIC02NDcsNiArNjQ5LDcgQEAKIAkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAJCXJldHVybiAtMTsKIAl9CisJYXNzZXJ0KGtleSk7CiAJaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKIAkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewogCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9leGNlcHRpb25zLmMgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwppbmRleCAzNjkzNjViLi5iZTk2MjdjIDEwMDY0NAotLS0gYS9PYmplY3RzL2V4Y2VwdGlvbnMuYworKysgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwpAQCAtMTk2Nyw2ICsxOTY3LDI5IEBACiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGJkaWN0LCAjIFRZUEUsIFB5RXhjXyAjIyBUWVBFKSkgXAogICAgICAgICBQeV9GYXRhbEVycm9yKCJNb2R1bGUgZGljdGlvbmFyeSBpbnNlcnRpb24gcHJvYmxlbS4iKTsKIAorI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pCisvKiBjcnQgdmFyaWFibGUgY2hlY2tpbmcgaW4gVmlzdWFsU3R1ZGlvIC5ORVQgMjAwNSAqLworI2luY2x1ZGUgPGNydGRiZy5oPgorCitzdGF0aWMgaW50CXByZXZDcnRSZXBvcnRNb2RlOworc3RhdGljIF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyCXByZXZDcnRIYW5kbGVyOworCisvKiBJbnZhbGlkIHBhcmFtZXRlciBoYW5kbGVyLiAgU2V0cyBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uICovCitzdGF0aWMgdm9pZAorSW52YWxpZFBhcmFtZXRlckhhbmRsZXIoCisgICAgY29uc3Qgd2NoYXJfdCAqIGV4cHJlc3Npb24sCisgICAgY29uc3Qgd2NoYXJfdCAqIGZ1bmN0aW9uLAorICAgIGNvbnN0IHdjaGFyX3QgKiBmaWxlLAorICAgIHVuc2lnbmVkIGludCBsaW5lLAorICAgIHVpbnRwdHJfdCBwUmVzZXJ2ZWQpCit7CisgICAgLyogRG8gbm90aGluZywgYWxsb3cgZXhlY3V0aW9uIHRvIGNvbnRpbnVlLiAgVXN1YWxseSB0aGlzCisgICAgICogbWVhbnMgdGhhdCB0aGUgQ1JUIHdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTAorICAgICAqLworfQorI2VuZGlmCisKKwogUHlNT0RJTklUX0ZVTkMKIF9QeUV4Y19Jbml0KHZvaWQpCiB7CkBAIC0yMDk2LDYgKzIxMTksMTMgQEAKICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2Fubm90IHByZS1hbGxvY2F0ZSBNZW1vcnlFcnJvciBpbnN0YW5jZVxuIik7CiAKICAgICBQeV9ERUNSRUYoYmx0aW5tb2QpOworCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIGRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykKKyAgICAvKiBTZXQgQ1JUIGFyZ3VtZW50IGVycm9yIGhhbmRsZXIgKi8KKyAgICBwcmV2Q3J0SGFuZGxlciA9IF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcihJbnZhbGlkUGFyYW1ldGVySGFuZGxlcik7CisgICAgLyogdHVybiBvZmYgYXNzZXJ0aW9ucyBpbiBkZWJ1ZyBtb2RlICovCisgICAgcHJldkNydFJlcG9ydE1vZGUgPSBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgMCk7CisjZW5kaWYKIH0KIAogdm9pZApAQCAtMjEwMyw0ICsyMTMzLDkgQEAKIHsKICAgICBQeV9YREVDUkVGKFB5RXhjX01lbW9yeUVycm9ySW5zdCk7CiAgICAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0ID0gTlVMTDsKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgJiYgZGVmaW5lZChfX1NURENfU0VDVVJFX0xJQl9fKQorICAgIC8qIHJlc2V0IENSVCBlcnJvciBoYW5kbGluZyAqLworICAgIF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcihwcmV2Q3J0SGFuZGxlcik7CisgICAgX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIHByZXZDcnRSZXBvcnRNb2RlKTsKKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9maWxlb2JqZWN0LmMgYi9PYmplY3RzL2ZpbGVvYmplY3QuYwppbmRleCBhNGE0M2VkLi5mYjhhNTQyIDEwMDY0NAotLS0gYS9PYmplY3RzL2ZpbGVvYmplY3QuYworKysgYi9PYmplY3RzL2ZpbGVvYmplY3QuYwpAQCAtNCw5ICs0LDkgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotI2lmbmRlZiBET05UX0hBVkVfU1lTX1RZUEVTX0gKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYgLyogRE9OVF9IQVZFX1NZU19UWVBFU19IICovCisjZW5kaWYgLyogSEFWRV9TWVNfVFlQRVNfSCAqLwogCiAjaWZkZWYgTVNfV0lORE9XUwogI2RlZmluZSBmaWxlbm8gX2ZpbGVubwpAQCAtMTAzLDYgKzEwMyw3IEBACiBmaWxsX2ZpbGVfZmllbGRzKFB5RmlsZU9iamVjdCAqZiwgRklMRSAqZnAsIFB5T2JqZWN0ICpuYW1lLCBjaGFyICptb2RlLAogCQkgaW50ICgqY2xvc2UpKEZJTEUgKikpCiB7CisJYXNzZXJ0KG5hbWUgIT0gTlVMTCk7CiAJYXNzZXJ0KGYgIT0gTlVMTCk7CiAJYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CiAJYXNzZXJ0KGYtPmZfZnAgPT0gTlVMTCk7CkBAIC0xMTEsNyArMTEyLDcgQEAKIAlQeV9ERUNSRUYoZi0+Zl9tb2RlKTsKIAlQeV9ERUNSRUYoZi0+Zl9lbmNvZGluZyk7CiAKLSAgICAgICAgUHlfSU5DUkVGIChuYW1lKTsKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOwogICAgICAgICBmLT5mX25hbWUgPSBuYW1lOwogCiAJZi0+Zl9tb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2RlKTsKQEAgLTEyNiw3ICsxMjcsNyBAQAogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlmLT5mX2VuY29kaW5nID0gUHlfTm9uZTsKIAotCWlmIChmLT5mX25hbWUgPT0gTlVMTCB8fCBmLT5mX21vZGUgPT0gTlVMTCkKKwlpZiAoZi0+Zl9tb2RlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWYtPmZfZnAgPSBmcDsKICAgICAgICAgZiA9IGRpcmNoZWNrKGYpOwpAQCAtMjQxLDEzICsyNDIsMTUgQEAKIAl9CiAKIAlpZiAoZi0+Zl9mcCA9PSBOVUxMKSB7Ci0jaWZkZWYgX01TQ19WRVIKKyNpZiBkZWZpbmVkICBfTVNDX1ZFUiAmJiAoX01TQ19WRVIgPCAxNDAwIHx8ICFkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pKQogCQkvKiBNU1ZDIDYgKE1pY3Jvc29mdCkgbGVhdmVzIGVycm5vIGF0IDAgZm9yIGJhZCBtb2RlIHN0cmluZ3MsCiAJCSAqIGFjcm9zcyBhbGwgV2luZG93cyBmbGF2b3JzLiAgV2hlbiBpdCBzZXRzIEVJTlZBTCB2YXJpZXMKIAkJICogYWNyb3NzIFdpbmRvd3MgZmxhdm9ycywgdGhlIGV4YWN0IGNvbmRpdGlvbnMgYXJlbid0CiAJCSAqIGRvY3VtZW50ZWQsIGFuZCB0aGUgYW5zd2VyIGxpZXMgaW4gdGhlIE9TJ3MgaW1wbGVtZW50YXRpb24KIAkJICogb2YgV2luMzIncyBDcmVhdGVGaWxlIGZ1bmN0aW9uICh3aG9zZSBzb3VyY2UgaXMgc2VjcmV0KS4KIAkJICogU2VlbXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIG1hcCBFSU5WQUwgdG8gRU5PRU5ULgorCQkgKiBTdGFydGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDA1LCBFSU5WQUwgaXMgY29ycmVjdGx5CisJCSAqIHNldCBieSBvdXIgQ1JUIGVycm9yIGhhbmRsZXIgKHNldCBpbiBleGNlcHRpb25zLmMuKQogCQkgKi8KIAkJaWYgKGVycm5vID09IDApCS8qIGJhZCBtb2RlIHN0cmluZyAqLwogCQkJZXJybm8gPSBFSU5WQUw7CkBAIC0yNzYsNyArMjc5LDkgQEAKIAlQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopUHlGaWxlX1R5cGUudHBfbmV3KCZQeUZpbGVfVHlwZSwKIAkJCQkJCQkgICAgIE5VTEwsIE5VTEwpOwogCWlmIChmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqb19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKwkJUHlPYmplY3QgKm9fbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisJCWlmIChvX25hbWUgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOwogCQlpZiAoZmlsbF9maWxlX2ZpZWxkcyhmLCBmcCwgb19uYW1lLCBtb2RlLCBjbG9zZSkgPT0gTlVMTCkgewogCQkJUHlfREVDUkVGKGYpOwogCQkJZiA9IE5VTEw7CkBAIC00MDksMTEgKzQxNCwxMSBAQAogCWlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAkJUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpuYW1lOwotCQluYW1lID0gUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhmLT5mX25hbWUpOworCQlQeU9iamVjdCAqbmFtZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoZi0+Zl9uYW1lKTsKKwkJY29uc3QgY2hhciAqbmFtZV9zdHIgPSBuYW1lID8gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkgOiAiPyI7CiAJCXJldCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBmaWxlIHUnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKIAkJCQkgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSwKKwkJCQkgICBuYW1lX3N0ciwKIAkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX21vZGUpLAogCQkJCSAgIGYpOwogCQlQeV9YREVDUkVGKG5hbWUpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCmluZGV4IGZjYjVlNGUuLjNhMDczYjYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnJhbWVvYmplY3QuYworKysgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKQEAgLTIwLDcgKzIwLDYgQEAKIAl7ImZfYnVpbHRpbnMiLAlUX09CSkVDVCwJT0ZGKGZfYnVpbHRpbnMpLFJPfSwKIAl7ImZfZ2xvYmFscyIsCVRfT0JKRUNULAlPRkYoZl9nbG9iYWxzKSwJUk99LAogCXsiZl9sYXN0aSIsCVRfSU5ULAkJT0ZGKGZfbGFzdGkpLAlST30sCi0JeyJmX3Jlc3RyaWN0ZWQiLFRfSU5ULAkJT0ZGKGZfcmVzdHJpY3RlZCksUk99LAogCXsiZl9leGNfdHlwZSIsCVRfT0JKRUNULAlPRkYoZl9leGNfdHlwZSl9LAogCXsiZl9leGNfdmFsdWUiLAlUX09CSkVDVCwJT0ZGKGZfZXhjX3ZhbHVlKX0sCiAJeyJmX2V4Y190cmFjZWJhY2siLCBUX09CSkVDVCwJT0ZGKGZfZXhjX3RyYWNlYmFjayl9LApAQCAtMzQxLDExICszNDAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2ZyYW1lX2dldHJlc3RyaWN0ZWQoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKK3sKKwlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5RnJhbWVfSXNSZXN0cmljdGVkKGYpKTsKK30KKwogc3RhdGljIFB5R2V0U2V0RGVmIGZyYW1lX2dldHNldGxpc3RbXSA9IHsKIAl7ImZfbG9jYWxzIiwJKGdldHRlcilmcmFtZV9nZXRsb2NhbHMsIE5VTEwsIE5VTEx9LAogCXsiZl9saW5lbm8iLAkoZ2V0dGVyKWZyYW1lX2dldGxpbmVubywKIAkJCShzZXR0ZXIpZnJhbWVfc2V0bGluZW5vLCBOVUxMfSwKIAl7ImZfdHJhY2UiLAkoZ2V0dGVyKWZyYW1lX2dldHRyYWNlLCAoc2V0dGVyKWZyYW1lX3NldHRyYWNlLCBOVUxMfSwKKwl7ImZfcmVzdHJpY3RlZCIsKGdldHRlcilmcmFtZV9nZXRyZXN0cmljdGVkLE5VTEwsIE5VTEx9LAogCXswfQogfTsKIApAQCAtNDI1LDcgKzQzMSw3IEBACiAJUHlfQ0xFQVIoZi0+Zl9leGNfdHJhY2ViYWNrKTsKIAogICAgICAgICBjbyA9IGYtPmZfY29kZTsKLSAgICAgICAgaWYgKGNvICE9IE5VTEwgJiYgY28tPmNvX3pvbWJpZWZyYW1lID09IE5VTEwpCisgICAgICAgIGlmIChjby0+Y29fem9tYmllZnJhbWUgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBjby0+Y29fem9tYmllZnJhbWUgPSBmOwogCWVsc2UgaWYgKG51bWZyZWUgPCBNQVhGUkVFTElTVCkgewogCQkrK251bWZyZWU7CkBAIC00MzUsNyArNDQxLDcgQEAKIAllbHNlIAogCQlQeU9iamVjdF9HQ19EZWwoZik7CiAKLSAgICAgICAgUHlfWERFQ1JFRihjbyk7CisgICAgICAgIFB5X0RFQ1JFRihjbyk7CiAJUHlfVFJBU0hDQU5fU0FGRV9FTkQoZikKIH0KIApAQCAtNjM2LDYgKzY0Miw3IEBACiAJCWYtPmZfdHJhY2UgPSBOVUxMOwogICAgICAgICAgICAgICAgIGYtPmZfZXhjX3R5cGUgPSBmLT5mX2V4Y192YWx1ZSA9IGYtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7CiAJfQorCWYtPmZfc3RhY2t0b3AgPSBmLT5mX3ZhbHVlc3RhY2s7CiAJZi0+Zl9idWlsdGlucyA9IGJ1aWx0aW5zOwogCVB5X1hJTkNSRUYoYmFjayk7CiAJZi0+Zl9iYWNrID0gYmFjazsKQEAgLTY2NCwxMCArNjcxLDggQEAKIAogCWYtPmZfbGFzdGkgPSAtMTsKIAlmLT5mX2xpbmVubyA9IGNvZGUtPmNvX2ZpcnN0bGluZW5vOwotCWYtPmZfcmVzdHJpY3RlZCA9IChidWlsdGlucyAhPSB0c3RhdGUtPmludGVycC0+YnVpbHRpbnMpOwogCWYtPmZfaWJsb2NrID0gMDsKIAotICAgICAgICBmLT5mX3N0YWNrdG9wID0gZi0+Zl92YWx1ZXN0YWNrOwogCV9QeU9iamVjdF9HQ19UUkFDSyhmKTsKIAlyZXR1cm4gZjsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZnVuY29iamVjdC5jIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKaW5kZXggNTljYjUxOS4uMWJhNzRjNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKQEAgLTEwOSw4ICsxMDksOCBAQAogCX0KIAlpZiAoZGVmYXVsdHMgPT0gUHlfTm9uZSkKIAkJZGVmYXVsdHMgPSBOVUxMOwotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soZGVmYXVsdHMpKSB7Ci0JCVB5X1hJTkNSRUYoZGVmYXVsdHMpOworCWVsc2UgaWYgKGRlZmF1bHRzICYmIFB5VHVwbGVfQ2hlY2soZGVmYXVsdHMpKSB7CisJCVB5X0lOQ1JFRihkZWZhdWx0cyk7CiAJfQogCWVsc2UgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJub24tdHVwbGUgZGVmYXVsdCBhcmdzIik7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAlpZiAoY2xvc3VyZSA9PSBQeV9Ob25lKQogCQljbG9zdXJlID0gTlVMTDsKIAllbHNlIGlmIChQeVR1cGxlX0NoZWNrKGNsb3N1cmUpKSB7Ci0JCVB5X1hJTkNSRUYoY2xvc3VyZSk7CisJCVB5X0lOQ1JFRihjbG9zdXJlKTsKIAl9CiAJZWxzZSB7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgCmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3RvYmplY3QuYyBiL09iamVjdHMvbGlzdG9iamVjdC5jCmluZGV4IGUxMjg0NzMuLmVhMDNhMmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdG9iamVjdC5jCisrKyBiL09iamVjdHMvbGlzdG9iamVjdC5jCkBAIC0xMDgsOCArMTA4LDEwIEBACiAJCW9wLT5vYl9pdGVtID0gTlVMTDsKIAllbHNlIHsKIAkJb3AtPm9iX2l0ZW0gPSAoUHlPYmplY3QgKiopIFB5TWVtX01BTExPQyhuYnl0ZXMpOwotCQlpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkKKwkJaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKKwkJCVB5X0RFQ1JFRihvcCk7CiAJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKwkJfQogCQltZW1zZXQob3AtPm9iX2l0ZW0sIDAsIG5ieXRlcyk7CiAJfQogCW9wLT5vYl9zaXplID0gc2l6ZTsKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdHNvcnQudHh0IGIvT2JqZWN0cy9saXN0c29ydC50eHQKaW5kZXggNjhlOTE4ZC4uOTIyNjk4NCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0c29ydC50eHQKKysrIGIvT2JqZWN0cy9saXN0c29ydC50eHQKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICAgNDY3LTQ3NCwgQXVzdGluLCBUZXhhcywgMjUtMjcgSmFudWFyeSAxOTkzLgogCiBhbmQgaXQgcHJvYmFibHkgZGF0ZXMgYmFjayB0byBhbiBlYXJsaWVyIHBhcGVyIGJ5IEJlbnRsZXkgYW5kIFlhby4gIFRoZQotTWNJbG9yeSBwYXBlciBpbiBwYXJ0aWN1bGFyIGhhcyBnb29kIGFuYWx5c2lzIG9mIGEgbWVyZ2Vzb3J0IHRoYXQncworTWNJbHJveSBwYXBlciBpbiBwYXJ0aWN1bGFyIGhhcyBnb29kIGFuYWx5c2lzIG9mIGEgbWVyZ2Vzb3J0IHRoYXQncwogcHJvYmFibHkgc3Ryb25nbHkgcmVsYXRlZCB0byB0aGlzIG9uZSBpbiBpdHMgZ2FsbG9waW5nIHN0cmF0ZWd5LgogCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvbG9uZ29iamVjdC5jIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKaW5kZXggNDUxNjZmZS4uOWQzNjg1ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9sb25nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICphID0gKFB5TG9uZ09iamVjdCAqKWFhOwogCVB5U3RyaW5nT2JqZWN0ICpzdHI7CiAJUHlfc3NpemVfdCBpOwotCWNvbnN0IFB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKGEtPm9iX3NpemUpOworCVB5X3NzaXplX3Qgc2l6ZV9hOwogCWNoYXIgKnA7CiAJaW50IGJpdHM7CiAJY2hhciBzaWduID0gJ1wwJzsKQEAgLTEyMTMsNiArMTIxMyw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOworCXNpemVfYSA9IEFCUyhhLT5vYl9zaXplKTsKIAogCS8qIENvbXB1dGUgYSByb3VnaCB1cHBlciBib3VuZCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCiAJaSA9IGJhc2U7CkBAIC0zMTMzLDkgKzMxMzQsOCBAQAogCQk6IE1BWChzaXplX2EsIHNpemVfYik7CiAJeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7CiAJaWYgKHogPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGEpOwotCQlQeV9YREVDUkVGKGIpOwotCQlQeV9YREVDUkVGKHopOworCQlQeV9ERUNSRUYoYSk7CisJCVB5X0RFQ1JFRihiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCAwYWY3OTg5Li5mZjEzNTc0IDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTEwNjcsNyArMTA2Nyw4IEBACiAJCXJldHVybiBfUHlfSGFzaFBvaW50ZXIodik7IC8qIFVzZSBhZGRyZXNzIGFzIGhhc2ggdmFsdWUgKi8KIAl9CiAJLyogSWYgdGhlcmUncyBhIGNtcCBidXQgbm8gaGFzaCBkZWZpbmVkLCB0aGUgb2JqZWN0IGNhbid0IGJlIGhhc2hlZCAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGUiKTsKKwlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlOiAnJS4yMDBzJyIsCisJCSAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMTMyLDggKzExMzMsOSBAQAogCQllbHNlCiAjZW5kaWYKIAkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7CisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorCQkJCSAgICAgbmFtZS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KQEAgLTExNzgsOCArMTE4MCw5IEBACiAJCWVsc2UKICNlbmRpZgogCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisJCQkJICAgICBuYW1lLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTEyNzQsOCArMTI3Nyw5IEBACiAJCWVsc2UKICNlbmRpZgogCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisJCQkJICAgICBuYW1lLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQpAQCAtMTM5NSw4ICsxMzk5LDkgQEAKIAkJZWxzZQogI2VuZGlmCiAJCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKwkJCQkgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtMTQ0NSw3ICsxNDUwLDcgQEAKIAogCWlmIChkZXNjciA9PSBOVUxMKSB7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuMjAwcyciLAogCQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKIAkJZ290byBkb25lOwogCX0KQEAgLTE3NjAsOCArMTc2NSw5IEBACiAKIAlhc3NlcnQocmVzdWx0KTsKIAlpZiAoIVB5TGlzdF9DaGVjayhyZXN1bHQpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiRXhwZWN0ZWQga2V5cygpIHRvIGJlIGEgbGlzdC4iKTsKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCSJFeHBlY3RlZCBrZXlzKCkgdG8gYmUgYSBsaXN0LCBub3QgJyUuMjAwcyciLAorCQkJcmVzdWx0LT5vYl90eXBlLT50cF9uYW1lKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJaWYgKFB5TGlzdF9Tb3J0KHJlc3VsdCkgIT0gMCkKZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IDkxNjgyYTIuLjU1YTJiODUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtNjIsNyArNjIsNyBAQAogCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKIAlyZWdpc3RlciBzaXplX3QgcGVydHVyYjsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZnJlZXNsb3Q7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IG1hc2sgPSBzby0+bWFzazsKKwlyZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwogCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAJcmVnaXN0ZXIgaW50IGNtcDsKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKIAlyZWdpc3RlciBzaXplX3QgcGVydHVyYjsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZnJlZXNsb3Q7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IG1hc2sgPSBzby0+bWFzazsKKwlyZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwogCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKQEAgLTIyMSwxMSArMjIxLDExIEBACiBhY3R1YWxseSBiZSBzbWFsbGVyIHRoYW4gdGhlIG9sZCBvbmUuCiAqLwogc3RhdGljIGludAotc2V0X3RhYmxlX3Jlc2l6ZShQeVNldE9iamVjdCAqc28sIGludCBtaW51c2VkKQorc2V0X3RhYmxlX3Jlc2l6ZShQeVNldE9iamVjdCAqc28sIFB5X3NzaXplX3QgbWludXNlZCkKIHsKLQlpbnQgbmV3c2l6ZTsKKwlQeV9zc2l6ZV90IG5ld3NpemU7CiAJc2V0ZW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplbnRyeTsKLQlpbnQgaTsKKwlQeV9zc2l6ZV90IGk7CiAJaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOwogCXNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAKQEAgLTMxNCw3ICszMTQsNyBAQAogc3RhdGljIGludAogc2V0X2FkZF9lbnRyeShyZWdpc3RlciBQeVNldE9iamVjdCAqc28sIHNldGVudHJ5ICplbnRyeSkKIHsKLQlyZWdpc3RlciBpbnQgbl91c2VkOworCXJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOwogCiAJYXNzZXJ0KHNvLT5maWxsIDw9IHNvLT5tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCiAJbl91c2VkID0gc28tPnVzZWQ7CkBAIC0zMzAsNyArMzMwLDcgQEAKIHNldF9hZGRfa2V5KHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKIAlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgaW50IG5fdXNlZDsKKwlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKIAogCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CiAJICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKQEAgLTQwMywxMCArNDAzLDEwIEBACiB7CiAJc2V0ZW50cnkgKmVudHJ5LCAqdGFibGU7CiAJaW50IHRhYmxlX2lzX21hbGxvY2VkOwotCWludCBmaWxsOworCVB5X3NzaXplX3QgZmlsbDsKIAlzZXRlbnRyeSBzbWFsbF9jb3B5W1B5U2V0X01JTlNJWkVdOwogI2lmZGVmIFB5X0RFQlVHCi0JaW50IGksIG47CisJUHlfc3NpemVfdCBpLCBuOwogCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKIAogCW4gPSBzby0+bWFzayArIDE7CkBAIC00NjUsNyArNDY1LDcgQEAKIC8qCiAgKiBJdGVyYXRlIG92ZXIgYSBzZXQgdGFibGUuICBVc2UgbGlrZSBzbzoKICAqCi0gKiAgICAgaW50IHBvczsKKyAqICAgICBQeV9zc2l6ZV90IHBvczsKICAqICAgICBzZXRlbnRyeSAqZW50cnk7CiAgKiAgICAgcG9zID0gMDsgICAjIGltcG9ydGFudCEgIHBvcyBzaG91bGQgbm90IG90aGVyd2lzZSBiZSBjaGFuZ2VkIGJ5IHlvdQogICogICAgIHdoaWxlIChzZXRfbmV4dCh5b3Vyc2V0LCAmcG9zLCAmZW50cnkpKSB7CkBAIC00NzksNyArNDc5LDcgQEAKIHNldF9uZXh0KFB5U2V0T2JqZWN0ICpzbywgUHlfc3NpemVfdCAqcG9zX3B0ciwgc2V0ZW50cnkgKiplbnRyeV9wdHIpCiB7CiAJUHlfc3NpemVfdCBpOwotCWludCBtYXNrOworCVB5X3NzaXplX3QgbWFzazsKIAlyZWdpc3RlciBzZXRlbnRyeSAqdGFibGU7CiAKIAlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CkBAIC01MDEsNyArNTAxLDcgQEAKIHNldF9kZWFsbG9jKFB5U2V0T2JqZWN0ICpzbykKIHsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JaW50IGZpbGwgPSBzby0+ZmlsbDsKKwlQeV9zc2l6ZV90IGZpbGwgPSBzby0+ZmlsbDsKIAlQeU9iamVjdF9HQ19VblRyYWNrKHNvKTsKIAlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNvKQogCWlmIChzby0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKQEAgLTU3MCw3ICs1NzAsNyBAQAogc2V0X21lcmdlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyc2V0KQogewogCVB5U2V0T2JqZWN0ICpvdGhlcjsKLQlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBQeV9zc2l6ZV90IGk7CiAJcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwogCiAJYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwpAQCAtNjM3LDcgKzYzNyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3BvcChQeVNldE9iamVjdCAqc28pCiB7Ci0JcmVnaXN0ZXIgaW50IGkgPSAwOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSA9IDA7CiAJcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwogCVB5T2JqZWN0ICprZXk7CiAKQEAgLTY1NSw3ICs2NTUsNyBAQAogCSAqLwogCWVudHJ5ID0gJnNvLT50YWJsZVswXTsKIAlpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKLQkJaSA9IChpbnQpZW50cnktPmhhc2g7CisJCWkgPSBlbnRyeS0+aGFzaDsKIAkJLyogVGhlIGhhc2ggZmllbGQgbWF5IGJlIGEgcmVhbCBoYXNoIHZhbHVlLCBvciBpdCBtYXkgYmUgYQogCQkgKiBsZWdpdCBzZWFyY2ggZmluZ2VyLCBvciBpdCBtYXkgYmUgYSBvbmNlLWxlZ2l0IHNlYXJjaAogCQkgKiBmaW5nZXIgdGhhdCdzIG91dCBvZiBib3VuZHMgbm93IGJlY2F1c2UgaXQgd3JhcHBlZCBhcm91bmQKQEAgLTczMCw5ICs3MzAsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCVB5T2JqZWN0X0hFQUQKIAlQeVNldE9iamVjdCAqc2lfc2V0OyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwotCWludCBzaV91c2VkOwotCWludCBzaV9wb3M7Ci0JbG9uZyBsZW47CisJUHlfc3NpemVfdCBzaV91c2VkOworCVB5X3NzaXplX3Qgc2lfcG9zOworCVB5X3NzaXplX3QgbGVuOwogfSBzZXRpdGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZApAQCAtNzQ1LDcgKzc0NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0aXRlcl9sZW4oc2V0aXRlcm9iamVjdCAqc2kpCiB7Ci0JbG9uZyBsZW4gPSAwOworCVB5X3NzaXplX3QgbGVuID0gMDsKIAlpZiAoc2ktPnNpX3NldCAhPSBOVUxMICYmIHNpLT5zaV91c2VkID09IHNpLT5zaV9zZXQtPnVzZWQpCiAJCWxlbiA9IHNpLT5sZW47CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGxlbik7CkBAIC03NjEsNyArNzYxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqc2V0aXRlcl9pdGVybmV4dChzZXRpdGVyb2JqZWN0ICpzaSkKIHsKIAlQeU9iamVjdCAqa2V5OwotCXJlZ2lzdGVyIGludCBpLCBtYXNrOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAJUHlTZXRPYmplY3QgKnNvID0gc2ktPnNpX3NldDsKIApAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIHN0YXRpYyB2b2lkCiBzZXRfc3dhcF9ib2RpZXMoUHlTZXRPYmplY3QgKmEsIFB5U2V0T2JqZWN0ICpiKQogewotCWludCB0OworCVB5X3NzaXplX3QgdDsKIAlzZXRlbnRyeSAqdTsKIAlzZXRlbnRyeSAqKCpmKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CiAJc2V0ZW50cnkgdGFiW1B5U2V0X01JTlNJWkVdOwpAQCAtMTM4MCwxMiArMTM4MCwxMiBAQAogCXdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgewogCQlpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOwogCQlpZiAocnYgPT0gLTEpIHsKLQkJCVB5X1hERUNSRUYob3RoZXJzZXQpOworCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7CiAJCQlpZiAoc2V0X2FkZF9lbnRyeShzbywgZW50cnkpID09IC0xKSB7Ci0JCQkJUHlfWERFQ1JFRihvdGhlcnNldCk7CisJCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJfQpAQCAtMTc5NSw3ICsxNzk1LDcgQEAKIFB5RG9jX1NUUlZBUihzZXRfZG9jLAogInNldChpdGVyYWJsZSkgLS0+IHNldCBvYmplY3RcblwKIFxuXAotQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24uIik7CitCdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeVNldF9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCkBAIC0xODg5LDcgKzE4ODksNyBAQAogUHlEb2NfU1RSVkFSKGZyb3plbnNldF9kb2MsCiAiZnJvemVuc2V0KGl0ZXJhYmxlKSAtLT4gZnJvemVuc2V0IG9iamVjdFxuXAogXG5cCi1CdWlsZCBhbiBpbW11dGFibGUgdW5vcmRlcmVkIGNvbGxlY3Rpb24uIik7CitCdWlsZCBhbiBpbW11dGFibGUgdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLiIpOwogCiBQeVR5cGVPYmplY3QgUHlGcm96ZW5TZXRfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQpAQCAtMjA2MSw3ICsyMDYxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2NfYXBpKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlpbnQgY291bnQ7CisJUHlfc3NpemVfdCBjb3VudDsKIAljaGFyICpzOwogCVB5X3NzaXplX3QgaTsKIAlQeU9iamVjdCAqZWxlbSwgKmR1cCwgKnQsICpmLCAqZHVwMjsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCmluZGV4IDZhNzYwYTIuLjA4MTljOTggMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zdHJpbmdvYmplY3QuYwpAQCAtMTQ5MCw3ICsxNDkwLDYgQEAKIAkJaiA9IGkrcG9zOwogCQlTUExJVF9BREQocywgaSwgaik7CiAJCWkgPSBqICsgbjsKLQkJCiAJfQogI2Vsc2UKIAlpID0gaiA9IDA7CkBAIC0xNTg2LDcgKzE1ODUsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWkgPSBqID0gbGVuLTE7Ci0JCisKIAl3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKIAkJUlNLSVBfU1BBQ0UocywgaSk7CiAJCWlmIChpPDApIGJyZWFrOwpAQCAtMTc4Niw3ICsxNzg1LDcgQEAKIAkJCXN6ICs9IHNlcGxlbjsKIAkJaWYgKHN6IDwgb2xkX3N6IHx8IHN6ID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJqb2luKCkgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworCQkJCSJqb2luKCkgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKIAkJCVB5X0RFQ1JFRihzZXEpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTI0NjIsMTEgKzI0NjEsMTEgQEAKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudGNoYXIoY2hhciAqdGFyZ2V0LCBpbnQgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQorY291bnRjaGFyKGNvbnN0IGNoYXIgKnRhcmdldCwgaW50IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKIAlQeV9zc2l6ZV90IGNvdW50PTA7Ci0JY2hhciAqc3RhcnQ9dGFyZ2V0OwotCWNoYXIgKmVuZD10YXJnZXQrdGFyZ2V0X2xlbjsKKwljb25zdCBjaGFyICpzdGFydD10YXJnZXQ7CisJY29uc3QgY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOwogCiAJd2hpbGUgKCAoc3RhcnQ9ZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgYykpICE9IE5VTEwgKSB7CiAJCWNvdW50Kys7CkBAIC0yNDc4LDggKzI0NzcsOCBAQAogfQogCiBQeV9MT0NBTChQeV9zc2l6ZV90KQotZmluZHN0cmluZyhjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwKLQkgICBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAorZmluZHN0cmluZyhjb25zdCBjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwKKwkgICBjb25zdCBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAogCSAgIFB5X3NzaXplX3Qgc3RhcnQsCiAJICAgUHlfc3NpemVfdCBlbmQsCiAJICAgaW50IGRpcmVjdGlvbikKQEAgLTI1MTYsOCArMjUxNSw4IEBACiB9CiAKIFB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotY291bnRzdHJpbmcoY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sCi0JICAgIGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCitjb3VudHN0cmluZyhjb25zdCBjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwKKwkgICAgY29uc3QgY2hhciAqcGF0dGVybiwgUHlfc3NpemVfdCBwYXR0ZXJuX2xlbiwKIAkgICAgUHlfc3NpemVfdCBzdGFydCwKIAkgICAgUHlfc3NpemVfdCBlbmQsCiAJICAgIGludCBkaXJlY3Rpb24sIFB5X3NzaXplX3QgbWF4Y291bnQpCkBAIC0yNTcwLDIyICsyNTY5LDIxIEBACiAvKiBsZW4oc2VsZik+PTEsIGZyb209IiIsIGxlbih0byk+PTEsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9pbnRlcmxlYXZlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkgICBQeVN0cmluZ09iamVjdCAqdG8sCisJCSAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAogCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnNlbGZfcywgKnRvX3MsICpyZXN1bHRfczsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCB0b19sZW4sIHJlc3VsdF9sZW47CisJY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisJUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKIAlQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OwogCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKIAlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKLQkKKwogCS8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyICovCiAJY291bnQgPSBzZWxmX2xlbisxOwogCWlmIChtYXhjb3VudCA8IGNvdW50KSAKIAkJY291bnQgPSBtYXhjb3VudDsKLQkKKwogCS8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwogCS8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCiAJcHJvZHVjdCA9IGNvdW50ICogdG9fbGVuOwpAQCAtMjYwNiw4ICsyNjA0LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7Ci0JdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKIAkvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwpAQCAtMjY2OCwyNSArMjY2NCwyNCBAQAogCQlzdGFydCA9IG5leHQrMTsKIAl9CiAJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQkKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KIAogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlTdHJpbmdPYmplY3QgKmZyb20sCityZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlTdHJpbmdPYmplY3QgKnNlbGYsCisJCQkgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAogCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLQljaGFyICpzZWxmX3MsICpmcm9tX3MsICpyZXN1bHRfczsKKwljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKIAljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgZnJvbV9sZW4sIHJlc3VsdF9sZW47CisJUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKIAlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAogCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7Ci0JZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOwogCiAJY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAogCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCkBAIC0yNzAwLDEzICsyNjk1LDEzIEBACiAKIAlyZXN1bHRfbGVuID0gc2VsZl9sZW4gLSAoY291bnQgKiBmcm9tX2xlbik7CiAJYXNzZXJ0IChyZXN1bHRfbGVuPj0wKTsKLQkKKwogCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQogCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKIAkJcmV0dXJuIE5VTEw7Ci0JCisKIAlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCQorCiAJc3RhcnQgPSBzZWxmX3M7CiAJZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CiAJd2hpbGUgKGNvdW50LS0gPiAwKSB7CkBAIC0yNzE2LDkgKzI3MTEsOSBAQAogCQlpZiAob2Zmc2V0ID09IC0xKQogCQkJYnJlYWs7CiAJCW5leHQgPSBzdGFydCArIG9mZnNldDsKLQkJCisKIAkJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0JCQorCiAJCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKIAkJc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwogCX0KQEAgLTI3MzUsMzEgKzI3MzAsMzEgQEAKIAljaGFyICpzZWxmX3MsICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kLCAqbmV4dDsKIAlQeV9zc2l6ZV90IHNlbGZfbGVuOwogCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7Ci0JCisKIAkvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KIAlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAJc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQkKKwogCW5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOwotCQorCiAJaWYgKG5leHQgPT0gTlVMTCkgewogCQkvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwogCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAJfQotCQorCiAJLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwogCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CiAJaWYgKHJlc3VsdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCVB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0JCisKIAkvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwogCXN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKIAkqc3RhcnQgPSB0b19jOwogCXN0YXJ0Kys7CiAJZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQkKKwogCXdoaWxlICgtLW1heGNvdW50ID4gMCkgewogCQluZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKIAkJaWYgKG5leHQgPT0gTlVMTCkKQEAgLTI3NjcsNDAgKzI3NjIsMzUgQEAKIAkJKm5leHQgPSB0b19jOwogCQlzdGFydCA9IG5leHQrMTsKIAl9Ci0JCisKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZShQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJCSAgIFB5U3RyaW5nT2JqZWN0ICpmcm9tLAotCQkJICAgUHlTdHJpbmdPYmplY3QgKnRvLAorCQkJICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorCQkJICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCiAJCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewogCWNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7Ci0JY2hhciAqc2VsZl9zLCAqZnJvbV9zLCAqdG9fczsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCBmcm9tX2xlbiwgb2Zmc2V0OworCWNoYXIgKnNlbGZfczsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKLQkKKwogCS8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotCQorCiAJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JCi0JZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOwotCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7Ci0JdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7Ci0JCisKIAlvZmZzZXQgPSBmaW5kc3RyaW5nKHNlbGZfcywgc2VsZl9sZW4sCiAJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKIAkJCSAgICAwLCBzZWxmX2xlbiwgRk9SV0FSRCk7Ci0JCiAJaWYgKG9mZnNldCA9PSAtMSkgewogCQkvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwogCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAJfQotCQorCiAJLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwogCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CiAJaWYgKHJlc3VsdCA9PSBOVUxMKQpAQCAtMjgwOCwxMyArMjc5OCwxMiBAQAogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKIAotCQogCS8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCiAJc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7CiAJUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7CiAJc3RhcnQgKz0gZnJvbV9sZW47CiAJZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQkKKwogCXdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKIAkJb2Zmc2V0ID0gZmluZHN0cmluZyhzdGFydCwgZW5kLXN0YXJ0LAogCQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLApAQCAtMjgyNCw3ICsyODEzLDcgQEAKIAkJUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwogCQlzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47CiAJfQotCQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjgzMiwyOCArMjgyMSwyNCBAQAogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeVN0cmluZ09iamVjdCAqc2VsZiwKIAkJCSBjaGFyIGZyb21fYywKLQkJCSBQeVN0cmluZ09iamVjdCAqdG8sCisJCQkgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCiAJCQkgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICp0b19zLCAqcmVzdWx0X3M7CisJY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CiAJY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHRvX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwogCVB5X3NzaXplX3QgY291bnQsIHByb2R1Y3Q7CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKLQkKKwogCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKIAlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCQorCiAJY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0JCiAJaWYgKGNvdW50ID09IDApIHsKIAkJLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwogCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAJfQotCQotCXRvX3MgPSBQeVN0cmluZ19BU19TVFJJTkcodG8pOwotCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKLQkKKwogCS8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KIAkvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KIAlwcm9kdWN0ID0gY291bnQgKiAodG9fbGVuLTEpOwpAQCAtMjg2NiwxOSArMjg1MSwxOSBAQAogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQkKKwogCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQogCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCQorCiAJc3RhcnQgPSBzZWxmX3M7CiAJZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CiAJd2hpbGUgKGNvdW50LS0gPiAwKSB7CiAJCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwogCQlpZiAobmV4dCA9PSBOVUxMKSAKIAkJCWJyZWFrOwotCQkKKwogCQlpZiAobmV4dCA9PSBzdGFydCkgewogCQkJLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCiAJCQlQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CkBAIC0yODk1LDI3ICsyODgwLDI1IEBACiAJfQogCS8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwogCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0JCisKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3N1YnN0cmluZyhQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJICBQeVN0cmluZ09iamVjdCAqZnJvbSwKLQkJICBQeVN0cmluZ09iamVjdCAqdG8sCisJCSAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorCQkgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAogCQkgIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLQljaGFyICpzZWxmX3MsICpmcm9tX3MsICp0b19zLCAqcmVzdWx0X3M7CisJY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CiAJY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIGZyb21fbGVuLCB0b19sZW4sIHJlc3VsdF9sZW47CisJUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKIAlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQsIHByb2R1Y3Q7CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKLQkKKwogCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKIAlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCWZyb21fcyA9IFB5U3RyaW5nX0FTX1NUUklORyhmcm9tKTsKLQlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOwotCQorCiAJY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAogCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCiAJCQkgICAgMCwgc2VsZl9sZW4sIEZPUldBUkQsIG1heGNvdW50KTsKQEAgLTI5MjMsMTAgKzI5MDYsNyBAQAogCQkvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCiAJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKIAl9Ci0JCi0JdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7Ci0JdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwotCQorCiAJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCiAJLyogICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKSAqLwogCXByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pOwpAQCAtMjkzOSwxMiArMjkxOSwxMiBAQAogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQkKKwogCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQogCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCQorCiAJc3RhcnQgPSBzZWxmX3M7CiAJZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CiAJd2hpbGUgKGNvdW50LS0gPiAwKSB7CkBAIC0yOTcwLDI5ICsyOTUwLDI0IEBACiAJfQogCS8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwogCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0JCisKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAKIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCVB5U3RyaW5nT2JqZWN0ICpmcm9tLAotCVB5U3RyaW5nT2JqZWN0ICp0bywKKwljb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisJY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCiAJUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQlQeV9zc2l6ZV90IGZyb21fbGVuLCB0b19sZW47Ci0JCiAJaWYgKG1heGNvdW50IDwgMCkgewogCQltYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwogCX0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKSB7CiAJCS8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCiAJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKIAl9Ci0JCi0JZnJvbV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShmcm9tKTsKLQl0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7Ci0JCisKIAlpZiAobWF4Y291bnQgPT0gMCB8fAogCSAgICAoZnJvbV9sZW4gPT0gMCAmJiB0b19sZW4gPT0gMCkpIHsKIAkJLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KQEAgLTMwMDAsMTIgKzI5NzUsMTIgQEAKIAl9CiAKIAkvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLwotCQorCiAJaWYgKGZyb21fbGVuID09IDApIHsKIAkJLyogaW5zZXJ0IHRoZSAndG8nIHN0cmluZyBldmVyeXdoZXJlLiAgICovCiAJCS8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLwogCQkvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KLQkJcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0bywgbWF4Y291bnQpOworCQlyZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwogCX0KIAogCS8qIEV4Y2VwdCBmb3IgIiIucmVwbGFjZSgiIiwgIkEiKSA9PSAiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCkBAIC0zMDE5LDkgKzI5OTQsOSBAQAogCQkvKiBkZWxldGUgYWxsIG9jY3VyYW5jZXMgb2YgJ2Zyb20nIHN0cmluZyAqLwogCQlpZiAoZnJvbV9sZW4gPT0gMSkgewogCQkJcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCi0JCQkJc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pWzBdLCBtYXhjb3VudCk7CisJCQkJc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7CiAJCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb20sIG1heGNvdW50KTsKKwkJCXJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgbWF4Y291bnQpOwogCQl9CiAJfQogCkBAIC0zMDMxLDIyICszMDA2LDIyIEBACiAJCWlmIChmcm9tX2xlbiA9PSAxKSB7CiAJCQlyZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAogCQkJCXNlbGYsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pWzBdLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyh0bylbMF0sCisJCQkJZnJvbV9zWzBdLAorCQkJCXRvX3NbMF0sCiAJCQkJbWF4Y291bnQpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAotCQkJCXNlbGYsIGZyb20sIHRvLCBtYXhjb3VudCk7CisJCQkJc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CiAJCX0KIAl9CiAKIAkvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLwogCWlmIChmcm9tX2xlbiA9PSAxKSB7Ci0JCXJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pWzBdLAotCQkJCQkJdG8sIG1heGNvdW50KTsKKwkJcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBmcm9tX3NbMF0sCisJCQkJCQl0b19zLCB0b19sZW4sIG1heGNvdW50KTsKIAl9IGVsc2UgewogCQkvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCi0JCXJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tLCB0bywgbWF4Y291bnQpOworCQlyZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CiAJfQogfQogCkBAIC0zMDYyLDg5ICszMDM3LDEyNyBAQAogewogCVB5X3NzaXplX3QgY291bnQgPSAtMTsKIAlQeU9iamVjdCAqZnJvbSwgKnRvOwotCWNvbnN0IGNoYXIgKnRtcF9zOwotCVB5X3NzaXplX3QgdG1wX2xlbjsKKwljb25zdCBjaGFyICpmcm9tX3MsICp0b19zOworCVB5X3NzaXplX3QgZnJvbV9sZW4sIHRvX2xlbjsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwgJmZyb20sICZ0bywgJmNvdW50KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoUHlTdHJpbmdfQ2hlY2soZnJvbSkpIHsKLQkgIC8qIENhbiB0aGlzIGJlIG1hZGUgYSAnIWNoZWNrJyBhZnRlciB0aGUgVW5pY29kZSBjaGVjaz8gKi8KKwkJZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOworCQlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOwogCX0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJaWYgKFB5VW5pY29kZV9DaGVjayhmcm9tKSkKIAkJcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCiAJCQkJCSBmcm9tLCB0bywgY291bnQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGZyb20sICZ0bXBfcywgJnRtcF9sZW4pKQorCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihmcm9tLCAmZnJvbV9zLCAmZnJvbV9sZW4pKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChQeVN0cmluZ19DaGVjayh0bykpIHsKLQkgIC8qIENhbiB0aGlzIGJlIG1hZGUgYSAnIWNoZWNrJyBhZnRlciB0aGUgVW5pY29kZSBjaGVjaz8gKi8KKwkJdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7CisJCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKIAl9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0bykpCiAJCXJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAogCQkJCQkgZnJvbSwgdG8sIGNvdW50KTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih0bywgJnRtcF9zLCAmdG1wX2xlbikpCisJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRvLCAmdG9fcywgJnRvX2xlbikpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5U3RyaW5nT2JqZWN0ICopIHNlbGYsCi0JCQkJICAgKFB5U3RyaW5nT2JqZWN0ICopIGZyb20sCi0JCQkJICAgKFB5U3RyaW5nT2JqZWN0ICopIHRvLCBjb3VudCk7CisJCQkJICAgZnJvbV9zLCBmcm9tX2xlbiwKKwkJCQkgICB0b19zLCB0b19sZW4sIGNvdW50KTsKIH0KIAogLyoqIEVuZCBEQUxLRSAqKi8KIAorLyogTWF0Y2hlcyB0aGUgZW5kIChkaXJlY3Rpb24gPj0gMCkgb3Igc3RhcnQgKGRpcmVjdGlvbiA8IDApIG9mIHNlbGYKKyAqIGFnYWluc3Qgc3Vic3RyLCB1c2luZyB0aGUgc3RhcnQgYW5kIGVuZCBhcmd1bWVudHMuIFJldHVybnMKKyAqIC0xIG9uIGVycm9yLCAwIGlmIG5vdCBmb3VuZCBhbmQgMSBpZiBmb3VuZC4KKyAqLworUHlfTE9DQUwoaW50KQorX3N0cmluZ190YWlsbWF0Y2goUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzdWJzdHIsIFB5X3NzaXplX3Qgc3RhcnQsCisJCSAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCit7CisJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKwlQeV9zc2l6ZV90IHNsZW47CisJY29uc3QgY2hhciogc3ViOworCWNvbnN0IGNoYXIqIHN0cjsKKworCWlmIChQeVN0cmluZ19DaGVjayhzdWJzdHIpKSB7CisJCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJzdHIpOworCQlzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vic3RyKTsKKwl9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHIpKQorCQlyZXR1cm4gUHlVbmljb2RlX1RhaWxtYXRjaCgoUHlPYmplY3QgKilzZWxmLAorCQkJCQkgICBzdWJzdHIsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CisjZW5kaWYKKwllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vic3RyLCAmc3ViLCAmc2xlbikpCisJCXJldHVybiAtMTsKKwlzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisKKwlzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBsZW4pOworCisJaWYgKGRpcmVjdGlvbiA8IDApIHsKKwkJLyogc3RhcnRzd2l0aCAqLworCQlpZiAoc3RhcnQrc2xlbiA+IGxlbikKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIGVuZHN3aXRoICovCisJCWlmIChlbmQtc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGVuZC1zbGVuID4gc3RhcnQpCisJCQlzdGFydCA9IGVuZCAtIHNsZW47CisJfQorCWlmIChlbmQtc3RhcnQgPj0gc2xlbikKKwkJcmV0dXJuICEgbWVtY21wKHN0citzdGFydCwgc3ViLCBzbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCiBQeURvY19TVFJWQVIoc3RhcnRzd2l0aF9fZG9jX18sCiAiUy5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKIFxuXAogUmV0dXJuIFRydWUgaWYgUyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAogV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi4iKTsKK1dpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXG5cCitwcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zdGFydHN3aXRoKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCBjaGFyKiBzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQljb25zdCBjaGFyKiBwcmVmaXg7Ci0JUHlfc3NpemVfdCBwbGVuOwogCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwogCVB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlPYmplY3QgKnN1Ym9iajsKKwlpbnQgcmVzdWx0OwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJvYmosCiAJCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewotCQlwcmVmaXggPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisJaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworCQlQeV9zc2l6ZV90IGk7CisJCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworCQkJcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwKKwkJCQkJUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAorCQkJCQlzdGFydCwgZW5kLCAtMSk7CisJCQlpZiAocmVzdWx0ID09IC0xKQorCQkJCXJldHVybiBOVUxMOworCQkJZWxzZSBpZiAocmVzdWx0KSB7CisJCQkJUHlfUkVUVVJOX1RSVUU7CisJCQl9CisJCX0KKwkJUHlfUkVUVVJOX0ZBTFNFOwogCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpIHsKLQkgICAgCVB5X3NzaXplX3QgcmM7Ci0JCXJjID0gUHlVbmljb2RlX1RhaWxtYXRjaCgoUHlPYmplY3QgKilzZWxmLAotCQkJCQkgIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwotCQlpZiAocmMgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZQotCQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykgcmMpOwotCX0KLSNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZwcmVmaXgsICZwbGVuKSkKKwlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKKwlpZiAocmVzdWx0ID09IC0xKQogCQlyZXR1cm4gTlVMTDsKLQotCXN0cmluZ19hZGp1c3RfaW5kaWNlcygmc3RhcnQsICZlbmQsIGxlbik7Ci0KLQlpZiAoc3RhcnQrcGxlbiA+IGxlbikKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQotCWlmIChlbmQtc3RhcnQgPj0gcGxlbikKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyghbWVtY21wKHN0citzdGFydCwgcHJlZml4LCBwbGVuKSk7CiAJZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIApAQCAtMzE1Myw1MSArMzE2NiwzOSBAQAogXG5cCiBSZXR1cm4gVHJ1ZSBpZiBTIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAogV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi4iKTsKK1dpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXG5cCitzdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19lbmRzd2l0aChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY29uc3QgY2hhciogc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JY29uc3QgY2hhciogc3VmZml4OwotCVB5X3NzaXplX3Qgc2xlbjsKIAlQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKIAlQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCVB5T2JqZWN0ICpzdWJvYmo7CisJaW50IHJlc3VsdDsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmVuZHN3aXRoIiwgJnN1Ym9iaiwKIAkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCiAJCXJldHVybiBOVUxMOwotCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7Ci0JCXN1ZmZpeCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOwotCQlzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKwlpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisJCVB5X3NzaXplX3QgaTsKKwkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisJCQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAorCQkJCQlQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCisJCQkJCXN0YXJ0LCBlbmQsICsxKTsKKwkJCWlmIChyZXN1bHQgPT0gLTEpCisJCQkJcmV0dXJuIE5VTEw7CisJCQllbHNlIGlmIChyZXN1bHQpIHsKKwkJCQlQeV9SRVRVUk5fVFJVRTsKKwkJCX0KKwkJfQorCQlQeV9SRVRVUk5fRkFMU0U7CiAJfQotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkgewotCSAgICAJUHlfc3NpemVfdCByYzsKLQkJcmMgPSBQeVVuaWNvZGVfVGFpbG1hdGNoKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSAgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0JCWlmIChyYyA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKSByYyk7Ci0JfQotI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnN1ZmZpeCwgJnNsZW4pKQorCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOworCWlmIChyZXN1bHQgPT0gLTEpCiAJCXJldHVybiBOVUxMOwotCi0Jc3RyaW5nX2FkanVzdF9pbmRpY2VzKCZzdGFydCwgJmVuZCwgbGVuKTsKLQotCWlmIChlbmQtc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwotCi0JaWYgKGVuZC1zbGVuID4gc3RhcnQpCi0JCXN0YXJ0ID0gZW5kIC0gc2xlbjsKLQlpZiAoZW5kLXN0YXJ0ID49IHNsZW4pCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoIW1lbWNtcChzdHIrc3RhcnQsIHN1ZmZpeCwgc2xlbikpOwogCWVsc2UKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKwkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvdHlwZW9iamVjdC5jIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKaW5kZXggYzhiYzYxZC4uMWVjMzQ1ZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy90eXBlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKQEAgLTE0NjYsOCArMTQ2Niw5IEBACiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKHZhbHVlICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5Iik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnksICIKKwkJCSAgICAgIm5vdCBhICclLjIwMHMnIiwgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCWRpY3QgPSAqZGljdHB0cjsKQEAgLTE0ODUsNyArMTQ4Niw3IEBACiAKIAlpZiAob2JqLT5vYl90eXBlLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiVGhpcyBvYmplY3QgaGFzIG5vIF9fd2Vha2xpc3RfXyIpOworCQkJCSJUaGlzIG9iamVjdCBoYXMgbm8gX193ZWFrcmVmX18iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWFzc2VydChvYmotPm9iX3R5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ID4gMCk7CkBAIC0xNTMwLDggKzE1MzEsOSBAQAogCVB5X3NzaXplX3QgaSwgbjsKIAogCWlmICghUHlTdHJpbmdfQ2hlY2socykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19zbG90c19fIG11c3QgYmUgc3RyaW5ncyIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJICAgICAiX19zbG90c19fIGl0ZW1zIG11c3QgYmUgc3RyaW5ncywgbm90ICclLjIwMHMnIiwKKwkJCSAgICAgcy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KIAlwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHMpOwpAQCAtMjU2NSw4ICsyNTY3LDkgQEAKIAkJYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0bmV3YXJncywgTlVMTCk7CiAJCVB5X0RFQ1JFRihnZXRuZXdhcmdzKTsKIAkJaWYgKGFyZ3MgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19nZXRuZXdhcmdzX18gc2hvdWxkIHJldHVybiBhIHR1cGxlIik7CisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJfX2dldG5ld2FyZ3NfXyBzaG91bGQgcmV0dXJuIGEgdHVwbGUsICIKKwkJCQkibm90ICclLjIwMHMnIiwgYXJncy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCQlnb3RvIGVuZDsKIAkJfQogCX0KQEAgLTMyMDYsNiArMzIwOSw4IEBACiAJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIikgPT0gTlVMTCkgewogCQlpZiAodHlwZS0+dHBfZG9jICE9IE5VTEwpIHsKIAkJCVB5T2JqZWN0ICpkb2MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7CisJCQlpZiAoZG9jID09IE5VTEwpCisJCQkJZ290byBlcnJvcjsKIAkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIiwgZG9jKTsKIAkJCVB5X0RFQ1JFRihkb2MpOwogCQl9IGVsc2UgewpAQCAtNDI5NCw4ICs0Mjk5LDkgQEAKIAkJcmVzdWx0ID0gdGVtcC0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleCh0ZW1wKTsKIAl9CiAJZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJCSJfX2luZGV4X18gbXVzdCByZXR1cm4gYW4gaW50IG9yIGEgbG9uZyIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKKwkJCSAgICAgIl9faW5kZXhfXyBtdXN0IHJldHVybiBhbiBpbnQgb3IgYSBsb25nLCAiCisJCQkgICAgICJub3QgJyUuMjAwcyciLCB0ZW1wLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJcmVzdWx0ID0gLTE7CiAJfQogCVB5X0RFQ1JFRih0ZW1wKTsKQEAgLTQ0OTQsNyArNDUwMCwxMCBAQAogCQlQeV9ERUNSRUYoZnVuYyk7CiAJCWlmIChyZXMgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKLQkJaCA9IFB5SW50X0FzTG9uZyhyZXMpOworCQlpZiAoUHlMb25nX0NoZWNrKHJlcykpCisJCQloID0gUHlMb25nX1R5cGUudHBfaGFzaChyZXMpOworCQllbHNlCisJCQloID0gUHlJbnRfQXNMb25nKHJlcyk7CiAJCVB5X0RFQ1JFRihyZXMpOwogCX0KIAllbHNlIHsKQEAgLTQ1MDUsOCArNDUxNCw5IEBACiAJCQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jbXBfXyIsICZjbXBfc3RyKTsKIAkJfQogCQlpZiAoZnVuYyAhPSBOVUxMKSB7CisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlOiAnJS4yMDBzJyIsCisJCQkJICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGUiKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlQeUVycl9DbGVhcigpOwpAQCAtNDUyNiw3ICs0NTM2LDE4IEBACiAKIAlpZiAobWV0aCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKKworCS8qIFB5T2JqZWN0X0NhbGwoKSB3aWxsIGVuZCB1cCBjYWxsaW5nIHNsb3RfdHBfY2FsbCgpIGFnYWluIGlmCisJICAgdGhlIG9iamVjdCByZXR1cm5lZCBmb3IgX19jYWxsX18gaGFzIF9fY2FsbF9fIGl0c2VsZiBkZWZpbmVkCisJICAgdXBvbiBpdC4gIFRoaXMgY2FuIGJlIGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiB5b3Ugc2V0CisJICAgX19jYWxsX18gaW4gYSBjbGFzcyB0byBhbiBpbnN0YW5jZSBvZiBpdC4gKi8KKwlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19jYWxsX18iKSkgeworCQlQeV9ERUNSRUYobWV0aCk7CisJCXJldHVybiBOVUxMOworCX0KIAlyZXMgPSBQeU9iamVjdF9DYWxsKG1ldGgsIGFyZ3MsIGt3ZHMpOworCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworCiAJUHlfREVDUkVGKG1ldGgpOwogCXJldHVybiByZXM7CiB9CkBAIC00NjgzLDggKzQ3MDQsOSBAQAogCVB5RXJyX0NsZWFyKCk7CiAJZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZ2V0aXRlbV9fIiwgJmdldGl0ZW1fc3RyKTsKIAlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZSIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIsCisJCQkgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJUHlfREVDUkVGKGZ1bmMpOwpAQCAtNDc1Nyw4ICs0Nzc5LDkgQEAKIAlpZiAocmVzID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlpZiAocmVzICE9IFB5X05vbmUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJICAgICAiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCAnJS4yMDBzJyIsCisJCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCVB5X0RFQ1JFRihyZXMpOwogCQlyZXR1cm4gLTE7CiAJfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCBjM2FiMmQ4Li45ZTM1YjYxIDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtMjgyMCw2NSArMjgyMCwxOTkgQEAKIAogLyogLS0tIE1CQ1MgY29kZWNzIGZvciBXaW5kb3dzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNpZiBTSVpFT0ZfSU5UIDwgU0laRU9GX1NTSVpFX1QKKyNkZWZpbmUgTkVFRF9SRVRSWQorI2VuZGlmCisKKy8qIFhYWCBUaGlzIGNvZGUgaXMgbGltaXRlZCB0byAidHJ1ZSIgZG91YmxlLWJ5dGUgZW5jb2RpbmdzLCBhcworICAgYSkgaXQgYXNzdW1lcyBhbiBpbmNvbXBsZXRlIGNoYXJhY3RlciBjb25zaXN0cyBvZiBhIHNpbmdsZSBieXRlLCBhbmQKKyAgIGIpIElzREJDU0xlYWRCeXRlIChwcm9iYWJseSkgZG9lcyBub3Qgd29yayBmb3Igbm9uLURCQ1MgbXVsdGktYnl0ZQorICAgICAgZW5jb2RpbmdzLCBzZWUgSXNEQkNTTGVhZEJ5dGVFeCBkb2N1bWVudGF0aW9uLiAqLworCitzdGF0aWMgaW50IGlzX2RiY3NfbGVhZF9ieXRlKGNvbnN0IGNoYXIgKnMsIGludCBvZmZzZXQpCit7CisgICAgY29uc3QgY2hhciAqY3VyciA9IHMgKyBvZmZzZXQ7CisKKyAgICBpZiAoSXNEQkNTTGVhZEJ5dGUoKmN1cnIpKSB7CisJY29uc3QgY2hhciAqcHJldiA9IENoYXJQcmV2KHMsIGN1cnIpOworCXJldHVybiAocHJldiA9PSBjdXJyKSB8fCAhSXNEQkNTTGVhZEJ5dGUoKnByZXYpIHx8IChjdXJyIC0gcHJldiA9PSAyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgTUJDUyBzdHJpbmcgaW50byB1bmljb2RlIG9iamVjdC4gSWYgJ2ZpbmFsJyBpcyBzZXQsIGNvbnZlcnRzCisgKiB0cmFpbGluZyBsZWFkLWJ5dGUgdG9vLiBSZXR1cm5zIGNvbnN1bWVkIHNpemUgaWYgc3VjY2VlZCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGRlY29kZV9tYmNzKFB5VW5pY29kZU9iamVjdCAqKnYsCisJCQljb25zdCBjaGFyICpzLCAvKiBNQkNTIHN0cmluZyAqLworCQkJaW50IHNpemUsIC8qIHNpemVvZiBNQkNTIHN0cmluZyAqLworCQkJaW50IGZpbmFsKQoreworICAgIFB5X1VOSUNPREUgKnA7CisgICAgUHlfc3NpemVfdCBuID0gMDsKKyAgICBpbnQgdXNpemUgPSAwOworCisgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisKKyAgICAvKiBTa2lwIHRyYWlsaW5nIGxlYWQtYnl0ZSB1bmxlc3MgJ2ZpbmFsJyBpcyBzZXQgKi8KKyAgICBpZiAoIWZpbmFsICYmIHNpemUgPj0gMSAmJiBpc19kYmNzX2xlYWRfYnl0ZShzLCBzaXplIC0gMSkpCisJLS1zaXplOworCisgICAgLyogRmlyc3QgZ2V0IHRoZSBzaXplIG9mIHRoZSByZXN1bHQgKi8KKyAgICBpZiAoc2l6ZSA+IDApIHsKKwl1c2l6ZSA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzLCBzaXplLCBOVUxMLCAwKTsKKwlpZiAodXNpemUgPT0gMCkgeworCSAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICBpZiAoKnYgPT0gTlVMTCkgeworCS8qIENyZWF0ZSB1bmljb2RlIG9iamVjdCAqLworCSp2ID0gX1B5VW5pY29kZV9OZXcodXNpemUpOworCWlmICgqdiA9PSBOVUxMKQorCSAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworCS8qIEV4dGVuZCB1bmljb2RlIG9iamVjdCAqLworCW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoKnYpOworCWlmIChfUHlVbmljb2RlX1Jlc2l6ZSh2LCBuICsgdXNpemUpIDwgMCkKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIERvIHRoZSBjb252ZXJzaW9uICovCisgICAgaWYgKHNpemUgPiAwKSB7CisJcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKCp2KSArIG47CisJaWYgKDAgPT0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHMsIHNpemUsIHAsIHVzaXplKSkgeworCSAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworUHlPYmplY3QgKlB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwoY29uc3QgY2hhciAqcywKKwkJCQkJUHlfc3NpemVfdCBzaXplLAorCQkJCQljb25zdCBjaGFyICplcnJvcnMsCisJCQkJCVB5X3NzaXplX3QgKmNvbnN1bWVkKQoreworICAgIFB5VW5pY29kZU9iamVjdCAqdiA9IE5VTEw7CisgICAgaW50IGRvbmU7CisKKyAgICBpZiAoY29uc3VtZWQpCisJKmNvbnN1bWVkID0gMDsKKworI2lmZGVmIE5FRURfUkVUUlkKKyAgcmV0cnk6CisgICAgaWYgKHNpemUgPiBJTlRfTUFYKQorCWRvbmUgPSBkZWNvZGVfbWJjcygmdiwgcywgSU5UX01BWCwgMCk7CisgICAgZWxzZQorI2VuZGlmCisJZG9uZSA9IGRlY29kZV9tYmNzKCZ2LCBzLCAoaW50KXNpemUsICFjb25zdW1lZCk7CisKKyAgICBpZiAoZG9uZSA8IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY29uc3VtZWQpCisJKmNvbnN1bWVkICs9IGRvbmU7CisKKyNpZmRlZiBORUVEX1JFVFJZCisgICAgaWYgKHNpemUgPiBJTlRfTUFYKSB7CisJcyArPSBkb25lOworCXNpemUgLT0gZG9uZTsKKwlnb3RvIHJldHJ5OworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7Cit9CisKIFB5T2JqZWN0ICpQeVVuaWNvZGVfRGVjb2RlTUJDUyhjb25zdCBjaGFyICpzLAogCQkJCVB5X3NzaXplX3Qgc2l6ZSwKIAkJCQljb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlVbmljb2RlT2JqZWN0ICp2OwotICAgIFB5X1VOSUNPREUgKnA7Ci0gICAgRFdPUkQgdXNpemU7CisgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwocywgc2l6ZSwgZXJyb3JzLCBOVUxMKTsKK30KKworLyoKKyAqIENvbnZlcnQgdW5pY29kZSBpbnRvIHN0cmluZyBvYmplY3QgKE1CQ1MpLgorICogUmV0dXJucyAwIGlmIHN1Y2NlZWQsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBlbmNvZGVfbWJjcyhQeU9iamVjdCAqKnJlcHIsCisJCQljb25zdCBQeV9VTklDT0RFICpwLCAvKiB1bmljb2RlICovCisJCQlpbnQgc2l6ZSkgLyogc2l6ZSBvZiB1bmljb2RlICovCit7CisgICAgaW50IG1iY3NzaXplID0gMDsKKyAgICBQeV9zc2l6ZV90IG4gPSAwOworCisgICAgYXNzZXJ0KHNpemUgPj0gMCk7CiAKICAgICAvKiBGaXJzdCBnZXQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdCAqLwotICAgIGFzc2VydChzaXplIDwgSU5UX01BWCk7Ci0gICAgdXNpemUgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgcywgKGludClzaXplLCBOVUxMLCAwKTsKLSAgICBpZiAoc2l6ZSA+IDAgJiYgdXNpemU9PTApCi0gICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKLQotICAgIHYgPSBfUHlVbmljb2RlX05ldyh1c2l6ZSk7Ci0gICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHVzaXplID09IDApCi0JcmV0dXJuIChQeU9iamVjdCAqKXY7Ci0gICAgcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHYpOwotICAgIGlmICgwID09IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzLCAoaW50KXNpemUsIHAsIHVzaXplKSkgewotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKwltYmNzc2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBwLCBzaXplLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAobWJjc3NpemUgPT0gMCkgeworCSAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKKwkgICAgcmV0dXJuIC0xOworCX0KICAgICB9CiAKLSAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICBpZiAoKnJlcHIgPT0gTlVMTCkgeworCS8qIENyZWF0ZSBzdHJpbmcgb2JqZWN0ICovCisJKnJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBtYmNzc2l6ZSk7CisJaWYgKCpyZXByID09IE5VTEwpCisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisJLyogRXh0ZW5kIHN0cmluZyBvYmplY3QgKi8KKwluID0gUHlTdHJpbmdfU2l6ZSgqcmVwcik7CisJaWYgKF9QeVN0cmluZ19SZXNpemUocmVwciwgbiArIG1iY3NzaXplKSA8IDApCisJICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBEbyB0aGUgY29udmVyc2lvbiAqLworICAgIGlmIChzaXplID4gMCkgeworCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoKnJlcHIpICsgbjsKKwlpZiAoMCA9PSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgcCwgc2l6ZSwgcywgbWJjc3NpemUsIE5VTEwsIE5VTEwpKSB7CisJICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqUHlVbmljb2RlX0VuY29kZU1CQ1MoY29uc3QgUHlfVU5JQ09ERSAqcCwKIAkJCQlQeV9zc2l6ZV90IHNpemUsCiAJCQkJY29uc3QgY2hhciAqZXJyb3JzKQogewotICAgIFB5T2JqZWN0ICpyZXByOwotICAgIGNoYXIgKnM7Ci0gICAgRFdPUkQgbWJjc3NpemU7CisgICAgUHlPYmplY3QgKnJlcHIgPSBOVUxMOworICAgIGludCByZXQ7CiAKLSAgICAvKiBJZiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycywgYmFpbCBub3chICovCi0gICAgaWYgKHNpemU9PTApCi0JICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyNpZmRlZiBORUVEX1JFVFJZCisgcmV0cnk6CisgICAgaWYgKHNpemUgPiBJTlRfTUFYKQorCXJldCA9IGVuY29kZV9tYmNzKCZyZXByLCBwLCBJTlRfTUFYKTsKKyAgICBlbHNlCisjZW5kaWYKKwlyZXQgPSBlbmNvZGVfbWJjcygmcmVwciwgcCwgKGludClzaXplKTsKIAotICAgIC8qIEZpcnN0IGdldCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0ICovCi0gICAgYXNzZXJ0KHNpemU8SU5UX01BWCk7Ci0gICAgbWJjc3NpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgcCwgKGludClzaXplLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAobWJjc3NpemU9PTApCi0gICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgwLCBOVUxMKTsKLQotICAgIHJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBtYmNzc2l6ZSk7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKG1iY3NzaXplID09IDApCi0gICAgICAgIHJldHVybiByZXByOwotCi0gICAgLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KLSAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpOwotICAgIGFzc2VydChzaXplIDwgSU5UX01BWCk7Ci0gICAgaWYgKDAgPT0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHAsIChpbnQpc2l6ZSwgcywgbWJjc3NpemUsIE5VTEwsIE5VTEwpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXByKTsKLSAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisJUHlfWERFQ1JFRihyZXByKTsKKwlyZXR1cm4gTlVMTDsKICAgICB9CisKKyNpZmRlZiBORUVEX1JFVFJZCisgICAgaWYgKHNpemUgPiBJTlRfTUFYKSB7CisJcCArPSBJTlRfTUFYOworCXNpemUgLT0gSU5UX01BWDsKKwlnb3RvIHJldHJ5OworICAgIH0KKyNlbmRpZgorCiAgICAgcmV0dXJuIHJlcHI7CiB9CiAKQEAgLTI4OTMsNiArMzAyNyw4IEBACiAJCQkJTlVMTCk7CiB9CiAKKyN1bmRlZiBORUVEX1JFVFJZCisKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKIC8qIC0tLSBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDQ5MSwxMSArNDYyNywxMSBAQAogICAgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBpdGVtLiAqLwogCWl0ZW1sZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoaXRlbSk7CiAJbmV3X3Jlc191c2VkID0gcmVzX3VzZWQgKyBpdGVtbGVuOwotCWlmIChuZXdfcmVzX3VzZWQgPD0gMCkKKwlpZiAobmV3X3Jlc191c2VkIDwgMCkKIAkgICAgZ290byBPdmVyZmxvdzsKIAlpZiAoaSA8IHNlcWxlbiAtIDEpIHsKIAkgICAgbmV3X3Jlc191c2VkICs9IHNlcGxlbjsKLQkgICAgaWYgKG5ld19yZXNfdXNlZCA8PSAwKQorCSAgICBpZiAobmV3X3Jlc191c2VkIDwgMCkKIAkJZ290byBPdmVyZmxvdzsKIAl9CiAJaWYgKG5ld19yZXNfdXNlZCA+IHJlc19hbGxvYykgewpAQCAtNDUzNiw3ICs0NjcyLDcgQEAKIAogIE92ZXJmbG93OgogICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAiam9pbigpIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgImpvaW4oKSByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwogICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAvKiBmYWxsIHRocm91Z2ggKi8KIApAQCAtNjY2NywyOSArNjgwMyw0NCBAQAogXG5cCiBSZXR1cm4gVHJ1ZSBpZiBTIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCiBXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLiIpOworV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3ByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9zdGFydHN3aXRoKFB5VW5pY29kZU9iamVjdCAqc2VsZiwKIAkJICAgUHlPYmplY3QgKmFyZ3MpCiB7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnN0YXJ0c3dpdGgiLCAmc3Vic3RyaW5nLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnN0YXJ0c3dpdGgiLCAmc3Vib2JqLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKIAlyZXR1cm4gTlVMTDsKLSAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3QoCi0JCQkJCQkoUHlPYmplY3QgKilzdWJzdHJpbmcpOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKKyAgICAgICAgICAgIHN1YnN0cmluZyA9IChQeVVuaWNvZGVPYmplY3QgKilQeVVuaWNvZGVfRnJvbU9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSkpOworICAgICAgICAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm90aGluZyBtYXRjaGVkICovCisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7CiAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKSk7Ci0KKyAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogCkBAIC02Njk4LDI5ICs2ODQ5LDQ0IEBACiBcblwKIFJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCiBXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLiIpOworV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3N1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9lbmRzd2l0aChQeVVuaWNvZGVPYmplY3QgKnNlbGYsCiAJCSBQeU9iamVjdCAqYXJncykKIHsKKyAgICBQeU9iamVjdCAqc3Vib2JqOwogICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZW5kc3dpdGgiLCAmc3Vic3RyaW5nLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJvYmosCisgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQogCXJldHVybiBOVUxMOwotICAgIHN1YnN0cmluZyA9IChQeVVuaWNvZGVPYmplY3QgKilQeVVuaWNvZGVfRnJvbU9iamVjdCgKLQkJCQkJCShQeU9iamVjdCAqKXN1YnN0cmluZyk7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworICAgICAgICAgICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSk7CisgICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7CiAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCi0gICAgcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKSk7Ci0KKyAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCArMSk7CiAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIApAQCAtNzc0OCw2ICs3OTE0LDkgQEAKICAgICB1bmljb2RlX2ZyZWVsaXN0ID0gTlVMTDsKICAgICB1bmljb2RlX2ZyZWVsaXN0X3NpemUgPSAwOwogICAgIHVuaWNvZGVfZW1wdHkgPSBfUHlVbmljb2RlX05ldygwKTsKKyAgICBpZiAoIXVuaWNvZGVfZW1wdHkpCisJcmV0dXJuOworCiAgICAgc3RyY3B5KHVuaWNvZGVfZGVmYXVsdF9lbmNvZGluZywgImFzY2lpIik7CiAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQogCXVuaWNvZGVfbGF0aW4xW2ldID0gTlVMTDsKQEAgLTc3NTgsNiArNzkyNyw4IEBACiAgICAgYmxvb21fbGluZWJyZWFrID0gbWFrZV9ibG9vbV9tYXNrKAogICAgICAgICBsaW5lYnJlYWssIHNpemVvZihsaW5lYnJlYWspIC8gc2l6ZW9mKGxpbmVicmVha1swXSkKICAgICAgICAgKTsKKworICAgIFB5VHlwZV9SZWFkeSgmRW5jb2RpbmdNYXBUeXBlKTsKIH0KIAogLyogRmluYWxpemUgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jIGIvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKaW5kZXggYzU1ZGQ0Yy4uZjgxNDMwNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKKysrIGIvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKQEAgLTYsMTAgKzYsMTAgQEAKICAgICAgICAgKChQeVdlYWtSZWZlcmVuY2UgKiopIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG8pKQogCiAKLWxvbmcKK1B5X3NzaXplX3QKIF9QeVdlYWtyZWZfR2V0V2Vha3JlZkNvdW50KFB5V2Vha1JlZmVyZW5jZSAqaGVhZCkKIHsKLSAgICBsb25nIGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKIAogICAgIHdoaWxlIChoZWFkICE9IE5VTEwpIHsKICAgICAgICAgKytjb3VudDsKZGlmZiAtLWdpdCBhL1BDL193aW5yZWcuYyBiL1BDL193aW5yZWcuYwppbmRleCA1ZWQ1OGJiLi41ZWQzZjZjIDEwMDY0NAotLS0gYS9QQy9fd2lucmVnLmMKKysrIGIvUEMvX3dpbnJlZy5jCkBAIC05NTksNyArOTU5LDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQogCQlyZXR1cm4gTlVMTDsKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJcmMgPSBSZWdDb25uZWN0UmVnaXN0cnkoc3pDb21wTmFtZSwgaEtleSwgJnJldEtleSk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKIAkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAogCQkJCQkJCSAgICJDb25uZWN0UmVnaXN0cnkiKTsKZGlmZiAtLWdpdCBhL1BDL2NvbmZpZy5jIGIvUEMvY29uZmlnLmMKaW5kZXggYjgzMmQ3Yy4uYTlhMjgwZCAxMDA2NDQKLS0tIGEvUEMvY29uZmlnLmMKKysrIGIvUEMvY29uZmlnLmMKQEAgLTY3LDYgKzY3LDcgQEAKIGV4dGVybiB2b2lkIGluaXRfc3VicHJvY2Vzcyh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfbHNwcm9mKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9hc3Qodm9pZCk7CitleHRlcm4gdm9pZCBpbml0X3R5cGVzKHZvaWQpOwogCiAvKiB0b29scy9mcmVlemUvbWFrZWNvbmZpZy5weSBtYXJrZXIgZm9yIGFkZGl0aW9uYWwgImV4dGVybiIgKi8KIC8qIC0tIEFERE1PRFVMRSBNQVJLRVIgMSAtLSAqLwpAQCAtMTYxLDYgKzE2Miw4IEBACiAgICAgICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKICAgICAgICAgeyJzeXMiLCBOVUxMfSwKIAl7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKyAgICAgICAgCisgICAgICAgIHsiX3R5cGVzIiwgaW5pdF90eXBlc30sCiAKICAgICAgICAgLyogU2VudGluZWwgKi8KICAgICAgICAgezAsIDB9CmRpZmYgLS1naXQgYS9QQy9nZXRwYXRocC5jIGIvUEMvZ2V0cGF0aHAuYwppbmRleCAzN2E5YzBiLi43MjlkMmU0IDEwMDY0NAotLS0gYS9QQy9nZXRwYXRocC5jCisrKyBiL1BDL2dldHBhdGhwLmMKQEAgLTYyLDggKzYyLDE0IEBACiAjaW5jbHVkZSA8dGNoYXIuaD4KICNlbmRpZgogCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX1RZUEVTX0ggKi8KKworI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgLyogSEFWRV9TWVNfU1RBVF9IICovCisKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogLyogU2VhcmNoIGluIHNvbWUgY29tbW9uIGxvY2F0aW9ucyBmb3IgdGhlIGFzc29jaWF0ZWQgUHl0aG9uIGxpYnJhcmllcy4KQEAgLTI5MSw2ICsyOTcsMTAgQEAKIAkJfQogCQlSZWdDbG9zZUtleShzdWJLZXkpOwogCX0KKworCS8qIHJldHVybiBudWxsIGlmIG5vIHBhdGggdG8gcmV0dXJuICovCisJaWYgKGRhdGFTaXplID09IDApIGdvdG8gZG9uZTsKKwogCS8qIG9yaWdpbmFsIGRhdGFzaXplIGZyb20gUmVnUXVlcnlJbmZvIGRvZXNuJ3QgaW5jbHVkZSB0aGUgXDAgKi8KIAlkYXRhQnVmID0gbWFsbG9jKChkYXRhU2l6ZSsxKSAqIHNpemVvZihUQ0hBUikpOwogCWlmIChkYXRhQnVmKSB7CmRpZmYgLS1naXQgYS9QQy9vczJlbXgvTWFrZWZpbGUgYi9QQy9vczJlbXgvTWFrZWZpbGUKaW5kZXggNzYyYmZkYi4uODMzZjNhYiAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L01ha2VmaWxlCisrKyBiL1BDL29zMmVteC9NYWtlZmlsZQpAQCAtMiwxNSArMiwxNSBAQAogIwogIyBUb3AtTGV2ZWwgTWFrZWZpbGUgZm9yIEJ1aWxkaW5nIFB5dGhvbiAyLjQgZm9yIE9TLzIgdXNpbmcgR0NDL0VNWAogIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQW5kcmV3IFphYm9sb3RueSwgPGJpdEBlbHRlY2gucnU+IGZvciBQeXRob24gMS41LjIKLSMgTW9kaWZpZWQgYnkgQW5kcmV3IE1hY0ludHlyZSwgPGFuZHltYWNAcGN1Zy5vcmcuYXU+IGZvciBQeXRob24gMi40CisjIE1vZGlmaWVkIGJ5IEFuZHJldyBNYWNJbnR5cmUsIDxhbmR5bWFjQHBjdWcub3JnLmF1PiBmb3IgUHl0aG9uIDIuNQogIwogIyBUaGlzIG1ha2VmaWxlIHdhcyBkZXZlbG9wZWQgZm9yIHVzZSB3aXRoIFtQXUdDQy9FTVggY29tcGlsZXIgYW55CiAjIHZlcnNpb24gYW5kIEdOVSBNYWtlLgogIwotIyBUaGUgb3V0cHV0IG9mIHRoZSBidWlsZCBpcyBhIGxhcmdpc2ggUHl0aG9uMjQuRExMIGNvbnRhaW5pbmcgdGhlCisjIFRoZSBvdXRwdXQgb2YgdGhlIGJ1aWxkIGlzIGEgbGFyZ2lzaCBQeXRob24yNS5ETEwgY29udGFpbmluZyB0aGUKICMgZXNzZW50aWFsIG1vZHVsZXMgb2YgUHl0aG9uIGFuZCBhIHNtYWxsIFB5dGhvbi5leGUgcHJvZ3JhbSB0byBzdGFydAogIyB0aGUgaW50ZXJwcmV0ZXIuIFdoZW4gZW1iZWRkaW5nIFB5dGhvbiB3aXRoaW4gYW5vdGhlciBwcm9ncmFtLCBvbmx5Ci0jIFB5dGhvbjI0LkRMTCBpcyBuZWVkZWQuIFdlIGFsc28gYnVpbGQgcHl0aG9uX3MuYSBzdGF0aWMgbGlicmFyeSAod2hpY2gKKyMgUHl0aG9uMjUuRExMIGlzIG5lZWRlZC4gV2UgYWxzbyBidWlsZCBweXRob25fcy5hIHN0YXRpYyBsaWJyYXJ5ICh3aGljaAogIyBjYW4gYmUgY29udmVydGVkIGludG8gT01GICgubGliKSBmb3JtYXQgdXNpbmcgZW14b21mIHRvb2wpIGFuZCBib3RoCiAjIHB5dGhvbi5hIGFuZCBweXRob24ubGliIGltcG9ydCBsaWJyYXJpZXMuICBUaGVuIHRoZSBvcHRpb25hbCAKICMgZXh0ZW5zaW9uIG1vZHVsZXMsIHdoaWNoIGFyZSBPUy8yIERMTHMgcmVuYW1lZCB3aXRoIGEgUFlEIGZpbGUgZXh0ZW5zaW9uLgpAQCAtNjQsNyArNjQsNyBAQAogCiAjID09PSBpbnN0YWxsIGxvY2F0aW9ucyA9PT0KICMgZGVmYXVsdCB2YWx1ZSBvZiBQWVRIT05IT01FCi1MSUJfRElSPUM6L1B5dGhvbjI0CitMSUJfRElSPUM6L1B5dGhvbjI1CiAjIGRlZmF1bHQgaXMgdG8gaGF2ZSBldmVyeXRoaW5nIGluIG9yIHVuZGVyIFBZVEhPTkhPTUUKIEVYRV9ESVI9JChMSUJfRElSKQogRExMX0RJUj0kKEVYRV9ESVIpCkBAIC0yMzYsOCArMjM2LDggQEAKIAlAZWNobyBTVEFDS1NJWkUgMjA5NzE1MiA+PiRACiAKICMgT3V0cHV0IGZpbGUgbmFtZXMKLVBZVEhPTl9WRVI9CTIuNAotUFlUSE9OX0xJQj0JcHl0aG9uMjQKK1BZVEhPTl9WRVI9CTIuNQorUFlUSE9OX0xJQj0JcHl0aG9uMjUKIFBZVEhPTi5MSUI9CSQoUFlUSE9OX0xJQilfcyRBCiBQWVRIT04uSU1QTElCPQkkKFBZVEhPTl9MSUIpJEEKIGlmZXEgKCQoRVhFT01GKSx5ZXMpCkBAIC0yOTUsMjAgKzI5NSwyMyBAQAogCQlNb2R1bGVzL2RsbW9kdWxlLmMgXAogCQlNb2R1bGVzL2Vycm5vbW9kdWxlLmMgXAogCQlNb2R1bGVzL2ZjbnRsbW9kdWxlLmMgXAorCQlNb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYyBcCiAJCU1vZHVsZXMvX2hlYXBxbW9kdWxlLmMgXAogCQlNb2R1bGVzL2ltYWdlb3AuYyBcCiAJCU1vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgXAogCQlNb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBcCiAJCU1vZHVsZXMvbWF0aG1vZHVsZS5jIFwKLQkJTW9kdWxlcy9tZDVjLmMgXAorCQlNb2R1bGVzL21kNS5jIFwKIAkJTW9kdWxlcy9tZDVtb2R1bGUuYyBcCiAJCU1vZHVsZXMvb3BlcmF0b3IuYyBcCiAJCU1vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIFwKIAkJTW9kdWxlcy9yZ2JpbWdtb2R1bGUuYyBcCiAJCU1vZHVsZXMvc2hhbW9kdWxlLmMgXAorCQlNb2R1bGVzL3NoYTI1Nm1vZHVsZS5jIFwKKwkJTW9kdWxlcy9zaGE1MTJtb2R1bGUuYyBcCiAJCU1vZHVsZXMvX3NyZS5jIFwKIAkJTW9kdWxlcy9zdHJvcG1vZHVsZS5jIFwKLQkJTW9kdWxlcy9zdHJ1Y3Rtb2R1bGUuYyBcCisJCU1vZHVsZXMvX3N0cnVjdC5jIFwKIAkJTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jIFwKIAkJTW9kdWxlcy90ZXJtaW9zLmMgXAogCQlNb2R1bGVzL3RpbWVtb2R1bGUuYyBcCkBAIC0zMzEsNiArMzM0LDkgQEAKIFNSQy5QQVJTRVI9CSQoU1JDLlBBUlNFMSkgXAogCQkkKFNSQy5QQVJTRTIpCiBTUkMuUFlUSE9OPQkkKGFkZHByZWZpeCAkKFRPUCksIFwKKwkJUHl0aG9uL1B5dGhvbi1hc3QuYyBcCisJCVB5dGhvbi9hc2RsLmMgXAorCQlQeXRob24vYXN0LmMgXAogCQlQeXRob24vYmx0aW5tb2R1bGUuYyBcCiAJCVB5dGhvbi9leGNlcHRpb25zLmMgXAogCQlQeXRob24vY2V2YWwuYyBcCkBAIC0zNTMsNiArMzU5LDcgQEAKIAkJUHl0aG9uL21vZHN1cHBvcnQuYyBcCiAJCVB5dGhvbi9teXNucHJpbnRmLmMgXAogCQlQeXRob24vbXlzdHJ0b3VsLmMgXAorCQlQeXRob24vcHlhcmVuYS5jIFwKIAkJUHl0aG9uL3B5ZnBlLmMgXAogCQlQeXRob24vcHlzdGF0ZS5jIFwKIAkJUHl0aG9uL3B5c3RydG9kLmMgXApAQCAtMzcxLDYgKzM3OCw3IEBACiAJCU9iamVjdHMvY2VsbG9iamVjdC5jIFwKIAkJT2JqZWN0cy9jbGFzc29iamVjdC5jIFwKIAkJT2JqZWN0cy9jb2JqZWN0LmMgXAorCQlPYmplY3RzL2NvZGVvYmplY3QuYyBcCiAJCU9iamVjdHMvY29tcGxleG9iamVjdC5jIFwKIAkJT2JqZWN0cy9kZXNjcm9iamVjdC5jIFwKIAkJT2JqZWN0cy9kaWN0b2JqZWN0LmMgXApkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L1JFQURNRS5vczJlbXggYi9QQy9vczJlbXgvUkVBRE1FLm9zMmVteAppbmRleCA5MTcyYTJkLi40ZmU1YzUzIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvUkVBRE1FLm9zMmVteAorKysgYi9QQy9vczJlbXgvUkVBRE1FLm9zMmVteApAQCAtNjEyLDIyICs2MTIsMTEgQEAKIAogdGVzdF9wb3NpeHBhdGggc2hvdWxkIHNraXAgdGhlc2UgdGVzdHMgb24gRU1YLgogCi0yNC4gIEkgaGF2ZSBoYWQgYSByZXBvcnQgdGhhdCBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgQml0dG9ycmVudCBwYWNrYWdlCi0oaHR0cDovL2JpdGNvbmp1cmVyLm9yZy9CaXRUb3JyZW50Lykgd2l0aCB0aGlzIHBvcnQgY2F1c2VzIHRyYXBzIG5vdAotbG9uZyBhZnRlciBzdGFydGluZyB0aGUgZG93bmxvYWQ7IHRoaXMgdXNpbmcgdGhlICJoZWFkbGVzcyIgZG93bmxvYWQKLXNjcmlwdCBvbiBlQ1MgdjEuMS4gIEkgaGF2ZSBub3QgYmVlbiBhYmxlIHRvIGR1cGxpY2F0ZSB0aGlzIG15c2VsZiwKLWJ1dCB0aGUgaW5kaWNhdGlvbnMgSSBoYXZlIHN1Z2dlc3QgYSBmYWlsdXJlIGluIHRoZSAzMiBiaXQgVENQL0lQCi1zdGFjayAodjQuMy4yPyBvbiBlQ1MgdjEuMSkgLSBvbiBteSB2NC4wIEZQMTIgc3lzdGVtIHdpdGggTVBUUyBmaXhwYWNrCi1XUjg0MjUgYXBwbGllZCAoMTYgYml0IFRDUC9JUCBzdGFjayB2NC4wMiksIEJpdFRvcnJlbnQgYXBwZWFycyB0byB3b3JrCi1ub3JtYWxseSBpbiB0ZXN0aW5nIG9uIGEgMTAwTWJpdCBMQU4uICBXaXRoIHRoZSBjdXJzZXMucGFuZWwgZml4IChzZWUKLWl0ZW0gMTMgYWJvdmUpLCB0aGUgQml0VG9ycmVudCBjdXJzZXMgZG93bmxvYWRlciB3b3JrcyB0b28uICBJJ2QKLWFwcHJlY2lhdGUgYW55IHN1Y2Nlc3Mgb3IgZmFpbHVyZSByZXBvcnRzIHdpdGggQml0VG9ycmVudCwgdGhvdWdoCi1JJ3ZlIHJlZ3JldGZ1bGx5IHJlY29tbWVuZGVkIHRoYXQgdGhlIHBlcnNvbiB3aG8gcmVwb3J0ZWQgdGhlIGZhaWx1cmUKLXRha2UgdGhpcyB1cCB3aXRoIGVDUyBzdXBwb3J0LiAgU2luY2UgdGhpcyByZXBvcnQsIEkgaGF2ZSByZWNlaXZlZCBhIAotZm9sbG93dXAgd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGUgcHJvYmxlbSBtYXkgYmUgYWRkcmVzc2VkIGJ5IFRDUC9JUCAKLWZpeGVzIChJQzM1MDA1K1BKMjk0NTcsIGNvbnRhaW5lZCBpbiBORVdTVEFDSy5aSVAgaW4gdGhlIEhvYmJlcyAKLWFyY2hpdmUpLiAgSSB0aGluayBpdCBzdWZmaWNlcyB0byBzYXkgdGhhdCBCaXRUb3JyZW50IGlzIGEgZmFpciBzdHJlc3MgCi10ZXN0IG9mIGEgc3lzdGVtJ3MgbmV0d29ya2luZyBjYXBhYmlsaXR5LgorMjQuICBJIGhhdmUgcmVwb3J0cyBvZiBCaXRUb3JyZW50IG5vdCB3b3JraW5nLiAgSXQgYXBwZWFycyB0aGF0IHRoZQorRU1YIHNlbGVjdCgpIGVtdWxhdGlvbiwgcG9zc2libHkgaW4gY29uY2VydCB3aXRoIGJ1Z3MgaW4gdGhlIFRDUC9JUAorc3RhY2ssIHJ1bnMgaW50byBwcm9ibGVtcyB1bmRlciB0aGUgc3RyZXNzIGltcG9zZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KK0kgdGhpbmsgaXQgc3VmZmljZXMgdG8gc2F5IHRoYXQgQml0VG9ycmVudCBpcyBhIGZhaXIgc3RyZXNzIHRlc3Qgb2YgYQorc3lzdGVtJ3MgbmV0d29ya2luZyBjYXBhYmlsaXR5LgogCiAyNS4gIEluIHRoZSBhYnNlbmNlIG9mIGFuIEVNWCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGluaygpIGZ1bmN0aW9uLCBJJ3ZlIAogaW1wbGVtZW50ZWQgYSBjcnVkZSBQeXRob24gZW11bGF0aW9uLCBpbiB0aGUgZmlsZSAKQEAgLTY1OSwxNCArNjQ4LDE2IEBACiAKIDI5LiAgVGhlIGRlZmF1bHQgc3RhY2sgc2l6ZSBmb3IgdGhyZWFkcyBoYXMgYmVlbiA2NGsuICBUaGlzIGlzIHByb3ZpbmcKIGluc3VmZmljaWVudCBmb3Igc29tZSBjb2RlYmFzZXMsIHN1Y2ggYXMgWm9wZS4gIFRoZSB0aHJlYWQgc3RhY2sgc2l6ZQotc3RpbGwgZGVmYXVsdHMgdG8gNjRrLCBidXQgdGhpcyBjYW4gbm93IGJlIGluY3JlYXNlZCBieSBkZWZpbmluZworc3RpbGwgZGVmYXVsdHMgdG8gNjRrLCBidXQgdGhpcyBjYW4gbm93IGJlIGluY3JlYXNlZCB2aWEgdGhlIHN0YWNrX3NpemUoKQorZnVuY3Rpb24gZXhwb3NlZCBieSB0aGUgdGhyZWFkaW5nICYgdGhyZWFkIG1vZHVsZXMgYXMgd2VsbCBhcyBieSBkZWZpbmluZwogVEhSRUFEX1NUQUNLX1NJWkUgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIE1ha2VmaWxlICh3aGljaCBjb250YWlucwogYSBjb21tZW50ZWQgb3V0IGRlZmluaXRpb24gZm9yIDEyOGtCIHRocmVhZCBzdGFja3MpLiAgSSBoYXZlIHNlZW4KIHJlZmVyZW5jZXMgdG8gaGVhdnkgWm9wZS9QbG9uZSB1c2FnZSByZXF1aXJpbmcgMU1CIHRocmVhZCBzdGFja3Mgb24KIEZyZWVCU0QgYW5kIExpbnV4LCBidXQgZG91YnQgdGhhdCBmb3IgbW9zdCBsaWtlbHkgdXNhZ2Ugb24gT1MvMiB0aGF0CiBtb3JlIHRoYW4gMjU2a0IgaXMgbmVjZXNzYXJ5LiAgVGhlIHNpemUgb2YgdGhlIHJlcXVpcmVkIHN0YWNrcyAobWFpbiAKIGFuZCB0aHJlYWQpIGNhbiB2YXJ5IHNpZ25pZmljYW50bHkgZGVwZW5kaW5nIG9uIHdoaWNoIHZlcnNpb24gb2YgZ2NjCi1pcyB1c2VkIGFsb25nIHdpdGggdGhlIGNvbXBpbGVyIG9wdGltaXNhdGlvbnMgc2VsZWN0ZWQuCitpcyB1c2VkIGFsb25nIHdpdGggdGhlIGNvbXBpbGVyIG9wdGltaXNhdGlvbnMgc2VsZWN0ZWQuICBOb3RlIHRoYXQgdGhlCittYWluIHRocmVhZCBzdGFjayBzaXplIGlzIHNldCBkdXJpbmcgbGlua2luZyBhbmQgaXMgY3VycmVudGx5IDJNQi4KIAogLi4uIHByb2JhYmx5IG90aGVyIGlzc3VlcyB0aGF0IEkndmUgbm90IGVuY291bnRlcmVkLCBvciBkb24ndCByZW1lbWJlciA6LSgKIApAQCAtNzA3LDQgKzY5OCw0IEBACiBFLW1haWw6IGFuZHltYWNAYnVsbHNleWUuYXBhbmEub3JnLmF1LCBvciBhbmR5bWFjQHBjdWcub3JnLmF1CiBXZWI6ICAgIGh0dHA6Ly93d3cuYW5keW1hYy5vcmcvCiAKLTE3IEZlYnJ1YXJ5LCAyMDA1LgorMjMgSnVseSwgMjAwNi4KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9jb25maWcuYyBiL1BDL29zMmVteC9jb25maWcuYwppbmRleCA0MGMyY2RjLi42OTZjM2JiIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvY29uZmlnLmMKKysrIGIvUEMvb3MyZW14L2NvbmZpZy5jCkBAIC01OCwxNiArNTgsMTkgQEAKIGV4dGVybiB2b2lkIGluaXRkbCgpOwogZXh0ZXJuIHZvaWQgaW5pdGVycm5vKCk7CiBleHRlcm4gdm9pZCBpbml0ZmNudGwoKTsKK2V4dGVybiB2b2lkIGluaXRfZnVuY3Rvb2xzKCk7CiBleHRlcm4gdm9pZCBpbml0X2hlYXBxKCk7CiBleHRlcm4gdm9pZCBpbml0aW1hZ2VvcCgpOwogZXh0ZXJuIHZvaWQgaW5pdGl0ZXJ0b29scygpOwogZXh0ZXJuIHZvaWQgaW5pdG1hdGgoKTsKLWV4dGVybiB2b2lkIGluaXRtZDUoKTsKK2V4dGVybiB2b2lkIGluaXRfbWQ1KCk7CiBleHRlcm4gdm9pZCBpbml0b3BlcmF0b3IoKTsKIGV4dGVybiB2b2lkIGluaXRyZ2JpbWcoKTsKLWV4dGVybiB2b2lkIGluaXRzaGEoKTsKK2V4dGVybiB2b2lkIGluaXRfc2hhKCk7CitleHRlcm4gdm9pZCBpbml0X3NoYTI1NigpOworZXh0ZXJuIHZvaWQgaW5pdF9zaGE1MTIoKTsKIGV4dGVybiB2b2lkIGluaXRzdHJvcCgpOwotZXh0ZXJuIHZvaWQgaW5pdHN0cnVjdCgpOworZXh0ZXJuIHZvaWQgaW5pdF9zdHJ1Y3QoKTsKIGV4dGVybiB2b2lkIGluaXR0ZXJtaW9zKCk7CiBleHRlcm4gdm9pZCBpbml0dGltZSgpOwogZXh0ZXJuIHZvaWQgaW5pdHRpbWluZygpOwpAQCAtMTIxLDE2ICsxMjQsMTkgQEAKIAl7ImRsIiwgaW5pdGRsfSwKIAl7ImVycm5vIiwgaW5pdGVycm5vfSwKIAl7ImZjbnRsIiwgaW5pdGZjbnRsfSwKKwl7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCiAJeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKIAl7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCiAJeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKIAl7Im1hdGgiLCBpbml0bWF0aH0sCi0JeyJtZDUiLCBpbml0bWQ1fSwKKwl7Il9tZDUiLCBpbml0X21kNX0sCiAJeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCiAJeyJyZ2JpbWciLCBpbml0cmdiaW1nfSwKLQl7InNoYSIsIGluaXRzaGF9LAorCXsiX3NoYSIsIGluaXRfc2hhfSwKKwl7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCisJeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAogCXsic3Ryb3AiLCBpbml0c3Ryb3B9LAotCXsic3RydWN0IiwgaW5pdHN0cnVjdH0sCisJeyJfc3RydWN0IiwgaW5pdF9zdHJ1Y3R9LAogCXsidGVybWlvcyIsIGluaXR0ZXJtaW9zfSwKIAl7InRpbWUiLCBpbml0dGltZX0sCiAJeyJ0aW1pbmciLCBpbml0dGltaW5nfSwKZGlmZiAtLWdpdCBhL1BDL29zMmVteC9weWNvbmZpZy5oIGIvUEMvb3MyZW14L3B5Y29uZmlnLmgKaW5kZXggYWZlNzllNC4uMTAzOWQzZCAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L3B5Y29uZmlnLmgKKysrIGIvUEMvb3MyZW14L3B5Y29uZmlnLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKICNkZWZpbmUgVENQSVBWNAkJMQogI2RlZmluZSBVU0VfU09DS0VUCTEKICNkZWZpbmUgc29ja2xlbl90CWludAorI2RlZmluZSBGRF9TRVRTSVpFCTEwMjQKIAogLyogZW5hYmxlIHRoZSBQeXRob24gb2JqZWN0IGFsbG9jYXRvciAqLwogI2RlZmluZQlXSVRIX1BZTUFMTE9DCTEKQEAgLTYxLDYgKzYyLDkgQEAKICNkZWZpbmUgUFlfVU5JQ09ERV9UWVBFCXdjaGFyX3QKICNkZWZpbmUgUHlfVU5JQ09ERV9TSVpFIFNJWkVPRl9TSE9SVAogCisvKiBFTVggZGVmaW5lcyBzc2l6ZV90ICovCisjZGVmaW5lIEhBVkVfU1NJWkVfVAkxCisKIC8qIHN5c3RlbSBjYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgSEFWRV9UVFlOQU1FCTEKICNkZWZpbmUgSEFWRV9XQUlUCTEKQEAgLTEzNyw2ICsxNDEsOSBAQAogLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHZvaWQgKi4gKi8KICNkZWZpbmUgU0laRU9GX1ZPSURfUCA0CiAKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzaXplX3QuICovCisjZGVmaW5lIFNJWkVPRl9TSVpFX1QgNAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFsYXJtIGZ1bmN0aW9uLiAqLwogI2RlZmluZSBIQVZFX0FMQVJNIDEKIApAQCAtMjU0LDE1ICsyNjEsMzMgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgd2FpdHBpZCBmdW5jdGlvbi4gKi8KICNkZWZpbmUgSEFWRV9XQUlUUElEIDEKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8Y29uaW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DT05JT19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0RJUkVDVF9ICisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9ESVJFTlRfSCAxCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0VSUk5PX0ggMQorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8aW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JT19ICisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfTkNVUlNFU19IIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1BST0NFU1NfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQogCkBAIC0yNzIsMTIgKzI5NywxOCBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMQogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9TWVNfVElNRVNfSCAxCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9TWVNfVU5fSCAxCiAKZGlmZiAtLWdpdCBhL1BDL29zMmVteC9weXRob24yNC5kZWYgYi9QQy9vczJlbXgvcHl0aG9uMjUuZGVmCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIFBDL29zMmVteC9weXRob24yNC5kZWYKcmVuYW1lIHRvIFBDL29zMmVteC9weXRob24yNS5kZWYKaW5kZXggNTM0ZGZmOC4uM2M2MDA0ZiAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L3B5dGhvbjI0LmRlZgorKysgYi9QQy9vczJlbXgvcHl0aG9uMjUuZGVmCkBAIC0xLDg5ICsxLDkzIEBACi1MSUJSQVJZIHB5dGhvbjI0IElOSVRJTlNUQU5DRSBURVJNSU5TVEFOQ0UgCi1ERVNDUklQVElPTiAiUHl0aG9uIDIuNCBDb3JlIERMTCIgCitMSUJSQVJZIHB5dGhvbjI1IElOSVRJTlNUQU5DRSBURVJNSU5TVEFOQ0UgCitERVNDUklQVElPTiAiUHl0aG9uIDIuNSBDb3JlIERMTCIgCiBQUk9UTU9ERSAKIERBVEEgTVVMVElQTEUgTk9OU0hBUkVEIAogRVhQT1JUUyAKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNvbmZpZykKKzsgRnJvbSBweXRob24yNV9zLmxpYihjb25maWcpCiAgICJfUHlJbXBvcnRfSW5pdHRhYiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGRsZmNuKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGRsZmNuKQogOyAgImRsb3BlbiIKIDsgICJkbHN5bSIKIDsgICJkbGNsb3NlIgogOyAgImRsZXJyb3IiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZXRwYXRocCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRwYXRocCkKICAgIlB5X0dldFByb2dyYW1GdWxsUGF0aCIKICAgIlB5X0dldFByZWZpeCIKICAgIlB5X0dldEV4ZWNQcmVmaXgiCiAgICJQeV9HZXRQYXRoIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0YnVpbGRpbmZvKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdldGJ1aWxkaW5mbykKICAgIlB5X0dldEJ1aWxkSW5mbyIKKyAgIl9QeV9zdm52ZXJzaW9uIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobWFpbikKKzsgRnJvbSBweXRob24yNV9zLmxpYihtYWluKQogICAiUHlfTWFpbiIKICAgIlB5X0dldEFyZ2NBcmd2IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYWNjZWxlcikKKzsgRnJvbSBweXRob24yNV9zLmxpYihhY2NlbGVyKQogICAiUHlHcmFtbWFyX0FkZEFjY2VsZXJhdG9ycyIKICAgIlB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihncmFtbWFyMSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihncmFtbWFyMSkKICAgIlB5R3JhbW1hcl9GaW5kREZBIgogICAiUHlHcmFtbWFyX0xhYmVsUmVwciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGxpc3Rub2RlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGxpc3Rub2RlKQogICAiUHlOb2RlX0xpc3RUcmVlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobm9kZSkKLSAgIlB5Tm9kZV9BZGRDaGlsZCIKKzsgRnJvbSBweXRob24yNV9zLmxpYihub2RlKQogICAiUHlOb2RlX05ldyIKKyAgIlB5Tm9kZV9BZGRDaGlsZCIKICAgIlB5Tm9kZV9GcmVlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocGFyc2VyKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHBhcnNlcikKICAgIlB5UGFyc2VyX0FkZFRva2VuIgogICAiUHlQYXJzZXJfTmV3IgogICAiUHlQYXJzZXJfRGVsZXRlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocGFyc2V0b2spCis7IEZyb20gcHl0aG9uMjVfcy5saWIocGFyc2V0b2spCiAgICJQeV9UYWJjaGVja0ZsYWciCiAgICJQeVBhcnNlcl9QYXJzZVN0cmluZyIKLSAgIlB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3MiCisgICJQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUiCiAgICJQeVBhcnNlcl9QYXJzZUZpbGUiCiAgICJQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyIKLSAgIlB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSIKKyAgIlB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3MiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihiaXRzZXQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYml0c2V0KQogICAiX1B5X25ld2JpdHNldCIKICAgIl9QeV9kZWxiaXRzZXQiCiAgICJfUHlfYWRkYml0IgogICAiX1B5X3NhbWViaXRzZXQiCiAgICJfUHlfbWVyZ2ViaXRzZXQiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtZXRhZ3JhbW1hcikKKzsgRnJvbSBweXRob24yNV9zLmxpYihtZXRhZ3JhbW1hcikKICAgIl9QeV9tZXRhX2dyYW1tYXIiCiAgICJQeV9tZXRhX2dyYW1tYXIiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0b2tlbml6ZXIpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodG9rZW5pemVyKQogICAiUHlUb2tlbl9PbmVDaGFyIgogICAiUHlUb2tlbl9Ud29DaGFycyIKICAgIlB5VG9rZW5fVGhyZWVDaGFycyIKICAgIlB5VG9rZW5pemVyX0Zyb21TdHJpbmciCi0gICJQeVRva2VuaXplcl9Gcm9tRmlsZSIKICAgIlB5VG9rZW5pemVyX0ZyZWUiCisgICJQeVRva2VuaXplcl9Gcm9tRmlsZSIKICAgIlB5VG9rZW5pemVyX0dldCIKICAgIl9QeVBhcnNlcl9Ub2tlbk5hbWVzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobXlyZWFkbGluZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihteXJlYWRsaW5lKQogICAiX1B5T1NfUmVhZGxpbmVUU3RhdGUiCiAgICJQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyIgogICAiUHlPU19TdGRpb1JlYWRsaW5lIgogICAiUHlPU19SZWFkbGluZSIKICAgIlB5T1NfSW5wdXRIb29rIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYWJzdHJhY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYWJzdHJhY3QpCisgICJfUHlPYmplY3RfTGVuZ3RoSGludCIKKyAgIlB5TWFwcGluZ19TaXplIgorICAiUHlPYmplY3RfQ2FsbE1ldGhvZCIKICAgIlB5T2JqZWN0X0dldEl0ZW0iCiAgICJQeVNlcXVlbmNlX0dldEl0ZW0iCiAgICJQeU9iamVjdF9TZXRJdGVtIgpAQCAtOTYsMTUgKzEwMCwyMCBAQAogICAiUHlOdW1iZXJfSW50IgogICAiUHlOdW1iZXJfTG9uZyIKICAgIlB5TnVtYmVyX0Zsb2F0IgorICAiUHlTZXF1ZW5jZV9Db25jYXQiCisgICJQeVNlcXVlbmNlX1JlcGVhdCIKKyAgIlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdCIKKyAgIlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdCIKICAgIlB5U2VxdWVuY2VfR2V0U2xpY2UiCiAgICJQeVNlcXVlbmNlX1NldFNsaWNlIgogICAiUHlTZXF1ZW5jZV9UdXBsZSIKICAgIlB5T2JqZWN0X0dldEl0ZXIiCi0gICJQeU1hcHBpbmdfU2l6ZSIKICAgIlB5SXRlcl9OZXh0IgorICAiUHlTZXF1ZW5jZV9GYXN0IgogICAiX1B5U2VxdWVuY2VfSXRlclNlYXJjaCIKICAgIlB5T2JqZWN0X0NhbGxGdW5jdGlvbiIKLSAgIlB5T2JqZWN0X0NhbGxNZXRob2QiCisgICJfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUIgorICAiX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQiCiAgICJQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyIKICAgIlB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MiCiAgICJQeU9iamVjdF9DbXAiCkBAIC0xMzYsNiArMTQ1LDcgQEAKICAgIlB5TnVtYmVyX0FuZCIKICAgIlB5TnVtYmVyX1hvciIKICAgIlB5TnVtYmVyX09yIgorICAiUHlOdW1iZXJfSW5kZXgiCiAgICJQeU51bWJlcl9JblBsYWNlU3VidHJhY3QiCiAgICJQeU51bWJlcl9JblBsYWNlRGl2aWRlIgogICAiUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlIgpAQCAtMTUwLDE3ICsxNjAsMTIgQEAKICAgIlB5U2VxdWVuY2VfQ2hlY2siCiAgICJQeVNlcXVlbmNlX1NpemUiCiAgICJQeVNlcXVlbmNlX0xlbmd0aCIKLSAgIlB5U2VxdWVuY2VfQ29uY2F0IgotICAiUHlTZXF1ZW5jZV9SZXBlYXQiCiAgICJQeVNlcXVlbmNlX0RlbFNsaWNlIgogICAiUHlTZXF1ZW5jZV9MaXN0IgotICAiUHlTZXF1ZW5jZV9GYXN0IgogICAiUHlTZXF1ZW5jZV9Db3VudCIKICAgIlB5U2VxdWVuY2VfQ29udGFpbnMiCiAgICJQeVNlcXVlbmNlX0luIgogICAiUHlTZXF1ZW5jZV9JbmRleCIKLSAgIlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdCIKLSAgIlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdCIKICAgIlB5TWFwcGluZ19DaGVjayIKICAgIlB5TWFwcGluZ19MZW5ndGgiCiAgICJQeU1hcHBpbmdfSGFzS2V5U3RyaW5nIgpAQCAtMTcwLDEzICsxNzUsMTMgQEAKICAgIlB5T2JqZWN0X0lzSW5zdGFuY2UiCiAgICJQeU9iamVjdF9Jc1N1YmNsYXNzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYm9vbG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihib29sb2JqZWN0KQogICAiUHlCb29sX0Zyb21Mb25nIgogICAiUHlCb29sX1R5cGUiCiAgICJfUHlfWmVyb1N0cnVjdCIKICAgIl9QeV9UcnVlU3RydWN0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYnVmZmVyb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGJ1ZmZlcm9iamVjdCkKICAgIlB5QnVmZmVyX0Zyb21PYmplY3QiCiAgICJQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlT2JqZWN0IgogICAiUHlCdWZmZXJfRnJvbU1lbW9yeSIKQEAgLTE4NCwxMyArMTg5LDEzIEBACiAgICJQeUJ1ZmZlcl9OZXciCiAgICJQeUJ1ZmZlcl9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY2VsbG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihjZWxsb2JqZWN0KQogICAiUHlDZWxsX05ldyIKICAgIlB5Q2VsbF9HZXQiCiAgICJQeUNlbGxfU2V0IgogICAiUHlDZWxsX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjbGFzc29iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihjbGFzc29iamVjdCkKICAgIlB5Q2xhc3NfTmV3IgogICAiUHlDbGFzc19Jc1N1YmNsYXNzIgogICAiUHlJbnN0YW5jZV9OZXciCkBAIC0yMDUsNyArMjEwLDcgQEAKICAgIlB5SW5zdGFuY2VfVHlwZSIKICAgIlB5TWV0aG9kX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvYmplY3QpCiAgICJQeUNPYmplY3RfRnJvbVZvaWRQdHIiCiAgICJQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjIgogICAiUHlDT2JqZWN0X0FzVm9pZFB0ciIKQEAgLTIxNCw3ICsyMTksMTMgQEAKICAgIlB5Q09iamVjdF9TZXRWb2lkUHRyIgogICAiUHlDT2JqZWN0X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjb21wbGV4b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvZGVvYmplY3QpCisgICJQeUNvZGVfTmV3IgorICAiUHlDb2RlX0FkZHIyTGluZSIKKyAgIlB5Q29kZV9DaGVja0xpbmVOdW1iZXIiCisgICJQeUNvZGVfVHlwZSIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvbXBsZXhvYmplY3QpCiAgICJfUHlfY19wb3ciCiAgICJfUHlfY19zdW0iCiAgICJfUHlfY19kaWZmIgpAQCAtMjI4LDcgKzIzOSw3IEBACiAgICJQeUNvbXBsZXhfQXNDQ29tcGxleCIKICAgIlB5Q29tcGxleF9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZGVzY3JvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZGVzY3JvYmplY3QpCiAgICJQeVdyYXBwZXJfTmV3IgogICAiUHlEZXNjcl9OZXdNZXRob2QiCiAgICJQeURlc2NyX05ld0NsYXNzTWV0aG9kIgpAQCAtMjM5LDggKzI1MCw5IEBACiAgICJQeVdyYXBwZXJEZXNjcl9UeXBlIgogICAiUHlQcm9wZXJ0eV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZGljdG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihkaWN0b2JqZWN0KQogICAiUHlEaWN0X05ldyIKKyAgIlB5RGljdF9HZXRJdGVtIgogICAiUHlEaWN0X1NldEl0ZW0iCiAgICJQeURpY3RfRGVsSXRlbSIKICAgIlB5RGljdF9DbGVhciIKQEAgLTI0OSw3ICsyNjEsNiBAQAogICAiUHlEaWN0X0tleXMiCiAgICJQeURpY3RfVmFsdWVzIgogICAiUHlEaWN0X0NvbnRhaW5zIgotICAiUHlEaWN0X0dldEl0ZW0iCiAgICJQeURpY3RfTmV4dCIKICAgIlB5RGljdF9JdGVtcyIKICAgIlB5RGljdF9TaXplIgpAQCAtMjYzLDExICsyNzQsMTIgQEAKICAgIlB5RGljdEl0ZXJWYWx1ZV9UeXBlIgogICAiUHlEaWN0SXRlckl0ZW1fVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGVudW1vYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZW51bW9iamVjdCkKICAgIlB5RW51bV9UeXBlIgogICAiUHlSZXZlcnNlZF9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZmlsZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihmaWxlb2JqZWN0KQorICAiUHlGaWxlX0Zyb21TdHJpbmciCiAgICJQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQiCiAgICJQeUZpbGVfR2V0TGluZSIKICAgIlB5RmlsZV9Tb2Z0U3BhY2UiCkBAIC0yNzUsNyArMjg3LDYgQEAKICAgIlB5RmlsZV9Xcml0ZVN0cmluZyIKICAgIlB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IiCiAgICJQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMiCi0gICJQeUZpbGVfRnJvbVN0cmluZyIKICAgIlB5RmlsZV9TZXRCdWZTaXplIgogICAiUHlGaWxlX1NldEVuY29kaW5nIgogICAiUHlGaWxlX0Zyb21GaWxlIgpAQCAtMjgzLDIxICsyOTQsMjIgQEAKICAgIlB5RmlsZV9OYW1lIgogICAiUHlGaWxlX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihmbG9hdG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihmbG9hdG9iamVjdCkKICAgIlB5RmxvYXRfRnJvbVN0cmluZyIKICAgIlB5RmxvYXRfQXNEb3VibGUiCiAgICJQeUZsb2F0X0ZpbmkiCiAgICJfUHlGbG9hdF9QYWNrNCIKICAgIl9QeUZsb2F0X1BhY2s4IgorICAiX1B5RmxvYXRfVW5wYWNrNCIKKyAgIl9QeUZsb2F0X1VucGFjazgiCiAgICJQeUZsb2F0X0Zyb21Eb3VibGUiCiAgICJQeUZsb2F0X0FzUmVwclN0cmluZyIKICAgIlB5RmxvYXRfQXNTdHJpbmciCi0gICJfUHlGbG9hdF9VbnBhY2s0IgotICAiX1B5RmxvYXRfVW5wYWNrOCIKKyAgIl9QeUZsb2F0X0luaXQiCiAgICJQeUZsb2F0X0FzU3RyaW5nRXgiCiAgICJQeUZsb2F0X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihmcmFtZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihmcmFtZW9iamVjdCkKICAgIlB5RnJhbWVfTmV3IgogICAiUHlGcmFtZV9GYXN0VG9Mb2NhbHMiCiAgICJQeUZyYW1lX0xvY2Fsc1RvRmFzdCIKQEAgLTMwNyw3ICszMTksNyBAQAogICAiUHlGcmFtZV9CbG9ja1BvcCIKICAgIlB5RnJhbWVfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZ1bmNvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZnVuY29iamVjdCkKICAgIlB5RnVuY3Rpb25fTmV3IgogICAiUHlGdW5jdGlvbl9HZXRDb2RlIgogICAiUHlGdW5jdGlvbl9HZXRHbG9iYWxzIgpAQCAtMzIyLDI5ICszMzQsMzMgQEAKICAgIlB5Q2xhc3NNZXRob2RfVHlwZSIKICAgIlB5U3RhdGljTWV0aG9kX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZW5vYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2Vub2JqZWN0KQogICAiUHlHZW5fTmV3IgorICAiUHlHZW5fTmVlZHNGaW5hbGl6aW5nIgogICAiUHlHZW5fVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGludG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihpbnRvYmplY3QpCiAgICJQeUludF9Bc0xvbmciCiAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2siCiAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrIgogICAiUHlJbnRfRnJvbVN0cmluZyIKKyAgIlB5SW50X0FzU3NpemVfdCIKICAgIlB5SW50X0ZpbmkiCiAgICJQeUludF9Gcm9tVW5pY29kZSIKICAgIlB5SW50X0Zyb21Mb25nIgorICAiUHlJbnRfRnJvbVNpemVfdCIKKyAgIlB5SW50X0Zyb21Tc2l6ZV90IgogICAiUHlJbnRfR2V0TWF4IgogICAiX1B5SW50X0luaXQiCiAgICJQeUludF9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaXRlcm9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihpdGVyb2JqZWN0KQogICAiUHlTZXFJdGVyX05ldyIKICAgIlB5Q2FsbEl0ZXJfTmV3IgogICAiUHlTZXFJdGVyX1R5cGUiCiAgICJQeUNhbGxJdGVyX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihsaXN0b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGxpc3RvYmplY3QpCiAgICJQeUxpc3RfTmV3IgogICAiUHlMaXN0X0FwcGVuZCIKICAgIlB5TGlzdF9TaXplIgpAQCAtMzU3LDI3ICszNzMsMzEgQEAKICAgIlB5TGlzdF9SZXZlcnNlIgogICAiUHlMaXN0X0FzVHVwbGUiCiAgICJfUHlMaXN0X0V4dGVuZCIKKyAgIlB5TGlzdF9GaW5pIgogICAiUHlMaXN0X1R5cGUiCiAgICJQeUxpc3RJdGVyX1R5cGUiCiAgICJQeUxpc3RSZXZJdGVyX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihsb25nb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGxvbmdvYmplY3QpCiAgICJQeUxvbmdfRnJvbURvdWJsZSIKICAgIlB5TG9uZ19Bc0xvbmciCisgICJfUHlMb25nX0FzU3NpemVfdCIKICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyIKICAgIl9QeUxvbmdfRnJvbUJ5dGVBcnJheSIKICAgIl9QeUxvbmdfQXNCeXRlQXJyYXkiCiAgICJQeUxvbmdfQXNEb3VibGUiCisgICJQeUxvbmdfRnJvbUxvbmdMb25nIgorICAiUHlMb25nX0FzTG9uZ0xvbmciCiAgICJQeUxvbmdfRnJvbVN0cmluZyIKICAgIlB5TG9uZ19Gcm9tTG9uZyIKICAgIlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nIgogICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayIKKyAgIl9QeUxvbmdfRnJvbVNpemVfdCIKKyAgIl9QeUxvbmdfRnJvbVNzaXplX3QiCiAgICJfUHlMb25nX0FzU2NhbGVkRG91YmxlIgogICAiUHlMb25nX0Zyb21Wb2lkUHRyIgogICAiUHlMb25nX0FzVm9pZFB0ciIKLSAgIlB5TG9uZ19Gcm9tTG9uZ0xvbmciCiAgICJQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmciCi0gICJQeUxvbmdfQXNMb25nTG9uZyIKICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmciCiAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayIKICAgIlB5TG9uZ19Gcm9tVW5pY29kZSIKQEAgLTM4Niw4ICs0MDYsOSBAQAogICAiX1B5TG9uZ19OZXciCiAgICJfUHlMb25nX0NvcHkiCiAgICJQeUxvbmdfVHlwZSIKKyAgIl9QeUxvbmdfRGlnaXRWYWx1ZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG1ldGhvZG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihtZXRob2RvYmplY3QpCiAgICJQeUNGdW5jdGlvbl9DYWxsIgogICAiUHlfRmluZE1ldGhvZEluQ2hhaW4iCiAgICJQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbiIKQEAgLTM5OSw3ICs0MjAsNyBAQAogICAiUHlDRnVuY3Rpb25fTmV3IgogICAiUHlDRnVuY3Rpb25fVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG1vZHVsZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihtb2R1bGVvYmplY3QpCiAgICJQeU1vZHVsZV9OZXciCiAgICJfUHlNb2R1bGVfQ2xlYXIiCiAgICJQeU1vZHVsZV9HZXREaWN0IgpAQCAtNDA3LDEwICs0MjgsMTEgQEAKICAgIlB5TW9kdWxlX0dldEZpbGVuYW1lIgogICAiUHlNb2R1bGVfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihvYmplY3QpCiAgICJQeV9EaXZpc2lvbldhcm5pbmdGbGFnIgogICAiUHlPYmplY3RfU3RyIgogICAiUHlPYmplY3RfUmVwciIKKyAgIl9QeU9iamVjdF9TdHIiCiAgICJQeU9iamVjdF9Vbmljb2RlIgogICAiUHlPYmplY3RfR2V0QXR0ciIKICAgIlB5T2JqZWN0X0lzVHJ1ZSIKQEAgLTQ1OSwyNyArNDgxLDM4IEBACiAgICJfUHlUcmFzaF9kZWxldGVfbmVzdGluZyIKICAgIl9QeVRyYXNoX2RlbGV0ZV9sYXRlciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG9ibWFsbG9jKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG9ibWFsbG9jKQogICAiUHlPYmplY3RfTWFsbG9jIgotICAiUHlPYmplY3RfUmVhbGxvYyIKICAgIlB5T2JqZWN0X0ZyZWUiCisgICJQeU9iamVjdF9SZWFsbG9jIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocmFuZ2VvYmplY3QpCi0gICJQeVJhbmdlX05ldyIKKzsgRnJvbSBweXRob24yNV9zLmxpYihyYW5nZW9iamVjdCkKICAgIlB5UmFuZ2VfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHNldG9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzZXRvYmplY3QpCisgICJQeVNldF9Qb3AiCisgICJQeVNldF9OZXciCisgICJQeUZyb3plblNldF9OZXciCisgICJQeVNldF9TaXplIgorICAiUHlTZXRfQ2xlYXIiCisgICJQeVNldF9Db250YWlucyIKKyAgIlB5U2V0X0Rpc2NhcmQiCisgICJQeVNldF9BZGQiCisgICJfUHlTZXRfTmV4dCIKKyAgIl9QeVNldF9VcGRhdGUiCisgICJQeVNldF9GaW5pIgogICAiUHlTZXRfVHlwZSIKICAgIlB5RnJvemVuU2V0X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzbGljZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzbGljZW9iamVjdCkKKyAgIl9QeVNsaWNlX0Zyb21JbmRpY2VzIgogICAiUHlTbGljZV9HZXRJbmRpY2VzIgogICAiUHlTbGljZV9HZXRJbmRpY2VzRXgiCiAgICJQeVNsaWNlX05ldyIKICAgIl9QeV9FbGxpcHNpc09iamVjdCIKICAgIlB5U2xpY2VfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHN0cmluZ29iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzdHJpbmdvYmplY3QpCiAgICJQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSIKICAgIlB5U3RyaW5nX0ludGVybkluUGxhY2UiCiAgICJQeVN0cmluZ19Gcm9tU3RyaW5nIgpAQCAtNDkwLDEyICs1MjMsMTIgQEAKICAgIlB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZyIKICAgIlB5U3RyaW5nX0FzRW5jb2RlZFN0cmluZyIKICAgIlB5U3RyaW5nX0RlY29kZUVzY2FwZSIKLSAgIlB5U3RyaW5nX1NpemUiCiAgICJQeVN0cmluZ19SZXByIgogICAiUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplIgogICAiX1B5U3RyaW5nX0Zvcm1hdExvbmciCiAgICJQeVN0cmluZ19Gb3JtYXQiCiAgICJfUHlfUmVsZWFzZUludGVybmVkU3RyaW5ncyIKKyAgIlB5U3RyaW5nX1NpemUiCiAgICJQeVN0cmluZ19Db25jYXQiCiAgICJQeVN0cmluZ19Db25jYXRBbmREZWwiCiAgICJfUHlTdHJpbmdfRXEiCkBAIC01MTAsMTIgKzU0MywxMiBAQAogICAiUHlTdHJpbmdfVHlwZSIKICAgIlB5QmFzZVN0cmluZ19UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3RydWN0c2VxKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN0cnVjdHNlcSkKICAgIlB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUiCiAgICJQeVN0cnVjdFNlcXVlbmNlX05ldyIKICAgIlB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIodHVwbGVvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodHVwbGVvYmplY3QpCiAgICJQeVR1cGxlX05ldyIKICAgIlB5VHVwbGVfUGFjayIKICAgIl9QeVR1cGxlX1Jlc2l6ZSIKQEAgLTUyNyw3ICs1NjAsNyBAQAogICAiUHlUdXBsZV9UeXBlIgogICAiUHlUdXBsZUl0ZXJfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHR5cGVvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodHlwZW9iamVjdCkKICAgIlB5VHlwZV9Jc1N1YnR5cGUiCiAgICJfUHlUeXBlX0xvb2t1cCIKICAgIlB5VHlwZV9SZWFkeSIKQEAgLTUzOCw3ICs1NzEsNyBAQAogICAiUHlCYXNlT2JqZWN0X1R5cGUiCiAgICJQeVN1cGVyX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih1bmljb2Rlb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHVuaWNvZGVvYmplY3QpCiAgICJQeVVuaWNvZGVVQ1MyX1Jlc2l6ZSIKICAgIlB5VW5pY29kZVVDUzJfRnJvbU9yZGluYWwiCiAgICJQeVVuaWNvZGVVQ1MyX0Zyb21PYmplY3QiCkBAIC01NjEsMTMgKzU5NCwxNCBAQAogICAiUHlVbmljb2RlVUNTMl9EZWNvZGVVbmljb2RlRXNjYXBlIgogICAiUHlVbmljb2RlVUNTMl9EZWNvZGVSYXdVbmljb2RlRXNjYXBlIgogICAiUHlVbmljb2RlVUNTMl9FbmNvZGVSYXdVbmljb2RlRXNjYXBlIgorICAiX1B5VW5pY29kZV9EZWNvZGVVbmljb2RlSW50ZXJuYWwiCiAgICJQeVVuaWNvZGVVQ1MyX0RlY29kZUNoYXJtYXAiCisgICJQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcCIKICAgIlB5VW5pY29kZVVDUzJfRW5jb2RlQ2hhcm1hcCIKICAgIlB5VW5pY29kZVVDUzJfVHJhbnNsYXRlQ2hhcm1hcCIKICAgIlB5VW5pY29kZVVDUzJfRW5jb2RlRGVjaW1hbCIKICAgIlB5VW5pY29kZVVDUzJfQ291bnQiCiAgICJQeVVuaWNvZGVVQ1MyX0ZpbmQiCi0gICJQeVVuaWNvZGVVQ1MyX1RhaWxtYXRjaCIKICAgIlB5VW5pY29kZVVDUzJfSm9pbiIKICAgIlB5VW5pY29kZVVDUzJfU3BsaXRsaW5lcyIKICAgIlB5VW5pY29kZVVDUzJfQ29tcGFyZSIKQEAgLTU3OCw2ICs2MTIsNyBAQAogICAiUHlVbmljb2RlVUNTMl9TcGxpdCIKICAgIlB5VW5pY29kZVVDUzJfUlNwbGl0IgogICAiUHlVbmljb2RlVUNTMl9Gb3JtYXQiCisgICJfUHlVbmljb2RlVUNTMl9Jbml0IgogICAiX1B5VW5pY29kZVVDUzJfRmluaSIKICAgIlB5VW5pY29kZVVDUzJfRnJvbVVuaWNvZGUiCiAgICJQeVVuaWNvZGVVQ1MyX0FzVW5pY29kZSIKQEAgLTU5NSwxMiArNjMwLDE0IEBACiAgICJQeVVuaWNvZGVVQ1MyX0VuY29kZUxhdGluMSIKICAgIlB5VW5pY29kZVVDUzJfRW5jb2RlQVNDSUkiCiAgICJQeVVuaWNvZGVVQ1MyX0FzQ2hhcm1hcFN0cmluZyIKKyAgIlB5VW5pY29kZVVDUzJfUGFydGl0aW9uIgorICAiUHlVbmljb2RlVUNTMl9SUGFydGl0aW9uIgogICAiUHlVbmljb2RlVUNTMl9UcmFuc2xhdGUiCisgICJQeVVuaWNvZGVVQ1MyX1RhaWxtYXRjaCIKICAgIlB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3QiCi0gICJfUHlVbmljb2RlVUNTMl9Jbml0IgogICAiUHlVbmljb2RlX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih1bmljb2RlY3R5cGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodW5pY29kZWN0eXBlKQogICAiX1B5VW5pY29kZV9UeXBlUmVjb3JkcyIKICAgIl9QeVVuaWNvZGVVQ1MyX1RvTnVtZXJpYyIKICAgIl9QeVVuaWNvZGVVQ1MyX0lzTG93ZXJjYXNlIgpAQCAtNjE4LDcgKzY1NSw3IEBACiAgICJfUHlVbmljb2RlVUNTMl9Jc051bWVyaWMiCiAgICJfUHlVbmljb2RlVUNTMl9Jc0FscGhhIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIod2Vha3JlZm9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYih3ZWFrcmVmb2JqZWN0KQogICAiUHlXZWFrcmVmX05ld1JlZiIKICAgIlB5V2Vha3JlZl9OZXdQcm94eSIKICAgIlB5T2JqZWN0X0NsZWFyV2Vha1JlZnMiCkBAIC02MjksNjEgKzY2Niw4MiBAQAogICAiX1B5V2Vha3JlZl9Qcm94eVR5cGUiCiAgICJfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYmx0aW5tb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoUHl0aG9uLWFzdCkKKzsgICJpbml0X2FzdCIKKyAgIk1vZHVsZSIKKyAgIkludGVyYWN0aXZlIgorICAiRXhwcmVzc2lvbiIKKyAgIlN1aXRlIgorICAiRnVuY3Rpb25EZWYiCisgICJDbGFzc0RlZiIKKyAgIlJldHVybiIKKyAgIkRlbGV0ZSIKKyAgIkFzc2lnbiIKKyAgIkF1Z0Fzc2lnbiIKKyAgIlByaW50IgorICAiRm9yIgorICAiV2hpbGUiCisgICJJZiIKKyAgIldpdGgiCisgICJSYWlzZSIKKyAgIlRyeUV4Y2VwdCIKKyAgIlRyeUZpbmFsbHkiCisgICJBc3NlcnQiCisgICJJbXBvcnQiCisgICJJbXBvcnRGcm9tIgorICAiRXhlYyIKKyAgIkdsb2JhbCIKKyAgIkV4cHIiCisgICJQYXNzIgorICAiQnJlYWsiCisgICJDb250aW51ZSIKKyAgIkJvb2xPcCIKKyAgIkJpbk9wIgorICAiVW5hcnlPcCIKKyAgIkxhbWJkYSIKKyAgIklmRXhwIgorICAiRGljdCIKKyAgIkxpc3RDb21wIgorICAiR2VuZXJhdG9yRXhwIgorICAiWWllbGQiCisgICJDb21wYXJlIgorICAiQ2FsbCIKKyAgIlJlcHIiCisgICJOdW0iCisgICJTdHIiCisgICJBdHRyaWJ1dGUiCisgICJTdWJzY3JpcHQiCisgICJOYW1lIgorICAiTGlzdCIKKyAgIlR1cGxlIgorICAiRWxsaXBzaXMiCisgICJTbGljZSIKKyAgIkV4dFNsaWNlIgorICAiSW5kZXgiCisgICJjb21wcmVoZW5zaW9uIgorICAiZXhjZXB0aGFuZGxlciIKKyAgImFyZ3VtZW50cyIKKyAgImtleXdvcmQiCisgICJhbGlhcyIKKyAgIlB5QVNUX21vZDJvYmoiCisKKzsgRnJvbSBweXRob24yNV9zLmxpYihhc2RsKQorICAiYXNkbF9zZXFfbmV3IgorICAiYXNkbF9pbnRfc2VxX25ldyIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKGFzdCkKKyAgIlB5QVNUX0Zyb21Ob2RlIgorCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYmx0aW5tb2R1bGUpCiAgICJfUHlCdWlsdGluX0luaXQiCiAgICJQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZXhjZXB0aW9ucykKLSAgIlB5RXhjX0V4Y2VwdGlvbiIKLSAgIlB5RXhjX1R5cGVFcnJvciIKLSAgIlB5RXhjX1N0b3BJdGVyYXRpb24iCi0gICJQeUV4Y19TdGFuZGFyZEVycm9yIgotICAiUHlFeGNfU3lzdGVtRXhpdCIKLSAgIlB5RXhjX0tleWJvYXJkSW50ZXJydXB0IgotICAiUHlFeGNfSW1wb3J0RXJyb3IiCi0gICJQeUV4Y19FbnZpcm9ubWVudEVycm9yIgotICAiUHlFeGNfSU9FcnJvciIKLSAgIlB5RXhjX09TRXJyb3IiCi0gICJQeUV4Y19FT0ZFcnJvciIKLSAgIlB5RXhjX1J1bnRpbWVFcnJvciIKLSAgIlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IiCi0gICJQeUV4Y19OYW1lRXJyb3IiCi0gICJQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciIKLSAgIlB5RXhjX0F0dHJpYnV0ZUVycm9yIgotICAiUHlFeGNfU3ludGF4RXJyb3IiCi0gICJQeUV4Y19JbmRlbnRhdGlvbkVycm9yIgotICAiUHlFeGNfVGFiRXJyb3IiCi0gICJQeUV4Y19Bc3NlcnRpb25FcnJvciIKLSAgIlB5RXhjX0xvb2t1cEVycm9yIgotICAiUHlFeGNfSW5kZXhFcnJvciIKLSAgIlB5RXhjX0tleUVycm9yIgotICAiUHlFeGNfQXJpdGhtZXRpY0Vycm9yIgotICAiUHlFeGNfT3ZlcmZsb3dFcnJvciIKLSAgIlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIgotICAiUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIgotICAiUHlFeGNfVmFsdWVFcnJvciIKLSAgIlB5RXhjX1VuaWNvZGVFcnJvciIKLSAgIlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciIKLSAgIlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciIKLSAgIlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciIKLSAgIlB5RXhjX1JlZmVyZW5jZUVycm9yIgotICAiUHlFeGNfU3lzdGVtRXJyb3IiCi0gICJQeUV4Y19NZW1vcnlFcnJvciIKLSAgIlB5RXhjX1dhcm5pbmciCi0gICJQeUV4Y19Vc2VyV2FybmluZyIKLSAgIlB5RXhjX0RlcHJlY2F0aW9uV2FybmluZyIKLSAgIlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmciCi0gICJQeUV4Y19TeW50YXhXYXJuaW5nIgotICAiUHlFeGNfT3ZlcmZsb3dXYXJuaW5nIgotICAiUHlFeGNfUnVudGltZVdhcm5pbmciCi0gICJQeUV4Y19GdXR1cmVXYXJuaW5nIgotICAiUHlFeGNfTWVtb3J5RXJyb3JJbnN0IgorOyBGcm9tIHB5dGhvbjI1X3MubGliKGV4Y2VwdGlvbnMpCiAgICJQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydCIKICAgIlB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0IgogICAiUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kIgogICAiUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kIgogICAiX1B5RXhjX0luaXQiCi0gICJfUHlFeGNfRmluaSIKICAgIlB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZSIKICAgIlB5VW5pY29kZUVuY29kZUVycm9yX0NyZWF0ZSIKICAgIlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0NyZWF0ZSIKQEAgLTcwNiwxMiArNzY0LDU4IEBACiAgICJQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24iCiAgICJQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24iCiAgICJQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24iCisgICJfUHlFeGNfRmluaSIKKyAgIlB5RXhjX0Jhc2VFeGNlcHRpb24iCisgICJQeUV4Y19FeGNlcHRpb24iCisgICJQeUV4Y19TdGFuZGFyZEVycm9yIgorICAiUHlFeGNfVHlwZUVycm9yIgorICAiUHlFeGNfU3RvcEl0ZXJhdGlvbiIKKyAgIlB5RXhjX0dlbmVyYXRvckV4aXQiCisgICJQeUV4Y19TeXN0ZW1FeGl0IgorICAiUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQiCisgICJQeUV4Y19JbXBvcnRFcnJvciIKKyAgIlB5RXhjX0Vudmlyb25tZW50RXJyb3IiCisgICJQeUV4Y19JT0Vycm9yIgorICAiUHlFeGNfT1NFcnJvciIKKyAgIlB5RXhjX0VPRkVycm9yIgorICAiUHlFeGNfUnVudGltZUVycm9yIgorICAiUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciIKKyAgIlB5RXhjX05hbWVFcnJvciIKKyAgIlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIgorICAiUHlFeGNfQXR0cmlidXRlRXJyb3IiCisgICJQeUV4Y19JbmRleEVycm9yIgorICAiUHlFeGNfU3ludGF4RXJyb3IiCisgICJQeUV4Y19JbmRlbnRhdGlvbkVycm9yIgorICAiUHlFeGNfVGFiRXJyb3IiCisgICJQeUV4Y19Mb29rdXBFcnJvciIKKyAgIlB5RXhjX0tleUVycm9yIgorICAiUHlFeGNfVmFsdWVFcnJvciIKKyAgIlB5RXhjX1VuaWNvZGVFcnJvciIKKyAgIlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciIKKyAgIlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciIKKyAgIlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciIKKyAgIlB5RXhjX0Fzc2VydGlvbkVycm9yIgorICAiUHlFeGNfQXJpdGhtZXRpY0Vycm9yIgorICAiUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIgorICAiUHlFeGNfT3ZlcmZsb3dFcnJvciIKKyAgIlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIgorICAiUHlFeGNfU3lzdGVtRXJyb3IiCisgICJQeUV4Y19SZWZlcmVuY2VFcnJvciIKKyAgIlB5RXhjX01lbW9yeUVycm9yIgorICAiUHlFeGNfV2FybmluZyIKKyAgIlB5RXhjX1VzZXJXYXJuaW5nIgorICAiUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIgorICAiUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyIKKyAgIlB5RXhjX1N5bnRheFdhcm5pbmciCisgICJQeUV4Y19SdW50aW1lV2FybmluZyIKKyAgIlB5RXhjX0Z1dHVyZVdhcm5pbmciCisgICJQeUV4Y19JbXBvcnRXYXJuaW5nIgorICAiUHlFeGNfTWVtb3J5RXJyb3JJbnN0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY2V2YWwpCi0gICJQeUV2YWxfRXZhbEZyYW1lIgorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNldmFsKQorICAiUHlFdmFsX0V2YWxGcmFtZUV4IgogICAiUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMiCiAgICJQeUV2YWxfRXZhbENvZGVFeCIKLSAgIl9QeUV2YWxfU2xpY2VJbmRleCIKICAgIlB5RXZhbF9HZXRGcmFtZSIKICAgIlB5RXZhbF9DYWxsT2JqZWN0IgogICAiUHlFdmFsX1NldFByb2ZpbGUiCkBAIC03MzAsMzUgKzgzNCwzMSBAQAogICAiUHlFdmFsX0dldEZ1bmNOYW1lIgogICAiUHlFdmFsX0dldEZ1bmNEZXNjIgogICAiUHlFdmFsX0dldENhbGxTdGF0cyIKKyAgIlB5RXZhbF9FdmFsRnJhbWUiCiAgICJQeUV2YWxfU2F2ZVRocmVhZCIKICAgIlB5RXZhbF9SZXN0b3JlVGhyZWFkIgorICAiUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZCIKICAgIlB5RXZhbF9Jbml0VGhyZWFkcyIKICAgIlB5RXZhbF9BY3F1aXJlTG9jayIKICAgIlB5RXZhbF9SZWxlYXNlTG9jayIKICAgIlB5RXZhbF9BY3F1aXJlVGhyZWFkIgogICAiUHlFdmFsX1JlbGVhc2VUaHJlYWQiCiAgICJQeUV2YWxfUmVJbml0VGhyZWFkcyIKKyAgIl9QeUV2YWxfU2xpY2VJbmRleCIKICAgIlB5RXZhbF9FdmFsQ29kZSIKICAgIl9QeUV2YWxfQ2FsbFRyYWNpbmciCiAgICJfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCIKICAgIl9QeV9DaGVja0ludGVydmFsIgogICAiX1B5X1RpY2tlciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNvbXBpbGUpCi0gICJQeUNvZGVfTmV3IgotICAiUHlTeW10YWJsZV9GcmVlIgotICAiUHlOb2RlX0NvbXBpbGUiCi0gICJQeU5vZGVfQ29tcGlsZUZsYWdzIgotICAiUHlDb2RlX0FkZHIyTGluZSIKKzsgRnJvbSBweXRob24yNV9zLmxpYihjb21waWxlKQogICAiX1B5X01hbmdsZSIKLSAgIlB5Tm9kZV9Db21waWxlU3ltdGFibGUiCisgICJQeUFTVF9Db21waWxlIgorICAiUHlOb2RlX0NvbXBpbGUiCiAgICJQeV9PcHRpbWl6ZUZsYWciCi0gICJQeUNvZGVfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNvZGVjcykKKzsgRnJvbSBweXRob24yNV9zLmxpYihjb2RlY3MpCiAgICJfUHlDb2RlY19Mb29rdXAiCi0gICJQeUNvZGVjX1N0cmVhbVJlYWRlciIKLSAgIlB5Q29kZWNfU3RyZWFtV3JpdGVyIgogICAiUHlDb2RlY19FbmNvZGUiCiAgICJQeUNvZGVjX0RlY29kZSIKICAgIlB5Q29kZWNfSWdub3JlRXJyb3JzIgpAQCAtNzY4LDE0ICs4NjgsMTcgQEAKICAgIlB5Q29kZWNfUmVnaXN0ZXIiCiAgICJQeUNvZGVjX0VuY29kZXIiCiAgICJQeUNvZGVjX0RlY29kZXIiCisgICJQeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlciIKKyAgIlB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyIgorICAiUHlDb2RlY19TdHJlYW1SZWFkZXIiCisgICJQeUNvZGVjX1N0cmVhbVdyaXRlciIKICAgIlB5Q29kZWNfUmVnaXN0ZXJFcnJvciIKICAgIlB5Q29kZWNfTG9va3VwRXJyb3IiCiAgICJQeUNvZGVjX1N0cmljdEVycm9ycyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGVycm9ycykKKzsgRnJvbSBweXRob24yNV9zLmxpYihlcnJvcnMpCiAgICJQeUVycl9TZXROb25lIgogICAiUHlFcnJfU2V0U3RyaW5nIgotICAiUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyIKICAgIlB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyIKICAgIlB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbiIKICAgIlB5RXJyX0ZldGNoIgpAQCAtNzkwLDYgKzg5Myw3IEBACiAgICJQeUVycl9TZXRPYmplY3QiCiAgICJQeUVycl9PY2N1cnJlZCIKICAgIlB5RXJyX1Jlc3RvcmUiCisgICJQeUVycl9FeGNlcHRpb25NYXRjaGVzIgogICAiUHlFcnJfQmFkQXJndW1lbnQiCiAgICJQeUVycl9TZXRGcm9tRXJybm8iCiAgICJQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUiCkBAIC03OTgsNDIgKzkwMiw0OCBAQAogICAiUHlFcnJfV2FybiIKICAgIlB5RXJyX1dhcm5FeHBsaWNpdCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZyb3plbikKKzsgRnJvbSBweXRob24yNV9zLmxpYihmcm96ZW4pCiAgICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZnJvemVubWFpbikKKzsgRnJvbSBweXRob24yNV9zLmxpYihmcm96ZW5tYWluKQogICAiUHlfRnJvemVuTWFpbiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZ1dHVyZSkKLSAgIlB5Tm9kZV9GdXR1cmUiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZnV0dXJlKQorICAiUHlGdXR1cmVfRnJvbUFTVCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldGFyZ3MpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0YXJncykKICAgIlB5QXJnX1BhcnNlIgorICAiX1B5QXJnX1BhcnNlX1NpemVUIgogICAiUHlBcmdfUGFyc2VUdXBsZSIKKyAgIl9QeUFyZ19QYXJzZVR1cGxlX1NpemVUIgogICAiUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIgorICAiX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVCIKICAgIlB5QXJnX1VucGFja1R1cGxlIgorICAiX1B5QXJnX05vS2V5d29yZHMiCiAgICJQeUFyZ19WYVBhcnNlIgogICAiUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMiCisgICJfUHlBcmdfVmFQYXJzZV9TaXplVCIKKyAgIl9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldGNvbXBpbGVyKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdldGNvbXBpbGVyKQogICAiUHlfR2V0Q29tcGlsZXIiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZXRjb3B5cmlnaHQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0Y29weXJpZ2h0KQogICAiUHlfR2V0Q29weXJpZ2h0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0bXRpbWUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0bXRpbWUpCiAgICJQeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0cGxhdGZvcm0pCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0cGxhdGZvcm0pCiAgICJQeV9HZXRQbGF0Zm9ybSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldHZlcnNpb24pCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0dmVyc2lvbikKICAgIlB5X0dldFZlcnNpb24iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihncmFtaW5pdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihncmFtaW5pdCkKICAgIl9QeVBhcnNlcl9HcmFtbWFyIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaW1wb3J0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGltcG9ydCkKICAgIl9QeUltcG9ydF9Jbml0IgogICAiX1B5SW1wb3J0SG9va3NfSW5pdCIKICAgIlB5SW1wb3J0X0ltcG9ydE1vZHVsZSIKQEAgLTg0Myw2ICs5NTMsNyBAQAogICAiUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeCIKICAgIlB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZSIKICAgIlB5SW1wb3J0X0ltcG9ydE1vZHVsZUV4IgorICAiUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwiCiAgICJQeUltcG9ydF9SZWxvYWRNb2R1bGUiCiAgICJQeUltcG9ydF9JbXBvcnQiCiA7ICAiaW5pdGltcCIKQEAgLTg1MCwxNiArOTYxLDE5IEBACiAgICJQeUltcG9ydF9HZXRNYWdpY051bWJlciIKICAgIlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlIgogICAiUHlJbXBvcnRfR2V0TW9kdWxlRGljdCIKKyAgIl9QeUltcG9ydF9GaW5kTW9kdWxlIgorICAiX1B5SW1wb3J0X0lzU2NyaXB0IgorICAiX1B5SW1wb3J0X1JlSW5pdExvY2siCiAgICJfUHlJbXBvcnRfRmluZEV4dGVuc2lvbiIKICAgIlB5SW1wb3J0X0FwcGVuZEluaXR0YWIiCiAgICJQeUltcG9ydF9FeHRlbmRJbml0dGFiIgogICAiUHlJbXBvcnRfSW5pdHRhYiIKICAgIl9QeUltcG9ydF9GaWxldGFiIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaW1wb3J0ZGwpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoaW1wb3J0ZGwpCiAgICJfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtYXJzaGFsKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1hcnNoYWwpCiAgICJQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZSIKICAgIlB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nIgogICAiUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSIKQEAgLTg3MCwzMSArOTg0LDQwIEBACiAgICJQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmciCiAgICJQeU1hcnNoYWxfSW5pdCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG1vZHN1cHBvcnQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobW9kc3VwcG9ydCkKICAgIlB5X0luaXRNb2R1bGU0IgogICAiUHlfQnVpbGRWYWx1ZSIKLSAgIlB5X1ZhQnVpbGRWYWx1ZSIKKyAgIl9QeV9CdWlsZFZhbHVlX1NpemVUIgogICAiUHlFdmFsX0NhbGxGdW5jdGlvbiIKICAgIlB5RXZhbF9DYWxsTWV0aG9kIgorICAiX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVCIKKyAgIlB5X1ZhQnVpbGRWYWx1ZSIKICAgIlB5TW9kdWxlX0FkZE9iamVjdCIKICAgIlB5TW9kdWxlX0FkZEludENvbnN0YW50IgogICAiUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQiCiAgICJfUHlfUGFja2FnZUNvbnRleHQiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihteXNucHJpbnRmKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG15c25wcmludGYpCiAgICJQeU9TX3NucHJpbnRmIgogICAiUHlPU192c25wcmludGYiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihteXN0cnRvdWwpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobXlzdHJ0b3VsKQogICAiUHlPU19zdHJ0b3VsIgogICAiUHlPU19zdHJ0b2wiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihweWZwZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihweWFyZW5hKQorICAiUHlBcmVuYV9OZXciCisgICJQeUFyZW5hX0ZyZWUiCisgICJQeUFyZW5hX01hbGxvYyIKKyAgIlB5QXJlbmFfQWRkUHlPYmplY3QiCisKKzsgRnJvbSBweXRob24yNV9zLmxpYihweWZwZSkKICAgIlB5RlBFX2R1bW15IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocHlzdGF0ZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihweXN0YXRlKQogICAiUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyIgogICAiUHlUaHJlYWRTdGF0ZV9DbGVhciIKKyAgIl9QeVRocmVhZF9DdXJyZW50RnJhbWVzIgogICAiUHlHSUxTdGF0ZV9FbnN1cmUiCiAgICJQeUdJTFN0YXRlX1JlbGVhc2UiCiAgICJQeUludGVycHJldGVyU3RhdGVfTmV3IgpAQCAtOTE2LDEyICsxMDM5LDEyIEBACiAgICJfUHlUaHJlYWRTdGF0ZV9DdXJyZW50IgogICAiX1B5VGhyZWFkU3RhdGVfR2V0RnJhbWUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihweXN0cnRvZCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihweXN0cnRvZCkKICAgIlB5T1NfYXNjaWlfc3RydG9kIgogICAiUHlPU19hc2NpaV9mb3JtYXRkIgogICAiUHlPU19hc2NpaV9hdG9mIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocHl0aG9ucnVuKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHB5dGhvbnJ1bikKICAgIlB5X0lnbm9yZUVudmlyb25tZW50RmxhZyIKICAgIlB5X0RlYnVnRmxhZyIKICAgIlB5X1ZlcmJvc2VGbGFnIgpAQCAtOTMzLDYgKzEwNTYsNyBAQAogICAiUHlfTmV3SW50ZXJwcmV0ZXIiCiAgICJQeUVycl9QcmludCIKICAgIlB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MiCisgICJQeVBhcnNlcl9BU1RGcm9tRmlsZSIKICAgIlB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzIgogICAiUHlSdW5fRmlsZUV4RmxhZ3MiCiAgICJQeV9FeGl0IgpAQCAtOTQ2LDI5ICsxMDcwLDE1IEBACiAgICJQeV9GaW5hbGl6ZSIKICAgIlB5X0lzSW5pdGlhbGl6ZWQiCiAgICJQeV9FbmRJbnRlcnByZXRlciIKLSAgIlB5UnVuX0FueUZpbGUiCi0gICJQeVJ1bl9BbnlGaWxlRXhGbGFncyIKLSAgIlB5UnVuX0FueUZpbGVFeCIKICAgIlB5UnVuX0FueUZpbGVGbGFncyIKICAgIlB5X0ZkSXNJbnRlcmFjdGl2ZSIKICAgIlB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzIgotICAiUHlSdW5fU2ltcGxlU3RyaW5nIgorICAiUHlSdW5fQW55RmlsZUV4RmxhZ3MiCiAgICJQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyIKICAgIlB5UnVuX1N0cmluZ0ZsYWdzIgotICAiUHlSdW5fU2ltcGxlRmlsZSIKLSAgIlB5UnVuX1NpbXBsZUZpbGVFeCIKLSAgIlB5UnVuX0ludGVyYWN0aXZlT25lIgotICAiUHlSdW5fSW50ZXJhY3RpdmVMb29wIgotICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmciCi0gICJQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGUiCisgICJQeVBhcnNlcl9BU1RGcm9tU3RyaW5nIgogICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyIKLSAgIlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSIKICAgIlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzIgotICAiUHlSdW5fU3RyaW5nIgotICAiUHlSdW5fRmlsZSIKLSAgIlB5UnVuX0ZpbGVFeCIKLSAgIlB5UnVuX0ZpbGVGbGFncyIKLSAgIlB5X0NvbXBpbGVTdHJpbmciCiAgICJQeV9Db21waWxlU3RyaW5nRmxhZ3MiCiAgICJQeV9TeW10YWJsZVN0cmluZyIKICAgIlB5X0F0RXhpdCIKQEAgLTk3Niw0OSArMTA4Niw2OSBAQAogICAiUHlPU19zZXRzaWciCiAgICJQeVBhcnNlcl9TZXRFcnJvciIKICAgIlB5TW9kdWxlX0dldFdhcm5pbmdzTW9kdWxlIgorICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lIgogICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGaWxlbmFtZSIKKyAgIlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZSIKKyAgIlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nIgorICAiUHlSdW5fQW55RmlsZSIKKyAgIlB5UnVuX0FueUZpbGVFeCIKKyAgIlB5UnVuX0ZpbGUiCisgICJQeVJ1bl9GaWxlRXgiCisgICJQeVJ1bl9GaWxlRmxhZ3MiCisgICJQeVJ1bl9TaW1wbGVGaWxlIgorICAiUHlSdW5fU2ltcGxlRmlsZUV4IgorICAiUHlSdW5fU3RyaW5nIgorICAiUHlSdW5fU2ltcGxlU3RyaW5nIgorICAiUHlfQ29tcGlsZVN0cmluZyIKKyAgIlB5UnVuX0ludGVyYWN0aXZlT25lIgorICAiUHlSdW5fSW50ZXJhY3RpdmVMb29wIgogICAiUHlfVXNlQ2xhc3NFeGNlcHRpb25zRmxhZyIKICAgIlB5X1VuaWNvZGVGbGFnIgogICAiX1B5X1FuZXdGbGFnIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3RydWN0bWVtYmVyKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN0cnVjdG1lbWJlcikKICAgIlB5TWVtYmVyX0dldCIKICAgIlB5TWVtYmVyX0dldE9uZSIKICAgIlB5TWVtYmVyX1NldE9uZSIKICAgIlB5TWVtYmVyX1NldCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHN5bXRhYmxlKQotICAiUHlTeW10YWJsZUVudHJ5X05ldyIKLSAgIlB5U3ltdGFibGVFbnRyeV9UeXBlIgorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN5bXRhYmxlKQorICAiUHlTeW10YWJsZV9CdWlsZCIKKyAgIlB5U3ltdGFibGVfRnJlZSIKKyAgIlB5U1RfR2V0U2NvcGUiCisgICJQeVN5bXRhYmxlX0xvb2t1cCIKKyAgIlB5U1RFbnRyeV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3lzbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN5c21vZHVsZSkKICAgIl9QeVN5c19Jbml0IgorICAiUHlTeXNfV3JpdGVTdGRlcnIiCiAgICJQeVN5c19TZXRQYXRoIgogICAiUHlTeXNfU2V0QXJndiIKICAgIlB5U3lzX1dyaXRlU3Rkb3V0IgotICAiUHlTeXNfV3JpdGVTdGRlcnIiCisgICJQeV9TdWJ2ZXJzaW9uUmV2aXNpb24iCisgICJQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2giCiAgICJQeVN5c19HZXRPYmplY3QiCiAgICJQeVN5c19TZXRPYmplY3QiCiAgICJQeVN5c19HZXRGaWxlIgogICAiUHlTeXNfUmVzZXRXYXJuT3B0aW9ucyIKICAgIlB5U3lzX0FkZFdhcm5PcHRpb24iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0cmFjZWJhY2spCis7IEZyb20gcHl0aG9uMjVfcy5saWIodHJhY2ViYWNrKQogICAiUHlUcmFjZUJhY2tfSGVyZSIKICAgIlB5VHJhY2VCYWNrX1ByaW50IgogICAiUHlUcmFjZUJhY2tfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldG9wdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRvcHQpCiAgICJfUHlPU19HZXRPcHQiCiAgICJfUHlPU19vcHRlcnIiCiAgICJfUHlPU19vcHRpbmQiCiAgICJfUHlPU19vcHRhcmciCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihkeW5sb2FkX3NobGliKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGR5bmxvYWRfc2hsaWIpCiAgICJfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIiCiAgICJfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0aHJlYWQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodGhyZWFkKQogICAiUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZSIKICAgIlB5VGhyZWFkX2luaXRfdGhyZWFkIgogICAiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCIKQEAgLTEwMjgsMTMgKzExNTgsMTUgQEAKICAgIlB5VGhyZWFkX2ZyZWVfbG9jayIKICAgIlB5VGhyZWFkX2FjcXVpcmVfbG9jayIKICAgIlB5VGhyZWFkX3JlbGVhc2VfbG9jayIKKyAgIlB5VGhyZWFkX2dldF9zdGFja3NpemUiCisgICJQeVRocmVhZF9zZXRfc3RhY2tzaXplIgogICAiUHlUaHJlYWRfY3JlYXRlX2tleSIKICAgIlB5VGhyZWFkX2RlbGV0ZV9rZXkiCiAgICJQeVRocmVhZF9zZXRfa2V5X3ZhbHVlIgogICAiUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSIKICAgIlB5VGhyZWFkX19leGl0X3RocmVhZCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdjbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdjbW9kdWxlKQogOyAgImluaXRnYyIKICAgIl9QeU9iamVjdF9HQ19OZXciCiAgICJfUHlPYmplY3RfR0NfTmV3VmFyIgpAQCAtMTA1MCw3ICsxMTgyLDcgQEAKICAgIl9QeU9iamVjdF9HQ19EZWwiCiAgICJfUHlHQ19nZW5lcmF0aW9uMCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHNpZ25hbG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzaWduYWxtb2R1bGUpCiA7ICAiaW5pdHNpZ25hbCIKICAgIlB5RXJyX0NoZWNrU2lnbmFscyIKICAgIlB5RXJyX1NldEludGVycnVwdCIKQEAgLTEwNTksMTE1ICsxMTkxLDEyNCBAQAogICAiUHlPU19Jbml0SW50ZXJydXB0cyIKICAgIlB5T1NfQWZ0ZXJGb3JrIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocG9zaXhtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIocG9zaXhtb2R1bGUpCiA7ICAiaW5pdG9zMiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRocmVhZG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYih0aHJlYWRtb2R1bGUpCiA7ICAiaW5pdHRocmVhZCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGFycmF5bW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGFycmF5bW9kdWxlKQogOyAgImluaXRhcnJheSIKIDsgICJhcnJheV9tZXRob2RzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYmluYXNjaWkpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYmluYXNjaWkpCiA7ICAiaW5pdGJpbmFzY2lpIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY21hdGhtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY21hdGhtb2R1bGUpCiA7ICAiaW5pdGNtYXRoIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoX2NvZGVjc21vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihfY29kZWNzbW9kdWxlKQogOyAgImluaXRfY29kZWNzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY29sbGVjdGlvbnNtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY29sbGVjdGlvbnNtb2R1bGUpCiA7ICAiaW5pdGNvbGxlY3Rpb25zIgogICAiZGVxdWVpdGVyX3R5cGUiCiAgICJkZXF1ZXJldml0ZXJfdHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNQaWNrbGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY1BpY2tsZSkKIDsgICJpbml0Y1BpY2tsZSIKIDsgICJmYXN0X3NhdmVfbGVhdmUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjU3RyaW5nSU8pCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY1N0cmluZ0lPKQogOyAgImluaXRjU3RyaW5nSU8iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfY3N2KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKF9jc3YpCiA7ICAiaW5pdF9jc3YiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihkYXRldGltZW1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihkYXRldGltZW1vZHVsZSkKIDsgICJpbml0ZGF0ZXRpbWUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihkbG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihkbG1vZHVsZSkKIDsgICJpbml0ZGwiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihlcnJub21vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihlcnJub21vZHVsZSkKIDsgICJpbml0ZXJybm8iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihmY250bG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihmY250bG1vZHVsZSkKIDsgICJpbml0ZmNudGwiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfaGVhcHFtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoX2Z1bmN0b29sc21vZHVsZSkKKzsgICJpbml0X2Z1bmN0b29scyIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKF9oZWFwcW1vZHVsZSkKIDsgICJpbml0X2hlYXBxIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaW1hZ2VvcCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihpbWFnZW9wKQogOyAgImluaXRpbWFnZW9wIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaXRlcnRvb2xzbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGl0ZXJ0b29sc21vZHVsZSkKIDsgICJpbml0aXRlcnRvb2xzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoX2xvY2FsZW1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihfbG9jYWxlbW9kdWxlKQogOyAgImluaXRfbG9jYWxlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobWF0aG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihtYXRobW9kdWxlKQogOyAgImluaXRtYXRoIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobWQ1YykKLTsgICJfUHlfTUQ1RmluYWwiCi07ICAiX1B5X01ENUluaXQiCi07ICAiX1B5X01ENVVwZGF0ZSIKKzsgRnJvbSBweXRob24yNV9zLmxpYihtZDUpCisgICJtZDVfZmluaXNoIgorICAibWQ1X2luaXQiCisgICJtZDVfYXBwZW5kIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobWQ1bW9kdWxlKQotOyAgImluaXRtZDUiCis7IEZyb20gcHl0aG9uMjVfcy5saWIobWQ1bW9kdWxlKQorOyAgImluaXRfbWQ1IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIob3BlcmF0b3IpCis7IEZyb20gcHl0aG9uMjVfcy5saWIob3BlcmF0b3IpCiA7ICAiaW5pdG9wZXJhdG9yIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoX3JhbmRvbW1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihfcmFuZG9tbW9kdWxlKQogOyAgImluaXRfcmFuZG9tIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIocmdiaW1nbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHJnYmltZ21vZHVsZSkKIDsgICJpbml0cmdiaW1nIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc2hhbW9kdWxlKQotOyAgImluaXRzaGEiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc2hhbW9kdWxlKQorOyAgImluaXRfc2hhIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoX3NyZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzaGEyNTZtb2R1bGUpCis7ICAiaW5pdF9zaGEyNTYiCisKKzsgRnJvbSBweXRob24yNV9zLmxpYihzaGE1MTJtb2R1bGUpCis7ICAiaW5pdF9zaGE1MTIiCisKKzsgRnJvbSBweXRob24yNV9zLmxpYihfc3JlKQogOyAgImluaXRfc3JlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3Ryb3Btb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3Ryb3Btb2R1bGUpCiA7ICAiaW5pdHN0cm9wIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3RydWN0bW9kdWxlKQotOyAgImluaXRzdHJ1Y3QiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoX3N0cnVjdCkKKzsgICJpbml0X3N0cnVjdCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHN5bXRhYmxlbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN5bXRhYmxlbW9kdWxlKQogOyAgImluaXRfc3ltdGFibGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0ZXJtaW9zKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHRlcm1pb3MpCiA7ICAiaW5pdHRlcm1pb3MiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0aW1lbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHRpbWVtb2R1bGUpCiA7ICAiaW5pdHRpbWUiCiAgICJfUHlUaW1lX0RvdWJsZVRvVGltZXQiCiA7ICAiaW5pdHRpbWV6b25lIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIodGltaW5nbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHRpbWluZ21vZHVsZSkKIDsgICJpbml0dGltaW5nIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoX3dlYWtyZWYpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoX3dlYWtyZWYpCiA7ICAiaW5pdF93ZWFrcmVmIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoeHhzdWJ0eXBlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHh4c3VidHlwZSkKIDsgICJpbml0eHhzdWJ0eXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoemlwaW1wb3J0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHppcGltcG9ydCkKIDsgICJpbml0emlwaW1wb3J0IgpkaWZmIC0tZ2l0IGEvUEMvb3MydmFjcHAvcHljb25maWcuaCBiL1BDL29zMnZhY3BwL3B5Y29uZmlnLmgKaW5kZXggYzg1OGZlOS4uOTdmOWI4MCAxMDA2NDQKLS0tIGEvUEMvb3MydmFjcHAvcHljb25maWcuaAorKysgYi9QQy9vczJ2YWNwcC9weWNvbmZpZy5oCkBAIC0xMTIsNiArMTEyLDEwIEBACiAjZGVmaW5lIEhBVkVfSFlQT1QgICAgICAgICAgICAgICAxIC8qIGh5cG90KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSEFWRV9QVVRFTlYgICAgICAgICAgICAgIDEgLyogcHV0ZW52KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogI2RlZmluZSBWQV9MSVNUX0lTX0FSUkFZICAgMSAqLyAvKiBpZiB2YV9saXN0IGlzIGFuIGFycmF5IG9mIHNvbWUga2luZCAgICovCisvKiAjZGVmaW5lIEhBVkVfQ09OSU9fSCAgICAgICAxICovIC8qICNpbmNsdWRlIDxjb25pby5oPiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IICAgICAgICAgICAgIDEgLyogI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggICAgICAgICAgMSAvKiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggICAgICAgICAxIC8qICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAgICAgICAgKi8KIAogICAvKiBWYXJpYWJsZS1Bcmd1bWVudHMvUHJvdG90eXBlcyAqLwogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMgICAgICAgICAgMSAvKiBWQUMrKyBzdXBwb3J0cyBDIEZ1bmN0aW9uIFByb3RvdHlwZXMgICovCkBAIC0xMjQsNiArMTI4LDcgQEAKICNkZWZpbmUgTUFMTE9DX1pFUk9fUkVUVVJOU19OVUxMIDEgLyogT3VyIG1hbGxvYygwKSByZXR1cm5zIGEgTlVMTCBwdHIgICAgICAqLwogCiAgIC8qIFNpZ25hbCBIYW5kbGluZyAqLworI2RlZmluZSBIQVZFX1NJR05BTF9IICAgICAgICAgICAgMSAvKiBzaWduYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIFJFVFNJR1RZUEUgICAgICAgICAgICB2b2lkIC8qIFJldHVybiB0eXBlIG9mIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkgKi8KIC8qICN1bmRlZiBXQU5UX1NJR0ZQRV9IQU5ETEVSICAgKi8gLyogSGFuZGxlIFNJR0ZQRSAoc2VlIEluY2x1ZGUvcHlmcGUuaCkgICAqLwogLyogI2RlZmluZSBIQVZFX0FMQVJNICAgICAgICAgMSAqLyAvKiBhbGFybSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjMsNyArMTY4LDkgQEAKICNkZWZpbmUgSEFWRV9TRVRWQlVGICAgICAgICAgICAgIDEgLyogc2V0dmJ1ZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBIQVZFX0dFVENXRCAgICAgICAgICAgICAgMSAvKiBnZXRjd2QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfUElQRSAgICAgICAgICAgICAgICAxIC8qIHBpcGUoKSAgICAgW09TLzItc3BlY2lmaWMgY29kZSBhZGRlZF0gKi8KKyNkZWZpbmUgSEFWRV9JT19IICAgICAgICAgICAgICAgIDEgLyogI2luY2x1ZGUgPGlvLmg+ICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBIQVZFX0ZDTlRMX0ggICAgICAgICAgICAgMSAvKiAjaW5jbHVkZSA8ZmNudGwuaD4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfRElSRUNUX0ggICAgICAgICAgICAxIC8qICNpbmNsdWRlIDxkaXJlY3QuaD4gICAgICAgICAgICAgICAgICAgKi8KIC8qICNkZWZpbmUgSEFWRV9GTE9DSyAgICAgICAgIDEgKi8gLyogZmxvY2soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogI2RlZmluZSBIQVZFX1RSVU5DQVRFICAgICAgMSAqLyAvKiB0cnVuY2F0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAjZGVmaW5lIEhBVkVfRlRSVU5DQVRFICAgICAxICovIC8qIGZ0cnVuY2F0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3Miw2ICsxNzksNyBAQAogLyogI2RlZmluZSBIQVZFX09QRU5ESVIgICAgICAgMSAqLyAvKiBvcGVuZGlyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgLyogUHJvY2VzcyBPcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfUFJPQ0VTU19IICAgICAgICAgICAxIC8qICNpbmNsdWRlIDxwcm9jZXNzLmg+ICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSEFWRV9HRVRQSUQgICAgICAgICAgICAgIDEgLyogZ2V0cGlkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBIQVZFX1NZU1RFTSAgICAgICAgICAgICAgMSAvKiBzeXN0ZW0oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfV0FJVCAgICAgICAgICAgICAgICAxIC8qIHdhaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL1BDL3B5Y29uZmlnLmggYi9QQy9weWNvbmZpZy5oCmluZGV4IGNiNDIxMzEuLmUwZGY2NzMgMTAwNjQ0Ci0tLSBhL1BDL3B5Y29uZmlnLmgKKysrIGIvUEMvcHljb25maWcuaApAQCAtNzgsOCArNzgsMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lOQ0UKLSNkZWZpbmUgRE9OVF9IQVZFX1NZU19TVEFUX0gKLSNkZWZpbmUgRE9OVF9IQVZFX0VSUk5PX0gKKy8qIFB5dGhvbiB1c2VzIEdldFZlcnNpb24oKSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgKiBXaW5kb3dzIE5UIGFuZCA5eC9NRSB3aGVyZSBPUyBVbmljb2RlIHN1cHBvcnQgaXMgY29uY2VybmVkLgorICogV2luZG93cyBDRSBzdXBwb3J0cyBVbmljb2RlIGluIHRoZSBzYW1lIHdheSBhcyBOVCBzbyB3ZQorICogZGVmaW5lIHRoZSBtaXNzaW5nIEdldFZlcnNpb24oKSBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBHZXRWZXJzaW9uKCkgKDQpCisvKiBXaW5kb3dzIENFIGRvZXMgbm90IHN1cHBvcnQgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjZGVmaW5lIGdldGVudih2KSAoTlVMTCkKKyNkZWZpbmUgZW52aXJvbiAoTlVMTCkKICNlbmRpZgogCiAvKiBDb21waWxlciBzcGVjaWZpYyBkZWZpbmVzICovCkBAIC0xNjQsNiArMTcxLDEyIEBACiAjZGVmaW5lIFB5X0lTX0lORklOSVRZKFgpICghX2Zpbml0ZShYKSAmJiAhX2lzbmFuKFgpKQogI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgX2Zpbml0ZShYKQogCisvKiBUdXJuIG9mZiB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGVkIEMgcnVudGltZSBmdW5jdGlvbnMgaW4gCisgICBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1ICovCisjaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhZGVmaW5lZCBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKwogI2VuZGlmIC8qIF9NU0NfVkVSICovCiAKIC8qIGRlZmluZSBzb21lIEFOU0kgdHlwZXMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gZWFybGllciBXaW4gaGVhZGVycyAqLwpAQCAtMzUwLDYgKzM2MywxNiBAQAogLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwogLyogI2RlZmluZSBjb25zdCAgKi8KIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb25pby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZm5kZWYgTVNfV0lOQ0UKKyNkZWZpbmUgSEFWRV9DT05JT19IIDEKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZm5kZWYgTVNfV0lOQ0UKKyNkZWZpbmUgSEFWRV9ESVJFQ1RfSCAxCisjZW5kaWYKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGRpcmVudC5oLiAgKi8KIC8qICNkZWZpbmUgRElSRU5UIDEgKi8KIApAQCAtNTU1LDExICs1NzgsMjYgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAgKi8KIC8qICN1bmRlZiBIQVZFX0RMRkNOX0ggKi8KIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZm5kZWYgTVNfV0lOQ0UKKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKyNlbmRpZgorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCiAjaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCiAjZW5kaWYKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAqLworI2lmbmRlZiBNU19XSU5DRQorI2RlZmluZSBIQVZFX1BST0NFU1NfSCAxCisjZW5kaWYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjaWZuZGVmIE1TX1dJTkNFCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorI2VuZGlmCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBwcm90b3R5cGVzLiAgKi8KICNkZWZpbmUgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwogCkBAIC01NzUsMTIgKzYxMywyMiBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEgKi8KIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCisjaWZuZGVmIE1TX1dJTkNFCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisjZW5kaWYKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMSAqLwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZXMuaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI2RlZmluZSBIQVZFX1NZU19USU1FU19IIDEgKi8KIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI2lmbmRlZiBNU19XSU5DRQorI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKyNlbmRpZgorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI2RlZmluZSBIQVZFX1NZU19VTl9IIDEgKi8KIApkaWZmIC0tZ2l0IGEvUEMvd2luc291bmQuYyBiL1BDL3dpbnNvdW5kLmMKaW5kZXggYmMzMGNjYy4uNGU5NDIzMCAxMDA2NDQKLS0tIGEvUEMvd2luc291bmQuYworKysgYi9QQy93aW5zb3VuZC5jCkBAIC0zNyw4ICszNywxMCBAQAogCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4JLyogcG9ydCBmdW5jdGlvbnMgb24gV2luOXggKi8KICNpbmNsdWRlIDxQeXRob24uaD4KKyNpZmRlZiBIQVZFX0NPTklPX0gKKyNpbmNsdWRlIDxjb25pby5oPgkvKiBwb3J0IGZ1bmN0aW9ucyBvbiBXaW45eCAqLworI2VuZGlmCiAKIFB5RG9jX1NUUlZBUihzb3VuZF9wbGF5c291bmRfZG9jLAogIlBsYXlTb3VuZChzb3VuZCwgZmxhZ3MpIC0gYSB3cmFwcGVyIGFyb3VuZCB0aGUgV2luZG93cyBQbGF5U291bmQgQVBJXG4iCkBAIC0xNDUsNyArMTQ3LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotI2lmZGVmIF9NX0lYODYKKyNpZiBkZWZpbmVkKF9NX0lYODYpICYmIGRlZmluZWQoSEFWRV9DT05JT19IKQogCWVsc2UgaWYgKHdoaWNoT1MgPT0gV2luOVgpIHsKIAkJaW50IHNwZWFrZXJfc3RhdGU7CiAJCS8qIEZvcmNlIHRpbWVyIGludG8gb3NjaWxsYXRvciBtb2RlIHZpYSB0aW1lciBjb250cm9sIHBvcnQuICovCkBAIC0xNzAsNyArMTcyLDcgQEAKIAkJLyogUmVzdG9yZSBzcGVha2VyIGNvbnRyb2wgdG8gb3JpZ2luYWwgc3RhdGUuICovCiAJCV9vdXRwKDB4NjEsIHNwZWFrZXJfc3RhdGUpOwogCX0KLSNlbmRpZiAvKiBfTV9JWDg2ICovCisjZW5kaWYgLyogX01fSVg4NiAmJiBIQVZFX0NPTklPX0ggKi8KIAllbHNlIHsKIAkJYXNzZXJ0KCEid2luc291bmQncyB3aGljaE9TIGhhcyBpbnNhbmUgdmFsdWUiKTsKIAl9CmRpZmYgLS1naXQgYS9QQ2J1aWxkL19tc2kudmNwcm9qIGIvUENidWlsZC9fbXNpLnZjcHJvagppbmRleCBmYjg5MjVlLi5iNGFmZWI0IDEwMDY0NAotLS0gYS9QQ2J1aWxkL19tc2kudmNwcm9qCisrKyBiL1BDYnVpbGQvX21zaS52Y3Byb2oKQEAgLTM2LDExICszNiwxMSBAQAogCQkJPFRvb2wKIAkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCiAJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZmNpLmxpYiBtc2kubGliIHJwY3J0NC5saWIiCi0JCQkJT3V0cHV0RmlsZT0iLi9fbXNpLnB5ZCIKKwkJCQlPdXRwdXRGaWxlPSIuL19tc2lfZC5weWQiCiAJCQkJTGlua0luY3JlbWVudGFsPSIxIgogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKIAkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCi0JCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19tc2kucGRiIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fbXNpX2QucGRiIgogCQkJCUJhc2VBZGRyZXNzPSIweDFEMTYwMDAwIgogCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fbXNpLmxpYiIKIAkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL19zc2wudmNwcm9qIGIvUENidWlsZC9fc3NsLnZjcHJvagppbmRleCAzZWJlZGJkLi5iYzY5ZWU4IDEwMDY0NAotLS0gYS9QQ2J1aWxkL19zc2wudmNwcm9qCisrKyBiL1BDYnVpbGQvX3NzbC52Y3Byb2oKQEAgLTIxLDggKzIxLDggQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTk1ha2VUb29sIgotCQkJCUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkiCi0JCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJweXRob24gYnVpbGRfc3NsLnB5IC1hIgorCQkJCUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJidWlsZF9zc2wuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpIC1hIgogCQkJCUNsZWFuQ29tbWFuZExpbmU9ImVjaG8gTm90aGluZyB0byBkbyIKIAkJCQlPdXRwdXQ9Il9zc2wucHlkIi8+CiAJCTwvQ29uZmlndXJhdGlvbj4KQEAgLTM1LDggKzM1LDggQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTk1ha2VUb29sIgotCQkJCUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbl9kIC11IGJ1aWxkX3NzbC5weSAtZCIKLQkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbl9kIC11IGJ1aWxkX3NzbC5weSAtZCAtYSIKKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJidWlsZF9zc2wuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0iYnVpbGRfc3NsLmJhdCAkKENvbmZpZ3VyYXRpb25OYW1lKSAtYSIKIAkJCQlDbGVhbkNvbW1hbmRMaW5lPSJlY2hvIE5vdGhpbmcgdG8gZG8iCiAJCQkJT3V0cHV0PSJfc3NsX2QucHlkIi8+CiAJCTwvQ29uZmlndXJhdGlvbj4KQEAgLTQ5LDggKzQ5LDkgQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTk1ha2VUb29sIgotCQkJCUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkiCi0JCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJweXRob24gYnVpbGRfc3NsLnB5IC1hIgorCQkJCUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJidWlsZF9zc2wuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpIC1hIgorCQkJCUNsZWFuQ29tbWFuZExpbmU9ImVjaG8gTm90aGluZyB0byBkbyIKIAkJCQlPdXRwdXQ9Il9zc2wucHlkIi8+CiAJCTwvQ29uZmlndXJhdGlvbj4KIAkJPENvbmZpZ3VyYXRpb24KQEAgLTYyLDggKzYzLDkgQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTk1ha2VUb29sIgotCQkJCUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkiCi0JCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJweXRob24gYnVpbGRfc3NsLnB5IC1hIgorCQkJCUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJidWlsZF9zc2wuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpIC1hIgorCQkJCUNsZWFuQ29tbWFuZExpbmU9ImVjaG8gTm90aGluZyB0byBkbyIKIAkJCQlPdXRwdXQ9Il9zc2wucHlkIi8+CiAJCTwvQ29uZmlndXJhdGlvbj4KIAk8L0NvbmZpZ3VyYXRpb25zPgpkaWZmIC0tZ2l0IGEvUENidWlsZC9idWlsZF9zc2wuYmF0IGIvUENidWlsZC9idWlsZF9zc2wuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTcyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkL2J1aWxkX3NzbC5iYXQKQEAgLTAsMCArMSwxMCBAQAorQGVjaG8gb2ZmDQoraWYgbm90IGRlZmluZWQgSE9TVF9QWVRIT04gKA0KKyAgaWYgJTEgRVFVIERlYnVnICgNCisgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbl9kLmV4ZQ0KKyAgKSBFTFNFICgNCisgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbi5leGUNCisgICkNCispDQorJUhPU1RfUFlUSE9OJSBidWlsZF9zc2wucHkgJTEgJTINCisNCmRpZmYgLS1naXQgYS9QQ2J1aWxkL2J1aWxkX3NzbC5weSBiL1BDYnVpbGQvYnVpbGRfc3NsLnB5CmluZGV4IDhmNDg1YTIuLmQ0YmVlZTUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvYnVpbGRfc3NsLnB5CisrKyBiL1BDYnVpbGQvYnVpbGRfc3NsLnB5CkBAIC04NCw5ICs4NCw1OSBAQAogICAgICAgICBwcmludCAiQ291bGQgbm90IGZpbmQgYW4gU1NMIGRpcmVjdG9yeSBpbiAnJXMnIiAlIChzb3VyY2VzLCkKICAgICByZXR1cm4gYmVzdF9uYW1lCiAKK2RlZiBydW5fMzJhbGxfcHkoKToKKyAgICAjIG1zXDMyYWxsLmJhdCB3aWxsIHJlY29uZmlndXJlIE9wZW5TU0wgYW5kIHRoZW4gdHJ5IHRvIGJ1aWxkCisgICAgIyBhbGwgb3V0cHV0cyAoZGVidWcvbm9uZGVidWcvZGxsL2xpYikuICBTbyB3ZSBmaWx0ZXIgdGhlIGZpbGUKKyAgICAjIHRvIGV4Y2x1ZGUgYW55ICJubWFrZSIgY29tbWFuZHMgYW5kIHRoZW4gZXhlY3V0ZS4KKyAgICB0ZW1wbmFtZSA9ICJtc1xcMzJhbGxfcHkuYmF0IgorCisgICAgaW5fYmF0ICA9IG9wZW4oIm1zXFwzMmFsbC5iYXQiKQorICAgIHRlbXBfYmF0ID0gb3Blbih0ZW1wbmFtZSwidyIpCisgICAgd2hpbGUgMToKKyAgICAgICAgY21kID0gaW5fYmF0LnJlYWRsaW5lKCkKKyAgICAgICAgcHJpbnQgJ2NtZCcsIHJlcHIoY21kKQorICAgICAgICBpZiBub3QgY21kOiBicmVhaworICAgICAgICBpZiBjbWQuc3RyaXAoKVs6NV0ubG93ZXIoKSA9PSAibm1ha2UiOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdGVtcF9iYXQud3JpdGUoY21kKQorICAgIGluX2JhdC5jbG9zZSgpCisgICAgdGVtcF9iYXQuY2xvc2UoKQorICAgIG9zLnN5c3RlbSh0ZW1wbmFtZSkKKyAgICB0cnk6CisgICAgICAgIG9zLnJlbW92ZSh0ZW1wbmFtZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHBhc3MKKworZGVmIHJ1bl9jb25maWd1cmUoY29uZmlndXJlLCBkb19zY3JpcHQpOgorICAgIG9zLnN5c3RlbSgicGVybCBDb25maWd1cmUgIitjb25maWd1cmUpCisgICAgb3Muc3lzdGVtKGRvX3NjcmlwdCkKKwogZGVmIG1haW4oKToKLSAgICBkZWJ1ZyA9ICItZCIgaW4gc3lzLmFyZ3YKICAgICBidWlsZF9hbGwgPSAiLWEiIGluIHN5cy5hcmd2CisgICAgaWYgc3lzLmFyZ3ZbMV0gPT0gIlJlbGVhc2UiOgorICAgICAgICBhcmNoID0gIng4NiIKKyAgICAgICAgZGVidWcgPSBGYWxzZQorICAgICAgICBjb25maWd1cmUgPSAiVkMtV0lOMzIiCisgICAgICAgIG1ha2VmaWxlID0gIjMyLm1hayIKKyAgICBlbGlmIHN5cy5hcmd2WzFdID09ICJEZWJ1ZyI6CisgICAgICAgIGFyY2ggPSAieDg2IgorICAgICAgICBkZWJ1ZyA9IFRydWUKKyAgICAgICAgY29uZmlndXJlID0gIlZDLVdJTjMyIgorICAgICAgICBtYWtlZmlsZT0iZDMyLm1hayIKKyAgICBlbGlmIHN5cy5hcmd2WzFdID09ICJSZWxlYXNlSXRhbml1bSI6CisgICAgICAgIGFyY2ggPSAiaWE2NCIKKyAgICAgICAgZGVidWcgPSBGYWxzZQorICAgICAgICBjb25maWd1cmUgPSAiVkMtV0lONjRJIgorICAgICAgICBkb19zY3JpcHQgPSAibXNcXGRvX3dpbjY0aSIKKyAgICAgICAgbWFrZWZpbGUgPSAibXNcXG50Lm1hayIKKyAgICAgICAgb3MuZW52aXJvblsiVlNFWFRDT01QX1VTRUNMIl0gPSAiTVNfSVRBTklVTSIKKyAgICBlbGlmIHN5cy5hcmd2WzFdID09ICJSZWxlYXNlQU1ENjQiOgorICAgICAgICBhcmNoPSJhbWQ2NCIKKyAgICAgICAgZGVidWc9RmFsc2UKKyAgICAgICAgY29uZmlndXJlID0gIlZDLVdJTjY0QSIKKyAgICAgICAgZG9fc2NyaXB0ID0gIm1zXFxkb193aW42NGEiCisgICAgICAgIG1ha2VmaWxlID0gIm1zXFxudC5tYWsiCisgICAgICAgIG9zLmVudmlyb25bIlZTRVhUQ09NUF9VU0VDTCJdID0gIk1TX09QVEVST04iCiAgICAgbWFrZV9mbGFncyA9ICIiCiAgICAgaWYgYnVpbGRfYWxsOgogICAgICAgICBtYWtlX2ZsYWdzID0gIi1hIgpAQCAtMTA3LDQ5ICsxNTcsMjQgQEAKICAgICB0cnk6CiAgICAgICAgIG9zLmNoZGlyKHNzbF9kaXIpCiAgICAgICAgICMgSWYgdGhlIHNzbCBtYWtlZmlsZXMgZG8gbm90IGV4aXN0LCB3ZSBpbnZva2UgUGVybCB0byBnZW5lcmF0ZSB0aGVtLgotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHNzbF9kaXIsICIzMi5tYWsiKSkgb3IgXAotICAgICAgICAgICBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHNzbF9kaXIsICJkMzIubWFrIikpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUobWFrZWZpbGUpOgogICAgICAgICAgICAgcHJpbnQgIkNyZWF0aW5nIHRoZSBtYWtlZmlsZXMuLi4iCiAgICAgICAgICAgICAjIFB1dCBvdXIgd29ya2luZyBQZXJsIGF0IHRoZSBmcm9udCBvZiBvdXIgcGF0aAogICAgICAgICAgICAgb3MuZW52aXJvblsiUEFUSCJdID0gb3MucGF0aC5zcGxpdChwZXJsKVswXSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGhzZXAgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWyJQQVRIIl0KLSAgICAgICAgICAgICMgbXNcMzJhbGwuYmF0IHdpbGwgcmVjb25maWd1cmUgT3BlblNTTCBhbmQgdGhlbiB0cnkgdG8gYnVpbGQKLSAgICAgICAgICAgICMgYWxsIG91dHB1dHMgKGRlYnVnL25vbmRlYnVnL2RsbC9saWIpLiAgU28gd2UgZmlsdGVyIHRoZSBmaWxlCi0gICAgICAgICAgICAjIHRvIGV4Y2x1ZGUgYW55ICJubWFrZSIgY29tbWFuZHMgYW5kIHRoZW4gZXhlY3V0ZS4KLSAgICAgICAgICAgIHRlbXBuYW1lID0gIm1zXFwzMmFsbF9weS5iYXQiCi0KLSAgICAgICAgICAgIGluX2JhdCAgPSBvcGVuKCJtc1xcMzJhbGwuYmF0IikKLSAgICAgICAgICAgIHRlbXBfYmF0ID0gb3Blbih0ZW1wbmFtZSwidyIpCi0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIGNtZCA9IGluX2JhdC5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgcHJpbnQgJ2NtZCcsIHJlcHIoY21kKQotICAgICAgICAgICAgICAgIGlmIG5vdCBjbWQ6IGJyZWFrCi0gICAgICAgICAgICAgICAgaWYgY21kLnN0cmlwKClbOjVdLmxvd2VyKCkgPT0gIm5tYWtlIjoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICB0ZW1wX2JhdC53cml0ZShjbWQpCi0gICAgICAgICAgICBpbl9iYXQuY2xvc2UoKQotICAgICAgICAgICAgdGVtcF9iYXQuY2xvc2UoKQotICAgICAgICAgICAgb3Muc3lzdGVtKHRlbXBuYW1lKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZW1wbmFtZSkKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBhcmNoPT0ieDg2IjoKKyAgICAgICAgICAgICAgICBydW5fMzJhbGxfcHkoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBydW5fY29uZmlndXJlKGNvbmZpZ3VyZSwgZG9fc2NyaXB0KQogCiAgICAgICAgICMgTm93IHJ1biBtYWtlLgogICAgICAgICBwcmludCAiRXhlY3V0aW5nIG5tYWtlIG92ZXIgdGhlIHNzbCBtYWtlZmlsZXMuLi4iCi0gICAgICAgIGlmIGRlYnVnOgotICAgICAgICAgICAgcmMgPSBvcy5zeXN0ZW0oIm5tYWtlIC9ub2xvZ28gLWYgZDMyLm1hayIpCi0gICAgICAgICAgICBpZiByYzoKLSAgICAgICAgICAgICAgICBwcmludCAiRXhlY3V0aW5nIGQzMi5tYWsgZmFpbGVkIgotICAgICAgICAgICAgICAgIHByaW50IHJjCi0gICAgICAgICAgICAgICAgc3lzLmV4aXQocmMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYyA9IG9zLnN5c3RlbSgibm1ha2UgL25vbG9nbyAtZiAzMi5tYWsiKQotICAgICAgICAgICAgaWYgcmM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIkV4ZWN1dGluZyAzMi5tYWsgZmFpbGVkIgotICAgICAgICAgICAgICAgIHByaW50IHJjCi0gICAgICAgICAgICAgICAgc3lzLmV4aXQocmMpCisgICAgICAgIHJjID0gb3Muc3lzdGVtKCJubWFrZSAvbm9sb2dvIC1mICIrbWFrZWZpbGUpCisgICAgICAgIGlmIHJjOgorICAgICAgICAgICAgcHJpbnQgIkV4ZWN1dGluZyBkMzIubWFrIGZhaWxlZCIKKyAgICAgICAgICAgIHByaW50IHJjCisgICAgICAgICAgICBzeXMuZXhpdChyYykKICAgICBmaW5hbGx5OgogICAgICAgICBvcy5jaGRpcihvbGRfY2QpCiAgICAgIyBBbmQgZmluYWxseSwgd2UgY2FuIGJ1aWxkIHRoZSBfc3NsIG1vZHVsZSBpdHNlbGYgZm9yIFB5dGhvbi4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2ogYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCmluZGV4IGJiOWY3YWYuLmVmMjAwYzQgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjcHJvagpAQCAtMzQ0LDkgKzM0NCw2IEBACiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2Jpc2VjdG1vZHVsZS5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQotCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zdHJ1Y3QuYyI+Ci0JCTwvRmlsZT4KLQkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjamtjb2RlY3NcX2NvZGVjc19jbi5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQpAQCAtMzcxLDYgKzM2OCw5IEBACiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2Nzdi5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9mdW5jdG9vbHNtb2R1bGUuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfaGVhcHFtb2R1bGUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKQEAgLTM4OSw5ICszODksMTUgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3JlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3N0cnVjdC5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxQY1xfc3VicHJvY2Vzcy5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF90eXBlc21vZHVsZS5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF93ZWFrcmVmLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCkBAIC01MTUsOSArNTIxLDYgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xmdW5jb2JqZWN0LmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2Z1bmN0b29sc21vZHVsZS5jIj4KLQkJPC9GaWxlPgotCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZnV0dXJlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3JlYWRtZS50eHQgYi9QQ2J1aWxkL3JlYWRtZS50eHQKaW5kZXggMTg0ZDExZi4uNDUzNjM2OCAxMDA2NDQKLS0tIGEvUENidWlsZC9yZWFkbWUudHh0CisrKyBiL1BDYnVpbGQvcmVhZG1lLnR4dApAQCAtMjY0LDcgKzI2NCw3IEBACiBJbiBhZGRpdGlvbiwgeW91IG5lZWQgdGhlIFZpc3VhbCBTdHVkaW8gcGx1Z2luIGZvciBleHRlcm5hbCBDIGNvbXBpbGVycywKIGZyb20gaHR0cDovL3NmLm5ldC9wcm9qZWN0cy92c2V4dGNvbXAuIFRoZSBwbHVnaW4gd2lsbCB3cmFwIGNsLmV4ZSwgdG8KIGxvY2F0ZSB0aGUgcHJvcGVyIHRhcmdldCBjb21waWxlciwgYW5kIGNvbnZlcnQgY29tcGlsZXIgb3B0aW9ucwotYWNjb3JkaW5nbHkuIFRoZSBwcm9qZWN0IGZpbGVzIHJlcXVpcmUgYXRsZWFzdCB2ZXJzaW9uIDAuOC4KK2FjY29yZGluZ2x5LiBUaGUgcHJvamVjdCBmaWxlcyByZXF1aXJlIGF0bGVhc3QgdmVyc2lvbiAwLjkuCiAKIEJ1aWxkaW5nIGZvciBBTUQ2NAogLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yODAsMTIgKzI4MCwyMSBAQAogVG9vbGtpdCBDb21waWxlci4gVGhpcyBwcm92aWRlcyBhIHdheSBvZiBidWlsZGluZyBQeXRob24gdXNpbmcgZnJlZWx5CiBhdmFpbGFibGUgc29mdHdhcmUuCiAKK05vdGUgdGhhdCBNaWNyb3NvZnQgaGF2ZSB3aXRoZHJhd24gdGhlIGZyZWUgTVMgVG9vbGtpdCBDb21waWxlciwgc28gdGhpcyBjYW4KK25vIGxvbmdlciBiZSBjb25zaWRlcmVkIGEgc3VwcG9ydGVkIG9wdGlvbi4gVGhlIGluc3RydWN0aW9ucyBhcmUgc3RpbGwKK2NvcnJlY3QsIGJ1dCB5b3UgbmVlZCB0byBhbHJlYWR5IGhhdmUgYSBjb3B5IG9mIHRoZSBjb21waWxlciBpbiBvcmRlciB0byB1c2UKK3RoZW0uIE1pY3Jvc29mdCBub3cgc3VwcGx5IFZpc3VhbCBDKysgMjAwNSBFeHByZXNzIEVkaXRpb24gZm9yIGZyZWUsIGJ1dCB0aGlzCitpcyBOT1QgY29tcGF0aWJsZSB3aXRoIFZpc3VhbCBDKysgNy4xIChpdCB1c2VzIGEgZGlmZmVyZW50IEMgcnVudGltZSksIGFuZCBzbworY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgYSB2ZXJzaW9uIG9mIFB5dGhvbiBjb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkCitweXRob24ub3JnIGJ1aWxkLiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdXNpbmcgVmlzdWFsIEMrKyAyMDA1IEV4cHJlc3MKK0VkaXRpb24sIGhvd2V2ZXIsIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgUENCdWlsZDggZGlyZWN0b3J5LgorCiBSZXF1aXJlbWVudHMKIAogICAgIFRvIGJ1aWxkIFB5dGhvbiwgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgcmVxdWlyZWQ6CiAKICAgICAqIFRoZSBWaXN1YWwgQysrIFRvb2xraXQgQ29tcGlsZXIKLSAgICAgICAgZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3Zpc3VhbGMvdmN0b29sa2l0MjAwMy8KKyAgICAgICAgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgLSBzZWUgYWJvdmUKICAgICAqIEEgcmVjZW50IFBsYXRmb3JtIFNESwogICAgICAgICBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvZGV0YWlscy5hc3B4P0ZhbWlseUlEPTQ4NDI2OWUyLTNiODktNDdlMy04ZWI3LTFmMmJlNmQ3MTIzYQogICAgICogVGhlIC5ORVQgMS4xIFNESwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzdC5jIGIvUHl0aG9uL2FzdC5jCmluZGV4IGYzZTYxMWIuLmNhODMyYWEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9hc3QuYworKysgYi9QeXRob24vYXN0LmMKQEAgLTMzOSw3ICszMzksNyBAQAogICAgIC8qIFRoZSBhc3QgZGVmaW5lcyBhdWdtZW50ZWQgc3RvcmUgYW5kIGxvYWQgY29udGV4dHMsIGJ1dCB0aGUKICAgICAgICBpbXBsZW1lbnRhdGlvbiBoZXJlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoZW0uICBUaGUgY29kZSBtYXkgYmUKICAgICAgICBhIGxpdHRsZSBtb3JlIGNvbXBsZXggdGhhbiBuZWNlc3NhcnkgYXMgYSByZXN1bHQuICBJdCBhbHNvIG1lYW5zCi0gICAgICAgdGhhdCBleHByZXNzaW9ucyBpbiBhbiBhdWdtZW50ZWQgYXNzaWdubWVudCBoYXZlIG5vIGNvbnRleHQuCisgICAgICAgdGhhdCBleHByZXNzaW9ucyBpbiBhbiBhdWdtZW50ZWQgYXNzaWdubWVudCBoYXZlIGEgU3RvcmUgY29udGV4dC4KICAgICAgICBDb25zaWRlciByZXN0cnVjdHVyaW5nIHNvIHRoYXQgYXVnbWVudGVkIGFzc2lnbm1lbnQgdXNlcwogICAgICAgIHNldF9jb250ZXh0KCksIHRvby4KICAgICAqLwpAQCAtMzg3LDYgKzM4Nyw5IEBACiAgICAgICAgIGNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAiZ2VuZXJhdG9yIGV4cHJlc3Npb24iOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWWllbGRfa2luZDoKKyAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJ5aWVsZCBleHByZXNzaW9uIjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIExpc3RDb21wX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAibGlzdCBjb21wcmVoZW5zaW9uIjsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjE5LDEwICs2MjIsMTAgQEAKICAgICB9CiAgICAgYXJncyA9IChuX2FyZ3MgPyBhc2RsX3NlcV9uZXcobl9hcmdzLCBjLT5jX2FyZW5hKSA6IE5VTEwpOwogICAgIGlmICghYXJncyAmJiBuX2FyZ3MpCi0gICAgCXJldHVybiBOVUxMOyAvKiBEb24ndCBuZWVkIHRvIGdvIHRvIE5VTEw7IG5vdGhpbmcgYWxsb2NhdGVkICovCisgICAgCXJldHVybiBOVUxMOyAvKiBEb24ndCBuZWVkIHRvIGdvdG8gZXJyb3I7IG5vIG9iamVjdHMgYWxsb2NhdGVkICovCiAgICAgZGVmYXVsdHMgPSAobl9kZWZhdWx0cyA/IGFzZGxfc2VxX25ldyhuX2RlZmF1bHRzLCBjLT5jX2FyZW5hKSA6IE5VTEwpOwogICAgIGlmICghZGVmYXVsdHMgJiYgbl9kZWZhdWx0cykKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAJcmV0dXJuIE5VTEw7IC8qIERvbid0IG5lZWQgdG8gZ290byBlcnJvcjsgbm8gb2JqZWN0cyBhbGxvY2F0ZWQgKi8KIAogICAgIC8qIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKICAgICAgICBmcGxpc3Q6IGZwZGVmICgnLCcgZnBkZWYpKiBbJywnXQpAQCAtNjM4LDggKzY0MSwxMSBAQAogICAgICAgICAgICAgICAgICAgIGFueXRoaW5nIG90aGVyIHRoYW4gRVFVQUwgb3IgYSBjb21tYT8gKi8KICAgICAgICAgICAgICAgICAvKiBYWFggU2hvdWxkIE5DSChuKSBjaGVjayBiZSBtYWRlIGEgc2VwYXJhdGUgY2hlY2s/ICovCiAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgTkNIKG4pICYmIFRZUEUoQ0hJTEQobiwgaSArIDEpKSA9PSBFUVVBTCkgewotICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoZGVmYXVsdHMsIGorKywgCi0JCQkJICAgIGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCBpICsgMikpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIGkgKyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZGVmYXVsdHMgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChkZWZhdWx0cywgaisrLCBleHByZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogCQkgICAgZm91bmRfZGVmYXVsdCA9IDE7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQ4NCw2ICsxNDkwLDU3IEBACiB9CiAKIHN0YXRpYyBleHByX3R5Cithc3RfZm9yX2ZhY3RvcihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIG5vZGUgKnBmYWN0b3IsICpwcG93ZXIsICpwYXRvbSwgKnBudW07CisgICAgZXhwcl90eSBleHByZXNzaW9uOworCisgICAgLyogSWYgdGhlIHVuYXJ5IC0gb3BlcmF0b3IgaXMgYXBwbGllZCB0byBhIGNvbnN0YW50LCBkb24ndCBnZW5lcmF0ZQorICAgICAgIGEgVU5BUllfTkVHQVRJVkUgb3Bjb2RlLiAgSnVzdCBzdG9yZSB0aGUgYXBwcm9yaWF0ZSB2YWx1ZSBhcyBhCisgICAgICAgY29uc3RhbnQuICBUaGUgcGVlcGhvbGUgb3B0aW1pemVyIGFscmVhZHkgZG9lcyBzb21ldGhpbmcgbGlrZQorICAgICAgIHRoaXMgYnV0IGl0IGRvZXNuJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb25zdGFudCBpcworICAgICAgIChzeXMubWF4aW50IC0gMSkuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgYSBQeUludE9iamVjdCwgbm90IGEKKyAgICAgICBQeUxvbmdPYmplY3QuCisgICAgKi8KKyAgICBpZiAoVFlQRShDSElMRChuLCAwKSkgPT0gTUlOVVMKKyAgICAgICAgJiYgTkNIKG4pID09IDIKKyAgICAgICAgJiYgVFlQRSgocGZhY3RvciA9IENISUxEKG4sIDEpKSkgPT0gZmFjdG9yCisgICAgICAgICYmIE5DSChwZmFjdG9yKSA9PSAxCisgICAgICAgICYmIFRZUEUoKHBwb3dlciA9IENISUxEKHBmYWN0b3IsIDApKSkgPT0gcG93ZXIKKyAgICAgICAgJiYgTkNIKHBwb3dlcikgPT0gMQorICAgICAgICAmJiBUWVBFKChwYXRvbSA9IENISUxEKHBwb3dlciwgMCkpKSA9PSBhdG9tCisgICAgICAgICYmIFRZUEUoKHBudW0gPSBDSElMRChwYXRvbSwgMCkpKSA9PSBOVU1CRVIpIHsKKyAgICAgICAgY2hhciAqcyA9IFB5T2JqZWN0X01BTExPQyhzdHJsZW4oU1RSKHBudW0pKSArIDIpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNbMF0gPSAnLSc7CisgICAgICAgIHN0cmNweShzICsgMSwgU1RSKHBudW0pKTsKKyAgICAgICAgUHlPYmplY3RfRlJFRShTVFIocG51bSkpOworICAgICAgICBTVFIocG51bSkgPSBzOworICAgICAgICByZXR1cm4gYXN0X2Zvcl9hdG9tKGMsIHBhdG9tKTsKKyAgICB9CisKKyAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDEpKTsKKyAgICBpZiAoIWV4cHJlc3Npb24pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoIChUWVBFKENISUxEKG4sIDApKSkgeworICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICByZXR1cm4gVW5hcnlPcChVQWRkLCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoVVN1YiwgZXhwcmVzc2lvbiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKyAgICAgICAgY2FzZSBUSUxERToKKyAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKEludmVydCwgZXhwcmVzc2lvbiwgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAidW5oYW5kbGVkIGZhY3RvcjogJWQiLAorICAgICAgICAgICAgICAgICBUWVBFKENISUxEKG4sIDApKSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBleHByX3R5CiBhc3RfZm9yX3Bvd2VyKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCiB7CiAgICAgLyogcG93ZXI6IGF0b20gdHJhaWxlciogKCcqKicgZmFjdG9yKSoKQEAgLTE2NjIsMzAgKzE3MTksMTIgQEAKIAkgICAgfQogCSAgICByZXR1cm4gWWllbGQoZXhwLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAJfQotICAgICAgICBjYXNlIGZhY3RvcjogewotICAgICAgICAgICAgZXhwcl90eSBleHByZXNzaW9uOwotICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZmFjdG9yOgogICAgICAgICAgICAgaWYgKE5DSChuKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgbiA9IENISUxEKG4sIDApOwogICAgICAgICAgICAgICAgIGdvdG8gbG9vcDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCAxKSk7Ci0gICAgICAgICAgICBpZiAoIWV4cHJlc3Npb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoVFlQRShDSElMRChuLCAwKSkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKFVBZGQsIGV4cHJlc3Npb24sIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5hcnlPcChVU3ViLCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoSW52ZXJ0LCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJ1bmhhbmRsZWQgZmFjdG9yOiAlZCIsCi0JICAgIAkJIFRZUEUoQ0hJTEQobiwgMCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJICAgIHJldHVybiBhc3RfZm9yX2ZhY3RvcihjLCBuKTsKICAgICAgICAgY2FzZSBwb3dlcjoKICAgICAgICAgICAgIHJldHVybiBhc3RfZm9yX3Bvd2VyKGMsIG4pOwogICAgICAgICBkZWZhdWx0OgpAQCAtMTg5MywyMCArMTkzMiwxOSBAQAogICAgICAgICBvcGVyYXRvcl90eSBuZXdvcGVyYXRvcjsKIAlub2RlICpjaCA9IENISUxEKG4sIDApOwogCi0JaWYgKFRZUEUoY2gpID09IHRlc3RsaXN0KQotCSAgICBleHByMSA9IGFzdF9mb3JfdGVzdGxpc3QoYywgY2gpOwotCWVsc2UKLQkgICAgZXhwcjEgPSBZaWVsZChhc3RfZm9yX2V4cHIoYywgQ0hJTEQoY2gsIDApKSwgTElORU5PKGNoKSwgbi0+bl9jb2xfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKLQorCWV4cHIxID0gYXN0X2Zvcl90ZXN0bGlzdChjLCBjaCk7CiAgICAgICAgIGlmICghZXhwcjEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgLyogVE9ETyhqaHlsdG9uKTogRmlndXJlIG91dCB3aHkgc2V0X2NvbnRleHQoKSBjYW4ndCBiZSB1c2VkIGhlcmUuICovCisgICAgICAgIC8qIFRPRE8obmFzKTogUmVtb3ZlIGR1cGxpY2F0ZWQgZXJyb3IgY2hlY2tzIChzZXRfY29udGV4dCBkb2VzIGl0KSAqLwogICAgICAgICBzd2l0Y2ggKGV4cHIxLT5raW5kKSB7CiAgICAgICAgICAgICBjYXNlIEdlbmVyYXRvckV4cF9raW5kOgogICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjaCwgImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIG5vdCBwb3NzaWJsZSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjaCwgImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIHlpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24gbm90IHBvc3NpYmxlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBjYXNlIE5hbWVfa2luZDogewogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGV4cHIxLT52Lk5hbWUuaWQpOwogICAgICAgICAgICAgICAgIGlmICh2YXJfbmFtZVswXSA9PSAnTicgJiYgIXN0cmNtcCh2YXJfbmFtZSwgIk5vbmUiKSkgewpAQCAtMTkyMywxMiArMTk2MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzaWdubWVudCIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisJc2V0X2NvbnRleHQoZXhwcjEsIFN0b3JlLCBjaCk7CiAKIAljaCA9IENISUxEKG4sIDIpOwogCWlmIChUWVBFKGNoKSA9PSB0ZXN0bGlzdCkKIAkgICAgZXhwcjIgPSBhc3RfZm9yX3Rlc3RsaXN0KGMsIGNoKTsKIAllbHNlCi0JICAgIGV4cHIyID0gWWllbGQoYXN0X2Zvcl9leHByKGMsIGNoKSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisJICAgIGV4cHIyID0gYXN0X2Zvcl9leHByKGMsIGNoKTsKICAgICAgICAgaWYgKCFleHByMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yMTQyLDcgKzIxODEsMTQgQEAKICBsb29wOgogICAgIHN3aXRjaCAoVFlQRShuKSkgewogICAgICAgICBjYXNlIGltcG9ydF9hc19uYW1lOgotICAgICAgICAgICAgc3RyID0gKE5DSChuKSA9PSAzKSA/IE5FV19JREVOVElGSUVSKENISUxEKG4sIDIpKSA6IE5VTEw7CisgICAgICAgICAgICBzdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKE5DSChuKSA9PSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChTVFIoQ0hJTEQobiwgMSkpLCAiYXMiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihuLCAibXVzdCB1c2UgJ2FzJyBpbiBpbXBvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ciA9IE5FV19JREVOVElGSUVSKENISUxEKG4sIDIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBhbGlhcyhORVdfSURFTlRJRklFUihDSElMRChuLCAwKSksIHN0ciwgYy0+Y19hcmVuYSk7CiAgICAgICAgIGNhc2UgZG90dGVkX2FzX25hbWU6CiAgICAgICAgICAgICBpZiAoTkNIKG4pID09IDEpIHsKQEAgLTIxNTEsNiArMjE5NywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgYWxpYXNfdHkgYSA9IGFsaWFzX2Zvcl9pbXBvcnRfbmFtZShjLCBDSElMRChuLCAwKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChTVFIoQ0hJTEQobiwgMSkpLCAiYXMiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihuLCAibXVzdCB1c2UgJ2FzJyBpbiBpbXBvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzc2VydCghYS0+YXNuYW1lKTsKICAgICAgICAgICAgICAgICBhLT5hc25hbWUgPSBORVdfSURFTlRJRklFUihDSElMRChuLCAyKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CkBAIC0yNjIxLDYgKzI2NzEsNyBAQAogICAgIGFzZGxfc2VxICpfdGFyZ2V0LCAqc2VxID0gTlVMTCwgKnN1aXRlX3NlcTsKICAgICBleHByX3R5IGV4cHJlc3Npb247CiAgICAgZXhwcl90eSB0YXJnZXQ7CisgICAgY29uc3Qgbm9kZSAqbm9kZV90YXJnZXQ7CiAgICAgLyogZm9yX3N0bXQ6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdGxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXSAqLwogICAgIFJFUShuLCBmb3Jfc3RtdCk7CiAKQEAgLTI2MzAsMTAgKzI2ODEsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIF90YXJnZXQgPSBhc3RfZm9yX2V4cHJsaXN0KGMsIENISUxEKG4sIDEpLCBTdG9yZSk7CisgICAgbm9kZV90YXJnZXQgPSBDSElMRChuLCAxKTsKKyAgICBfdGFyZ2V0ID0gYXN0X2Zvcl9leHBybGlzdChjLCBub2RlX3RhcmdldCwgU3RvcmUpOwogICAgIGlmICghX3RhcmdldCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGFzZGxfc2VxX0xFTihfdGFyZ2V0KSA9PSAxKQorICAgIC8qIENoZWNrIHRoZSAjIG9mIGNoaWxkcmVuIHJhdGhlciB0aGFuIHRoZSBsZW5ndGggb2YgX3RhcmdldCwgc2luY2UKKyAgICAgICBmb3IgeCwgaW4gLi4uIGhhcyAxIGVsZW1lbnQgaW4gX3RhcmdldCwgYnV0IHN0aWxsIHJlcXVpcmVzIGEgVHVwbGUuICovCisgICAgaWYgKE5DSChub2RlX3RhcmdldCkgPT0gMSkKIAl0YXJnZXQgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoX3RhcmdldCwgMCk7CiAgICAgZWxzZQogCXRhcmdldCA9IFR1cGxlKF90YXJnZXQsIFN0b3JlLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CmRpZmYgLS1naXQgYS9QeXRob24vY2V2YWwuYyBiL1B5dGhvbi9jZXZhbC5jCmluZGV4IGYxNGU3ZGEuLjlhOWI5OGUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jZXZhbC5jCisrKyBiL1B5dGhvbi9jZXZhbC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAKLSNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKKyNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKQEAgLTI3NDAsNyArMjc0MCw3IEBACiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RvcmFnZSBmb3IgY2VsbCB2YXJzLCBhbmQgY29weSBmcmVlCiAJICAgdmFycyBpbnRvIGZyYW1lLiAgVGhpcyBpc24ndCB0b28gZWZmaWNpZW50IHJpZ2h0IG5vdy4gKi8KIAlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7Ci0JCWludCBpID0gMCwgaiA9IDAsIG5hcmdzLCBmb3VuZDsKKwkJaW50IGksIGosIG5hcmdzLCBmb3VuZDsKIAkJY2hhciAqY2VsbG5hbWUsICphcmduYW1lOwogCQlQeU9iamVjdCAqYzsKIApAQCAtMzMxOCw3ICszMzE4LDcgQEAKIFB5RXZhbF9HZXRSZXN0cmljdGVkKHZvaWQpCiB7CiAJUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCXJldHVybiBjdXJyZW50X2ZyYW1lID09IE5VTEwgPyAwIDogY3VycmVudF9mcmFtZS0+Zl9yZXN0cmljdGVkOworCXJldHVybiBjdXJyZW50X2ZyYW1lID09IE5VTEwgPyAwIDogUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoY3VycmVudF9mcmFtZSk7CiB9CiAKIGludApAQCAtNDE4Nyw2ICs0MTg3LDE0IEBACiB7CiAJLyogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzICd2YXJpYWJsZSArPSBleHByJyB3aGVuIGJvdGggYXJndW1lbnRzCiAJICAgYXJlIHN0cmluZ3MuICovCisJUHlfc3NpemVfdCB2X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworCVB5X3NzaXplX3Qgd19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKKwlQeV9zc2l6ZV90IG5ld19sZW4gPSB2X2xlbiArIHdfbGVuOworCWlmIChuZXdfbGVuIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKwkJCQkic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlpZiAodi0+b2JfcmVmY250ID09IDIpIHsKIAkJLyogSW4gdGhlIGNvbW1vbiBjYXNlLCB0aGVyZSBhcmUgMiByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZQpAQCAtNDIzMSw5ICs0MjM5LDcgQEAKIAkJLyogTm93IHdlIG93biB0aGUgbGFzdCByZWZlcmVuY2UgdG8gJ3YnLCBzbyB3ZSBjYW4gcmVzaXplIGl0CiAJCSAqIGluLXBsYWNlLgogCQkgKi8KLQkJUHlfc3NpemVfdCB2X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQlQeV9zc2l6ZV90IHdfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCB2X2xlbiArIHdfbGVuKSAhPSAwKSB7CisJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBuZXdfbGVuKSAhPSAwKSB7CiAJCQkvKiBYWFggaWYgX1B5U3RyaW5nX1Jlc2l6ZSgpIGZhaWxzLCAndicgaGFzIGJlZW4KIAkJCSAqIGRlYWxsb2NhdGVkIHNvIGl0IGNhbm5vdCBiZSBwdXQgYmFjayBpbnRvICd2YXJpYWJsZScuCiAJCQkgKiBUaGUgTWVtb3J5RXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgaW4KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCAwNDZhYmUzLi40YjBmNGNiIDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC0yNDksMTQgKzI0OSwxNyBAQAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKIAkJCSAgICAgICBjb25zdCBpbnQgaW5kZXgpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjcywgKnN0cmVhbWNvZGVjOworICAgIFB5T2JqZWN0ICpjb2RlY3MsICpzdHJlYW1jb2RlYywgKmNvZGVjY2xzOwogCiAgICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKICAgICBpZiAoY29kZWNzID09IE5VTEwpCiAJcmV0dXJuIE5VTEw7CiAKLSAgICBzdHJlYW1jb2RlYyA9IFB5RXZhbF9DYWxsRnVuY3Rpb24oCi0JUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KSwgIk9zIiwgc3RyZWFtLCBlcnJvcnMpOworICAgIGNvZGVjY2xzID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KTsKKyAgICBpZiAoZXJyb3JzICE9IE5VTEwpCisJc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPcyIsIHN0cmVhbSwgZXJyb3JzKTsKKyAgICBlbHNlCisJc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPIiwgc3RyZWFtKTsKICAgICBQeV9ERUNSRUYoY29kZWNzKTsKICAgICByZXR1cm4gc3RyZWFtY29kZWM7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vY29tcGlsZS5jIGIvUHl0aG9uL2NvbXBpbGUuYwppbmRleCA2ZDk2MDA2Li40NDY0ODgyIDEwMDY0NAotLS0gYS9QeXRob24vY29tcGlsZS5jCisrKyBiL1B5dGhvbi9jb21waWxlLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCVB5RnV0dXJlRmVhdHVyZXMgKmNfZnV0dXJlOyAvKiBwb2ludGVyIHRvIG1vZHVsZSdzIF9fZnV0dXJlX18gKi8KIAlQeUNvbXBpbGVyRmxhZ3MgKmNfZmxhZ3M7CiAKLQlpbnQgY19pbnRlcmFjdGl2ZTsKKwlpbnQgY19pbnRlcmFjdGl2ZTsJIC8qIHRydWUgaWYgaW4gaW50ZXJhY3RpdmUgbW9kZSAqLwogCWludCBjX25lc3RsZXZlbDsKIAogCXN0cnVjdCBjb21waWxlcl91bml0ICp1OyAvKiBjb21waWxlciBzdGF0ZSBmb3IgY3VycmVudCBibG9jayAqLwpAQCAtMzAwLDggKzMwMCwxMSBAQAogUHlOb2RlX0NvbXBpbGUoc3RydWN0IF9ub2RlICpuLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKIAlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKKwltb2RfdHkgbW9kOwogCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQltb2RfdHkgbW9kID0gUHlBU1RfRnJvbU5vZGUobiwgTlVMTCwgZmlsZW5hbWUsIGFyZW5hKTsKKwlpZiAoIWFyZW5hKQorCQlyZXR1cm4gTlVMTDsKKwltb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBOVUxMLCBmaWxlbmFtZSwgYXJlbmEpOwogCWlmIChtb2QpCiAJCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBOVUxMLCBhcmVuYSk7CiAJUHlBcmVuYV9GcmVlKGFyZW5hKTsKQEAgLTYxMCw4ICs2MTMsMTAgQEAKIAl1bnNpZ25lZCBpbnQgKmJsb2NrcyA9ICh1bnNpZ25lZCBpbnQgKilQeU1lbV9NYWxsb2MobGVuKnNpemVvZihpbnQpKTsKIAlpbnQgaSxqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKIAotCWlmIChibG9ja3MgPT0gTlVMTCkKKwlpZiAoYmxvY2tzID09IE5VTEwpIHsKKwkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCW1lbXNldChibG9ja3MsIDAsIGxlbipzaXplb2YoaW50KSk7CiAKIAkvKiBNYXJrIGxhYmVscyBpbiB0aGUgZmlyc3QgcGFzcyAqLwpAQCAtMTA2NiwxNCArMTA3MSwxNCBAQAogCQlQeU9iamVjdF9GcmVlKCh2b2lkICopYik7CiAJCWIgPSBuZXh0OwogCX0KLQlQeV9YREVDUkVGKHUtPnVfc3RlKTsKLQlQeV9YREVDUkVGKHUtPnVfbmFtZSk7Ci0JUHlfWERFQ1JFRih1LT51X2NvbnN0cyk7Ci0JUHlfWERFQ1JFRih1LT51X25hbWVzKTsKLQlQeV9YREVDUkVGKHUtPnVfdmFybmFtZXMpOwotCVB5X1hERUNSRUYodS0+dV9mcmVldmFycyk7Ci0JUHlfWERFQ1JFRih1LT51X2NlbGx2YXJzKTsKLQlQeV9YREVDUkVGKHUtPnVfcHJpdmF0ZSk7CisJUHlfQ0xFQVIodS0+dV9zdGUpOworCVB5X0NMRUFSKHUtPnVfbmFtZSk7CisJUHlfQ0xFQVIodS0+dV9jb25zdHMpOworCVB5X0NMRUFSKHUtPnVfbmFtZXMpOworCVB5X0NMRUFSKHUtPnVfdmFybmFtZXMpOworCVB5X0NMRUFSKHUtPnVfZnJlZXZhcnMpOworCVB5X0NMRUFSKHUtPnVfY2VsbHZhcnMpOworCVB5X0NMRUFSKHUtPnVfcHJpdmF0ZSk7CiAJUHlPYmplY3RfRnJlZSh1KTsKIH0KIApAQCAtMTEwMCw4ICsxMTA1LDE3IEBACiAJdS0+dV9uYW1lID0gbmFtZTsKIAl1LT51X3Zhcm5hbWVzID0gbGlzdDJkaWN0KHUtPnVfc3RlLT5zdGVfdmFybmFtZXMpOwogCXUtPnVfY2VsbHZhcnMgPSBkaWN0Ynl0eXBlKHUtPnVfc3RlLT5zdGVfc3ltYm9scywgQ0VMTCwgMCwgMCk7CisJaWYgKCF1LT51X3Zhcm5hbWVzIHx8ICF1LT51X2NlbGx2YXJzKSB7CisJCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKwkJcmV0dXJuIDA7CisJfQorCiAJdS0+dV9mcmVldmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBGUkVFLCBERUZfRlJFRV9DTEFTUywKIAkJCQkgICBQeURpY3RfU2l6ZSh1LT51X2NlbGx2YXJzKSk7CisJaWYgKCF1LT51X2ZyZWV2YXJzKSB7CisJCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKwkJcmV0dXJuIDA7CisJfQogCiAJdS0+dV9ibG9ja3MgPSBOVUxMOwogCXUtPnVfdG1wbmFtZSA9IDA7CkBAIC0xMTI1LDcgKzExMzksOCBAQAogCS8qIFB1c2ggdGhlIG9sZCBjb21waWxlcl91bml0IG9uIHRoZSBzdGFjay4gKi8KIAlpZiAoYy0+dSkgewogCQlQeU9iamVjdCAqd3JhcHBlciA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihjLT51LCBOVUxMKTsKLQkJaWYgKFB5TGlzdF9BcHBlbmQoYy0+Y19zdGFjaywgd3JhcHBlcikgPCAwKSB7CisJCWlmICghd3JhcHBlciB8fCBQeUxpc3RfQXBwZW5kKGMtPmNfc3RhY2ssIHdyYXBwZXIpIDwgMCkgeworCQkJUHlfWERFQ1JFRih3cmFwcGVyKTsKIAkJCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMjUxLDYgKzEyNjYsNyBAQAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnN0cikgKiBERUZBVUxUX0JMT0NLX1NJWkUpOwogCX0KIAllbHNlIGlmIChiLT5iX2l1c2VkID09IGItPmJfaWFsbG9jKSB7CisJCXN0cnVjdCBpbnN0ciAqdG1wOwogCQlzaXplX3Qgb2xkc2l6ZSwgbmV3c2l6ZTsKIAkJb2xkc2l6ZSA9IGItPmJfaWFsbG9jICogc2l6ZW9mKHN0cnVjdCBpbnN0cik7CiAJCW5ld3NpemUgPSBvbGRzaXplIDw8IDE7CkBAIC0xMjU5LDEwICsxMjc1LDEzIEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYi0+Yl9pYWxsb2MgPDw9IDE7Ci0JCWItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfUmVhbGxvYygKKwkJdG1wID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOwotCQlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKQorCQlpZiAodG1wID09IE5VTEwpIHsKKwkJCVB5RXJyX05vTWVtb3J5KCk7CiAJCQlyZXR1cm4gLTE7CisJCX0KKwkJYi0+Yl9pbnN0ciA9IHRtcDsKIAkJbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciArIG9sZHNpemUsIDAsIG5ld3NpemUgLSBvbGRzaXplKTsKIAl9CiAJcmV0dXJuIGItPmJfaXVzZWQrKzsKQEAgLTE3NjksNyArMTc4OCw4IEBACiAJCWlmICghbW9kdWxlKQogCQkJcmV0dXJuIE5VTEw7CiAJfQotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDEpKQorCS8qIFVzZSAwIGZvciBmaXJzdGxpbmVubyBpbml0aWFsbHksIHdpbGwgZml4dXAgaW4gYXNzZW1ibGUoKS4gKi8KKwlpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG1vZHVsZSwgbW9kLCAwKSkKIAkJcmV0dXJuIE5VTEw7CiAJc3dpdGNoIChtb2QtPmtpbmQpIHsKIAljYXNlIE1vZHVsZV9raW5kOiAKQEAgLTE5NjMsMTEgKzE5ODMsOCBAQAogCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5GdW5jdGlvbkRlZi5ib2R5KTsKIAkvKiBpZiB0aGVyZSB3YXMgYSBkb2NzdHJpbmcsIHdlIG5lZWQgdG8gc2tpcCB0aGUgZmlyc3Qgc3RhdGVtZW50ICovCiAJZm9yIChpID0gZG9jc3RyaW5nOyBpIDwgbjsgaSsrKSB7Ci0JCXN0bXRfdHkgczIgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCBpKTsKLQkJaWYgKGkgPT0gMCAmJiBzMi0+a2luZCA9PSBFeHByX2tpbmQgJiYKLQkJICAgIHMyLT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCi0JCQljb250aW51ZTsKLQkJVklTSVRfSU5fU0NPUEUoYywgc3RtdCwgczIpOworCQlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIGkpOworCQlWSVNJVF9JTl9TQ09QRShjLCBzdG10LCBzdCk7CiAJfQogCWNvID0gYXNzZW1ibGUoYywgMSk7CiAJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKQEAgLTIxOTAsNiArMjIwNywxMCBAQAogCVZJU0lUKGMsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOwogCUFERE9QKGMsIEdFVF9JVEVSKTsKIAljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7CisJLyogWFhYKG5ub3J3aXR6KTogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzPworCSAgIGZvciBsb29wcyBhcmUgc3BlY2lhbCwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHRyYWNlIHRoZW0KKwkgICBlYWNoIHRpbWUgYXJvdW5kLCBzbyB3ZSBuZWVkIHRvIHNldCBhbiBleHRyYSBsaW5lIG51bWJlci4gKi8KKwljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKIAlBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBjbGVhbnVwKTsKIAlWSVNJVChjLCBleHByLCBzLT52LkZvci50YXJnZXQpOwogCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5ib2R5KTsKQEAgLTI3MDgsMTEgKzI3MjksMTMgQEAKIAljYXNlIEdsb2JhbF9raW5kOgogCQlicmVhazsKIAljYXNlIEV4cHJfa2luZDoKLQkJVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKIAkJaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgeworCQkJVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKIAkJCUFERE9QKGMsIFBSSU5UX0VYUFIpOwogCQl9Ci0JCWVsc2UgeworCQllbHNlIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gU3RyX2tpbmQgJiYKKwkJCSBzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gTnVtX2tpbmQpIHsKKwkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7CiAJCQlBRERPUChjLCBQT1BfVE9QKTsKIAkJfQogCQlicmVhazsKQEAgLTI5ODksNiArMzAxMiw3IEBACiAJCXJldHVybiAwOwogCXMgPSBlLT52LkJvb2xPcC52YWx1ZXM7CiAJbiA9IGFzZGxfc2VxX0xFTihzKSAtIDE7CisJYXNzZXJ0KG4gPj0gMCk7CiAJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogCQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSkpOwogCQlBRERPUF9KUkVMKGMsIGp1bXBpLCBlbmQpOwpAQCAtMzY0Myw3ICszNjY3LDcgQEAKIAlhc3NlcnQocy0+a2luZCA9PSBBdWdBc3NpZ25fa2luZCk7CiAKIAlzd2l0Y2ggKGUtPmtpbmQpIHsKLQkJY2FzZSBBdHRyaWJ1dGVfa2luZDoKKwljYXNlIEF0dHJpYnV0ZV9raW5kOgogCQlhdWdlID0gQXR0cmlidXRlKGUtPnYuQXR0cmlidXRlLnZhbHVlLCBlLT52LkF0dHJpYnV0ZS5hdHRyLAogCQkJCSBBdWdMb2FkLCBlLT5saW5lbm8sIGUtPmNvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogCQlpZiAoYXVnZSA9PSBOVUxMKQpAQCAtMzY2Niw3ICszNjkwLDggQEAKIAkJVklTSVQoYywgZXhwciwgYXVnZSk7CiAJCWJyZWFrOwogCWNhc2UgTmFtZV9raW5kOgotCQlWSVNJVChjLCBleHByLCBzLT52LkF1Z0Fzc2lnbi50YXJnZXQpOworCQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBlLT52Lk5hbWUuaWQsIExvYWQpKQorCQkgICAgcmV0dXJuIDA7CiAJCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKIAkJQURET1AoYywgaW5wbGFjZV9iaW5vcChjLCBzLT52LkF1Z0Fzc2lnbi5vcCkpOwogCQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgU3RvcmUpOwpAQCAtMzk3OSw2ICs0MDA0LDggQEAKIAkJYi0+Yl9zdGFydGRlcHRoID0gSU5UX01JTjsKIAkJZW50cnlibG9jayA9IGI7CiAJfQorCWlmICghZW50cnlibG9jaykKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIHN0YWNrZGVwdGhfd2FsayhjLCBlbnRyeWJsb2NrLCAwLCAwKTsKIH0KIApAQCAtNDA3NCw5ICs0MTAxLDEwIEBACiAKIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHdoZW4gdGhlIGFkZHIgZmllbGQgaW5jcmVtZW50cyBieSBtb3JlIHRoYW4gMjU1LAogdGhlIGxpbmUgIyBpbmNyZW1lbnQgaW4gZWFjaCBwYWlyIGdlbmVyYXRlZCBtdXN0IGJlIDAgdW50aWwgdGhlIHJlbWFpbmluZyBhZGRyCi1pbmNyZW1lbnQgaXMgPCAyNTYuICBTbywgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIGNvbV9zZXRfbGluZW5vIHNob3VsZCBub3QgKGFzCi13YXMgYWN0dWFsbHkgZG9uZSB1bnRpbCAyLjIpIGV4cGFuZCAzMDAsIDMwMCB0byAyNTUsIDI1NSwgIDQ1LCA0NSwgYnV0IHRvCi0yNTUsIDAsCSA0NSwgMjU1LCAgMCwgNDUuCitpbmNyZW1lbnQgaXMgPCAyNTYuICBTbywgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIGFzc2VtYmxlX2xub3RhYiAoaXQgdXNlZAordG8gYmUgY2FsbGVkIGNvbV9zZXRfbGluZW5vKSBzaG91bGQgbm90IChhcyB3YXMgYWN0dWFsbHkgZG9uZSB1bnRpbCAyLjIpCitleHBhbmQgMzAwLCAzMDAgdG8gMjU1LCAyNTUsIDQ1LCA0NSwgCisgICAgICAgICAgICBidXQgdG8gMjU1LCAgIDAsIDQ1LCAyNTUsIDAsIDQ1LgogKi8KIAogc3RhdGljIGludApAQCAtNDA5Miw3ICs0MTIwLDEwIEBACiAJYXNzZXJ0KGRfYnl0ZWNvZGUgPj0gMCk7CiAJYXNzZXJ0KGRfbGluZW5vID49IDApOwogCi0JaWYgKGRfbGluZW5vID09IDApCisJLyogWFhYKG5ub3J3aXR6KTogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzPworCSAgIGZvciBsb29wcyBhcmUgc3BlY2lhbCwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHRyYWNlIHRoZW0KKwkgICBlYWNoIHRpbWUgYXJvdW5kLCBzbyB3ZSBuZWVkIHRvIHNldCBhbiBleHRyYSBsaW5lIG51bWJlci4gKi8KKwlpZiAoZF9saW5lbm8gPT0gMCAmJiBpLT5pX29wY29kZSAhPSBGT1JfSVRFUikKIAkJcmV0dXJuIDE7CiAKIAlpZiAoZF9ieXRlY29kZSA+IDI1NSkgewpAQCAtNDEzMSwxMiArNDE2MiwxMiBAQAogCQl9CiAJCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCiAJCQkgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwotCQkqbG5vdGFiKysgPSAyNTU7CiAJCSpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7CisJCSpsbm90YWIrKyA9IDI1NTsKIAkJZF9ieXRlY29kZSA9IDA7CiAJCWZvciAoaiA9IDE7IGogPCBuY29kZXM7IGorKykgewotCQkJKmxub3RhYisrID0gMjU1OwogCQkJKmxub3RhYisrID0gMDsKKwkJCSpsbm90YWIrKyA9IDI1NTsKIAkJfQogCQlkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7CiAJCWEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwpAQCAtNDE3Myw3ICs0MjA0LDcgQEAKIGFzc2VtYmxlX2VtaXQoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGluc3RyICppKQogewogCWludCBzaXplLCBhcmcgPSAwLCBleHQgPSAwOwotCWludCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2J5dGVjb2RlKTsKKwlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfYnl0ZWNvZGUpOwogCWNoYXIgKmNvZGU7CiAKIAlzaXplID0gaW5zdHJzaXplKGkpOwpAQCAtNDM5Nyw2ICs0NDI4LDQxIEBACiAJcmV0dXJuIGNvOwogfQogCisKKy8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLworI2lmIDAKK3N0YXRpYyB2b2lkCitkdW1wX2luc3RyKGNvbnN0IHN0cnVjdCBpbnN0ciAqaSkKK3sKKwljb25zdCBjaGFyICpqcmVsID0gaS0+aV9qcmVsID8gImpyZWwgIiA6ICIiOworCWNvbnN0IGNoYXIgKmphYnMgPSBpLT5pX2phYnMgPyAiamFicyAiIDogIiI7CisJY2hhciBhcmdbMTI4XTsKKworCSphcmcgPSAnXDAnOworCWlmIChpLT5pX2hhc2FyZykKKwkJc3ByaW50ZihhcmcsICJhcmc6ICVkICIsIGktPmlfb3BhcmcpOworCisJZnByaW50ZihzdGRlcnIsICJsaW5lOiAlZCwgb3Bjb2RlOiAlZCAlcyVzJXNcbiIsIAorCQkJaS0+aV9saW5lbm8sIGktPmlfb3Bjb2RlLCBhcmcsIGphYnMsIGpyZWwpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9iYXNpY2Jsb2NrKGNvbnN0IGJhc2ljYmxvY2sgKmIpCit7CisJY29uc3QgY2hhciAqc2VlbiA9IGItPmJfc2VlbiA/ICJzZWVuICIgOiAiIjsKKwljb25zdCBjaGFyICpiX3JldHVybiA9IGItPmJfcmV0dXJuID8gInJldHVybiAiIDogIiI7CisJZnByaW50ZihzdGRlcnIsICJ1c2VkOiAlZCwgZGVwdGg6ICVkLCBvZmZzZXQ6ICVkICVzJXNcbiIsCisJCWItPmJfaXVzZWQsIGItPmJfc3RhcnRkZXB0aCwgYi0+Yl9vZmZzZXQsIHNlZW4sIGJfcmV0dXJuKTsKKwlpZiAoYi0+Yl9pbnN0cikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgeworCQkJZnByaW50ZihzdGRlcnIsICIgIFslMDJkXSAiLCBpKTsKKwkJCWR1bXBfaW5zdHIoYi0+Yl9pbnN0ciArIGkpOworCQl9CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyBQeUNvZGVPYmplY3QgKgogYXNzZW1ibGUoc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgYWRkTm9uZSkKIHsKQEAgLTQ0MjMsNiArNDQ4OSwxMyBAQAogCQllbnRyeWJsb2NrID0gYjsgCiAJfQogCisJLyogU2V0IGZpcnN0bGluZW5vIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHNldC4gKi8KKwlpZiAoIWMtPnUtPnVfZmlyc3RsaW5lbm8pIHsKKwkJaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0cikKKwkJCWMtPnUtPnVfZmlyc3RsaW5lbm8gPSBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubzsKKwkJZWxzZQorCQkJYy0+dS0+dV9maXJzdGxpbmVubyA9IDE7CisJfQogCWlmICghYXNzZW1ibGVfaW5pdCgmYSwgbmJsb2NrcywgYy0+dS0+dV9maXJzdGxpbmVubykpCiAJCWdvdG8gZXJyb3I7CiAJZGZzKGMsIGVudHJ5YmxvY2ssICZhKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggMzY3NDZlMi4uMzdkNmQyZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTIsNyArMiw5IEBACiAvKiBTdXBwb3J0IGZvciBkeW5hbWljIGxvYWRpbmcgb2YgZXh0ZW5zaW9uIG1vZHVsZXMgKi8KIAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpZmRlZiBIQVZFX0RJUkVDVF9ICiAjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCmRpZmYgLS1naXQgYS9QeXRob24vZXJyb3JzLmMgYi9QeXRob24vZXJyb3JzLmMKaW5kZXggZDk5ZjI2MS4uNDhlZDA1YyAxMDA2NDQKLS0tIGEvUHl0aG9uL2Vycm9ycy5jCisrKyBiL1B5dGhvbi9lcnJvcnMuYwpAQCAtNjQxLDcgKzY0MSw3IEBACiAKIC8qIEZ1bmN0aW9uIHRvIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlOyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLiAqLwogaW50Ci1QeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZSkKK1B5RXJyX1dhcm5FeChQeU9iamVjdCAqY2F0ZWdvcnksIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCiB7CiAJUHlPYmplY3QgKmRpY3QsICpmdW5jID0gTlVMTDsKIAlQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlID0gUHlNb2R1bGVfR2V0V2FybmluZ3NNb2R1bGUoKTsKQEAgLTY1OSw3ICs2NTksOCBAQAogCiAJCWlmIChjYXRlZ29yeSA9PSBOVUxMKQogCQkJY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKLQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJzTyIsIG1lc3NhZ2UsIGNhdGVnb3J5KTsKKwkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJzT24iLAorCQkJCQkgICAgbWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsKTsKIAkJaWYgKHJlcyA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCQlQeV9ERUNSRUYocmVzKTsKQEAgLTY2Nyw2ICs2NjgsMTYgQEAKIAl9CiB9CiAKKy8qIFB5RXJyX1dhcm4gaXMgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KKyAgIFVzZSBQeUVycl9XYXJuRXggaW5zdGVhZC4gKi8KKworI3VuZGVmIFB5RXJyX1dhcm4KKworUHlBUElfRlVOQyhpbnQpCitQeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZSkKK3sKKwlyZXR1cm4gUHlFcnJfV2FybkV4KGNhdGVnb3J5LCBtZXNzYWdlLCAxKTsKK30KIAogLyogV2FybmluZyB3aXRoIGV4cGxpY2l0IG9yaWdpbiAqLwogaW50CmRpZmYgLS1naXQgYS9QeXRob24vZnV0dXJlLmMgYi9QeXRob24vZnV0dXJlLmMKaW5kZXggZDIzZmFkNi4uZDZmMTFhNCAxMDA2NDQKLS0tIGEvUHl0aG9uL2Z1dHVyZS5jCisrKyBiL1B5dGhvbi9mdXR1cmUuYwpAQCAtMTIxLDggKzEyMSwxMCBAQAogCVB5RnV0dXJlRmVhdHVyZXMgKmZmOwogCiAJZmYgPSAoUHlGdXR1cmVGZWF0dXJlcyAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoUHlGdXR1cmVGZWF0dXJlcykpOwotCWlmIChmZiA9PSBOVUxMKQorCWlmIChmZiA9PSBOVUxMKSB7CisJCVB5RXJyX05vTWVtb3J5KCk7CiAJCXJldHVybiBOVUxMOworCX0KIAlmZi0+ZmZfZmVhdHVyZXMgPSAwOwogCWZmLT5mZl9saW5lbm8gPSAtMTsKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGFyZ3MuYyBiL1B5dGhvbi9nZXRhcmdzLmMKaW5kZXggOTYzNzYxOC4uOGRjNWU3OCAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGFyZ3MuYworKysgYi9QeXRob24vZ2V0YXJncy5jCkBAIC0yMDYsNiArMjA2LDkgQEAKIAkJCWlmIChsZXZlbCA9PSAwKQogCQkJCW1heCsrOwogCQkJbGV2ZWwrKzsKKwkJCWlmIChsZXZlbCA+PSAzMCkKKwkJCQlQeV9GYXRhbEVycm9yKCJ0b28gbWFueSB0dXBsZSBuZXN0aW5nIGxldmVscyAiCisJCQkJCSAgICAgICJpbiBhcmd1bWVudCBmb3JtYXQgc3RyaW5nIik7CiAJCQlicmVhazsKIAkJY2FzZSAnKSc6CiAJCQlpZiAobGV2ZWwgPT0gMCkKQEAgLTM1MSw4ICszNTQsOCBAQAogCQkJCSAgICAgICJhcmd1bWVudCAlZCIsIGlhcmcpOwogCQkJaSA9IDA7CiAJCQlwICs9IHN0cmxlbihwKTsKLQkJCXdoaWxlIChsZXZlbHNbaV0gPiAwICYmIChpbnQpKHAtYnVmKSA8IDIyMCkgewotCQkJCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAoYnVmIC0gcCksCisJCQl3aGlsZSAobGV2ZWxzW2ldID4gMCAmJiBpIDwgMzIgJiYgKGludCkocC1idWYpIDwgMjIwKSB7CisJCQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwKIAkJCQkJICAgICAgIiwgaXRlbSAlZCIsIGxldmVsc1tpXS0xKTsKIAkJCQlwICs9IHN0cmxlbihwKTsKIAkJCQlpKys7CkBAIC00MzksNiArNDQyLDEzIEBACiAJCWNoYXIgKm1zZzsKIAkJUHlPYmplY3QgKml0ZW07CiAJCWl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKKwkJaWYgKGl0ZW0gPT0gTlVMTCkgeworCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCWxldmVsc1swXSA9IGkrMTsKKwkJCWxldmVsc1sxXSA9IDA7CisJCQlzdHJuY3B5KG1zZ2J1ZiwgImlzIG5vdCByZXRyaWV2YWJsZSIsIGJ1ZnNpemUpOworCQkJcmV0dXJuIG1zZ2J1ZjsKKwkJfQogCQltc2cgPSBjb252ZXJ0aXRlbShpdGVtLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgbGV2ZWxzKzEsIAogCQkJCSAgbXNnYnVmLCBidWZzaXplLCBmcmVlbGlzdCk7CiAJCS8qIFB5U2VxdWVuY2VfR2V0SXRlbSBjYWxscyB0cC0+c3FfaXRlbSwgd2hpY2ggSU5DUkVGcyAqLwpAQCAtMTUwOCw2ICsxNTE4LDcgQEAKIAkJZWxzZSB7CiAJCQltc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBwX3ZhLCBmbGFncyk7CiAJCQlpZiAobXNnKSB7CisJCQkJbGV2ZWxzWzBdID0gMDsKIAkJCQlzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgbWVzc2FnZSk7CiAJCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKIAkJCX0KZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRvcHQuYyBiL1B5dGhvbi9nZXRvcHQuYwppbmRleCA1NDI5ZmFjNS4uNjU5ZWZjZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldG9wdC5jCisrKyBiL1B5dGhvbi9nZXRvcHQuYwpAQCAtMjQsNiArMjQsOSBAQAogICogZGF2ZWdvdHRuZXJAZGVscGhpLmNvbS4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorLyogTW9kaWZpZWQgdG8gc3VwcG9ydCAtLWhlbHAgYW5kIC0tdmVyc2lvbiwgYXMgd2VsbCBhcyAvPyBvbiBXaW5kb3dzCisgKiBieSBHZW9yZyBCcmFuZGwuICovCisKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCkBAIC00Myw4ICs0NiwxNyBAQAogCiAJaWYgKCpvcHRfcHRyID09ICdcMCcpIHsKIAotCQlpZiAoX1B5T1Nfb3B0aW5kID49IGFyZ2MgfHwgYXJndltfUHlPU19vcHRpbmRdWzBdICE9ICctJyB8fAotCQkgICAgYXJndltfUHlPU19vcHRpbmRdWzFdID09ICdcMCcgLyogbG9uZSBkYXNoICovICkKKwkJaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjKQorCQkJcmV0dXJuIC0xOworI2lmZGVmIE1TX1dJTkRPV1MKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi8/IikgPT0gMCkgeworCQkJKytfUHlPU19vcHRpbmQ7CisJCQlyZXR1cm4gJ2gnOworCQl9CisjZW5kaWYKKworCQllbHNlIGlmIChhcmd2W19QeU9TX29wdGluZF1bMF0gIT0gJy0nIHx8CisJCSAgICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXVsxXSA9PSAnXDAnIC8qIGxvbmUgZGFzaCAqLyApCiAJCQlyZXR1cm4gLTE7CiAKIAkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tIikgPT0gMCkgewpAQCAtNTIsNiArNjQsMTcgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLWhlbHAiKSA9PSAwKSB7CisJCQkrK19QeU9TX29wdGluZDsKKwkJCXJldHVybiAnaCc7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS12ZXJzaW9uIikgPT0gMCkgeworCQkJKytfUHlPU19vcHRpbmQ7CisJCQlyZXR1cm4gJ1YnOworCQl9CisKKwogCQlvcHRfcHRyID0gJmFyZ3ZbX1B5T1Nfb3B0aW5kKytdWzFdOyAKIAl9CiAKQEAgLTYyLDcgKzg1LDcgQEAKIAkJaWYgKF9QeU9TX29wdGVycikKIAkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246IC0lY1xuIiwgb3B0aW9uKTsKIAotCQlyZXR1cm4gJz8nOworCQlyZXR1cm4gJ18nOwogCX0KIAogCWlmICgqKHB0ciArIDEpID09ICc6JykgewpAQCAtNzYsNyArOTksNyBAQAogCQkJCWlmIChfUHlPU19vcHRlcnIpCiAJCQkJCWZwcmludGYoc3RkZXJyLAogCQkJICAgICJBcmd1bWVudCBleHBlY3RlZCBmb3IgdGhlIC0lYyBvcHRpb25cbiIsIG9wdGlvbik7Ci0JCQkJcmV0dXJuICc/JzsKKwkJCQlyZXR1cm4gJ18nOwogCQkJfQogCiAJCQlfUHlPU19vcHRhcmcgPSBhcmd2W19QeU9TX29wdGluZCsrXTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBjMTRlOGNkLi5lZjM3ZThiIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC02MCw2ICs2MCwxMCBAQAogICAgICAgIFB5dGhvbiAyLjVhMDogNjIwODEgKGFzdC1icmFuY2gpCiAgICAgICAgUHl0aG9uIDIuNWEwOiA2MjA5MSAod2l0aCkKICAgICAgICBQeXRob24gMi41YTA6IDYyMDkyIChjaGFuZ2VkIFdJVEhfQ0xFQU5VUCBvcGNvZGUpCisgICAgICAgUHl0aG9uIDIuNWIzOiA2MjEwMSAoZml4IHdyb25nIGNvZGU6IGZvciB4LCBpbiAuLi4pCisgICAgICAgUHl0aG9uIDIuNWIzOiA2MjExMSAoZml4IHdyb25nIGNvZGU6IHggKz0geWllbGQpCisgICAgICAgUHl0aG9uIDIuNWMxOiA2MjEyMSAoZml4IHdyb25nIGxub3RhYiB3aXRoIGZvciBsb29wcyBhbmQKKyAgICAgICAJCQkgICAgc3RvcmluZyBjb25zdGFudHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQpCiAgICAgICAgUHl0aG9uIDMwMDA6ICAgMzAwMAogLgogKi8KQEAgLTk4LDYgKzEwMiw4IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBQeVR5cGVPYmplY3QgTnVsbEltcG9ydGVyVHlwZTsJLyogRm9yd2FyZCByZWZlcmVuY2UgKi8KKwogLyogSW5pdGlhbGl6ZSB0aGluZ3MgKi8KIAogdm9pZApAQCAtMTE2LDYgKzEyMiw4IEBACiAJZm9yIChzY2FuID0gX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYjsgc2Nhbi0+c3VmZml4ICE9IE5VTEw7ICsrc2NhbikKIAkJKytjb3VudFM7CiAJZmlsZXRhYiA9IFB5TWVtX05FVyhzdHJ1Y3QgZmlsZWRlc2NyLCBjb3VudEQgKyBjb3VudFMgKyAxKTsKKwlpZiAoZmlsZXRhYiA9PSBOVUxMKQorCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGltcG9ydCBmaWxlIHRhYmxlLiIpOwogCW1lbWNweShmaWxldGFiLCBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIsCiAJICAgICAgIGNvdW50RCAqIHNpemVvZihzdHJ1Y3QgZmlsZWRlc2NyKSk7CiAJbWVtY3B5KGZpbGV0YWIgKyBjb3VudEQsIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIsCkBAIC0xNTMsNiArMTYxLDggQEAKIAogCS8qIGFkZGluZyBzeXMucGF0aF9ob29rcyBhbmQgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUsIHNldHRpbmcgdXAKIAkgICB6aXBpbXBvcnQgKi8KKwlpZiAoUHlUeXBlX1JlYWR5KCZOdWxsSW1wb3J0ZXJUeXBlKSA8IDApCisJCWdvdG8gZXJyb3I7CiAKIAlpZiAoUHlfVmVyYm9zZUZsYWcpCiAJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGluc3RhbGxpbmcgemlwaW1wb3J0IGhvb2tcbiIpOwpAQCAtMTc4LDkgKzE4OCwxMSBAQAogCWlmIChlcnIpIHsKICAgZXJyb3I6CiAJCVB5RXJyX1ByaW50KCk7Ci0JCVB5X0ZhdGFsRXJyb3IoImluaXRpYWxpemluZyBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcyBvciAiCi0JCQkgICAgICAicGF0aF9pbXBvcnRlcl9jYWNoZSBmYWlsZWQiKTsKKwkJUHlfRmF0YWxFcnJvcigiaW5pdGlhbGl6aW5nIHN5cy5tZXRhX3BhdGgsIHN5cy5wYXRoX2hvb2tzLCAiCisJCQkgICAgICAicGF0aF9pbXBvcnRlcl9jYWNoZSwgb3IgTnVsbEltcG9ydGVyIGZhaWxlZCIKKwkJCSAgICAgICk7CiAJfQorCiAJemltcGltcG9ydCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiemlwaW1wb3J0Iik7CiAJaWYgKHppbXBpbXBvcnQgPT0gTlVMTCkgewogCQlQeUVycl9DbGVhcigpOyAvKiBObyB6aXAgaW1wb3J0IG1vZHVsZSAtLSBva2F5ICovCkBAIC0yMzksOCArMjUxLDExIEBACiAJbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAlpZiAobWUgPT0gLTEpCiAJCXJldHVybjsgLyogVG9vIGJhZCAqLwotCWlmIChpbXBvcnRfbG9jayA9PSBOVUxMKQorCWlmIChpbXBvcnRfbG9jayA9PSBOVUxMKSB7CiAJCWltcG9ydF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworCQlpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkKKwkJCXJldHVybjsgIC8qIE5vdGhpbmcgbXVjaCB3ZSBjYW4gZG8uICovCisJfQogCWlmIChpbXBvcnRfbG9ja190aHJlYWQgPT0gbWUpIHsKIAkJaW1wb3J0X2xvY2tfbGV2ZWwrKzsKIAkJcmV0dXJuOwpAQCAtMjU5LDcgKzI3NCw3IEBACiB1bmxvY2tfaW1wb3J0KHZvaWQpCiB7CiAJbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAobWUgPT0gLTEpCisJaWYgKG1lID09IC0xIHx8IGltcG9ydF9sb2NrID09IE5VTEwpCiAJCXJldHVybiAwOyAvKiBUb28gYmFkICovCiAJaWYgKGltcG9ydF9sb2NrX3RocmVhZCAhPSBtZSkKIAkJcmV0dXJuIC0xOwpAQCAtMTA1Myw5ICsxMDY4LDE4IEBACiAJCX0KIAkJUHlFcnJfQ2xlYXIoKTsKIAl9Ci0JaWYgKGltcG9ydGVyID09IE5VTEwpCi0JCWltcG9ydGVyID0gUHlfTm9uZTsKLQllbHNlIGlmIChpbXBvcnRlciAhPSBQeV9Ob25lKSB7CisJaWYgKGltcG9ydGVyID09IE5VTEwpIHsKKwkJaW1wb3J0ZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorCQkJKFB5T2JqZWN0ICopJk51bGxJbXBvcnRlclR5cGUsIHAsIE5VTEwKKwkJKTsKKwkJaWYgKGltcG9ydGVyID09IE5VTEwpIHsKKwkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgeworCQkJCVB5RXJyX0NsZWFyKCk7CisJCQkJcmV0dXJuIFB5X05vbmU7CisJCQl9CisJCX0KKwl9CisJaWYgKGltcG9ydGVyICE9IE5VTEwpIHsKIAkJaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIGltcG9ydGVyKTsKIAkJUHlfREVDUkVGKGltcG9ydGVyKTsKIAkJaWYgKGVyciAhPSAwKQpAQCAtMTIzOCw0MiArMTI2MiwxNyBAQAogCiAJCQlpbXBvcnRlciA9IGdldF9wYXRoX2ltcG9ydGVyKHBhdGhfaW1wb3J0ZXJfY2FjaGUsCiAJCQkJCQkgICAgIHBhdGhfaG9va3MsIHYpOwotCQkJaWYgKGltcG9ydGVyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQkvKiBOb3RlOiBpbXBvcnRlciBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwotCQkJaWYgKGltcG9ydGVyID09IFB5X0ZhbHNlKSB7Ci0JCQkJLyogQ2FjaGVkIGFzIG5vdCBiZWluZyBhIHZhbGlkIGRpci4gKi8KKwkJCWlmIChpbXBvcnRlciA9PSBOVUxMKSB7CiAJCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQljb250aW51ZTsKKwkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KLQkJCWVsc2UgaWYgKGltcG9ydGVyID09IFB5X1RydWUpIHsKLQkJCQkvKiBDYWNoZWQgYXMgYmVpbmcgYSB2YWxpZCBkaXIsIHNvIGp1c3QKLQkJCQkgKiBjb250aW51ZSBiZWxvdy4gKi8KLQkJCX0KLQkJCWVsc2UgaWYgKGltcG9ydGVyID09IFB5X05vbmUpIHsKLQkJCQkvKiBObyBpbXBvcnRlciB3YXMgZm91bmQsIHNvIGl0IGhhcyB0byBiZSBhIGZpbGUuCi0JCQkJICogQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyB2YWxpZC4KLQkJCQkgKiBOb3RlIHRoYXQgdGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIHBhdGgsIGJ1dAotCQkJCSAqIG5vdCBzdGF0J2FibGUsIGhlbmNlIHRoZSBjaGVjayBmb3IgbGVuLiAqLwotI2lmZGVmIEhBVkVfU1RBVAotCQkJCWlmIChsZW4gJiYgc3RhdChidWYsICZzdGF0YnVmKSAhPSAwKSB7Ci0JCQkJCS8qIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gKi8KLQkJCQkJUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwKLQkJCQkJICAgICAgICAgICAgICAgdiwgUHlfRmFsc2UpOwotCQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlQeURpY3RfU2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLAotCQkJCQkgICAgICAgICAgICAgICB2LCBQeV9UcnVlKTsKLQkJCQl9Ci0jZW5kaWYKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEEgcmVhbCBpbXBvcnQgaG9vayBpbXBvcnRlciB3YXMgZm91bmQuICovCisJCQkvKiBOb3RlOiBpbXBvcnRlciBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworCQkJaWYgKGltcG9ydGVyICE9IFB5X05vbmUpIHsKIAkJCQlQeU9iamVjdCAqbG9hZGVyOwogCQkJCWxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaW1wb3J0ZXIsCiAJCQkJCQkJICAgICAiZmluZF9tb2R1bGUiLAogCQkJCQkJCSAgICAgInMiLCBmdWxsbmFtZSk7CisJCQkJUHlfWERFQ1JFRihjb3B5KTsKIAkJCQlpZiAobG9hZGVyID09IE5VTEwpCiAJCQkJCXJldHVybiBOVUxMOyAgLyogZXJyb3IgKi8KIAkJCQlpZiAobG9hZGVyICE9IFB5X05vbmUpIHsKQEAgLTEyODIsNyArMTI4MSw2IEBACiAJCQkJCXJldHVybiAmaW1wb3J0aG9va2Rlc2NyOwogCQkJCX0KIAkJCQlQeV9ERUNSRUYobG9hZGVyKTsKLQkJCQlQeV9YREVDUkVGKGNvcHkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0xOTA0LDExICsxOTAyLDEwIEBACiAJaWYgKGNvID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlpZiAoIVB5Q29kZV9DaGVjayhjbykpIHsKLQkJUHlfREVDUkVGKGNvKTsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKIAkJCSAgICAgImZyb3plbiBvYmplY3QgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKIAkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiAtMTsKKwkJZ290byBlcnJfcmV0dXJuOwogCX0KIAlpZiAoaXNwYWNrYWdlKSB7CiAJCS8qIFNldCBfX3BhdGhfXyB0byB0aGUgcGFja2FnZSBuYW1lICovCkBAIC0xOTE2LDIyICsxOTEzLDI1IEBACiAJCWludCBlcnI7CiAJCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CiAJCWlmIChtID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisJCQlnb3RvIGVycl9yZXR1cm47CiAJCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCQlzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKIAkJaWYgKHMgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKKwkJCWdvdG8gZXJyX3JldHVybjsKIAkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fcGF0aF9fIiwgcyk7CiAJCVB5X0RFQ1JFRihzKTsKIAkJaWYgKGVyciAhPSAwKQotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gZXJyX3JldHVybjsKIAl9CiAJbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sICI8ZnJvemVuPiIpOwotCVB5X0RFQ1JFRihjbyk7CiAJaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworCQlnb3RvIGVycl9yZXR1cm47CisJUHlfREVDUkVGKGNvKTsKIAlQeV9ERUNSRUYobSk7CiAJcmV0dXJuIDE7CitlcnJfcmV0dXJuOgorCVB5X0RFQ1JFRihjbyk7CisJcmV0dXJuIC0xOwogfQogCiAKQEAgLTI5MjYsMTEgKzI5MjYsMTIwIEBACiAJcmV0dXJuIGVycjsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKK30gTnVsbEltcG9ydGVyOworCitzdGF0aWMgaW50CitOdWxsSW1wb3J0ZXJfaW5pdChOdWxsSW1wb3J0ZXIgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwljaGFyICpwYXRoOworCisJaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiTnVsbEltcG9ydGVyKCkiLCBrd2RzKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOk51bGxJbXBvcnRlciIsCisJCQkgICAgICAmcGF0aCkpCisJCXJldHVybiAtMTsKKworCWlmIChzdHJsZW4ocGF0aCkgPT0gMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJlbXB0eSBwYXRobmFtZSIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKyNpZm5kZWYgUklTQ09TCisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCWludCBydjsKKworCQlydiA9IHN0YXQocGF0aCwgJnN0YXRidWYpOworCQlpZiAocnYgPT0gMCkgeworCQkJLyogaXQgZXhpc3RzICovCisJCQlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLworCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKwkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKyNlbHNlCisJCWlmIChvYmplY3RfZXhpc3RzKHBhdGgpKSB7CisJCQkvKiBpdCBleGlzdHMgKi8KKwkJCWlmIChpc2RpcihwYXRoKSkgeworCQkJCS8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKwkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisJCQkJCQkiZXhpc3RpbmcgZGlyZWN0b3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitOdWxsSW1wb3J0ZXJfZmluZF9tb2R1bGUoTnVsbEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIE51bGxJbXBvcnRlcl9tZXRob2RzW10gPSB7CisJeyJmaW5kX21vZHVsZSIsIChQeUNGdW5jdGlvbilOdWxsSW1wb3J0ZXJfZmluZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKwkgIkFsd2F5cyByZXR1cm4gTm9uZSIKKwl9LAorCXtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworc3RhdGljIFB5VHlwZU9iamVjdCBOdWxsSW1wb3J0ZXJUeXBlID0geworCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisJImltcC5OdWxsSW1wb3J0ZXIiLCAgICAgICAgLyp0cF9uYW1lKi8KKwlzaXplb2YoTnVsbEltcG9ydGVyKSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KKwkiTnVsbCBpbXBvcnRlciBvYmplY3QiLCAgICAvKiB0cF9kb2MgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworCTAsCSAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworCU51bGxJbXBvcnRlcl9tZXRob2RzLCAgICAgIC8qIHRwX21ldGhvZHMgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisJKGluaXRwcm9jKU51bGxJbXBvcnRlcl9pbml0LCAgICAgIC8qIHRwX2luaXQgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworCVB5VHlwZV9HZW5lcmljTmV3ICAgICAgICAgIC8qIHRwX25ldyAqLworfTsKKworCiBQeU1PRElOSVRfRlVOQwogaW5pdGltcCh2b2lkKQogewogCVB5T2JqZWN0ICptLCAqZDsKIAorCWlmIChQeVR5cGVfUmVhZHkoJk51bGxJbXBvcnRlclR5cGUpIDwgMCkKKwkJZ290byBmYWlsdXJlOworCiAJbSA9IFB5X0luaXRNb2R1bGU0KCJpbXAiLCBpbXBfbWV0aG9kcywgZG9jX2ltcCwKIAkJCSAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CiAJaWYgKG0gPT0gTlVMTCkKQEAgLTI5NDgsNiArMzA1Nyw4IEBACiAJaWYgKHNldGludChkLCAiUFlfQ09ERVJFU09VUkNFIiwgUFlfQ09ERVJFU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKIAlpZiAoc2V0aW50KGQsICJJTVBfSE9PSyIsIElNUF9IT09LKSA8IDApIGdvdG8gZmFpbHVyZTsKIAorCVB5X0lOQ1JFRigmTnVsbEltcG9ydGVyVHlwZSk7CisJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsSW1wb3J0ZXIiLCAoUHlPYmplY3QgKikmTnVsbEltcG9ydGVyVHlwZSk7CiAgIGZhaWx1cmU6CiAJOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMgYi9QeXRob24vbWFjdG9vbGJveGdsdWUuYwppbmRleCAwYWEyY2ZkLi4yNmExMzA4IDEwMDY0NAotLS0gYS9QeXRob24vbWFjdG9vbGJveGdsdWUuYworKysgYi9QeXRob24vbWFjdG9vbGJveGdsdWUuYwpAQCAtNjAsOCArNjAsOSBAQAogCQkJc3RybmNweShidWYsIGlucHV0LCBzaXplb2YoYnVmKSAtIDEpOwogCQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOwogCQl9CisJCVB5X0RFQ1JFRihydik7CiAJfQotCQorCVB5X1hERUNSRUYobSk7CiAJcmV0dXJuIGJ1ZjsKIH0KIApkaWZmIC0tZ2l0IGEvUHl0aG9uL215c3RydG91bC5jIGIvUHl0aG9uL215c3RydG91bC5jCmluZGV4IDM4MGIzN2QuLjBkZGE0YmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9teXN0cnRvdWwuYworKysgYi9QeXRob24vbXlzdHJ0b3VsLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKKyNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCiAKQEAgLTY5LDExICs2OSwyMiBAQAogICogY2FsY3VsYXRlZCBieSBbaW50KG1hdGguZmxvb3IobWF0aC5sb2coMioqMzIsIGkpKSkgZm9yIGkgaW4gcmFuZ2UoMiwgMzcpXS4KICAqIE5vdGUgdGhhdCB0aGlzIGlzIHBlc3NpbWlzdGljIGlmIHNpemVvZihsb25nKSA+IDQuCiAgKi8KKyNpZiBTSVpFT0ZfTE9ORyA9PSA0CiBzdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKIAkwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLwogCTksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCiAJNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KIAk2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLworI2VsaWYgU0laRU9GX0xPTkcgPT0gOAorLyogW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjY0LCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0gKi8KK3N0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0geworCSAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KKwkxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCisJMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLworCTEzLCAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KKyNlbHNlCisjZXJyb3IgIk5lZWQgdGFibGUgZm9yIFNJWkVPRl9MT05HIgorI2VuZGlmCiAKIC8qCiAqKglzdHJ0b3VsCkBAIC0xODQsMTAgKzE5NSwxOSBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIH0KIAorLyogQ2hlY2tpbmcgZm9yIG92ZXJmbG93IGluIFB5T1Nfc3RydG9sIGlzIGEgUElUQSBzaW5jZSBDIGRvZXNuJ3QgZGVmaW5lCisgKiBhbnl0aGluZyBhYm91dCB3aGF0IGhhcHBlbnMgd2hlbiBhIHNpZ25lZCBpbnRlZ2VyIG9wZXJhdGlvbiBvdmVyZmxvd3MsCisgKiBhbmQgc29tZSBjb21waWxlcnMgdGhpbmsgdGhleSdyZSBkb2luZyB5b3UgYSBmYXZvciBieSBiZWluZyAiY2xldmVyIgorICogdGhlbi4gIFB5dGhvbiBhc3N1bWVzIGEgMidzLWNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNvIHRoYXQgdGhlIGJpdAorICogcGF0dGVybiBmb3IgdGhlIGxhcmdlc3QgcG9zdGl2ZSBzaWduZWQgbG9uZyBpcyBMT05HX01BWCwgYW5kIGZvcgorICogdGhlIHNtYWxsZXN0IG5lZ2F0aXZlIHNpZ25lZCBsb25nIGlzIExPTkdfTUFYICsgMS4KKyAqLworCiBsb25nCiBQeU9TX3N0cnRvbChjaGFyICpzdHIsIGNoYXIgKipwdHIsIGludCBiYXNlKQogewogCWxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgdXJlc3VsdDsKIAljaGFyIHNpZ247CiAKIAl3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKQEAgLTE5NywxNyArMjE3LDIwIEBACiAJaWYgKHNpZ24gPT0gJysnIHx8IHNpZ24gPT0gJy0nKQogCQlzdHIrKzsKIAotCXJlc3VsdCA9IChsb25nKSBQeU9TX3N0cnRvdWwoc3RyLCBwdHIsIGJhc2UpOworCXVyZXN1bHQgPSBQeU9TX3N0cnRvdWwoc3RyLCBwdHIsIGJhc2UpOwogCi0JLyogU2lnbmFsIG92ZXJmbG93IGlmIHRoZSByZXN1bHQgYXBwZWFycyBuZWdhdGl2ZSwKLQkgICBleGNlcHQgZm9yIHRoZSBsYXJnZXN0IG5lZ2F0aXZlIGludGVnZXIgKi8KLQlpZiAocmVzdWx0IDwgMCAmJiAhKHNpZ24gPT0gJy0nICYmIHJlc3VsdCA9PSAtcmVzdWx0KSkgewotCQllcnJubyA9IEVSQU5HRTsKLQkJcmVzdWx0ID0gMHg3ZmZmZmZmZjsKKwlpZiAodXJlc3VsdCA8PSAodW5zaWduZWQgbG9uZylMT05HX01BWCkgeworCQlyZXN1bHQgPSAobG9uZyl1cmVzdWx0OworCQlpZiAoc2lnbiA9PSAnLScpCisJCQlyZXN1bHQgPSAtcmVzdWx0OwogCX0KLQotCWlmIChzaWduID09ICctJykKLQkJcmVzdWx0ID0gLXJlc3VsdDsKLQorCWVsc2UgaWYgKHNpZ24gPT0gJy0nICYmIHVyZXN1bHQgPT0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVggKyAxKSB7CisJCWFzc2VydChMT05HX01JTiA9PSAtTE9OR19NQVgtMSk7CisJCXJlc3VsdCA9IExPTkdfTUlOOworCX0KKwllbHNlIHsKKwkJZXJybm8gPSBFUkFOR0U7CisJCXJlc3VsdCA9IExPTkdfTUFYOworCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5YXJlbmEuYyBiL1B5dGhvbi9weWFyZW5hLmMKaW5kZXggZjExYTkwNS4uZjRjYzQ3NCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5YXJlbmEuYworKysgYi9QeXRob24vcHlhcmVuYS5jCkBAIC0xMzIsMTkgKzEzMiwxOSBAQAogewogCVB5QXJlbmEqIGFyZW5hID0gKFB5QXJlbmEgKiltYWxsb2Moc2l6ZW9mKFB5QXJlbmEpKTsKIAlpZiAoIWFyZW5hKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOwogCiAJYXJlbmEtPmFfaGVhZCA9IGJsb2NrX25ldyhERUZBVUxUX0JMT0NLX1NJWkUpOwogCWFyZW5hLT5hX2N1ciA9IGFyZW5hLT5hX2hlYWQ7CiAgICAgICAgIGlmICghYXJlbmEtPmFfaGVhZCkgewogICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilhcmVuYSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICB9CiAgICAgICAgIGFyZW5hLT5hX29iamVjdHMgPSBQeUxpc3RfTmV3KDApOwogICAgICAgICBpZiAoIWFyZW5hLT5hX29iamVjdHMpIHsKICAgICAgICAgICAgICAgICBibG9ja19mcmVlKGFyZW5hLT5hX2hlYWQpOwogICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilhcmVuYSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIChQeUFyZW5hKilQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICB9CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgYXJlbmEtPnRvdGFsX2FsbG9jcyA9IDA7CkBAIC0xOTEsNyArMTkxLDcgQEAKIHsKIAl2b2lkICpwID0gYmxvY2tfYWxsb2MoYXJlbmEtPmFfY3VyLCBzaXplKTsKIAlpZiAoIXApCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQogICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzKys7CiAgICAgICAgIGFyZW5hLT50b3RhbF9zaXplICs9IHNpemU7CmRpZmYgLS1naXQgYS9QeXRob24vcHlzdGF0ZS5jIGIvUHl0aG9uL3B5c3RhdGUuYwppbmRleCBiOGY0NjBmLi4zZmFlODViIDEwMDY0NAotLS0gYS9QeXRob24vcHlzdGF0ZS5jCisrKyBiL1B5dGhvbi9weXN0YXRlLmMKQEAgLTYzLDYgKzYzLDEwIEBACiAKIAlpZiAoaW50ZXJwICE9IE5VTEwpIHsKIAkJSEVBRF9JTklUKCk7CisjaWZkZWYgV0lUSF9USFJFQUQKKwkJaWYgKGhlYWRfbXV0ZXggPT0gTlVMTCkKKwkJCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdGhyZWFkcyBmb3IgaW50ZXJwcmV0ZXIiKTsKKyNlbmRpZgogCQlpbnRlcnAtPm1vZHVsZXMgPSBOVUxMOwogCQlpbnRlcnAtPnN5c2RpY3QgPSBOVUxMOwogCQlpbnRlcnAtPmJ1aWx0aW5zID0gTlVMTDsKQEAgLTM4Nyw2ICszOTEsNTMgQEAKIAlyZXR1cm4gdHN0YXRlLT5uZXh0OwogfQogCisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3lzLl9jdXJyZW50X2ZyYW1lcygpLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZQorICAgY2FsbGVkIHdpdGggdGhlIEdJTCBoZWxkLCBhcyBpdCB3aWxsIGJlIHdoZW4gY2FsbGVkIHZpYQorICAgc3lzLl9jdXJyZW50X2ZyYW1lcygpLiAgSXQncyBwb3NzaWJsZSBpdCB3b3VsZCB3b3JrIGZpbmUgZXZlbiB3aXRob3V0CisgICB0aGUgR0lMIGhlbGQsIGJ1dCBoYXZlbid0IHRob3VnaHQgZW5vdWdoIGFib3V0IHRoYXQuCisqLworUHlPYmplY3QgKgorX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXModm9pZCkKK3sKKwlQeU9iamVjdCAqcmVzdWx0OworCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaTsKKworCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogZm9yIGkgaW4gYWxsIGludGVycHJldGVyczoKKwkgKiAgICAgZm9yIHQgaW4gYWxsIG9mIGkncyB0aHJlYWQgc3RhdGVzOgorCSAqICAgICAgICAgIGlmIHQncyBmcmFtZSBpc24ndCBOVUxMLCBtYXAgdCdzIGlkIHRvIGl0cyBmcmFtZQorCSAqIEJlY2F1c2UgdGhlc2UgbGlzdHMgY2FuIG11dHV0ZSBldmVuIHdoZW4gdGhlIEdJTCBpcyBoZWxkLCB3ZQorCSAqIG5lZWQgdG8gZ3JhYiBoZWFkX211dGV4IGZvciB0aGUgZHVyYXRpb24uCisJICovCisJSEVBRF9MT0NLKCk7CisJZm9yIChpID0gaW50ZXJwX2hlYWQ7IGkgIT0gTlVMTDsgaSA9IGktPm5leHQpIHsKKwkJUHlUaHJlYWRTdGF0ZSAqdDsKKwkJZm9yICh0ID0gaS0+dHN0YXRlX2hlYWQ7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpIHsKKwkJCVB5T2JqZWN0ICppZDsKKwkJCWludCBzdGF0OworCQkJc3RydWN0IF9mcmFtZSAqZnJhbWUgPSB0LT5mcmFtZTsKKwkJCWlmIChmcmFtZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWQgPSBQeUludF9Gcm9tTG9uZyh0LT50aHJlYWRfaWQpOworCQkJaWYgKGlkID09IE5VTEwpCisJCQkJZ290byBGYWlsOworCQkJc3RhdCA9IFB5RGljdF9TZXRJdGVtKHJlc3VsdCwgaWQsIChQeU9iamVjdCAqKWZyYW1lKTsKKwkJCVB5X0RFQ1JFRihpZCk7CisJCQlpZiAoc3RhdCA8IDApCisJCQkJZ290byBGYWlsOworCQl9CisJfQorCUhFQURfVU5MT0NLKCk7CisJcmV0dXJuIHJlc3VsdDsKKworIEZhaWw6CisgCUhFQURfVU5MT0NLKCk7CisgCVB5X0RFQ1JFRihyZXN1bHQpOworIAlyZXR1cm4gTlVMTDsKK30KIAogLyogUHl0aG9uICJhdXRvIHRocmVhZCBzdGF0ZSIgQVBJLiAqLwogI2lmZGVmIFdJVEhfVEhSRUFECkBAIC00NDQsMTUgKzQ5NSwxNSBAQAogCS8qIElmIGF1dG9UTFNrZXkgaXMgMCwgdGhpcyBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHN0YXRlIGNyZWF0ZWQKIAkgICBpbiBQeV9Jbml0aWFsaXplKCkuICBEb24ndCBkbyBhbnl0aGluZyBmb3Igbm93ICh3ZSdsbCBiZSBiYWNrIGhlcmUKIAkgICB3aGVuIF9QeUdJTFN0YXRlX0luaXQgaXMgY2FsbGVkKS4gKi8KLQlpZiAoIWF1dG9UTFNrZXkpIAorCWlmICghYXV0b1RMU2tleSkKIAkJcmV0dXJuOwotCQorCiAJLyogU3RpY2sgdGhlIHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UuCiAKIAkgICBUaGUgb25seSBzaXR1YXRpb24gd2hlcmUgeW91IGNhbiBsZWdpdGltYXRlbHkgaGF2ZSBtb3JlIHRoYW4gb25lCiAJICAgdGhyZWFkIHN0YXRlIGZvciBhbiBPUyBsZXZlbCB0aHJlYWQgaXMgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKIAkgICBpbnRlcnByZXRlcnMsIHdoZW46Ci0JICAgICAgIAorCiAJICAgICAgIGEpIFlvdSBzaG91bGRuJ3QgcmVhbGx5IGJlIHVzaW5nIHRoZSBQeUdJTFN0YXRlXyBBUElzIGFueXdheSwKIAkgICAgICAgICAgYW5kOgogCmRpZmYgLS1naXQgYS9QeXRob24vcHlzdHJ0b2QuYyBiL1B5dGhvbi9weXN0cnRvZC5jCmluZGV4IGUxYzg0ZWEuLjZjMTliNDUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0cnRvZC5jCisrKyBiL1B5dGhvbi9weXN0cnRvZC5jCkBAIC05MCw2ICs5MCwxMyBAQAogCQkJCXArKzsKIAkJCWVuZCA9IHA7CiAJCX0KKwkJZWxzZSBpZiAoc3RybmNtcChwLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkKKwkJeworCQkJLyogUHl0aG9uIGJ1ZyAjMTQxNzY5OSAqLworCQkJKmVuZHB0ciA9IChjaGFyKilucHRyOworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gdmFsOworCQl9CiAJCS8qIEZvciB0aGUgb3RoZXIgY2FzZXMsIHdlIG5lZWQgbm90IGNvbnZlcnQgdGhlIGRlY2ltYWwgcG9pbnQgKi8KIAl9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCAyZGJjZjc1Li41NTVjMzlkIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC0xNyw3ICsxNyw5IEBACiAjaW5jbHVkZSAiZXZhbC5oIgogI2luY2x1ZGUgIm1hcnNoYWwuaCIKIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKICNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgogCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAjaW5jbHVkZSA8bG9jYWxlLmg+CkBAIC03MzgsNiArNzQwLDExIEBACiAJCQlwczIgPSBQeVN0cmluZ19Bc1N0cmluZyh3KTsKIAl9CiAJYXJlbmEgPSBQeUFyZW5hX05ldygpOworCWlmIChhcmVuYSA9PSBOVUxMKSB7CisJCVB5X1hERUNSRUYodik7CisJCVB5X1hERUNSRUYodyk7CisJCXJldHVybiAtMTsKKwl9CiAJbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLAogCQkJCSAgIFB5X3NpbmdsZV9pbnB1dCwgcHMxLCBwczIsCiAJCQkJICAgZmxhZ3MsICZlcnJjb2RlLCBhcmVuYSk7CkBAIC0xMDU2LDYgKzEwNjMsMTcgQEAKIAkJCX0KIAkJCVB5RXJyX0ZldGNoKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOwogCQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOworCQkJLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgZXhjZXB0aW9uMiBvciB2MgorCQkJICAgdG8gYmUgTlVMTC4gSG93ZXZlciBQeUVycl9EaXNwbGF5KCkgY2FuJ3QKKwkJCSAgIHRvbGVyYXRlIE5VTExzLCBzbyBqdXN0IGJlIHNhZmUuICovCisJCQlpZiAoZXhjZXB0aW9uMiA9PSBOVUxMKSB7CisJCQkJZXhjZXB0aW9uMiA9IFB5X05vbmU7CisJCQkJUHlfSU5DUkVGKGV4Y2VwdGlvbjIpOworCQkJfQorCQkJaWYgKHYyID09IE5VTEwpIHsKKwkJCQl2MiA9IFB5X05vbmU7CisJCQkJUHlfSU5DUkVGKHYyKTsKKwkJCX0KIAkJCWlmIChQeV9GbHVzaExpbmUoKSkKIAkJCQlQeUVycl9DbGVhcigpOwogCQkJZmZsdXNoKHN0ZG91dCk7CkBAIC0xMDYzLDggKzEwODEsOCBAQAogCQkJUHlFcnJfRGlzcGxheShleGNlcHRpb24yLCB2MiwgdGIyKTsKIAkJCVB5U3lzX1dyaXRlU3RkZXJyKCJcbk9yaWdpbmFsIGV4Y2VwdGlvbiB3YXM6XG4iKTsKIAkJCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7Ci0JCQlQeV9YREVDUkVGKGV4Y2VwdGlvbjIpOwotCQkJUHlfWERFQ1JFRih2Mik7CisJCQlQeV9ERUNSRUYoZXhjZXB0aW9uMik7CisJCQlQeV9ERUNSRUYodjIpOwogCQkJUHlfWERFQ1JFRih0YjIpOwogCQl9CiAJCVB5X1hERUNSRUYocmVzdWx0KTsKQEAgLTExODQsOSArMTIwMiwxMiBAQAogCQkgIFB5T2JqZWN0ICpsb2NhbHMsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7CiAJUHlPYmplY3QgKnJldCA9IE5VTEw7CisJbW9kX3R5IG1vZDsKIAlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JbW9kX3R5IG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCAiPHN0cmluZz4iLCBzdGFydCwgZmxhZ3MsCi0JCQkJCSAgICBhcmVuYSk7CisJaWYgKGFyZW5hID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCQorCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCAiPHN0cmluZz4iLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKIAlpZiAobW9kICE9IE5VTEwpCiAJCXJldCA9IHJ1bl9tb2QobW9kLCAiPHN0cmluZz4iLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7CiAJUHlBcmVuYV9GcmVlKGFyZW5hKTsKQEAgLTExOTgsOSArMTIxOSwxMyBAQAogCQkgIFB5T2JqZWN0ICpsb2NhbHMsIGludCBjbG9zZWl0LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewogCVB5T2JqZWN0ICpyZXQ7CisJbW9kX3R5IG1vZDsKIAlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JbW9kX3R5IG1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBmaWxlbmFtZSwgc3RhcnQsIDAsIDAsCi0JCQkJCSAgZmxhZ3MsIE5VTEwsIGFyZW5hKTsKKwlpZiAoYXJlbmEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJCisJbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCwgMCwKKwkJCQkgICBmbGFncywgTlVMTCwgYXJlbmEpOwogCWlmIChtb2QgPT0gTlVMTCkgewogCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTEyNjMsOCArMTI4OCwxMiBAQAogCQkgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewogCVB5Q29kZU9iamVjdCAqY287CisJbW9kX3R5IG1vZDsKIAlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JbW9kX3R5IG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CisJaWYgKGFyZW5hID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKIAlpZiAobW9kID09IE5VTEwpIHsKIAkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMjgzLDggKzEzMTIsMTIgQEAKIFB5X1N5bXRhYmxlU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKIHsKIAlzdHJ1Y3Qgc3ltdGFibGUgKnN0OworCW1vZF90eSBtb2Q7CiAJUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCW1vZF90eSBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCBOVUxMLCBhcmVuYSk7CisJaWYgKGFyZW5hID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgTlVMTCwgYXJlbmEpOwogCWlmIChtb2QgPT0gTlVMTCkgewogCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9zdHJ0b2QuYyBiL1B5dGhvbi9zdHJ0b2QuYwppbmRleCA3OTExYTk0Li41YzA4NGE0IDEwMDY0NAotLS0gYS9QeXRob24vc3RydG9kLmMKKysrIGIvUHl0aG9uL3N0cnRvZC5jCkBAIC01NCw3ICs1NCw3IEBACiAKIGV4dGVybglkb3VibGUJYXRvZihjb25zdCBjaGFyICopOwkJLyogT25seSBjYWxsZWQgd2hlbiByZXN1bHQga25vd24gdG8gYmUgb2sgKi8KIAotI2lmbmRlZiBET05UX0hBVkVfRVJSTk9fSAorI2lmZGVmIEhBVkVfRVJSTk9fSAogI2luY2x1ZGUgPGVycm5vLmg+CiAjZW5kaWYKIGV4dGVybglpbnQJZXJybm87CmRpZmYgLS1naXQgYS9QeXRob24vc3ltdGFibGUuYyBiL1B5dGhvbi9zeW10YWJsZS5jCmluZGV4IDFkYzJhMmUuLjQzOWEyNDMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeW10YWJsZS5jCisrKyBiL1B5dGhvbi9zeW10YWJsZS5jCkBAIC0yMjEsOCArMjIxLDEyIEBACiAJCXJldHVybiBzdDsKIAlzdC0+c3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKIAlzdC0+c3RfZnV0dXJlID0gZnV0dXJlOwotCXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBHRVRfSURFTlRJRklFUih0b3ApLCBNb2R1bGVCbG9jaywgCi0JCQkgICAgICh2b2lkICopbW9kLCAwKTsKKwlpZiAoIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBHRVRfSURFTlRJRklFUih0b3ApLCBNb2R1bGVCbG9jaywgCisJCQkgICAgICh2b2lkICopbW9kLCAwKSkgeworCQlQeVN5bXRhYmxlX0ZyZWUoc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAlzdC0+c3RfdG9wID0gc3QtPnN0X2N1cjsKIAlzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgPSBPUFRfVE9QTEVWRUw7CiAJLyogQW55IG90aGVyIHRvcC1sZXZlbCBpbml0aWFsaXphdGlvbj8gKi8KQEAgLTUyNSw2ICs1MjksOCBAQAogCQlpID0gUHlJbnRfQVNfTE9ORyh3KTsKIAkJZmxhZ3MgfD0gKGkgPDwgU0NPUEVfT0ZGKTsKIAkJdSA9IFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKKwkJaWYgKCF1KQorCQkJcmV0dXJuIDA7CiAJCWlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCB1KSA8IDApIHsKIAkJCVB5X0RFQ1JFRih1KTsKIAkJCXJldHVybiAwOwpAQCAtNzIzLDExICs3MjksMTMgQEAKIHsKIAlQeV9zc2l6ZV90IGVuZDsKIAotCVB5X0RFQ1JFRihzdC0+c3RfY3VyKTsKKwlQeV9DTEVBUihzdC0+c3RfY3VyKTsKIAllbmQgPSBQeUxpc3RfR0VUX1NJWkUoc3QtPnN0X3N0YWNrKSAtIDE7CiAJaWYgKGVuZCA+PSAwKSB7CiAJCXN0LT5zdF9jdXIgPSAoUHlTVEVudHJ5T2JqZWN0ICopUHlMaXN0X0dFVF9JVEVNKHN0LT5zdF9zdGFjaywgCiAJCQkJCQkJCWVuZCk7CisJCWlmIChzdC0+c3RfY3VyID09IE5VTEwpCisJCQlyZXR1cm4gMDsKIAkJUHlfSU5DUkVGKHN0LT5zdF9jdXIpOwogCQlpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKHN0LT5zdF9zdGFjaywgZW5kKSA8IDApCiAJCQlyZXR1cm4gMDsKQEAgLTc0OSw2ICs3NTcsOCBAQAogCQlQeV9ERUNSRUYoc3QtPnN0X2N1cik7CiAJfQogCXN0LT5zdF9jdXIgPSBQeVNURW50cnlfTmV3KHN0LCBuYW1lLCBibG9jaywgYXN0LCBsaW5lbm8pOworCWlmIChzdC0+c3RfY3VyID09IE5VTEwpCisJCXJldHVybiAwOwogCWlmIChuYW1lID09IEdFVF9JREVOVElGSUVSKHRvcCkpCiAJCXN0LT5zdF9nbG9iYWwgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKIAlpZiAocHJldikgewpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IGZlNDdmZDEuLmEyZGY2NjkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTY1Niw2ICs2NTYsMjEgQEAKIAlyZXR1cm4gKFB5T2JqZWN0KilmOwogfQogCitQeURvY19TVFJWQVIoY3VycmVudF9mcmFtZXNfZG9jLAorIl9jdXJyZW50X2ZyYW1lcygpIC0+IGRpY3Rpb25hcnlcblwKK1xuXAorUmV0dXJuIGEgZGljdGlvbmFyeSBtYXBwaW5nIGVhY2ggY3VycmVudCB0aHJlYWQgVCdzIHRocmVhZCBpZCB0byBUJ3NcblwKK2N1cnJlbnQgc3RhY2sgZnJhbWUuXG5cCitcblwKK1RoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgZm9yIHNwZWNpYWxpemVkIHB1cnBvc2VzIG9ubHkuIgorKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3N5c19jdXJyZW50X2ZyYW1lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKK3sKKwlyZXR1cm4gX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXMoKTsKK30KKwogUHlEb2NfU1RSVkFSKGNhbGxfdHJhY2luZ19kb2MsCiAiY2FsbF90cmFjaW5nKGZ1bmMsIGFyZ3MpIC0+IG9iamVjdFxuXAogXG5cCkBAIC03MTgsNiArNzMzLDggQEAKIAkvKiBNaWdodCBhcyB3ZWxsIGtlZXAgdGhpcyBpbiBhbHBoYWJldGljIG9yZGVyICovCiAJeyJjYWxsc3RhdHMiLCAoUHlDRnVuY3Rpb24pUHlFdmFsX0dldENhbGxTdGF0cywgTUVUSF9OT0FSR1MsCiAJIGNhbGxzdGF0c19kb2N9LAorCXsiX2N1cnJlbnRfZnJhbWVzIiwgc3lzX2N1cnJlbnRfZnJhbWVzLCBNRVRIX05PQVJHUywKKwkgY3VycmVudF9mcmFtZXNfZG9jfSwKIAl7ImRpc3BsYXlob29rIiwJc3lzX2Rpc3BsYXlob29rLCBNRVRIX08sIGRpc3BsYXlob29rX2RvY30sCiAJeyJleGNfaW5mbyIsCXN5c19leGNfaW5mbywgTUVUSF9OT0FSR1MsIGV4Y19pbmZvX2RvY30sCiAJeyJleGNfY2xlYXIiLAlzeXNfZXhjX2NsZWFyLCBNRVRIX05PQVJHUywgZXhjX2NsZWFyX2RvY30sCkBAIC0xMTE2LDQxICsxMTMzLDM4IEBACiAjZWxpZiBQWV9SRUxFQVNFX0xFVkVMID09IFBZX1JFTEVBU0VfTEVWRUxfRklOQUwKIAlzID0gImZpbmFsIjsKICNlbmRpZgotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJ2ZXJzaW9uX2luZm8iLAotCQkJICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiaWlpc2kiLCBQWV9NQUpPUl9WRVJTSU9OLAorCisjZGVmaW5lIFNFVF9TWVNfRlJPTV9TVFJJTkcoa2V5LCB2YWx1ZSkJCQlcCisJdiA9IHZhbHVlOwkJCQkJXAorCWlmICh2ICE9IE5VTEwpCQkJCQlcCisJCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsIGtleSwgdik7CVwKKwlQeV9YREVDUkVGKHYpCisKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uX2luZm8iLAorCQkJICAgIFB5X0J1aWxkVmFsdWUoImlpaXNpIiwgUFlfTUFKT1JfVkVSU0lPTiwKIAkJCQkJICAgICAgIFBZX01JTk9SX1ZFUlNJT04sCiAJCQkJCSAgICAgICBQWV9NSUNST19WRVJTSU9OLCBzLAogCQkJCQkgICAgICAgUFlfUkVMRUFTRV9TRVJJQUwpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJhcGlfdmVyc2lvbiIsCi0JCQkgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhQWVRIT05fQVBJX1ZFUlNJT04pKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJjb3B5cmlnaHQiLAotCQkJICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRDb3B5cmlnaHQoKSkpOwotCVB5X1hERUNSRUYodik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInBsYXRmb3JtIiwKLQkJCSAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UGxhdGZvcm0oKSkpOwotCVB5X1hERUNSRUYodik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgImV4ZWN1dGFibGUiLAotCQkJICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKSkpOwotCVB5X1hERUNSRUYodik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInByZWZpeCIsCi0JCQkgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFByZWZpeCgpKSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiZXhlY19wcmVmaXgiLAotCQkgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRFeGVjUHJlZml4KCkpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJtYXhpbnQiLAotCQkJICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoUHlJbnRfR2V0TWF4KCkpKTsKLQlQeV9YREVDUkVGKHYpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoImFwaV92ZXJzaW9uIiwKKwkJCSAgICBQeUludF9Gcm9tTG9uZyhQWVRIT05fQVBJX1ZFUlNJT04pKTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJjb3B5cmlnaHQiLAorCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0Q29weXJpZ2h0KCkpKTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJwbGF0Zm9ybSIsCisJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQbGF0Zm9ybSgpKSk7CisJU0VUX1NZU19GUk9NX1NUUklORygiZXhlY3V0YWJsZSIsCisJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKSkpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoInByZWZpeCIsCisJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcmVmaXgoKSkpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWNfcHJlZml4IiwKKwkJICAgCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldEV4ZWNQcmVmaXgoKSkpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heGludCIsCisJCQkgICAgUHlJbnRfRnJvbUxvbmcoUHlJbnRfR2V0TWF4KCkpKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIm1heHVuaWNvZGUiLAotCQkJICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoUHlVbmljb2RlX0dldE1heCgpKSk7Ci0JUHlfWERFQ1JFRih2KTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJtYXh1bmljb2RlIiwKKwkJCSAgICBQeUludF9Gcm9tTG9uZyhQeVVuaWNvZGVfR2V0TWF4KCkpKTsKICNlbmRpZgotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJidWlsdGluX21vZHVsZV9uYW1lcyIsCi0JCSAgIHYgPSBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKCkpOwotCVB5X1hERUNSRUYodik7CisJU0VUX1NZU19GUk9NX1NUUklORygiYnVpbHRpbl9tb2R1bGVfbmFtZXMiLAorCQkJICAgIGxpc3RfYnVpbHRpbl9tb2R1bGVfbmFtZXMoKSk7CiAJewogCQkvKiBBc3N1bWVzIHRoYXQgbG9uZ3MgYXJlIGF0IGxlYXN0IDIgYnl0ZXMgbG9uZy4KIAkJICAgU2hvdWxkIGJlIHNhZmUhICovCkBAIC0xMTYyLDE4ICsxMTc2LDE2IEBACiAJCQl2YWx1ZSA9ICJiaWciOwogCQllbHNlCiAJCQl2YWx1ZSA9ICJsaXR0bGUiOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiYnl0ZW9yZGVyIiwKLQkJCQkgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKSk7Ci0JCVB5X1hERUNSRUYodik7CisJCVNFVF9TWVNfRlJPTV9TVFJJTkcoImJ5dGVvcmRlciIsCisJCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsdWUpKTsKIAl9CiAjaWZkZWYgTVNfQ09SRURMTAotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJkbGxoYW5kbGUiLAotCQkJICAgICB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKFB5V2luX0RMTGhNb2R1bGUpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJ3aW52ZXIiLAotCQkJICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeVdpbl9ETExWZXJzaW9uU3RyaW5nKSk7Ci0JUHlfWERFQ1JFRih2KTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJkbGxoYW5kbGUiLAorCQkJICAgIFB5TG9uZ19Gcm9tVm9pZFB0cihQeVdpbl9ETExoTW9kdWxlKSk7CisJU0VUX1NZU19GUk9NX1NUUklORygid2ludmVyIiwKKwkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpKTsKICNlbmRpZgorI3VuZGVmIFNFVF9TWVNfRlJPTV9TVFJJTkcKIAlpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkgewogCQl3YXJub3B0aW9ucyA9IFB5TGlzdF9OZXcoMCk7CiAJfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZC5jIGIvUHl0aG9uL3RocmVhZC5jCmluZGV4IGM5MzU2ZGMuLjNhMmM3YWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWQuYworKysgYi9QeXRob24vdGhyZWFkLmMKQEAgLTk1LDYgKzk1LDExIEBACiAJUHlUaHJlYWRfX2luaXRfdGhyZWFkKCk7CiB9CiAKKy8qIFN1cHBvcnQgZm9yIHJ1bnRpbWUgdGhyZWFkIHN0YWNrIHNpemUgdHVuaW5nLgorICAgQSB2YWx1ZSBvZiAwIG1lYW5zIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgc3RhY2sgc2l6ZQorICAgb3IgdGhlIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBUSFJFQURfU1RBQ0tfU0laRSBtYWNyby4gKi8KK3N0YXRpYyBzaXplX3QgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7CisKICNpZmRlZiBTR0lfVEhSRUFEUwogI2luY2x1ZGUgInRocmVhZF9zZ2kuaCIKICNlbmRpZgpAQCAtMTUwLDYgKzE1NSwyOCBAQAogI2VuZGlmCiAqLwogCisvKiByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIHN0YWNrIHNpemUgKi8KK3NpemVfdAorUHlUaHJlYWRfZ2V0X3N0YWNrc2l6ZSh2b2lkKQoreworCXJldHVybiBfcHl0aHJlYWRfc3RhY2tzaXplOworfQorCisvKiBPbmx5IHBsYXRmb3JtcyBkZWZpbmluZyBhIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKCkgbWFjcm8KKyAgIGluIHRocmVhZF88cGxhdGZvcm0+Lmggc3VwcG9ydCBjaGFuZ2luZyB0aGUgc3RhY2sgc2l6ZS4KKyAgIFJldHVybiAwIGlmIHN0YWNrIHNpemUgaXMgdmFsaWQsCisgICAgICAgICAgLTEgaWYgc3RhY2sgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkLAorICAgICAgICAgIC0yIGlmIHNldHRpbmcgc3RhY2sgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworaW50CitQeVRocmVhZF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQoreworI2lmIGRlZmluZWQoVEhSRUFEX1NFVF9TVEFDS1NJWkUpCisJcmV0dXJuIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHNpemUpOworI2Vsc2UKKwlyZXR1cm4gLTI7CisjZW5kaWYKK30KKwogI2lmbmRlZiBQeV9IQVZFX05BVElWRV9UTFMKIC8qIElmIHRoZSBwbGF0Zm9ybSBoYXMgbm90IHN1cHBsaWVkIGEgcGxhdGZvcm0gc3BlY2lmaWMKICAgIFRMUyBpbXBsZW1lbnRhdGlvbiwgcHJvdmlkZSBvdXIgb3duLgpAQCAtMjQwLDYgKzI2Nyw4IEBACiAJc3RydWN0IGtleSAqcDsKIAlsb25nIGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwogCisJaWYgKCFrZXltdXRleCkKKwkJcmV0dXJuIE5VTEw7CiAJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKIAlmb3IgKHAgPSBrZXloZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CiAJCWlmIChwLT5pZCA9PSBpZCAmJiBwLT5rZXkgPT0ga2V5KQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9udC5oIGIvUHl0aG9uL3RocmVhZF9udC5oCmluZGV4IDBiN2U4NGUuLjY3ZjVlZDUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfbnQuaAorKysgYi9QeXRob24vdGhyZWFkX250LmgKQEAgLTUsNyArNSw5IEBACiAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgSEFWRV9QUk9DRVNTX0gKICNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgTlJNVVRFWCB7CiAJTE9ORyAgIG93bmVkIDsKQEAgLTE5NCw3ICsxOTYsNyBAQAogCWlmIChvYmouZG9uZSA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlydiA9IF9iZWdpbnRocmVhZChib290c3RyYXAsIDAsICZvYmopOyAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCisJcnYgPSBfYmVnaW50aHJlYWQoYm9vdHN0cmFwLCBfcHl0aHJlYWRfc3RhY2tzaXplLCAmb2JqKTsKIAlpZiAocnYgPT0gKFB5X3VpbnRwdHJfdCktMSkgewogCQkvKiBJJ3ZlIHNlZW4gZXJybm8gPT0gRUFHQUlOIGhlcmUsIHdoaWNoIG1lYW5zICJ0aGVyZSBhcmUKIAkJICogdG9vIG1hbnkgdGhyZWFkcyIuCkBAIC0zMzMsMyArMzM1LDMwIEBACiAJaWYgKCEoYUxvY2sgJiYgTGVhdmVOb25SZWN1cnNpdmVNdXRleCgoUE5STVVURVgpIGFMb2NrKSkpCiAJCWRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaywgR2V0TGFzdEVycm9yKCkpKTsKIH0KKworLyogbWluaW11bS9tYXhpbXVtIHRocmVhZCBzdGFjayBzaXplcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgVEhSRUFEX01JTl9TVEFDS1NJWkUJMHg4MDAwCQkvKiAzMmtCICovCisjZGVmaW5lIFRIUkVBRF9NQVhfU1RBQ0tTSVpFCTB4MTAwMDAwMDAJLyogMjU2TUIgKi8KKworLyogc2V0IHRoZSB0aHJlYWQgc3RhY2sgc2l6ZS4KKyAqIFJldHVybiAwIGlmIHNpemUgaXMgdmFsaWQsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorX3B5dGhyZWFkX250X3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCit7CisJLyogc2V0IHRvIGRlZmF1bHQgKi8KKwlpZiAoc2l6ZSA9PSAwKSB7CisJCV9weXRocmVhZF9zdGFja3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB2YWxpZCByYW5nZT8gKi8KKwlpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKKwkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KQlfcHl0aHJlYWRfbnRfc2V0X3N0YWNrc2l6ZSh4KQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9vczIuaCBiL1B5dGhvbi90aHJlYWRfb3MyLmgKaW5kZXggODZlOTFjMS4uMTJlZWVkNSAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9vczIuaAorKysgYi9QeXRob24vdGhyZWFkX29zMi5oCkBAIC0xNCwxMCArMTQsMTMgQEAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKTsKICNlbmRpZgogCisvKiBkZWZhdWx0IHRocmVhZCBzdGFjayBzaXplIG9mIDY0a0IgKi8KICNpZiAhZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKICNkZWZpbmUJVEhSRUFEX1NUQUNLX1NJWkUJMHgxMDAwMAogI2VuZGlmCiAKKyNkZWZpbmUgT1MyX1NUQUNLU0laRSh4KQkoeCA/IHggOiBUSFJFQURfU1RBQ0tfU0laRSkKKwogLyoKICAqIEluaXRpYWxpemF0aW9uIG9mIHRoZSBDIHBhY2thZ2UsIHNob3VsZCBub3QgYmUgbmVlZGVkLgogICovCkBAIC0zMiwxOCArMzUsMTggQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgYVRocmVhZDsKLQlpbnQgc3VjY2VzcyA9IDA7CisJaW50IHRocmVhZF9pZDsKIAotCWFUaHJlYWQgPSBfYmVnaW50aHJlYWQoZnVuYywgTlVMTCwgVEhSRUFEX1NUQUNLX1NJWkUsIGFyZyk7CisJdGhyZWFkX2lkID0gX2JlZ2ludGhyZWFkKGZ1bmMsCisJCQkJTlVMTCwKKwkJCQlPUzJfU1RBQ0tTSVpFKF9weXRocmVhZF9zdGFja3NpemUpLAorCQkJCWFyZyk7CiAKLQlpZiAoYVRocmVhZCA9PSAtMSkgewotCQlzdWNjZXNzID0gLTE7Ci0JCWZwcmludGYoc3RkZXJyLCAiYVRocmVhZCBmYWlsZWQgPT0gJWQiLCBhVGhyZWFkKTsKKwlpZiAodGhyZWFkX2lkID09IC0xKSB7CiAJCWRwcmludGYoKCJfYmVnaW50aHJlYWQgZmFpbGVkLiByZXR1cm4gJWxkXG4iLCBlcnJubykpOwogCX0KIAotCXJldHVybiBzdWNjZXNzOworCXJldHVybiB0aHJlYWRfaWQ7CiB9CiAKIGxvbmcKQEAgLTI3NSwzICsyNzgsMzAgQEAKIAlEb3NFeGl0Q3JpdFNlYygpOwogI2VuZGlmCiB9CisKKy8qIG1pbmltdW0vbWF4aW11bSB0aHJlYWQgc3RhY2sgc2l6ZXMgc3VwcG9ydGVkICovCisjZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFCTB4ODAwMAkJLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRQkweDIwMDAwMDAJLyogMzJNQiAqLworCisvKiBzZXQgdGhlIHRocmVhZCBzdGFjayBzaXplLgorICogUmV0dXJuIDAgaWYgc2l6ZSBpcyB2YWxpZCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CitfcHl0aHJlYWRfb3MyX3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCit7CisJLyogc2V0IHRvIGRlZmF1bHQgKi8KKwlpZiAoc2l6ZSA9PSAwKSB7CisJCV9weXRocmVhZF9zdGFja3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB2YWxpZCByYW5nZT8gKi8KKwlpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKKwkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KQlfcHl0aHJlYWRfb3MyX3NldF9zdGFja3NpemUoeCkKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKaW5kZXggYzI5YTYxYy4uNjBkMmZiMiAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKQEAgLTEyLDYgKzEyLDIwIEBACiAjZW5kaWYKICNpbmNsdWRlIDxzaWduYWwuaD4KIAorLyogVGhlIFBPU0lYIHNwZWMgcmVxdWlyZXMgdGhhdCB1c2Ugb2YgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZQorICAgYmUgY29uZGl0aW9uYWwgb24gX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSBiZWluZyBkZWZpbmVkLiAqLworI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyNpZm5kZWYgVEhSRUFEX1NUQUNLX1NJWkUKKyNkZWZpbmUJVEhSRUFEX1NUQUNLX1NJWkUJMAkvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCisjZW5kaWYKKy8qIGZvciBzYWZldHksIGVuc3VyZSBhIHZpYWJsZSBtaW5pbXVtIHN0YWNrc2l6ZSAqLworI2RlZmluZQlUSFJFQURfU1RBQ0tfTUlOCTB4ODAwMAkvKiAzMmtCICovCisjZWxzZSAgLyogIV9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyNpZmRlZiBUSFJFQURfU1RBQ0tfU0laRQorI2Vycm9yICJUSFJFQURfU1RBQ0tfU0laRSBkZWZpbmVkIGJ1dCBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFIHVuZGVmaW5lZCIKKyNlbmRpZgorI2VuZGlmCisKIC8qIFRoZSBQT1NJWCBzcGVjIHNheXMgdGhhdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydGluZyB0aGUgc2VtXyoKICAgIGZhbWlseSBvZiBmdW5jdGlvbnMgbXVzdCBpbmRpY2F0ZSB0aGlzIGJ5IGRlZmluaW5nCiAgICBfUE9TSVhfU0VNQVBIT1JFUy4gKi8gICAKQEAgLTEzOCwxNSArMTUyLDI3IEBACiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCiAJcHRocmVhZF9hdHRyX3QgYXR0cnM7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQorCXNpemVfdAl0c3M7CisjZW5kaWYKKwogCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwogCWlmICghaW5pdGlhbGl6ZWQpCiAJCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKSB8fCBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLQlwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpOworCWlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpICE9IDApCisJCXJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFRIUkVBRF9TVEFDS19TSVpFCi0JcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIFRIUkVBRF9TVEFDS19TSVpFKTsKKyNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQorCXRzcyA9IChfcHl0aHJlYWRfc3RhY2tzaXplICE9IDApID8gX3B5dGhyZWFkX3N0YWNrc2l6ZQorCQkJCQkgOiBUSFJFQURfU1RBQ0tfU0laRTsKKwlpZiAodHNzICE9IDApIHsKKwkJaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCB0c3MpICE9IDApIHsKKwkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CiAjZW5kaWYKICNpZiBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKICAgICAgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOwpAQCAtNDYwLDMgKzQ4Niw0OCBAQAogfQogCiAjZW5kaWYgLyogVVNFX1NFTUFQSE9SRVMgKi8KKworLyogc2V0IHRoZSB0aHJlYWQgc3RhY2sgc2l6ZS4KKyAqIFJldHVybiAwIGlmIHNpemUgaXMgdmFsaWQsIC0xIGlmIHNpemUgaXMgaW52YWxpZCwKKyAqIC0yIGlmIHNldHRpbmcgc3RhY2sgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50CitfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQoreworI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCisJcHRocmVhZF9hdHRyX3QgYXR0cnM7CisJc2l6ZV90IHRzc19taW47CisJaW50IHJjID0gMDsKKyNlbmRpZgorCisJLyogc2V0IHRvIGRlZmF1bHQgKi8KKwlpZiAoc2l6ZSA9PSAwKSB7CisJCV9weXRocmVhZF9zdGFja3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQorI2lmIGRlZmluZWQoUFRIUkVBRF9TVEFDS19NSU4pCisJdHNzX21pbiA9IFBUSFJFQURfU1RBQ0tfTUlOID4gVEhSRUFEX1NUQUNLX01JTiA/IFBUSFJFQURfU1RBQ0tfTUlOCisJCQkJCQkgICAgICAgOiBUSFJFQURfU1RBQ0tfTUlOOworI2Vsc2UKKwl0c3NfbWluID0gVEhSRUFEX1NUQUNLX01JTjsKKyNlbmRpZgorCWlmIChzaXplID49IHRzc19taW4pIHsKKwkJLyogdmFsaWRhdGUgc3RhY2sgc2l6ZSBieSBzZXR0aW5nIHRocmVhZCBhdHRyaWJ1dGUgKi8KKwkJaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZhdHRycykgPT0gMCkgeworCQkJcmMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRycywgc2l6ZSk7CisJCQlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOworCQkJaWYgKHJjID09IDApIHsKKwkJCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7CisjZWxzZQorCXJldHVybiAtMjsKKyNlbmRpZgorfQorCisjZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpCV9weXRocmVhZF9wdGhyZWFkX3NldF9zdGFja3NpemUoeCkKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBiM2Y3MmU3Li43MmExMGNkIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0yMjYsMTMgKzIyNiwxMyBAQAogVW5zdXBwb3J0ZWQgc3lzdGVtcwogLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1YWFggVGhpcyBzZWN0aW9uIGlzIG91dCBvZiBkYXRlIQotCi1BIG51bWJlciBvZiBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMi4zIGFueW1vcmUuIFNvbWUKLXN1cHBvcnQgY29kZSBpcyBzdGlsbCBwcmVzZW50LCBidXQgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAyLjQuIAorQSBudW1iZXIgb2YgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIuNSBhbnltb3JlLiBTb21lCitzdXBwb3J0IGNvZGUgaXMgc3RpbGwgcHJlc2VudCwgYnV0IHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMi42LiAKIElmIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSBjdXJyZW50IFB5dGhvbiB2ZXJzaW9ucyBvbiB0aGVzZSBzeXN0ZW1zLAogcGxlYXNlIHNlbmQgYSBtZXNzYWdlIHRvIHB5dGhvbi1kZXZAcHl0aG9uLm9yZyBpbmRpY2F0aW5nIHRoYXQgeW91Ci12b2x1bnRlZXIgdG8gc3VwcG9ydCB0aGlzIHN5c3RlbS4KK3ZvbHVudGVlciB0byBzdXBwb3J0IHRoaXMgc3lzdGVtLiBGb3IgYSBtb3JlIGRldGFpbGVkIGRpc2N1c3Npb24gCityZWdhcmRpbmcgbm8tbG9uZ2VyLXN1cHBvcnRlZCBhbmQgcmVzdXBwb3J0aW5nIHBsYXRmb3JtcywgYXMgd2VsbAorYXMgYSBsaXN0IG9mIHBsYXRmb3JtcyB0aGF0IGJlY2FtZSBvciB3aWxsIGJlIHVuc3VwcG9ydGVkLCBzZWUgUEVQIDExLgogCiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGZvbGxvd2luZyBzeXN0ZW1zIGFyZSBub3Qgc3VwcG9ydGVkIGFueQogbG9uZ2VyOgpAQCAtMjQwLDYgKzI0MCw3IEBACiAtIERZTklYCiAtIGRndXgKIC0gTWluaXgKKy0gTmVYVAogLSBJcml4IDQgYW5kIC0td2l0aC1zZ2ktZGwKIC0gTGludXggMQogLSBTeXN0ZW1zIGRlZmluaW5nIF9fZDZfcHRocmVhZF9jcmVhdGUgKGNvbmZpZ3VyZS5pbikKQEAgLTI0Nyw2ICsyNDgsMjUgQEAKICAgb3IgUFlfUFRIUkVBRF9ENyBpbiB0aHJlYWRfcHRocmVhZC5oCiAtIFN5c3RlbXMgdXNpbmcgLS13aXRoLWRsLWRsZAogLSBTeXN0ZW1zIHVzaW5nIC0td2l0aG91dC11bml2ZXJzYWwtbmV3bGluZXMKKy0gTWFjT1MgOQorCitUaGUgZm9sbG93aW5nIHN5c3RlbXMgYXJlIHN0aWxsIHN1cHBvcnRlZCBpbiBQeXRob24gMi41LCBidXQKK3N1cHBvcnQgd2lsbCBiZSBkcm9wcGVkIGluIDIuNjoKKy0gU3lzdGVtcyB1c2luZyAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucworLSBXaW45eCwgV2luTUUKKworV2FybmluZyBvbiBpbnN0YWxsIGluIFdpbmRvd3MgOTggYW5kIFdpbmRvd3MgTWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvbGxvd2luZyBNaWNyb3NvZnQncyBjbG9zaW5nIG9mIEV4dGVuZGVkIFN1cHBvcnQgZm9yCitXaW5kb3dzIDk4L01FIChKdWx5IDExLCAyMDA2KSwgUHl0aG9uIDIuNiB3aWxsIHN0b3AKK3N1cHBvcnRpbmcgdGhlc2UgcGxhdGZvcm1zLiBQeXRob24gZGV2ZWxvcG1lbnQgYW5kCittYWludGFpbmFiaWxpdHkgYmVjb21lcyBlYXNpZXIgKGFuZCBtb3JlIHJlbGlhYmxlKSB3aGVuCitwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlIHRhcmdldGluZyBPU2VzIHdpdGggZmV3IHVzZXJzCithbmQgbm8gZGVkaWNhdGVkIGV4cGVydCBkZXZlbG9wZXJzIGlzIHRha2VuIG91dC4gVGhlCit2ZW5kb3IgYWxzbyB3YXJucyB0aGF0IHRoZSBPUyB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUKKyJjYW4gZXhwb3NlIGN1c3RvbWVycyB0byBzZWN1cml0eSByaXNrcyIgYW5kIHJlY29tbWVuZHMKK3VwZ3JhZGUuCiAKIFBsYXRmb3JtIHNwZWNpZmljIG5vdGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDI2LDE0ICs0NDYsNiBAQAogICAgICAgICB0aHJlYWQgbWF5IGludGVycnVwdCBzeXN0ZW0gY2FsbHMgaW4gb3RoZXJzKS4gVGhlcmVmb3JlLCB0ZXN0X21hdGggYW5kCiAgICAgICAgIHRlc3RzIGludm9sdmluZyB0aHJlYWRzIHdpbGwgZmFpbCB1bnRpbCB0aG9zZSBwcm9ibGVtcyBhcmUgZml4ZWQuCiAKLVN1bk9TIDQueDogV2hlbiB1c2luZyB0aGUgU3VuUHJvIEMgY29tcGlsZXIsIHlvdSBtYXkgd2FudCB0byB1c2UgdGhlCi0gICAgICAgICctWGEnIG9wdGlvbiBpbnN0ZWFkIG9mICctWGMnLCB0byBlbmFibGUgc29tZSBuZWVkZWQgbm9uLUFOU0kKLSAgICAgICAgU3VuaXNtcy4KLSAgICAgICAgVEhJUyBTWVNURU0gSVMgTk8gTE9OR0VSIFNVUFBPUlRFRC4KLQotTmVYVDogICBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuIFN0YXJ0IHdpdGggdGhlIE1hY09TWC9EYXJ3aW4gY29kZSBpZiB5b3UKLSAgICAgICAgd2FudCB0byByZXZpdmUgaXQuCi0KIFFOWDogICAgQ2hyaXMgSGVyYm9ydGggKGNocmlzaEBxbnguY29tKSB3cml0ZXM6CiAgICAgICAgIGNvbmZpZ3VyZSB3b3JrcyBiZXN0IGlmIHlvdSB1c2UgR05VIGJhc2g7IGEgcG9ydCBpcyBhdmFpbGFibGUgb24KICAgICAgICAgZnRwLnFueC5jb20gaW4gL3Vzci9mcmVlLiAgSSB1c2VkIHRoZSBmb2xsb3dpbmcgcHJvY2VzcyB0byBidWlsZCwKZGlmZiAtLWdpdCBhL1JJU0NPUy9weWNvbmZpZy5oIGIvUklTQ09TL3B5Y29uZmlnLmgKaW5kZXggNDVmODdiZS4uOWEzNGQ0MSAxMDA2NDQKLS0tIGEvUklTQ09TL3B5Y29uZmlnLmgKKysrIGIvUklTQ09TL3B5Y29uZmlnLmgKQEAgLTU1Myw2ICs1NTMsOSBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0cGlkIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1dBSVRQSUQKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8Y29uaW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DT05JT19ICisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRiLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX0RCX0gKIApAQCAtNTYyLDE4ICs1NjUsMjcgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRiXzE4NS5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9EQl8xODVfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ESVJFQ1RfSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfRElSRU5UX0gKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfRExGQ05fSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfRkNOVExfSAogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxnZGJtL25kYm0uaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfR0RCTV9OREJNX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8aW8uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfSU9fSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsYW5naW5mby5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9MQU5HSU5GT19ICiAKQEAgLTU5NSwxMiArNjA3LDE4IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1BPTExfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1BST0NFU1NfSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwdGhyZWFkLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1BUSFJFQURfSAogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwdHkuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfUFRZX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9TSUdOQUxfSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvYXVkaW9pby5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfQVVESU9JT19ICiAKQEAgLTYzNCwxMiArNjUyLDE4IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1NZU19USU1FX0gKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1NZU19USU1FU19ICiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfU1lTX1VOX0gKIApAQCAtNjg4LDcgKzcxMiw2IEBACiAKICNkZWZpbmUgRE9OVF9IQVZFX0ZTVEFUIDEKICNkZWZpbmUgRE9OVF9IQVZFX1NUQVQgIDEKLSN1bmRlZiBET05UX0hBVkVfU1lTX1NUQVRfSAogCiAjZGVmaW5lIFBMQVRGT1JNICJyaXNjb3MiCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L01ha2VmaWxlIGIvVG9vbHMvYnVpbGRib3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2MDIzMQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL2J1aWxkYm90L01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorYWxsOglraWxsX3B5dGhvbi5leGUKKwkuL2tpbGxfcHl0aG9uLmV4ZQorCitraWxsX3B5dGhvbi5leGU6CWtpbGxfcHl0aG9uLmMKKwlnY2MgLW8ga2lsbF9weXRob24uZXhlIGtpbGxfcHl0aG9uLmMgLWxwc2FwaQorCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jIGIvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYwppbmRleCBlYmM5YWE0Li4wMjNmZjJkIDEwMDY0NAotLS0gYS9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCisrKyBiL1Rvb2xzL2J1aWxkYm90L2tpbGxfcHl0aG9uLmMKQEAgLTQyLDcgKzQyLDE5IEBACiAKIAkJX3N0cmx3cihwYXRoKTsKIAkJLyogcHJpbnRmKCIlc1xuIiwgcGF0aCk7ICovCi0JCWlmIChzdHJzdHIocGF0aCwgImJ1aWxkXFxwY2J1aWxkXFxweXRob25fZC5leGUiKSAhPSBOVUxMKSB7CisKKwkJLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgYSBidWlsZGJvdCB2ZXJzaW9uIG9mIFB5dGhvbi4KKworCQkgICBPbiBXaW5kb3dzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGEgZGVidWcgYnVpbGQgZnJvbSB0aGUKKwkJICAgUENidWlsZCBkaXJlY3RvcnkuICBidWlsZFxcUENidWlsZFxccHl0aG9uX2QuZXhlCisJCSAgIAorCQkgICBPbiBDeWd3aW4sIHRoZSBwYXRobmFtZSBpcyBzaW1pbGFyIHRvIG90aGVyIFVuaXhlcy4KKwkJICAgVXNlIFxcYnVpbGRcXHB5dGhvbi5leGUgdG8gZW5zdXJlIHdlIGRvbid0IG1hdGNoCisJCSAgIFBDYnVpbGRcXHB5dGhvbi5leGUgd2hpY2ggY291bGQgYmUgYSBub3JtYWwgaW5zdGFuY2UKKwkJICAgb2YgUHl0aG9uIHJ1bm5pbmcgb24gdmFuaWxsYSBXaW5kb3dzLgorCQkqLworCQlpZiAoKHN0cnN0cihwYXRoLCAiYnVpbGRcXHBjYnVpbGRcXHB5dGhvbl9kLmV4ZSIpICE9IE5VTEwpIHx8CisJCSAgICAoc3Ryc3RyKHBhdGgsICJcXGJ1aWxkXFxweXRob24uZXhlIikgIT0gTlVMTCkpIHsKIAkJCXByaW50ZigiVGVybWluYXRpbmcgJXMgKHBpZCAlZClcbiIsIHBhdGgsIHBpZHNbaV0pOwogCQkJaWYgKCFUZXJtaW5hdGVQcm9jZXNzKGhQcm9jZXNzLCAxKSkgewogCQkJCXByaW50ZigiVGVybWluYXRpb24gZmFpbGVkOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaS5weSBiL1Rvb2xzL21zaS9tc2kucHkKaW5kZXggMjU3NjM4MC4uYWViYWI5OCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaS5weQorKysgYi9Ub29scy9tc2kvbXNpLnB5CkBAIC0zNjcsNyArMzY3LDcgQEAKICAgICAgICAgICAgICAgKCJWZXJkYW5hUmVkOSIsICJWZXJkYW5hIiwgOSwgMjU1LCAwKSwKICAgICAgICAgICAgICBdKQogCi0gICAgY29tcGlsZWFyZ3MgPSByIi1XaSBbVEFSR0VURElSXUxpYlxjb21waWxlYWxsLnB5IC1mIC14IGJhZF9jb2Rpbmd8YmFkc3ludGF4fHNpdGUtcGFja2FnZXMgW1RBUkdFVERJUl1MaWIiCisgICAgY29tcGlsZWFyZ3MgPSByJy1XaSAiW1RBUkdFVERJUl1MaWJcY29tcGlsZWFsbC5weSIgLWYgLXggYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlcyAiW1RBUkdFVERJUl1MaWIiJwogICAgICMgU2VlICJDdXN0b21BY3Rpb24gVGFibGUiCiAgICAgYWRkX2RhdGEoZGIsICJDdXN0b21BY3Rpb24iLCBbCiAgICAgICAgICMgbXNpZGJDdXN0b21BY3Rpb25UeXBlRmlyc3RTZXF1ZW5jZSArIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZVRleHREYXRhICsgbXNpZGJDdXN0b21BY3Rpb25UeXBlUHJvcGVydHkKQEAgLTk2Miw2ICs5NjIsMTQgQEAKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIGRsbHMuYXBwZW5kKGYpCiAgICAgICAgIGxpYi5hZGRfZmlsZShmKQorICAgICMgQWRkIHNxbGl0ZQorICAgIGlmIG1zaWxpYi5tc2lfdHlwZT09IkludGVsNjQ7MTAzMyI6CisgICAgICAgIHNxbGl0ZV9hcmNoID0gIi9pYTY0IgorICAgIGVsaWYgbXNpbGliLm1zaV90eXBlPT0ieDY0OzEwMzMiOgorICAgICAgICBzcWxpdGVfYXJjaCA9ICIvYW1kNjQiCisgICAgZWxzZToKKyAgICAgICAgc3FsaXRlX2FyY2ggPSAiIgorICAgIGxpYi5hZGRfZmlsZShzcmNkaXIrIi8iK3NxbGl0ZV9kaXIrc3FsaXRlX2FyY2grIi9zcWxpdGUzLmRsbCIpCiAgICAgaWYgaGF2ZV90Y2w6CiAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzcmNkaXIrIi9QQ0J1aWxkL190a2ludGVyLnB5ZCIpOgogICAgICAgICAgICAgcHJpbnQgIldBUk5JTkc6IE1pc3NpbmcgX3RraW50ZXIucHlkIgpAQCAtOTcyLDE0ICs5ODAsNiBAQAogICAgICAgICAgICAgdGNsZGlyID0gb3MucGF0aC5ub3JtcGF0aChzcmNkaXIrIi8uLi90Y2x0ay9iaW4iKQogICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iMSh0Y2xkaXIsICIqLmRsbCIpOgogICAgICAgICAgICAgICAgIGxpYi5hZGRfZmlsZShmLCBzcmM9b3MucGF0aC5qb2luKHRjbGRpciwgZikpCi0gICAgIyBBZGQgc3FsaXRlCi0gICAgaWYgbXNpbGliLm1zaV90eXBlPT0iSW50ZWw2NDsxMDMzIjoKLSAgICAgICAgc3FsaXRlX2FyY2ggPSAiL2lhNjQiCi0gICAgZWxpZiBtc2lsaWIubXNpX3R5cGU9PSJ4NjQ7MTAzMyI6Ci0gICAgICAgIHNxbGl0ZV9hcmNoID0gIi9hbWQ2NCIKLSAgICBlbHNlOgotICAgICAgICBzcWxpdGVfYXJjaCA9ICIiCi0gICAgbGliLmFkZF9maWxlKHNyY2RpcisiLyIrc3FsaXRlX2RpcitzcWxpdGVfYXJjaCsiL3NxbGl0ZTMuZGxsIikKICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB1bmtub3duIGV4dGVuc2lvbnMKICAgICBmb3IgZiBpbiBnbG9iLmdsb2IxKHNyY2RpcisiL1BDQnVpbGQiLCAiKi5weWQiKToKICAgICAgICAgaWYgZi5lbmRzd2l0aCgiX2QucHlkIik6IGNvbnRpbnVlICMgZGVidWcgdmVyc2lvbgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL3V1aWRzLnB5IGIvVG9vbHMvbXNpL3V1aWRzLnB5CmluZGV4IGNlN2U2MDQuLjMwNjQ5NzUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS91dWlkcy5weQorKysgYi9Ub29scy9tc2kvdXVpZHMucHkKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAnMi41LjEwMyc6ICd7NzNkY2Q5NjYtZmZlYy00MTVmLWJiMzktODM0MmMxZjQ3MDE3fScsICMgMi41YTMKICAgICAnMi41LjExMSc6ICd7Yzc5N2VjZjgtYThlNi00ZmVjLWJiOTktNTI2YjY1ZjI4NjI2fScsICMgMi41YjEKICAgICAnMi41LjExMic6ICd7MzJiZWI3NzQtZjYyNS00MzlkLWI1ODctNzE4NzQ4N2JhZjE1fScsICMgMi41YjIKKyAgICAnMi41LjExMyc6ICd7ODlmMjM5MTgtMTFjZi00ZjA4LWJlMTMtYjliMmU2NDYzZmQ5fScsICMgMi41YjMKICAgICAnMi41LjEyMSc6ICd7OGU5MzIxYmMtNmIyNC00OGEzLThmZDQtYzk1ZjhlNTMxZTVmfScsICMgMi41YzEKICAgICAnMi41LjEyMic6ICd7YTZjZDUwOGQtOTU5OS00NWRhLWE0NDEtY2JmZmE5ZjdlMDcwfScsICMgMi41YzIKICAgICAnMi41LjE1MCc6ICd7MGEyYzU4NTQtNTU3ZS00OGM4LTgzNWEtM2I5ZjA3NGJkY2FhfScsICMgMi41LjAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weSBiL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weQppbmRleCA0ZWQ2MjE5Li42OTIzYjRiIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0FyaXRobWV0aWMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5CkBAIC0yLDcgKzIsNyBAQAogCiBjbGFzcyBTaW1wbGVJbnRlZ2VyQXJpdGhtZXRpYyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQogICAgIHJvdW5kcyA9IDEyMDAwMAogCkBAIC0xNTcsOSArMTU3LDkgQEAKIAogY2xhc3MgU2ltcGxlRmxvYXRBcml0aG1ldGljKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqICgzICsgNSArIDUgKyAzICsgMyArIDMpCi0gICAgcm91bmRzID0gMTAwMDAwCisgICAgcm91bmRzID0gMTIwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMzEyLDcgKzMxMiw3IEBACiAKIGNsYXNzIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQogICAgIHJvdW5kcyA9IDEyMDAwMAogCkBAIC00NjgsOSArNDY4LDkgQEAKIAogY2xhc3MgU2ltcGxlTG9uZ0FyaXRobWV0aWMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1ICogKDMgKyA1ICsgNSArIDMgKyAzICsgMykKLSAgICByb3VuZHMgPSAzMDAwMAorICAgIHJvdW5kcyA9IDYwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNjIzLDkgKzYyMyw5IEBACiAKIGNsYXNzIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqICgzICsgNSArIDUgKyAzICsgMyArIDMpCi0gICAgcm91bmRzID0gNDAwMDAKKyAgICByb3VuZHMgPSA4MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5CmluZGV4IGUyOTUyNDMuLjcyY2NkMGUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9DYWxscy5weQpAQCAtMiw3ICsyLDcgQEAKIAogY2xhc3MgUHl0aG9uRnVuY3Rpb25DYWxscyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDErNCs0KzIpCiAgICAgcm91bmRzID0gNjAwMDAKIApAQCAtMTExLDkgKzExMSw5IEBACiAKIGNsYXNzIEJ1aWx0aW5GdW5jdGlvbkNhbGxzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuNAorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMis1KzUrNSkKLSAgICByb3VuZHMgPSAzMDAwMAorICAgIHJvdW5kcyA9IDYwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMjMyLDkgKzIzMiw5IEBACiAKIGNsYXNzIFB5dGhvbk1ldGhvZENhbGxzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooNiArIDUgKyA0KQotICAgIHJvdW5kcyA9IDIwMDAwCisgICAgcm91bmRzID0gMzAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zNzQsOSArMzc0LDkgQEAKIAogY2xhc3MgUmVjdXJzaW9uKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNQotICAgIHJvdW5kcyA9IDUwMDAwCisgICAgcm91bmRzID0gMTAwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNDA3LDMgKzQwNyw5NiBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCisKKworIyMjIFRlc3QgdG8gbWFrZSBGcmVkcmlrIGhhcHB5Li4uCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRpbWVpdAorICAgIGlmIDA6CisgICAgICAgIHRpbWVpdC5UZXN0Q2xhc3MgPSBQeXRob25GdW5jdGlvbkNhbGxzCisgICAgICAgIHRpbWVpdC5tYWluKFsnLXMnLCAndGVzdCA9IFRlc3RDbGFzcygpOyB0ZXN0LnJvdW5kcyA9IDEwMDAnLAorICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QudGVzdCgpJ10pCisgICAgZWxzZToKKyAgICAgICAgc2V0dXAgPSAiIiJcCitnbG9iYWwgZixmMSxnLGgKKworIyBkZWZpbmUgZnVuY3Rpb25zCitkZWYgZigpOgorICAgIHBhc3MKKworZGVmIGYxKHgpOgorICAgIHBhc3MKKworZGVmIGcoYSxiLGMpOgorICAgIHJldHVybiBhLGIsYworCitkZWYgaChhLGIsYyxkPTEsZT0yLGY9Myk6CisgICAgcmV0dXJuIGQsZSxmCisKK2kgPSAxCisiIiIKKyAgICAgICAgdGVzdCA9ICIiIlwKK2YoKQorZjEoaSkKK2YxKGkpCitmMShpKQorZjEoaSkKK2coaSxpLGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitoKGksaSwzLGksaSkKK2goaSxpLGksMixpLDMpCisKK2YoKQorZjEoaSkKK2YxKGkpCitmMShpKQorZjEoaSkKK2coaSxpLGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitoKGksaSwzLGksaSkKK2goaSxpLGksMixpLDMpCisKK2YoKQorZjEoaSkKK2YxKGkpCitmMShpKQorZjEoaSkKK2coaSxpLGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitoKGksaSwzLGksaSkKK2goaSxpLGksMixpLDMpCisKK2YoKQorZjEoaSkKK2YxKGkpCitmMShpKQorZjEoaSkKK2coaSxpLGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitoKGksaSwzLGksaSkKK2goaSxpLGksMixpLDMpCisKK2YoKQorZjEoaSkKK2YxKGkpCitmMShpKQorZjEoaSkKK2coaSxpLGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitoKGksaSwzLGksaSkKK2goaSxpLGksMixpLDMpCisiIiIKKworICAgICAgICB0aW1laXQubWFpbihbJy1zJywgc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICB0ZXN0XSkKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkgYi9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5CmluZGV4IDEzZTRmOWIuLjY2MDFiZTUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weQpAQCAtMzU4LDcgKzM1OCw3IEBACiAKICAgICAgICAgZXhjZXB0IHNlbGYuSW50ZXJuYWxFcnJvcjoKICAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICBwcmludCAnKiBJbnRlcm5hbCBFcnJvcicKKyAgICAgICAgICAgIHByaW50ICcqIEludGVybmFsIEVycm9yICh1c2UgLS1kZWJ1ZyB0byBkaXNwbGF5IHRoZSB0cmFjZWJhY2spJwogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgICAgICBwcmludAogICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoMjAsIHN5cy5zdGRvdXQpCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkgYi9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkKaW5kZXggMDAwNDViZC4uNTEwNTQ2MSAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Db25zdHJ1Y3RzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weQpAQCAtMiw3ICsyLDcgQEAKIAogY2xhc3MgSWZUaGVuRWxzZShUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMxCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzMCozICMgaGFyZCB0byBzYXkuLi4KICAgICByb3VuZHMgPSAxNTAwMDAKIApAQCAtNDY5LDkgKzQ2OSw5IEBACiAKIGNsYXNzIE5lc3RlZEZvckxvb3BzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAwMCoxMCo1Ci0gICAgcm91bmRzID0gMTUwCisgICAgcm91bmRzID0gMzAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNDk0LDkgKzQ5NCw5IEBACiAKIGNsYXNzIEZvckxvb3BzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDUKLSAgICByb3VuZHMgPSA4MDAwCisgICAgcm91bmRzID0gMTAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0RpY3QucHkgYi9Ub29scy9weWJlbmNoL0RpY3QucHkKaW5kZXggNTRhZWFlNy4uOWNkZDY4MiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9EaWN0LnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvRGljdC5weQpAQCAtMiw5ICsyLDkgQEAKIAogY2xhc3MgRGljdENyZWF0aW9uKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooNSArIDUpCi0gICAgcm91bmRzID0gNjAwMDAKKyAgICByb3VuZHMgPSA4MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTc3LDcgKzc3LDcgQEAKIAogY2xhc3MgRGljdFdpdGhTdHJpbmdLZXlzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooNiArIDYpCiAgICAgcm91bmRzID0gMjAwMDAwCiAKQEAgLTE2Niw5ICsxNjYsOSBAQAogCiBjbGFzcyBEaWN0V2l0aEZsb2F0S2V5cyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQotICAgIHJvdW5kcyA9IDIwMDAwMAorICAgIHJvdW5kcyA9IDE1MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTI1NSw3ICsyNTUsNyBAQAogCiBjbGFzcyBEaWN0V2l0aEludGVnZXJLZXlzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooNiArIDYpCiAgICAgcm91bmRzID0gMjAwMDAwCiAKQEAgLTM0NCwxMyArMzQ0LDE0IEBACiAKIGNsYXNzIFNpbXBsZURpY3RNYW5pcHVsYXRpb24oVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1Kig2ICsgNiArIDYgKyA2KQotICAgIHJvdW5kcyA9IDUwMDAwCisgICAgcm91bmRzID0gMTAwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIAogICAgICAgICBkID0ge30KKyAgICAgICAgaGFzX2tleSA9IGQuaGFzX2tleQogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAKQEAgLTM2OCwxMiArMzY5LDEyIEBACiAgICAgICAgICAgICB4ID0gZFs0XQogICAgICAgICAgICAgeCA9IGRbNV0KIAotICAgICAgICAgICAgZC5oYXNfa2V5KDApCi0gICAgICAgICAgICBkLmhhc19rZXkoMikKLSAgICAgICAgICAgIGQuaGFzX2tleSg0KQotICAgICAgICAgICAgZC5oYXNfa2V5KDYpCi0gICAgICAgICAgICBkLmhhc19rZXkoOCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgxMCkKKyAgICAgICAgICAgIGhhc19rZXkoMCkKKyAgICAgICAgICAgIGhhc19rZXkoMikKKyAgICAgICAgICAgIGhhc19rZXkoNCkKKyAgICAgICAgICAgIGhhc19rZXkoNikKKyAgICAgICAgICAgIGhhc19rZXkoOCkKKyAgICAgICAgICAgIGhhc19rZXkoMTApCiAKICAgICAgICAgICAgIGRlbCBkWzBdCiAgICAgICAgICAgICBkZWwgZFsxXQpAQCAtMzk2LDEyICszOTcsMTIgQEAKICAgICAgICAgICAgIHggPSBkWzRdCiAgICAgICAgICAgICB4ID0gZFs1XQogCi0gICAgICAgICAgICBkLmhhc19rZXkoMCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgyKQotICAgICAgICAgICAgZC5oYXNfa2V5KDQpCi0gICAgICAgICAgICBkLmhhc19rZXkoNikKLSAgICAgICAgICAgIGQuaGFzX2tleSg4KQotICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorICAgICAgICAgICAgaGFzX2tleSgwKQorICAgICAgICAgICAgaGFzX2tleSgyKQorICAgICAgICAgICAgaGFzX2tleSg0KQorICAgICAgICAgICAgaGFzX2tleSg2KQorICAgICAgICAgICAgaGFzX2tleSg4KQorICAgICAgICAgICAgaGFzX2tleSgxMCkKIAogICAgICAgICAgICAgZGVsIGRbMF0KICAgICAgICAgICAgIGRlbCBkWzFdCkBAIC00MjQsMTIgKzQyNSwxMiBAQAogICAgICAgICAgICAgeCA9IGRbNF0KICAgICAgICAgICAgIHggPSBkWzVdCiAKLSAgICAgICAgICAgIGQuaGFzX2tleSgwKQotICAgICAgICAgICAgZC5oYXNfa2V5KDIpCi0gICAgICAgICAgICBkLmhhc19rZXkoNCkKLSAgICAgICAgICAgIGQuaGFzX2tleSg2KQotICAgICAgICAgICAgZC5oYXNfa2V5KDgpCi0gICAgICAgICAgICBkLmhhc19rZXkoMTApCisgICAgICAgICAgICBoYXNfa2V5KDApCisgICAgICAgICAgICBoYXNfa2V5KDIpCisgICAgICAgICAgICBoYXNfa2V5KDQpCisgICAgICAgICAgICBoYXNfa2V5KDYpCisgICAgICAgICAgICBoYXNfa2V5KDgpCisgICAgICAgICAgICBoYXNfa2V5KDEwKQogCiAgICAgICAgICAgICBkZWwgZFswXQogICAgICAgICAgICAgZGVsIGRbMV0KQEAgLTQ1MiwxMiArNDUzLDEyIEBACiAgICAgICAgICAgICB4ID0gZFs0XQogICAgICAgICAgICAgeCA9IGRbNV0KIAotICAgICAgICAgICAgZC5oYXNfa2V5KDApCi0gICAgICAgICAgICBkLmhhc19rZXkoMikKLSAgICAgICAgICAgIGQuaGFzX2tleSg0KQotICAgICAgICAgICAgZC5oYXNfa2V5KDYpCi0gICAgICAgICAgICBkLmhhc19rZXkoOCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgxMCkKKyAgICAgICAgICAgIGhhc19rZXkoMCkKKyAgICAgICAgICAgIGhhc19rZXkoMikKKyAgICAgICAgICAgIGhhc19rZXkoNCkKKyAgICAgICAgICAgIGhhc19rZXkoNikKKyAgICAgICAgICAgIGhhc19rZXkoOCkKKyAgICAgICAgICAgIGhhc19rZXkoMTApCiAKICAgICAgICAgICAgIGRlbCBkWzBdCiAgICAgICAgICAgICBkZWwgZFsxXQpAQCAtNDgwLDEyICs0ODEsMTIgQEAKICAgICAgICAgICAgIHggPSBkWzRdCiAgICAgICAgICAgICB4ID0gZFs1XQogCi0gICAgICAgICAgICBkLmhhc19rZXkoMCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgyKQotICAgICAgICAgICAgZC5oYXNfa2V5KDQpCi0gICAgICAgICAgICBkLmhhc19rZXkoNikKLSAgICAgICAgICAgIGQuaGFzX2tleSg4KQotICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorICAgICAgICAgICAgaGFzX2tleSgwKQorICAgICAgICAgICAgaGFzX2tleSgyKQorICAgICAgICAgICAgaGFzX2tleSg0KQorICAgICAgICAgICAgaGFzX2tleSg2KQorICAgICAgICAgICAgaGFzX2tleSg4KQorICAgICAgICAgICAgaGFzX2tleSgxMCkKIAogICAgICAgICAgICAgZGVsIGRbMF0KICAgICAgICAgICAgIGRlbCBkWzFdCkBAIC00OTcsNiArNDk4LDcgQEAKICAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgogCiAgICAgICAgIGQgPSB7fQorICAgICAgICBoYXNfa2V5ID0gZC5oYXNfa2V5CiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weSBiL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weQppbmRleCA3ZTU1NzA4Li5lZmY2OWM3IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0V4Y2VwdGlvbnMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9FeGNlcHRpb25zLnB5CkBAIC0yLDkgKzIsOSBAQAogCiBjbGFzcyBUcnlSYWlzZUV4Y2VwdChUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKLSAgICBvcGVyYXRpb25zID0gMiArIDMKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHZlcnNpb24gPSAyLjAKKyAgICBvcGVyYXRpb25zID0gMiArIDMgKyAzCisgICAgcm91bmRzID0gODAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zMSw2ICszMSwxOCBAQAogICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCJzb21ldGhpbmciCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJzb21ldGhpbmciKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigic29tZXRoaW5nIikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoInNvbWV0aGluZyIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIApAQCAtNDIsOSArNTQsOSBAQAogCiBjbGFzcyBUcnlFeGNlcHQoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxNSAqIDEwCi0gICAgcm91bmRzID0gMjAwMDAwCisgICAgcm91bmRzID0gMTUwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNjc3LDMgKzY4OSwxMSBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCisKKyMjIyBUZXN0IHRvIG1ha2UgRnJlZHJpayBoYXBweS4uLgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0aW1laXQKKyAgICB0aW1laXQuVGVzdENsYXNzID0gVHJ5UmFpc2VFeGNlcHQKKyAgICB0aW1laXQubWFpbihbJy1zJywgJ3Rlc3QgPSBUZXN0Q2xhc3MoKTsgdGVzdC5yb3VuZHMgPSAxMDAwJywKKyAgICAgICAgICAgICAgICAgJ3Rlc3QudGVzdCgpJ10pCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkgYi9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkKaW5kZXggODVlYjYwNC4uYWZjNzI4YiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9JbXBvcnRzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvSW1wb3J0cy5weQpAQCAtNiw5ICs2LDkgQEAKIAogY2xhc3MgU2Vjb25kSW1wb3J0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDUKLSAgICByb3VuZHMgPSAyMDAwMAorICAgIHJvdW5kcyA9IDQwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNTEsOSArNTEsOSBAQAogCiBjbGFzcyBTZWNvbmRQYWNrYWdlSW1wb3J0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDUKLSAgICByb3VuZHMgPSAyMDAwMAorICAgIHJvdW5kcyA9IDQwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtOTUsOSArOTUsOSBAQAogCiBjbGFzcyBTZWNvbmRTdWJtb2R1bGVJbXBvcnQoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1ICogNQotICAgIHJvdW5kcyA9IDIwMDAwCisgICAgcm91bmRzID0gNDAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weSBiL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CmluZGV4IDliMTkyOWQuLjFkZmM4MmYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CkBAIC0yLDkgKzIsOSBAQAogCiBjbGFzcyBDcmVhdGVJbnN0YW5jZXMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4yCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzICsgNyArIDQKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDgwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9MaXN0cy5weSBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKaW5kZXggNGMxOGU5OS4uNjc3NjBkYiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9MaXN0cy5weQorKysgYi9Ub29scy9weWJlbmNoL0xpc3RzLnB5CkBAIC0yLDIyICsyLDIzIEBACiAKIGNsYXNzIFNpbXBsZUxpc3RNYW5pcHVsYXRpb24oVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KiAoNiArIDYgKyA2KQotICAgIHJvdW5kcyA9IDYwMDAwCisgICAgcm91bmRzID0gMTMwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIAogICAgICAgICBsID0gW10KKyAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMzMsMTIgKzM0LDEyIEBACiAgICAgICAgICAgICB4ID0gbFs0XQogICAgICAgICAgICAgeCA9IGxbNV0KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQogCiAgICAgICAgICAgICBsWzBdID0gMwogICAgICAgICAgICAgbFsxXSA9IDQKQEAgLTU0LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgeCA9IGxbNF0KICAgICAgICAgICAgIHggPSBsWzVdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC03NSwxMiArNzYsMTIgQEAKICAgICAgICAgICAgIHggPSBsWzRdCiAgICAgICAgICAgICB4ID0gbFs1XQogCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtOTYsMTIgKzk3LDEyIEBACiAgICAgICAgICAgICB4ID0gbFs0XQogICAgICAgICAgICAgeCA9IGxbNV0KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQogCiAgICAgICAgICAgICBsWzBdID0gMwogICAgICAgICAgICAgbFsxXSA9IDQKQEAgLTEyNCwxNSArMTI1LDE2IEBACiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBsID0gW10KKyAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcwogCiBjbGFzcyBMaXN0U2xpY2luZyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjQKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDI1KigzKzErMisxKQotICAgIHJvdW5kcyA9IDQwMAorICAgIHJvdW5kcyA9IDgwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTE0MSw3ICsxNDMsNyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAKLSAgICAgICAgICAgIGwgPSByYW5nZSgxMDApCisgICAgICAgICAgICBsID0gbls6XQogCiAgICAgICAgICAgICBmb3IgaiBpbiByOgogCkBAIC0xNTksMTcgKzE2MSwxNCBAQAogICAgICAgICByID0gcmFuZ2UoMjUpCiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKLQotICAgICAgICAgICAgbCA9IHJhbmdlKDEwMCkKLQogICAgICAgICAgICAgZm9yIGogaW4gcjoKICAgICAgICAgICAgICAgICBwYXNzCiAKIGNsYXNzIFNtYWxsTGlzdHMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigxKyA2ICsgNiArIDMgKyAxKQotICAgIHJvdW5kcyA9IDYwMDAwCisgICAgcm91bmRzID0gODAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0xNzcsMTIgKzE3NiwxMyBAQAogCiAgICAgICAgICAgICBsID0gW10KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0xOTksMTIgKzE5OSwxMyBAQAogCiAgICAgICAgICAgICBsID0gW10KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0yMjEsMTIgKzIyMiwxMyBAQAogCiAgICAgICAgICAgICBsID0gW10KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0yNDMsMTIgKzI0NSwxMyBAQAogCiAgICAgICAgICAgICBsID0gW10KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0yNjUsMTIgKzI2OCwxMyBAQAogCiAgICAgICAgICAgICBsID0gW10KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0yODgsNCArMjkyLDQgQEAKICAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6Ci0gICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weSBiL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weQppbmRleCBlNTUyOWNkLi5mMjBlN2RhIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0xvb2t1cHMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5CkBAIC0yLDcgKzIsNyBAQAogCiBjbGFzcyBTcGVjaWFsQ2xhc3NBdHRyaWJ1dGUoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQogICAgIHJvdW5kcyA9IDEwMDAwMAogCkBAIC0xODMsNyArMTgzLDcgQEAKIAogY2xhc3MgTm9ybWFsQ2xhc3NBdHRyaWJ1dGUoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQogICAgIHJvdW5kcyA9IDEwMDAwMAogCkBAIC0zNjksNyArMzY5LDcgQEAKIAogY2xhc3MgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKICAgICByb3VuZHMgPSAxMDAwMDAKIApAQCAtNTU3LDcgKzU1Nyw3IEBACiAKIGNsYXNzIE5vcm1hbEluc3RhbmNlQXR0cmlidXRlKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKICAgICByb3VuZHMgPSAxMDAwMDAKIApAQCAtNzQ1LDcgKzc0NSw3IEBACiAKIGNsYXNzIEJ1aWx0aW5NZXRob2RMb29rdXAoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigzKjUgKyAzKjUpCiAgICAgcm91bmRzID0gNzAwMDAKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9OZXdJbnN0YW5jZXMucHkgYi9Ub29scy9weWJlbmNoL05ld0luc3RhbmNlcy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGEzNTI2MzguLjI1OGJlYmEKLS0tIGEvVG9vbHMvcHliZW5jaC9OZXdJbnN0YW5jZXMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9OZXdJbnN0YW5jZXMucHkKQEAgLTEsOCArMSwxNyBAQAogZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CiAKKyMgQ2hlY2sgZm9yIG5ldy1zdHlsZSBjbGFzcyBzdXBwb3J0OgordHJ5OgorICAgIGNsYXNzIGMob2JqZWN0KToKKyAgICAgICAgcGFzcworZXhjZXB0IE5hbWVFcnJvcjoKKyAgICByYWlzZSBJbXBvcnRFcnJvcgorCisjIyMKKwogY2xhc3MgQ3JlYXRlTmV3SW5zdGFuY2VzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMyArIDcgKyA0CiAgICAgcm91bmRzID0gNjAwMDAKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9OdW1iZXJzLnB5IGIvVG9vbHMvcHliZW5jaC9OdW1iZXJzLnB5CmluZGV4IGE2YWVhMzMuLjEwYzg5NDAgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weQorKysgYi9Ub29scy9weWJlbmNoL051bWJlcnMucHkKQEAgLTIsNyArMiw3IEBACiAKIGNsYXNzIENvbXBhcmVJbnRlZ2VycyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMwICogNQogICAgIHJvdW5kcyA9IDEyMDAwMAogCkBAIC0xOTgsOSArMTk4LDkgQEAKIAogY2xhc3MgQ29tcGFyZUZsb2F0cyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMwICogNQotICAgIHJvdW5kcyA9IDYwMDAwCisgICAgcm91bmRzID0gODAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zOTQsNyArMzk0LDcgQEAKIAogY2xhc3MgQ29tcGFyZUZsb2F0c0ludGVnZXJzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMzAgKiA1CiAgICAgcm91bmRzID0gNjAwMDAKIApAQCAtNTkwLDkgKzU5MCw5IEBACiAKIGNsYXNzIENvbXBhcmVMb25ncyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMwICogNQotICAgIHJvdW5kcyA9IDYwMDAwCisgICAgcm91bmRzID0gNzAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1JFQURNRSBiL1Rvb2xzL3B5YmVuY2gvUkVBRE1FCmluZGV4IDk1YWUzOTIuLjAyMmM4ZGUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvUkVBRE1FCisrKyBiL1Rvb2xzL3B5YmVuY2gvUkVBRE1FCkBAIC0yOCwxMiArMjgsMzcgQEAKIE1pY3JvLU1hbnVhbAogLS0tLS0tLS0tLS0tCiAKLVJ1biAncHliZW5jaC5weSAtaCcgdG8gc2VlIHRoZSBoZWxwIHNjcmVlbi4KLVJ1biAncHliZW5jaC5weScgdG8ganVzdCBsZXQgdGhlIGJlbmNobWFyayBzdWl0ZSBkbyBpdCdzIHRoaW5nIGFuZAotJ3B5YmVuY2gucHkgLWYgPGZpbGU+JyB0byBoYXZlIGl0IHN0b3JlIHRoZSByZXN1bHRzIGluIGEgZmlsZSB0b28uCitSdW4gJ3B5YmVuY2gucHkgLWgnIHRvIHNlZSB0aGUgaGVscCBzY3JlZW4uICBSdW4gJ3B5YmVuY2gucHknIHRvIHJ1bgordGhlIGJlbmNobWFyayBzdWl0ZSB1c2luZyBkZWZhdWx0IHNldHRpbmdzIGFuZCAncHliZW5jaC5weSAtZiA8ZmlsZT4nCit0byBoYXZlIGl0IHN0b3JlIHRoZSByZXN1bHRzIGluIGEgZmlsZSB0b28uCisKK0l0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgdG8gcnVuIHB5YmVuY2gucHkgbXVsdGlwbGUgdGltZXMgdG8gc2VlCit3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCwgdGltZXJzIGFuZCBiZW5jaG1hcmsgcnVuLXRpbWVzIGFyZSBzdWl0YWJsZQorZm9yIGRvaW5nIGJlbmNobWFyayB0ZXN0cy4gCisKK1lvdSBjYW4gdXNlIHRoZSBjb21wYXJpc29uIGZlYXR1cmUgb2YgcHliZW5jaC5weSAoJ3B5YmVuY2gucHkgLWMKKzxmaWxlPicpIHRvIGNoZWNrIGhvdyB3ZWxsIHRoZSBzeXN0ZW0gYmVoYXZlcyBpbiBjb21wYXJpc29uIHRvIGEKK3JlZmVyZW5jZSBydW4uIAorCitJZiB0aGUgZGlmZmVyZW5jZXMgYXJlIHdlbGwgYmVsb3cgMTAlIGZvciBlYWNoIHRlc3QsIHRoZW4geW91IGhhdmUgYQorc3lzdGVtIHRoYXQgaXMgZ29vZCBmb3IgZG9pbmcgYmVuY2htYXJrIHRlc3RpbmdzLiAgT2YgeW91IGdldCByYW5kb20KK2RpZmZlcmVuY2VzIG9mIG1vcmUgdGhhbiAxMCUgb3Igc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUKK3ZhbHVlcyBmb3IgbWluaW11bSBhbmQgYXZlcmFnZSB0aW1lLCB0aGVuIHlvdSBsaWtlbHkgaGF2ZSBzb21lCitiYWNrZ3JvdW5kIHByb2Nlc3NlcyBydW5uaW5nIHdoaWNoIGNhdXNlIHRoZSByZWFkaW5ncyB0byBiZWNvbWUKK2luY29uc2lzdGVudC4gRXhhbXBsZXMgaW5jbHVkZTogd2ViLWJyb3dzZXJzLCBlbWFpbCBjbGllbnRzLCBSU1MKK3JlYWRlcnMsIG11c2ljIHBsYXllcnMsIGJhY2t1cCBwcm9ncmFtcywgZXRjLgorCitJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIGZldyB0ZXN0cyBvZiB0aGUgd2hvbGUgc3VpdGUsIHlvdSBjYW4KK3VzZSB0aGUgZmlsdGVyaW5nIG9wdGlvbiwgZS5nLiAncHliZW5jaC5weSAtdCBzdHJpbmcnIHdpbGwgb25seQorcnVuL3Nob3cgdGhlIHRlc3RzIHRoYXQgaGF2ZSAnc3RyaW5nJyBpbiB0aGVpciBuYW1lLgogCiBUaGlzIGlzIHRoZSBjdXJyZW50IG91dHB1dCBvZiBweWJlbmNoLnB5IC0taGVscDoKIAorIiIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BZQkVOQ0ggLSBhIGJlbmNobWFyayB0ZXN0IHN1aXRlIGZvciBQeXRob24gaW50ZXJwcmV0ZXJzL2NvbXBpbGVycy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBTeW5vcHNpczoKICBweWJlbmNoLnB5IFtvcHRpb25dIGZpbGVzLi4uCiAKQEAgLTQyLDE0ICs2NywxNCBAQAogICAtZiBhcmcgICAgICAgICAgIHNhdmUgYmVuY2htYXJrIHRvIGZpbGUgYXJnICgpCiAgIC1jIGFyZyAgICAgICAgICAgY29tcGFyZSBiZW5jaG1hcmsgd2l0aCB0aGUgb25lIGluIGZpbGUgYXJnICgpCiAgIC1zIGFyZyAgICAgICAgICAgc2hvdyBiZW5jaG1hcmsgaW4gZmlsZSBhcmcsIHRoZW4gZXhpdCAoKQotICAtUyAgICAgICAgICAgICAgIHNob3cgc3RhdGlzdGljcyBvZiBiZW5jaG1hcmtzICgwKQotICAtdyBhcmcgICAgICAgICAgIHNldCB3YXJwIGZhY3RvciB0byBhcmcgKDIwKQotICAtZCAgICAgICAgICAgICAgIGhpZGUgbm9pc2UgaW4gY29tcGFyZXMgKDApCi0gIC0tbm8tZ2MgICAgICAgICAgZGlzYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gKDApCi0gIC0tbm8tc3lzY2hlY2sgICAgImRpc2FibGUiIHN5cyBjaGVjayBpbnRlcnZhbCAoc2V0IHRvIHN5cy5tYXhpbnQpICgwKQotICAtdCBhcmcgICAgICAgICAgIHRlc3RzIGNvbnRhaW5pbmcgc3Vic3RyaW5nICgpCi0gIC1DIGFyZyAgICAgICAgICAgbnVtYmVyIG9mIGNhbGlicmF0aW9uIHJ1bnMgKDIwKQotICAtdiAgICAgICAgICAgICAgIGdlbmVyYXRlIHZlcmJvc2Ugb3V0cHV0CisgIC13IGFyZyAgICAgICAgICAgc2V0IHdhcnAgZmFjdG9yIHRvIGFyZyAoMTApCisgIC10IGFyZyAgICAgICAgICAgcnVuIG9ubHkgdGVzdHMgd2l0aCBuYW1lcyBtYXRjaGluZyBhcmcgKCkKKyAgLUMgYXJnICAgICAgICAgICBzZXQgdGhlIG51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zIHRvIGFyZyAoMjApCisgIC1kICAgICAgICAgICAgICAgaGlkZSBub2lzZSBpbiBjb21wYXJpc29ucyAoMCkKKyAgLXYgICAgICAgICAgICAgICB2ZXJib3NlIG91dHB1dCAobm90IHJlY29tbWVuZGVkKSAoMCkKKyAgLS13aXRoLWdjICAgICAgICBlbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uICgwKQorICAtLXdpdGgtc3lzY2hlY2sgIHVzZSBkZWZhdWx0IHN5cyBjaGVjayBpbnRlcnZhbCAoMCkKKyAgLS10aW1lciBhcmcgICAgICB1c2UgZ2l2ZW4gdGltZXIgKHRpbWUudGltZSkKICAgLWggICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCB0ZXh0CiAgIC0taGVscCAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgdGV4dAogICAtLWRlYnVnICAgICAgICAgIGVuYWJsZSBkZWJ1Z2dpbmcKQEAgLTU3LDE3ICs4MiwyMyBAQAogICAtLWV4YW1wbGVzICAgICAgIHNob3cgZXhhbXBsZXMgb2YgdXNhZ2UKIAogVmVyc2lvbjoKLSAxLjMKKyAyLjAKIAogVGhlIG5vcm1hbCBvcGVyYXRpb24gaXMgdG8gcnVuIHRoZSBzdWl0ZSBhbmQgZGlzcGxheSB0aGUKLXJlc3VsdHMuIFVzZSAtZiB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHJldXNlIG9yIGNvbXBhcmlzbXMuCityZXN1bHRzLiBVc2UgLWYgdG8gc2F2ZSB0aGVtIGZvciBsYXRlciByZXVzZSBvciBjb21wYXJpc29ucy4KKworQXZhaWxhYmxlIHRpbWVyczoKKworICAgdGltZS50aW1lCisgICB0aW1lLmNsb2NrCisgICBzeXN0aW1lcy5wcm9jZXNzdGltZQogCiBFeGFtcGxlczoKIAotcHl0aG9uMS41IHB5YmVuY2gucHkgLXcgMTAwIC1mIHAxNQotcHl0aG9uMS40IHB5YmVuY2gucHkgLXcgMTAwIC1mIHAxNAotcHl0aG9uIHB5YmVuY2gucHkgLXMgcDE1IC1jIHAxNAotCitweXRob24yLjEgcHliZW5jaC5weSAtZiBwMjEucHliZW5jaAorcHl0aG9uMi41IHB5YmVuY2gucHkgLWYgcDI1LnB5YmVuY2gKK3B5dGhvbiBweWJlbmNoLnB5IC1zIHAyNS5weWJlbmNoIC1jIHAyMS5weWJlbmNoCisiIiIKIAogTGljZW5zZQogLS0tLS0tLQpAQCAtNzgsMTg0ICsxMDksMTAzIEBACiBTYW1wbGUgb3V0cHV0CiAtLS0tLS0tLS0tLS0tCiAKLVBZQkVOQ0ggMS4zCisiIiIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BZQkVOQ0ggMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIHVzaW5nIFB5dGhvbiAyLjQuMgorKiBkaXNhYmxlZCBnYXJiYWdlIGNvbGxlY3Rpb24KKyogc3lzdGVtIGNoZWNrIGludGVydmFsIHNldCB0byBtYXhpbXVtOiAyMTQ3NDgzNjQ3CisqIHVzaW5nIHRpbWVyOiB0aW1lLnRpbWUKIAotTWFjaGluZSBEZXRhaWxzOgotICAgUGxhdGZvcm0gSUQ6ICBMaW51eC0yLjYuOC0yNC4xOS1kZWZhdWx0LXg4Nl82NC13aXRoLVN1U0UtOS4yLXg4Ni02NAotICAgRXhlY3V0YWJsZTogICAvaG9tZS9sZW1idXJnL3Byb2plY3RzL1B5dGhvbi9JbnN0YWxsYXRpb24vYmluL3B5dGhvbgotICAgUHl0aG9uOiAgICAgICAyLjVhMS4wCi0gICBDb21waWxlcjogICAgIEdDQyAzLjMuNCAocHJlIDMuMy41IDIwMDQwODA5KQotICAgQnVpbGQ6ICAgICAgICBBcHIgIDkgMjAwNiAwMTo1MDo1NyAoI3RydW5rKQorQ2FsaWJyYXRpbmcgdGVzdHMuIFBsZWFzZSB3YWl0Li4uCiAKLVNlYXJjaGluZyBmb3IgdGVzdHMuLi4KLSAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzCi0gICBCdWlsdGluTWV0aG9kTG9va3VwCi0gICBDb21wYXJlRmxvYXRzCi0gICBDb21wYXJlRmxvYXRzSW50ZWdlcnMKLSAgIENvbXBhcmVJbnRlZ2VycwotICAgQ29tcGFyZUludGVybmVkU3RyaW5ncwotICAgQ29tcGFyZUxvbmdzCi0gICBDb21wYXJlU3RyaW5ncwotICAgQ29tcGFyZVVuaWNvZGUKLSAgIENvbmNhdFN0cmluZ3MKLSAgIENvbmNhdFVuaWNvZGUKLSAgIENyZWF0ZUluc3RhbmNlcwotICAgQ3JlYXRlU3RyaW5nc1dpdGhDb25jYXQKLSAgIENyZWF0ZVVuaWNvZGVXaXRoQ29uY2F0Ci0gICBEaWN0Q3JlYXRpb24KLSAgIERpY3RXaXRoRmxvYXRLZXlzCi0gICBEaWN0V2l0aEludGVnZXJLZXlzCi0gICBEaWN0V2l0aFN0cmluZ0tleXMKLSAgIEZvckxvb3BzCi0gICBJZlRoZW5FbHNlCi0gICBMaXN0U2xpY2luZwotICAgTmVzdGVkRm9yTG9vcHMKLSAgIE5vcm1hbENsYXNzQXR0cmlidXRlCi0gICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZQotICAgUHl0aG9uRnVuY3Rpb25DYWxscwotICAgUHl0aG9uTWV0aG9kQ2FsbHMKLSAgIFJlY3Vyc2lvbgotICAgU2Vjb25kSW1wb3J0Ci0gICBTZWNvbmRQYWNrYWdlSW1wb3J0Ci0gICBTZWNvbmRTdWJtb2R1bGVJbXBvcnQKLSAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljCi0gICBTaW1wbGVEaWN0TWFuaXB1bGF0aW9uCi0gICBTaW1wbGVGbG9hdEFyaXRobWV0aWMKLSAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYwotICAgU2ltcGxlSW50ZWdlckFyaXRobWV0aWMKLSAgIFNpbXBsZUxpc3RNYW5pcHVsYXRpb24KLSAgIFNpbXBsZUxvbmdBcml0aG1ldGljCi0gICBTbWFsbExpc3RzCi0gICBTbWFsbFR1cGxlcwotICAgU3BlY2lhbENsYXNzQXR0cmlidXRlCi0gICBTcGVjaWFsSW5zdGFuY2VBdHRyaWJ1dGUKLSAgIFN0cmluZ01hcHBpbmdzCi0gICBTdHJpbmdQcmVkaWNhdGVzCi0gICBTdHJpbmdTbGljaW5nCi0gICBUcnlFeGNlcHQKLSAgIFRyeVJhaXNlRXhjZXB0Ci0gICBUdXBsZVNsaWNpbmcKLSAgIFVuaWNvZGVNYXBwaW5ncwotICAgVW5pY29kZVByZWRpY2F0ZXMKLSAgIFVuaWNvZGVQcm9wZXJ0aWVzCi0gICBVbmljb2RlU2xpY2luZworUnVubmluZyAxMCByb3VuZChzKSBvZiB0aGUgc3VpdGUgYXQgd2FycCBmYWN0b3IgMTA6CiAKLVJ1bm5pbmcgMTAgcm91bmQocykgb2YgdGhlIHN1aXRlOgotCisqIFJvdW5kIDEgZG9uZSBpbiA2LjM4OCBzZWNvbmRzLgorKiBSb3VuZCAyIGRvbmUgaW4gNi40ODUgc2Vjb25kcy4KKyogUm91bmQgMyBkb25lIGluIDYuNzg2IHNlY29uZHMuCiAuLi4KKyogUm91bmQgMTAgZG9uZSBpbiA2LjU0NiBzZWNvbmRzLgogCi0gUm91bmQgMTAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCAgIGFicyAgICBvdmVyaGVhZAotICAgICAgICAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgICAgIEJ1aWx0aW5NZXRob2RMb29rdXA6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICBDb21wYXJlSW50ZWdlcnM6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KLSAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAwLjAzOXIgMC4wNDBhIDAuMDAxbwotICAgICAgICAgICAgICAgICAgQ29tcGFyZUxvbmdzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgQ29tcGFyZVN0cmluZ3M6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgICAgICAgICAgICBDb25jYXRTdHJpbmdzOiAgIDAuMDQwciAwLjA0MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgIENvbmNhdFVuaWNvZGU6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0OiAgIDAuMDI5ciAwLjAzMGEgMC4wMDFvCi0gICAgICAgQ3JlYXRlVW5pY29kZVdpdGhDb25jYXQ6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAwLjA0MHIgMC4wNDBhIDAuMDAwbwotICAgICAgICAgICAgIERpY3RXaXRoRmxvYXRLZXlzOiAgIDAuMDg5ciAwLjA5MGEgMC4wMDBvCi0gICAgICAgICAgIERpY3RXaXRoSW50ZWdlcktleXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KLSAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAwLjA3MHIgMC4wNzBhIDAuMDAxbwotICAgICAgICAgICAgICAgICAgICAgIEZvckxvb3BzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgIElmVGhlbkVsc2U6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgICAgICAgIE5lc3RlZEZvckxvb3BzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgICAgTm9ybWFsQ2xhc3NBdHRyaWJ1dGU6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgICAgICBQeXRob25GdW5jdGlvbkNhbGxzOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgICAgICAgUHl0aG9uTWV0aG9kQ2FsbHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgICAgICAgICAgU2Vjb25kSW1wb3J0OiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgICAgIFNlY29uZFBhY2thZ2VJbXBvcnQ6ICAgMC4wMzByIDAuMDMwYSAwLjAwMG8KLSAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAwLjA0MHIgMC4wNDBhIDAuMDAwbwotICAgICAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgIFNpbXBsZURpY3RNYW5pcHVsYXRpb246ICAgMC4wNDByIDAuMDQwYSAwLjAwMG8KLSAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAwLjA1MHIgMC4wNTBhIDAuMDAxbwotICAgICAgU2ltcGxlSW50RmxvYXRBcml0aG1ldGljOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgU2ltcGxlSW50ZWdlckFyaXRobWV0aWM6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgIFNpbXBsZUxvbmdBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgIFNtYWxsTGlzdHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgU3BlY2lhbENsYXNzQXR0cmlidXRlOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICBTcGVjaWFsSW5zdGFuY2VBdHRyaWJ1dGU6ICAgMC4wNzlyIDAuMDgwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgICAgICAgICBTdHJpbmdQcmVkaWNhdGVzOiAgIDAuMDQ5ciAwLjA1MGEgMC4wMDFvCi0gICAgICAgICAgICAgICAgIFN0cmluZ1NsaWNpbmc6ICAgMC4wMzlyIDAuMDQwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAwLjA3OXIgMC4wODBhIDAuMDAxbwotICAgICAgICAgICAgICAgIFRyeVJhaXNlRXhjZXB0OiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCi0gICAgICAgICAgICAgICAgICBUdXBsZVNsaWNpbmc6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAwLjA3MHIgMC4wNzBhIDAuMDAxbwotICAgICAgICAgICAgIFVuaWNvZGVQcmVkaWNhdGVzOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCi0gICAgICAgICAgICAgVW5pY29kZVByb3BlcnRpZXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgIDIuOTM3IHNlY29uZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyazogMjAwNi0wNi0xMiAxMjowOToyNQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgUm91bmRzOiAxMAorICAgIFdhcnA6ICAgMTAKKyAgICBUaW1lcjogIHRpbWUudGltZQorCisgICAgTWFjaGluZSBEZXRhaWxzOgorICAgICAgIFBsYXRmb3JtIElEOiAgTGludXgtMi42LjgtMjQuMTktZGVmYXVsdC14ODZfNjQtd2l0aC1TdVNFLTkuMi14ODYtNjQKKyAgICAgICBQcm9jZXNzb3I6ICAgIHg4Nl82NAorCisgICAgUHl0aG9uOgorICAgICAgIEV4ZWN1dGFibGU6ICAgL3Vzci9sb2NhbC9iaW4vcHl0aG9uCisgICAgICAgVmVyc2lvbjogICAgICAyLjQuMgorICAgICAgIENvbXBpbGVyOiAgICAgR0NDIDMuMy40IChwcmUgMy4zLjUgMjAwNDA4MDkpCisgICAgICAgQml0czogICAgICAgICA2NGJpdAorICAgICAgIEJ1aWxkOiAgICAgICAgT2N0ICAxIDIwMDUgMTU6MjQ6MzUgKCMxKQorICAgICAgIFVuaWNvZGU6ICAgICAgVUNTMgogCiAKLVRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlciBydW4gICAgcGVyIG9wZXIuICAgb3ZlcmhlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzOiAgICAgIDI5Ljg1IG1zICAgIDAuMjMgdXMgICAgMC4wMCBtcwotICAgICAgICAgICBCdWlsdGluTWV0aG9kTG9va3VwOiAgICAgIDY2Ljg1IG1zICAgIDAuMTMgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICBDb21wYXJlRmxvYXRzOiAgICAgIDQzLjAwIG1zICAgIDAuMTAgdXMgICAgMC4wMCBtcwotICAgICAgICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzOiAgICAgIDUxLjgwIG1zICAgIDAuMTIgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgQ29tcGFyZUludGVnZXJzOiAgICAgIDcwLjcwIG1zICAgIDAuMDggdXMgICAgMC41MCBtcwotICAgICAgICBDb21wYXJlSW50ZXJuZWRTdHJpbmdzOiAgICAgIDQxLjQwIG1zICAgIDAuMDggdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICAgQ29tcGFyZUxvbmdzOiAgICAgIDQ3LjkwIG1zICAgIDAuMTEgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgIENvbXBhcmVTdHJpbmdzOiAgICAgIDU4LjUwIG1zICAgIDAuMTIgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgIENvbXBhcmVVbmljb2RlOiAgICAgIDU2LjU1IG1zICAgIDAuMTUgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICBDb25jYXRTdHJpbmdzOiAgICAgIDQ0Ljc1IG1zICAgIDAuMzAgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICBDb25jYXRVbmljb2RlOiAgICAgIDU0LjU1IG1zICAgIDAuMzYgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgQ3JlYXRlSW5zdGFuY2VzOiAgICAgIDUwLjk1IG1zICAgIDEuMjEgdXMgICAgMC4wMCBtcwotICAgICAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0OiAgICAgIDI4Ljg1IG1zICAgIDAuMTQgdXMgICAgMC41MCBtcwotICAgICAgIENyZWF0ZVVuaWNvZGVXaXRoQ29uY2F0OiAgICAgIDUzLjc1IG1zICAgIDAuMjcgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgRGljdENyZWF0aW9uOiAgICAgIDQxLjkwIG1zICAgIDAuMjggdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgIERpY3RXaXRoRmxvYXRLZXlzOiAgICAgIDg4LjUwIG1zICAgIDAuMTUgdXMgICAgMC41MCBtcwotICAgICAgICAgICBEaWN0V2l0aEludGVnZXJLZXlzOiAgICAgIDYyLjU1IG1zICAgIDAuMTAgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgRGljdFdpdGhTdHJpbmdLZXlzOiAgICAgIDYwLjUwIG1zICAgIDAuMTAgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICAgICAgIEZvckxvb3BzOiAgICAgIDQ2LjkwIG1zICAgIDQuNjkgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgICBJZlRoZW5FbHNlOiAgICAgIDYwLjU1IG1zICAgIDAuMDkgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgIExpc3RTbGljaW5nOiAgICAgIDI5LjkwIG1zICAgIDguNTQgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgIE5lc3RlZEZvckxvb3BzOiAgICAgIDMzLjk1IG1zICAgIDAuMTAgdXMgICAgMC4wMCBtcwotICAgICAgICAgIE5vcm1hbENsYXNzQXR0cmlidXRlOiAgICAgIDYyLjc1IG1zICAgIDAuMTAgdXMgICAgMC41MCBtcwotICAgICAgIE5vcm1hbEluc3RhbmNlQXR0cmlidXRlOiAgICAgIDYxLjgwIG1zICAgIDAuMTAgdXMgICAgMC41MCBtcwotICAgICAgICAgICBQeXRob25GdW5jdGlvbkNhbGxzOiAgICAgIDYwLjAwIG1zICAgIDAuMzYgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgIFB5dGhvbk1ldGhvZENhbGxzOiAgICAgIDUwLjAwIG1zICAgIDAuNjcgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgICAgUmVjdXJzaW9uOiAgICAgIDQ2Ljg1IG1zICAgIDMuNzUgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgU2Vjb25kSW1wb3J0OiAgICAgIDM1LjAwIG1zICAgIDEuNDAgdXMgICAgMC4wMCBtcwotICAgICAgICAgICBTZWNvbmRQYWNrYWdlSW1wb3J0OiAgICAgIDMyLjAwIG1zICAgIDEuMjggdXMgICAgMC4wMCBtcwotICAgICAgICAgU2Vjb25kU3VibW9kdWxlSW1wb3J0OiAgICAgIDM4LjAwIG1zICAgIDEuNTIgdXMgICAgMC4wMCBtcwotICAgICAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljOiAgICAgIDI2Ljg1IG1zICAgIDAuMTIgdXMgICAgMC4wMCBtcwotICAgICAgICBTaW1wbGVEaWN0TWFuaXB1bGF0aW9uOiAgICAgIDQwLjg1IG1zICAgIDAuMTQgdXMgICAgMC4wMCBtcwotICAgICAgICAgU2ltcGxlRmxvYXRBcml0aG1ldGljOiAgICAgIDQ4LjcwIG1zICAgIDAuMDkgdXMgICAgMC41MCBtcwotICAgICAgU2ltcGxlSW50RmxvYXRBcml0aG1ldGljOiAgICAgIDU3LjcwIG1zICAgIDAuMDkgdXMgICAgMC4wMCBtcwotICAgICAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljOiAgICAgIDU4Ljc1IG1zICAgIDAuMDkgdXMgICAgMC41MCBtcwotICAgICAgICBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uOiAgICAgIDM0LjgwIG1zICAgIDAuMTMgdXMgICAgMC4wMCBtcwotICAgICAgICAgIFNpbXBsZUxvbmdBcml0aG1ldGljOiAgICAgIDMwLjk1IG1zICAgIDAuMTkgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICAgICBTbWFsbExpc3RzOiAgICAgIDQ3LjYwIG1zICAgIDAuMTkgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgICAgIFNtYWxsVHVwbGVzOiAgICAgIDQ4LjgwIG1zICAgIDAuMjAgdXMgICAgMC41MCBtcwotICAgICAgICAgU3BlY2lhbENsYXNzQXR0cmlidXRlOiAgICAgIDYxLjcwIG1zICAgIDAuMTAgdXMgICAgMC4wMCBtcwotICAgICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlOiAgICAgIDc2LjcwIG1zICAgIDAuMTMgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgIFN0cmluZ01hcHBpbmdzOiAgICAgIDU4LjcwIG1zICAgIDAuNDcgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICBTdHJpbmdQcmVkaWNhdGVzOiAgICAgIDUwLjAwIG1zICAgIDAuMTggdXMgICAgMS4wMCBtcwotICAgICAgICAgICAgICAgICBTdHJpbmdTbGljaW5nOiAgICAgIDM5LjY1IG1zICAgIDAuMjMgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICAgICAgVHJ5RXhjZXB0OiAgICAgIDg0LjQ1IG1zICAgIDAuMDYgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgIFRyeVJhaXNlRXhjZXB0OiAgICAgIDYxLjc1IG1zICAgIDQuMTIgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgICAgICAgVHVwbGVTbGljaW5nOiAgICAgIDQ4Ljk1IG1zICAgIDAuNDcgdXMgICAgMC4wMCBtcwotICAgICAgICAgICAgICAgVW5pY29kZU1hcHBpbmdzOiAgICAgIDcxLjUwIG1zICAgIDMuOTcgdXMgICAgMC41MCBtcwotICAgICAgICAgICAgIFVuaWNvZGVQcmVkaWNhdGVzOiAgICAgIDUyLjc1IG1zICAgIDAuMjMgdXMgICAgMS4wMCBtcwotICAgICAgICAgICAgIFVuaWNvZGVQcm9wZXJ0aWVzOiAgICAgIDYxLjkwIG1zICAgIDAuMzEgdXMgICAgMS4wMCBtcwotICAgICAgICAgICAgICAgIFVuaWNvZGVTbGljaW5nOiAgICAgIDUzLjc1IG1zICAgIDAuMzEgdXMgICAgMC41MCBtcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICBBdmVyYWdlIHJvdW5kIHRpbWU6ICAgIDI5MzcuMDAgbXMKLQorVGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSAgYXZlcmFnZSAgb3BlcmF0aW9uICBvdmVyaGVhZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzOiAgICAxMjZtcyAgICAxNDVtcyAgICAwLjI4dXMgICAgMC4yNzRtcworICAgICAgICAgICBCdWlsdGluTWV0aG9kTG9va3VwOiAgICAxMjRtcyAgICAxMzBtcyAgICAwLjEydXMgICAgMC4zMTZtcworICAgICAgICAgICAgICAgICBDb21wYXJlRmxvYXRzOiAgICAxMDltcyAgICAxMTBtcyAgICAwLjA5dXMgICAgMC4zNjFtcworICAgICAgICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzOiAgICAxMDBtcyAgICAxMDRtcyAgICAwLjEydXMgICAgMC4yNzFtcworICAgICAgICAgICAgICAgQ29tcGFyZUludGVnZXJzOiAgICAxMzdtcyAgICAxMzhtcyAgICAwLjA4dXMgICAgMC41NDJtcworICAgICAgICBDb21wYXJlSW50ZXJuZWRTdHJpbmdzOiAgICAxMjRtcyAgICAxMjdtcyAgICAwLjA4dXMgICAgMS4zNjdtcworICAgICAgICAgICAgICAgICAgQ29tcGFyZUxvbmdzOiAgICAxMDBtcyAgICAxMDRtcyAgICAwLjEwdXMgICAgMC4zMTZtcworICAgICAgICAgICAgICAgIENvbXBhcmVTdHJpbmdzOiAgICAxMTFtcyAgICAxMTVtcyAgICAwLjEydXMgICAgMC45MjltcworICAgICAgICAgICAgICAgIENvbXBhcmVVbmljb2RlOiAgICAxMDhtcyAgICAxMjhtcyAgICAwLjE3dXMgICAgMC42OTNtcworICAgICAgICAgICAgICAgICBDb25jYXRTdHJpbmdzOiAgICAxNDJtcyAgICAxNTVtcyAgICAwLjMxdXMgICAgMC41NjJtcworICAgICAgICAgICAgICAgICBDb25jYXRVbmljb2RlOiAgICAxMTltcyAgICAxMjdtcyAgICAwLjQydXMgICAgMC4zODRtcworICAgICAgICAgICAgICAgQ3JlYXRlSW5zdGFuY2VzOiAgICAxMjNtcyAgICAxMjhtcyAgICAxLjE0dXMgICAgMC4zNjdtcworICAgICAgICAgICAgQ3JlYXRlTmV3SW5zdGFuY2VzOiAgICAxMjFtcyAgICAxMjZtcyAgICAxLjQ5dXMgICAgMC4zMzVtcworICAgICAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0OiAgICAxMzBtcyAgICAxMzVtcyAgICAwLjE0dXMgICAgMC45MTZtcworICAgICAgIENyZWF0ZVVuaWNvZGVXaXRoQ29uY2F0OiAgICAxMzBtcyAgICAxMzVtcyAgICAwLjM0dXMgICAgMC4zNjFtcworICAgICAgICAgICAgICAgICAgRGljdENyZWF0aW9uOiAgICAxMDhtcyAgICAxMDltcyAgICAwLjI3dXMgICAgMC4zNjFtcworICAgICAgICAgICAgIERpY3RXaXRoRmxvYXRLZXlzOiAgICAxNDltcyAgICAxNTNtcyAgICAwLjE3dXMgICAgMC42NzhtcworICAgICAgICAgICBEaWN0V2l0aEludGVnZXJLZXlzOiAgICAxMjRtcyAgICAxMjZtcyAgICAwLjExdXMgICAgMC45MTVtcworICAgICAgICAgICAgRGljdFdpdGhTdHJpbmdLZXlzOiAgICAxMTRtcyAgICAxMTdtcyAgICAwLjEwdXMgICAgMC45MDVtcworICAgICAgICAgICAgICAgICAgICAgIEZvckxvb3BzOiAgICAxMTBtcyAgICAxMTFtcyAgICA0LjQ2dXMgICAgMC4wNjNtcworICAgICAgICAgICAgICAgICAgICBJZlRoZW5FbHNlOiAgICAxMThtcyAgICAxMTltcyAgICAwLjA5dXMgICAgMC42ODVtcworICAgICAgICAgICAgICAgICAgIExpc3RTbGljaW5nOiAgICAxMTZtcyAgICAxMjBtcyAgICA4LjU5dXMgICAgMC4xMDNtcworICAgICAgICAgICAgICAgIE5lc3RlZEZvckxvb3BzOiAgICAxMjVtcyAgICAxMzdtcyAgICAwLjA5dXMgICAgMC4wMTltcworICAgICAgICAgIE5vcm1hbENsYXNzQXR0cmlidXRlOiAgICAxMjRtcyAgICAxMzZtcyAgICAwLjExdXMgICAgMC40NTdtcworICAgICAgIE5vcm1hbEluc3RhbmNlQXR0cmlidXRlOiAgICAxMTBtcyAgICAxMTdtcyAgICAwLjEwdXMgICAgMC40NTRtcworICAgICAgICAgICBQeXRob25GdW5jdGlvbkNhbGxzOiAgICAxMDdtcyAgICAxMTNtcyAgICAwLjM0dXMgICAgMC4yNzFtcworICAgICAgICAgICAgIFB5dGhvbk1ldGhvZENhbGxzOiAgICAxNDBtcyAgICAxNDltcyAgICAwLjY2dXMgICAgMC4xNDFtcworICAgICAgICAgICAgICAgICAgICAgUmVjdXJzaW9uOiAgICAxNTZtcyAgICAxNjZtcyAgICAzLjMydXMgICAgMC40NTJtcworICAgICAgICAgICAgICAgICAgU2Vjb25kSW1wb3J0OiAgICAxMTJtcyAgICAxMThtcyAgICAxLjE4dXMgICAgMC4xODBtcworICAgICAgICAgICBTZWNvbmRQYWNrYWdlSW1wb3J0OiAgICAxMThtcyAgICAxMjdtcyAgICAxLjI3dXMgICAgMC4xODBtcworICAgICAgICAgU2Vjb25kU3VibW9kdWxlSW1wb3J0OiAgICAxNDBtcyAgICAxNTFtcyAgICAxLjUxdXMgICAgMC4xODBtcworICAgICAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljOiAgICAxMjhtcyAgICAxMzltcyAgICAwLjE2dXMgICAgMC4zNjFtcworICAgICAgICBTaW1wbGVEaWN0TWFuaXB1bGF0aW9uOiAgICAxMzRtcyAgICAxMzZtcyAgICAwLjExdXMgICAgMC40NTJtcworICAgICAgICAgU2ltcGxlRmxvYXRBcml0aG1ldGljOiAgICAxMTBtcyAgICAxMTNtcyAgICAwLjA5dXMgICAgMC41NzFtcworICAgICAgU2ltcGxlSW50RmxvYXRBcml0aG1ldGljOiAgICAxMDZtcyAgICAxMTFtcyAgICAwLjA4dXMgICAgMC41NDhtcworICAgICAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljOiAgICAxMDZtcyAgICAxMDltcyAgICAwLjA4dXMgICAgMC41NDRtcworICAgICAgICBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uOiAgICAxMDNtcyAgICAxMTNtcyAgICAwLjEwdXMgICAgMC41ODdtcworICAgICAgICAgIFNpbXBsZUxvbmdBcml0aG1ldGljOiAgICAxMTJtcyAgICAxMThtcyAgICAwLjE4dXMgICAgMC4yNzFtcworICAgICAgICAgICAgICAgICAgICBTbWFsbExpc3RzOiAgICAxMDVtcyAgICAxMTZtcyAgICAwLjE3dXMgICAgMC4zNjZtcworICAgICAgICAgICAgICAgICAgIFNtYWxsVHVwbGVzOiAgICAxMDhtcyAgICAxMjhtcyAgICAwLjI0dXMgICAgMC40MDZtcworICAgICAgICAgU3BlY2lhbENsYXNzQXR0cmlidXRlOiAgICAxMTltcyAgICAxMzZtcyAgICAwLjExdXMgICAgMC40NTNtcworICAgICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlOiAgICAxNDNtcyAgICAxNTVtcyAgICAwLjEzdXMgICAgMC40NTRtcworICAgICAgICAgICAgICAgIFN0cmluZ01hcHBpbmdzOiAgICAxMTVtcyAgICAxMjFtcyAgICAwLjQ4dXMgICAgMC40MDVtcworICAgICAgICAgICAgICBTdHJpbmdQcmVkaWNhdGVzOiAgICAxMjBtcyAgICAxMjltcyAgICAwLjE4dXMgICAgMi4wNjRtcworICAgICAgICAgICAgICAgICBTdHJpbmdTbGljaW5nOiAgICAxMTFtcyAgICAxMjdtcyAgICAwLjIzdXMgICAgMC43ODFtcworICAgICAgICAgICAgICAgICAgICAgVHJ5RXhjZXB0OiAgICAxMjVtcyAgICAxMjZtcyAgICAwLjA2dXMgICAgMC42ODFtcworICAgICAgICAgICAgICAgIFRyeVJhaXNlRXhjZXB0OiAgICAxMzNtcyAgICAxMzdtcyAgICAyLjE0dXMgICAgMC4zNjFtcworICAgICAgICAgICAgICAgICAgVHVwbGVTbGljaW5nOiAgICAxMTdtcyAgICAxMjBtcyAgICAwLjQ2dXMgICAgMC4wNjZtcworICAgICAgICAgICAgICAgVW5pY29kZU1hcHBpbmdzOiAgICAxNTZtcyAgICAxNjBtcyAgICA0LjQ0dXMgICAgMC40MjltcworICAgICAgICAgICAgIFVuaWNvZGVQcmVkaWNhdGVzOiAgICAxMTdtcyAgICAxMjFtcyAgICAwLjIydXMgICAgMi40ODdtcworICAgICAgICAgICAgIFVuaWNvZGVQcm9wZXJ0aWVzOiAgICAxMTVtcyAgICAxNTNtcyAgICAwLjM4dXMgICAgMi4wNzBtcworICAgICAgICAgICAgICAgIFVuaWNvZGVTbGljaW5nOiAgICAxMjZtcyAgICAxMjltcyAgICAwLjI2dXMgICAgMC42ODltcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyODNtcyAgIDY2NzNtcworIiIiCiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIAogV3JpdGluZyBOZXcgVGVzdHMKQEAgLTI5Myw3ICsyNDMsNyBAQAogCiAgICAgIyBOdW1iZXIgb2Ygcm91bmRzIHRvIGV4ZWN1dGUgcGVyIHRlc3QgcnVuLiBUaGlzIHNob3VsZCBiZQogICAgICMgYWRqdXN0ZWQgdG8gYSBmaWd1cmUgdGhhdCByZXN1bHRzIGluIGEgdGVzdCBydW4tdGltZSBvZiBiZXR3ZWVuCi0gICAgIyAyMC01MCBzZWNvbmRzLgorICAgICMgMS0yIHNlY29uZHMgKGF0IHdhcnAgMSkuCiAgICAgcm91bmRzID0gMTAwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKQEAgLTM3Nyw2ICszMjcsNDEgQEAKIHZhcmlhYmxlIHNob3VsZCBiZSB1cGRhdGVkLiBUaGVyZWZhZnRlciwgY29tcGFyaXNvbnMgd2l0aCBwcmV2aW91cwogdmVyc2lvbnMgb2YgdGhlIHRlc3Qgd2lsbCBsaXN0IGFzICJuL2EiIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4KIAorCitWZXJzaW9uIEhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLQorCisgIDIuMDogcmV3cm90ZSBwYXJ0cyBvZiBweWJlbmNoIHdoaWNoIHJlc3VsdGVkIGluIG1vcmUgcmVwZWF0YWJsZQorICAgICAgIHRpbWluZ3M6CisgICAgICAgIC0gbWFkZSB0aW1lciBhIHBhcmFtZXRlcgorICAgICAgICAtIGNoYW5nZWQgdGhlIHBsYXRmb3JtIGRlZmF1bHQgdGltZXIgdG8gdXNlIGhpZ2gtcmVzb2x1dGlvbgorICAgICAgICAgIHRpbWVycyByYXRoZXIgdGhhbiBwcm9jZXNzIHRpbWVycyAod2hpY2ggaGF2ZSBhIG11Y2ggbG93ZXIKKyAgICAgICAgICByZXNvbHV0aW9uKQorICAgICAgICAtIGFkZGVkIG9wdGlvbiB0byBzZWxlY3QgdGltZXIKKyAgICAgICAgLSBhZGRlZCBwcm9jZXNzIHRpbWUgdGltZXIgKHVzaW5nIHN5c3RpbWVzLnB5KQorICAgICAgICAtIGNoYW5nZWQgdG8gdXNlIG1pbigpIGFzIHRpbWluZyBlc3RpbWF0b3IgKGF2ZXJhZ2UKKyAgICAgICAgICBpcyBzdGlsbCB0YWtlbiBhcyB3ZWxsIHRvIHByb3ZpZGUgYW4gaWRlYSBvZiB0aGUgZGlmZmVyZW5jZSkKKyAgICAgICAgLSBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgdHVybmVkIG9mZiBwZXIgZGVmYXVsdAorICAgICAgICAtIHN5cyBjaGVjayBpbnRlcnZhbCBpcyBzZXQgdG8gdGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUKKyAgICAgICAgLSBjYWxpYnJhdGlvbiBpcyBub3cgYSBzZXBhcmF0ZSBzdGVwIGFuZCBkb25lIHVzaW5nCisgICAgICAgICAgYSBkaWZmZXJlbnQgc3RyYXRlZ3kgdGhhdCBhbGxvd3MgbWVhc3VyaW5nIHRoZSB0ZXN0CisgICAgICAgICAgb3ZlcmhlYWQgbW9yZSBhY2N1cmF0ZWx5CisgICAgICAgIC0gbW9kaWZpZWQgdGhlIHRlc3RzIHRvIGVhY2ggZ2l2ZSBhIHJ1bi10aW1lIG9mIGJldHdlZW4KKyAgICAgICAgICAxMDAtMjAwbXMgdXNpbmcgd2FycCAxMAorICAgICAgICAtIGNoYW5nZWQgZGVmYXVsdCB3YXJwIGZhY3RvciB0byAxMCAoZnJvbSAyMCkKKyAgICAgICAgLSBjb21wYXJlZCByZXN1bHRzIHdpdGggdGltZWl0LnB5IGFuZCBjb25maXJtZWQgbWVhc3VyZW1lbnRzCisgICAgICAgIC0gYnVtcGVkIGFsbCB0ZXN0IHZlcnNpb25zIHRvIDIuMAorICAgICAgICAtIHVwZGF0ZWQgcGxhdGZvcm0ucHkgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uCisgICAgICAgIC0gY2hhbmdlZCB0aGUgb3V0cHV0IGZvcm1hdCBhIGJpdCB0byBtYWtlIGl0IGxvb2sKKyAgICAgICAgICBuaWNlcgorICAgICAgICAtIHJlZmFjdG9yZWQgdGhlIEFQSXMgc29tZXdoYXQKKyAgMS4zKzogU3RldmUgSG9sZGVuIGFkZGVkIHRoZSBOZXdJbnN0YW5jZXMgdGVzdCBhbmQgdGhlIGZpbHRlcmluZyAKKyAgICAgICBvcHRpb24gZHVyaW5nIHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50OyB0aGlzIGFsc28gdHJpZ2dlcmVkIGEgbG9uZyAKKyAgICAgICBkaXNjdXNzaW9uIG9uIGhvdyB0byBpbXByb3ZlIGJlbmNobWFyayB0aW1pbmcgYW5kIGZpbmFsbHkKKyAgICAgICByZXN1bHRlZCBpbiB0aGUgcmVsZWFzZSBvZiAyLjAKKyAgMS4zOiBpbml0aWFsIGNoZWNraW4gaW50byB0aGUgUHl0aG9uIFNWTiByZXBvc2l0b3J5CisKKwogSGF2ZSBmdW4sCiAtLQogTWFyYy1BbmRyZSBMZW1idXJnCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1NldHVwLnB5IGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQppbmRleCBmNWM1MTkwLi5mMTQxN2U2IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL1NldHVwLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvU2V0dXAucHkKQEAgLTE0LDcgKzE0LDcgQEAKIAogIyBEZWZhdWx0cwogTnVtYmVyX29mX3JvdW5kcyA9IDEwCi1XYXJwX2ZhY3RvciA9IDIwCitXYXJwX2ZhY3RvciA9IDEwCiAKICMgSW1wb3J0IHRlc3RzCiBmcm9tIEFyaXRobWV0aWMgaW1wb3J0ICoKQEAgLTI0LDggKzI0LDggQEAKIGZyb20gSW5zdGFuY2VzIGltcG9ydCAqCiB0cnk6CiAgICAgZnJvbSBOZXdJbnN0YW5jZXMgaW1wb3J0ICoKLWV4Y2VwdDoKLSAgICBwcmludCAiQ2Fubm90IHRlc3QgbmV3LXN0eWxlIG9iamVjdHMiCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcwogZnJvbSBMaXN0cyBpbXBvcnQgKgogZnJvbSBUdXBsZXMgaW1wb3J0ICoKIGZyb20gRGljdCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5IGIvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5CmluZGV4IGIwMTg0M2EuLjNiZThiMzUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvU3RyaW5ncy5weQorKysgYi9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkKQEAgLTMsOSArMyw5IEBACiAKIGNsYXNzIENvbmNhdFN0cmluZ3MoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTg1LDcgKzg1LDcgQEAKIAogY2xhc3MgQ29tcGFyZVN0cmluZ3MoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4yCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKICAgICByb3VuZHMgPSAyMDAwMDAKIApAQCAtMTY3LDkgKzE2Nyw5IEBACiAKIGNsYXNzIENvbXBhcmVJbnRlcm5lZFN0cmluZ3MoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKLSAgICByb3VuZHMgPSAyMDAwMDAKKyAgICByb3VuZHMgPSAzMDAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0yNDksOSArMjQ5LDkgQEAKIAogY2xhc3MgQ3JlYXRlU3RyaW5nc1dpdGhDb25jYXQoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKLSAgICByb3VuZHMgPSA4MDAwMAorICAgIHJvdW5kcyA9IDIwMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTMyNCw5ICszMjQsOSBAQAogCiBjbGFzcyBTdHJpbmdTbGljaW5nKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDcKLSAgICByb3VuZHMgPSAxMDAwMDAKKyAgICByb3VuZHMgPSAxNjAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zODcsNyArMzg3LDcgQEAKIAogICAgIGNsYXNzIFN0cmluZ01hcHBpbmdzKFRlc3QpOgogCi0gICAgICAgIHZlcnNpb24gPSAwLjEKKyAgICAgICAgdmVyc2lvbiA9IDIuMAogICAgICAgICBvcGVyYXRpb25zID0gMyAqICg1ICsgNCArIDIgKyAxKQogICAgICAgICByb3VuZHMgPSA3MDAwMAogCkBAIC00NjAsOSArNDYwLDkgQEAKIAogICAgIGNsYXNzIFN0cmluZ1ByZWRpY2F0ZXMoVGVzdCk6CiAKLSAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICB2ZXJzaW9uID0gMi4wCiAgICAgICAgIG9wZXJhdGlvbnMgPSAxMCAqIDcKLSAgICAgICAgcm91bmRzID0gODAwMDAKKyAgICAgICAgcm91bmRzID0gMTAwMDAwCiAKICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5IGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKaW5kZXggZTg0ZWE1My4uOGU0Njk4OSAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKQEAgLTIsMTggKzIsMTcgQEAKIAogY2xhc3MgVHVwbGVTbGljaW5nKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMzEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMgKiAyNSAqIDEwICogNwotICAgIHJvdW5kcyA9IDQwMAorICAgIHJvdW5kcyA9IDUwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKICAgICAgICAgciA9IHJhbmdlKDI1KQorICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogCi0gICAgICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKLQogICAgICAgICAgICAgZm9yIGogaW4gcjoKIAogICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KQEAgLTI1OSwyMCArMjU4LDE3IEBACiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICByID0gcmFuZ2UoMjUpCisgICAgICAgIHQgPSB0dXBsZShyYW5nZSgxMDApKQogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6Ci0KLSAgICAgICAgICAgIHQgPSB0dXBsZShyYW5nZSgxMDApKQotCiAgICAgICAgICAgICBmb3IgaiBpbiByOgotCiAgICAgICAgICAgICAgICAgcGFzcwogCiBjbGFzcyBTbWFsbFR1cGxlcyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDEgKyAzICsgNiArIDIpCi0gICAgcm91bmRzID0gODAwMDAKKyAgICByb3VuZHMgPSA5MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weSBiL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weQppbmRleCAzNjZmMTcxLi4xNTNhOTFlIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Vbmljb2RlLnB5CkBAIC04LDcgKzgsNyBAQAogCiBjbGFzcyBDb25jYXRVbmljb2RlKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1CiAgICAgcm91bmRzID0gNjAwMDAKIApAQCAtOTAsNyArOTAsNyBAQAogCiBjbGFzcyBDb21wYXJlVW5pY29kZShUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDEwICogNQogICAgIHJvdW5kcyA9IDE1MDAwMAogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAogY2xhc3MgQ3JlYXRlVW5pY29kZVdpdGhDb25jYXQoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKICAgICByb3VuZHMgPSA4MDAwMAogCkBAIC0yNDcsOSArMjQ3LDkgQEAKIAogY2xhc3MgVW5pY29kZVNsaWNpbmcoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1ICogNwotICAgIHJvdW5kcyA9IDEwMDAwMAorICAgIHJvdW5kcyA9IDE0MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTMwOCw3ICszMDgsNyBAQAogCiBjbGFzcyBVbmljb2RlTWFwcGluZ3MoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzICogKDUgKyA0ICsgMiArIDEpCiAgICAgcm91bmRzID0gMTAwMDAKIApAQCAtMzgxLDkgKzM4MSw5IEBACiAKIGNsYXNzIFVuaWNvZGVQcmVkaWNhdGVzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDkKLSAgICByb3VuZHMgPSAxMDAwMDAKKyAgICByb3VuZHMgPSAxMjAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC00NTgsNyArNDU4LDcgQEAKIGVsc2U6CiAgICAgY2xhc3MgVW5pY29kZVByb3BlcnRpZXMoVGVzdCk6CiAKLSAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICB2ZXJzaW9uID0gMi4wCiAgICAgICAgIG9wZXJhdGlvbnMgPSA1ICogOAogICAgICAgICByb3VuZHMgPSAxMDAwMDAKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9jbG9ja3Jlcy5weSBiL1Rvb2xzL3B5YmVuY2gvY2xvY2tyZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwOTViMwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvY2xvY2tyZXMucHkKQEAgLTAsMCArMSw0MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIiBjbG9ja3JlcyAtIGNhbGN1bGF0ZXMgdGhlIHJlc29sdXRpb24gaW4gc2Vjb25kcyBvZiBhIGdpdmVuIHRpbWVyLgorCisgICAgQ29weXJpZ2h0IChjKSAyMDA2LCBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBlZ2VuaXguY29tKS4gU2VlIHRoZQorICAgIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gY29weXJpZ2h0cywgb3IgY29udGFjdAorICAgIHRoZSBhdXRob3IuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyIiIgoraW1wb3J0IHRpbWUKKworVEVTVF9USU1FID0gMS4wCisKK2RlZiBjbG9ja3Jlcyh0aW1lcik6CisgICAgZCA9IHt9CisgICAgd2FsbGNsb2NrID0gdGltZS50aW1lCisgICAgc3RhcnQgPSB3YWxsY2xvY2soKQorICAgIHN0b3AgPSB3YWxsY2xvY2soKSArIFRFU1RfVElNRQorICAgIHNwaW5fbG9vcHMgPSByYW5nZSgxMDAwKQorICAgIHdoaWxlIDE6CisgICAgICAgIG5vdyA9IHdhbGxjbG9jaygpCisgICAgICAgIGlmIG5vdyA+PSBzdG9wOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZm9yIGkgaW4gc3Bpbl9sb29wczoKKyAgICAgICAgICAgIGRbdGltZXIoKV0gPSAxCisgICAgdmFsdWVzID0gZC5rZXlzKCkKKyAgICB2YWx1ZXMuc29ydCgpCisgICAgbWluX2RpZmYgPSBURVNUX1RJTUUKKyAgICBmb3IgaSBpbiByYW5nZShsZW4odmFsdWVzKSAtIDEpOgorICAgICAgICBkaWZmID0gdmFsdWVzW2krMV0gLSB2YWx1ZXNbaV0KKyAgICAgICAgaWYgZGlmZiA8IG1pbl9kaWZmOgorICAgICAgICAgICAgbWluX2RpZmYgPSBkaWZmCisgICAgcmV0dXJuIG1pbl9kaWZmCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcHJpbnQgJ0Nsb2NrIHJlc29sdXRpb24gb2YgdmFyaW91cyB0aW1lciBpbXBsZW1lbnRhdGlvbnM6JworICAgIHByaW50ICd0aW1lLmNsb2NrOiAgICAgICAgICAgJTEwLjNmdXMnICUgKGNsb2NrcmVzKHRpbWUuY2xvY2spICogMWU2KQorICAgIHByaW50ICd0aW1lLnRpbWU6ICAgICAgICAgICAgJTEwLjNmdXMnICUgKGNsb2NrcmVzKHRpbWUudGltZSkgKiAxZTYpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc3lzdGltZXMKKyAgICAgICAgcHJpbnQgJ3N5c3RpbWVzLnByb2Nlc3N0aW1lOiAlMTAuM2Z1cycgJSAoY2xvY2tyZXMoc3lzdGltZXMucHJvY2Vzc3RpbWUpICogMWU2KQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9weWJlbmNoLnB5IGIvVG9vbHMvcHliZW5jaC9weWJlbmNoLnB5CmluZGV4IGUwMTEwZDAuLjdkOTBiYTEgMTAwNzU1Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weQorKysgYi9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkKQEAgLTM0LDIwICszNCw3IEBACiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRSAhCiAiIiIKIAotIyBWZXJzaW9uIG51bWJlcgotX192ZXJzaW9uX18gPSAnMS4zJwotCi0jCi0jIE5PVEU6IFVzZSB4cmFuZ2UgZm9yIGFsbCB0ZXN0IGxvb3BzIHVubGVzcyB5b3Ugd2FudCB0byBmYWNlCi0jICAgICAgIGEgMjBNQiBwcm9jZXNzICEKLSMKLSMgQWxsIHRlc3RzIHNob3VsZCBoYXZlIHJvdW5kcyBzZXQgdG8gdmFsdWVzIHNvIHRoYXQgYSBydW4oKQotIyB0YWtlcyBiZXR3ZWVuIDIwLTUwIHNlY29uZHMuIFRoaXMgaXMgdG8gZ2V0IGZhaXJseSBnb29kCi0jIGNsb2NrKCkgdmFsdWVzLiBZb3UgY2FuIHVzZSBvcHRpb24gLXcgdG8gc3BlZWR1cCB0aGUgdGVzdHMKLSMgYnkgYSBmaXhlZCBpbnRlZ2VyIGZhY3RvciAodGhlICJ3YXJwIGZhY3RvciIpLgotIwotCi1pbXBvcnQgc3lzLHRpbWUsb3BlcmF0b3IKK2ltcG9ydCBzeXMsIHRpbWUsIG9wZXJhdG9yLCBzdHJpbmcKIGZyb20gQ29tbWFuZExpbmUgaW1wb3J0ICoKIAogdHJ5OgpAQCAtNTYsNiArNDMsMTExIEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgaW1wb3J0IHBpY2tsZQogCisjIFZlcnNpb24gbnVtYmVyOyB2ZXJzaW9uIGhpc3Rvcnk6IHNlZSBSRUFETUUgZmlsZSAhCitfX3ZlcnNpb25fXyA9ICcyLjAnCisKKyMjIyBDb25zdGFudHMKKworIyBTZWNvbmQgZnJhY3Rpb25zCitNSUxMSV9TRUNPTkRTID0gMWUzCitNSUNST19TRUNPTkRTID0gMWU2CisKKyMgUGVyY2VudCB1bml0CitQRVJDRU5UID0gMTAwCisKKyMgSG9yaXpvbnRhbCBsaW5lIGxlbmd0aAorTElORSA9IDc5CisKKyMgTWluaW11bSB0ZXN0IHJ1bi10aW1lCitNSU5fVEVTVF9SVU5USU1FID0gMWUtMworCisjIE51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zIHRvIHVzZSBmb3IgY2FsaWJyYXRpbmcgdGhlIHRlc3RzCitDQUxJQlJBVElPTl9SVU5TID0gMjAKKworIyBOdW1iZXIgb2YgY2FsaWJyYXRpb24gbG9vcHMgdG8gcnVuIGZvciBlYWNoIGNhbGlicmF0aW9uIHJ1bgorQ0FMSUJSQVRJT05fTE9PUFMgPSAyMAorCisjIEFsbG93IHNraXBwaW5nIGNhbGlicmF0aW9uID8KK0FMTE9XX1NLSVBQSU5HX0NBTElCUkFUSU9OID0gMQorCisjIFRpbWVyIHR5cGVzCitUSU1FUl9USU1FX1RJTUUgPSAndGltZS50aW1lJworVElNRVJfVElNRV9DTE9DSyA9ICd0aW1lLmNsb2NrJworVElNRVJfU1lTVElNRVNfUFJPQ0VTU1RJTUUgPSAnc3lzdGltZXMucHJvY2Vzc3RpbWUnCisKKyMgQ2hvb3NlIHBsYXRmb3JtIGRlZmF1bHQgdGltZXIKK2lmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgIyBPbiBXaW5YUCB0aGlzIGhhcyAyLjVtcyByZXNvbHV0aW9uCisgICAgVElNRVJfUExBVEZPUk1fREVGQVVMVCA9IFRJTUVSX1RJTUVfQ0xPQ0sKK2Vsc2U6CisgICAgIyBPbiBMaW51eCB0aGlzIGhhcyAxbXMgcmVzb2x1dGlvbgorICAgIFRJTUVSX1BMQVRGT1JNX0RFRkFVTFQgPSBUSU1FUl9USU1FX1RJTUUKKworIyBQcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiA/CitfZGVidWcgPSAwCisKKyMjIyBIZWxwZXJzCisKK2RlZiBnZXRfdGltZXIodGltZXJ0eXBlKToKKworICAgIGlmIHRpbWVydHlwZSA9PSBUSU1FUl9USU1FX1RJTUU6CisgICAgICAgIHJldHVybiB0aW1lLnRpbWUKKyAgICBlbGlmIHRpbWVydHlwZSA9PSBUSU1FUl9USU1FX0NMT0NLOgorICAgICAgICByZXR1cm4gdGltZS5jbG9jaworICAgIGVsaWYgdGltZXJ0eXBlID09IFRJTUVSX1NZU1RJTUVTX1BST0NFU1NUSU1FOgorICAgICAgICBpbXBvcnQgc3lzdGltZXMKKyAgICAgICAgcmV0dXJuIHN5c3RpbWVzLnByb2Nlc3N0aW1lCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bmtub3duIHRpbWVyIHR5cGU6ICVzJyAlIHRpbWVydHlwZSkKKworZGVmIGdldF9tYWNoaW5lX2RldGFpbHMoKToKKworICAgIGltcG9ydCBwbGF0Zm9ybQorICAgIGlmIF9kZWJ1ZzoKKyAgICAgICAgcHJpbnQgJ0dldHRpbmcgbWFjaGluZSBkZXRhaWxzLi4uJworICAgIGJ1aWxkbm8sIGJ1aWxkZGF0ZSA9IHBsYXRmb3JtLnB5dGhvbl9idWlsZCgpCisgICAgcHl0aG9uID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQorICAgIGlmIHB5dGhvbiA+ICcyLjAnOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljaHIoMTAwMDAwKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgVUNTMiBidWlsZCAoc3RhbmRhcmQpCisgICAgICAgICAgICB1bmljb2RlID0gJ1VDUzInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVDUzQgYnVpbGQgKG1vc3QgcmVjZW50IExpbnV4IGRpc3Ryb3MpCisgICAgICAgICAgICB1bmljb2RlID0gJ1VDUzQnCisgICAgZWxzZToKKyAgICAgICAgdW5pY29kZSA9IE5vbmUKKyAgICBiaXRzLCBsaW5rYWdlID0gcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKCkKKyAgICByZXR1cm4geworICAgICAgICAncGxhdGZvcm0nOiBwbGF0Zm9ybS5wbGF0Zm9ybSgpLAorICAgICAgICAncHJvY2Vzc29yJzogcGxhdGZvcm0ucHJvY2Vzc29yKCksCisgICAgICAgICdleGVjdXRhYmxlJzogc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICdweXRob24nOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAorICAgICAgICAnY29tcGlsZXInOiBwbGF0Zm9ybS5weXRob25fY29tcGlsZXIoKSwKKyAgICAgICAgJ2J1aWxkbm8nOiBidWlsZG5vLAorICAgICAgICAnYnVpbGRkYXRlJzogYnVpbGRkYXRlLAorICAgICAgICAndW5pY29kZSc6IHVuaWNvZGUsCisgICAgICAgICdiaXRzJzogYml0cywKKyAgICAgICAgfQorCitkZWYgcHJpbnRfbWFjaGluZV9kZXRhaWxzKGQsIGluZGVudD0nJyk6CisKKyAgICBsID0gWydNYWNoaW5lIERldGFpbHM6JywKKyAgICAgICAgICcgICBQbGF0Zm9ybSBJRDogICVzJyAlIGQuZ2V0KCdwbGF0Zm9ybScsICduL2EnKSwKKyAgICAgICAgICcgICBQcm9jZXNzb3I6ICAgICVzJyAlIGQuZ2V0KCdwcm9jZXNzb3InLCAnbi9hJyksCisgICAgICAgICAnJywKKyAgICAgICAgICdQeXRob246JywKKyAgICAgICAgICcgICBFeGVjdXRhYmxlOiAgICVzJyAlIGQuZ2V0KCdleGVjdXRhYmxlJywgJ24vYScpLAorICAgICAgICAgJyAgIFZlcnNpb246ICAgICAgJXMnICUgZC5nZXQoJ3B5dGhvbicsICduL2EnKSwKKyAgICAgICAgICcgICBDb21waWxlcjogICAgICVzJyAlIGQuZ2V0KCdjb21waWxlcicsICduL2EnKSwKKyAgICAgICAgICcgICBCaXRzOiAgICAgICAgICVzJyAlIGQuZ2V0KCdiaXRzJywgJ24vYScpLAorICAgICAgICAgJyAgIEJ1aWxkOiAgICAgICAgJXMgKCMlcyknICUgKGQuZ2V0KCdidWlsZGRhdGUnLCAnbi9hJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5nZXQoJ2J1aWxkbm8nLCAnbi9hJykpLAorICAgICAgICAgJyAgIFVuaWNvZGU6ICAgICAgJXMnICUgZC5nZXQoJ3VuaWNvZGUnLCAnbi9hJyksCisgICAgICAgICBdCisgICAgcHJpbnQgaW5kZW50ICsgc3RyaW5nLmpvaW4obCwgJ1xuJyArIGluZGVudCkgKyAnXG4nCisKICMjIyBUZXN0IGJhc2VjbGFzcwogCiBjbGFzcyBUZXN0OgpAQCAtODQsNyArMTc2LDcgQEAKICAgICAjIFZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZXN0IGFzIGZsb2F0ICh4Lnl5KTsgdGhpcyBpcyBpbXBvcnRhbnQKICAgICAjIGZvciBjb21wYXJpc29ucyBvZiBiZW5jaG1hcmsgcnVucyAtIHRlc3RzIHdpdGggdW5lcXVhbCB2ZXJzaW9uCiAgICAgIyBudW1iZXIgd2lsbCBub3QgZ2V0IGNvbXBhcmVkLgotICAgIHZlcnNpb24gPSAxLjAKKyAgICB2ZXJzaW9uID0gMi4wCiAKICAgICAjIFRoZSBudW1iZXIgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBkb25lIGluIGVhY2ggcm91bmQgb2YgdGhlCiAgICAgIyB0ZXN0LiBBbiBvcGVyYXRpb24gaXMgdGhlIGJhc2ljIHVuaXQgb2Ygd2hhdCB5b3Ugd2FudCB0bwpAQCAtOTcsMzYgKzE4OSwxMjUgQEAKIAogICAgICMgTnVtYmVyIG9mIHJvdW5kcyB0byBleGVjdXRlIHBlciB0ZXN0IHJ1bi4gVGhpcyBzaG91bGQgYmUKICAgICAjIGFkanVzdGVkIHRvIGEgZmlndXJlIHRoYXQgcmVzdWx0cyBpbiBhIHRlc3QgcnVuLXRpbWUgb2YgYmV0d2VlbgotICAgICMgMjAtNTAgc2Vjb25kcy4KLSAgICByb3VuZHMgPSAxMDAwMAorICAgICMgMS0yIHNlY29uZHMuCisgICAgcm91bmRzID0gMTAwMDAwCiAKICAgICAjIyMgSW50ZXJuYWwgdmFyaWFibGVzCiAKICAgICAjIE1hcmsgdGhpcyBjbGFzcyBhcyBpbXBsZW1lbnRpbmcgYSB0ZXN0CiAgICAgaXNfYV90ZXN0ID0gMQogCi0gICAgIyBNaXNjLiBpbnRlcm5hbCB2YXJpYWJsZXMKLSAgICBsYXN0X3RpbWluZyA9ICgwLDAsMCkgIyBsYXN0IHRpbWluZyAocmVhbCxydW4sY2FsaWJyYXRpb24pCi0gICAgd2FycCA9IDEgICAgICAgICAgICAjIHdhcnAgZmFjdG9yIHRoaXMgdGVzdCB1c2VzCi0gICAgY3J1bnMgPSAyMCAgICAgICAgICAjIG51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zCi0gICAgb3ZlcmhlYWQgPSBOb25lICAgICAjIGxpc3Qgb2YgY2FsaWJyYXRpb24gdGltaW5ncworICAgICMgTGFzdCB0aW1pbmc6IChyZWFsLCBydW4sIG92ZXJoZWFkKQorICAgIGxhc3RfdGltaW5nID0gKDAuMCwgMC4wLCAwLjApCiAKLSAgICBkZWYgX19pbml0X18oc2VsZix3YXJwPTEpOgorICAgICMgV2FycCBmYWN0b3IgdG8gdXNlIGZvciB0aGlzIHRlc3QKKyAgICB3YXJwID0gMQogCi0gICAgICAgIGlmIHdhcnAgPiAxOgotICAgICAgICAgICAgc2VsZi5yb3VuZHMgPSBzZWxmLnJvdW5kcyAvIHdhcnAKKyAgICAjIE51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zIHRvIHVzZQorICAgIGNhbGlicmF0aW9uX3J1bnMgPSBDQUxJQlJBVElPTl9SVU5TCisKKyAgICAjIExpc3Qgb2YgY2FsaWJyYXRpb24gdGltaW5ncworICAgIG92ZXJoZWFkX3RpbWVzID0gTm9uZQorCisgICAgIyBMaXN0IG9mIHRlc3QgcnVuIHRpbWluZ3MKKyAgICB0aW1lcyA9IFtdCisKKyAgICAjIFRpbWVyIHVzZWQgZm9yIHRoZSBiZW5jaG1hcmsKKyAgICB0aW1lciA9IFRJTUVSX1BMQVRGT1JNX0RFRkFVTFQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXJwPU5vbmUsIGNhbGlicmF0aW9uX3J1bnM9Tm9uZSwgdGltZXI9Tm9uZSk6CisKKyAgICAgICAgIyBTZXQgcGFyYW1ldGVycworICAgICAgICBpZiB3YXJwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yb3VuZHMgPSBpbnQoc2VsZi5yb3VuZHMgLyB3YXJwKQogICAgICAgICAgICAgaWYgc2VsZi5yb3VuZHMgPT0gMDoKLSAgICAgICAgICAgICAgICBzZWxmLnJvdW5kcyA9IDEKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3YXJwIGZhY3RvciBzZXQgdG9vIGhpZ2gnKQogICAgICAgICAgICAgc2VsZi53YXJwID0gd2FycAorICAgICAgICBpZiBjYWxpYnJhdGlvbl9ydW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgKG5vdCBBTExPV19TS0lQUElOR19DQUxJQlJBVElPTiBhbmQKKyAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbl9ydW5zIDwgMSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYXQgbGVhc3Qgb25lIGNhbGlicmF0aW9uIHJ1biBpcyByZXF1aXJlZCcpCisgICAgICAgICAgICBzZWxmLmNhbGlicmF0aW9uX3J1bnMgPSBjYWxpYnJhdGlvbl9ydW5zCisgICAgICAgIGlmIHRpbWVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGltZXIgPSB0aW1lcgorCisgICAgICAgICMgSW5pdCB2YXJpYWJsZXMKICAgICAgICAgc2VsZi50aW1lcyA9IFtdCi0gICAgICAgIHNlbGYub3ZlcmhlYWQgPSBbXQorICAgICAgICBzZWxmLm92ZXJoZWFkX3RpbWVzID0gW10KKwogICAgICAgICAjIFdlIHdhbnQgdGhlc2UgdG8gYmUgaW4gdGhlIGluc3RhbmNlIGRpY3QsIHNvIHRoYXQgcGlja2xlCiAgICAgICAgICMgc2F2ZXMgdGhlbQogICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLnZlcnNpb24KICAgICAgICAgc2VsZi5vcGVyYXRpb25zID0gc2VsZi5vcGVyYXRpb25zCiAgICAgICAgIHNlbGYucm91bmRzID0gc2VsZi5yb3VuZHMKIAotICAgIGRlZiBydW4oc2VsZiwgY3J1bnMpOgorICAgIGRlZiBnZXRfdGltZXIoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybiB0aGUgdGltZXIgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdGVzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldF90aW1lcihzZWxmLnRpbWVyKQorCisgICAgZGVmIGNvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgorCisgICAgICAgICIiIiBSZXR1cm4gMS8wIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB0ZXN0IGlzIGNvbXBhdGlibGUKKyAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIFRlc3QgaW5zdGFuY2Ugb3Igbm90LgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnZlcnNpb24gIT0gb3RoZXIudmVyc2lvbjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGlmIHNlbGYucm91bmRzICE9IG90aGVyLnJvdW5kczoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgY2FsaWJyYXRlX3Rlc3Qoc2VsZik6CisKKyAgICAgICAgaWYgc2VsZi5jYWxpYnJhdGlvbl9ydW5zID09IDA6CisgICAgICAgICAgICBzZWxmLm92ZXJoZWFkX3RpbWVzID0gWzAuMF0KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNhbGlicmF0ZSA9IHNlbGYuY2FsaWJyYXRlCisgICAgICAgIHRpbWVyID0gc2VsZi5nZXRfdGltZXIoKQorICAgICAgICBjYWxpYnJhdGlvbl9sb29wcyA9IHJhbmdlKENBTElCUkFUSU9OX0xPT1BTKQorCisgICAgICAgICMgVGltZSB0aGUgY2FsaWJyYXRpb24gbG9vcCBvdmVyaGVhZAorICAgICAgICBwcmVwX3RpbWVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5jYWxpYnJhdGlvbl9ydW5zKToKKyAgICAgICAgICAgIHQgPSB0aW1lcigpCisgICAgICAgICAgICBmb3IgaSBpbiBjYWxpYnJhdGlvbl9sb29wczoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0ID0gdGltZXIoKSAtIHQKKyAgICAgICAgICAgIHByZXBfdGltZXMuYXBwZW5kKHQpCisgICAgICAgIG1pbl9wcmVwX3RpbWUgPSBtaW4ocHJlcF90aW1lcykKKyAgICAgICAgaWYgX2RlYnVnOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICdDYWxpYi4gcHJlcCB0aW1lICAgICA9ICUuNmZtcycgJSAoCisgICAgICAgICAgICAgICAgbWluX3ByZXBfdGltZSAqIE1JTExJX1NFQ09ORFMpCisKKyAgICAgICAgIyBUaW1lIHRoZSBjYWxpYnJhdGlvbiBydW5zIChkb2luZyBDQUxJQlJBVElPTl9MT09QUyBsb29wcyBvZgorICAgICAgICAjIC5jYWxpYnJhdGUoKSBtZXRob2QgY2FsbHMgZWFjaCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5jYWxpYnJhdGlvbl9ydW5zKToKKyAgICAgICAgICAgIHQgPSB0aW1lcigpCisgICAgICAgICAgICBmb3IgaSBpbiBjYWxpYnJhdGlvbl9sb29wczoKKyAgICAgICAgICAgICAgICBjYWxpYnJhdGUoKQorICAgICAgICAgICAgdCA9IHRpbWVyKCkgLSB0CisgICAgICAgICAgICBzZWxmLm92ZXJoZWFkX3RpbWVzLmFwcGVuZCh0IC8gQ0FMSUJSQVRJT05fTE9PUFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWluX3ByZXBfdGltZSkKKworICAgICAgICAjIENoZWNrIHRoZSBtZWFzdXJlZCB0aW1lcworICAgICAgICBtaW5fb3ZlcmhlYWQgPSBtaW4oc2VsZi5vdmVyaGVhZF90aW1lcykKKyAgICAgICAgbWF4X292ZXJoZWFkID0gbWF4KHNlbGYub3ZlcmhlYWRfdGltZXMpCisgICAgICAgIGlmIF9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICdDYWxpYi4gb3ZlcmhlYWQgdGltZSA9ICUuNmZtcycgJSAoCisgICAgICAgICAgICAgICAgbWluX292ZXJoZWFkICogTUlMTElfU0VDT05EUykKKyAgICAgICAgaWYgbWluX292ZXJoZWFkIDwgMC4wOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2FsaWJyYXRpb24gc2V0dXAgZGlkIG5vdCB3b3JrJykKKyAgICAgICAgaWYgbWF4X292ZXJoZWFkIC0gbWluX292ZXJoZWFkID4gMC4xOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAnb3ZlcmhlYWQgY2FsaWJyYXRpb24gdGltaW5nIHJhbmdlIHRvbyBpbmFjY3VyYXRlOiAnCisgICAgICAgICAgICAgICAgJyVyIC0gJXInICUgKG1pbl9vdmVyaGVhZCwgbWF4X292ZXJoZWFkKSkKKworICAgIGRlZiBydW4oc2VsZik6CiAKICAgICAgICAgIiIiIFJ1biB0aGUgdGVzdCBpbiB0d28gcGhhc2VzOiBmaXJzdCBjYWxpYnJhdGUsIHRoZW4KICAgICAgICAgICAgIGRvIHRoZSBhY3R1YWwgdGVzdC4gQmUgY2FyZWZ1bCB0byBrZWVwIHRoZSBjYWxpYnJhdGlvbgpAQCAtMTM0LDI3ICszMTUsMjMgQEAKIAogICAgICAgICAiIiIKICAgICAgICAgdGVzdCA9IHNlbGYudGVzdAotICAgICAgICBjYWxpYnJhdGUgPSBzZWxmLmNhbGlicmF0ZQotICAgICAgICBjbG9jayA9IHRpbWUuY2xvY2sKLSAgICAgICAgIyBmaXJzdCBjYWxpYnJhdGUKLSAgICAgICAgdCA9IGNsb2NrKCkKLSAgICAgICAgY2FsaWJyYXRlKCkKLSAgICAgICAgb2Zmc2V0ID0gY2xvY2soKSAtIHQKLSAgICAgICAgaWYgY3J1bnM6Ci0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjcnVucy0xKToKLSAgICAgICAgICAgICAgICB0ID0gY2xvY2soKQotICAgICAgICAgICAgICAgIGNhbGlicmF0ZSgpCi0gICAgICAgICAgICAgICAgdCA9IGNsb2NrKCkgLSB0Ci0gICAgICAgICAgICAgICAgaWYgdCA8IG9mZnNldDoKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdAotICAgICAgICAjIG5vdyB0aGUgcmVhbCB0aGluZwotICAgICAgICB0ID0gY2xvY2soKQorICAgICAgICB0aW1lciA9IHNlbGYuZ2V0X3RpbWVyKCkKKworICAgICAgICAjIEdldCBjYWxpYnJhdGlvbgorICAgICAgICBtaW5fb3ZlcmhlYWQgPSBtaW4oc2VsZi5vdmVyaGVhZF90aW1lcykKKworICAgICAgICAjIFRlc3QgcnVuCisgICAgICAgIHQgPSB0aW1lcigpCiAgICAgICAgIHRlc3QoKQotICAgICAgICB0ID0gY2xvY2soKSAtIHQKLSAgICAgICAgaWYgdCA8IDAuMDE6Ci0gICAgICAgICAgICBzeXMuZXhpdCgiTG93ZXIgd2FycCByZXF1aXJlZDogdGVzdCB0aW1lcyA8IDEwIG1zIGFyZSB1bnJlbGlhYmxlIikKLSAgICAgICAgc2VsZi5sYXN0X3RpbWluZyA9ICh0LW9mZnNldCx0LG9mZnNldCkKLSAgICAgICAgc2VsZi50aW1lcy5hcHBlbmQodC1vZmZzZXQpCisgICAgICAgIHQgPSB0aW1lcigpIC0gdAorICAgICAgICBpZiB0IDwgTUlOX1RFU1RfUlVOVElNRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3dhcnAgZmFjdG9yIHRvbyBoaWdoOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHRpbWVzIGFyZSA8IDEwbXMnKQorICAgICAgICBlZmZfdGltZSA9IHQgLSBtaW5fb3ZlcmhlYWQKKyAgICAgICAgaWYgZWZmX3RpbWUgPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd3JvbmcgY2FsaWJyYXRpb24nKQorICAgICAgICBzZWxmLmxhc3RfdGltaW5nID0gKGVmZl90aW1lLCB0LCBtaW5fb3ZlcmhlYWQpCisgICAgICAgIHNlbGYudGltZXMuYXBwZW5kKGVmZl90aW1lKQogCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIApAQCAtMTc2LDMzICszNTMsMzMgQEAKICAgICAgICAgICAgIHNlbGYub3BlcmF0aW9ucyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBlYWNoLgogCiAgICAgICAgICIiIgotICAgICAgICAjIGRvIHNvbWUgdGVzdHMKICAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgc3RhdChzZWxmKToKIAotICAgICAgICAiIiIgUmV0dXJucyBmb3VyIHZhbHVlczoKLSAgICAgICAgbWluaW11bSByb3VuZCB0aW1lCi0gICAgICAgIGF2ZXJhZ2UgdGltZSBwZXIgcm91bmQKLSAgICAgICAgYXZlcmFnZSB0aW1lIHBlciBvcGVyYXRpb24KLSAgICAgICAgYXZlcmFnZSBvdmVyaGVhZCB0aW1lCisgICAgICAgICIiIiBSZXR1cm4gdGVzdCBydW4gc3RhdGlzdGljcyBhcyB0dXBsZToKIAotICAgICAgICBYWFggU2hvdWxkIHRoaXMgdGFrZSB3YXJwIGZhY3RvcnMgaW50byBhY2NvdW50PworICAgICAgICAgICAgKG1pbmltdW0gcnVuIHRpbWUsCisgICAgICAgICAgICAgYXZlcmFnZSBydW4gdGltZSwKKyAgICAgICAgICAgICB0b3RhbCBydW4gdGltZSwKKyAgICAgICAgICAgICBhdmVyYWdlIHRpbWUgcGVyIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICBtaW5pbXVtIG92ZXJoZWFkIHRpbWUpCisKICAgICAgICAgIiIiCiAgICAgICAgIHJ1bnMgPSBsZW4oc2VsZi50aW1lcykKICAgICAgICAgaWYgcnVucyA9PSAwOgotICAgICAgICAgICAgcmV0dXJuIDAsMAotICAgICAgICBtaW50aW1lID0gbWluKHNlbGYudGltZXMpCi0gICAgICAgIHRvdGFsdGltZSA9IHJlZHVjZShvcGVyYXRvci5hZGQsc2VsZi50aW1lcywwLjApCi0gICAgICAgIGF2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMpCi0gICAgICAgIG9wX2F2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMgKiBzZWxmLnJvdW5kcyAqIHNlbGYub3BlcmF0aW9ucykKLSAgICAgICAgaWYgc2VsZi5vdmVyaGVhZDoKLSAgICAgICAgICAgIHRvdGFsb3ZlcmhlYWQgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLHNlbGYub3ZlcmhlYWQsMC4wKQotICAgICAgICAgICAgb3ZfYXZnID0gdG90YWxvdmVyaGVhZCAvIGZsb2F0KHJ1bnMpCisgICAgICAgICAgICByZXR1cm4gMC4wLCAwLjAsIDAuMCwgMC4wCisgICAgICAgIG1pbl90aW1lID0gbWluKHNlbGYudGltZXMpCisgICAgICAgIHRvdGFsX3RpbWUgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLCBzZWxmLnRpbWVzLCAwLjApCisgICAgICAgIGF2Z190aW1lID0gdG90YWxfdGltZSAvIGZsb2F0KHJ1bnMpCisgICAgICAgIG9wZXJhdGlvbl9hdmcgPSB0b3RhbF90aW1lIC8gZmxvYXQocnVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VsZi5yb3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbGYub3BlcmF0aW9ucykKKyAgICAgICAgaWYgc2VsZi5vdmVyaGVhZF90aW1lczoKKyAgICAgICAgICAgIG1pbl9vdmVyaGVhZCA9IG1pbihzZWxmLm92ZXJoZWFkX3RpbWVzKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyB1c2Ugc2VsZi5sYXN0X3RpbWluZyAtIG5vdCB0b28gYWNjdXJhdGUKLSAgICAgICAgICAgIG92X2F2ZyA9IHNlbGYubGFzdF90aW1pbmdbMl0KLSAgICAgICAgcmV0dXJuIG1pbnRpbWUsIGF2Zywgb3BfYXZnLCBvdl9hdmcKKyAgICAgICAgICAgIG1pbl9vdmVyaGVhZCA9IHNlbGYubGFzdF90aW1pbmdbMl0KKyAgICAgICAgcmV0dXJuIG1pbl90aW1lLCBhdmdfdGltZSwgdG90YWxfdGltZSwgb3BlcmF0aW9uX2F2ZywgbWluX292ZXJoZWFkCiAKICMjIyBMb2FkIFNldHVwCiAKQEAgLTIxNSwxNTMgKzM5MiwzNTMgQEAKIAogY2xhc3MgQmVuY2htYXJrOgogCi0gICAgbmFtZSA9ICc/JyAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiB0aGUgYmVuY2htYXJrCi0gICAgcm91bmRzID0gMSAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHJvdW5kcyB0byBydW4KKyAgICAjIE5hbWUgb2YgdGhlIGJlbmNobWFyaworICAgIG5hbWUgPSAnJworCisgICAgIyBOdW1iZXIgb2YgYmVuY2htYXJrIHJvdW5kcyB0byBydW4KKyAgICByb3VuZHMgPSAxCisKKyAgICAjIFdhcnAgZmFjdG9yIHVzZSB0byBydW4gdGhlIHRlc3RzCiAgICAgd2FycCA9IDEgICAgICAgICAgICAgICAgICAgICMgV2FycCBmYWN0b3IKLSAgICByb3VuZHRpbWUgPSAwICAgICAgICAgICAgICAgIyBBdmVyYWdlIHJvdW5kIHRpbWUKLSAgICB2ZXJzaW9uID0gTm9uZSAgICAgICAgICAgICAgIyBCZW5jaG1hcmsgdmVyc2lvbiBudW1iZXIgKHNlZSBfX2luaXRfXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBmbG9hdCB4Lnl5CiAKLSAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIyBBdmVyYWdlIGJlbmNobWFyayByb3VuZCB0aW1lCisgICAgcm91bmR0aW1lID0gMAogCi0gICAgICAgIHNlbGYudGVzdHMgPSB7fQotICAgICAgICBzZWxmLnZlcnNpb24gPSAwLjMxCisgICAgIyBCZW5jaG1hcmsgdmVyc2lvbiBudW1iZXIgYXMgZmxvYXQgeC55eQorICAgIHZlcnNpb24gPSAyLjAKIAotICAgIGRlZiBsb2FkX3Rlc3RzKHNlbGYsIHNldHVwbW9kLCB3YXJwPTEsIGxpbWl0bmFtZXM9IiIsIHZlcmJvc2U9MCk6CisgICAgIyBQcm9kdWNlIHZlcmJvc2Ugb3V0cHV0ID8KKyAgICB2ZXJib3NlID0gMAogCi0gICAgICAgIHNlbGYud2FycCA9IHdhcnAKLSAgICAgICAgaWYgbGltaXRuYW1lczoKLSAgICAgICAgICAgIGxpbWl0bmFtZXMgPSByZS5jb21waWxlKGxpbWl0bmFtZXMsIHJlLkkpCisgICAgIyBEaWN0aW9uYXJ5IHdpdGggdGhlIG1hY2hpbmUgZGV0YWlscworICAgIG1hY2hpbmVfZGV0YWlscyA9IE5vbmUKKworICAgICMgVGltZXIgdXNlZCBmb3IgdGhlIGJlbmNobWFyaworICAgIHRpbWVyID0gVElNRVJfUExBVEZPUk1fREVGQVVMVAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZlcmJvc2U9Tm9uZSwgdGltZXI9Tm9uZSwgd2FycD1Ob25lLAorICAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbl9ydW5zPU5vbmUpOgorCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsaW1pdG5hbWVzID0gTm9uZQotICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMKLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICdTZWFyY2hpbmcgZm9yIHRlc3RzIC4uLicsCi0gICAgICAgIHNldHVwbW9kLl9fZGljdF9fLnZhbHVlcygpCi0gICAgICAgIGZvciBjIGluIHNldHVwbW9kLl9fZGljdF9fLnZhbHVlcygpOgotICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoYywnaXNfYV90ZXN0Jyk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSAnJTA0aS0lMDJpLSUwMmkgJTAyaTolMDJpOiUwMmknICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUubG9jYWx0aW1lKHRpbWUudGltZSgpKVs6Nl0pCisgICAgICAgIGlmIHZlcmJvc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIGlmIHRpbWVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50aW1lciA9IHRpbWVyCisgICAgICAgIGlmIHdhcnAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndhcnAgPSB3YXJwCisgICAgICAgIGlmIGNhbGlicmF0aW9uX3J1bnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNhbGlicmF0aW9uX3J1bnMgPSBjYWxpYnJhdGlvbl9ydW5zCisKKyAgICAgICAgIyBJbml0IHZhcnMKKyAgICAgICAgc2VsZi50ZXN0cyA9IHt9CisgICAgICAgIGlmIF9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICdHZXR0aW5nIG1hY2hpbmUgZGV0YWlscy4uLicKKyAgICAgICAgc2VsZi5tYWNoaW5lX2RldGFpbHMgPSBnZXRfbWFjaGluZV9kZXRhaWxzKCkKKworICAgICAgICAjIE1ha2UgLnZlcnNpb24gYW4gaW5zdGFuY2UgYXR0cmlidXRlIHRvIGhhdmUgaXQgc2F2ZWQgaW4gdGhlCisgICAgICAgICMgQmVuY2htYXJrIHBpY2tsZQorICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLnZlcnNpb24KKworICAgIGRlZiBnZXRfdGltZXIoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybiB0aGUgdGltZXIgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdGVzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldF90aW1lcihzZWxmLnRpbWVyKQorCisgICAgZGVmIGNvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgorCisgICAgICAgICIiIiBSZXR1cm4gMS8wIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBiZW5jaG1hcmsgaXMKKyAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCB0aGUgb3RoZXIgQmVuY2htYXJrIGluc3RhbmNlIG9yIG5vdC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uICE9IG90aGVyLnZlcnNpb246CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiAoc2VsZi5tYWNoaW5lX2RldGFpbHMgPT0gb3RoZXIubWFjaGluZV9kZXRhaWxzIGFuZAorICAgICAgICAgICAgc2VsZi50aW1lciAhPSBvdGhlci50aW1lcik6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiAoc2VsZi5jYWxpYnJhdGlvbl9ydW5zID09IDAgYW5kCisgICAgICAgICAgICBvdGhlci5jYWxpYnJhdGlvbl9ydW5zICE9IDApOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgKHNlbGYuY2FsaWJyYXRpb25fcnVucyAhPSAwIGFuZAorICAgICAgICAgICAgb3RoZXIuY2FsaWJyYXRpb25fcnVucyA9PSAwKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgbG9hZF90ZXN0cyhzZWxmLCBzZXR1cG1vZCwgbGltaXRuYW1lcz1Ob25lKToKKworICAgICAgICAjIEFkZCB0ZXN0cworICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnU2VhcmNoaW5nIGZvciB0ZXN0cyAuLi4nCisgICAgICAgICAgICBwcmludCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgIGZvciB0ZXN0Y2xhc3MgaW4gc2V0dXBtb2QuX19kaWN0X18udmFsdWVzKCk6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cih0ZXN0Y2xhc3MsICdpc19hX3Rlc3QnKToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgbmFtZSA9IGMuX19uYW1lX18KKyAgICAgICAgICAgIG5hbWUgPSB0ZXN0Y2xhc3MuX19uYW1lX18KICAgICAgICAgICAgIGlmICBuYW1lID09ICdUZXN0JzoKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbGltaXRuYW1lcyBpcyBub3QgTm9uZSBhbmQgbGltaXRuYW1lcy5zZWFyY2gobmFtZSkgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIChsaW1pdG5hbWVzIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIGxpbWl0bmFtZXMuc2VhcmNoKG5hbWUpIGlzIE5vbmUpOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICB0ZXN0c1tuYW1lXSA9IGMod2FycCkKLSAgICAgICAgbCA9IHRlc3RzLmtleXMoKQorICAgICAgICAgICAgc2VsZi50ZXN0c1tuYW1lXSA9IHRlc3RjbGFzcygKKyAgICAgICAgICAgICAgICB3YXJwPXNlbGYud2FycCwKKyAgICAgICAgICAgICAgICBjYWxpYnJhdGlvbl9ydW5zPXNlbGYuY2FsaWJyYXRpb25fcnVucywKKyAgICAgICAgICAgICAgICB0aW1lcj1zZWxmLnRpbWVyKQorICAgICAgICBsID0gc2VsZi50ZXN0cy5rZXlzKCkKICAgICAgICAgbC5zb3J0KCkKLSAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbDoKKyAgICAgICAgICAgICAgICBwcmludCAnICAlcycgJSBuYW1lCisgICAgICAgICAgICBwcmludCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgICAgICBwcmludCAnICAlaSB0ZXN0cyBmb3VuZCcgJSBsZW4obCkKICAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICBmb3IgdCBpbiBsOgotICAgICAgICAgICAgICAgIHByaW50ICcgICcsIHQKLSAgICAgICAgICAgIHByaW50IGxlbihsKSwgInRlc3RzIGZvdW5kIgorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBwcmludCAnQ2FsaWJyYXRpbmcgdGVzdHMuIFBsZWFzZSB3YWl0Li4uJworICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgJ1Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gICAgICBtYXgnCisgICAgICAgICAgICBwcmludCAnLScgKiBMSU5FCisgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCisgICAgICAgIHRlc3RzLnNvcnQoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4odGVzdHMpKToKKyAgICAgICAgICAgIG5hbWUsIHRlc3QgPSB0ZXN0c1tpXQorICAgICAgICAgICAgdGVzdC5jYWxpYnJhdGVfdGVzdCgpCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICAlNi4zZm1zICAlNi4zZm1zJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWluKHRlc3Qub3ZlcmhlYWRfdGltZXMpICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4KHRlc3Qub3ZlcmhlYWRfdGltZXMpICogTUlMTElfU0VDT05EUykKICAgICAgICAgcHJpbnQKIAotICAgIGRlZiBydW4oc2VsZiwgdmVyYm9zZSwgY3J1bnMpOgorICAgIGRlZiBydW4oc2VsZik6CiAKICAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKICAgICAgICAgdGVzdHMuc29ydCgpCi0gICAgICAgIGNsb2NrID0gdGltZS5jbG9jawotICAgICAgICBwcmludCAnUnVubmluZyAlaSByb3VuZChzKSBvZiB0aGUgc3VpdGUgYXQgd2FycCBmYWN0b3IgJWk6JyAlIChzZWxmLnJvdW5kcywgc2VsZi53YXJwKQorICAgICAgICB0aW1lciA9IHNlbGYuZ2V0X3RpbWVyKCkKKyAgICAgICAgcHJpbnQgJ1J1bm5pbmcgJWkgcm91bmQocykgb2YgdGhlIHN1aXRlIGF0IHdhcnAgZmFjdG9yICVpOicgJSBcCisgICAgICAgICAgICAgIChzZWxmLnJvdW5kcywgc2VsZi53YXJwKQogICAgICAgICBwcmludAotICAgICAgICByb3VuZHRpbWUgPSBjbG9jaygpCisgICAgICAgIHNlbGYucm91bmR0aW1lcyA9IFtdCiAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYucm91bmRzKToKLSAgICAgICAgICAgIHJvdW5kc3RhcnR0aW1lID0gY2xvY2soKQotICAgICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgICAgICBwcmludCAnIFJvdW5kICUtMjVpICByZWFsICAgYWJzICAgIG92ZXJoZWFkJyAlIChpKzEpCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyBSb3VuZCAlLTI1aSAgZWZmZWN0aXZlICAgYWJzb2x1dGUgIG92ZXJoZWFkJyAlIChpKzEpCisgICAgICAgICAgICB0b3RhbF9lZmZfdGltZSA9IDAuMAogICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHRlc3RzKSk6Ci0gICAgICAgICAgICAgICAgbmFtZSwgdCA9IHRlc3RzW2pdCi0gICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBuYW1lLCB0ZXN0ID0gdGVzdHNbal0KKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgIHByaW50ICclMzBzOicgJSBuYW1lLAotICAgICAgICAgICAgICAgIHQucnVuKGNydW5zKQotICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICcgICUuM2ZyICUuM2ZhICUuM2ZvJyAlIHQubGFzdF90aW1pbmcKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi0gICAgICAgICAgICAgICAgcHJpbnQgJyAgICAgICAgICAgIEF2ZXJhZ2Ugcm91bmQgdGltZTogICAgICAlLjNmIHNlY29uZHMnICUgXAotICAgICAgICAgICAgICAgICAgICAoKGNsb2NrKCkgLSByb3VuZHRpbWUpLyhpKzEpKQorICAgICAgICAgICAgICAgIHRlc3QucnVuKCkKKyAgICAgICAgICAgICAgICAoZWZmX3RpbWUsIGFic190aW1lLCBtaW5fb3ZlcmhlYWQpID0gdGVzdC5sYXN0X3RpbWluZworICAgICAgICAgICAgICAgIHRvdGFsX2VmZl90aW1lID0gdG90YWxfZWZmX3RpbWUgKyBlZmZfdGltZQorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgICAlNS4wZm1zICAgICU1LjBmbXMgJTcuM2ZtcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChlZmZfdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNfdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fb3ZlcmhlYWQgKiBNSUxMSV9TRUNPTkRTKQorICAgICAgICAgICAgc2VsZi5yb3VuZHRpbWVzLmFwcGVuZCh0b3RhbF9lZmZfdGltZSkKKyAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAoJyAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKQorICAgICAgICAgICAgICAgIHByaW50ICgnICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgVG90YWxzOiAgICAlNi4wZm1zJyAlCisgICAgICAgICAgICAgICAgICAgICAgICh0b3RhbF9lZmZfdGltZSAqIE1JTExJX1NFQ09ORFMpKQogICAgICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICclZCBkb25lIGluICUuM2Ygc2Vjb25kcycgJSAoaSsxLCAoY2xvY2soKSAtIHJvdW5kc3RhcnR0aW1lKSkKLSAgICAgICAgc2VsZi5yb3VuZHRpbWUgPSAoY2xvY2soKSAtIHJvdW5kdGltZSkgLyBzZWxmLnJvdW5kcworICAgICAgICAgICAgICAgIHByaW50ICcqIFJvdW5kICVpIGRvbmUgaW4gJS4zZiBzZWNvbmRzLicgJSAoaSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZWZmX3RpbWUpCiAgICAgICAgIHByaW50CiAKLSAgICBkZWYgcHJpbnRfc3RhdChzZWxmLCBjb21wYXJlX3RvPU5vbmUsIGhpZGVub2lzZT0wKToKKyAgICBkZWYgc3RhdChzZWxmKToKIAotICAgICAgICBpZiBub3QgY29tcGFyZV90bzoKLSAgICAgICAgICAgIHByaW50ICclLTMwcyAgICAgICBtaW4gcnVuICAgIGF2ZyBydW4gICAgcGVyIG9wcm4gIG92ZXJoZWFkJyAlICdUZXN0czonCi0gICAgICAgICAgICBwcmludCAnLScqNzcKLSAgICAgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCi0gICAgICAgICAgICB0ZXN0cy5zb3J0KCkKLSAgICAgICAgICAgIHRvdGFsbWludGltZSA9IDAKLSAgICAgICAgICAgIGZvciBuYW1lLHQgaW4gdGVzdHM6Ci0gICAgICAgICAgICAgICAgbWludGltZSxhdmcsb3BfYXZnLG92X2F2ZyA9IHQuc3RhdCgpCi0gICAgICAgICAgICAgICAgdG90YWxtaW50aW1lICs9IG1pbnRpbWUKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTkuMmYgbXMgJTkuMmYgbXMgJTYuMmYgdXMgICU2LjJmJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAobmFtZSxtaW50aW1lKjEwMDAuMCxhdmcqMTAwMC4wLG9wX2F2ZyoxMDAwMDAwLjAsb3ZfYXZnKjEwMDAuMCkKLSAgICAgICAgICAgIHByaW50ICctJyo3NwotICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU5LjJmIG1zJyAlIFwKLSAgICAgICAgICAgICAgICAgICgnTm90aW9uYWwgbWluaW11bSByb3VuZCB0aW1lJywgdG90YWxtaW50aW1lICogMTAwMC4wKQorICAgICAgICAiIiIgUmV0dXJuIGJlbmNobWFyayBydW4gc3RhdGlzdGljcyBhcyB0dXBsZToKIAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ0NvbXBhcmluZyB3aXRoOiAlcyAocm91bmRzPSVpLCB3YXJwPSVpKScgJSBcCi0gICAgICAgICAgICAgICAgICAoY29tcGFyZV90by5uYW1lLGNvbXBhcmVfdG8ucm91bmRzLGNvbXBhcmVfdG8ud2FycCkKLSAgICAgICAgICAgIHByaW50ICclLTMwcyAgICAgIG1pbiBydW4gICAgIGNtcCBydW4gICAgIGF2ZyBydW4gICAgICBkaWZmJyAlIFwKLSAgICAgICAgICAgICAgICAgICdUZXN0czonCi0gICAgICAgICAgICBwcmludCAnLScqNzcKLSAgICAgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCi0gICAgICAgICAgICB0ZXN0cy5zb3J0KCkKLSAgICAgICAgICAgIGNvbXBhdGlibGUgPSAxCi0gICAgICAgICAgICB0b3RhbG1pbnRpbWUgPSBvdGhlcl90b3RhbG1pbnRpbWUgPSAwCi0gICAgICAgICAgICBmb3IgbmFtZSwgdCBpbiB0ZXN0czoKLSAgICAgICAgICAgICAgICBtaW50aW1lLCBhdmcsIG9wX2F2Zywgb3ZfYXZnID0gdC5zdGF0KCkKLSAgICAgICAgICAgICAgICB0b3RhbG1pbnRpbWUgKz0gbWludGltZQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBjb21wYXJlX3RvLnRlc3RzW25hbWVdCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgICAgICBvdGhlciA9IE5vbmUKLSAgICAgICAgICAgICAgICBpZiBvdGhlciBhbmQgb3RoZXIudmVyc2lvbiA9PSB0LnZlcnNpb24gYW5kIFwKLSAgICAgICAgICAgICAgICAgICBvdGhlci5vcGVyYXRpb25zID09IHQub3BlcmF0aW9uczoKLSAgICAgICAgICAgICAgICAgICAgbWludGltZTEsIGF2ZzEsIG9wX2F2ZzEsIG92X2F2ZzEgPSBvdGhlci5zdGF0KCkKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxtaW50aW1lICs9IG1pbnRpbWUxCi0gICAgICAgICAgICAgICAgICAgIGRpZmYgPSAoKG1pbnRpbWUqc2VsZi53YXJwKS8obWludGltZTEqb3RoZXIud2FycCkgLSAxLjApKjEwMC4wCi0gICAgICAgICAgICAgICAgICAgIGlmIGhpZGVub2lzZSBhbmQgYWJzKHFvcF9hdmcpIDwgMTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gJycKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSAnJSs3LjJmJSUnICUgZGlmZgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHFhdmcsIGRpZmYgPSAnbi9hJywgJ24vYScKLSAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9IDAKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTguMmYgbXMgJTguMmYgbXMgJTguMmYgbXMgICU4cycgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKG5hbWUsbWludGltZSoxMDAwLjAsbWludGltZTEqMTAwMC4wICogY29tcGFyZV90by53YXJwL3NlbGYud2FycCwgYXZnKjEwMDAuMCxkaWZmKQotICAgICAgICAgICAgcHJpbnQgJy0nKjc3Ci0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFN1bW1hcmlzZSB0ZXN0IHJlc3VsdHMKLSAgICAgICAgICAgICMKLSAgICAgICAgICAgIGlmIGNvbXBhdGlibGUgYW5kIGNvbXBhcmVfdG8ucm91bmR0aW1lID4gMCBhbmQgXAotICAgICAgICAgICAgICAgY29tcGFyZV90by52ZXJzaW9uID09IHNlbGYudmVyc2lvbjoKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTguMmYgbXMgJTguMmYgbXMgICAgICAgICAgICAgICUrNy4yZiUlJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoJ05vdGlvbmFsIG1pbmltdW0gcm91bmQgdGltZScsIHRvdGFsbWludGltZSAqIDEwMDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90b3RhbG1pbnRpbWUgKiAxMDAwLjAgKiBjb21wYXJlX3RvLndhcnAvc2VsZi53YXJwLAotICAgICAgICAgICAgICAgICAgICAgICAoKHRvdGFsbWludGltZSpzZWxmLndhcnApLwotICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyX3RvdGFsbWludGltZSpjb21wYXJlX3RvLndhcnApLTEuMCkqMTAwLjApCisgICAgICAgICAgICAobWluaW11bSByb3VuZCB0aW1lLAorICAgICAgICAgICAgIGF2ZXJhZ2Ugcm91bmQgdGltZSwKKyAgICAgICAgICAgICBtYXhpbXVtIHJvdW5kIHRpbWUpCisKKyAgICAgICAgICAgIFhYWCBDdXJyZW50bHkgbm90IHVzZWQsIHNpbmNlIHRoZSBiZW5jaG1hcmsgZG9lcyB0ZXN0CisgICAgICAgICAgICAgICAgc3RhdGlzdGljcyBhY3Jvc3MgYWxsIHJvdW5kcy4KKworICAgICAgICAiIiIKKyAgICAgICAgcnVucyA9IGxlbihzZWxmLnJvdW5kdGltZXMpCisgICAgICAgIGlmIHJ1bnMgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAwLjAsIDAuMAorICAgICAgICBtaW5fdGltZSA9IG1pbihzZWxmLnJvdW5kdGltZXMpCisgICAgICAgIHRvdGFsX3RpbWUgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLCBzZWxmLnJvdW5kdGltZXMsIDAuMCkKKyAgICAgICAgYXZnX3RpbWUgPSB0b3RhbF90aW1lIC8gZmxvYXQocnVucykKKyAgICAgICAgbWF4X3RpbWUgPSBtYXgoc2VsZi5yb3VuZHRpbWVzKQorICAgICAgICByZXR1cm4gKG1pbl90aW1lLCBhdmdfdGltZSwgbWF4X3RpbWUpCisKKyAgICBkZWYgcHJpbnRfaGVhZGVyKHNlbGYsIHRpdGxlPSdCZW5jaG1hcmsnKToKKworICAgICAgICBwcmludCAnLScgKiBMSU5FCisgICAgICAgIHByaW50ICclczogJXMnICUgKHRpdGxlLCBzZWxmLm5hbWUpCisgICAgICAgIHByaW50ICctJyAqIExJTkUKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJyAgICBSb3VuZHM6ICVzJyAlIHNlbGYucm91bmRzCisgICAgICAgIHByaW50ICcgICAgV2FycDogICAlcycgJSBzZWxmLndhcnAKKyAgICAgICAgcHJpbnQgJyAgICBUaW1lcjogICVzJyAlIHNlbGYudGltZXIKKyAgICAgICAgcHJpbnQKKyAgICAgICAgaWYgc2VsZi5tYWNoaW5lX2RldGFpbHM6CisgICAgICAgICAgICBwcmludF9tYWNoaW5lX2RldGFpbHMoc2VsZi5tYWNoaW5lX2RldGFpbHMsIGluZGVudD0nICAgICcpCisgICAgICAgICAgICBwcmludAorCisgICAgZGVmIHByaW50X2JlbmNobWFyayhzZWxmLCBoaWRlbm9pc2U9MCwgbGltaXRuYW1lcz1Ob25lKToKKworICAgICAgICBwcmludCAoJ1Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICcgICBtaW5pbXVtICBhdmVyYWdlICBvcGVyYXRpb24gIG92ZXJoZWFkJykKKyAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQorICAgICAgICB0ZXN0cy5zb3J0KCkKKyAgICAgICAgdG90YWxfbWluX3RpbWUgPSAwLjAKKyAgICAgICAgdG90YWxfYXZnX3RpbWUgPSAwLjAKKyAgICAgICAgZm9yIG5hbWUsIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpZiAobGltaXRuYW1lcyBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBsaW1pdG5hbWVzLnNlYXJjaChuYW1lKSBpcyBOb25lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgKG1pbl90aW1lLAorICAgICAgICAgICAgIGF2Z190aW1lLAorICAgICAgICAgICAgIHRvdGFsX3RpbWUsCisgICAgICAgICAgICAgb3BfYXZnLAorICAgICAgICAgICAgIG1pbl9vdmVyaGVhZCkgPSB0ZXN0LnN0YXQoKQorICAgICAgICAgICAgdG90YWxfbWluX3RpbWUgPSB0b3RhbF9taW5fdGltZSArIG1pbl90aW1lCisgICAgICAgICAgICB0b3RhbF9hdmdfdGltZSA9IHRvdGFsX2F2Z190aW1lICsgYXZnX3RpbWUKKyAgICAgICAgICAgIHByaW50ICclMzBzOiAgJTUuMGZtcyAgJTUuMGZtcyAgJTYuMmZ1cyAgJTcuM2ZtcycgJSBcCisgICAgICAgICAgICAgICAgICAobmFtZSwKKyAgICAgICAgICAgICAgICAgICBtaW5fdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgYXZnX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgIG9wX2F2ZyAqIE1JQ1JPX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgbWluX292ZXJoZWFkICpNSUxMSV9TRUNPTkRTKQorICAgICAgICBwcmludCAnLScgKiBMSU5FCisgICAgICAgIHByaW50ICgnVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICcgJTYuMGZtcyAlNi4wZm1zJyAlCisgICAgICAgICAgICAgICAodG90YWxfbWluX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgIHRvdGFsX2F2Z190aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICApKQorICAgICAgICBwcmludAorCisgICAgZGVmIHByaW50X2NvbXBhcmlzb24oc2VsZiwgY29tcGFyZV90bywgaGlkZW5vaXNlPTAsIGxpbWl0bmFtZXM9Tm9uZSk6CisKKyAgICAgICAgIyBDaGVjayBiZW5jaG1hcmsgdmVyc2lvbnMKKyAgICAgICAgaWYgY29tcGFyZV90by52ZXJzaW9uICE9IHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHByaW50ICgnKiBCZW5jaG1hcmsgdmVyc2lvbnMgZGlmZmVyOiAnCisgICAgICAgICAgICAgICAgICAgJ2Nhbm5vdCBjb21wYXJlIHRoaXMgYmVuY2htYXJrIHRvICIlcyIgIScgJQorICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfdG8ubmFtZSkKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBzZWxmLnByaW50X2JlbmNobWFyayhoaWRlbm9pc2U9aGlkZW5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcz1saW1pdG5hbWVzKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBQcmludCBoZWFkZXIKKyAgICAgICAgY29tcGFyZV90by5wcmludF9oZWFkZXIoJ0NvbXBhcmluZyB3aXRoJykKKyAgICAgICAgcHJpbnQgKCdUZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAnICAgbWluaW11bSBydW4tdGltZSAgICAgICAgYXZlcmFnZSAgcnVuLXRpbWUnKQorICAgICAgICBwcmludCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICcgICB0aGlzICAgIG90aGVyICAgZGlmZiAgICB0aGlzICAgIG90aGVyICAgZGlmZicpCisgICAgICAgIHByaW50ICctJyAqIExJTkUKKworICAgICAgICAjIFByaW50IHRlc3QgY29tcGFyaXNvbnMKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgIHRvdGFsX21pbl90aW1lID0gb3RoZXJfdG90YWxfbWluX3RpbWUgPSAwLjAKKyAgICAgICAgdG90YWxfYXZnX3RpbWUgPSBvdGhlcl90b3RhbF9hdmdfdGltZSA9IDAuMAorICAgICAgICBiZW5jaG1hcmtzX2NvbXBhdGlibGUgPSBzZWxmLmNvbXBhdGlibGUoY29tcGFyZV90bykKKyAgICAgICAgdGVzdHNfY29tcGF0aWJsZSA9IDEKKyAgICAgICAgZm9yIG5hbWUsIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpZiAobGltaXRuYW1lcyBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBsaW1pdG5hbWVzLnNlYXJjaChuYW1lKSBpcyBOb25lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgKG1pbl90aW1lLAorICAgICAgICAgICAgIGF2Z190aW1lLAorICAgICAgICAgICAgIHRvdGFsX3RpbWUsCisgICAgICAgICAgICAgb3BfYXZnLAorICAgICAgICAgICAgIG1pbl9vdmVyaGVhZCkgPSB0ZXN0LnN0YXQoKQorICAgICAgICAgICAgdG90YWxfbWluX3RpbWUgPSB0b3RhbF9taW5fdGltZSArIG1pbl90aW1lCisgICAgICAgICAgICB0b3RhbF9hdmdfdGltZSA9IHRvdGFsX2F2Z190aW1lICsgYXZnX3RpbWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdGhlciA9IGNvbXBhcmVfdG8udGVzdHNbbmFtZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBvdGhlciA9IE5vbmUKKyAgICAgICAgICAgIGlmIG90aGVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBPdGhlciBiZW5jaG1hcmsgZG9lc24ndCBpbmNsdWRlIHRoZSBnaXZlbiB0ZXN0CisgICAgICAgICAgICAgICAgbWluX2RpZmYsIGF2Z19kaWZmID0gJ24vYScsICduL2EnCisgICAgICAgICAgICAgICAgb3RoZXJfbWluX3RpbWUgPSAwLjAKKyAgICAgICAgICAgICAgICBvdGhlcl9hdmdfdGltZSA9IDAuMAorICAgICAgICAgICAgICAgIHRlc3RzX2NvbXBhdGlibGUgPSAwCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlOS4yZiBtcyAgICAgICAgICAgICAgICAgICAgbi9hJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoJ05vdGlvbmFsIG1pbmltdW0gcm91bmQgdGltZScsIHRvdGFsbWludGltZSAqIDEwMDAuMCkKKyAgICAgICAgICAgICAgICAob3RoZXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgIG90aGVyX2F2Z190aW1lLAorICAgICAgICAgICAgICAgICBvdGhlcl90b3RhbF90aW1lLAorICAgICAgICAgICAgICAgICBvdGhlcl9vcF9hdmcsCisgICAgICAgICAgICAgICAgIG90aGVyX21pbl9vdmVyaGVhZCkgPSBvdGhlci5zdGF0KCkKKyAgICAgICAgICAgICAgICBvdGhlcl90b3RhbF9taW5fdGltZSA9IG90aGVyX3RvdGFsX21pbl90aW1lICsgb3RoZXJfbWluX3RpbWUKKyAgICAgICAgICAgICAgICBvdGhlcl90b3RhbF9hdmdfdGltZSA9IG90aGVyX3RvdGFsX2F2Z190aW1lICsgb3RoZXJfYXZnX3RpbWUKKyAgICAgICAgICAgICAgICBpZiAoYmVuY2htYXJrc19jb21wYXRpYmxlIGFuZAorICAgICAgICAgICAgICAgICAgICB0ZXN0LmNvbXBhdGlibGUob3RoZXIpKToKKyAgICAgICAgICAgICAgICAgICAgIyBCb3RoIGJlbmNobWFyayBhbmQgdGVzdHMgYXJlIGNvbXBhcmlibGUKKyAgICAgICAgICAgICAgICAgICAgbWluX2RpZmYgPSAoKG1pbl90aW1lICogc2VsZi53YXJwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl9taW5fdGltZSAqIG90aGVyLndhcnApIC0gMS4wKQorICAgICAgICAgICAgICAgICAgICBhdmdfZGlmZiA9ICgoYXZnX3RpbWUgKiBzZWxmLndhcnApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyX2F2Z190aW1lICogb3RoZXIud2FycCkgLSAxLjApCisgICAgICAgICAgICAgICAgICAgIGlmIGhpZGVub2lzZSBhbmQgYWJzKG1pbl9kaWZmKSA8IDEwLjA6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGlmZiA9ICcnCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGlmZiA9ICclKzUuMWYlJScgJSAobWluX2RpZmYgKiBQRVJDRU5UKQorICAgICAgICAgICAgICAgICAgICBpZiBoaWRlbm9pc2UgYW5kIGFicyhhdmdfZGlmZikgPCAxMC4wOgorICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RpZmYgPSAnJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RpZmYgPSAnJSs1LjFmJSUnICUgKGF2Z19kaWZmICogUEVSQ0VOVCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEJlbmNobWFyayBvciB0ZXN0cyBhcmUgbm90IGNvbXBhcmlibGUKKyAgICAgICAgICAgICAgICAgICAgbWluX2RpZmYsIGF2Z19kaWZmID0gJ24vYScsICduL2EnCisgICAgICAgICAgICAgICAgICAgIHRlc3RzX2NvbXBhdGlibGUgPSAwCisgICAgICAgICAgICBwcmludCAnJTMwczogJTUuMGZtcyAlNS4wZm1zICU3cyAlNS4wZm1zICU1LjBmbXMgJTdzJyAlIFwKKyAgICAgICAgICAgICAgICAgIChuYW1lLAorICAgICAgICAgICAgICAgICAgIG1pbl90aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICBvdGhlcl9taW5fdGltZSAqIE1JTExJX1NFQ09ORFMgKiBjb21wYXJlX3RvLndhcnAgLyBzZWxmLndhcnAsCisgICAgICAgICAgICAgICAgICAgbWluX2RpZmYsCisgICAgICAgICAgICAgICAgICAgYXZnX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgIG90aGVyX2F2Z190aW1lICogTUlMTElfU0VDT05EUyAqIGNvbXBhcmVfdG8ud2FycCAvIHNlbGYud2FycCwKKyAgICAgICAgICAgICAgICAgICBhdmdfZGlmZikKKyAgICAgICAgcHJpbnQgJy0nICogTElORQorCisgICAgICAgICMgU3VtbWFyaXNlIHRlc3QgcmVzdWx0cworICAgICAgICBpZiBub3QgYmVuY2htYXJrc19jb21wYXRpYmxlIG9yIG5vdCB0ZXN0c19jb21wYXRpYmxlOgorICAgICAgICAgICAgbWluX2RpZmYsIGF2Z19kaWZmID0gJ24vYScsICduL2EnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvdGhlcl90b3RhbF9taW5fdGltZSAhPSAwLjA6CisgICAgICAgICAgICAgICAgbWluX2RpZmYgPSAnJSs1LjFmJSUnICUgKAorICAgICAgICAgICAgICAgICAgICAoKHRvdGFsX21pbl90aW1lICogc2VsZi53YXJwKSAvCisgICAgICAgICAgICAgICAgICAgICAob3RoZXJfdG90YWxfbWluX3RpbWUgKiBjb21wYXJlX3RvLndhcnApIC0gMS4wKSAqIFBFUkNFTlQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1pbl9kaWZmID0gJ24vYScKKyAgICAgICAgICAgIGlmIG90aGVyX3RvdGFsX2F2Z190aW1lICE9IDAuMDoKKyAgICAgICAgICAgICAgICBhdmdfZGlmZiA9ICclKzUuMWYlJScgJSAoCisgICAgICAgICAgICAgICAgICAgICgodG90YWxfYXZnX3RpbWUgKiBzZWxmLndhcnApIC8KKyAgICAgICAgICAgICAgICAgICAgIChvdGhlcl90b3RhbF9hdmdfdGltZSAqIGNvbXBhcmVfdG8ud2FycCkgLSAxLjApICogUEVSQ0VOVCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXZnX2RpZmYgPSAnbi9hJworICAgICAgICBwcmludCAoJ1RvdGFsczogICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICcgICU1LjBmbXMgJTUuMGZtcyAlN3MgJTUuMGZtcyAlNS4wZm1zICU3cycgJQorICAgICAgICAgICAgICAgKHRvdGFsX21pbl90aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAob3RoZXJfdG90YWxfbWluX3RpbWUgKiBjb21wYXJlX3RvLndhcnAvc2VsZi53YXJwCisgICAgICAgICAgICAgICAgICogTUlMTElfU0VDT05EUyksCisgICAgICAgICAgICAgICAgbWluX2RpZmYsCisgICAgICAgICAgICAgICAgdG90YWxfYXZnX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgIChvdGhlcl90b3RhbF9hdmdfdGltZSAqIGNvbXBhcmVfdG8ud2FycC9zZWxmLndhcnAKKyAgICAgICAgICAgICAgICAgKiBNSUxMSV9TRUNPTkRTKSwKKyAgICAgICAgICAgICAgICBhdmdfZGlmZgorICAgICAgICAgICAgICAgKSkKICAgICAgICAgcHJpbnQKLQotZGVmIHByaW50X21hY2hpbmUoKToKLQotICAgIGltcG9ydCBwbGF0Zm9ybQotICAgIHByaW50ICdNYWNoaW5lIERldGFpbHM6JwotICAgIHByaW50ICcgICBQbGF0Zm9ybSBJRDogICVzJyAlIHBsYXRmb3JtLnBsYXRmb3JtKCkKLSAgICBwcmludCAnICAgRXhlY3V0YWJsZTogICAlcycgJSBzeXMuZXhlY3V0YWJsZQotICAgICMgVGhlcmUncyBhIGJ1ZyBpbiBQeXRob24gMi4yYjErLi4uCi0gICAgaWYgc3lzLnZlcnNpb25bOjZdID09ICcyLjJiMSsnOgotICAgICAgICByZXR1cm4KLSAgICBwcmludCAnICAgUHl0aG9uOiAgICAgICAlcycgJSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCi0gICAgcHJpbnQgJyAgIENvbXBpbGVyOiAgICAgJXMnICUgcGxhdGZvcm0ucHl0aG9uX2NvbXBpbGVyKCkKLSAgICBidWlsZG5vLCBidWlsZGRhdGUgPSBwbGF0Zm9ybS5weXRob25fYnVpbGQoKQotICAgIHByaW50ICcgICBCdWlsZDogICAgICAgICVzICgjJXMpJyAlIChidWlsZGRhdGUsIGJ1aWxkbm8pCisgICAgICAgIHByaW50ICcodGhpcz0lcywgb3RoZXI9JXMpJyAlIChzZWxmLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX3RvLm5hbWUpCisgICAgICAgIHByaW50CiAKIGNsYXNzIFB5QmVuY2hDbWRsaW5lKEFwcGxpY2F0aW9uKToKIApAQCAtMzcwLDUwICs3NDcsNjQgQEAKIAogICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXwogCi0gICAgb3B0aW9ucyA9IFtBcmd1bWVudE9wdGlvbignLW4nLCdudW1iZXIgb2Ygcm91bmRzJyxTZXR1cC5OdW1iZXJfb2Zfcm91bmRzKSwKLSAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctZicsJ3NhdmUgYmVuY2htYXJrIHRvIGZpbGUgYXJnJywnJyksCi0gICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLWMnLCdjb21wYXJlIGJlbmNobWFyayB3aXRoIHRoZSBvbmUgaW4gZmlsZSBhcmcnLCcnKSwKLSAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctcycsJ3Nob3cgYmVuY2htYXJrIGluIGZpbGUgYXJnLCB0aGVuIGV4aXQnLCcnKSwKLSAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLVMnLCdzaG93IHN0YXRpc3RpY3Mgb2YgYmVuY2htYXJrcycsMCksCi0gICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLXcnLCdzZXQgd2FycCBmYWN0b3IgdG8gYXJnJyxTZXR1cC5XYXJwX2ZhY3RvciksCi0gICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy1kJywnaGlkZSBub2lzZSBpbiBjb21wYXJlcycsIDApLAotICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctdicsJ3ZlcmJvc2Ugb3V0cHV0IChub3QgcmVjb21tZW5kZWQpJywgMCksCi0gICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tbm8tZ2MnLCdkaXNhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbicsIDApLAotICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctLW5vLXN5c2NoZWNrJywKLSAgICAgICAgICAgICAgICAgICAgJyJkaXNhYmxlIiBzeXMgY2hlY2sgaW50ZXJ2YWwgKHNldCB0byBzeXMubWF4aW50KScsIDApLAotICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy10JywgJ3Rlc3RzIGNvbnRhaW5pbmcgc3Vic3RyaW5nJywgJycpLAotICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1DJywgJ251bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zJywgMjApCisgICAgZGVidWcgPSBfZGVidWcKKworICAgIG9wdGlvbnMgPSBbQXJndW1lbnRPcHRpb24oJy1uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXIgb2Ygcm91bmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHVwLk51bWJlcl9vZl9yb3VuZHMpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1mJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzYXZlIGJlbmNobWFyayB0byBmaWxlIGFyZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyksCisgICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhcmUgYmVuY2htYXJrIHdpdGggdGhlIG9uZSBpbiBmaWxlIGFyZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyksCisgICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3cgYmVuY2htYXJrIGluIGZpbGUgYXJnLCB0aGVuIGV4aXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy13JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgd2FycCBmYWN0b3IgdG8gYXJnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHVwLldhcnBfZmFjdG9yKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVuIG9ubHkgdGVzdHMgd2l0aCBuYW1lcyBtYXRjaGluZyBhcmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1DJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgdGhlIG51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zIHRvIGFyZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxJQlJBVElPTl9SVU5TKSwKKyAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaWRlIG5vaXNlIGluIGNvbXBhcmlzb25zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKKyAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLXYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJib3NlIG91dHB1dCAobm90IHJlY29tbWVuZGVkKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0td2l0aC1nYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctLXdpdGgtc3lzY2hlY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgZGVmYXVsdCBzeXMgY2hlY2sgaW50ZXJ2YWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy0tdGltZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgZ2l2ZW4gdGltZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSX1BMQVRGT1JNX0RFRkFVTFQpLAogICAgICAgICAgICAgICAgXQogCiAgICAgYWJvdXQgPSAiIiJcCiBUaGUgbm9ybWFsIG9wZXJhdGlvbiBpcyB0byBydW4gdGhlIHN1aXRlIGFuZCBkaXNwbGF5IHRoZQotcmVzdWx0cy4gVXNlIC1mIHRvIHNhdmUgdGhlbSBmb3IgbGF0ZXIgcmV1c2Ugb3IgY29tcGFyaXNtcy4KK3Jlc3VsdHMuIFVzZSAtZiB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHJldXNlIG9yIGNvbXBhcmlzb25zLgorCitBdmFpbGFibGUgdGltZXJzOgorCisgICB0aW1lLnRpbWUKKyAgIHRpbWUuY2xvY2sKKyAgIHN5c3RpbWVzLnByb2Nlc3N0aW1lCiAKIEV4YW1wbGVzOgogCi1weXRob24xLjUgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE1Ci1weXRob24xLjQgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE0Ci1weXRob24gcHliZW5jaC5weSAtcyBwMTUgLWMgcDE0CitweXRob24yLjEgcHliZW5jaC5weSAtZiBwMjEucHliZW5jaAorcHl0aG9uMi41IHB5YmVuY2gucHkgLWYgcDI1LnB5YmVuY2gKK3B5dGhvbiBweWJlbmNoLnB5IC1zIHAyNS5weWJlbmNoIC1jIHAyMS5weWJlbmNoCiAiIiIKICAgICBjb3B5cmlnaHQgPSBfX2NvcHlyaWdodF9fCiAKLSAgICBkZWYgaGFuZGxlX1Moc2VsZiwgdmFsdWUpOgotCi0gICAgICAgICIiIiBEaXNwbGF5IG9uZSBsaW5lIHN0YXRzIGZvciBlYWNoIGJlbmNobWFyayBmaWxlIGdpdmVuIG9uIHRoZQotICAgICAgICAgICAgY29tbWFuZCBsaW5lLgotCi0gICAgICAgICIiIgotICAgICAgICBmb3IgYmVuY2htYXJrIGluIHNlbGYuZmlsZXM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZiA9IG9wZW4oYmVuY2htYXJrLCAncmInKQotICAgICAgICAgICAgICAgIGJlbmNoID0gcGlja2xlLmxvYWQoZikKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlICVzJyAlIHJlcHIoYmVuY2htYXJrKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnJXMsJS0uMmYsbXMnICUgKGJlbmNobWFyaywgYmVuY2gucm91bmR0aW1lKjEwMDAuMCkKLSAgICAgICAgcmV0dXJuIDAKLQogICAgIGRlZiBtYWluKHNlbGYpOgogCiAgICAgICAgIHJvdW5kcyA9IHNlbGYudmFsdWVzWyctbiddCkBAIC00MjEsMzggKzgxMiw1MiBAQAogICAgICAgICBzaG93X2JlbmNoID0gc2VsZi52YWx1ZXNbJy1zJ10KICAgICAgICAgY29tcGFyZV90byA9IHNlbGYudmFsdWVzWyctYyddCiAgICAgICAgIGhpZGVub2lzZSA9IHNlbGYudmFsdWVzWyctZCddCi0gICAgICAgIHdhcnAgPSBzZWxmLnZhbHVlc1snLXcnXQotICAgICAgICBub2djID0gc2VsZi52YWx1ZXNbJy0tbm8tZ2MnXQorICAgICAgICB3YXJwID0gaW50KHNlbGYudmFsdWVzWyctdyddKQorICAgICAgICB3aXRoZ2MgPSBzZWxmLnZhbHVlc1snLS13aXRoLWdjJ10KICAgICAgICAgbGltaXRuYW1lcyA9IHNlbGYudmFsdWVzWyctdCddCisgICAgICAgIGlmIGxpbWl0bmFtZXM6CisgICAgICAgICAgICBpZiBfZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQgJyogbGltaXRpbmcgdGVzdCBuYW1lcyB0byBvbmUgd2l0aCBzdWJzdHJpbmcgIiVzIicgJSBcCisgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcworICAgICAgICAgICAgbGltaXRuYW1lcyA9IHJlLmNvbXBpbGUobGltaXRuYW1lcywgcmUuSSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbWl0bmFtZXMgPSBOb25lCiAgICAgICAgIHZlcmJvc2UgPSBzZWxmLnZlcmJvc2UKLSAgICAgICAgbm9zeXNjaGVjayA9IHNlbGYudmFsdWVzWyctLW5vLXN5c2NoZWNrJ10KLSAgICAgICAgY3J1bnMgPSBzZWxmLnZhbHVlc1snLUMnXQotICAgICAgICBwcmludCAiQ1JVTlM6IiwgY3J1bnMKKyAgICAgICAgd2l0aHN5c2NoZWNrID0gc2VsZi52YWx1ZXNbJy0td2l0aC1zeXNjaGVjayddCisgICAgICAgIGNhbGlicmF0aW9uX3J1bnMgPSBzZWxmLnZhbHVlc1snLUMnXQorICAgICAgICB0aW1lciA9IHNlbGYudmFsdWVzWyctLXRpbWVyJ10KIAotICAgICAgICBwcmludCAnUFlCRU5DSCcsX192ZXJzaW9uX18KKyAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICBwcmludCAnUFlCRU5DSCAlcycgJSBfX3ZlcnNpb25fXworICAgICAgICBwcmludCAnLScgKiBMSU5FCisgICAgICAgIHByaW50ICcqIHVzaW5nIFB5dGhvbiAlcycgJSAoc3RyaW5nLnNwbGl0KHN5cy52ZXJzaW9uKVswXSkKIAotICAgICAgICAjIFN3aXRjaCBvZmYgR0MKLSAgICAgICAgaWYgbm9nYzoKKyAgICAgICAgIyBTd2l0Y2ggb2ZmIGdhcmJhZ2UgY29sbGVjdGlvbgorICAgICAgICBpZiBub3Qgd2l0aGdjOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGltcG9ydCBnYwogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIG5vZ2MgPSAwCisgICAgICAgICAgICAgICAgcHJpbnQgJyogUHl0aG9uIHZlcnNpb24gZG9lc25cJ3Qgc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24nCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYudmFsdWVzWyctLW5vLWdjJ106Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRpc2FibGUoKQotICAgICAgICAgICAgICAgICAgICBwcmludCAnTk8gR0MnCisgICAgICAgICAgICAgICAgZ2MuZGlzYWJsZSgpCisgICAgICAgICAgICAgICAgcHJpbnQgJyogZGlzYWJsZWQgZ2FyYmFnZSBjb2xsZWN0aW9uJwogCi0gICAgICAgICMgbWF4aW1pc2Ugc3lzIGNoZWNrIGludGVydmFsCi0gICAgICAgIGlmIG5vc3lzY2hlY2s6Ci0gICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChzeXMubWF4aW50KQotICAgICAgICAgICAgcHJpbnQgJ0NIRUNLSU5URVJWQUwgPScsIHN5cy5tYXhpbnQKKyAgICAgICAgIyAiRGlzYWJsZSIgc3lzIGNoZWNrIGludGVydmFsCisgICAgICAgIGlmIG5vdCB3aXRoc3lzY2hlY2s6CisgICAgICAgICAgICAjIFRvbyBiYWQgdGhlIGNoZWNrIGludGVydmFsIHVzZXMgYW4gaW50IGluc3RlYWQgb2YgYSBsb25nLi4uCisgICAgICAgICAgICB2YWx1ZSA9IDIxNDc0ODM2NDcKKyAgICAgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKHZhbHVlKQorICAgICAgICAgICAgcHJpbnQgJyogc3lzdGVtIGNoZWNrIGludGVydmFsIHNldCB0byBtYXhpbXVtOiAlcycgJSB2YWx1ZQorCisgICAgICAgIGlmIHRpbWVyID09IFRJTUVSX1NZU1RJTUVTX1BST0NFU1NUSU1FOgorICAgICAgICAgICAgaW1wb3J0IHN5c3RpbWVzCisgICAgICAgICAgICBwcmludCAnKiB1c2luZyB0aW1lcjogc3lzdGltZXMucHJvY2Vzc3RpbWUgKCVzKScgJSBcCisgICAgICAgICAgICAgICAgICBzeXN0aW1lcy5TWVNUSU1FU19JTVBMRU1FTlRBVElPTgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJyogdXNpbmcgdGltZXI6ICVzJyAlIHRpbWVyCiAKICAgICAgICAgcHJpbnQKIAotICAgICAgICBpZiBub3QgY29tcGFyZV90bzoKLSAgICAgICAgICAgIHByaW50X21hY2hpbmUoKQotICAgICAgICAgICAgcHJpbnQKLQogICAgICAgICBpZiBjb21wYXJlX3RvOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGYgPSBvcGVuKGNvbXBhcmVfdG8sJ3JiJykKQEAgLTQ2MCw4ICs4NjUsMTAgQEAKICAgICAgICAgICAgICAgICBiZW5jaC5uYW1lID0gY29tcGFyZV90bwogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgIGNvbXBhcmVfdG8gPSBiZW5jaAotICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUnLGNvbXBhcmVfdG8KKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCByZWFzb246CisgICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUgJXM6ICVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgcmVwcihjb21wYXJlX3RvKSwKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uKQogICAgICAgICAgICAgICAgIGNvbXBhcmVfdG8gPSBOb25lCiAKICAgICAgICAgaWYgc2hvd19iZW5jaDoKQEAgLTQ3MCwzNyArODc3LDUyIEBACiAgICAgICAgICAgICAgICAgYmVuY2ggPSBwaWNrbGUubG9hZChmKQogICAgICAgICAgICAgICAgIGJlbmNoLm5hbWUgPSBzaG93X2JlbmNoCiAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcHJpbnQgJ0JlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAotICAgICAgICAgICAgICAgICAgICAgIChiZW5jaC5uYW1lLGJlbmNoLnJvdW5kcyxiZW5jaC53YXJwKQotICAgICAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfc3RhdChjb21wYXJlX3RvLCBoaWRlbm9pc2UpCisgICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgICAgICAgICBpZiBjb21wYXJlX3RvOgorICAgICAgICAgICAgICAgICAgICBiZW5jaC5wcmludF9jb21wYXJpc29uKGNvbXBhcmVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZW5vaXNlPWhpZGVub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdG5hbWVzPWxpbWl0bmFtZXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfYmVuY2htYXJrKGhpZGVub2lzZT1oaWRlbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdG5hbWVzPWxpbWl0bmFtZXMpCiAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3JlYWRpbmcgZmlsZScsc2hvd19iZW5jaAorICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlICVzOiAlcycgJSAoCisgICAgICAgICAgICAgICAgICAgIHJlcHIoc2hvd19iZW5jaCksCisgICAgICAgICAgICAgICAgICAgIHJlYXNvbikKICAgICAgICAgICAgICAgICBwcmludAogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgaWYgcmVwb3J0ZmlsZToKLSAgICAgICAgICAgIGlmIG5vZ2M6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ0JlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSwgbm8gR0MpJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0ZmlsZSxyb3VuZHMsd2FycCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ0JlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAotICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnRmaWxlLHJvdW5kcyx3YXJwKQorICAgICAgICAgICAgcHJpbnQgJ0NyZWF0aW5nIGJlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgKHJlcG9ydGZpbGUsIHJvdW5kcywgd2FycCkKICAgICAgICAgICAgIHByaW50CiAKICAgICAgICAgIyBDcmVhdGUgYmVuY2htYXJrIG9iamVjdAotICAgICAgICBiZW5jaCA9IEJlbmNobWFyaygpCisgICAgICAgIGJlbmNoID0gQmVuY2htYXJrKHJlcG9ydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9dmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXI9dGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcnA9d2FycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25fcnVucz1jYWxpYnJhdGlvbl9ydW5zKQogICAgICAgICBiZW5jaC5yb3VuZHMgPSByb3VuZHMKLSAgICAgICAgYmVuY2gubG9hZF90ZXN0cyhTZXR1cCwgd2FycCwgbGltaXRuYW1lcywgdmVyYm9zZSkKKyAgICAgICAgYmVuY2gubG9hZF90ZXN0cyhTZXR1cCwgbGltaXRuYW1lcz1saW1pdG5hbWVzKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBiZW5jaC5ydW4odmVyYm9zZSwgY3J1bnMpCisgICAgICAgICAgICBiZW5jaC5jYWxpYnJhdGUoKQorICAgICAgICAgICAgYmVuY2gucnVuKCkKICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgIHByaW50ICcqKiogS2V5Ym9hcmRJbnRlcnJ1cHQgLS0gQWJvcnRpbmcnCiAgICAgICAgICAgICBwcmludAogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGJlbmNoLnByaW50X3N0YXQoY29tcGFyZV90bykKLSAgICAgICAgIyByaW5nIGJlbGwKKyAgICAgICAgYmVuY2gucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgaWYgY29tcGFyZV90bzoKKyAgICAgICAgICAgIGJlbmNoLnByaW50X2NvbXBhcmlzb24oY29tcGFyZV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZW5vaXNlPWhpZGVub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcz1saW1pdG5hbWVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmVuY2gucHJpbnRfYmVuY2htYXJrKGhpZGVub2lzZT1oaWRlbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcz1saW1pdG5hbWVzKQorCisgICAgICAgICMgUmluZyBiZWxsCiAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1wwMDcnKQogCiAgICAgICAgIGlmIHJlcG9ydGZpbGU6CmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL3N5c3RpbWVzLnB5IGIvVG9vbHMvcHliZW5jaC9zeXN0aW1lcy5weQppbmRleCA3OWQyNDlmLi5iZjA3ZTM2IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL3N5c3RpbWVzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvc3lzdGltZXMucHkKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBwbGF0Zm9ybXMuCiAKICAgICBJZiBubyBzdXBwb3J0ZWQgdGltaW5nIG1ldGhvZHMgYmFzZWQgb24gcHJvY2VzcyB0aW1lIGNhbiBiZSBmb3VuZCwKLSAgICB0aGUgbW9kdWxlIHJldmVydHMgdG8gdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiB3YWxsLXRpbWUgdGltZXIKKyAgICB0aGUgbW9kdWxlIHJldmVydHMgdG8gdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiB3YWxsLWNsb2NrIHRpbWVyCiAgICAgaW5zdGVhZC4gVGhlIHN5c3RlbSB0aW1lIHBhcnQgd2lsbCB0aGVuIGFsd2F5cyBiZSAwLjAuCiAKICAgICBUaGUgbW9kdWxlIGV4cG9ydHMgb25lIHB1YmxpYyBBUEk6CkBAIC01Miw4ICs1Miw4IEBACiBVU0VfV0lOMzJQUk9DRVNTX0dFVFBST0NFU1NUSU1FUyA9ICd3aW4zMnByb2Nlc3MuR2V0UHJvY2Vzc1RpbWVzKCknCiBVU0VfUkVTT1VSQ0VfR0VUUlVTQUdFID0gJ3Jlc291cmNlLmdldHJ1c2FnZSgpJwogVVNFX1BST0NFU1NfVElNRV9DTE9DSyA9ICd0aW1lLmNsb2NrKCkgKHByb2Nlc3MgdGltZSknCi1VU0VfV0FMTF9USU1FX0NMT0NLID0gJ3RpbWUuY2xvY2soKSAod2FsbC10aW1lKScKLVVTRV9XQUxMX1RJTUVfVElNRSA9ICd0aW1lLnRpbWUoKSAod2FsbC10aW1lKScKK1VTRV9XQUxMX1RJTUVfQ0xPQ0sgPSAndGltZS5jbG9jaygpICh3YWxsLWNsb2NrKScKK1VTRV9XQUxMX1RJTUVfVElNRSA9ICd0aW1lLnRpbWUoKSAod2FsbC1jbG9jayknCiAKIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CiAgICAgIyBXaW5kb3dzIHBsYXRmb3JtCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgIyBVc2UgdGhlIHdhbGwtdGltZSBpbXBsZW1lbnRhdGlvbiB0aW1lLmNsb2NrKCksIHNpbmNlIHRoaXMKKyAgICAgICAgICAgICMgVXNlIHRoZSB3YWxsLWNsb2NrIGltcGxlbWVudGF0aW9uIHRpbWUuY2xvY2soKSwgc2luY2UgdGhpcwogICAgICAgICAgICAgIyBpcyB0aGUgaGlnaGVzdCByZXNvbHV0aW9uIGNsb2NrIGF2YWlsYWJsZSBvbiBXaW5kb3dzCiAgICAgICAgICAgICBTWVNUSU1FU19JTVBMRU1FTlRBVElPTiA9IFVTRV9XQUxMX1RJTUVfQ0xPQ0sKICAgICAgICAgZWxzZToKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgIyB0aW1lKQogICAgICAgICBTWVNUSU1FU19JTVBMRU1FTlRBVElPTiA9IFVTRV9QUk9DRVNTX1RJTUVfQ0xPQ0sKICAgICBlbHNlOgotICAgICAgICAjIFVzZSB3YWxsLXRpbWUgaW1wbGVtZW50YXRpb24gdGltZS50aW1lKCkgc2luY2UgdGhpcyBwcm92aWRlcworICAgICAgICAjIFVzZSB3YWxsLWNsb2NrIGltcGxlbWVudGF0aW9uIHRpbWUudGltZSgpIHNpbmNlIHRoaXMgcHJvdmlkZXMKICAgICAgICAgIyB0aGUgaGlnaGVzdCByZXNvbHV0aW9uIGNsb2NrIG9uIG1vc3Qgc3lzdGVtcwogICAgICAgICBTWVNUSU1FU19JTVBMRU1FTlRBVElPTiA9IFVTRV9XQUxMX1RJTUVfVElNRQogCkBAIC0xMDMsMjQgKzEwMywyNyBAQAogZGVmIHByb2Nlc3NfdGltZV9jbG9ja19zeXN0aW1lcygpOgogICAgIHJldHVybiAodGltZS5jbG9jaygpLCAwLjApCiAKLWRlZiB3YWxsX3RpbWVfY2xvY2tfc3lzdGltZXMoKToKK2RlZiB3YWxsX2Nsb2NrX2Nsb2NrX3N5c3RpbWVzKCk6CiAgICAgcmV0dXJuICh0aW1lLmNsb2NrKCksIDAuMCkKIAotZGVmIHdhbGxfdGltZV90aW1lX3N5c3RpbWVzKCk6CitkZWYgd2FsbF9jbG9ja190aW1lX3N5c3RpbWVzKCk6CiAgICAgcmV0dXJuICh0aW1lLnRpbWUoKSwgMC4wKQogCiAjIE51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2Vjb25kIGZvciB0aGUgdmFsdWVzIHJldHVybmVkCiAjIGJ5IEdldFByb2Nlc3NUaW1lcygpIG9uIFdpbmRvd3MuCiAjCi0jIE5vdGU6IFRpY2tzIHJldHVybmVkIGJ5IEdldFByb2Nlc3NUaW1lcygpIGFyZSBtaWNyby1zZWNvbmRzIG9uCi0jIFdpbmRvd3MgWFAgKHRob3VnaCB0aGUgZG9jcyBzYXkgMTAwbnMgaW50ZXJ2YWxzKQotV0lOMzJfUFJPQ0VTU19USU1FU19USUNLU19QRVJfU0VDT05EID0gMTBlNgorIyBOb3RlOiBUaWNrcyByZXR1cm5lZCBieSBHZXRQcm9jZXNzVGltZXMoKSBhcmUgMTAwbnMgaW50ZXJ2YWxzIG9uCisjIFdpbmRvd3MgWFAuIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIHRpbWVzIGFyZSBvbmx5IHVwZGF0ZWQgd2l0aCBldmVyeQorIyBjbG9jayB0aWNrIGFuZCB0aGUgZnJlcXVlbmN5IG9mIHRoZXNlIGlzIHNvbWV3aGF0IGxvd2VyOiBkZXBlbmRpbmcKKyMgb24gdGhlIE9TIHZlcnNpb24gYmV0d2VlbiAxMG1zIGFuZCAxNW1zLiBFdmVuIHdvcnNlLCB0aGUgcHJvY2VzcworIyB0aW1lIHNlZW1zIHRvIGJlIGFsbG9jYXRlZCB0byBwcm9jZXNzIGN1cnJlbnRseSBydW5uaW5nIHdoZW4gdGhlCisjIGNsb2NrIGludGVycnVwdCBhcnJpdmVzLCBpZS4gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY3VycmVudCB0aW1lCisjIHNsaWNlIGdldHMgYWNjb3VudGVkIHRvIGEgZGlmZmVyZW50IHByb2Nlc3MuCisKK1dJTjMyX1BST0NFU1NfVElNRVNfVElDS1NfUEVSX1NFQ09ORCA9IDFlNwogCiBkZWYgd2luMzJwcm9jZXNzX2dldHByb2Nlc3N0aW1lc19zeXN0aW1lcygpOgogICAgIGQgPSB3aW4zMnByb2Nlc3MuR2V0UHJvY2Vzc1RpbWVzKHdpbjMycHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpKQotICAgICMgTm90ZTogSSdtIG5vdCBzdXJlIHdoZXRoZXIgS2VybmVsVGltZSBvbiBXaW5kb3dzIGlzIHRoZSBzYW1lIGFzCi0gICAgIyBzeXN0ZW0gdGltZSBvbiBVbml4IC0gSSd2ZSB5ZXQgdG8gc2VlIGEgbm9uLXplcm8gdmFsdWUgZm9yCi0gICAgIyBLZXJuZWxUaW1lIG9uIFdpbmRvd3MuCiAgICAgcmV0dXJuIChkWydVc2VyVGltZSddIC8gV0lOMzJfUFJPQ0VTU19USU1FU19USUNLU19QRVJfU0VDT05ELAogICAgICAgICAgICAgZFsnS2VybmVsVGltZSddIC8gV0lOMzJfUFJPQ0VTU19USU1FU19USUNLU19QRVJfU0VDT05EKQogCkBAIC0xNDksMTAgKzE1MiwxMCBAQAogICAgIHN5c3RpbWVzID0gcHJvY2Vzc190aW1lX2Nsb2NrX3N5c3RpbWVzCiAKIGVsaWYgU1lTVElNRVNfSU1QTEVNRU5UQVRJT04gaXMgVVNFX1dBTExfVElNRV9DTE9DSzoKLSAgICBzeXN0aW1lcyA9IHdhbGxfdGltZV9jbG9ja19zeXN0aW1lcworICAgIHN5c3RpbWVzID0gd2FsbF9jbG9ja19jbG9ja19zeXN0aW1lcwogCiBlbGlmIFNZU1RJTUVTX0lNUExFTUVOVEFUSU9OIGlzIFVTRV9XQUxMX1RJTUVfVElNRToKLSAgICBzeXN0aW1lcyA9IHdhbGxfdGltZV90aW1lX3N5c3RpbWVzCisgICAgc3lzdGltZXMgPSB3YWxsX2Nsb2NrX3RpbWVfc3lzdGltZXMKIAogZWxpZiBTWVNUSU1FU19JTVBMRU1FTlRBVElPTiBpcyBVU0VfV0lOMzJQUk9DRVNTX0dFVFBST0NFU1NUSU1FUzoKICAgICBzeXN0aW1lcyA9IHdpbjMycHJvY2Vzc19nZXRwcm9jZXNzdGltZXNfc3lzdGltZXMKQEAgLTE2Myw2ICsxNjYsMTcgQEAKIGVsc2U6CiAgICAgcmFpc2UgVHlwZUVycm9yKCdubyBzdWl0YWJsZSBzeXN0aW1lcygpIGltcGxlbWVudGF0aW9uIGZvdW5kJykKIAorZGVmIHByb2Nlc3N0aW1lKCk6CisKKyAgICAiIiIgUmV0dXJuIHRoZSB0b3RhbCB0aW1lIHNwZW50IG9uIHRoZSBwcm9jZXNzLgorCisgICAgICAgIFRoaXMgaXMgdGhlIHN1bSBvZiB1c2VyIGFuZCBzeXN0ZW0gdGltZSBhcyByZXR1cm5lZCBieQorICAgICAgICBzeXN0aW1lcygpLgorCisgICAgIiIiCisgICAgdXNlciwgc3lzdGVtID0gc3lzdGltZXMoKQorICAgIHJldHVybiB1c2VyICsgc3lzdGVtCisKICMjIyBUZXN0aW5nCiAKIGRlZiBzb21lX3dvcmtsb2FkKCk6CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL1JFQURNRSBiL1Rvb2xzL3NjcmlwdHMvUkVBRE1FCmluZGV4IDU2YWEzOTEuLjljN2I0MGUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvUkVBRE1FCisrKyBiL1Rvb2xzL3NjcmlwdHMvUkVBRE1FCkBAIC0yNyw3ICsyNyw2IEBACiBmaXhub3RpY2UucHkJCUZpeCB0aGUgY29weXJpZ2h0IG5vdGljZSBpbiBzb3VyY2UgZmlsZXMKIGZpeHBzLnB5CQlGaXggUHl0aG9uIHNjcmlwdHMnIGZpcnN0IGxpbmUgKGlmICMhKQogZnRwbWlycm9yLnB5CQlGVFAgbWlycm9yIHNjcmlwdAotZ2VuY29kZWMucHkJCUNyZWF0ZSBQeXRob24gY29kZWNzIGZyb20gVW5pY29kZSBtYXBwaW5nIGZpbGVzCiBnb29nbGUucHkJCU9wZW4gYSB3ZWJicm93c2VyIHdpdGggR29vZ2xlLgogZ3Byb2YyaHRtbC5weQkJVHJhbnNmb3JtIGdwcm9mKDEpIG91dHB1dCBpbnRvIHVzZWZ1bCBIVE1MLgogaDJweS5weQkJCVRyYW5zbGF0ZSAjZGVmaW5lJ3MgaW50byBQeXRob24gYXNzaWdubWVudHMKQEAgLTUzLDE0ICs1MiwxNCBAQAogcHRhZ3MucHkJCUNyZWF0ZSB2aSB0YWdzIGZpbGUgZm9yIFB5dGhvbiBtb2R1bGVzCiBweWRvYwkJCVB5dGhvbiBkb2N1bWVudGF0aW9uIGJyb3dzZXIuCiBweXNvdXJjZS5weQkJRmluZCBQeXRob24gc291cmNlIGZpbGVzCi1yZWRlbW8ucHkJCUJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZW1vc3RyYXRpb24gZmFjaWxpdHkKK3JlZGVtby5weQkJQmFzaWMgcmVndWxhciBleHByZXNzaW9uIGRlbW9uc3RyYXRpb24gZmFjaWxpdHkKIHJlaW5kZW50LnB5CQlDaGFuZ2UgLnB5IGZpbGVzIHRvIHVzZSA0LXNwYWNlIGluZGVudHMuCiByZ3JlcC5weQkJUmV2ZXJzZSBncmVwIHRocm91Z2ggYSBmaWxlICh1c2VmdWwgZm9yIGJpZyBsb2dmaWxlcykKIHNldHVwLnB5CQlJbnN0YWxsIGFsbCBzY3JpcHRzIGxpc3RlZCBoZXJlLgogc3VmZi5weQkJCVNvcnQgYSBsaXN0IG9mIGZpbGVzIGJ5IHN1ZmZpeAorc3ZuZW9sLnB5CQlTZXRzIHN2bjplb2wtc3R5bGUgb24gYWxsIGZpbGVzIGluIGRpcmVjdG9yeS4KIHRleGNoZWNrLnB5ICAgICAgICAgICAgIFZhbGlkYXRlIFB5dGhvbiBMYVRlWCBmb3JtYXR0aW5nIChSYXltb25kIEhldHRpbmdlcikKIHRleGkyaHRtbC5weQkJQ29udmVydCBHTlUgdGV4aW5mbyBmaWxlcyBpbnRvIEhUTUwKLXRyYWNlLnB5CQlUcmFjZSBQeXRob24gcHJvZ3JhbSBvciBmdW5jdGlvbiBleGVjdXRpb24KIHRyZWVzeW5jLnB5CQlTeW5jaHJvbml6ZSBzb3VyY2UgdHJlZXMgKHZlcnkgaWRlb3N5bmNyYXRpYykKIHVudGFiaWZ5LnB5CQlSZXBsYWNlIHRhYnMgd2l0aCBzcGFjZXMgaW4gYXJndW1lbnQgZmlsZXMKIHdoaWNoLnB5CQlGaW5kIGEgcHJvZ3JhbSBpbiAkUEFUSApkaWZmIC0tZ2l0IGEvVG9vbHMvd2ViY2hlY2tlci93ZWJjaGVja2VyLnB5IGIvVG9vbHMvd2ViY2hlY2tlci93ZWJjaGVja2VyLnB5CmluZGV4IDcxOTlkYTguLjkyM2U4ZTYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3dlYmNoZWNrZXIvd2ViY2hlY2tlci5weQorKysgYi9Ub29scy93ZWJjaGVja2VyL3dlYmNoZWNrZXIucHkKQEAgLTc2MCw3ICs3NjAsOCBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihwYXRoKQogICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6Ci0gICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgbXNnLCBzeXMuZXhjX3RyYWNlYmFjaworICAgICAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgbXNnLCBleGNfdGIKICAgICAgICAgICAgIG5hbWVzLnNvcnQoKQogICAgICAgICAgICAgcyA9IE15U3RyaW5nSU8oImZpbGU6Iit1cmwsIHsnY29udGVudC10eXBlJzogJ3RleHQvaHRtbCd9KQogICAgICAgICAgICAgcy53cml0ZSgnPEJBU0UgSFJFRj0iZmlsZTolcyI+XG4nICUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBiMDJlYmM2Li4wMzNiYjY4IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xLDcgKzEsNyBAQAogIyEgL2Jpbi9zaAotIyBGcm9tIGNvbmZpZ3VyZS5pbiBSZXZpc2lvbjogNDY3NTMgLgorIyBGcm9tIGNvbmZpZ3VyZS5pbiBSZXZpc2lvbjogNDY3NTQgLgogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTllIGZvciBweXRob24gMy4wLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjAgZm9yIHB5dGhvbiAzLjAuCiAjCiAjIFJlcG9ydCBidWdzIHRvIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3M+LgogIwpAQCAtMjMzLDggKzIzMyw4IEBACiAKIAogICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KLQkgIyBUcnkgb25seSBzaGVsbHMgd2hpY2ggZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgaWYgdGVzdCAtZiAiJGFzX3NoZWxsIiAmJgorCSAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisJIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgogCQl7ICgiJGFzX3NoZWxsIikgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgogIyBCZSBCb3VybmUgY29tcGF0aWJsZQogaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCiBweXRob24gY29uZmlndXJlIDMuMAotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYwCiAKIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KIAogSXQgd2FzIGNyZWF0ZWQgYnkgcHl0aG9uICRhc19tZSAzLjAsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYwLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgJCAkMCAkQAogCkBAIC0yMDIwLDggKzIwMjAsOCBAQAogICAjIE9uIE1hYyBPUyBYIDEwLjQsIGRlZmluaW5nIF9QT1NJWF9DX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFCiAgICMgZGlzYWJsZXMgcGxhdGZvcm0gc3BlY2lmaWMgZmVhdHVyZXMgYmV5b25kIHJlcGFpci4KICAgIyBPbiBNYWMgT1MgWCAxMC4zLCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRQotICAjIGhhcyBubyBlZmZlY3QsIGRvbid0IGJvdGhlciBkZWZpbmVpbmcgdGhlbQotICBEYXJ3aW4vWzc4XS4qKQorICAjIGhhcyBubyBlZmZlY3QsIGRvbid0IGJvdGhlciBkZWZpbmluZyB0aGVtCisgIERhcndpbi9bNzg5XS4qKQogICAgIGRlZmluZV94b3Blbl9zb3VyY2U9bm8KICAgICA7OwogCkBAIC0yODQ2LDcgKzI4NDYsNyBAQAogCWFjX2NvbXBpbGVyX2dudT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBhY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CiAKIGZpCkBAIC0zMDMyLDEzICszMDMyLDEzIEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CkBAIC0zMTAzLDYgKzMxMDMsMTEgQEAKICAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KIGludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CiAKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKwogaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CiBzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKIHN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OwpAQCAtMzE2Myw3ICszMTY4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKICAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKIGRvbmUKIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKQEAgLTUxOTksNyArNTIwNCw3IEBACiAJYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCkBAIC01Mzk1LDcgKzU0MDAsNyBAQAogCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKIAkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKQEAgLTU0NTAsMTQgKzU0NTUsMjQgQEAKIAogCiAKLWZvciBhY19oZWFkZXIgaW4gYXNtL3R5cGVzLmggY3Vyc2VzLmggZGxmY24uaCBmY250bC5oIGdycC5oIFwKLXNoYWRvdy5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHRocmVhZC5oIFwKLXN0cm9wdHMuaCB0ZXJtaW9zLmggdGhyZWFkLmggXAorCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gYXNtL3R5cGVzLmggY29uaW8uaCBjdXJzZXMuaCBkaXJlY3QuaCBkbGZjbi5oIGVycm5vLmggXAorZmNudGwuaCBncnAuaCBcCitzaGFkb3cuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCitzaWduYWwuaCBzdHJvcHRzLmggdGVybWlvcy5oIHRocmVhZC5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogc3lzL2F1ZGlvaW8uaCBzeXMvYnNkdHR5Lmggc3lzL2ZpbGUuaCBzeXMvbG9hZGF2Zy5oIHN5cy9sb2NrLmggc3lzL21rZGV2LmggXAogc3lzL21vZGVtLmggXAotc3lzL3BhcmFtLmggc3lzL3BvbGwuaCBzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oIHN5cy9zdGF0dmZzLmggc3lzL3RpbWUuaCBcCi1zeXMvdGltZXMuaCBzeXMvdW4uaCBzeXMvdXRzbmFtZS5oIHN5cy93YWl0LmggcHR5LmggbGlidXRpbC5oIFwKK3N5cy9wYXJhbS5oIHN5cy9wb2xsLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvc3RhdHZmcy5oIHN5cy9zdGF0LmggXAorc3lzL3RpbWUuaCBcCitzeXMvdGltZXMuaCBzeXMvdHlwZXMuaCBzeXMvdW4uaCBzeXMvdXRzbmFtZS5oIHN5cy93YWl0LmggcHR5LmggbGlidXRpbC5oIFwKIHN5cy9yZXNvdXJjZS5oIG5ldHBhY2tldC9wYWNrZXQuaCBzeXNleGl0cy5oIGJsdWV0b290aC5oIFwKIGJsdWV0b290aC9ibHVldG9vdGguaAogZG8KQEAgLTU1MjYsNyArNTU0MSw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtNTcwMCw3ICs1NzE1LDcgQEAKIAlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCiAJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CkBAIC01NzkzLDcgKzU4MDgsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAogICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuCiAgIGJyZWFrCkBAIC01ODkzLDcgKzU5MDgsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAogICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuCiAgIGJyZWFrCkBAIC01OTc5LDcgKzU5OTQsNyBAQAogCWFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCkBAIC02MDUwLDcgKzYwNjUsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTYyMTUsNyArNjIzMCw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtNjM4NSw3ICs2NDAwLDcgQEAKIAlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCiAJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CkBAIC02NDY5LDcgKzY0ODQsNyBAQAogCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKIAkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKQEAgLTY1NzQsNyArNjU4OSw3IEBACiAJYWNfY3ZfaGFzX21ha2VkZXY9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGlmIHRlc3QgIiRhY19jdl9oYXNfbWFrZWRldiIgPSAibm8iOyB0aGVuCiAgICAgIyB3ZSBkaWRuJ3QgbGluaywgdHJ5IGlmIF9PU0ZfU09VUkNFIHdpbGwgYWxsb3cgdXMgdG8gbGluawpAQCAtNjYzOCw3ICs2NjUzLDcgQEAKIAlhY19jdl9oYXNfbWFrZWRldj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogICAgIGlmIHRlc3QgIiRhY19jdl9oYXNfbWFrZWRldiIgPSAieWVzIjsgdGhlbgogCkBAIC02NzI5LDcgKzY3NDQsNyBAQAogCXNvbF9sZnNfYnVnPXllcwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRzb2xfbGZzX2J1ZyIgPiY1CiBlY2hvICIke0VDSE9fVH0kc29sX2xmc19idWciID4mNjsgfQogaWYgdGVzdCAiJHNvbF9sZnNfYnVnIiA9ICJ5ZXMiOyB0aGVuCkBAIC02ODI1LDcgKzY4NDAsNyBAQAogCWFjX2N2X3R5cGVfbW9kZV90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX21vZGVfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9tb2RlX3QiID4mNjsgfQpAQCAtNjkwNSw3ICs2OTIwLDcgQEAKIAlhY19jdl90eXBlX29mZl90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX29mZl90IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX29mZl90IiA+JjY7IH0KQEAgLTY5ODUsNyArNzAwMCw3IEBACiAJYWNfY3ZfdHlwZV9waWRfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9waWRfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9waWRfdCIgPiY2OyB9CkBAIC03MDYzLDcgKzcwNzgsNyBAQAogCWFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpZ25hbCIgPiY2OyB9CkBAIC03MTM5LDcgKzcxNTQsNyBAQAogCWFjX2N2X3R5cGVfc2l6ZV90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaXplX3QiID4mNjsgfQpAQCAtNzI1Nyw3ICs3MjcyLDcgQEAKIAlhY19jdl90eXBlX3NzaXplX3Q9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc3NpemVfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zc2l6ZV90IiA+JjY7IH0KQEAgLTczMzgsNyArNzM1Myw3IEBACiAJYWNfY3ZfdHlwZV9pbnQ9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2ludCIgPiY2OyB9CkBAIC03NDc0LDcgKzc0ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTc1OTksNyArNzYxNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC03NjA4LDEwICs3NjIzLDEwIEBACiAJYWNfbG89IGFjX2hpPQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCiAgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCkBAIC03Njc1LDcgKzc2OTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2ludD0kYWNfbG87OwpAQCAtNzgzOCw3ICs3ODUzLDcgQEAKIAlhY19jdl90eXBlX2xvbmc9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfbG9uZyIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nIiA+JjY7IH0KQEAgLTc5NzQsNyArNzk4OSw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtODA5OSw3ICs4MTE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTgxMDgsMTAgKzgxMjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTgxNzUsNyArODE5MCw3IEBACiAJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfbG9uZz0kYWNfbG87OwpAQCAtODMzOCw3ICs4MzUzLDcgQEAKIAlhY19jdl90eXBlX3ZvaWRfcD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV92b2lkX3AiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdm9pZF9wIiA+JjY7IH0KQEAgLTg0NzQsNyArODQ4OSw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtODU5OSw3ICs4NjE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTg2MDgsMTAgKzg2MjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTg2NzUsNyArODY5MCw3IEBACiAJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2Zfdm9pZF9wPSRhY19sbzs7CkBAIC04ODM4LDcgKzg4NTMsNyBAQAogCWFjX2N2X3R5cGVfc2hvcnQ9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2hvcnQiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2hvcnQiID4mNjsgfQpAQCAtODk3NCw3ICs4OTg5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC05MDk5LDcgKzkxMTQsNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtOTEwOCwxMCArOTEyMywxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtOTE3NSw3ICs5MTkwLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9zaG9ydD0kYWNfbG87OwpAQCAtOTMzOCw3ICs5MzUzLDcgQEAKIAlhY19jdl90eXBlX2Zsb2F0PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2Zsb2F0IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2Zsb2F0IiA+JjY7IH0KQEAgLTk0NzQsNyArOTQ4OSw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtOTU5OSw3ICs5NjE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTk2MDgsMTAgKzk2MjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTk2NzUsNyArOTY5MCw3IEBACiAJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfZmxvYXQ9JGFjX2xvOzsKQEAgLTk4MzgsNyArOTg1Myw3IEBACiAJYWNfY3ZfdHlwZV9kb3VibGU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZG91YmxlIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2RvdWJsZSIgPiY2OyB9CkBAIC05OTc0LDcgKzk5ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEwMDk5LDcgKzEwMTE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEwMTA4LDEwICsxMDEyMywxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMTAxNzUsNyArMTAxOTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0kYWNfbG87OwpAQCAtMTAzMzgsNyArMTAzNTMsNyBAQAogCWFjX2N2X3R5cGVfZnBvc190PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2Zwb3NfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9mcG9zX3QiID4mNjsgfQpAQCAtMTA0NzQsNyArMTA0ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEwNTk5LDcgKzEwNjE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEwNjA4LDEwICsxMDYyMywxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMTA2NzUsNyArMTA2OTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2Zwb3NfdD0kYWNfbG87OwpAQCAtMTA4MzgsNyArMTA4NTMsNyBAQAogCWFjX2N2X3R5cGVfc2l6ZV90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaXplX3QiID4mNjsgfQpAQCAtMTA5NzQsNyArMTA5ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTExMDk5LDcgKzExMTE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTExMTA4LDEwICsxMTEyMywxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMTExNzUsNyArMTExOTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3NpemVfdD0kYWNfbG87OwpAQCAtMTEzNDAsNyArMTEzNTUsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfbG9uZ19sb25nIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRoYXZlX2xvbmdfbG9uZyIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV9sb25nX2xvbmciID0geWVzIDsgdGhlbgpAQCAtMTE0MTAsNyArMTE0MjUsNyBAQAogCWFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQpAQCAtMTE1NDYsNyArMTE1NjEsNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTExNjcxLDcgKzExNjg2LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTExNjgwLDEwICsxMTY5NSwxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMTE3NDcsNyArMTE3NjIsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz0kYWNfbG87OwpAQCAtMTE5MTMsNyArMTE5MjgsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfdWludHB0cl90IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRoYXZlX3VpbnRwdHJfdCIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV91aW50cHRyX3QiID0geWVzIDsgdGhlbgpAQCAtMTE5ODMsNyArMTE5OTgsNyBAQAogCWFjX2N2X3R5cGVfdWludHB0cl90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnRwdHJfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91aW50cHRyX3QiID4mNjsgfQpAQCAtMTIxMTksNyArMTIxMzQsNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEyMjQ0LDcgKzEyMjU5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTEyMjUzLDEwICsxMjI2OCwxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMTIzMjAsNyArMTIzMzUsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdD0kYWNfbG87OwpAQCAtMTI2NDQsNyArMTI2NTksNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfcHRocmVhZF90IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRoYXZlX3B0aHJlYWRfdCIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV9wdGhyZWFkX3QiID0geWVzIDsgdGhlbgpAQCAtMTMxODIsNyArMTMxOTcsNyBAQAogCWFjX2N2X2xpYl9kbF9kbG9wZW49bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xMzI2OSw3ICsxMzI4NCw3IEBACiAJYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTEzMzY0LDcgKzEzMzc5LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQKICAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2VtX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgYnJlYWsKQEAgLTEzNDYyLDcgKzEzNDc3LDcgQEAKIAlhY19jdl9saWJfaW50bF90ZXh0ZG9tYWluPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTM1NDUsNyArMTM1NjAsNyBAQAogZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dDs7CiAJKikgOzsKIGVzYWMKQEAgLTEzNjIzLDcgKzEzNjM4LDcgQEAKIAlhY19jdl9saWJfbnNsX3Rfb3Blbj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTEzNzA0LDcgKzEzNzE5LDcgQEAKIAlhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTEzNzg4LDcgKzEzODAzLDcgQEAKIAlhY19jdl9saWJfbmV0X3NvY2tldD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE0MDcxLDcgKzE0MDg2LDcgQEAKIAlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQogCkBAIC0xNDI0Myw3ICsxNDI1OCw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtMTQ1MzksNyArMTQ1NTQsNyBAQAogCWFjX2N2X2Z1bmNfcHRocmVhZF9kZXRhY2g9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoIiA+JjUKQEAgLTE0NjE2LDcgKzE0NjMxLDcgQEAKIAlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQogCkBAIC0xNDc4Myw3ICsxNDc5OCw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtMTQ5NTgsNyArMTQ5NzMsNyBAQAogCWFjX2N2X2xpYl9wdGhyZWFkc19wdGhyZWFkX2NyZWF0ZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE1MDQ1LDcgKzE1MDYwLDcgQEAKIAlhY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTUxMzIsNyArMTUxNDcsNyBAQAogCWFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTUyMTksNyArMTUyMzQsNyBAQAogCWFjX2N2X2xpYl9jbWFfcHRocmVhZF9jcmVhdGU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNTI1NSw3ICsxNTI3MCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKQEAgLTE1MzM3LDcgKzE1MzUyLDcgQEAKIAlhY19jdl9saWJfbXBjX3VzY29uZmlnPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTU0MjYsNyArMTU0NDEsNyBAQAogCWFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE1NjQ3LDcgKzE1NjYyLDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTU4MjQsNyArMTU4MzksNyBAQAogCQlpcHY2PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCkBAIC0xNjIxOSw3ICsxNjIzNCw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE2NDcxLDcgKzE2NDg2LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTY1NTUsNyArMTY1NzAsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaW5rIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpbmsuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE2NjIzLDcgKzE2NjM4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3ltbGluayIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzeW1saW5rLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNjY5MSw3ICsxNjcwNiw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZjaGRpciIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmY2hkaXIuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE2NzU5LDcgKzE2Nzc0LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZnN5bmMiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZnN5bmMuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE2ODI3LDcgKzE2ODQyLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmRhdGFzeW5jIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZkYXRhc3luYy4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTY4OTUsNyArMTY5MTAsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBPbiBzb21lIHN5c3RlbXMgKGVnLiBGcmVlQlNEIDUpLCB3ZSB3b3VsZCBmaW5kIGEgZGVmaW5pdGlvbiBvZiB0aGUKICMgZnVuY3Rpb25zIGN0ZXJtaWRfciwgc2V0Z3JvdXBzIGluIHRoZSBsaWJyYXJ5LCBidXQgbm8gcHJvdG90eXBlCkBAIC0xNjk3Myw3ICsxNjk4OCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvY2siID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvY2suLi4gJEVDSE9fQyIgPiY2OyB9CkBAIC0xNzA0NSw3ICsxNzA2MCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUuLi4gJEVDSE9fQyIgPiY2OyB9CkBAIC0xNzExNyw3ICsxNzEzMiw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmb3IgYWNfcHJvZyBpbiB0cnVlCiBkbwpAQCAtMTcyMzQsNyArMTcyNDksNyBAQAogCWFjX2N2X2xpYl9jX2luZXRfYXRvbj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE3MzE1LDcgKzE3MzMwLDcgQEAKIAlhY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE3MzM0LDYgKzE3MzQ5LDEwOCBAQAogZmkKIAogCitjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgorRGFyd2luLyopCisJX0NVUl9DRkxBR1M9IiR7Q0ZMQUdTfSIKKwlfQ1VSX0xERkxBR1M9IiR7TERGTEFHU30iCisJQ0ZMQUdTPSIke0NGTEFHU30gLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QiCisJTERGTEFHUz0iJHtMREZMQUdTfSAtV2wsLXNlYXJjaF9wYXRoc19maXJzdCAtTC91c3IvbG9jYWwvbGliIgorCTs7Citlc2FjCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmZsYXRlQ29weSBpbiAtbHoiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5mbGF0ZUNvcHkgaW4gLWx6Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfel9pbmZsYXRlQ29weStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHogICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgaW5mbGF0ZUNvcHkgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBpbmZsYXRlQ29weSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHk9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9saWJfel9pbmZsYXRlQ29weT1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl96X2luZmxhdGVDb3B5IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfel9pbmZsYXRlQ29weSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfel9pbmZsYXRlQ29weSA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1pMSUJfQ09QWSAxCitfQUNFT0YKKworZmkKKworCitjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgorRGFyd2luLyopCisJQ0ZMQUdTPSIke19DVVJfQ0ZMQUdTfSIKKwlMREZMQUdTPSIke19DVVJfTERGTEFHU30iCisJOzsKK2VzYWMKKwogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGhzdHJlcnJvciIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBoc3RyZXJyb3IuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE3NDA0LDcgKzE3NTIxLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5ldF9hdG9uIiA+JjUKQEAgLTE3NDgwLDcgKzE3NTk3LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5ldF9wdG9uIiA+JjUKQEAgLTE3NTU2LDcgKzE3NjczLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgT24gc29tZSBzeXN0ZW1zLCBzZXRncm91cHMgaXMgaW4gdW5pc3RkLmgsIG9uIG90aGVycywgaW4gZ3JwLmgKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzZXRncm91cHMiID4mNQpAQCAtMTc2MzIsNyArMTc3NDksNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBjaGVjayBmb3Igb3BlbnB0eSBhbmQgZm9ya3B0eQogCkBAIC0xNzczMiw3ICsxNzg0OSw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE3ODE1LDcgKzE3OTMyLDcgQEAKIAlhY19jdl9saWJfdXRpbF9vcGVucHR5PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTc4OTgsNyArMTgwMTUsNyBAQAogCWFjX2N2X2xpYl9ic2Rfb3BlbnB0eT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE4MDE0LDcgKzE4MTMxLDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTgwOTcsNyArMTgyMTQsNyBAQAogCWFjX2N2X2xpYl91dGlsX2ZvcmtwdHk9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xODE4MCw3ICsxODI5Nyw3IEBACiAJYWNfY3ZfbGliX2JzZF9mb3JrcHR5PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTgzMDMsNyArMTg0MjAsNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0xODQxOCw3ICsxODUzNSw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE4NTM2LDcgKzE4NjUzLDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTg2MDgsNyArMTg3MjUsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKIGRvbmUKQEAgLTE4NzA5LDcgKzE4ODI2LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTg3ODEsNyArMTg4OTgsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKIGRvbmUKQEAgLTE4ODgyLDcgKzE4OTk5LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTg5NTQsNyArMTkwNzEsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKIGRvbmUKQEAgLTE5MDQwLDcgKzE5MTU3LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogCiAjIE9uIE9TRi8xIFY1LjEsIGdldGFkZHJpbmZvIGlzIGF2YWlsYWJsZSwgYnV0IGEgZGVmaW5lCkBAIC0xOTI1NSw3ICsxOTM3Miw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogaWYgdGVzdCAiJGJ1Z2d5Z2V0YWRkcmluZm8iID0gInllcyI7IHRoZW4KQEAgLTE5MzY3LDcgKzE5NDg0LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTk0NDksNyArMTk1NjYsNyBAQAogCWFjX2N2X2hlYWRlcl90aW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQpAQCAtMTk1MjUsNyArMTk2NDIsNyBAQAogCWFjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3RfdG0iID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0cnVjdF90bSIgPiY2OyB9CkBAIC0xOTY2MywxMCArMTk3ODAsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID4mNjsgfQpAQCAtMTk3NTMsNyArMTk4NzAsNyBAQAogCWFjX2N2X2hhdmVfZGVjbF90em5hbWU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNjsgfQpAQCAtMTk4MzksNyArMTk5NTYsNyBAQAogCWFjX2N2X3Zhcl90em5hbWU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdHpuYW1lIiA+JjUKQEAgLTE5OTczLDEwICsyMDA5MCwxMCBAQAogCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9yZGV2PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9yZGV2IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPiY2OyB9CkBAIC0yMDEwOSwxMCArMjAyMjYsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3NpemUiID4mNjsgfQpAQCAtMjAyNDUsMTAgKzIwMzYyLDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9mbGFncyIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzIiA+JjY7IH0KQEAgLTIwMzgxLDEwICsyMDQ5OCwxMCBAQAogCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW49bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbiIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbiIgPiY2OyB9CkBAIC0yMDUxNywxMCArMjA2MzQsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9iaXJ0aHRpbWUiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9iaXJ0aHRpbWUiID4mNjsgfQpAQCAtMjA2NTMsMTAgKzIwNzcwLDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2Nrcz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzIiA+JjY7IH0KQEAgLTIwNzQ0LDcgKzIwODYxLDcgQEAKIAlhY19jdl9oZWFkZXJfdGltZV9hbHR6b25lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUiID4mNQpAQCAtMjA4MjgsNyArMjA5NDUsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdhc19pdF9kZWZpbmVkIiA+JjUKIGVjaG8gIiR7RUNIT19UfSR3YXNfaXRfZGVmaW5lZCIgPiY2OyB9CiAKQEAgLTIwODk1LDcgKzIxMDEyLDcgQEAKIAlhY19jdl9zdHJ1Y3RfYWRkcmluZm89bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X2FkZHJpbmZvIiA+JjUKQEAgLTIwOTcyLDcgKzIxMDg5LDcgQEAKIAlhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPiY1CkBAIC0yMTA1Miw3ICsyMTE2OSw3IEBACiAJYWNfY3ZfY19jaGFyX3Vuc2lnbmVkPXllcwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jaGFyX3Vuc2lnbmVkIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NoYXJfdW5zaWduZWQiID4mNjsgfQpAQCAtMjExNzQsNyArMjEyOTEsNyBAQAogCWFjX2N2X2NfY29uc3Q9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29uc3QiID4mNjsgfQpAQCAtMjEyNTIsNyArMjEzNjksNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdvcmtzIiA+JjUKIGVjaG8gIiR7RUNIT19UfSR3b3JrcyIgPiY2OyB9CiAKQEAgLTIxMzIxLDcgKzIxNDM4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3b3JrcyIgPiY1CiBlY2hvICIke0VDSE9fVH0kd29ya3MiID4mNjsgfQogCkBAIC0yMTM5Miw3ICsyMTUwOSw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV9wcm90b3R5cGVzIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRoYXZlX3Byb3RvdHlwZXMiID4mNjsgfQogCkBAIC0yMTQ3Myw3ICsyMTU5MCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd29ya3MiID4mNQogZWNobyAiJHtFQ0hPX1R9JHdvcmtzIiA+JjY7IH0KIApAQCAtMjE1NDgsNyArMjE2NjUsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBjaGVjayBpZiBzb2NrYWRkciBoYXMgc2FfbGVuIG1lbWJlcgogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHIgaGFzIHNhX2xlbiBtZW1iZXIiID4mNQpAQCAtMjE2MTksNyArMjE3MzYsNyBAQAogZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIHZhX2xpc3RfaXNfYXJyYXk9bm8KIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdmFfbGlzdCBpcyBhbiBhcnJheSIgPiY1CkBAIC0yMTY5NCw3ICsyMTgxMSw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkdmFfbGlzdF9pc19hcnJheSIgPiY1CiBlY2hvICIke0VDSE9fVH0kdmFfbGlzdF9pc19hcnJheSIgPiY2OyB9CiAKQEAgLTIxNzk0LDcgKzIxOTExLDcgQEAKIAlhY19jdl9mdW5jX2dldGhvc3RieW5hbWVfcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZV9yIiA+JjUKQEAgLTIyMDUxLDE1ICsyMjE2OCwxNSBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBDRkxBR1M9JE9MRF9DRkxBR1MKIAogZWxzZQpAQCAtMjIxNjAsNyArMjIyNzcsNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0yMjI3OSw3ICsyMjM5Niw3IEBACiAJYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sIiA+JjUKQEAgLTIyMzU5LDcgKzIyNDc2LDcgQEAKIAlhY19jdl9saWJfaWVlZV9fX2ZwdV9jb250cm9sPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjI1NTksNyArMjI2NzYsNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0yMjY0Nyw3ICsyMjc2NCw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtMjI4MjQsNyArMjI5NDEsNyBAQAogCWFjX2N2X3R5cGVfd2NoYXJfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV93Y2hhcl90IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3djaGFyX3QiID4mNjsgfQpAQCAtMjI5NjIsNyArMjMwNzksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTIzMDg5LDcgKzIzMjA2LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTIzMDk4LDEwICsyMzIxNSwxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtMjMxNjYsNyArMjMyODMsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3djaGFyX3Q9JGFjX2xvOzsKQEAgLTIzMzM3LDcgKzIzNDU0LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXZlX3VjczRfdGNsIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRoYXZlX3VjczRfdGNsIiA+JjY7IH0KIApAQCAtMjM2MjIsNyArMjM3MzksNyBAQAogCWFjX2N2X2NfYmlnZW5kaWFuPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKQEAgLTIzNzAzLDcgKzIzODIwLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCkBAIC0yMzc2NCw3ICsyMzg4MSw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9CkBAIC0yMzkyNyw3ICsyNDA0NCw3IEBACiAJYWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCkBAIC0yNDAxNyw3ICsyNDEzNCw3IEBACiAJYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjQxMDYsNyArMjQyMjMsNyBAQAogCWFjX2N2X2xpYl90ZXJtY2FwX3JlYWRsaW5lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjQxOTUsNyArMjQzMTIsNyBAQAogCWFjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGw9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0yNDM0Niw3ICsyNDQ2Myw3IEBACiAJYWNfY3ZfbGliX3JlYWRsaW5lX3JsX3ByZV9pbnB1dF9ob29rPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjQ0MzMsNyArMjQ1NTAsNyBAQAogCWFjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX21hdGNoZXM9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0yNDc5NiwxMCArMjQ5MTMsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID4mNjsgfQpAQCAtMjQ4ODYsNyArMjUwMDMsNyBAQAogCWFjX2N2X2hhdmVfZGVjbF90em5hbWU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNjsgfQpAQCAtMjQ5NzIsNyArMjUwODksNyBAQAogCWFjX2N2X3Zhcl90em5hbWU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdHpuYW1lIiA+JjUKQEAgLTI1MTgwLDcgKzI1Mjk3LDcgQEAKIAlhY19jdl9zdGF0X3R2X25zZWM9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RhdF90dl9uc2VjIiA+JjUKQEAgLTI1MjYwLDcgKzI1Mzc3LDcgQEAKIAlhY19jdl9zdGF0X3R2X25zZWMyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N0YXRfdHZfbnNlYzIiID4mNQpAQCAtMjUzNDAsNyArMjU0NTcsNyBAQAogCWFjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb249bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbXZ3ZGVsY2hfaXNfZXhwcmVzc2lvbiIgPiY1CkBAIC0yNTQyMCw3ICsyNTUzNyw3IEBACiAJYWNfY3Zfd2luZG93X2hhc19mbGFncz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl93aW5kb3dfaGFzX2ZsYWdzIiA+JjUKQEAgLTI1NDM2LDQwICsyNTU1MywyNjQgQEAKIAogZmkKIAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRteCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAvZGV2L3B0bXguLi4gJEVDSE9fQyIgPiY2OyB9Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaXNfdGVybV9yZXNpemVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGlzX3Rlcm1fcmVzaXplZC4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN1cnNlcy5oPgoraW50CittYWluICgpCit7Cit2b2lkICp4PWlzX3Rlcm1fcmVzaXplZAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgogCi1pZiB0ZXN0IC1lIC9kZXYvcHRteAotdGhlbgorY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVEIDEKK19BQ0VPRgorCiAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKIGVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciByZXNpemVfdGVybSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZXNpemVfdGVybS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN1cnNlcy5oPgoraW50CittYWluICgpCit7Cit2b2lkICp4PXJlc2l6ZV90ZXJtCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNIDEKK19BQ0VPRgorCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciByZXNpemV0ZXJtIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHJlc2l6ZXRlcm0uLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdXJzZXMuaD4KK2ludAorbWFpbiAoKQorewordm9pZCAqeD1yZXNpemV0ZXJtCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQ1VSU0VTX1JFU0laRVRFUk0gMQorX0FDRU9GCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRteCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAvZGV2L3B0bXguLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2ZpbGVfX2Rldl9wdG14K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzICYmCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQoraWYgdGVzdCAtciAiL2Rldi9wdG14IjsgdGhlbgorICBhY19jdl9maWxlX19kZXZfcHRteD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmlsZV9fZGV2X3B0bXg9bm8KK2ZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZmlsZV9fZGV2X3B0bXgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2ZpbGVfX2Rldl9wdG14IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2ZpbGVfX2Rldl9wdG14ID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCiAjZGVmaW5lIEhBVkVfREVWX1BUTVggMQogX0FDRU9GCiAKLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgL2Rldi9wdGMiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgL2Rldi9wdGMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0KLWlmIHRlc3QgLWUgL2Rldi9wdGMKLXRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfZmlsZV9fZGV2X3B0YytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2lmIHRlc3QgLXIgIi9kZXYvcHRjIjsgdGhlbgorICBhY19jdl9maWxlX19kZXZfcHRjPXllcworZWxzZQorICBhY19jdl9maWxlX19kZXZfcHRjPW5vCitmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2ZpbGVfX2Rldl9wdGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2ZpbGVfX2Rldl9wdGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfZmlsZV9fZGV2X3B0YyA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBIQVZFX0RFVl9QVEMgMQogX0FDRU9GCiAKLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCisKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAlemQgcHJpbnRmKCkgZm9ybWF0IHN1cHBvcnQiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJXpkIHByaW50ZigpIGZvcm1hdCBzdXBwb3J0Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KQEAgLTI1NjE3LDcgKzI1OTU4LDcgQEAKIAlhY19jdl90eXBlX3NvY2tsZW5fdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc29ja2xlbl90IiA+JjY7IH0KQEAgLTI2MDM4LDcgKzI2Mzc5LDcgQEAKICMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCiBhY19sb2c9IgogVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBweXRob24gJGFzX21lIDMuMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTllLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjAuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCiAgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwpAQCAtMjYwODcsNyArMjY0MjgsNyBAQAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKIGFjX2NzX3ZlcnNpb249IlxcCiBweXRob24gY29uZmlnLnN0YXR1cyAzLjAKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OWUsCitjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjAsCiAgIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCiAKIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KQEAgLTI2NzA1LDYgKzI3MDQ2LDcgQEAKIAogdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKICAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCiAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwogd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1CiBlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IGQ5NjI2ZjkuLjVkNDRjY2UgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTIzNSw4ICsyMzUsOCBAQAogICAjIE9uIE1hYyBPUyBYIDEwLjQsIGRlZmluaW5nIF9QT1NJWF9DX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFCiAgICMgZGlzYWJsZXMgcGxhdGZvcm0gc3BlY2lmaWMgZmVhdHVyZXMgYmV5b25kIHJlcGFpci4KICAgIyBPbiBNYWMgT1MgWCAxMC4zLCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRSAKLSAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KLSAgRGFyd2luL0A8OkA3OEA6PkAuKikKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5pbmcgdGhlbQorICBEYXJ3aW4vQDw6QDc4OUA6PkAuKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMTA2NiwxNCArMTA2NiwxNiBAQAogCiAjIGNoZWNrcyBmb3IgaGVhZGVyIGZpbGVzCiBBQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhhc20vdHlwZXMuaCBjdXJzZXMuaCBkbGZjbi5oIGZjbnRsLmggZ3JwLmggXAotc2hhZG93LmggbGFuZ2luZm8uaCBsaWJpbnRsLmggbmN1cnNlcy5oIHBvbGwuaCBwdGhyZWFkLmggXAotc3Ryb3B0cy5oIHRlcm1pb3MuaCB0aHJlYWQuaCBcCitBQ19DSEVDS19IRUFERVJTKGFzbS90eXBlcy5oIGNvbmlvLmggY3Vyc2VzLmggZGlyZWN0LmggZGxmY24uaCBlcnJuby5oIFwKK2ZjbnRsLmggZ3JwLmggXAorc2hhZG93LmggaW8uaCBsYW5naW5mby5oIGxpYmludGwuaCBuY3Vyc2VzLmggcG9sbC5oIHByb2Nlc3MuaCBwdGhyZWFkLmggXAorc2lnbmFsLmggc3Ryb3B0cy5oIHRlcm1pb3MuaCB0aHJlYWQuaCBcCiB1bmlzdGQuaCB1dGltZS5oIFwKIHN5cy9hdWRpb2lvLmggc3lzL2JzZHR0eS5oIHN5cy9maWxlLmggc3lzL2xvYWRhdmcuaCBzeXMvbG9jay5oIHN5cy9ta2Rldi5oIFwKIHN5cy9tb2RlbS5oIFwKLXN5cy9wYXJhbS5oIHN5cy9wb2xsLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvc3RhdHZmcy5oIHN5cy90aW1lLmggXAotc3lzL3RpbWVzLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIGxpYnV0aWwuaCBcCitzeXMvcGFyYW0uaCBzeXMvcG9sbC5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2V0Lmggc3lzL3N0YXR2ZnMuaCBzeXMvc3RhdC5oIFwKK3N5cy90aW1lLmggXAorc3lzL3RpbWVzLmggc3lzL3R5cGVzLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIGxpYnV0aWwuaCBcCiBzeXMvcmVzb3VyY2UuaCBuZXRwYWNrZXQvcGFja2V0Lmggc3lzZXhpdHMuaCBibHVldG9vdGguaCBcCiBibHVldG9vdGgvYmx1ZXRvb3RoLmgpCiBBQ19IRUFERVJfRElSRU5UCkBAIC0yMzQ5LDYgKzIzNTEsMzUgQEAKICAgQUNfQ0hFQ0tfTElCKHJlc29sdiwgaW5ldF9hdG9uKQogKQogCitkbmwgQ2hlY2sgaWYgc3lzdGVtIHpsaWIgaGFzICpDb3B5KCkgZnVuY3Rpb25zCitkbmwKK2RubCBPbiBNYWNPU1ggdGhlIGxpbmtlciB3aWxsIHNlYXJjaCBmb3IgZHlsaWJzIG9uIHRoZSBlbnRpcmUgbGlua2VyIHBhdGgKK2RubCBiZWZvcmUgc2VhcmNoaW5nIGZvciBzdGF0aWMgbGlicmFyaWVzLiBzZXR1cC5weSBhZGRzIC1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0CitkbmwgdG8gcmV2ZXJ0IHRvIGEgbW9yZSB0cmFkaXRpb25hbCB1bml4IGJlaGF2aW91ciBhbmQgbWFrZSBpdCBwb3NzaWJsZSB0bworZG5sIG92ZXJyaWRlIHRoZSBzeXN0ZW0gbGlieiB3aXRoIGEgbG9jYWwgc3RhdGljIGxpYnJhcnkgb2YgbGliei4gVGVtcG9yYXJpbHkKK2RubCBhZGQgdGhhdCBmbGFnIHRvIG91ciBDRkxBR1MgYXMgd2VsbCB0byBlbnN1cmUgdGhhdCB3ZSBjaGVjayB0aGUgdmVyc2lvbgorZG5sIG9mIGxpYnogdGhhdCB3aWxsIGJlIHVzZWQgYnkgc2V0dXAucHkuIAorZG5sIFRoZSAtTC91c3IvbG9jYWwvbGliIGlzIG5lZWRlZCBhcyB3ZWwgdG8gZ2V0IHRoZSBzYW1lIGNvbXBpbGF0aW9uIAorZG5sIGVudmlyb25tZW50IGFzIHNldHVwLnB5IChhbmQgbGVhdmluZyBpdCBvdXQgY2FuIGNhdXNlIGNvbmZpZ3VyZSB0byB1c2UgdGhlCitkbmwgd3JvbmcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSkKK2Nhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCitEYXJ3aW4vKikgCisJX0NVUl9DRkxBR1M9IiR7Q0ZMQUdTfSIKKwlfQ1VSX0xERkxBR1M9IiR7TERGTEFHU30iCisJQ0ZMQUdTPSIke0NGTEFHU30gLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QiCisJTERGTEFHUz0iJHtMREZMQUdTfSAtV2wsLXNlYXJjaF9wYXRoc19maXJzdCAtTC91c3IvbG9jYWwvbGliIgorCTs7Citlc2FjCisKK0FDX0NIRUNLX0xJQih6LCBpbmZsYXRlQ29weSwgQUNfREVGSU5FKEhBVkVfWkxJQl9DT1BZLCAxLCBEZWZpbmUgaWYgdGhlIHpsaWIgbGlicmFyeSBoYXMgaW5mbGF0ZUNvcHkpKQorCitjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgorRGFyd2luLyopIAorCUNGTEFHUz0iJHtfQ1VSX0NGTEFHU30iCisJTERGTEFHUz0iJHtfQ1VSX0xERkxBR1N9IgorCTs7Citlc2FjCisKIEFDX01TR19DSEVDS0lORyhmb3IgaHN0cmVycm9yKQogQUNfVFJZX0xJTksoWwogI2luY2x1ZGUgImNvbmZkZWZzLmgiIApAQCAtMzI5MCwyNyArMzMyMSwyOSBAQAogICBbRGVmaW5lIGlmIFdJTkRPVyBpbiBjdXJzZXMuaCBvZmZlcnMgYSBmaWVsZCBfZmxhZ3MuXSkKIGZpCiAKLUFDX01TR19DSEVDS0lORyhmb3IgL2Rldi9wdG14KQotCi1pZiB0ZXN0IC1lIC9kZXYvcHRteAotdGhlbgotICBBQ19NU0dfUkVTVUxUKHllcykKLSAgQUNfREVGSU5FKEhBVkVfREVWX1BUTVgsIDEsCi0gIFtEZWZpbmUgaWYgd2UgaGF2ZSAvZGV2L3B0bXguXSkKLWVsc2UKK0FDX01TR19DSEVDS0lORyhmb3IgaXNfdGVybV9yZXNpemVkKQorQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjdXJzZXMuaD5dLCB2b2lkICp4PWlzX3Rlcm1fcmVzaXplZCwKKyAgQUNfREVGSU5FKEhBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRCwgMSwgRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaXNfdGVybV9yZXNpemVkJyBmdW5jdGlvbi4pCisgIEFDX01TR19SRVNVTFQoeWVzKSwKICAgQUNfTVNHX1JFU1VMVChubykKLWZpCispCiAKLUFDX01TR19DSEVDS0lORyhmb3IgL2Rldi9wdGMpCi0KLWlmIHRlc3QgLWUgL2Rldi9wdGMKLXRoZW4KLSAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIEFDX0RFRklORShIQVZFX0RFVl9QVEMsIDEsCi0gIFtEZWZpbmUgaWYgd2UgaGF2ZSAvZGV2L3B0Yy5dKQotZWxzZQorQUNfTVNHX0NIRUNLSU5HKGZvciByZXNpemVfdGVybSkKK0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8Y3Vyc2VzLmg+XSwgdm9pZCAqeD1yZXNpemVfdGVybSwKKyAgQUNfREVGSU5FKEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNLCAxLCBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdyZXNpemVfdGVybScgZnVuY3Rpb24uKQorICBBQ19NU0dfUkVTVUxUKHllcyksCiAgIEFDX01TR19SRVNVTFQobm8pCi1maQorKQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHJlc2l6ZXRlcm0pCitBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGN1cnNlcy5oPl0sIHZvaWQgKng9cmVzaXpldGVybSwKKyAgQUNfREVGSU5FKEhBVkVfQ1VSU0VTX1JFU0laRVRFUk0sIDEsIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Jlc2l6ZXRlcm0nIGZ1bmN0aW9uLikKKyAgQUNfTVNHX1JFU1VMVCh5ZXMpLAorICBBQ19NU0dfUkVTVUxUKG5vKQorKQorCitBQ19DSEVDS19GSUxFKC9kZXYvcHRteCwgQUNfREVGSU5FKEhBVkVfREVWX1BUTVgsIDEsIFtEZWZpbmUgaWYgd2UgaGF2ZSAvZGV2L3B0bXguXSkpCitBQ19DSEVDS19GSUxFKC9kZXYvcHRjLCBBQ19ERUZJTkUoSEFWRV9ERVZfUFRDLCAxLCBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdGMuXSkpCiAKIEFDX01TR19DSEVDS0lORyhmb3IgJXpkIHByaW50ZigpIGZvcm1hdCBzdXBwb3J0KQogQUNfVFJZX1JVTihbI2luY2x1ZGUgPHN0ZGlvLmg+CmRpZmYgLS1naXQgYS9weWNvbmZpZy5oLmluIGIvcHljb25maWcuaC5pbgppbmRleCAxNDY4YmY2Li5hM2Q3ZjZlIDEwMDY0NAotLS0gYS9weWNvbmZpZy5oLmluCisrKyBiL3B5Y29uZmlnLmguaW4KQEAgLTczLDYgKzczLDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29uZnN0cicgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9DT05GU1RSCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y29uaW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DT05JT19ICisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY3Rlcm1pZCcgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9DVEVSTUlECiAKQEAgLTgyLDYgKzg1LDE1IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN1cnNlcy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0NVUlNFU19ICiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2lzX3Rlcm1fcmVzaXplZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Jlc2l6ZXRlcm0nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ1VSU0VTX1JFU0laRVRFUk0KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAncmVzaXplX3Rlcm0nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZXZpY2UgbWFjcm9zLiAqLwogI3VuZGVmIEhBVkVfREVWSUNFX01BQ1JPUwogCkBAIC05MSw2ICsxMDMsOSBAQAogLyogRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdG14LiAqLwogI3VuZGVmIEhBVkVfREVWX1BUTVgKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ESVJFQ1RfSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCiAgICAqLwogI3VuZGVmIEhBVkVfRElSRU5UX0gKQEAgLTEwNyw2ICsxMjIsOSBAQAogLyogRGVmaW5lZCB3aGVuIGFueSBkeW5hbWljIG1vZHVsZSBsb2FkaW5nIGlzIGVuYWJsZWQuICovCiAjdW5kZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0VSUk5PX0gKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleGVjdicgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9FWEVDVgogCkBAIC0yNDgsNiArMjY2LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9JTlRUWVBFU19ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JT19ICisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga2lsbCcgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9LSUxMCiAKQEAgLTM1Myw2ICszNzQsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfUE9MTF9ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHJvY2Vzcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1BST0NFU1NfSAorCiAvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGUgKi8KICN1bmRlZiBIQVZFX1BST1RPVFlQRVMKIApAQCAtNDQ2LDYgKzQ3MCw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ2ludGVycnVwdCcgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9TSUdJTlRFUlJVUFQKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TSUdOQUxfSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3JlbHNlJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1NJR1JFTFNFCiAKQEAgLTY5Miw2ICs3MTksOSBAQAogICAgKi8KICN1bmRlZiBIQVZFX1dPUktJTkdfVFpTRVQKIAorLyogRGVmaW5lIGlmIHRoZSB6bGliIGxpYnJhcnkgaGFzIGluZmxhdGVDb3B5ICovCisjdW5kZWYgSEFWRV9aTElCX0NPUFkKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZ2V0cHR5JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX19HRVRQVFkKIApkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCBiZDliOGI4Li41ZDcxMTgxIDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtNjM4LDYgKzYzOCwyNCBAQAogICAgICAgICAgICAgZGJfaW5jX3BhdGhzLmFwcGVuZCgnL3BrZy9kYi0zLiVkL2luY2x1ZGUnICUgeCkKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy9vcHQvZGItMy4lZC9pbmNsdWRlJyAlIHgpCiAKKyAgICAgICAgIyBBZGQgc29tZSBjb21tb24gc3ViZGlyZWN0b3JpZXMgZm9yIFNsZWVweWNhdCBEQiB0byB0aGUgbGlzdCwKKyAgICAgICAgIyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3Rvcmllcy4gVGhpcyB3YXkgREIzLzQgZ2V0cworICAgICAgICAjIHBpY2tlZCB1cCB3aGVuIGl0IGlzIGluc3RhbGxlZCBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXggYW5kCisgICAgICAgICMgdGhlIHVzZXIgaGFzIGFkZGVkIHRoYXQgcHJlZml4IGludG8gaW5jX2RpcnMuCisgICAgICAgIHN0ZF92YXJpYW50cyA9IFtdCisgICAgICAgIGZvciBkbiBpbiBpbmNfZGlyczoKKyAgICAgICAgICAgIHN0ZF92YXJpYW50cy5hcHBlbmQob3MucGF0aC5qb2luKGRuLCAnZGIzJykpCisgICAgICAgICAgICBzdGRfdmFyaWFudHMuYXBwZW5kKG9zLnBhdGguam9pbihkbiwgJ2RiNCcpKQorICAgICAgICAgICAgZm9yIHggaW4gKDAsMSwyLDMsNCk6CisgICAgICAgICAgICAgICAgc3RkX3ZhcmlhbnRzLmFwcGVuZChvcy5wYXRoLmpvaW4oZG4sICJkYjQlZCIleCkpCisgICAgICAgICAgICAgICAgc3RkX3ZhcmlhbnRzLmFwcGVuZChvcy5wYXRoLmpvaW4oZG4sICJkYjQuJWQiJXgpKQorICAgICAgICAgICAgZm9yIHggaW4gKDIsMyk6CisgICAgICAgICAgICAgICAgc3RkX3ZhcmlhbnRzLmFwcGVuZChvcy5wYXRoLmpvaW4oZG4sICJkYjMlZCIleCkpCisgICAgICAgICAgICAgICAgc3RkX3ZhcmlhbnRzLmFwcGVuZChvcy5wYXRoLmpvaW4oZG4sICJkYjMuJWQiJXgpKQorCisgICAgICAgIGRiX2luY19wYXRocyA9IHN0ZF92YXJpYW50cyArIGRiX2luY19wYXRocworCisKICAgICAgICAgZGJfdmVyX2luY19tYXAgPSB7fQogCiAgICAgICAgIGNsYXNzIGRiX2ZvdW5kKEV4Y2VwdGlvbik6IHBhc3MKQEAgLTg4NCw4ICs5MDIsMTIgQEAKIAogICAgICAgICAjIEN1cnNlcyBzdXBwb3J0LCByZXF1aXJpbmcgdGhlIFN5c3RlbSBWIHZlcnNpb24gb2YgY3Vyc2VzLCBvZnRlbgogICAgICAgICAjIHByb3ZpZGVkIGJ5IHRoZSBuY3Vyc2VzIGxpYnJhcnkuCisgICAgICAgIHBhbmVsX2xpYnJhcnkgPSAncGFuZWwnCiAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAnbmN1cnNlc3cnKSk6CiAgICAgICAgICAgICBjdXJzZXNfbGlicyA9IFsnbmN1cnNlc3cnXQorICAgICAgICAgICAgIyBCdWcgMTQ2NDA1NjogSWYgX2N1cnNlcy5zbyBsaW5rcyB3aXRoIG5jdXJzZXN3LAorICAgICAgICAgICAgIyBfY3Vyc2VzX3BhbmVsLnNvIG11c3QgbGluayB3aXRoIHBhbmVsdy4KKyAgICAgICAgICAgIHBhbmVsX2xpYnJhcnkgPSAncGFuZWx3JwogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX2N1cnNlcycsIFsnX2N1cnNlc21vZHVsZS5jJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IGN1cnNlc19saWJzKSApCiAgICAgICAgIGVsaWYgKHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsICduY3Vyc2VzJykpOgpAQCAtOTA4LDkgKzkzMCw5IEBACiAKICAgICAgICAgIyBJZiB0aGUgY3Vyc2VzIG1vZHVsZSBpcyBlbmFibGVkLCBjaGVjayBmb3IgdGhlIHBhbmVsIG1vZHVsZQogICAgICAgICBpZiAobW9kdWxlX2VuYWJsZWQoZXh0cywgJ19jdXJzZXMnKSBhbmQKLSAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsICdwYW5lbCcpKToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIHBhbmVsX2xpYnJhcnkpKToKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19jdXJzZXNfcGFuZWwnLCBbJ19jdXJzZXNfcGFuZWwuYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbJ3BhbmVsJ10gKyBjdXJzZXNfbGlicykgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbcGFuZWxfbGlicmFyeV0gKyBjdXJzZXNfbGlicykgKQogCiAKICAgICAgICAgIyBBbmRyZXcgS3VjaGxpbmcncyB6bGliIG1vZHVsZS4gIE5vdGUgdGhhdCBzb21lIHZlcnNpb25zIG9mIHpsaWIKQEAgLTk0MCwxMyArOTYyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBpZiB2ZXJzaW9uID49IHZlcnNpb25fcmVxOgogICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAneicpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9leHRyYV9saW5rX2FyZ3MgPSAoJy1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JywpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2V4dHJhX2xpbmtfYXJncyA9ICgpCiAgICAgICAgICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ3psaWInLCBbJ3psaWJtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IFsneiddKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gWyd6J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzID0gemxpYl9leHRyYV9saW5rX2FyZ3MpKQogCiAgICAgICAgICMgR3VzdGF2byBOaWVtZXllcidzIGJ6MiBtb2R1bGUuCiAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAnYnoyJykpOgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgICAgIGJ6Ml9leHRyYV9saW5rX2FyZ3MgPSAoJy1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JywpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ6Ml9leHRyYV9saW5rX2FyZ3MgPSAoKQogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignYnoyJywgWydiejJtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbJ2J6MiddKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IFsnYnoyJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncyA9IGJ6Ml9leHRyYV9saW5rX2FyZ3MpICkKIAogICAgICAgICAjIEludGVyZmFjZSB0byB0aGUgRXhwYXQgWE1MIHBhcnNlcgogICAgICAgICAjCkBAIC0xMzIxLDYgKzEzNTMsNyBAQAogICAgICAgICBzZWxmLnVzZV9zeXN0ZW1fbGliZmZpID0gRmFsc2UKICAgICAgICAgaW5jbHVkZV9kaXJzID0gW10KICAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gW10KKyAgICAgICAgZXh0cmFfbGlua19hcmdzID0gW10KICAgICAgICAgc291cmNlcyA9IFsnX2N0eXBlcy9fY3R5cGVzLmMnLAogICAgICAgICAgICAgICAgICAgICdfY3R5cGVzL2NhbGxiYWNrcy5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jYWxscHJvYy5jJywKQEAgLTEzMzUsOSArMTM2OCwyMSBAQAogIyBYWFggSXMgdGhpcyBzdGlsbCBuZWVkZWQ/CiAjIyAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncy5leHRlbmQoWyctcmVhZF9vbmx5X3JlbG9jcycsICd3YXJuaW5nJ10pCiAKKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ3N1bm9zNSc6CisgICAgICAgICAgICAjIFhYWCBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3Nhcnk7IGl0IGFwcGVhcnMgdGhhdCBzb21lCisgICAgICAgICAgICAjIG9mIHRoZSBhc3NlbWJsZXIgY29kZSBpcyBub24tUElDIChpLmUuIGl0IGhhcyByZWxvY2F0aW9ucworICAgICAgICAgICAgIyB3aGVuIGl0IHNob3VsZG4ndC4gVGhlIHByb3BlciBmaXggd291bGQgYmUgdG8gcmV3cml0ZQorICAgICAgICAgICAgIyB0aGUgYXNzZW1ibGVyIGNvZGUgdG8gYmUgUElDLgorICAgICAgICAgICAgIyBUaGlzIG9ubHkgd29ya3Mgd2l0aCBHQ0M7IHRoZSBTdW4gY29tcGlsZXIgbGlrZWx5IHJlZnVzZXMKKyAgICAgICAgICAgICMgdGhpcyBvcHRpb24uIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgY3R5cGVzIHdpdGggdGhlIFN1bgorICAgICAgICAgICAgIyBjb21waWxlciwgcGxlYXNlIHJlc2VhcmNoIGEgcHJvcGVyIHNvbHV0aW9uLCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAjIGZpbmRpbmcgc29tZSAteiBvcHRpb24gZm9yIHRoZSBTdW4gY29tcGlsZXIuCisgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3MuYXBwZW5kKCctbWltcHVyZS10ZXh0JykKKwogICAgICAgICBleHQgPSBFeHRlbnNpb24oJ19jdHlwZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncz1leHRyYV9jb21waWxlX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9ZXh0cmFfbGlua19hcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1zb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcz1kZXBlbmRzKQo=