ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZGlzLnRleCBiL0RvYy9saWIvbGliZGlzLnRleAppbmRleCAxNmI2OTJkLi41NjdjMGVlIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmRpcy50ZXgKKysrIGIvRG9jL2xpYi9saWJkaXMudGV4CkBAIC0yMywxNyArMjMsMTUgQEAKIAogXGJlZ2lue3ZlcmJhdGltfQogPj4+IGRpcy5kaXMobXlmdW5jKQotICAgICAgICAgIDAgU0VUX0xJTkVOTyAgICAgICAgICAxCi0KLSAgICAgICAgICAzIFNFVF9MSU5FTk8gICAgICAgICAgMgotICAgICAgICAgIDYgTE9BRF9HTE9CQUwgICAgICAgICAwIChsZW4pCi0gICAgICAgICAgOSBMT0FEX0ZBU1QgICAgICAgICAgIDAgKGFsaXN0KQotICAgICAgICAgMTIgQ0FMTF9GVU5DVElPTiAgICAgICAxCi0gICAgICAgICAxNSBSRVRVUk5fVkFMVUUgICAKLSAgICAgICAgIDE2IExPQURfQ09OU1QgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgIDE5IFJFVFVSTl9WQUxVRSAgIAorICAyICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChsZW4pCisgICAgICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGFsaXN0KQorICAgICAgICAgICAgICA2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCisgICAgICAgICAgICAgIDkgUkVUVVJOX1ZBTFVFICAgICAgICAKKyAgICAgICAgICAgICAxMCBSRVRVUk5fTk9ORQogXGVuZHt2ZXJiYXRpbX0KIAorKFRoZSBgYDInJyBpcyBhIGxpbmUgbnVtYmVyKS4KKwogVGhlIFxtb2R1bGV7ZGlzfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzOgogCiBcYmVnaW57ZnVuY2Rlc2N9e2Rpc317XG9wdGlvbmFse2J5dGVzb3VyY2V9fQpAQCAtNTYsNiArNTQsNyBAQAogd2FzIHByb3ZpZGVkLiAgVGhlIG91dHB1dCBpcyBkaXZpZGVkIGluIHRoZSBmb2xsb3dpbmcgY29sdW1uczoKIAogXGJlZ2lue2VudW1lcmF0ZX0KK1xpdGVtIHRoZSBsaW5lIG51bWJlciwgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBlYWNoIGxpbmUKIFxpdGVtIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLCBpbmRpY2F0ZWQgYXMgXHNhbXB7LS0+fSwKIFxpdGVtIGEgbGFiZWxsZWQgaW5zdHJ1Y3Rpb24sIGluZGljYXRlZCB3aXRoIFxzYW1wez5cY29kZXs+fX0sCiBcaXRlbSB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCkBAIC00MDIsNiArNDAxLDE0IEBACiBSZXR1cm5zIHdpdGggVE9TIHRvIHRoZSBjYWxsZXIgb2YgdGhlIGZ1bmN0aW9uLgogXGVuZHtvcGNvZGVkZXNjfQogCitcYmVnaW57b3Bjb2RlZGVzY317UkVUVVJOX05PTkV9e30KK1JldHVybnMgXGNvbnN0YW50e05vbmV9IHRvIHRoZSBjYWxsZXIgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBvcGNvZGUgaXMKK2dlbmVyYXRlZCBhcyB0aGUgbGFzdCBvcGNvZGUgb2YgZXZlcnkgZnVuY3Rpb24gYW5kIG9ubHkgdGhlbiwgZm9yCityZWFzb25zIHRvIGRvIHdpdGggdHJhY2luZyBzdXBwb3J0LiAgU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZnVuY3Rpb24KK1xjZnVuY3Rpb257bWF5YmVfY2FsbF9saW5lX3RyYWNlfSBpbiBcZmlsZXtQeXRob24vY2V2YWwuY30gZm9yIHRoZQorZ29yeSBkZXRhaWxzLiAgXHZlcnNpb25hZGRlZHsyLjN9LgorXGVuZHtvcGNvZGVkZXNjfQorCiBcYmVnaW57b3Bjb2RlZGVzY317WUlFTERfVkFMVUV9e30KIFBvcHMgXGNvZGV7VE9TfSBhbmQgeWllbGRzIGl0IGZyb20gYSBnZW5lcmF0b3IuCiBcZW5ke29wY29kZWRlc2N9CkBAIC02MjEsNyArNjI4LDcgQEAKIFxlbmR7b3Bjb2RlZGVzY30KIAogXGJlZ2lue29wY29kZWRlc2N9e1NFVF9MSU5FTk99e2xpbmVub30KLVNldHMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgdG8gXHZhcntsaW5lbm99LgorVGhpcyBvcGNvZGUgaXMgb2Jzb2xldGUuCiBcZW5ke29wY29kZWRlc2N9CiAKIFxiZWdpbntvcGNvZGVkZXNjfXtSQUlTRV9WQVJBUkdTfXthcmdjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0cmFjZWJhY2sudGV4IGIvRG9jL2xpYi9saWJ0cmFjZWJhY2sudGV4CmluZGV4IDJiMjBiMGMuLmE3NDYxM2IgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidHJhY2ViYWNrLnRleAorKysgYi9Eb2MvbGliL2xpYnRyYWNlYmFjay50ZXgKQEAgLTExOCwxMCArMTE4LDEwIEBACiAKIFxiZWdpbntmdW5jZGVzY317dGJfbGluZW5vfXt0Yn0KIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBzZXQgaW4gdGhlIHRyYWNlYmFjawotb2JqZWN0LiAgVGhpcyBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyB0aGUgXGNvZGV7XHZhcnt0Yn0udGJfbGluZW5vfQotZmllbGQgb2YgdGhlIG9iamVjdCwgYnV0IHdoZW4gb3B0aW1pemF0aW9uIGlzIHVzZWQgKHRoZSAtTyBmbGFnKSB0aGlzCi1maWVsZCBpcyBub3QgdXBkYXRlZCBjb3JyZWN0bHk7IHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29ycmVjdAotdmFsdWUuCitvYmplY3QuICBUaGlzIGZ1bmN0aW9uIHdhcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiB2ZXJzaW9ucyBvZiBQeXRob24KK3ByaW9yIHRvIDIuMyB3aGVuIHRoZSBccHJvZ3JhbW9wdHtPfSBmbGFnIHdhcyBwYXNzZWQgdG8gUHl0aG9uIHRoZQorXGNvZGV7XHZhcnt0Yn0udGJfbGluZW5vfSB3YXMgbm90IHVwZGF0ZWQgY29ycmVjdGx5LiAgVGhpcyBmdW5jdGlvbgoraGFzIG5vIHVzZSBpbiB2ZXJzaW9ucyBwYXN0IDIuMy4KIFxlbmR7ZnVuY2Rlc2N9CiAKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dC90dXQudGV4IGIvRG9jL3R1dC90dXQudGV4CmluZGV4IGM2MDgxYzYuLjRiYzU3MWEgMTAwNjQ0Ci0tLSBhL0RvYy90dXQvdHV0LnRleAorKysgYi9Eb2MvdHV0L3R1dC50ZXgKQEAgLTIzNDAsMTIgKzIzNDAsMTEgQEAKIAogXGl0ZW0KIFdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBpbnZva2VkIHdpdGggdGhlIFxwcm9ncmFtb3B0ey1PfSBmbGFnLAotb3B0aW1pemVkIGNvZGUgaXMgZ2VuZXJhdGVkIGFuZCBzdG9yZWQgaW4gXGZpbGV7LnB5b30gZmlsZXMuCi1UaGUgb3B0aW1pemVyIGN1cnJlbnRseSBkb2Vzbid0IGhlbHAgbXVjaDsgaXQgb25seSByZW1vdmVzCi1ca2V5d29yZHthc3NlcnR9IHN0YXRlbWVudHMgYW5kIFxjb2Rle1NFVF9MSU5FTk99IGluc3RydWN0aW9ucy4KLVdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQsIFxlbXBoe2FsbH0gYnl0ZWNvZGUgaXMgb3B0aW1pemVkOwotXGNvZGV7LnB5Y30gZmlsZXMgYXJlIGlnbm9yZWQgYW5kIFxjb2Rley5weX0gZmlsZXMgYXJlIGNvbXBpbGVkIHRvCi1vcHRpbWl6ZWQgYnl0ZWNvZGUuCitvcHRpbWl6ZWQgY29kZSBpcyBnZW5lcmF0ZWQgYW5kIHN0b3JlZCBpbiBcZmlsZXsucHlvfSBmaWxlcy4gIFRoZQorb3B0aW1pemVyIGN1cnJlbnRseSBkb2Vzbid0IGhlbHAgbXVjaDsgaXQgb25seSByZW1vdmVzCitca2V5d29yZHthc3NlcnR9IHN0YXRlbWVudHMuICBXaGVuIFxwcm9ncmFtb3B0ey1PfSBpcyB1c2VkLCBcZW1waHthbGx9CitieXRlY29kZSBpcyBvcHRpbWl6ZWQ7IFxjb2Rley5weWN9IGZpbGVzIGFyZSBpZ25vcmVkIGFuZCBcY29kZXsucHl9CitmaWxlcyBhcmUgY29tcGlsZWQgdG8gb3B0aW1pemVkIGJ5dGVjb2RlLgogCiBcaXRlbQogUGFzc2luZyB0d28gXHByb2dyYW1vcHR7LU99IGZsYWdzIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleAppbmRleCAwZDdkNzc0Li5mOTE5ZDdlIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4CkBAIC02NTgsNyArNjU4LDYgQEAKIAogXGVuZHtpdGVtaXplfQogCi0KICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntOZXcgYW5kIEltcHJvdmVkIE1vZHVsZXN9CiAKQEAgLTk4Nyw5ICs5ODYsOSBAQAogd2hlbiBydW5uaW5nIFB5dGhvbidzIFxmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgKENvbnRyaWJ1dGVkIGJ5IE9uZHJlagogUGFsa292c2t5LikKIAotXGl0ZW0gVGhlICBcY3NpbXBsZW1hY3Jve0RMX0VYUE9SVH0gYW5kIFxjc2ltcGxlbWFjcm97RExfSU1QT1JUfSBtYWNyb3MgYXJlIG5vdwotZGVwcmVjYXRlZC4gIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgUHl0aG9uIGV4dGVuc2lvbiBtb2R1bGVzCi1zaG91bGQgbm93IGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBuZXcgbWFjcm8KK1xpdGVtIFRoZSBcY3NpbXBsZW1hY3Jve0RMX0VYUE9SVH0gYW5kIFxjc2ltcGxlbWFjcm97RExfSU1QT1JUfSBtYWNyb3MKK2FyZSBub3cgZGVwcmVjYXRlZC4gIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgUHl0aG9uIGV4dGVuc2lvbgorbW9kdWxlcyBzaG91bGQgbm93IGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBuZXcgbWFjcm8KIFxjc2ltcGxlbWFjcm97UHlNT0RJTklUX0ZVTkN9LCB3aGlsZSB0aGUgUHl0aG9uIGNvcmUgd2lsbCBnZW5lcmFsbHkKIHVzZSB0aGUgXGNzaW1wbGVtYWNyb3tQeUFQSV9GVU5DfSBhbmQgXGNzaW1wbGVtYWNyb3tQeUFQSV9EQVRBfQogbWFjcm9zLgpAQCAtMTA3Niw2ICsxMDc1LDI5IEBACiBcaXRlbSBUaGUgdG9vbHMgdXNlZCB0byBidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiBub3cgd29yayB1bmRlciBDeWd3aW4KIGFzIHdlbGwgYXMgXFVOSVguCiAKK1xpdGVtIFRoZSBcY29kZXtTRVRfTElORU5PfSBvcGNvZGUgaGFzIGJlZW4gcmVtb3ZlZC4gIEJhY2sgaW4gdGhlCittaXN0cyBvZiB0aW1lLCB0aGlzIG9wY29kZSB3YXMgbmVlZGVkIHRvIHByb2R1Y2UgbGluZSBudW1iZXJzIGluCit0cmFjZWJhY2tzIGFuZCBzdXBwb3J0IHRyYWNlIGZ1bmN0aW9ucyAoZm9yLCBlLmcuLCBcbW9kdWxle3BkYn0pLgorU2luY2UgUHl0aG9uIDEuNSwgdGhlIGxpbmUgbnVtYmVycyBpbiB0cmFjZWJhY2tzIGhhdmUgYmVlbiBjb21wdXRlZAordXNpbmcgYSBkaWZmZXJlbnQgbWVjaGFuaXNtIHRoYXQgd29ya3Mgd2l0aCBgYHB5dGhvbiAtTycnLiAgRm9yIFB5dGhvbgorMi4zIE1pY2hhZWwgSHVkc29uIGltcGxlbWVudGVkIGEgc2ltaWxhciBzY2hlbWUgdG8gZGV0ZXJtaW5lIHdoZW4gdG8KK2NhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLCByZW1vdmluZyB0aGUgbmVlZCBmb3IgXGNvZGV7U0VUX0xJTkVOT30KK2VudGlyZWx5LgorCitQeXRob24gY29kZSB3aWxsIGJlIGhhcmQgcHVzaGVkIHRvIG5vdGljZSBhIGRpZmZlcmVuY2UgZnJvbSB0aGlzCitjaGFuZ2UsIGFwYXJ0IGZyb20gYSBzbGlnaHQgc3BlZWQgdXAgd2hlbiBweXRob24gaXMgcnVuIHdpdGhvdXQKK1xwcm9ncmFtb3B0ey1PfS4KKworQyBleHRlbnNpb25zIHRoYXQgYWNjZXNzIHRoZSBcbWVtYmVye2ZfbGluZW5vfSBmaWVsZCBvZiBmcmFtZSBvYmplY3RzCitzaG91bGQgaW5zdGVhZCBjYWxsIFxjb2Rle1B5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKX0uCitUaGlzIHdpbGwgaGF2ZSB0aGUgYWRkZWQgZWZmZWN0IG9mIG1ha2luZyB0aGUgY29kZSB3b3JrIGFzIGRlc2lyZWQKK3VuZGVyIGBgcHl0aG9uIC1PJycgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uCisKK1RvIG1ha2UgdHJhY2luZyB3b3JrIGFzIGV4cGVjdGVkLCBpdCB3YXMgZm91bmQgbmVjZXNzYXJ5IHRvIGFkZCBhIG5ldworb3Bjb2RlLCBcY2RhdGF7UkVUVVJOX05PTkV9LCB0byB0aGUgVk0uICBJZiB5b3Ugd2FudCB0byBrbm93IHdoeSwgcmVhZAordGhlIGNvbW1lbnRzIGluIHRoZSBmdW5jdGlvbiBcY2Z1bmN0aW9ue21heWJlX2NhbGxfbGluZV90cmFjZX0gaW4KK1xmaWxle1B5dGhvbi9jZXZhbC5jfS4KKwogXGVuZHtpdGVtaXplfQogCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb3Bjb2RlLmggYi9JbmNsdWRlL29wY29kZS5oCmluZGV4IDJlMjAyNDYuLjI4ZDBhZTQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb3Bjb2RlLmgKKysrIGIvSW5jbHVkZS9vcGNvZGUuaApAQCAtNzEsNiArNzEsOSBAQAogI2RlZmluZSBJTlBMQUNFX09SCTc5CiAjZGVmaW5lIEJSRUFLX0xPT1AJODAKIAorI2RlZmluZSBSRVRVUk5fTk9ORQk4MSAvKiAqb25seSogZm9yIGZ1bmN0aW9uIGVwaWxvZ3VlcyAKKwkJCSAgICAgIC0tIHNlZSBjb21tZW50cyBpbiAKKwkJCSAgICAgIGNldmFsLmM6bWF5YmVfY2FsbF9saW5lX3RyYWNlIGZvciB3aHkgKi8KICNkZWZpbmUgTE9BRF9MT0NBTFMJODIKICNkZWZpbmUgUkVUVVJOX1ZBTFVFCTgzCiAjZGVmaW5lIElNUE9SVF9TVEFSCTg0CkBAIC0xMTksOCArMTIyLDYgQEAKICNkZWZpbmUgU1RPUkVfRkFTVAkxMjUJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCiAjZGVmaW5lIERFTEVURV9GQVNUCTEyNgkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KIAotI2RlZmluZSBTRVRfTElORU5PCTEyNwkvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCi0KICNkZWZpbmUgUkFJU0VfVkFSQVJHUwkxMzAJLyogTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiBvciAzKSAqLwogLyogQ0FMTF9GVU5DVElPTl9YWFggb3Bjb2RlcyBkZWZpbmVkIGJlbG93IGRlcGVuZCBvbiB0aGlzIGRlZmluaXRpb24gKi8KICNkZWZpbmUgQ0FMTF9GVU5DVElPTgkxMzEJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KZGlmZiAtLWdpdCBhL0xpYi9kaXMucHkgYi9MaWIvZGlzLnB5CmluZGV4IDI2NzQwOTQuLmExY2MyMTUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXMucHkKKysrIGIvTGliL2Rpcy5weQpAQCAtNTUsNiArNTUsMjAgQEAKIGRlZiBkaXNhc3NlbWJsZShjbywgbGFzdGk9LTEpOgogICAgICIiIkRpc2Fzc2VtYmxlIGEgY29kZSBvYmplY3QuIiIiCiAgICAgY29kZSA9IGNvLmNvX2NvZGUKKworICAgIGJ5dGVfaW5jcmVtZW50cyA9IFtvcmQoYykgZm9yIGMgaW4gY28uY29fbG5vdGFiWzA6OjJdXQorICAgIGxpbmVfaW5jcmVtZW50cyA9IFtvcmQoYykgZm9yIGMgaW4gY28uY29fbG5vdGFiWzE6OjJdXQorICAgIHRhYmxlX2xlbmd0aCA9IGxlbihieXRlX2luY3JlbWVudHMpICMgPT0gbGVuKGxpbmVfaW5jcmVtZW50cykKKworICAgIGxpbmVubyA9IGNvLmNvX2ZpcnN0bGluZW5vCisgICAgdGFibGVfaW5kZXggPSAwCisgICAgd2hpbGUgKHRhYmxlX2luZGV4IDwgdGFibGVfbGVuZ3RoCisgICAgICAgICAgIGFuZCBieXRlX2luY3JlbWVudHNbdGFibGVfaW5kZXhdID09IDApOgorICAgICAgICBsaW5lbm8gKz0gbGluZV9pbmNyZW1lbnRzW3RhYmxlX2luZGV4XQorICAgICAgICB0YWJsZV9pbmRleCArPSAxCisgICAgYWRkciA9IDAKKyAgICBsaW5lX2luY3IgPSAwCisgICAgCiAgICAgbGFiZWxzID0gZmluZGxhYmVscyhjb2RlKQogICAgIG4gPSBsZW4oY29kZSkKICAgICBpID0gMApAQCAtNjMsNyArNzcsMjMgQEAKICAgICB3aGlsZSBpIDwgbjoKICAgICAgICAgYyA9IGNvZGVbaV0KICAgICAgICAgb3AgPSBvcmQoYykKLSAgICAgICAgaWYgb3AgPT0gU0VUX0xJTkVOTyBhbmQgaSA+IDA6IHByaW50ICMgRXh0cmEgYmxhbmsgbGluZQorCisgICAgICAgIGlmIGkgPj0gYWRkcjoKKyAgICAgICAgICAgIGxpbmVubyArPSBsaW5lX2luY3IKKyAgICAgICAgICAgIHdoaWxlIHRhYmxlX2luZGV4IDwgdGFibGVfbGVuZ3RoOgorICAgICAgICAgICAgICAgIGFkZHIgKz0gYnl0ZV9pbmNyZW1lbnRzW3RhYmxlX2luZGV4XQorICAgICAgICAgICAgICAgIGxpbmVfaW5jciA9IGxpbmVfaW5jcmVtZW50c1t0YWJsZV9pbmRleF0KKyAgICAgICAgICAgICAgICB0YWJsZV9pbmRleCArPSAxCisgICAgICAgICAgICAgICAgaWYgbGluZV9pbmNyOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhZGRyID0gc3lzLm1heGludAorICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICIlM2QiJWxpbmVubywKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICcgICAnLAorCiAgICAgICAgIGlmIGkgPT0gbGFzdGk6IHByaW50ICctLT4nLAogICAgICAgICBlbHNlOiBwcmludCAnICAgJywKICAgICAgICAgaWYgaSBpbiBsYWJlbHM6IHByaW50ICc+PicsCkBAIC0yMjQsNiArMjU0LDcgQEAKIGRlZl9vcCgnSU5QTEFDRV9PUicsIDc5KQogZGVmX29wKCdCUkVBS19MT09QJywgODApCiAKK2RlZl9vcCgnUkVUVVJOX05PTkUnLCA4MSkKIGRlZl9vcCgnTE9BRF9MT0NBTFMnLCA4MikKIGRlZl9vcCgnUkVUVVJOX1ZBTFVFJywgODMpCiBkZWZfb3AoJ0lNUE9SVF9TVEFSJywgODQpCkBAIC0yNzcsOSArMzA4LDYgQEAKIGRlZl9vcCgnREVMRVRFX0ZBU1QnLCAxMjYpICAgICAgIyBMb2NhbCB2YXJpYWJsZSBudW1iZXIKIGhhc2xvY2FsLmFwcGVuZCgxMjYpCiAKLWRlZl9vcCgnU0VUX0xJTkVOTycsIDEyNykgICAgICAgIyBDdXJyZW50IGxpbmUgbnVtYmVyCi1TRVRfTElORU5PID0gMTI3Ci0KIGRlZl9vcCgnUkFJU0VfVkFSQVJHUycsIDEzMCkgICAgIyBOdW1iZXIgb2YgcmFpc2UgYXJndW1lbnRzICgxLCAyLCBvciAzKQogZGVmX29wKCdDQUxMX0ZVTkNUSU9OJywgMTMxKSAgICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKIGRlZl9vcCgnTUFLRV9GVU5DVElPTicsIDEzMikgICAgIyBOdW1iZXIgb2YgYXJncyB3aXRoIGRlZmF1bHQgdmFsdWVzCmRpZmYgLS1naXQgYS9MaWIvaW5zcGVjdC5weSBiL0xpYi9pbnNwZWN0LnB5CmluZGV4IGJlMmRhNDEuLjk2Njc3YjcgMTAwNjQ0Ci0tLSBhL0xpYi9pbnNwZWN0LnB5CisrKyBiL0xpYi9pbnNwZWN0LnB5CkBAIC03MTEsNyArNzExLDcgQEAKICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnYXJnIGlzIG5vdCBhIGZyYW1lIG9yIHRyYWNlYmFjayBvYmplY3QnCiAKICAgICBmaWxlbmFtZSA9IGdldHNvdXJjZWZpbGUoZnJhbWUpIG9yIGdldGZpbGUoZnJhbWUpCi0gICAgbGluZW5vID0gZ2V0bGluZW5vKGZyYW1lKQorICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCiAgICAgaWYgY29udGV4dCA+IDA6CiAgICAgICAgIHN0YXJ0ID0gbGluZW5vIC0gMSAtIGNvbnRleHQvLzIKICAgICAgICAgdHJ5OgpAQCAtNzMwLDE4ICs3MzAsOCBAQAogCiBkZWYgZ2V0bGluZW5vKGZyYW1lKToKICAgICAiIiJHZXQgdGhlIGxpbmUgbnVtYmVyIGZyb20gYSBmcmFtZSBvYmplY3QsIGFsbG93aW5nIGZvciBvcHRpbWl6YXRpb24uIiIiCi0gICAgIyBXcml0dGVuIGJ5IE1hcmMtQW5kcukgTGVtYnVyZzsgcmV2aXNlZCBieSBKaW0gSHVndW5pbiBhbmQgRnJlZHJpayBMdW5kaC4KLSAgICBsaW5lbm8gPSBmcmFtZS5mX2xpbmVubwotICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKLSAgICBpZiBoYXNhdHRyKGNvZGUsICdjb19sbm90YWInKToKLSAgICAgICAgdGFibGUgPSBjb2RlLmNvX2xub3RhYgotICAgICAgICBsaW5lbm8gPSBjb2RlLmNvX2ZpcnN0bGluZW5vCi0gICAgICAgIGFkZHIgPSAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih0YWJsZSksIDIpOgotICAgICAgICAgICAgYWRkciA9IGFkZHIgKyBvcmQodGFibGVbaV0pCi0gICAgICAgICAgICBpZiBhZGRyID4gZnJhbWUuZl9sYXN0aTogYnJlYWsKLSAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIG9yZCh0YWJsZVtpKzFdKQotICAgIHJldHVybiBsaW5lbm8KKyAgICAjIEZyYW1lVHlwZS5mX2xpbmVubyBpcyBub3cgYSBkZXNjcmlwdG9yIHRoYXQgZ3JvdmVscyBjb19sbm90YWIKKyAgICByZXR1cm4gZnJhbWUuZl9saW5lbm8KIAogZGVmIGdldG91dGVyZnJhbWVzKGZyYW1lLCBjb250ZXh0PTEpOgogICAgICIiIkdldCBhIGxpc3Qgb2YgcmVjb3JkcyBmb3IgYSBmcmFtZSBhbmQgYWxsIGhpZ2hlciAoY2FsbGluZykgZnJhbWVzLgpkaWZmIC0tZ2l0IGEvTGliL3BkYi5weSBiL0xpYi9wZGIucHkKaW5kZXggMzc4NmVkOS4uYzYxNjRhZCAxMDA3NTUKLS0tIGEvTGliL3BkYi5weQorKysgYi9MaWIvcGRiLnB5CkBAIC0xMDUsNyArMTA1LDEzIEBACiAgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gMCBhbmQgbGluZVswXSAhPSAnIyc6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYub25lY21kKGxpbmUpCiAKLSAgICAjIE92ZXJyaWRlIEJkYiBtZXRob2RzIChleGNlcHQgdXNlcl9jYWxsLCBmb3Igbm93KQorICAgICMgT3ZlcnJpZGUgQmRiIG1ldGhvZHMgCisKKyAgICBkZWYgdXNlcl9jYWxsKHNlbGYsIGZyYW1lLCBhcmd1bWVudF9saXN0KToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgdGhlIHJlbW90ZSBwb3NzaWJpbGl0eQorICAgICAgICB0aGF0IHdlIGV2ZXIgbmVlZCB0byBzdG9wIGluIHRoaXMgZnVuY3Rpb24uIiIiCisgICAgICAgIHByaW50ICctLUNhbGwtLScKKyAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKIAogICAgIGRlZiB1c2VyX2xpbmUoc2VsZiwgZnJhbWUpOgogICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHN0b3Agb3IgYnJlYWsgYXQgdGhpcyBsaW5lLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5IGIvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5CmluZGV4IGRhZDJiZDQuLmQ0MTAwOTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkKQEAgLTkxLDEwICs5MSw4IEBACiAgICAgICAgIGZfbGluZW5vID0gZi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8KICAgICAgICAgZ19saW5lbm8gPSBnLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubwogICAgICAgICBldmVudHMgPSBbKEVOVEVSLCAoInRlc3RfaG90c2hvdCIsIGdfbGluZW5vLCAiZyIpKSwKLSAgICAgICAgICAgICAgICAgIChMSU5FLCAgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubywgImciKSksCiAgICAgICAgICAgICAgICAgICAoTElORSwgICgidGVzdF9ob3RzaG90IiwgZ19saW5lbm8rMSwgImciKSksCiAgICAgICAgICAgICAgICAgICAoRU5URVIsICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8sICJmIikpLAotICAgICAgICAgICAgICAgICAgKExJTkUsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vLCAiZiIpKSwKICAgICAgICAgICAgICAgICAgIChMSU5FLCAgKCJ0ZXN0X2hvdHNob3QiLCBmX2xpbmVubysxLCAiZiIpKSwKICAgICAgICAgICAgICAgICAgIChMSU5FLCAgKCJ0ZXN0X2hvdHNob3QiLCBmX2xpbmVubysyLCAiZiIpKSwKICAgICAgICAgICAgICAgICAgIChFWElULCAgKCJ0ZXN0X2hvdHNob3QiLCBmX2xpbmVubywgImYiKSksCmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCBjMjJmNTc2Li40OTEwYTM3IDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTU5LDcgKzU5LDcgQEAKICAgICBuID0gMAogICAgIHdoaWxlIHRiIGlzIG5vdCBOb25lIGFuZCAobGltaXQgaXMgTm9uZSBvciBuIDwgbGltaXQpOgogICAgICAgICBmID0gdGIudGJfZnJhbWUKLSAgICAgICAgbGluZW5vID0gdGJfbGluZW5vKHRiKQorICAgICAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KICAgICAgICAgY28gPSBmLmZfY29kZQogICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCiAgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCkBAIC05Miw3ICs5Miw3IEBACiAgICAgbiA9IDAKICAgICB3aGlsZSB0YiBpcyBub3QgTm9uZSBhbmQgKGxpbWl0IGlzIE5vbmUgb3IgbiA8IGxpbWl0KToKICAgICAgICAgZiA9IHRiLnRiX2ZyYW1lCi0gICAgICAgIGxpbmVubyA9IHRiX2xpbmVubyh0YikKKyAgICAgICAgbGluZW5vID0gdGIudGJfbGluZW5vCiAgICAgICAgIGNvID0gZi5mX2NvZGUKICAgICAgICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQogICAgICAgICBuYW1lID0gY28uY29fbmFtZQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgbGlzdCA9IFtdCiAgICAgbiA9IDAKICAgICB3aGlsZSBmIGlzIG5vdCBOb25lIGFuZCAobGltaXQgaXMgTm9uZSBvciBuIDwgbGltaXQpOgotICAgICAgICBsaW5lbm8gPSBmLmZfbGluZW5vICAgICAjIFhYWCBUb28gYmFkIGlmIC1PIGlzIHVzZWQKKyAgICAgICAgbGluZW5vID0gZi5mX2xpbmVubwogICAgICAgICBjbyA9IGYuZl9jb2RlCiAgICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKICAgICAgICAgbmFtZSA9IGNvLmNvX25hbWUKQEAgLTI3OSwyMyArMjc5LDYgQEAKIGRlZiB0Yl9saW5lbm8odGIpOgogICAgICIiIkNhbGN1bGF0ZSBjb3JyZWN0IGxpbmUgbnVtYmVyIG9mIHRyYWNlYmFjayBnaXZlbiBpbiB0Yi4KIAotICAgIEV2ZW4gd29ya3Mgd2l0aCAtTyBvbi4KKyAgICBPYnNvbGV0ZSBpbiAyLjMuCiAgICAgIiIiCi0gICAgIyBDb2RlZCBieSBNYXJjLUFuZHJlIExlbWJ1cmcgZnJvbSB0aGUgZXhhbXBsZSBvZiBQeUNvZGVfQWRkcjJMaW5lKCkKLSAgICAjIGluIGNvbXBpbGUuYy4KLSAgICAjIFJldmlzZWQgdmVyc2lvbiBieSBKaW0gSHVndW5pbiB0byB3b3JrIHdpdGggSlB5dGhvbiB0b28uCi0KLSAgICBjID0gdGIudGJfZnJhbWUuZl9jb2RlCi0gICAgaWYgbm90IGhhc2F0dHIoYywgJ2NvX2xub3RhYicpOgotICAgICAgICByZXR1cm4gdGIudGJfbGluZW5vCi0KLSAgICB0YWIgPSBjLmNvX2xub3RhYgotICAgIGxpbmUgPSBjLmNvX2ZpcnN0bGluZW5vCi0gICAgc3RvcGF0ID0gdGIudGJfbGFzdGkKLSAgICBhZGRyID0gMAotICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih0YWIpLCAyKToKLSAgICAgICAgYWRkciA9IGFkZHIgKyBvcmQodGFiW2ldKQotICAgICAgICBpZiBhZGRyID4gc3RvcGF0OgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbGluZSA9IGxpbmUgKyBvcmQodGFiW2krMV0pCi0gICAgcmV0dXJuIGxpbmUKKyAgICByZXR1cm4gdGIudGJfbGluZW5vCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggNWFiZmI0Mi4uMmM5ZDgzZiAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtNTcsNiArNTcsMTEgQEAKIAogQ29yZSBhbmQgYnVpbHRpbnMKIAorLSBTRVRfTElORU5PIGlzIGdvbmUuICBjb19sbm90YWIgaXMgbm93IGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgd2hlbiB0bworICBjYWxsIHRoZSB0cmFjZSBmdW5jdGlvbi4gIEMgY29kZSB0aGF0IGFjY2Vzc2VkIGZfbGluZW5vIHNob3VsZCBjYWxsCisgIFB5Q29kZV9BZGRyMkxpbmUgaW5zdGVhZCAoZl9saW5lbm8gaXMgc3RpbGwgdGhlcmUsIGJ1dCBub3Qga2VwdCB1cAorICB0byBkYXRlKS4KKwogLSBUaGVyZSdzIGEgbmV3IHdhcm5pbmcgY2F0ZWdvcnksIEZ1dHVyZVdhcm5pbmcuICBUaGlzIGlzIHVzZWQgdG8gd2FybgogICBhYm91dCBhIG51bWJlciBvZiBzaXR1YXRpb25zIHdoZXJlIHRoZSB2YWx1ZSBvciBzaWduIG9mIGFuIGludGVnZXIKICAgcmVzdWx0IHdpbGwgY2hhbmdlIGluIFB5dGhvbiAyLjQgYXMgYSByZXN1bHQgb2YgUEVQIDIzNyAoaW50ZWdlcgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faG90c2hvdC5jIGIvTW9kdWxlcy9faG90c2hvdC5jCmluZGV4IDFlOGY0ZjkuLjJjYTQ0ODYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hvdHNob3QuYworKysgYi9Nb2R1bGVzL19ob3RzaG90LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogICogTG93IGJpdHM6ICAgIE9wY29kZTogICAgICAgIE1lYW5pbmc6CiAgKiAgICAgICAweDAwICAgICAgICAgRU5URVIgICAgIGVudGVyIGEgZnJhbWUKICAqICAgICAgIDB4MDEgICAgICAgICAgRVhJVCAgICAgZXhpdCBhIGZyYW1lCi0gKiAgICAgICAweDAyICAgICAgICBMSU5FTk8gICAgIFNFVF9MSU5FTk8gaW5zdHJ1Y3Rpb24gd2FzIGV4ZWN1dGVkCisgKiAgICAgICAweDAyICAgICAgICBMSU5FTk8gICAgIGV4ZWN1dGlvbiBtb3ZlZCBvbnRvIGEgZGlmZmVyZW50IGxpbmUKICAqICAgICAgIDB4MDMgICAgICAgICBPVEhFUiAgICAgbW9yZSBiaXRzIGFyZSBuZWVkZWQgdG8gZGVlY29kZQogICoKICAqIElmIHRoZSB0eXBlIGlzIE9USEVSLCB0aGUgcmVjb3JkIGlzIG5vdCBwYWNrZWQgc28gdGlnaHRseSwgYW5kIHRoZQpAQCAtODg4LDkgKzg4OCwxMiBAQAogCiAgICAgY2FzZSBQeVRyYWNlX0xJTkU6CiAgICAgICAgIGlmIChzZWxmLT5saW5ldGltaW5ncykKLSAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgZnJhbWUtPmZfbGluZW5vLCBnZXRfdGRlbHRhKHNlbGYpKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgUHlDb2RlX0FkZHIyTGluZShmcmFtZS0+Zl9jb2RlLCAKKwkJCQkJCQkgICAgIGZyYW1lLT5mX2xhc3RpKSwKKwkJCQkgICAgICBnZXRfdGRlbHRhKHNlbGYpKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHBhY2tfbGluZW5vKHNlbGYsIGZyYW1lLT5mX2xpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gcGFja19saW5lbm8oc2VsZiwgUHlDb2RlX0FkZHIyTGluZShmcmFtZS0+Zl9jb2RlLAorCQkJCQkJICAgICAgZnJhbWUtPmZfbGFzdGkpKTsKIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIC8qIGlnbm9yZSBQeVRyYWNlX0VYQ0VQVElPTiAqLwpAQCAtMTIyNyw4ICsxMjMwLDggQEAKICJcbiIKICJjbG9zZWQ6ICAgICAgIFRydWUgaWYgdGhlIHByb2ZpbGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLlxuIgogImZyYW1ldGltaW5nczogVHJ1ZSBpZiBFTlRFUi9FWElUIGV2ZW50cyBjb2xsZWN0IHRpbWluZyBpbmZvcm1hdGlvbi5cbiIKLSJsaW5lZXZlbnRzOiAgIFRydWUgaWYgU0VUX0xJTkVOTyBldmVudHMgYXJlIHJlcG9ydGVkIHRvIHRoZSBwcm9maWxlci5cbiIKLSJsaW5ldGltaW5nczogIFRydWUgaWYgU0VUX0xJTkVOTyBldmVudHMgY29sbGVjdCB0aW1pbmcgaW5mb3JtYXRpb24uIik7CisibGluZWV2ZW50czogICBUcnVlIGlmIGxpbmUgZXZlbnRzIGFyZSByZXBvcnRlZCB0byB0aGUgcHJvZmlsZXIuXG4iCisibGluZXRpbWluZ3M6ICBUcnVlIGlmIGxpbmUgZXZlbnRzIGNvbGxlY3QgdGltaW5nIGluZm9ybWF0aW9uLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFByb2ZpbGVyVHlwZSA9IHsKICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKZGlmZiAtLWdpdCBhL09iamVjdHMvZnJhbWVvYmplY3QuYyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwppbmRleCBkZmIzYTJlLi43YjZlYTI2IDEwMDY0NAotLS0gYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAJeyJmX2J1aWx0aW5zIiwJVF9PQkpFQ1QsCU9GRihmX2J1aWx0aW5zKSxST30sCiAJeyJmX2dsb2JhbHMiLAlUX09CSkVDVCwJT0ZGKGZfZ2xvYmFscyksCVJPfSwKIAl7ImZfbGFzdGkiLAlUX0lOVCwJCU9GRihmX2xhc3RpKSwJUk99LAotCXsiZl9saW5lbm8iLAlUX0lOVCwJCU9GRihmX2xpbmVubyksCVJPfSwKIAl7ImZfcmVzdHJpY3RlZCIsVF9JTlQsCQlPRkYoZl9yZXN0cmljdGVkKSxST30sCiAJeyJmX3RyYWNlIiwJVF9PQkpFQ1QsCU9GRihmX3RyYWNlKX0sCiAJeyJmX2V4Y190eXBlIiwJVF9PQkpFQ1QsCU9GRihmX2V4Y190eXBlKX0sCkBAIC0zMyw4ICszMiwxOSBAQAogCXJldHVybiBmLT5mX2xvY2FsczsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2ZyYW1lX2dldGxpbmVubyhQeUZyYW1lT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQoreworCWludCBsaW5lbm87CisKKwlsaW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CisKKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKK30KKwogc3RhdGljIFB5R2V0U2V0RGVmIGZyYW1lX2dldHNldGxpc3RbXSA9IHsKIAl7ImZfbG9jYWxzIiwJKGdldHRlcilmcmFtZV9nZXRsb2NhbHMsIE5VTEwsIE5VTEx9LAorCXsiZl9saW5lbm8iLAkoZ2V0dGVyKWZyYW1lX2dldGxpbmVubywgTlVMTCwgTlVMTH0sCiAJezB9CiB9OwogCkBAIC0zMDYsNyArMzE2LDcgQEAKIAlmLT5mX2V4Y190eXBlID0gZi0+Zl9leGNfdmFsdWUgPSBmLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOwogCWYtPmZfdHN0YXRlID0gdHN0YXRlOwogCi0JZi0+Zl9sYXN0aSA9IDA7CisJZi0+Zl9sYXN0aSA9IC0xOwogCWYtPmZfbGluZW5vID0gY29kZS0+Y29fZmlyc3RsaW5lbm87CiAJZi0+Zl9yZXN0cmljdGVkID0gKGJ1aWx0aW5zICE9IHRzdGF0ZS0+aW50ZXJwLT5idWlsdGlucyk7CiAJZi0+Zl9pYmxvY2sgPSAwOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA1MGVhOWMzLi42OTg1ODQ2IDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtNTEsNiArNTEsOSBAQAogc3RhdGljIHZvaWQgY2FsbF90cmFjZV9wcm90ZWN0ZWQoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLAogCQkJCSBQeUZyYW1lT2JqZWN0ICosIGludCk7CiBzdGF0aWMgdm9pZCBjYWxsX2V4Y190cmFjZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosIFB5RnJhbWVPYmplY3QgKik7CitzdGF0aWMgdm9pZCBtYXliZV9jYWxsX2xpbmVfdHJhY2UoaW50LCBQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosIAorCQkJCSAgUHlGcmFtZU9iamVjdCAqLCBpbnQgKiwgaW50ICopOworCiBzdGF0aWMgUHlPYmplY3QgKmFwcGx5X3NsaWNlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBhc3NpZ25fc2xpY2UoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKIAkJCVB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwpAQCAtNDk5LDYgKzUwMiwxNiBAQAogCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwkvKiBSZXR1cm4gdmFsdWUgKi8KIAlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCVB5Q29kZU9iamVjdCAqY287CisKKwkvKiB3aGVuIHRyYWNpbmcgd2Ugc2V0IHRoaW5ncyB1cCBzbyB0aGF0IAorCisgICAgICAgICAgICAgICBub3QgKGluc3RyX2xiIDw9IGN1cnJlbnRfYnl0ZWNvZGVfb2Zmc2V0IDwgaW5zdHJfdWIpCisKKwkgICBpcyB0cnVlIHdoZW4gdGhlIGxpbmUgYmVpbmcgZXhlY3V0ZWQgaGFzIGNoYW5nZWQuICBUaGUgCisgICAgICAgICAgIGluaXRpYWwgdmFsdWVzIGFyZSBzdWNoIGFzIHRvIG1ha2UgdGhpcyBmYWxzZSB0aGUgZmlyc3QKKyAgICAgICAgICAgdGltZSBpdCBpcyB0ZXN0ZWQuICovCisJaW50IGluc3RyX3ViID0gLTEsIGluc3RyX2xiID0gMDsKKwogCXVuc2lnbmVkIGNoYXIgKmZpcnN0X2luc3RyOwogCVB5T2JqZWN0ICpuYW1lczsKIAlQeU9iamVjdCAqY29uc3RzOwpAQCAtNTg2LDcgKzU5OSwxMiBAQAogCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAJZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBmLT5mX25sb2NhbHM7CiAJX1B5Q29kZV9HRVRDT0RFUFRSKGNvLCAmZmlyc3RfaW5zdHIpOwotCW5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArIGYtPmZfbGFzdGk7CisJaWYgKGYtPmZfbGFzdGkgPCAwKSB7CisJCW5leHRfaW5zdHIgPSBmaXJzdF9pbnN0cjsKKwl9CisJZWxzZSB7CisJCW5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArIGYtPmZfbGFzdGk7CisJfQogCXN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOwogCWFzc2VydChzdGFja19wb2ludGVyICE9IE5VTEwpOwogCWYtPmZfc3RhY2t0b3AgPSBOVUxMOwkvKiByZW1haW5zIE5VTEwgdW5sZXNzIHlpZWxkIHN1c3BlbmRzIGZyYW1lICovCkBAIC02MzcsOCArNjU1LDkgQEAKIAl3ID0gTlVMTDsKIAogCWZvciAoOzspIHsKLQkJYXNzZXJ0KHN0YWNrX3BvaW50ZXIgPj0gZi0+Zl92YWx1ZXN0YWNrKTsJLyogZWxzZSB1bmRlcmZsb3cgKi8KLQkJYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gZi0+Zl9zdGFja3NpemUpOwkvKiBlbHNlIG92ZXJmbG93ICovCisJCWFzc2VydChzdGFja19wb2ludGVyID49IGYtPmZfdmFsdWVzdGFjayk7IC8qIGVsc2UgdW5kZXJmbG93ICovCisJCWFzc2VydChTVEFDS19MRVZFTCgpIDw9IGYtPmZfc3RhY2tzaXplKTsgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KKwogCQkvKiBEbyBwZXJpb2RpYyB0aGluZ3MuICBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhyb3VnaAogCQkgICB0aGUgbG9vcCB3b3VsZCBhZGQgdG9vIG11Y2ggb3ZlcmhlYWQsIHNvIHdlIGRvIGl0CiAJCSAgIG9ubHkgZXZlcnkgTnRoIGluc3RydWN0aW9uLiAgV2UgYWxzbyBkbyBpdCBpZgpAQCAtNjU4LDggKzY3Nyw4IEBACiAjaWYgIWRlZmluZWQoSEFWRV9TSUdOQUxfSCkgfHwgZGVmaW5lZChtYWNpbnRvc2gpCiAJCQkvKiBJZiB3ZSBoYXZlIHRydWUgc2lnbmFscywgdGhlIHNpZ25hbCBoYW5kbGVyCiAJCQkgICB3aWxsIGNhbGwgUHlfQWRkUGVuZGluZ0NhbGwoKSBzbyB3ZSBkb24ndAotCQkJICAgaGF2ZSB0byBjYWxsIHNpZ2NoZWNrKCkuICBPbiB0aGUgTWFjIGFuZAotCQkJICAgRE9TLCBhbGFzLCB3ZSBoYXZlIHRvIGNhbGwgaXQuICovCisJCQkgICBoYXZlIHRvIGNhbGwgUHlFcnJfQ2hlY2tTaWduYWxzKCkuICBPbiB0aGUgCisJCQkgICBNYWMgYW5kIERPUywgYWxhcywgd2UgaGF2ZSB0byBjYWxsIGl0LiAqLwogCQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CiAJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKIAkJCQlnb3RvIG9uX2Vycm9yOwpAQCAtNjg2LDkgKzcwNSw3IEBACiAJZmFzdF9uZXh0X29wY29kZToKIAkJLyogRXh0cmFjdCBvcGNvZGUgYW5kIGFyZ3VtZW50ICovCiAKLSNpZiBkZWZpbmVkKFB5X0RFQlVHKSB8fCBkZWZpbmVkKExMVFJBQ0UpCiAJCWYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKTsKLSNlbmRpZgogCiAJCW9wY29kZSA9IE5FWFRPUCgpOwogCQlpZiAoSEFTX0FSRyhvcGNvZGUpKQpAQCAtNzA4LDE1ICs3MjUsMjYgQEAKIAkJaWYgKGxsdHJhY2UpIHsKIAkJCWlmIChIQVNfQVJHKG9wY29kZSkpIHsKIAkJCQlwcmludGYoIiVkOiAlZCwgJWRcbiIsCi0JCQkJCShpbnQpIChJTlNUUl9PRkZTRVQoKSAtIDMpLAotCQkJCQlvcGNvZGUsIG9wYXJnKTsKKwkJCQkgICAgICAgZi0+Zl9sYXN0aSwgb3Bjb2RlLCBvcGFyZyk7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQlwcmludGYoIiVkOiAlZFxuIiwKLQkJCQkJKGludCkgKElOU1RSX09GRlNFVCgpIC0gMSksIG9wY29kZSk7CisJCQkJICAgICAgIGYtPmZfbGFzdGksIG9wY29kZSk7CiAJCQl9CiAJCX0KICNlbmRpZgorCisJCS8qIGxpbmUtYnktbGluZSB0cmFjaW5nIHN1cHBvcnQgKi8KKworCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMICYmICF0c3RhdGUtPnRyYWNpbmcpIHsKKwkJCS8qIHNlZSBtYXliZV9jYWxsX2xpbmVfdHJhY2UKKwkJCSAgIGZvciBleHBvc2l0b3J5IGNvbW1lbnRzICovCisJCQltYXliZV9jYWxsX2xpbmVfdHJhY2Uob3Bjb2RlLCAKKwkJCQkJICAgICAgdHN0YXRlLT5jX3RyYWNlZnVuYywKKwkJCQkJICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLAorCQkJCQkgICAgICBmLCAmaW5zdHJfbGIsICZpbnN0cl91Yik7CisJCX0KKwogCQkvKiBNYWluIHN3aXRjaCBvbiBvcGNvZGUgKi8KIAogCQlzd2l0Y2ggKG9wY29kZSkgewpAQCAtNzI4LDI2ICs3NTYsNiBAQAogCiAJCS8qIGNhc2UgU1RPUF9DT0RFOiB0aGlzIGlzIGFuIGVycm9yISAqLwogCi0JCWNhc2UgU0VUX0xJTkVOTzoKLSNpZmRlZiBMTFRSQUNFCi0JCQlpZiAobGx0cmFjZSkKLQkJCQlwcmludGYoIi0tLSAlczolZCBcbiIsIGZpbGVuYW1lLCBvcGFyZyk7Ci0jZW5kaWYKLQkJCWYtPmZfbGluZW5vID0gb3Bhcmc7Ci0JCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyA9PSBOVUxMIHx8IHRzdGF0ZS0+dHJhY2luZykKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQkvKiBUcmFjZSBlYWNoIGxpbmUgb2YgY29kZSByZWFjaGVkICovCi0JCQlmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7Ci0JCQkvKiBJbmxpbmUgY2FsbF90cmFjZSgpIGZvciBwZXJmb3JtYW5jZTogKi8KLQkJCXRzdGF0ZS0+dHJhY2luZysrOwotCQkJdHN0YXRlLT51c2VfdHJhY2luZyA9IDA7Ci0JCQllcnIgPSAodHN0YXRlLT5jX3RyYWNlZnVuYykodHN0YXRlLT5jX3RyYWNlb2JqLCBmLAotCQkJCQkJICAgIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7Ci0JCQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKHRzdGF0ZS0+Y190cmFjZWZ1bmMKLQkJCQkJICAgICAgIHx8IHRzdGF0ZS0+Y19wcm9maWxlZnVuYyk7Ci0JCQl0c3RhdGUtPnRyYWNpbmctLTsKLQkJCWJyZWFrOwotCiAJCWNhc2UgTE9BRF9GQVNUOgogCQkJeCA9IEdFVExPQ0FMKG9wYXJnKTsKIAkJCWlmICh4ICE9IE5VTEwpIHsKQEAgLTE1MDQsOSArMTUxMiwxNyBAQAogCQkJd2h5ID0gV0hZX1JFVFVSTjsKIAkJCWJyZWFrOwogCisJCWNhc2UgUkVUVVJOX05PTkU6CisJCQlyZXR2YWwgPSBQeV9Ob25lOworCQkJUHlfSU5DUkVGKHJldHZhbCk7CisJCQl3aHkgPSBXSFlfUkVUVVJOOworCQkJYnJlYWs7CisKIAkJY2FzZSBZSUVMRF9WQUxVRToKIAkJCXJldHZhbCA9IFBPUCgpOwogCQkJZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7CisJCQkvKiBhYnVzZSB0aGUgbGFzdGkgZmllbGQ6IGhlcmUgaXQgcG9pbnRzIHRvIAorCQkJICAgdGhlICpuZXh0KiBpbnN0cnVjdGlvbiAqLwogCQkJZi0+Zl9sYXN0aSA9IElOU1RSX09GRlNFVCgpOwogCQkJd2h5ID0gV0hZX1lJRUxEOwogCQkJYnJlYWs7CkBAIC0xOTU0LDcgKzE5NzAsNiBAQAogCQkgICAgaW50IG4gPSBuYSArIDIgKiBuazsKIAkJICAgIFB5T2JqZWN0ICoqcGZ1bmMgPSBzdGFja19wb2ludGVyIC0gbiAtIDE7CiAJCSAgICBQeU9iamVjdCAqZnVuYyA9ICpwZnVuYzsKLQkJICAgIGYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKSAtIDM7IC8qIEZvciB0cmFjaW5nICovCiAKIAkJICAgIC8qIEFsd2F5cyBkaXNwYXRjaCBQeUNGdW5jdGlvbiBmaXJzdCwgYmVjYXVzZQogCQkgICAgICAgdGhlc2UgYXJlIHByZXN1bWVkIHRvIGJlIHRoZSBtb3N0IGZyZXF1ZW50CkBAIC0yMDIyLDcgKzIwMzcsNiBAQAogCQkJICAgIG4rKzsKIAkJICAgIHBmdW5jID0gc3RhY2tfcG9pbnRlciAtIG4gLSAxOwogCQkgICAgZnVuYyA9ICpwZnVuYzsKLQkJICAgIGYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKSAtIDM7IC8qIEZvciB0cmFjaW5nICovCiAKIAkJICAgIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKQogCQkJJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewpAQCAtMjEzNCw3ICsyMTQ4LDggQEAKIAkJZGVmYXVsdDoKIAkJCWZwcmludGYoc3RkZXJyLAogCQkJCSJYWFggbGluZW5vOiAlZCwgb3Bjb2RlOiAlZFxuIiwKLQkJCQlmLT5mX2xpbmVubywgb3Bjb2RlKTsKKwkJCQlQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSksCisJCQkJb3Bjb2RlKTsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgInVua25vd24gb3Bjb2RlIik7CiAJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwogCQkJYnJlYWs7CkBAIC0yMTg5LDkgKzIyMDQsNiBAQAogCQkvKiBMb2cgdHJhY2ViYWNrIGluZm8gaWYgdGhpcyBpcyBhIHJlYWwgZXhjZXB0aW9uICovCiAKIAkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQlmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCkgLSAxOwotCQkJaWYgKEhBU19BUkcob3Bjb2RlKSkKLQkJCQlmLT5mX2xhc3RpIC09IDI7CiAJCQlQeVRyYWNlQmFja19IZXJlKGYpOwogCiAJCQlpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQpAQCAtMjg3NSw2ICsyODg3LDEyNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyB2b2lkCittYXliZV9jYWxsX2xpbmVfdHJhY2UoaW50IG9wY29kZSwgUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosIAorCQkgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50ICppbnN0cl9sYiwgaW50ICppbnN0cl91YikKK3sKKwkvKiBUaGUgdGhlb3J5IG9mIFNFVF9MSU5FTk8tbGVzcyB0cmFjaW5nLgorCSAgIAorCSAgIEluIGEgbnV0c2hlbGwsIHdlIHVzZSB0aGUgY29fbG5vdGFiIGZpZWxkIG9mIHRoZSBjb2RlIG9iamVjdAorCSAgIHRvIHRlbGwgd2hlbiBleGVjdXRpb24gaGFzIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZS4KKworCSAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhlIGJhc2ljIGlkZWEgaXMgc28gc2V0IHRoaW5ncyB1cCBzbworCSAgIHRoYXQKKworCSAgICAgICAgICppbnN0cl9sYiA8PSBmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl91YgorCisJICAgaXMgdHJ1ZSBzbyBsb25nIGFzIGV4ZWN1dGlvbiBkb2VzIG5vdCBjaGFuZ2UgbGluZXMuCisKKwkgICBUaGlzIGlzIGFsbCBmYWlybHkgc2ltcGxlLiAgRGlnZ2luZyB0aGUgaW5mb3JtYXRpb24gb3V0IG9mCisJICAgY29fbG5vdGFiIHRha2VzIHNvbWUgd29yaywgYnV0IGlzIGNvbmNlcHR1YWxseSBjbGVhci4KKworCSAgIFNvbWV3aGF0IGhhcmRlciB0byBleHBsYWluIGlzIHdoeSB3ZSBkb24ndCBjYWxsIHRoZSBsaW5lCisJICAgdHJhY2UgZnVuY3Rpb24gd2hlbiBleGVjdXRpbmcgYSBQT1BfVE9QIG9yIFJFVFVSTl9OT05FCisJICAgb3Bjb2Rlcy4gIEFuIGV4YW1wbGUgcHJvYmFibHkgc2VydmVzIGJlc3QuCisKKwkgICBDb25zaWRlciB0aGlzIGNvZGU6CisKKwkgICAxOiBkZWYgZihhKToKKwkgICAyOiAgICAgaWYgYToKKwkgICAzOiAgICAgICAgcHJpbnQgMQorCSAgIDQ6ICAgICBlbHNlOgorCSAgIDU6ICAgICAgICBwcmludCAyCisKKwkgICB3aGljaCBjb21waWxlcyB0byB0aGlzOgorCisJICAgMiAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYSkKKwkJICAgICAgIDMgSlVNUF9JRl9GQUxTRSAgICAgICAgICAgIDkgKHRvIDE1KQorCQkgICAgICAgNiBQT1BfVE9QICAgICAgICAgICAgIAorCisJICAgMyAgICAgICAgICAgNyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKwkJICAgICAgMTAgUFJJTlRfSVRFTSAgICAgICAgICAKKwkJICAgICAgMTEgUFJJTlRfTkVXTElORSAgICAgICAKKwkJICAgICAgMTIgSlVNUF9GT1JXQVJEICAgICAgICAgICAgIDYgKHRvIDIxKQorCQkgPj4gICAxNSBQT1BfVE9QICAgICAgICAgICAgIAorCisJICAgNSAgICAgICAgICAxNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKKwkJICAgICAgMTkgUFJJTlRfSVRFTSAgICAgICAgICAKKwkJICAgICAgMjAgUFJJTlRfTkVXTElORSAgICAgICAKKwkJID4+ICAgMjEgUkVUVVJOX05PTkUgICAgICAgICAKKworCSAgIElmIGEgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0CisJICAgMTUgYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8KKwkgICBsaW5lIDMuICBUaGlzIGlzIGF0IGJlc3QgbWlzbGVhZGluZy4gIEluIHRoaXMgY2FzZSB3ZSBjb3VsZAorCSAgIGFzc29jaWF0ZSB0aGUgUE9QX1RPUCB3aXRoIGxpbmUgNCwgYnV0IHRoYXQgZG9lc24ndCBtYWtlCisJICAgc2Vuc2UgaW4gYWxsIGNhc2VzIChJIHRoaW5rKS4KKworCSAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBhIGlzIHRydWUsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgZnJvbQorCSAgIGluc3RydWN0aW9uIG9mZnNldCAxMiB0byBvZmZzZXQgMjEuICBUaGVuIHRoZSBjb19sbm90YWIgd291bGQKKwkgICBpbXBseSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZSA1LCB3aGljaCBpcyBhZ2FpbgorCSAgIG1pc2xlYWRpbmcuCisKKwkgICBUaGlzIGlzIHdoeSBpdCBpcyBpbXBvcnRhbnQgdGhhdCBSRVRVUk5fTk9ORSBpcyAqb25seSogdXNlZAorCSAgIGZvciB0aGUgImZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIiBmb3JtIG9mCisJICAgcmV0dXJuaW5nIE5vbmUgLS0gdXNpbmcgaXQgZm9yIGNvZGUgbGlrZQorCisJICAgMTogZGVmIGYoKToKKwkgICAyOiAgICAgcmV0dXJuCisKKwkgICB3b3VsZCwgb25jZSBhZ2FpbiwgbGVhZCB0byBtaXNsZWFkaW5nIHRyYWNpbmcgYmVoYXZpb3VyLgorCisJICAgSXQgaXMgYWxzbyB3b3J0aCBtZW50aW9uaW5nIHRoYXQgZ2V0dGluZyB0cmFjaW5nIGJlaGF2aW91cgorCSAgIHJpZ2h0IGlzIHRoZSAqZW50aXJlKiBtb3RpdmF0aW9uIGZvciBhZGRpbmcgdGhlIFJFVFVSTl9OT05FCisJICAgb3Bjb2RlLgorCSovCisKKwlpZiAob3Bjb2RlICE9IFBPUF9UT1AgJiYgb3Bjb2RlICE9IFJFVFVSTl9OT05FICYmCisJICAgIChmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl9sYiB8fCBmcmFtZS0+Zl9sYXN0aSA+ICppbnN0cl91YikpIHsKKwkJUHlDb2RlT2JqZWN0KiBjbyA9IGZyYW1lLT5mX2NvZGU7CisJCWludCBzaXplLCBhZGRyOworCQl1bnNpZ25lZCBjaGFyKiBwOworCisJCWNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKKworCQlzaXplID0gUHlTdHJpbmdfU2l6ZShjby0+Y29fbG5vdGFiKSAvIDI7CisJCXAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2xub3RhYik7CisKKwkJLyogcG9zc2libGUgb3B0aW1pemF0aW9uOiBpZiBmLT5mX2xhc3RpID09IGluc3RyX3ViCisJCSAgIChsaWtlbHkgdG8gYmUgYSBjb21tb24gY2FzZSkgdGhlbiB3ZSBhbHJlYWR5IGtub3cKKwkJICAgaW5zdHJfbGIgLS0gaWYgd2Ugc3RvcmVkIHRoZSBtYXRjaGluZyB2YWx1ZSBvZiBwCisJCSAgIHNvbXdoZXJlIHdlIGNvdWxkIHNraXAgdGhlIGZpcnN0IHdoaWxlIGxvb3AuICovCisKKwkJYWRkciA9IDA7CisKKwkJLyogc2VlIGNvbW1lbnRzIGluIGNvbXBpbGUuYyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mCisJCSAgIGNvX2xub3RhYi4gIEEgcG9pbnQgdG8gcmVtZW1iZXI6IGluY3JlbWVudHMgdG8gcAorCQkgICBzaG91bGQgY29tZSBpbiBwYWlycyAtLSBhbHRob3VnaCB3ZSBkb24ndCBjYXJlIGFib3V0CisJCSAgIHRoZSBsaW5lIGluY3JlbWVudHMgaGVyZSwgdHJlYXRpbmcgdGhlbSBhcyBieXRlCisJCSAgIGluY3JlbWVudHMgZ2V0cyBjb25mdXNpbmcsIHRvIHNheSB0aGUgbGVhc3QuICovCisKKwkJd2hpbGUgKHNpemUgPj0gMCkgeworCQkJaWYgKGFkZHIgKyAqcCA+IGZyYW1lLT5mX2xhc3RpKQorCQkJCWJyZWFrOworCQkJYWRkciArPSAqcCsrOworCQkJcCsrOworCQkJLS1zaXplOworCQl9CisJCSppbnN0cl9sYiA9IGFkZHI7CisJCWlmIChzaXplID4gMCkgeworCQkJd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CisJCQkJYWRkciArPSAqcCsrOworCQkJCWlmICgqcCsrKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCSppbnN0cl91YiA9IGFkZHI7CisJCX0KKwkJZWxzZSB7CisJCQkqaW5zdHJfdWIgPSBJTlRfTUFYOworCQl9CisJfQorfQorCiB2b2lkCiBQeUV2YWxfU2V0UHJvZmlsZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKmFyZykKIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IDViNGU4ZTYuLmZmOGY0YTUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtNDA3LDkgKzQwNywxMCBAQAogCiAvKiBBbGwgYWJvdXQgY19sbm90YWIuCiAKLWNfbG5vdGFiIGlzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGJ5dGVzIGRpc2d1aXNlZCBhcyBhIFB5dGhvbiBzdHJpbmcuICBJbiAtTwotbW9kZSwgU0VUX0xJTkVOTyBvcGNvZGVzIGFyZW4ndCBnZW5lcmF0ZWQsIGFuZCBieXRlY29kZSBvZmZzZXRzIGFyZSBtYXBwZWQKLXRvIHNvdXJjZSBjb2RlIGxpbmUgI3MgKHdoZW4gbmVlZGVkIGZvciB0cmFjZWJhY2tzKSB2aWEgY19sbm90YWIgaW5zdGVhZC4KK2NfbG5vdGFiIGlzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGJ5dGVzIGRpc2d1aXNlZCBhcyBhIFB5dGhvbiBzdHJpbmcuICBTaW5jZQordmVyc2lvbiAyLjMsIFNFVF9MSU5FTk8gb3Bjb2RlcyBhcmUgbmV2ZXIgZ2VuZXJhdGVkIGFuZCBieXRlY29kZSBvZmZzZXRzIGFyZQorbWFwcGVkIHRvIHNvdXJjZSBjb2RlIGxpbmUgI3MgdmlhIGNfbG5vdGFiIGluc3RlYWQuCisKIFRoZSBhcnJheSBpcyBjb25jZXB0dWFsbHkgYSBsaXN0IG9mCiAgICAgKGJ5dGVjb2RlIG9mZnNldCBpbmNyZW1lbnQsIGxpbmUgbnVtYmVyIGluY3JlbWVudCkKIHBhaXJzLiAgVGhlIGRldGFpbHMgYXJlIGltcG9ydGFudCBhbmQgZGVsaWNhdGUsIGJlc3QgaWxsdXN0cmF0ZWQgYnkgZXhhbXBsZToKQEAgLTgzMCwxMSArODMxLDYgQEAKIGNvbV9hZGRvcGFyZyhzdHJ1Y3QgY29tcGlsaW5nICpjLCBpbnQgb3AsIGludCBhcmcpCiB7CiAJaW50IGV4dGVuZGVkX2FyZyA9IGFyZyA+PiAxNjsKLQlpZiAob3AgPT0gU0VUX0xJTkVOTykgewotCQljb21fc2V0X2xpbmVubyhjLCBhcmcpOwotCQlpZiAoUHlfT3B0aW1pemVGbGFnKQotCQkJcmV0dXJuOwotCX0KIAlpZiAoZXh0ZW5kZWRfYXJnKXsKIAkJY29tX2FkZGJ5dGUoYywgRVhURU5ERURfQVJHKTsKIAkJY29tX2FkZGludChjLCBleHRlbmRlZF9hcmcpOwpAQCAtMTczOCw3ICsxNzM0LDcgQEAKIAkJCSAgYnJlYWs7CiAJCQlpZiAoY2gtPm5fbGluZW5vICE9IGxpbmVubykgewogCQkJCWxpbmVubyA9IGNoLT5uX2xpbmVubzsKLQkJCQljb21fYWRkb3BhcmcoYywgU0VUX0xJTkVOTywgbGluZW5vKTsKKwkJCQljb21fc2V0X2xpbmVubyhjLCBsaW5lbm8pOwogCQkJfQogCQkJY29tX2FyZ3VtZW50KGMsIGNoLCAma2V5d29yZHMpOwogCQkJaWYgKGtleXdvcmRzID09IE5VTEwpCkBAIC0zMTY4LDcgKzMxNjQsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGkgPiAwKQotCQkJY29tX2FkZG9wYXJnKGMsIFNFVF9MSU5FTk8sIGNoLT5uX2xpbmVubyk7CisJCQljb21fc2V0X2xpbmVubyhjLCBjaC0+bl9saW5lbm8pOwogCQljb21fbm9kZShjLCBjaCk7CiAJCWNvbV9hZGRmd3JlZihjLCBKVU1QX0lGX0ZBTFNFLCAmYSk7CiAJCWNvbV9hZGRieXRlKGMsIFBPUF9UT1ApOwpAQCAtMzE5NSw3ICszMTkxLDcgQEAKIAljb21fYWRkZndyZWYoYywgU0VUVVBfTE9PUCwgJmJyZWFrX2FuY2hvcik7CiAJYmxvY2tfcHVzaChjLCBTRVRVUF9MT09QKTsKIAljLT5jX2JlZ2luID0gYy0+Y19uZXh0aTsKLQljb21fYWRkb3BhcmcoYywgU0VUX0xJTkVOTywgbi0+bl9saW5lbm8pOworCWNvbV9zZXRfbGluZW5vKGMsIG4tPm5fbGluZW5vKTsKIAljb21fbm9kZShjLCBDSElMRChuLCAxKSk7CiAJY29tX2FkZGZ3cmVmKGMsIEpVTVBfSUZfRkFMU0UsICZhbmNob3IpOwogCWNvbV9hZGRieXRlKGMsIFBPUF9UT1ApOwpAQCAtMzIyOCw3ICszMjI0LDcgQEAKIAljb21fbm9kZShjLCBDSElMRChuLCAzKSk7CiAJY29tX2FkZGJ5dGUoYywgR0VUX0lURVIpOwogCWMtPmNfYmVnaW4gPSBjLT5jX25leHRpOwotCWNvbV9hZGRvcGFyZyhjLCBTRVRfTElORU5PLCBuLT5uX2xpbmVubyk7CisJY29tX3NldF9saW5lbm8oYywgbi0+bl9saW5lbm8pOwogCWNvbV9hZGRmd3JlZihjLCBGT1JfSVRFUiwgJmFuY2hvcik7CiAJY29tX3B1c2goYywgMSk7CiAJY29tX2Fzc2lnbihjLCBDSElMRChuLCAxKSwgT1BfQVNTSUdOLCBOVUxMKTsKQEAgLTMzMzksNyArMzMzNSw3IEBACiAJCX0KIAkJZXhjZXB0X2FuY2hvciA9IDA7CiAJCWNvbV9wdXNoKGMsIDMpOyAvKiB0YiwgdmFsLCBleGMgcHVzaGVkIGJ5IGV4Y2VwdGlvbiAqLwotCQljb21fYWRkb3BhcmcoYywgU0VUX0xJTkVOTywgY2gtPm5fbGluZW5vKTsKKwkJY29tX3NldF9saW5lbm8oYywgY2gtPm5fbGluZW5vKTsKIAkJaWYgKE5DSChjaCkgPiAxKSB7CiAJCQljb21fYWRkYnl0ZShjLCBEVVBfVE9QKTsKIAkJCWNvbV9wdXNoKGMsIDEpOwpAQCAtMzQwMSw3ICszMzk3LDcgQEAKIAljb21fcHVzaChjLCAzKTsKIAljb21fYmFja3BhdGNoKGMsIGZpbmFsbHlfYW5jaG9yKTsKIAljaCA9IENISUxEKG4sIE5DSChuKS0xKTsKLQljb21fYWRkb3BhcmcoYywgU0VUX0xJTkVOTywgY2gtPm5fbGluZW5vKTsKKwljb21fc2V0X2xpbmVubyhjLCBjaC0+bl9saW5lbm8pOwogCWNvbV9ub2RlKGMsIGNoKTsKIAljb21fYWRkYnl0ZShjLCBFTkRfRklOQUxMWSk7CiAJYmxvY2tfcG9wKGMsIEVORF9GSU5BTExZKTsKQEAgLTM3MjcsNyArMzcyMyw3IEBACiAKIAljYXNlIHNpbXBsZV9zdG10OgogCQkvKiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddIE5FV0xJTkUgKi8KLQkJY29tX2FkZG9wYXJnKGMsIFNFVF9MSU5FTk8sIG4tPm5fbGluZW5vKTsKKwkJY29tX3NldF9saW5lbm8oYywgbi0+bl9saW5lbm8pOwogCQl7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBOQ0gobiktMTsgaSArPSAyKQpAQCAtMzczNiw3ICszNzMyLDcgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBjb21wb3VuZF9zdG10OgotCQljb21fYWRkb3BhcmcoYywgU0VUX0xJTkVOTywgbi0+bl9saW5lbm8pOworCQljb21fc2V0X2xpbmVubyhjLCBuLT5uX2xpbmVubyk7CiAJCW4gPSBDSElMRChuLCAwKTsKIAkJZ290byBsb29wOwogCkBAIC0zOTkwLDEwICszOTg2LDcgQEAKIAljLT5jX2luZnVuY3Rpb24gPSAxOwogCWNvbV9ub2RlKGMsIENISUxEKG4sIDQpKTsKIAljLT5jX2luZnVuY3Rpb24gPSAwOwotCWNvbV9hZGRvcGFyZyhjLCBMT0FEX0NPTlNULCBjb21fYWRkY29uc3QoYywgUHlfTm9uZSkpOwotCWNvbV9wdXNoKGMsIDEpOwotCWNvbV9hZGRieXRlKGMsIFJFVFVSTl9WQUxVRSk7Ci0JY29tX3BvcChjLCAxKTsKKwljb21fYWRkYnl0ZShjLCBSRVRVUk5fTk9ORSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00MDUwLDcgKzQwNDMsNyBAQAogc3RhdGljIHZvaWQKIGNvbXBpbGVfbm9kZShzdHJ1Y3QgY29tcGlsaW5nICpjLCBub2RlICpuKQogewotCWNvbV9hZGRvcGFyZyhjLCBTRVRfTElORU5PLCBuLT5uX2xpbmVubyk7CisJY29tX3NldF9saW5lbm8oYywgbi0+bl9saW5lbm8pOwogCQogCXN3aXRjaCAoVFlQRShuKSkgewogCQpAQCAtNDA2MCwxOSArNDA1MywxMyBAQAogCQluID0gQ0hJTEQobiwgMCk7CiAJCWlmIChUWVBFKG4pICE9IE5FV0xJTkUpCiAJCQljb21fbm9kZShjLCBuKTsKLQkJY29tX2FkZG9wYXJnKGMsIExPQURfQ09OU1QsIGNvbV9hZGRjb25zdChjLCBQeV9Ob25lKSk7Ci0JCWNvbV9wdXNoKGMsIDEpOwotCQljb21fYWRkYnl0ZShjLCBSRVRVUk5fVkFMVUUpOwotCQljb21fcG9wKGMsIDEpOworCQljb21fYWRkYnl0ZShjLCBSRVRVUk5fTk9ORSk7CiAJCWMtPmNfaW50ZXJhY3RpdmUtLTsKIAkJYnJlYWs7CiAJCiAJY2FzZSBmaWxlX2lucHV0OiAvKiBBIHdob2xlIGZpbGUsIG9yIGJ1aWx0LWluIGZ1bmN0aW9uIGV4ZWMoKSAqLwogCQljb21fZmlsZV9pbnB1dChjLCBuKTsKLQkJY29tX2FkZG9wYXJnKGMsIExPQURfQ09OU1QsIGNvbV9hZGRjb25zdChjLCBQeV9Ob25lKSk7Ci0JCWNvbV9wdXNoKGMsIDEpOwotCQljb21fYWRkYnl0ZShjLCBSRVRVUk5fVkFMVUUpOwotCQljb21fcG9wKGMsIDEpOworCQljb21fYWRkYnl0ZShjLCBSRVRVUk5fTk9ORSk7CiAJCWJyZWFrOwogCQogCWNhc2UgZXZhbF9pbnB1dDogLyogQnVpbHQtaW4gZnVuY3Rpb24gaW5wdXQoKSAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbi5jIGIvUHl0aG9uL2Zyb3plbi5jCmluZGV4IDA2OWNlM2MuLjk0NmQ2MjYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW4uYworKysgYi9QeXRob24vZnJvemVuLmMKQEAgLTEzLDEyICsxMywxMiBAQAogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBNX19faGVsbG9fX1tdID0gewogCTk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAotCTAsMTE1LDE1LDAsMCwwLDEyNywwLDAsMTI3LDEsMCwxMDAsMCwwLDcxLAotCTcyLDEwMCwxLDAsODMsNDAsMiwwLDAsMCwxMTUsMTQsMCwwLDAsNzIsCi0JMTAxLDEwOCwxMDgsMTExLDMyLDExOSwxMTEsMTE0LDEwOCwxMDAsNDYsNDYsNDYsNzgsNDAsMCwKLQkwLDAsMCw0MCwwLDAsMCwwLDQwLDAsMCwwLDAsNDAsMCwwLAotCTAsMCwxMTUsOCwwLDAsMCwxMDQsMTAxLDEwOCwxMDgsMTExLDQ2LDExMiwxMjEsMTE1LAotCTEsMCwwLDAsNjMsMSwwLDAsMCwxMTUsMCwwLDAsMCwKKwkwLDExNSw5LDAsMCwwLDEwMCwwLDAsNzEsNzIsMTAwLDEsMCw4Myw0MCwKKwkyLDAsMCwwLDExNSwxNCwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LAorCTExMSwxMTQsMTA4LDEwMCw0Niw0Niw0Niw3OCw0MCwwLDAsMCwwLDQwLDAsMCwKKwkwLDAsNDAsMCwwLDAsMCw0MCwwLDAsMCwwLDExNSw4LDAsMCwKKwkwLDEwNCwxMDEsMTA4LDEwOCwxMTEsNDYsMTEyLDEyMSwxMTUsMSwwLDAsMCw2MywxLAorCTAsMCwwLDExNSwwLDAsMCwwLAogfTsKIAogI2RlZmluZSBTSVpFIChpbnQpc2l6ZW9mKE1fX19oZWxsb19fKQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IDZmZDA1ZDguLjM2Y2E3MDUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTQ5LDYgKzQ5LDkgQEAKICAgICAgICBhbGdvcml0aG0gcmVseWluZyBvbiB0aGUgYWJvdmUgc2NoZW1lLiBQZXJoYXBzIHdlIHNob3VsZCBzaW1wbHkKICAgICAgICBzdGFydCBjb3VudGluZyBpbiBpbmNyZW1lbnRzIG9mIDEwIGZyb20gbm93IG9uID8hCiAKKyAgICAgICBNV0gsIDIwMDItMDgtMDM6IFJlbW92ZWQgU0VUX0xJTkVOTy4gIENvdWxkbid0IGJlIGJvdGhlcmVkIGZpZ3VyaW5nCisgICAgICAgb3V0IHRoZSBNQUdJQyBzY2hlbWVzLCBzbyBqdXN0IGluY3JlbWVudGVkIGl0IGJ5IDEwLgorCiAgICBLbm93biB2YWx1ZXM6CiAgICAgICAgUHl0aG9uIDEuNTogICAyMDEyMQogICAgICAgIFB5dGhvbiAxLjUuMTogMjAxMjEKQEAgLTYwLDggKzYzLDkgQEAKICAgICAgICBQeXRob24gMi4xLjI6IDYwMjAyCiAgICAgICAgUHl0aG9uIDIuMjogICA2MDcxNwogICAgICAgIFB5dGhvbiAyLjNhMDogNjIwMTEKKyAgICAgICBQeXRob24gMi4zYTA6IDYyMDIxCiAqLwotI2RlZmluZSBNQUdJQyAoNjIwMTEgfCAoKGxvbmcpJ1xyJzw8MTYpIHwgKChsb25nKSdcbic8PDI0KSkKKyNkZWZpbmUgTUFHSUMgKDYyMDIxIHwgKChsb25nKSdccic8PDE2KSB8ICgobG9uZyknXG4nPDwyNCkpCiAKIC8qIE1hZ2ljIHdvcmQgYXMgZ2xvYmFsOyBub3RlIHRoYXQgX1B5SW1wb3J0X0luaXQoKSBjYW4gY2hhbmdlIHRoZQogICAgdmFsdWUgb2YgdGhpcyBnbG9iYWwgdG8gYWNjb21tb2RhdGUgZm9yIGFsdGVyYXRpb25zIG9mIGhvdyB0aGUKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCBkZTkxOGY5Li4yN2M2OWI2IDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0xMDMsOCArMTAzLDcgQEAKIH07CiAKIHN0YXRpYyB0cmFjZWJhY2tvYmplY3QgKgotbmV3dHJhY2ViYWNrb2JqZWN0KHRyYWNlYmFja29iamVjdCAqbmV4dCwgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCBsYXN0aSwKLQkJICAgaW50IGxpbmVubykKK25ld3RyYWNlYmFja29iamVjdCh0cmFjZWJhY2tvYmplY3QgKm5leHQsIFB5RnJhbWVPYmplY3QgKmZyYW1lKQogewogCXRyYWNlYmFja29iamVjdCAqdGI7CiAJaWYgKChuZXh0ICE9IE5VTEwgJiYgIVB5VHJhY2VCYWNrX0NoZWNrKG5leHQpKSB8fApAQCAtMTE4LDggKzExNyw5IEBACiAJCXRiLT50Yl9uZXh0ID0gbmV4dDsKIAkJUHlfWElOQ1JFRihmcmFtZSk7CiAJCXRiLT50Yl9mcmFtZSA9IGZyYW1lOwotCQl0Yi0+dGJfbGFzdGkgPSBsYXN0aTsKLQkJdGItPnRiX2xpbmVubyA9IGxpbmVubzsKKwkJdGItPnRiX2xhc3RpID0gZnJhbWUtPmZfbGFzdGk7CisJCXRiLT50Yl9saW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGZyYW1lLT5mX2NvZGUsIAorCQkJCQkJIGZyYW1lLT5mX2xhc3RpKTsKIAkJUHlPYmplY3RfR0NfVHJhY2sodGIpOwogCX0KIAlyZXR1cm4gdGI7CkBAIC0xMzAsOCArMTMwLDcgQEAKIHsKIAlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7CiAJdHJhY2ViYWNrb2JqZWN0ICpvbGR0YiA9ICh0cmFjZWJhY2tvYmplY3QgKikgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrOwotCXRyYWNlYmFja29iamVjdCAqdGIgPSBuZXd0cmFjZWJhY2tvYmplY3Qob2xkdGIsCi0JCQkJZnJhbWUsIGZyYW1lLT5mX2xhc3RpLCBmcmFtZS0+Zl9saW5lbm8pOworCXRyYWNlYmFja29iamVjdCAqdGIgPSBuZXd0cmFjZWJhY2tvYmplY3Qob2xkdGIsIGZyYW1lKTsKIAlpZiAodGIgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCXRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IChQeU9iamVjdCAqKXRiOwpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy90cmFjZS5weSBiL1Rvb2xzL3NjcmlwdHMvdHJhY2UucHkKaW5kZXggOWM0ODE5Zi4uZjk2ZTA0ZiAxMDA2NDQKLS0tIGEvVG9vbHMvc2NyaXB0cy90cmFjZS5weQorKysgYi9Ub29scy9zY3JpcHRzL3RyYWNlLnB5CkBAIC0zNzAsNDEgKzM3MCwyOSBAQAogICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJjYW5ub3Qgc2F2ZSBjb3VudHMgZmlsZXMgYmVjYXVzZSAlcyIgJSBlcnIpCiAKLSMgR2l2ZW4gYSBjb2RlIHN0cmluZywgcmV0dXJuIHRoZSBTRVRfTElORU5PIGluZm9ybWF0aW9uCi1kZWYgX2ZpbmRfTElORU5PX2Zyb21fc3RyaW5nKGNvX2NvZGUpOgotICAgICIiInJldHVybiBhbGwgb2YgdGhlIFNFVF9MSU5FTk8gaW5mb3JtYXRpb24gZnJvbSBhIGNvZGUgc3RyaW5nIiIiCi0gICAgaW1wb3J0IGRpcworZGVmIF9maW5kX0xJTkVOT19mcm9tX2NvZGUoY29kZSk6CisgICAgIiIicmV0dXJuIHRoZSBudW1iZXJzIG9mIHRoZSBsaW5lcyBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSB0aGF0CisgICAgd2FzIGNvbXBpbGVkIGludG8gY29kZSIiIgogICAgIGxpbmVub3MgPSB7fQogCi0gICAgIyBUaGlzIGNvZGUgd2FzIGZpbGNoZWQgZnJvbSB0aGUgYGRpcycgbW9kdWxlIHRoZW4gbW9kaWZpZWQKLSAgICBuID0gbGVuKGNvX2NvZGUpCi0gICAgaSA9IDAKLSAgICBwcmV2X29wID0gTm9uZQotICAgIHByZXZfbGluZW5vID0gMAotICAgIHdoaWxlIGkgPCBuOgotICAgICAgICBjID0gY29fY29kZVtpXQotICAgICAgICBvcCA9IG9yZChjKQotICAgICAgICBpZiBvcCA9PSBkaXMuU0VUX0xJTkVOTzoKLSAgICAgICAgICAgIGlmIHByZXZfb3AgPT0gb3A6Ci0gICAgICAgICAgICAgICAgIyB0d28gU0VUX0xJTkVOTyBpbiBhIHJvdywgc28gdGhlIHByZXZpb3VzIGRpZG4ndAotICAgICAgICAgICAgICAgICMgaW5kaWNhdGUgYW55dGhpbmcuICBUaGlzIG9jY3VycyB3aXRoIHRyaXBsZQotICAgICAgICAgICAgICAgICMgcXVvdGVkIHN0cmluZ3MgKD8pLiAgUmVtb3ZlIHRoZSBvbGQgb25lLgotICAgICAgICAgICAgICAgIGRlbCBsaW5lbm9zW3ByZXZfbGluZW5vXQotICAgICAgICAgICAgcHJldl9saW5lbm8gPSBvcmQoY29fY29kZVtpKzFdKSArIG9yZChjb19jb2RlW2krMl0pKjI1NgotICAgICAgICAgICAgbGluZW5vc1twcmV2X2xpbmVub10gPSAxCi0gICAgICAgIGlmIG9wID49IGRpcy5IQVZFX0FSR1VNRU5UOgotICAgICAgICAgICAgaSA9IGkgKyAzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpID0gaSArIDEKLSAgICAgICAgcHJldl9vcCA9IG9wCisgICAgbGluZV9pbmNyZW1lbnRzID0gW29yZChjKSBmb3IgYyBpbiBjb2RlLmNvX2xub3RhYlsxOjoyXV0KKyAgICB0YWJsZV9sZW5ndGggPSBsZW4obGluZV9pbmNyZW1lbnRzKQorCisgICAgbGluZW5vID0gY29kZS5jb19maXJzdF9saW5lbm8KKworICAgIGZvciBsaSBpbiBsaW5lX2luY3JlbWVudHM6CisgICAgICAgIGxpbmVub3NbbGluZW5vXSA9IDEKKyAgICAgICAgbGluZW5vICs9IGxpCisgICAgbGluZW5vc1tsaW5lbm9dID0gMQorCiAgICAgcmV0dXJuIGxpbmVub3MKIAogZGVmIF9maW5kX0xJTkVOTyhjb2RlKToKLSAgICAiIiJyZXR1cm4gYWxsIG9mIHRoZSBTRVRfTElORU5PIGluZm9ybWF0aW9uIGZyb20gYSBjb2RlIG9iamVjdCIiIgorICAgICIiInJldHVybiBhbGwgb2YgdGhlIGxpbmVubyBpbmZvcm1hdGlvbiBmcm9tIGEgY29kZSBvYmplY3QiIiIKICAgICBpbXBvcnQgdHlwZXMKIAogICAgICMgZ2V0IGFsbCBvZiB0aGUgbGluZW5vIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvZGUgb2YgdGhpcyBzY29wZSBsZXZlbAotICAgIGxpbmVub3MgPSBfZmluZF9MSU5FTk9fZnJvbV9zdHJpbmcoY29kZS5jb19jb2RlKQorICAgIGxpbmVub3MgPSBfZmluZF9MSU5FTk9fZnJvbV9jb2RlKGNvZGUpCiAKICAgICAjIGFuZCBjaGVjayB0aGUgY29uc3RhbnRzIGZvciByZWZlcmVuY2VzIHRvIG90aGVyIGNvZGUgb2JqZWN0cwogICAgIGZvciBjIGluIGNvZGUuY29fY29uc3RzOgpAQCAtNDE2LDkgKzQwNCw2IEBACiBkZWYgZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpOgogICAgICIiInJldHVybiBhIGRpY3Qgb2YgdGhlIGxpbmUgbnVtYmVycyBmcm9tIGV4ZWN1dGFibGUgc3RhdGVtZW50cyBpbiBhIGZpbGUKIAotICAgIFdvcmtzIGJ5IGZpbmRpbmcgYWxsIG9mIHRoZSBjb2RlLWxpa2Ugb2JqZWN0cyBpbiB0aGUgbW9kdWxlIHRoZW4gc2VhcmNoaW5nCi0gICAgdGhlIGJ5dGUgY29kZSBmb3IgJ1NFVF9MSU5FTk8nIHRlcm1zIChzbyB0aGlzIHdvbid0IHdvcmsgb25lIC1PIGZpbGVzKS4KLQogICAgICIiIgogICAgIGltcG9ydCBwYXJzZXIKIApAQCAtNDI4LDEwICs0MTMsNiBAQAogICAgIGFzdCA9IHBhcnNlci5zdWl0ZShwcm9nKQogICAgIGNvZGUgPSBwYXJzZXIuY29tcGlsZWFzdChhc3QsIGZpbGVuYW1lKQogCi0gICAgIyBUaGUgb25seSB3YXkgSSBrbm93IHRvIGZpbmQgbGluZSBudW1iZXJzIGlzIHRvIGxvb2sgZm9yIHRoZQotICAgICMgU0VUX0xJTkVOTyBpbnN0cnVjdGlvbnMuICBJc24ndCB0aGVyZSBzb21lIHdheSB0byBnZXQgaXQgZnJvbQotICAgICMgdGhlIEFTVD8KLQogICAgIHJldHVybiBfZmluZF9MSU5FTk8oY29kZSkKIAogIyMjIFhYWCBiZWNhdXNlIG9zLnBhdGguY29tbW9ucHJlZml4IHNlZW1zIGJyb2tlbiBieSBteSB3YXkgb2YgdGhpbmtpbmcuLi4K