ZGlmZiAtLWdpdCBhL2ZlYy9BbmRyb2lkLm1rIGIvZmVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmYTUxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjUgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJmZWNfcnMKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtTzMKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXIKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJZW5jb2RlX3JzX2NoYXIuYyBcCisJZGVjb2RlX3JzX2NoYXIuYyBcCisJaW5pdF9yc19jaGFyLmMKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliZmVjX3JzX2hvc3QKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtTzMKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCitMT0NBTF9TQU5JVElaRSA6PSBpbnRlZ2VyCitlbmRpZgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwllbmNvZGVfcnNfY2hhci5jIFwKKwlkZWNvZGVfcnNfY2hhci5jIFwKKwlpbml0X3JzX2NoYXIuYworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9mZWMvQ2xlYW5TcGVjLm1rIGIvZmVjL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGJhYmVkCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL0NsZWFuU3BlYy5tawpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAorIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKKyMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisjIHJ1biBiZWZvcmUuCisjCisjIEUuZy46CisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCisjICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCisjCisjIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAorIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KKyMKKyMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgorIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgorIworIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKKyMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKKyMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKKyMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAorIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyMKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyBGb3IgZXhhbXBsZToKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliZmVjX3JzX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKEhPU1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJmZWNfcnNfaG9zdF9pbnRlcm1lZGlhdGVzKQpkaWZmIC0tZ2l0IGEvZmVjL0lOU1RBTEwgYi9mZWMvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU1YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL0lOU1RBTEwKQEAgLTAsMCArMSwzOSBAQAorSU5TVEFMTEFUSU9OIElOU1RSVUNUSU9OUworCitUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgbGliZmVjIGxpYnJhcmllcywgc2ltcGx5IHNheQorCisuL2NvbmZpZ3VyZQorbWFrZQorbWFrZSB0ZXN0IChvcHRpb25hbCkKK21ha2UgaW5zdGFsbCAoYXMgcm9vdCkKKworQnkgZGVmYXVsdCwgIm1ha2UgaW5zdGFsbCIgcHV0cyB0aGUgbGliZmVjIGxpYnJhcmllcyBpbgorL3Vzci9sb2NhbC9saWIsIHRoZSBpbmNsdWRlIGZpbGVzIGluIC91c3IvbG9jYWwvaW5jbHVkZSwgYW5kIHRoZQorbWFudWFsIHBhZ2UgaW4gL3Vzci9sb2NhbC9tYW4uCisKK1lvdSBtYXkgaGF2ZSBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgR05VIGFzc2VtYmxlciB0aGF0IGNhbm5vdCBoYW5kbGUKK3RoZSByZWxhdGl2ZWx5IG5ldyBTU0UyIG1uZW1vbmljcy4gVXBkYXRlIHlvdXIgdmVyc2lvbiBvZiB0aGUgR05VCisiYmludXRpbHMiIHBhY2thZ2UuCisKK1lvdSBtYXkgb2J0YWluIHRoZSBsYXRlc3QgYmludXRpbHMgcGFja2FnZSB0aHJvdWdoIHlvdXIgbm9ybWFsCitkaXN0cmlidXRpb24gY2hhbm5lbHMgb3IgZnJvbToKKworaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9iaW51dGlscy8KKworVEVTVElORyBUSEUgRkVDIExJQlJBUlkKKworQWZ0ZXIgcnVubmluZyB0aGUgLi9jb25maWd1cmUgc2NyaXB0LCBvcHRpb25hbCB0ZXN0cyBjYW4gYmUgYnVpbHQgYW5kCitydW4gYXMgZm9sbG93czoKKworbWFrZSB0ZXN0CisKKyJtYWtlIHRlc3QiIHRlc3RzIGVhY2ggcm91dGluZSwgdXNpbmcgdGhlIFNJTUQgdmVyc2lvbnMgYXMKK2FwcHJvcHJpYXRlLCB2ZXJpZnlpbmcgY29ycmVjdCBvcGVyYXRpb24gYW5kIGVzdGltYXRpbmcgVml0ZXJiaQorZGVjb2Rpbmcgc3BlZWRzLiBUaGVzZSB0ZXN0cyBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgdW5sZXNzIHNvbWV0aGluZyBpcworYnJva2VuLgorCisyOCBNYXIgMjAwNAorUGhpbCBLYXJuLCBrYXJuQGthOXEubmV0CisKKworCmRpZmYgLS1naXQgYS9mZWMvTU9EVUxFX0xJQ0VOU0VfTEdQTCBiL2ZlYy9NT0RVTEVfTElDRU5TRV9MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvTU9EVUxFX0xJQ0VOU0VfTEdQTApkaWZmIC0tZ2l0IGEvZmVjL05PVElDRSBiL2ZlYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzYTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9OT1RJQ0UKQEAgLTAsMCArMSw1MDQgQEAKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgqSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IKkgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvZmVjL1JFQURNRSBiL2ZlYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9SRUFETUUKQEAgLTAsMCArMSwxMjAgQEAKK0NPUFlSSUdIVAorCitUaGlzIHBhY2thZ2UgaXMgY29weXJpZ2h0IDIwMDYgYnkgUGhpbCBLYXJuLCBLQTlRLiBJdCBtYXkgYmUgdXNlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpLiBTZWUKK3RoZSBmaWxlICJsZXNzZXIudHh0IiBpbiB0aGlzIHBhY2thZ2UgZm9yIGxpY2Vuc2UgZGV0YWlscy4KKworSU5UUk9EVUNUSU9OCisKK1RoaXMgcGFja2FnZSBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgc2V2ZXJhbAorcG9wdWxhciBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKEZFQykgYWxnb3JpdGhtcyBhbmQgc2V2ZXJhbCBsb3ctbGV2ZWwgcm91dGluZXMKK3VzZWZ1bCBpbiBtb2RlbXMgaW1wbGVtZW50ZWQgd2l0aCBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzaW5nIChEU1ApLgorCitUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSBwcm92aWRlZDoKKworMS4gVml0ZXJiaSBkZWNvZGVycyBmb3IgdGhlIGZvbGxvd2luZyBjb252b2x1dGlvbmFsIGNvZGVzOgorCityPTEvMiBrPTcgKCJWb3lhZ2VyIiBjb2RlLCBub3cgYSB3aWRlbHkgdXNlZCBpbmR1c3RyeSBzdGFuZGFyZCkKK3I9MS8yIGs9OSAoVXNlZCBvbiB0aGUgSVMtOTUgQ0RNQSBmb3J3YXJkIGxpbmspCityPTEvNiBrPTE1ICgiQ2Fzc2luaSIgY29kZSwgdXNlZCBieSBzZXZlcmFsIE5BU0EvSlBMIGRlZXAgc3BhY2UgbWlzc2lvbnMpCisKKzIuIFJlZWQtU29sb21vbiBlbmNvZGVycyBhbmQgZGVjb2RlcnMgZm9yIGFueSB1c2VyLXNwZWNpZmllZCBjb2RlLgorCiszLiBPcHRpbWl6ZWQgZW5jb2RlciBhbmQgZGVjb2RlciBmb3IgdGhlIENDU0RTLXN0YW5kYXJkICgyNTUsMjIzKQorUmVlZC1Tb2xvbW9uIGNvZGUsIHdpdGggYW5kIHdpdGhvdXQgdGhlIENDU0RTLXN0YW5kYXJkICJkdWFsIGJhc2lzIgorc3ltYm9sIHJlcHJlc2VudGF0aW9uLgorCis0LiBDb21wdXRlIGRvdCBwcm9kdWN0IGJldHdlZW4gYSAxNi1iaXQgYnVmZmVyIGFuZCBhIHNldCBvZiAxNi1iaXQKK2NvZWZmaWNpZW50cy4gVGhpcyBpcyB0aGUgYmFzaWMgRFNQIHByaW1pdGl2ZSBmb3IgZGlnaXRhbCBmaWx0ZXJpbmcKK2FuZCBjb3JyZWxhdGlvbi4KKworNC4gQ29tcHV0ZSBzdW0gb2Ygc3F1YXJlcyBvZiBhIGJ1ZmZlciBvZiAxNi1iaXQgc2lnbmVkIGludGVnZXJzLiBUaGlzIGlzCit1c2VmdWwgaW4gRFNQIGZvciBmaW5kaW5nIHRoZSB0b3RhbCBlbmVyZ3kgaW4gYSBzaWduYWwuCisKKzUuIEZpbmQgcGVhayB2YWx1ZSBpbiBhIGJ1ZmZlciBvZiAxNi1iaXQgc2lnbmVkIGludGVnZXJzLCB1c2VmdWwgZm9yCitzY2FsaW5nIGEgc2lnbmFsIHRvIHByZXZlbnQgb3ZlcmZsb3cuCisKK1NJTUQgU1VQUE9SVAorCitUaGlzIHBhY2thZ2UgYXV0b21hdGljYWxseSBtYWtlcyB1c2Ugb2YgdmFyaW91cyBTSU1EIChTaW5nbGUKK0luc3RydWN0aW9uIHN0cmVhbSwgTXVsdGlwbGUgRGF0YSBzdHJlYW0pIGluc3RydWN0aW9uIHNldHMsIHdoZW4KK2F2YWlsYWJsZTogTU1YLCBTU0UgYW5kIFNTRTIgb24gdGhlIElBLTMyIChJbnRlbCkgYXJjaGl0ZWN0dXJlLCBhbmQKK0FsdGl2ZWMgb24gdGhlIFBvd2VyUEMgRzQgYW5kIEc1IHVzZWQgYnkgUG93ZXIgTWFjaW50b3NoZXMuCisKKyJBbHRpdmVjIiBpcyBhIE1vdG9yb2xhIHRyYWRlbWFyazsgQXBwbGUgY2FsbHMgaXQgIlZlbG9jaXR5IEVuZ2luZSIsCithbmQgSUJNIGNhbGxzIGl0ICJWTVgiLiBBbHRpdmVjIGlzIHJvdWdobHkgY29tcGFyYWJsZSB0byBTU0UyIG9uIHRoZQorSUEtMzIuCisKK01hbnkgb2YgdGhlIFNJTUQgdmVyc2lvbnMgcnVuIG1vcmUgdGhhbiBhbiBvcmRlciBvZgorbWFnbml0dWRlIGZhc3RlciB0aGFuIHRoZWlyIHBvcnRhYmxlIEMgdmVyc2lvbnMuIFRoZSBhdmFpbGFibGUgU0lNRAoraW5zdHJ1Y3Rpb24gc2V0cywgaWYgYW55LCBhcmUgZGV0ZXJtaW5lZCBhdCBydW4gdGltZSBhbmQgdGhlIHByb3BlcgordmVyc2lvbiBvZiBlYWNoIHJvdXRpbmUgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZC4gSWYgbm8gU0lNRAoraW5zdHJ1Y3Rpb25zIGFyZSBhdmFpbGFibGUsIHRoZSBwb3J0YWJsZSBDIHZlcnNpb24gaXMgaW52b2tlZCBieQorZGVmYXVsdC4gT24gdGFyZ2V0cyBvdGhlciB0aGFuIElBLTMyIGFuZCBQUEMsIG9ubHkgdGhlIHBvcnRhYmxlIEMKK3ZlcnNpb24gaXMgYnVpbHQuCisKK1RoZSBTSU1ELWFzc2lzdGVkIHZlcnNpb25zIGdlbmVyYWxseSBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIEMKK3ZlcnNpb25zLCB3aXRoIGEgZmV3IG1pbm9yIGV4Y2VwdGlvbnMuIFRoZSBWaXRlcmJpIGRlY29kZXJzIGluIEMgaGF2ZQorYSB2ZXJ5IHNsaWdodGx5IGdyZWF0ZXIgRWIvTm8gcGVyZm9ybWFuY2UgZHVlIHRvIHRoZWlyIHVzZSBvZiAzMi1iaXQKK3BhdGggbWV0cmljcy4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBTSU1EIHZlcnNpb25zIHVzZSB0aGUKKyJzYXR1cmF0aW5nIiBhcml0aG1ldGljIGF2YWlsYWJsZSBpbiB0aGVzZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgdGhlCitpbnRlZ2VyIHdyYXBhcm91bmRzIHRoYXQgY2FuIG9jY3VyIGluIEMgd2hlbiBhcmd1bWVudCByYW5nZXMgYXJlIG5vdAorcHJvcGVybHkgY29uc3RyYWluZWQuIFRoaXMgYXBwbGllcyBwcmltYXJpbHkgdG8gdGhlICJkb3Rwcm9kIiAoZG90Citwcm9kdWN0KSBmdW5jdGlvbi4KKworVGhlIE1NWCAoTXVsdGlNZWRpYSBlWHRlbnNpb25zKSBpbnN0cnVjdGlvbiBzZXQgd2FzIGludHJvZHVjZWQgb24KK2xhdGVyIFBlbnRpdW0gQ1BVczsgaXQgaXMgYWxzbyBpbXBsZW1lbnRlZCBvbiB0aGUgUGVudGl1bSBJSSBhbmQgbW9zdAorQU1EIENQVXMgc3RhcnRpbmcgd2l0aCB0aGUgSzYuIFNTRSAoU0lNRCBTdHJlYW1pbmcgRXh0ZW5zaW9ucykgd2FzCitpbnRyb2R1Y2VkIGluIHRoZSBQZW50aXVtIElJSTsgQU1EIGNhbGxzIGl0ICIzRCBOb3chIFByb2Zlc3Npb25hbCIuCitJbnRlbCBpbnRyb2R1Y2VkIFNTRTIgb24gdGhlIFBlbnRpdW0gNCwgYW5kIGl0IGhhcyBiZWVuIHBpY2tlZCB1cCBieQorbGF0ZXIgQU1EIENQVXMuIFNTRSBzdXBwb3J0IGltcGxpZXMgTU1YIHN1cHBvcnQsIHdoaWxlIFNTRTIgc3VwcG9ydAoraW1wbGllcyBib3RoIFNTRSBhbmQgTU1YIHN1cHBvcnQuCisKK1RoZSBsYXRlc3QgSUEtMzIgU0lNRCBpbnN0cnVjdGlvbiBzZXQsIFNTRTMgKGFsc28ga25vd24gYXMgIlByZXNjb3R0CitOZXcgSW5zdHJ1Y3Rpb25zIikgd2FzIGludHJvZHVjZWQgaW4gZWFybHkgMjAwNCB3aXRoIHRoZSBsYXRlc3QKKygiUHJlc2NvdHQiKSByZXZpc2lvbiBvZiB0aGUgUGVudGl1bSA0LiBSZWxhdGl2ZWx5IGxpdHRsZSB3YXMKK2ludHJvZHVjZWQgd2l0aCBTU0UzLCBhbmQgdGhpcyBsaWJyYXJ5IGN1cnJlbnRseSBtYWtlcyBubyB1c2Ugb2YgaXQuCisKK1NlZSB0aGUgdmFyaW91cyBtYW51YWwgcGFnZXMgZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSB0aGUgbGlicmFyeQorcm91dGluZXMuCisKK0NvcHlyaWdodCAyMDA2LCBQaGlsIEthcm4sIEtBOVEKK2thcm5Aa2E5cS5uZXQKK2h0dHA6Ly93d3cua2E5cS5uZXQvCisKK1RoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIChMR1BMKTsgc2VlIHRoZSBmaWxlIGxlc3Nlci50eHQgZm9yIGRldGFpbHMuCisKK1JldmlzaW9uIGhpc3Rvcnk6CitWZXJzaW9uIDEuMCByZWxlYXNlZCAyOSBNYXkgMjAwMQorCitWZXJzaW9uIDIuMCByZWxlYXNlZCAzIERlYyAyMDAxOgorUmVzdHJ1Y3R1cmVkIHRvIGFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLgorCitWZXJzaW9uIDIuMC4xIHJlbGVhc2VkIDggRGVjIDIwMDE6CitJbmNsdWRlcyBhdXRvY29uZi9jb25maWd1cmUgc2NyaXB0CisKK1ZlcnNpb24gMi4wLjIgcmVsZWFzZWQgNCBGZWIgMjAwMjoKK0FkZCBTSU1EIHZlcnNpb24gb3ZlcnJpZGUgb3B0aW9ucworVGVzdCBmb3IgbGFjayBvZiBTU0UyIG1uZW1vbmljIHN1cHBvcnQgaW4gJ2FzJworQnVpbGQgb25seSBzZWxlY3RlZCB2ZXJzaW9uCisKK1ZlcnNpb24gMi4wLjMgcmVsZWFzZWQgNiBGZWIgMjAwMjoKK0ZpeCB0byBwYXJpdHliIGZ1bmN0aW9uIGluIHBhcml0eS5oCisKK2ZlY2xpYiB2ZXJzaW9uIDEuMCByZWxlYXNlZCBOb3ZlbWJlciAyMDAzCitNZXJnZWQgU0lNRC1WaXRlcmJpLCBSUyBhbmQgRFNQIGxpYnJhcmllcworQ2hhbmdlZCBTSU1EIFZpdGVyYmkgZGVjb2RlciB0byBkZXRlY3QgU1NFMi9TU0UvTU1YIGF0IHJ1bnRpbWUgcmF0aGVyIHRoYW4gYnVpbGQgdGltZQorCitmZWNsaWIgdmVyc2lvbiAyLjAgKHVucmVsZWFzZWQpIE1hciAyMDA0CitHZW5lcmFsIHNwZWVkdXBzIGFuZCBjbGVhbnVwcworU3dpdGNoIGZyb20gNCB0byA4LWJpdCBpbnB1dCBzeW1ib2xzIG9uIGFsbCBWaXRlcmJpIGRlY29kZXJzCitTdXBwb3J0IGZvciBBbHRpdmVjIG9uIFBvd2VyUEMKK1N1cHBvcnQgZm9yIGs9MTUgcj0xLzYgQ2Fzc2luaS9NYXJzIFBhdGhmaW5kZXIvTWFycyBFeHBsb3JhdGlvbiBSb3Zlci9TVEVSRU8gY29kZQorQ2hhbmdlZCBsaWNlbnNlIHRvIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKworZmVjbGliIHZlcnNpb24gMi4xIEp1bmUgNSAyMDA2CitBZGRlZCBlcnJvciBjaGVja2luZywgZml4ZWQgYWxpZ25tZW50IGJ1ZyBpbiBTU0UyIHZlcnNpb25zIG9mIFZpdGVyYmkgZGVjb2RlcnMgY2F1c2luZyBzZWdmYXVsdHMKKworZmVjbGliIHZlcnNpb24gMi4xLjEgSnVuZSA2IDIwMDYKK0ZpeCB0ZXN0L2JlbmNobWFyayB0aW1lIG1lYXN1cmVtZW50IG9uIExpbnV4CmRpZmYgLS1naXQgYS9mZWMvY2NzZHMuaCBiL2ZlYy9jY3Nkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjU0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvY2NzZHMuaApAQCAtMCwwICsxLDUgQEAKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBkYXRhX3Q7CitleHRlcm4gdW5zaWduZWQgY2hhciBUYWx0YWJbXSxUYWwxdGFiW107CisjZGVmaW5lIE5OIDI1NQorI2RlZmluZSBOUk9PVFMgMzIKKwpkaWZmIC0tZ2l0IGEvZmVjL2NoYXIuaCBiL2ZlYy9jaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlZmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9jaGFyLmgKQEAgLTAsMCArMSwyNCBAQAorLyogU3R1ZmYgc3BlY2lmaWMgdG8gdGhlIDgtYml0IHN5bWJvbCB2ZXJzaW9uIG9mIHRoZSBnZW5lcmFsIHB1cnBvc2UgUlMgY29kZWNzCisgKgorICogQ29weXJpZ2h0IDIwMDMsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBkYXRhX3Q7CisKKyNkZWZpbmUgTU9ETk4oeCkgbW9kbm4ocnMseCkKKworI2RlZmluZSBNTSAocnMtPm1tKQorI2RlZmluZSBOTiAocnMtPm5uKQorI2RlZmluZSBBTFBIQV9UTyAocnMtPmFscGhhX3RvKSAKKyNkZWZpbmUgSU5ERVhfT0YgKHJzLT5pbmRleF9vZikKKyNkZWZpbmUgR0VOUE9MWSAocnMtPmdlbnBvbHkpCisjZGVmaW5lIE5ST09UUyAocnMtPm5yb290cykKKyNkZWZpbmUgRkNSIChycy0+ZmNyKQorI2RlZmluZSBQUklNIChycy0+cHJpbSkKKyNkZWZpbmUgSVBSSU0gKHJzLT5pcHJpbSkKKyNkZWZpbmUgUEFEIChycy0+cGFkKQorI2RlZmluZSBBMCAoTk4pCisKKworCisKZGlmZiAtLWdpdCBhL2ZlYy9jb25maWcuZ3Vlc3MgYi9mZWMvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGZlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTUxNiBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgICBJbmMuCisKK3RpbWVzdGFtcD0nMjAwNy0wMy0wNicKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQorIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgX19MUDY0X18gPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHBjOTgpCisJCWVjaG8gaTM4Ni11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgIGFtZDY0KQorCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgICopCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOndpbmRvd3MzMio6KikKKyAgICAJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjpbMzQ1Nl0qKQorICAgIAljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgeDg2KSAKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgRU02NFQgfCBhdXRoZW50aWNhbWQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtMzJyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHMKKwkjdW5kZWYgbWlwc2VsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwc2VsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzCisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eQ1BVL3sKKwkJczogOjpnCisJCXAKKwkgICAgfSdgIgorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9CisJOzsKKyAgICBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwczY0CisJI3VuZGVmIG1pcHM2NGVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwczY0ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHM2NAorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBwYzpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworICAgICAgICBlc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHh0ZW5zYTpMaW51eDoqOiopCisgICAgCWVjaG8geHRlbnNhLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCisJIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAorCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KKwkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgorCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCisJCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCisJCQkJICAgIHMvWyAJXVsgCV0qLyAvZworCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLworCQkJCSAgICBzLyAuKi8vCisJCQkJICAgIHAnYAorICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCisJICBlbGYzMi1pMzg2KQorCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgorCQk7OworCSAgYS5vdXQtaTM4Ni1saW51eCkKKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgorCQlleGl0IDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCA7OworCWVzYWMKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZmRlZiBfX0VMRl9fCisJIyBpZmRlZiBfX0dMSUJDX18KKwkjICBpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJIyAgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjICBlbmRpZgorCSMgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjIGVuZGlmCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eTElCQy97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiB7CisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwkJZXhpdAorCX0KKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIHsgZWNobyAiJHtURU5UQVRJVkV9IjsgZXhpdDsgfQorCTs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7CisgICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC02OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNzpTVVBFUi1VWDoqOiopCisJZWNobyBzeDctbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTg6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04UjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDhyLW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRhcndpbjoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCA7OworICAgIGkqODY6c2t5b3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKKwlleGl0IDs7CisgICAgaSo4NjpyZG9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcworCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKyAgICAgICAgICAiNCIKKyNlbHNlCisJICAiIgorI2VuZGlmCisgICAgICAgICApOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQorICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBpZiAodmVyc2lvbiA8IDQpCisgICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQorI2lmIGRlZmluZWQgKFVNQVhWKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpZiBkZWZpbmVkIChDTVUpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQorICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChzZXF1ZW50KQorI2lmIGRlZmluZWQgKGkzODYpCisgIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjaWYgZGVmaW5lZCAobnMzMjAwMCkKKyAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKKworICAgIHVuYW1lKCZ1bik7CisKKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7CisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAodmF4KQorIyBpZiAhZGVmaW5lZCAodWx0cml4KQorIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICBpZiBkZWZpbmVkIChCU0QpCisjICAgaWYgQlNEID09IDQzCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOworIyAgIGVsc2UKKyMgICAgaWYgQlNEID09IDE5OTAwNgorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7CisjICAgIGVsc2UKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCisgIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisgIGV4aXQgKDEpOworfQorRU9GCisKKyRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisKKyMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KKwordGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0OyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzIqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgYzM0KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjNCopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGVzYWMKK2ZpCisKK2NhdCA+JjIgPDxFT0YKKyQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKKworVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKK2Rvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQorCisgIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLmd1ZXNzCithbmQKKyAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuc3ViCisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZmVjL2NvbmZpZy5oLmluIGIvZmVjL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYTVjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxOSBAQAorLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRvcHRfbG9uZyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRPUFRfTE9ORworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxnZXRvcHQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfR0VUT1BUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGlvLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURElPX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYyBsaWJyYXJ5ICgtbGMpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQkMKZGlmZiAtLWdpdCBhL2ZlYy9jb25maWcuc3ViIGIvZmVjL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTA2YTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTM2MiBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwMS0wNC0yMCcKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJdGFob2UgfCBpODYwIHwgaWE2NCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIFwKKwkgICAgICAgIHwgYXJtIHwgYXJtZVtsYl0gfCBhcm1bYmxdZSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgc3Ryb25nYXJtIHwgeHNjYWxlIFwKKwkJfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgfCB0cm9uIHwgYTI5ayBcCisJCXwgNTgwIHwgaTk2MCB8IGg4MzAwIFwKKwkJfCB4ODYgfCBwcGNiZSB8IG1pcHNiZSB8IG1pcHNsZSB8IHNoYmUgfCBzaGxlIFwKKwkJfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgfCBocHBhMi4wIHwgaHBwYTIuMHcgfCBocHBhMi4wbiBcCisJCXwgaHBwYTY0IFwKKwkJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhcGNhNVs2N10gXAorCQl8IGFscGhhZXY2Wzc4XSBcCisJCXwgd2UzMmsgfCBuczE2ayB8IGNsaXBwZXIgfCBpMzcwIHwgc2ggfCBzaFszNF0gXAorCQl8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAorCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDEwIHwgcGRwMTEgXAorCQl8IG1pcHMxNiB8IG1pcHM2NCB8IG1pcHNlbCB8IG1pcHM2NGVsIFwKKwkJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIHwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCQl8IG1pcHM2NHZyNTAwMCB8IG1pcHJzNjR2cjUwMDBlbCB8IG1jb3JlIHwgczM5MCB8IHMzOTB4IFwKKwkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCisJCXwgdjg1MCB8IGM0eCBcCisJCXwgdGh1bWIgfCBkMTB2IHwgZDMwdiB8IGZyMzAgfCBhdnIgfCBvcGVucmlzYyB8IHRpYzgwIFwKKwkJfCBwaiB8IHBqbCB8IGg4NTAwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHo4ayB8IHY3MCB8IHc2NSkKKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCSMgRklYTUU6IGNsZWFuIHVwIHRoZSBmb3JtYXR0aW5nIGhlcmUuCisJdmF4LSogfCB0YWhvZS0qIHwgaSo4Ni0qIHwgaTg2MC0qIHwgaWE2NC0qIHwgbTMyci0qIHwgbTY4ay0qIHwgbTY4MDAwLSogXAorCSAgICAgIHwgbTg4ay0qIHwgc3BhcmMtKiB8IG5zMzJrLSogfCBmeDgwLSogfCBhcmMtKiB8IGNbMTIzXSogXAorCSAgICAgIHwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm12Ki0qIHwgc3Ryb25nYXJtLSogfCB4c2NhbGUtKiBcCisJICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiBcCisJICAgICAgfCBwb3dlci0qIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGg4NTAwLSogfCBpOTYwLSogXAorCSAgICAgIHwgeG1wLSogfCB5bXAtKiBcCisJICAgICAgfCB4ODYtKiB8IHBwY2JlLSogfCBtaXBzYmUtKiB8IG1pcHNsZS0qIHwgc2hiZS0qIHwgc2hsZS0qIFwKKwkgICAgICB8IGhwcGEtKiB8IGhwcGExLjAtKiB8IGhwcGExLjEtKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjB3LSogXAorCSAgICAgIHwgaHBwYTIuMG4tKiB8IGhwcGE2NC0qIFwKKwkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFwY2E1WzY3XS0qIFwKKwkgICAgICB8IGFscGhhZXY2Wzc4XS0qIFwKKwkgICAgICB8IHdlMzJrLSogfCBjeWRyYS0qIHwgbnMxNmstKiB8IHBuLSogfCBucDEtKiB8IHhwczEwMC0qIFwKKwkgICAgICB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAorCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHNoLSogfCBwb3dlcnBjLSogfCBwb3dlcnBjbGUtKiBcCisJICAgICAgfCBzcGFyYzY0LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmM4NngtKiBcCisJICAgICAgfCBtaXBzMTYtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAorCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAorCSAgICAgIHwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIHwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogfCBtY29yZS0qIFwKKwkgICAgICB8IGYzMFswMV0tKiB8IGY3MDAtKiB8IHMzOTAtKiB8IHMzOTB4LSogfCBzdjEtKiB8IHQzZS0qIFwKKwkgICAgICB8IFtjanRdOTAtKiBcCisJICAgICAgfCBtODgxMTAtKiB8IG02ODBbMDEyMzRdMC0qIHwgbTY4Mz8yLSogfCBtNjgzNjAtKiB8IHo4ay0qIHwgZDEwdi0qIFwKKwkgICAgICB8IHRodW1iLSogfCB2ODUwLSogfCBkMzB2LSogfCB0aWMzMC0qIHwgdGljODAtKiB8IGMzMC0qIHwgZnIzMC0qIFwKKwkgICAgICB8IGJzMjAwMC0qIHwgdGljNTR4LSogfCBjNTR4LSogfCB4ODZfNjQtKiB8IHBqLSogfCBwamwtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5MikKKwkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlbY2p0XTkwKQorCQliYXNpY19tYWNoaW5lPSR7YmFzaWNfbWFjaGluZX0tY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzZWwqLWxpbnV4KikKKwkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwcyotbGludXgqKQorCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW1peCopCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKyAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJICAgICAgICA7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc3BhcmNsaXRlLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9dDNlLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpYzU0eCB8IGM1NHgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKyAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisgICAgICAgICAgICAgICA7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeG1wKQorCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKyAgICAgICAgeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJbWlwcykKKwkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgorCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KKwkJZWxzZQorCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJZmkKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoMyB8IHNoNCkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc3BhcmMgfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisgICAgICAgIGN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJYzR4KikKKwkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQorCQlvcz0tY29mZgorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCisJICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIHwgLW9zMiopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8qKQorCQlvcz0tbnRvLXFueAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbnMyICkKKwkgICAgICAgIG9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisgICAgICAgIC0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJICAgICAgICBvcz0tbWludAorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisgICAgICAgIHBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKKwkJIyBkZWZhdWx0LgorCQkjIG9zPS1zdW5vczQKKwkJOzsKKwltNjgqLWNpc2NvKQorCQlvcz0tYW91dAorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworICAgICAgICAqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworICAgICAgICAqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisgICAgICAgICotc2dpKQorCQlvcz0taXJpeAorCQk7OworICAgICAgICAqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZmVjL2NvbmZpZ3VyZSBiL2ZlYy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDcwMTVkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9jb25maWd1cmUKQEAgLTAsMCArMSw0MzU3IEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworZWxpZiB0ZXN0IC1uICIke0JBU0hfVkVSU0lPTitzZXR9IiAmJiAoc2V0IC1vIHBvc2l4KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2V0IC1vIHBvc2l4CitmaQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKKworCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KKyRhc191bnNldCBFTlYgTUFJTCBNQUlMUEFUSAorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitmb3IgYXNfdmFyIGluIFwKKyAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKKyAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKKyAgTENfVEVMRVBIT05FIExDX1RJTUUKK2RvCisgIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCisgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgJGFzX3ZhcgorICBmaQorZG9uZQorCisjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisKKworIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICB8fCB7CisgICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIHBhdGggYXQgYWxsCisgICMgcmVsYXRpdmUgb3Igbm90LgorICBjYXNlICQwIGluCisgICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKK2RvbmUKKworICAgICAgIDs7CisgIGVzYWMKKyAgIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworICAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICAgIGFzX215c2VsZj0kMAorICBmaQorICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKKyAgY2FzZSAkQ09ORklHX1NIRUxMIGluCisgICcnKQorICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSBjYXNlICRhc19kaXIgaW4KKwkgLyopCisJICAgaWYgKCIkYXNfZGlyLyRhc19iYXNlIiAtYyAnCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgJykgMj4vZGV2L251bGw7IHRoZW4KKwkgICAgICRhc191bnNldCBCQVNIX0VOViB8fCB0ZXN0ICIke0JBU0hfRU5WK3NldH0iICE9IHNldCB8fCB7IEJBU0hfRU5WPTsgZXhwb3J0IEJBU0hfRU5WOyB9CisJICAgICAkYXNfdW5zZXQgRU5WIHx8IHRlc3QgIiR7RU5WK3NldH0iICE9IHNldCB8fCB7IEVOVj07IGV4cG9ydCBFTlY7IH0KKwkgICAgIENPTkZJR19TSEVMTD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisJICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiICR7MSsiJEAifQorCSAgIGZpOzsKKwkgZXNhYworICAgICAgIGRvbmUKK2RvbmUKKzs7CisgIGVzYWMKKworICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCisgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKyAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAorICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQorICAjIHdpdGggdGhlIG51bWJlcmVkIGxpbmUsIGFuZCBhcHBlbmRzIHRyYWlsaW5nICctJyBkdXJpbmcKKyAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCisgICMgc2Vjb25kICdzZWQnIHNjcmlwdC4gIEJsYW1lIExlZSBFLiBNY01haG9uIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkICc9JyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIE4KKyAgICAgIHMsJCwtLAorICAgICAgOiBsb29wCisgICAgICBzLF5cKFsnJGFzX2NyX2RpZ2l0cyddKlwpXCguKlwpWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX11cKSxcMVwyXDFcMywKKyAgICAgIHQgbG9vcAorICAgICAgcywtJCwsCisgICAgICBzLF5bJyRhc19jcl9kaWdpdHMnXSpcbiwsCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAkYXNfbWUubGluZW5vIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgorICAuIC4vJGFzX21lLmxpbmVubworICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCisgICpjKiwtbiopIEVDSE9fTj0gRUNIT19DPScKKycgRUNIT19UPScJJyA7OworICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSBFQ0hPX1Q9IDs7CisgICopICAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgRUNIT19UPSA7OworZXNhYworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgIyBXZSBjb3VsZCBqdXN0IGNoZWNrIGZvciBESkdQUDsgYnV0IHRoaXMgdGVzdCBhKSB3b3JrcyBiKSBpcyBtb3JlIGdlbmVyaWMKKyAgIyBhbmQgYykgd2lsbCByZW1haW4gdmFsaWQgb25jZSBESkdQUCBzdXBwb3J0cyBzeW1saW5rcyAoREpHUFAgMi4wNCkuCisgIGlmIHRlc3QgLWYgY29uZiQkLmV4ZTsgdGhlbgorICAgICMgRG9uJ3QgdXNlIGxuIGF0IGFsbDsgd2UgZG9uJ3QgaGF2ZSBhbnkgbGlua3MKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxzZQorICAgIGFzX2xuX3M9J2xuIC1zJworICBmaQorZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbG5fcz1sbgorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCithc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KK2FzX25sPScKKycKK0lGUz0iIAkkYXNfbmwiCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSAorCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCitleGVjIDY+JjEKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCithY19jb25maWdfbGlib2JqX2Rpcj0uCitjcm9zc19jb21waWxpbmc9bm8KK3N1YmRpcnM9CitNRkxBR1M9CitNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCisjIFRoaXMgdmFyaWFibGUgc2VlbXMgb2Jzb2xldGUuICBJdCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCwgYW5kCisjIG9ubHkgYWNfbWF4X3NlZF9saW5lcyBzaG91bGQgYmUgdXNlZC4KKzogJHthY19tYXhfaGVyZV9saW5lcz0zOH0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9CitQQUNLQUdFX1RBUk5BTUU9CitQQUNLQUdFX1ZFUlNJT049CitQQUNLQUdFX1NUUklORz0KK1BBQ0tBR0VfQlVHUkVQT1JUPQorCithY191bmlxdWVfZmlsZT0idml0ZXJiaTI3LmMiCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR19ICisjIGlmICFTVERDX0hFQURFUlMgJiYgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURElOVF9ICisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgU09fTkFNRSBWRVJTSU9OIENDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIGFjX2N0X0NDIEVYRUVYVCBPQkpFWFQgQ1BQIEVHUkVQIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIHRhcmdldCB0YXJnZXRfY3B1IHRhcmdldF92ZW5kb3IgdGFyZ2V0X29zIFNIX0xJQiBSRUJJTkQgTUxJQlMgQVJDSF9PUFRJT04gTElCT0JKUyBMVExJQk9CSlMnCithY19zdWJzdF9maWxlcz0nJworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgYWNfb3B0YXJnPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFtePV0qPVwoLipcKSdgCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19vcHRpb24gaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAkYWNfb3B0aW9uIGluCisgICAgICAqPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgZXZhbCAiJGFjX2VudnZhcj0nJGFjX29wdGFyZyciCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBleGVjX3ByZWZpeCBwcmVmaXgKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogfCBOT05FIHwgJycgKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgXAorCSAgICAgIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiQwIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkYWNfY29uZmRpciBvciAuLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKyhjZCAkc3JjZGlyICYmIHRlc3QgLXIgLi8kYWNfdW5pcXVlX2ZpbGUpIDI+L2Rldi9udWxsIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19lbnZfQ0NfdmFsdWU9JENDCithY19jdl9lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQorYWNfY3ZfZW52X0NDX3ZhbHVlPSRDQworYWNfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQorYWNfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCithY19jdl9lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2N2X2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUworYWNfZW52X0NQUF9zZXQ9JHtDUFArc2V0fQorYWNfZW52X0NQUF92YWx1ZT0kQ1BQCithY19jdl9lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19jdl9lbnZfQ1BQX3ZhbHVlPSRDUFAKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworX0FDRU9GCisKKyAgY2F0IDw8X0FDRU9GCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorCQkJICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgY29uZmlndXJlIGZvciBidWlsZGluZyBjb21waWxlcnMgZm9yIFRBUkdFVCBbSE9TVF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKworICBjYXQgPDxcX0FDRU9GCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAkYWNfZGlyIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKyAgICBjZCAkYWNfZGlyCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlLmdudSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmFjIHx8CisJICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdCAwCitmaQorZXhlYyA1PmNvbmZpZy5sb2cKK2NhdCA+JjUgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGVjaG8gIlBBVEg6ICRhc19kaXIiCitkb25lCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX3NlcD0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhY19jb25maWd1cmVfYXJnczA9IiRhY19jb25maWd1cmVfYXJnczAgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhY19jb25maWd1cmVfYXJnczE9IiRhY19jb25maWd1cmVfYXJnczEgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MkYWNfc2VwJyRhY19hcmcnIgorICAgICAgIyBHZXQgcmlkIG9mIHRoZSBsZWFkaW5nIHNwYWNlLgorICAgICAgYWNfc2VwPSIgIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczAgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczArc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MwPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMDsgfQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMSB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMStzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczE9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MxOyB9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogQmUgc3VyZSBub3QgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4gdGhlcmUsIGFzIHNvbWUgc2hlbGxzLAorIyBzdWNoIGFzIG91ciBEVSA1LjAgZnJpZW5kLCB3aWxsIHRoZW4gYGNsb3NlJyB0aGUgdHJhcC4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nIiciJyAnIiciJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgc2VkIC1uIFwKKwkicy8nIiciJy8nIiciJ1xcXFwnIiciJyciJyInL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgICAgICBlY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IGZpbGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKwllY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIHNlZCAiL14kL2QiIGNvbmZkZWZzLmggfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICB9ID4mNQorICBybSAtZiBjb3JlICouY29yZSAmJgorICBybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID5jb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuIC4vJGNhY2hlX2ZpbGU7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwKKwkgICAgICAgc2VkIC1uICdzL15hY19lbnZfXChbYS16QS1aXzAtOV0qXClfc2V0PS4qL1wxL3AnYDsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPSJcJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGV2YWwgYWNfbmV3X3ZhbD0iXCRhY19lbnZfJHthY192YXJ9X3ZhbHVlIgorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQorCWFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgICAgYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworU09fTkFNRT0zCitWRVJTSU9OPTMuMC4wCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgQ0M9JGFjX2N0X0NDCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IiBcCisgICAgICJjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisjIG9mIGV4ZWV4dC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2CithY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rX2RlZmF1bHRcIiIpID4mNQorICAoZXZhbCAkYWNfbGlua19kZWZhdWx0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgRmluZCB0aGUgb3V0cHV0LCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4gIFRoaXMgc2NoZW1lIGlzCisjIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKSBvbmx5IGFzIGEgbGFzdAorIyByZXNvcnQuCisKKyMgQmUgY2FyZWZ1bCB0byBpbml0aWFsaXplIHRoaXMgdmFyaWFibGUsIHNpbmNlIGl0IHVzZWQgdG8gYmUgY2FjaGVkLgorIyBPdGhlcndpc2UgYW4gb2xkIGNhY2hlIHZhbHVlIG9mIGBubycgbGVkIHRvIGBFWEVFWFQgPSBubycgaW4gYSBNYWtlZmlsZS4KK2FjX2N2X2V4ZWV4dD0KKyMgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KK2ZvciBhY19maWxlIGluIGFfb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBjb25mdGVzdC4kYWNfZXh0ICkKKwkjIFRoaXMgaXMgdGhlIHNvdXJjZSBmaWxlLgorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJIyBGSVhNRTogSSBiZWxpZXZlIHdlIGV4cG9ydCBhY19jdl9leGVleHQgZm9yIExpYnRvb2wsCisJIyBidXQgaXQgd291bGQgYmUgY29vbCB0byBmaW5kIG91dCBpZiBpdCdzIHRydWUuICBEb2VzIGFueWJvZHkKKwkjIG1haW50YWluIExpYnRvb2w/IC0tYWtpbS4KKwlleHBvcnQgYWNfY3ZfZXhlZXh0CisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorZmkKKworYWNfZXhlZXh0PSRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjYKKworIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2CisjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCisjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBmaQorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorCitybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisjIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGV4cG9ydCBhY19jdl9leGVleHQKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2V4ZWV4dCIgPiY2CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBmb3IgYWNfZmlsZSBpbiBgKGxzIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqOyBscyBjb25mdGVzdC4qKSAyPi9kZXYvbnVsbGA7IGRvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29iamV4dCIgPiY2CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNgorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSRDQworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkMSBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQxLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3N0ZGM9JGFjX2FyZworYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Citkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19zdGRjIiBpbgorICB4fHhubykKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2IDs7CisgICopCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjYKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX3N0ZGMiIDs7Citlc2FjCisKKyMgU29tZSBwZW9wbGUgdXNlIGEgQysrIGNvbXBpbGVyIHRvIGNvbXBpbGUgQy4gIFNpbmNlIHdlIHVzZSBgZXhpdCcsCisjIGluIEMrKyB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQuICBJbiBjYXNlIHNvbWVvbmUgdXNlcyB0aGUgc2FtZSBjb21waWxlcgorIyBmb3IgYm90aCBjb21waWxpbmcgQyBhbmQgQysrIHdlIG5lZWQgdG8gaGF2ZSB0aGUgQysrIGNvbXBpbGVyIGRlY2lkZQorIyB0aGUgZGVjbGFyYXRpb24gb2YgZXhpdCwgc2luY2UgaXQncyB0aGUgbW9zdCBkZW1hbmRpbmcgZW52aXJvbm1lbnQuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgY2hva2UgbWUKKyNlbmRpZgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGZvciBhY19kZWNsYXJhdGlvbiBpbiBcCisgICAnJyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KSB0aHJvdyAoKTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KSB0aHJvdyAoKTsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsnIFwKKyAgICd2b2lkIGV4aXQgKGludCk7JworZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0IC1uICIkYWNfZGVjbGFyYXRpb24iOyB0aGVuCisgIGVjaG8gJyNpZmRlZiBfX2NwbHVzcGx1cycgPj5jb25mZGVmcy5oCisgIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCisgIGVjaG8gJyNlbmRpZicgICAgICAgICAgICAgPj5jb25mZGVmcy5oCitmaQorCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2lmIHRlc3QgJEdDQyAhPSAieWVzIgordGhlbgorCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IE5lZWQgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogTmVlZCBHTlUgQyBjb21waWxlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1hbGxvYyBpbiAtbGMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbWFsbG9jIGluIC1sYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2NfbWFsbG9jK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sYyAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBtYWxsb2MgKCk7CitpbnQKK21haW4gKCkKK3sKK21hbGxvYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfY19tYWxsb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9jX21hbGxvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jX21hbGxvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2NfbWFsbG9jIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9jX21hbGxvYyA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCQyAxCitfQUNFT0YKKworICBMSUJTPSItbGMgJExJQlMiCisKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjYKK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIDoKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19lZ3JlcCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAoZ3JlcCAtRSAnKGF8YiknKSA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuIGFjX2N2X3Byb2dfZWdyZXA9J2dyZXAgLUUnCisgICAgZWxzZSBhY19jdl9wcm9nX2VncmVwPSdlZ3JlcCcKKyAgICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2VncmVwIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2VncmVwIiA+JjYKKyBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICBleGl0KDIpOworICBleGl0ICgwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK19BQ0VPRgorCitmaQorCisjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgorCisKKworCisKKworCisKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gZ2V0b3B0Lmggc3RkaW8uaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmcuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY193ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIHRoZSBBQ19QQUNLQUdFX05BTUUgbGlzdHMuICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2lmIHRlc3QgLXogIiRIQVZFX3N0ZGlvLmgiCit0aGVuCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogTmVlZCBzdGRpby5oISIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBOZWVkIHN0ZGlvLmghIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJEhBVkVfc3RkbGliLmgiCit0aGVuCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogTmVlZCBzdGRsaWIuaCEiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogTmVlZCBzdGRsaWIuaCEiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIkSEFWRV9zdGRsaWIuaCIKK3RoZW4KKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBOZWVkIG1lbW9yeS5oISIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBOZWVkIG1lbW9yeS5oISIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiRIQVZFX3N0cmluZy5oIgordGhlbgorCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IE5lZWQgc3RyaW5nLmgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogTmVlZCBzdHJpbmcuaCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9zaHRvb2w7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICBhY19jdl9idWlsZF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2AKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjYKK2J1aWxkPSRhY19jdl9idWlsZAorYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9ob3N0X2FsaWFzIiAmJgorICBhY19jdl9ob3N0X2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcworYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKK2hvc3Q9JGFjX2N2X2hvc3QKK2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3RhcmdldCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldF9hbGlhcwordGVzdCAieCRhY19jdl90YXJnZXRfYWxpYXMiID0gIngiICYmCisgIGFjX2N2X3RhcmdldF9hbGlhcz0kYWNfY3ZfaG9zdF9hbGlhcworYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYCB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3RhcmdldCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdGFyZ2V0IiA+JjYKK3RhcmdldD0kYWNfY3ZfdGFyZ2V0Cit0YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkYWNfY3ZfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkYWNfY3ZfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCit0ZXN0IC1uICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorY2FzZSAkdGFyZ2V0X2NwdSBpbgoraTM4NnxpNDg2fGk1ODZ8aTY4NikKKwlBUkNIX09QVElPTj0iLW1hcmNoPSR0YXJnZXRfY3B1IgorCU1MSUJTPSJ2aXRlcmJpMjdfbW14Lm8gbW14YmZseTI3Lm8gdml0ZXJiaTI3X3NzZS5vIHNzZWJmbHkyNy5vIHZpdGVyYmkyN19zc2UyLm8gc3NlMmJmbHkyNy5vIFwKKwl2aXRlcmJpMjlfbW14Lm8gbW14YmZseTI5Lm8gdml0ZXJiaTI5X3NzZS5vIHNzZWJmbHkyOS5vIHZpdGVyYmkyOV9zc2UyLm8gc3NlMmJmbHkyOS5vIFwKKwl2aXRlcmJpMzlfc3NlMi5vIHZpdGVyYmkzOV9zc2UubyB2aXRlcmJpMzlfbW14Lm8gXAorCXZpdGVyYmk2MTVfbW14Lm8gdml0ZXJiaTYxNV9zc2UubyB2aXRlcmJpNjE1X3NzZTIubyBcCisJZG90cHJvZF9tbXgubyBkb3Rwcm9kX21teF9hc3Npc3QubyBcCisJZG90cHJvZF9zc2UyLm8gZG90cHJvZF9zc2UyX2Fzc2lzdC5vIFwKKwlwZWFrdmFsX21teC5vIHBlYWt2YWxfbW14X2Fzc2lzdC5vIFwKKwlwZWFrdmFsX3NzZS5vIHBlYWt2YWxfc3NlX2Fzc2lzdC5vIFwKKwlwZWFrdmFsX3NzZTIubyBwZWFrdmFsX3NzZTJfYXNzaXN0Lm8gXAorCXN1bXNxLm8gc3Vtc3FfcG9ydC5vIFwKKwlzdW1zcV9zc2UyLm8gc3Vtc3Ffc3NlMl9hc3Npc3QubyBcCisJc3Vtc3FfbW14Lm8gc3Vtc3FfbW14X2Fzc2lzdC5vIFwKKwljcHVfZmVhdHVyZXMubyBjcHVfbW9kZV94ODYubyIKKwk7OworcG93ZXJwYyopCisJQVJDSF9PUFRJT049Ii1mbm8tY29tbW9uIC1mYWx0aXZlYyIKKwlNTElCUz0idml0ZXJiaTI3X2F2Lm8gdml0ZXJiaTI5X2F2Lm8gdml0ZXJiaTM5X2F2Lm8gdml0ZXJiaTYxNV9hdi5vIFwKKwllbmNvZGVfcnNfYXYubyBcCisJZG90cHJvZF9hdi5vIHN1bXNxX2F2Lm8gcGVha3ZhbF9hdi5vIGNwdV9tb2RlX3BwYy5vIgorCTs7CisqKQorCU1MSUJTPQorZXNhYworY2FzZSAkdGFyZ2V0X29zIGluCitkYXJ3aW4qKQorCVNIX0xJQj1saWJmZWMuZHlsaWIKKwlSRUJJTkQ9IiIKKwk7OworKikKKwlTSF9MSUI9bGliZmVjLnNvCisJUkVCSU5EPWxkY29uZmlnCisJOzsKK2VzYWMKKworCisKKworCisKKworCisKK2ZvciBhY19mdW5jIGluIGdldG9wdF9sb25nIG1lbXNldCBtZW1tb3ZlCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSAkYWNfZnVuYzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCisgICAgICAgICAgYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIG1ha2VmaWxlIgorY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KK3sKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9IHwKKyAgc2VkICcKKyAgICAgdCBjbGVhcgorICAgICA6IGNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgL15hY19jdl9lbnYvIXMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6IGVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgJGNhY2hlX2ZpbGUgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovOworcy86Klwke3NyY2Rpcn06Ki86LzsKK3MvOipAc3JjZGlyQDoqLzovOworcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvOworcy86KiQvLzsKK3MvXltePV0qPVsJIF0qJC8vOworfScKK2ZpCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19pPWBlY2hvICIkYWNfaSIgfAorCSBzZWQgJ3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLydgCisgICMgMi4gQWRkIHRoZW0uCisgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzICRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyAkYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9CitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworZXhlYyA2PiYxCisKKyMgT3BlbiB0aGUgbG9nIHJlYWwgc29vbiwgdG8ga2VlcCBcJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuICBMb2dnaW5nIC0tdmVyc2lvbiBldGMuIGlzIE9LLgorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCit9ID4mNQorY2F0ID4mNSA8PF9DU0VPRgorCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitfQ1NFT0YKK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1CitlY2hvID4mNQorX0FDRU9GCisKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2lmIHRlc3QgLW4gIiRhY19jb25maWdfZmlsZXMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19maWxlcz1cIiRhY19jb25maWdfZmlsZXNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgorICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgorICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LAorICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorc3JjZGlyPSRzcmNkaXIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0qKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfb3B0aW9uPSQxCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKKyAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIGV4ZWMgJFNIRUxMICQwICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCitmaQorCitfQUNFT0YKKworCisKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAiJGFjX2NvbmZpZ190YXJnZXQiIGluCisgICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorICAibWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1ha2VmaWxlIiA7OworICAiY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mc3RhdCQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQorfSB8fAoreworICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorfQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgorICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOworICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKK3MsQFNIRUxMQCwkU0hFTEwsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAorcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAorcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0CitzLEBwcmVmaXhALCRwcmVmaXgsO3QgdAorcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAorcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKK3MsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKK3MsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKK3MsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKK3MsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAorcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAorcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKK3MsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKK3MsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKK3MsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKK3MsQG1hbmRpckAsJG1hbmRpciw7dCB0CitzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKK3MsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKK3MsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0CitzLEBERUZTQCwkREVGUyw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBMSUJTQCwkTElCUyw7dCB0CitzLEBTT19OQU1FQCwkU09fTkFNRSw7dCB0CitzLEBWRVJTSU9OQCwkVkVSU0lPTiw7dCB0CitzLEBDQ0AsJENDLDt0IHQKK3MsQENGTEFHU0AsJENGTEFHUyw7dCB0CitzLEBMREZMQUdTQCwkTERGTEFHUyw7dCB0CitzLEBDUFBGTEFHU0AsJENQUEZMQUdTLDt0IHQKK3MsQGFjX2N0X0NDQCwkYWNfY3RfQ0MsO3QgdAorcyxARVhFRVhUQCwkRVhFRVhULDt0IHQKK3MsQE9CSkVYVEAsJE9CSkVYVCw7dCB0CitzLEBDUFBALCRDUFAsO3QgdAorcyxARUdSRVBALCRFR1JFUCw7dCB0CitzLEBidWlsZEAsJGJ1aWxkLDt0IHQKK3MsQGJ1aWxkX2NwdUAsJGJ1aWxkX2NwdSw7dCB0CitzLEBidWlsZF92ZW5kb3JALCRidWlsZF92ZW5kb3IsO3QgdAorcyxAYnVpbGRfb3NALCRidWlsZF9vcyw7dCB0CitzLEBob3N0QCwkaG9zdCw7dCB0CitzLEBob3N0X2NwdUAsJGhvc3RfY3B1LDt0IHQKK3MsQGhvc3RfdmVuZG9yQCwkaG9zdF92ZW5kb3IsO3QgdAorcyxAaG9zdF9vc0AsJGhvc3Rfb3MsO3QgdAorcyxAdGFyZ2V0QCwkdGFyZ2V0LDt0IHQKK3MsQHRhcmdldF9jcHVALCR0YXJnZXRfY3B1LDt0IHQKK3MsQHRhcmdldF92ZW5kb3JALCR0YXJnZXRfdmVuZG9yLDt0IHQKK3MsQHRhcmdldF9vc0AsJHRhcmdldF9vcyw7dCB0CitzLEBTSF9MSUJALCRTSF9MSUIsO3QgdAorcyxAUkVCSU5EQCwkUkVCSU5ELDt0IHQKK3MsQE1MSUJTQCwkTUxJQlMsO3QgdAorcyxAQVJDSF9PUFRJT05ALCRBUkNIX09QVElPTiw7dCB0CitzLEBMSUJPQkpTQCwkTElCT0JKUyw7dCB0CitzLEBMVExJQk9CSlNALCRMVExJQk9CSlMsO3QgdAorQ0VPRgorCitfQUNFT0YKKworICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCisgIGFjX21heF9zZWRfbGluZXM9NDgKKyAgYWNfc2VkX2ZyYWc9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCisgIGFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19lbmQ9JGFjX21heF9zZWRfbGluZXMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19tb3JlX2xpbmVzPToKKyAgYWNfc2VkX2NtZHM9CisgIHdoaWxlICRhY19tb3JlX2xpbmVzOyBkbworICAgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZWxzZQorICAgICAgc2VkICIke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGZpCisgICAgaWYgdGVzdCAhIC1zICR0bXAvc3Vicy5mcmFnOyB0aGVuCisgICAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgZWxzZQorICAgICAgIyBUaGUgcHVycG9zZSBvZiB0aGUgbGFiZWwgYW5kIG9mIHRoZSBicmFuY2hpbmcgY29uZGl0aW9uIGlzIHRvCisgICAgICAjIHNwZWVkIHVwIHRoZSBzZWQgcHJvY2Vzc2luZyAoaWYgdGhlcmUgYXJlIG5vIGBAJyBhdCBhbGwsIHRoZXJlCisgICAgICAjIGlzIG5vIG5lZWQgdG8gYnJvd3NlIGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucykuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgdHdvIGV4dHJhIHNlZCBjb21tYW5kcyBtZW50aW9uZWQgYWJvdmUuCisgICAgICAoZWNobyAnOnQKKyAgL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYicgJiYgY2F0ICR0bXAvc3Vicy5mcmFnKSA+JHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQKKyAgICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKwlhY19zZWRfY21kcz0ic2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZWxzZQorCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorCWNhdCA+JHRtcC9zdGRpbgorCWFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCisgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICBhY19idWlsZGRpcj0uCisKK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCitlbHNlCisgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KK2ZpCisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgIGVsc2UKKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCisgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKK2VzYWMKKworIyBEbyBub3QgdXNlIGBjZCBmb28gJiYgcHdkYCB0byBjb21wdXRlIGFic29sdXRlIHBhdGhzLCBiZWNhdXNlCisjIHRoZSBkaXJlY3RvcmllcyBtYXkgbm90IGV4aXN0LgorY2FzZSBgcHdkYCBpbgorLikgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisqKQorICBjYXNlICIkYWNfZGlyIiBpbgorICAuKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGA7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworICAqKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGAvIiRhY19kaXIiOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisqKQorICBjYXNlICR7YWNfdG9wX2J1aWxkZGlyfS4gaW4KKyAgLikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworICAqKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXIvJHthY190b3BfYnVpbGRkaXJ9Ljs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfc3JjZGlyIGluCisgIC4pIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY19zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfdG9wX3NyY2RpciBpbgorICAuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisgICopIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3RvcF9zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKKworCisKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgcm0gLWYgIiRhY19maWxlIgorICBmaQorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGNvbmZpZ3VyZV9pbnB1dD0KKyAgZWxzZQorICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAiCisgIGZpCisgIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKKwkJCQkgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisJICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisJIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBlY2hvICIkZiI7OworICAgICAgKikgIyBSZWxhdGl2ZQorCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKwkgICAjIEJ1aWxkIHRyZWUKKwkgICBlY2hvICIkZiIKKwkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorCSAgICMgU291cmNlIHRyZWUKKwkgICBlY2hvICIkc3JjZGlyLyRmIgorCSBlbHNlCisJICAgIyAvZGV2L251bGwgdHJlZQorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgc2VkICIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAorcyxAc3JjZGlyQCwkYWNfc3JjZGlyLDt0IHQKK3MsQGFic19zcmNkaXJALCRhY19hYnNfc3JjZGlyLDt0IHQKK3MsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKK3MsQGFic190b3Bfc3JjZGlyQCwkYWNfYWJzX3RvcF9zcmNkaXIsO3QgdAorcyxAYnVpbGRkaXJALCRhY19idWlsZGRpciw7dCB0CitzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAorcyxAdG9wX2J1aWxkZGlyQCwkYWNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQGFic190b3BfYnVpbGRkaXJALCRhY19hYnNfdG9wX2J1aWxkZGlyLDt0IHQKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4kdG1wL291dAorICBybSAtZiAkdG1wL3N0ZGluCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBtdiAkdG1wL291dCAkYWNfZmlsZQorICBlbHNlCisgICAgY2F0ICR0bXAvb3V0CisgICAgcm0gLWYgJHRtcC9vdXQKKyAgZmkKKworZG9uZQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIworIyBDT05GSUdfSEVBREVSIHNlY3Rpb24uCisjCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyxeXChbCSBdKlwpI1woWwkgXSpkZWZpbmVbCSBdWwkgXSpcKScKK2FjX2RCPSdbCSBdLiokLFwxI1wyJworYWNfZEM9JyAnCithY19kRD0nLDt0JworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzLF5cKFsJIF0qXCkjXChbCSBdKlwpdW5kZWZcKFsJIF1bCSBdKlwpJworYWNfdUI9JyQsXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9Jyw7dCcKKworZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIngkYWNfZmlsZSIgPSB4OiAmJiBjb250aW51ZQorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCisJY2F0ID4kdG1wL3N0ZGluCisJYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICogKSAgIGFjX2ZpbGVfaW49JGFjX2ZpbGUuaW4gOzsKKyAgZXNhYworCisgIHRlc3QgeCIkYWNfZmlsZSIgIT0geC0gJiYgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKworICAjIEZpcnN0IGxvb2sgZm9yIHRoZSBpbnB1dCBmaWxlcyBpbiB0aGUgYnVpbGQgdHJlZSwgb3RoZXJ3aXNlIGluIHRoZQorICAjIHNyYyB0cmVlLgorICBhY19maWxlX2lucHV0cz1gSUZTPToKKyAgICBmb3IgZiBpbiAkYWNfZmlsZV9pbjsgZG8KKyAgICAgIGNhc2UgJGYgaW4KKyAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OworICAgICAgW1xcLyRdKikKKwkgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKwkgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJICMgRG8gcXVvdGUgJGYsIHRvIHByZXZlbnQgRE9TIHBhdGhzIGZyb20gYmVpbmcgSUZTJ2QuCisJIGVjaG8gIiRmIjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisJIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorCSAgICMgQnVpbGQgdHJlZQorCSAgIGVjaG8gIiRmIgorCSBlbGlmIHRlc3QgLWYgIiRzcmNkaXIvJGYiOyB0aGVuCisJICAgIyBTb3VyY2UgdHJlZQorCSAgIGVjaG8gIiRzcmNkaXIvJGYiCisJIGVsc2UKKwkgICAjIC9kZXYvbnVsbCB0cmVlCisJICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWwkgXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAorIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKKyMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCisjIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCisjIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAorIyBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKKyMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCisjIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgorIworIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKKyMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KKyMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgorY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcX0FDRU9GCitzL1tcXCYsXS9cXCYvZworcyxbXFwkYF0sXFwmLGcKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qXClcKChbXildKilcKVsJIF0qXCguKlwpJCwke2FjX2RBfVwxJHthY19kQn1cMVwyJHthY19kQ31cMyR7YWNfZER9LGdwCit0IGVuZAorcyxeWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSpcKFteCSBdW14JIF0qXClbCSBdKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0sZ3AKKzogZW5kCitfQUNFT0YKKyMgSWYgc29tZSBtYWNyb3Mgd2VyZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsIHRpbWVzCisjIHRoZSBzYW1lICNkZWZpbmVzLCB3aGljaCBpcyB1c2VsZXNzLiAgTmV2ZXJ0aGVsZXNzLCB3ZSBtYXkgbm90IHdhbnQgdG8KKyMgc29ydCB0aGVtLCBzaW5jZSB3ZSB3YW50IHRoZSAqbGFzdCogQUMtREVGSU5FIHRvIGJlIGhvbm9yZWQuCit1bmlxIGNvbmZkZWZzLmggfCBzZWQgLW4gLWYgY29uZmRlZjJzZWQuc2VkID5jb25mdGVzdC5kZWZpbmVzCitzZWQgJ3MvYWNfZC9hY191L2cnIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnVuZGVmcworcm0gLWYgY29uZmRlZjJzZWQuc2VkCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+Y29uZnRlc3QudW5kZWZzIDw8XF9BQ0VPRgorcyxeWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKlthLXpBLVpfXVthLXpBLVpfMC05XSosLyogJiAqLywKK19BQ0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKKyMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KK2VjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjZGVmaW5lIHRlbXBsYXRlcyBvbmx5IGlmIG5lY2Vzc2FyeS4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgaWYgZ3JlcCAiXlsJIF0qI1sJIF0qZGVmaW5lIiAkdG1wL2luID4vZGV2L251bGw7IHRoZW4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgIyBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgaWYvZmknID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgOicgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LmRlZmluZXMgPi9kZXYvbnVsbAorZG8KKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvICR0bXAvZGVmaW5lcy5zZWQuCisgIGVjaG8gJyAgY2F0ID4kdG1wL2RlZmluZXMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjZGVmaW5lJyBsaW5lcy4KKyAgZWNobyAnL15bCSBdKiNbCSBdKmRlZmluZS8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiAkdG1wL2RlZmluZXMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCitkb25lCitybSAtZiBjb25mdGVzdC5kZWZpbmVzCitlY2hvICcgIGZpICMgZ3JlcCcgPj4kQ09ORklHX1NUQVRVUworZWNobyA+PiRDT05GSUdfU1RBVFVTCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudW5kZWZzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI3VuZGVmIHRlbXBsYXRlcycgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LnVuZGVmcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC91bmRlZnMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC91bmRlZnMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjdW5kZWYnCisgIGVjaG8gJy9eWwkgXSojWwkgXSp1bmRlZi8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnVuZGVmcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvdW5kZWZzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudW5kZWZzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnVuZGVmcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnVuZGVmcworZG9uZQorcm0gLWYgY29uZnRlc3QudW5kZWZzCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGVjaG8gIi8qIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLyIgPiR0bXAvY29uZmlnLmgKKyAgZWxzZQorICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBmaQorICBjYXQgJHRtcC9pbiA+PiR0bXAvY29uZmlnLmgKKyAgcm0gLWYgJHRtcC9pbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgaWYgZGlmZiAkYWNfZmlsZSAkdG1wL2NvbmZpZy5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgICAgIHJtIC1mICRhY19maWxlCisgICAgICBtdiAkdG1wL2NvbmZpZy5oICRhY19maWxlCisgICAgZmkKKyAgZWxzZQorICAgIGNhdCAkdG1wL2NvbmZpZy5oCisgICAgcm0gLWYgJHRtcC9jb25maWcuaAorICBmaQorZG9uZQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCit7IChleGl0IDApOyBleGl0IDA7IH0KK19BQ0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCisgIGV4ZWMgNT4vZGV2L251bGwKKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKwpkaWZmIC0tZ2l0IGEvZmVjL2NvbmZpZ3VyZS5pbiBiL2ZlYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MTEwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw4MyBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19JTklUKHZpdGVyYmkyNy5jKQorQUNfQ09ORklHX0hFQURFUihjb25maWcuaCkKK1NPX05BTUU9MworVkVSU0lPTj0zLjAuMAorQUNfU1VCU1QoU09fTkFNRSkKK0FDX1NVQlNUKFZFUlNJT04pCisKK2RubCBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DQworaWYgdGVzdCAkR0NDICE9ICJ5ZXMiCit0aGVuCisJQUNfTVNHX0VSUk9SKFtOZWVkIEdOVSBDIGNvbXBpbGVyXSkKK2ZpCitkbmwgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCitBQ19DSEVDS19MSUIoYywgbWFsbG9jKQorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19DSEVDS19IRUFERVJTKGdldG9wdC5oIHN0ZGlvLmggc3RkbGliLmggbWVtb3J5Lmggc3RyaW5nLmgpCitpZiB0ZXN0IC16ICIkSEFWRV9zdGRpby5oIgordGhlbgorCUFDX01TR19FUlJPUihbTmVlZCBzdGRpby5oIV0pCitmaQoraWYgdGVzdCAteiAiJEhBVkVfc3RkbGliLmgiCit0aGVuCisJQUNfTVNHX0VSUk9SKFtOZWVkIHN0ZGxpYi5oIV0pCitmaQoraWYgdGVzdCAteiAiJEhBVkVfc3RkbGliLmgiCit0aGVuCisJQUNfTVNHX0VSUk9SKFtOZWVkIG1lbW9yeS5oIV0pCitmaQoraWYgdGVzdCAteiAiJEhBVkVfc3RyaW5nLmgiCit0aGVuCisJQUNfTVNHX0VSUk9SKFtOZWVkIHN0cmluZy5oXSkKK2ZpCisKK0FDX0NBTk9OSUNBTF9TWVNURU0KK2Nhc2UgJHRhcmdldF9jcHUgaW4KK2kzODZ8aTQ4NnxpNTg2fGk2ODYpCisJQVJDSF9PUFRJT049Ii1tYXJjaD0kdGFyZ2V0X2NwdSIKKwlNTElCUz0idml0ZXJiaTI3X21teC5vIG1teGJmbHkyNy5vIHZpdGVyYmkyN19zc2UubyBzc2ViZmx5MjcubyB2aXRlcmJpMjdfc3NlMi5vIHNzZTJiZmx5MjcubyBcCisJdml0ZXJiaTI5X21teC5vIG1teGJmbHkyOS5vIHZpdGVyYmkyOV9zc2UubyBzc2ViZmx5MjkubyB2aXRlcmJpMjlfc3NlMi5vIHNzZTJiZmx5MjkubyBcCisJdml0ZXJiaTM5X3NzZTIubyB2aXRlcmJpMzlfc3NlLm8gdml0ZXJiaTM5X21teC5vIFwKKwl2aXRlcmJpNjE1X21teC5vIHZpdGVyYmk2MTVfc3NlLm8gdml0ZXJiaTYxNV9zc2UyLm8gXAorCWRvdHByb2RfbW14Lm8gZG90cHJvZF9tbXhfYXNzaXN0Lm8gXAorCWRvdHByb2Rfc3NlMi5vIGRvdHByb2Rfc3NlMl9hc3Npc3QubyBcCisJcGVha3ZhbF9tbXgubyBwZWFrdmFsX21teF9hc3Npc3QubyBcCisJcGVha3ZhbF9zc2UubyBwZWFrdmFsX3NzZV9hc3Npc3QubyBcCisJcGVha3ZhbF9zc2UyLm8gcGVha3ZhbF9zc2UyX2Fzc2lzdC5vIFwKKwlzdW1zcS5vIHN1bXNxX3BvcnQubyBcCisJc3Vtc3Ffc3NlMi5vIHN1bXNxX3NzZTJfYXNzaXN0Lm8gXAorCXN1bXNxX21teC5vIHN1bXNxX21teF9hc3Npc3QubyBcCisJY3B1X2ZlYXR1cmVzLm8gY3B1X21vZGVfeDg2Lm8iCisJOzsKK3Bvd2VycGMqKQorCUFSQ0hfT1BUSU9OPSItZm5vLWNvbW1vbiAtZmFsdGl2ZWMiCisJTUxJQlM9InZpdGVyYmkyN19hdi5vIHZpdGVyYmkyOV9hdi5vIHZpdGVyYmkzOV9hdi5vIHZpdGVyYmk2MTVfYXYubyBcCisJZW5jb2RlX3JzX2F2Lm8gXAorCWRvdHByb2RfYXYubyBzdW1zcV9hdi5vIHBlYWt2YWxfYXYubyBjcHVfbW9kZV9wcGMubyIKKwk7OworKikKKwlNTElCUz0KK2VzYWMKK2Nhc2UgJHRhcmdldF9vcyBpbgorZGFyd2luKikKKwlTSF9MSUI9bGliZmVjLmR5bGliCisJUkVCSU5EPSIiCisJOzsKKyopCisJU0hfTElCPWxpYmZlYy5zbworCVJFQklORD1sZGNvbmZpZworCTs7Citlc2FjCitBQ19TVUJTVChTSF9MSUIpCitBQ19TVUJTVChSRUJJTkQpCitBQ19TVUJTVChNTElCUykKK0FDX1NVQlNUKEFSQ0hfT1BUSU9OKQorCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfQ0hFQ0tfRlVOQ1MoZ2V0b3B0X2xvbmcgbWVtc2V0IG1lbW1vdmUpCisKK0FDX09VVFBVVChtYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2ZlYy9jcHVfZmVhdHVyZXMucyBiL2ZlYy9jcHVfZmVhdHVyZXMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRiYTRlCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2NwdV9mZWF0dXJlcy5zCkBAIC0wLDAgKzEsMTUgQEAKKy50ZXh0CisuZ2xvYmFsIGNwdV9mZWF0dXJlcworCS50eXBlIGNwdV9mZWF0dXJlcyxAZnVuY3Rpb24KK2NwdV9mZWF0dXJlczoJCisJcHVzaGwgJWVieAorCXB1c2hsICVlY3gKKwlwdXNobCAlZWR4CisJbW92bCAkMSwlZWF4CisJY3B1aWQKKwltb3ZsICVlZHgsJWVheAorCXBvcGwgJWVkeAorCXBvcGwgJWVjeAorCXBvcGwgJWVieAorCXJldAorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYy9jcHVfbW9kZV9wcGMuYyBiL2ZlYy9jcHVfbW9kZV9wcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcxNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL2NwdV9tb2RlX3BwYy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIERldGVybWluZSBDUFUgc3VwcG9ydCBmb3IgU0lNRCBvbiBQb3dlciBQQworICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImZlYy5oIgorI2lmZGVmIF9fVkVDX18KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKworLyogVmFyaW91cyBTSU1EIGluc3RydWN0aW9uIHNldCBuYW1lcyAqLworY2hhciAqQ3B1X21vZGVzW10gPSB7IlVua25vd24iLCJQb3J0YWJsZSBDIiwieDg2IE11bHRpIE1lZGlhIEV4dGVuc2lvbnMgKE1NWCkiLAorCQkgICAieDg2IFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMgKFNTRSkiLAorCQkgICAieDg2IFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMgMiAoU1NFMikiLAorCQkgICAiUG93ZXJQQyBHNC9HNSBBbHRpdmVjL1ZlbG9jaXR5IEVuZ2luZSJ9OworCitlbnVtIGNwdV9tb2RlIENwdV9tb2RlOworCit2b2lkIGZpbmRfY3B1X21vZGUodm9pZCl7CisKKyAgaWYoQ3B1X21vZGUgIT0gVU5LTk9XTikKKyAgICByZXR1cm47CisKKyNpZmRlZiBfX1ZFQ19fCisgIHsKKyAgLyogQXNrIHRoZSBPUyBpZiB3ZSBoYXZlIEFsdGl2ZWMgc3VwcG9ydCAqLworICBpbnQgc2VsZWN0b3JzWzJdID0geyBDVExfSFcsIEhXX1ZFQ1RPUlVOSVQgfTsKKyAgaW50IGhhc1ZlY3RvclVuaXQgPSAwOworICBzaXplX3QgbGVuZ3RoID0gc2l6ZW9mKGhhc1ZlY3RvclVuaXQpOworICBpbnQgZXJyb3IgPSBzeXNjdGwoc2VsZWN0b3JzLCAyLCAmaGFzVmVjdG9yVW5pdCwgJmxlbmd0aCwgTlVMTCwgMCk7CisgIGlmKDAgPT0gZXJyb3IgJiYgaGFzVmVjdG9yVW5pdCkKKyAgICBDcHVfbW9kZSA9IEFMVElWRUM7CisgIGVsc2UKKyAgICBDcHVfbW9kZSA9IFBPUlQ7CisgIH0KKyNlbHNlCisgIENwdV9tb2RlID0gUE9SVDsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCJTSU1EIENQVSBkZXRlY3Q6ICVzXG4iLENwdV9tb2Rlc1tDcHVfbW9kZV0pOworfQpkaWZmIC0tZ2l0IGEvZmVjL2NwdV9tb2RlX3g4Ni5jIGIvZmVjL2NwdV9tb2RlX3g4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvY3B1X21vZGVfeDg2LmMKQEAgLTAsMCArMSwzMyBAQAorLyogRGV0ZXJtaW5lIENQVSBzdXBwb3J0IGZvciBTSU1ECisgKiBDb3B5cmlnaHQgMjAwNCBQaGlsIEthcm4sIEtBOVEKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKKy8qIFZhcmlvdXMgU0lNRCBpbnN0cnVjdGlvbiBzZXQgbmFtZXMgKi8KK2NoYXIgKkNwdV9tb2Rlc1tdID0geyJVbmtub3duIiwiUG9ydGFibGUgQyIsIng4NiBNdWx0aSBNZWRpYSBFeHRlbnNpb25zIChNTVgpIiwKKwkJICAgIng4NiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zIChTU0UpIiwKKwkJICAgIng4NiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zIDIgKFNTRTIpIiwKKwkJICAgIlBvd2VyUEMgRzQvRzUgQWx0aXZlYy9WZWxvY2l0eSBFbmdpbmUifTsKKworZW51bSBjcHVfbW9kZSBDcHVfbW9kZTsKKwordm9pZCBmaW5kX2NwdV9tb2RlKHZvaWQpeworCisgIGludCBmOworICBpZihDcHVfbW9kZSAhPSBVTktOT1dOKQorICAgIHJldHVybjsKKworICAvKiBGaWd1cmUgb3V0IHdoYXQga2luZCBvZiBDUFUgd2UgaGF2ZSAqLworICBmID0gY3B1X2ZlYXR1cmVzKCk7CisgIGlmKGYgJiAoMTw8MjYpKXsgLyogU1NFMiBpcyBwcmVzZW50ICovCisgICAgQ3B1X21vZGUgPSBTU0UyOworICB9IGVsc2UgaWYoZiAmICgxPDwyNSkpeyAvKiBTU0UgaXMgcHJlc2VudCAqLworICAgIENwdV9tb2RlID0gU1NFOworICB9IGVsc2UgaWYoZiAmICgxPDwyMykpeyAvKiBNTVggaXMgcHJlc2VudCAqLworICAgIENwdV9tb2RlID0gTU1YOworICB9IGVsc2UgeyAvKiBObyBTSU1EIGF0IGFsbCAqLworICAgIENwdV9tb2RlID0gUE9SVDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiU0lNRCBDUFUgZGV0ZWN0OiAlc1xuIixDcHVfbW9kZXNbQ3B1X21vZGVdKTsKK30KZGlmZiAtLWdpdCBhL2ZlYy9kZWNvZGVfcnMuYyBiL2ZlYy9kZWNvZGVfcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y5N2IzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2RlY29kZV9ycy5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBSZWVkLVNvbG9tb24gZGVjb2RlcgorICogQ29weXJpZ2h0IDIwMDIgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZGVmaW5lCW1pbihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKKyNpZmRlZiBGSVhFRAorI2luY2x1ZGUgImZpeGVkLmgiCisjZWxpZiBkZWZpbmVkKEJJR1NZTSkKKyNpbmNsdWRlICJpbnQuaCIKKyNlbHNlCisjaW5jbHVkZSAiY2hhci5oIgorI2VuZGlmCisKK2ludCBERUNPREVfUlMoCisjaWZkZWYgRklYRUQKK2RhdGFfdCAqZGF0YSwgaW50ICplcmFzX3BvcywgaW50IG5vX2VyYXMsaW50IHBhZCl7CisjZWxzZQordm9pZCAqcCxkYXRhX3QgKmRhdGEsIGludCAqZXJhc19wb3MsIGludCBub19lcmFzKXsKKyAgc3RydWN0IHJzICpycyA9IChzdHJ1Y3QgcnMgKilwOworI2VuZGlmCisgIGludCBkZWdfbGFtYmRhLCBlbCwgZGVnX29tZWdhOworICBpbnQgaSwgaiwgcixrOworICBkYXRhX3QgdSxxLHRtcCxudW0xLG51bTIsZGVuLGRpc2NyX3I7CisgIGRhdGFfdCBsYW1iZGFbTlJPT1RTKzFdLCBzW05ST09UU107CS8qIEVycitFcmFzIExvY2F0b3IgcG9seQorCQkJCQkgKiBhbmQgc3luZHJvbWUgcG9seSAqLworICBkYXRhX3QgYltOUk9PVFMrMV0sIHRbTlJPT1RTKzFdLCBvbWVnYVtOUk9PVFMrMV07CisgIGRhdGFfdCByb290W05ST09UU10sIHJlZ1tOUk9PVFMrMV0sIGxvY1tOUk9PVFNdOworICBpbnQgc3luX2Vycm9yLCBjb3VudDsKKworI2lmZGVmIEZJWEVECisgIC8qIENoZWNrIHBhZCBwYXJhbWV0ZXIgZm9yIHZhbGlkaXR5ICovCisgIGlmKHBhZCA8IDAgfHwgcGFkID49IE5OKQorICAgIHJldHVybiAtMTsKKyNlbmRpZgorCisgIC8qIGZvcm0gdGhlIHN5bmRyb21lczsgaS5lLiwgZXZhbHVhdGUgZGF0YSh4KSBhdCByb290cyBvZiBnKHgpICovCisgIGZvcihpPTA7aTxOUk9PVFM7aSsrKQorICAgIHNbaV0gPSBkYXRhWzBdOworCisgIGZvcihqPTE7ajxOTi1QQUQ7aisrKXsKKyAgICBmb3IoaT0wO2k8TlJPT1RTO2krKyl7CisgICAgICBpZihzW2ldID09IDApeworCXNbaV0gPSBkYXRhW2pdOworICAgICAgfSBlbHNlIHsKKwlzW2ldID0gZGF0YVtqXSBeIEFMUEhBX1RPW01PRE5OKElOREVYX09GW3NbaV1dICsgKEZDUitpKSpQUklNKV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ29udmVydCBzeW5kcm9tZXMgdG8gaW5kZXggZm9ybSwgY2hlY2tpbmcgZm9yIG5vbnplcm8gY29uZGl0aW9uICovCisgIHN5bl9lcnJvciA9IDA7CisgIGZvcihpPTA7aTxOUk9PVFM7aSsrKXsKKyAgICBzeW5fZXJyb3IgfD0gc1tpXTsKKyAgICBzW2ldID0gSU5ERVhfT0Zbc1tpXV07CisgIH0KKworICBpZiAoIXN5bl9lcnJvcikgeworICAgIC8qIGlmIHN5bmRyb21lIGlzIHplcm8sIGRhdGFbXSBpcyBhIGNvZGV3b3JkIGFuZCB0aGVyZSBhcmUgbm8KKyAgICAgKiBlcnJvcnMgdG8gY29ycmVjdC4gU28gcmV0dXJuIGRhdGFbXSB1bm1vZGlmaWVkCisgICAgICovCisgICAgY291bnQgPSAwOworICAgIGdvdG8gZmluaXNoOworICB9CisgIG1lbXNldCgmbGFtYmRhWzFdLDAsTlJPT1RTKnNpemVvZihsYW1iZGFbMF0pKTsKKyAgbGFtYmRhWzBdID0gMTsKKworICBpZiAobm9fZXJhcyA+IDApIHsKKyAgICAvKiBJbml0IGxhbWJkYSB0byBiZSB0aGUgZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwgKi8KKyAgICBsYW1iZGFbMV0gPSBBTFBIQV9UT1tNT0ROTihQUklNKihOTi0xLWVyYXNfcG9zWzBdKSldOworICAgIGZvciAoaSA9IDE7IGkgPCBub19lcmFzOyBpKyspIHsKKyAgICAgIHUgPSBNT0ROTihQUklNKihOTi0xLWVyYXNfcG9zW2ldKSk7CisgICAgICBmb3IgKGogPSBpKzE7IGogPiAwOyBqLS0pIHsKKwl0bXAgPSBJTkRFWF9PRltsYW1iZGFbaiAtIDFdXTsKKwlpZih0bXAgIT0gQTApCisJICBsYW1iZGFbal0gXj0gQUxQSEFfVE9bTU9ETk4odSArIHRtcCldOworICAgICAgfQorICAgIH0KKworI2lmIERFQlVHID49IDEKKyAgICAvKiBUZXN0IGNvZGUgdGhhdCB2ZXJpZmllcyB0aGUgZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwganVzdCBjb25zdHJ1Y3RlZAorICAgICAgIE5lZWRlZCBvbmx5IGZvciBkZWNvZGVyIGRlYnVnZ2luZy4gKi8KKyAgICAKKyAgICAvKiBmaW5kIHJvb3RzIG9mIHRoZSBlcmFzdXJlIGxvY2F0aW9uIHBvbHlub21pYWwgKi8KKyAgICBmb3IoaT0xO2k8PW5vX2VyYXM7aSsrKQorICAgICAgcmVnW2ldID0gSU5ERVhfT0ZbbGFtYmRhW2ldXTsKKworICAgIGNvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAxLGs9SVBSSU0tMTsgaSA8PSBOTjsgaSsrLGsgPSBNT0ROTihrK0lQUklNKSkgeworICAgICAgcSA9IDE7CisgICAgICBmb3IgKGogPSAxOyBqIDw9IG5vX2VyYXM7IGorKykKKwlpZiAocmVnW2pdICE9IEEwKSB7CisJICByZWdbal0gPSBNT0ROTihyZWdbal0gKyBqKTsKKwkgIHEgXj0gQUxQSEFfVE9bcmVnW2pdXTsKKwl9CisgICAgICBpZiAocSAhPSAwKQorCWNvbnRpbnVlOworICAgICAgLyogc3RvcmUgcm9vdCBhbmQgZXJyb3IgbG9jYXRpb24gbnVtYmVyIGluZGljZXMgKi8KKyAgICAgIHJvb3RbY291bnRdID0gaTsKKyAgICAgIGxvY1tjb3VudF0gPSBrOworICAgICAgY291bnQrKzsKKyAgICB9CisgICAgaWYgKGNvdW50ICE9IG5vX2VyYXMpIHsKKyAgICAgIHByaW50ZigiY291bnQgPSAlZCBub19lcmFzID0gJWRcbiBsYW1iZGEoeCkgaXMgV1JPTkdcbiIsY291bnQsbm9fZXJhcyk7CisgICAgICBjb3VudCA9IC0xOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorI2lmIERFQlVHID49IDIKKyAgICBwcmludGYoIlxuIEVyYXN1cmUgcG9zaXRpb25zIGFzIGRldGVybWluZWQgYnkgcm9vdHMgb2YgRXJhcyBMb2MgUG9seTpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgcHJpbnRmKCIlZCAiLCBsb2NbaV0pOworICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKyAgZm9yKGk9MDtpPE5ST09UUysxO2krKykKKyAgICBiW2ldID0gSU5ERVhfT0ZbbGFtYmRhW2ldXTsKKyAgCisgIC8qCisgICAqIEJlZ2luIEJlcmxla2FtcC1NYXNzZXkgYWxnb3JpdGhtIHRvIGRldGVybWluZSBlcnJvcitlcmFzdXJlCisgICAqIGxvY2F0b3IgcG9seW5vbWlhbAorICAgKi8KKyAgciA9IG5vX2VyYXM7CisgIGVsID0gbm9fZXJhczsKKyAgd2hpbGUgKCsrciA8PSBOUk9PVFMpIHsJLyogciBpcyB0aGUgc3RlcCBudW1iZXIgKi8KKyAgICAvKiBDb21wdXRlIGRpc2NyZXBhbmN5IGF0IHRoZSByLXRoIHN0ZXAgaW4gcG9seS1mb3JtICovCisgICAgZGlzY3JfciA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKyl7CisgICAgICBpZiAoKGxhbWJkYVtpXSAhPSAwKSAmJiAoc1tyLWktMV0gIT0gQTApKSB7CisJZGlzY3JfciBePSBBTFBIQV9UT1tNT0ROTihJTkRFWF9PRltsYW1iZGFbaV1dICsgc1tyLWktMV0pXTsKKyAgICAgIH0KKyAgICB9CisgICAgZGlzY3JfciA9IElOREVYX09GW2Rpc2NyX3JdOwkvKiBJbmRleCBmb3JtICovCisgICAgaWYgKGRpc2NyX3IgPT0gQTApIHsKKyAgICAgIC8qIDIgbGluZXMgYmVsb3c6IEIoeCkgPC0tIHgqQih4KSAqLworICAgICAgbWVtbW92ZSgmYlsxXSxiLE5ST09UUypzaXplb2YoYlswXSkpOworICAgICAgYlswXSA9IEEwOworICAgIH0gZWxzZSB7CisgICAgICAvKiA3IGxpbmVzIGJlbG93OiBUKHgpIDwtLSBsYW1iZGEoeCkgLSBkaXNjcl9yKngqYih4KSAqLworICAgICAgdFswXSA9IGxhbWJkYVswXTsKKyAgICAgIGZvciAoaSA9IDAgOyBpIDwgTlJPT1RTOyBpKyspIHsKKwlpZihiW2ldICE9IEEwKQorCSAgdFtpKzFdID0gbGFtYmRhW2krMV0gXiBBTFBIQV9UT1tNT0ROTihkaXNjcl9yICsgYltpXSldOworCWVsc2UKKwkgIHRbaSsxXSA9IGxhbWJkYVtpKzFdOworICAgICAgfQorICAgICAgaWYgKDIgKiBlbCA8PSByICsgbm9fZXJhcyAtIDEpIHsKKwllbCA9IHIgKyBub19lcmFzIC0gZWw7CisJLyoKKwkgKiAyIGxpbmVzIGJlbG93OiBCKHgpIDwtLSBpbnYoZGlzY3JfcikgKgorCSAqIGxhbWJkYSh4KQorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gTlJPT1RTOyBpKyspCisJICBiW2ldID0gKGxhbWJkYVtpXSA9PSAwKSA/IEEwIDogTU9ETk4oSU5ERVhfT0ZbbGFtYmRhW2ldXSAtIGRpc2NyX3IgKyBOTik7CisgICAgICB9IGVsc2UgeworCS8qIDIgbGluZXMgYmVsb3c6IEIoeCkgPC0tIHgqQih4KSAqLworCW1lbW1vdmUoJmJbMV0sYixOUk9PVFMqc2l6ZW9mKGJbMF0pKTsKKwliWzBdID0gQTA7CisgICAgICB9CisgICAgICBtZW1jcHkobGFtYmRhLHQsKE5ST09UUysxKSpzaXplb2YodFswXSkpOworICAgIH0KKyAgfQorCisgIC8qIENvbnZlcnQgbGFtYmRhIHRvIGluZGV4IGZvcm0gYW5kIGNvbXB1dGUgZGVnKGxhbWJkYSh4KSkgKi8KKyAgZGVnX2xhbWJkYSA9IDA7CisgIGZvcihpPTA7aTxOUk9PVFMrMTtpKyspeworICAgIGxhbWJkYVtpXSA9IElOREVYX09GW2xhbWJkYVtpXV07CisgICAgaWYobGFtYmRhW2ldICE9IEEwKQorICAgICAgZGVnX2xhbWJkYSA9IGk7CisgIH0KKyAgLyogRmluZCByb290cyBvZiB0aGUgZXJyb3IrZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwgYnkgQ2hpZW4gc2VhcmNoICovCisgIG1lbWNweSgmcmVnWzFdLCZsYW1iZGFbMV0sTlJPT1RTKnNpemVvZihyZWdbMF0pKTsKKyAgY291bnQgPSAwOwkJLyogTnVtYmVyIG9mIHJvb3RzIG9mIGxhbWJkYSh4KSAqLworICBmb3IgKGkgPSAxLGs9SVBSSU0tMTsgaSA8PSBOTjsgaSsrLGsgPSBNT0ROTihrK0lQUklNKSkgeworICAgIHEgPSAxOyAvKiBsYW1iZGFbMF0gaXMgYWx3YXlzIDAgKi8KKyAgICBmb3IgKGogPSBkZWdfbGFtYmRhOyBqID4gMDsgai0tKXsKKyAgICAgIGlmIChyZWdbal0gIT0gQTApIHsKKwlyZWdbal0gPSBNT0ROTihyZWdbal0gKyBqKTsKKwlxIF49IEFMUEhBX1RPW3JlZ1tqXV07CisgICAgICB9CisgICAgfQorICAgIGlmIChxICE9IDApCisgICAgICBjb250aW51ZTsgLyogTm90IGEgcm9vdCAqLworICAgIC8qIHN0b3JlIHJvb3QgKGluZGV4LWZvcm0pIGFuZCBlcnJvciBsb2NhdGlvbiBudW1iZXIgKi8KKyNpZiBERUJVRz49MgorICAgIHByaW50ZigiY291bnQgJWQgcm9vdCAlZCBsb2MgJWRcbiIsY291bnQsaSxrKTsKKyNlbmRpZgorICAgIHJvb3RbY291bnRdID0gaTsKKyAgICBsb2NbY291bnRdID0gazsKKyAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIG1heCBwb3NzaWJsZSByb290cywKKyAgICAgKiBhYm9ydCB0aGUgc2VhcmNoIHRvIHNhdmUgdGltZQorICAgICAqLworICAgIGlmKCsrY291bnQgPT0gZGVnX2xhbWJkYSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChkZWdfbGFtYmRhICE9IGNvdW50KSB7CisgICAgLyoKKyAgICAgKiBkZWcobGFtYmRhKSB1bmVxdWFsIHRvIG51bWJlciBvZiByb290cyA9PiB1bmNvcnJlY3RhYmxlCisgICAgICogZXJyb3IgZGV0ZWN0ZWQKKyAgICAgKi8KKyAgICBjb3VudCA9IC0xOworICAgIGdvdG8gZmluaXNoOworICB9CisgIC8qCisgICAqIENvbXB1dGUgZXJyK2VyYXMgZXZhbHVhdG9yIHBvbHkgb21lZ2EoeCkgPSBzKHgpKmxhbWJkYSh4KSAobW9kdWxvCisgICAqIHgqKk5ST09UUykuIGluIGluZGV4IGZvcm0uIEFsc28gZmluZCBkZWcob21lZ2EpLgorICAgKi8KKyAgZGVnX29tZWdhID0gZGVnX2xhbWJkYS0xOworICBmb3IgKGkgPSAwOyBpIDw9IGRlZ19vbWVnYTtpKyspeworICAgIHRtcCA9IDA7CisgICAgZm9yKGo9aTtqID49IDA7IGotLSl7CisgICAgICBpZiAoKHNbaSAtIGpdICE9IEEwKSAmJiAobGFtYmRhW2pdICE9IEEwKSkKKwl0bXAgXj0gQUxQSEFfVE9bTU9ETk4oc1tpIC0gal0gKyBsYW1iZGFbal0pXTsKKyAgICB9CisgICAgb21lZ2FbaV0gPSBJTkRFWF9PRlt0bXBdOworICB9CisKKyAgLyoKKyAgICogQ29tcHV0ZSBlcnJvciB2YWx1ZXMgaW4gcG9seS1mb3JtLiBudW0xID0gb21lZ2EoaW52KFgobCkpKSwgbnVtMiA9CisgICAqIGludihYKGwpKSoqKEZDUi0xKSBhbmQgZGVuID0gbGFtYmRhX3ByKGludihYKGwpKSkgYWxsIGluIHBvbHktZm9ybQorICAgKi8KKyAgZm9yIChqID0gY291bnQtMTsgaiA+PTA7IGotLSkgeworICAgIG51bTEgPSAwOworICAgIGZvciAoaSA9IGRlZ19vbWVnYTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChvbWVnYVtpXSAhPSBBMCkKKwludW0xICBePSBBTFBIQV9UT1tNT0ROTihvbWVnYVtpXSArIGkgKiByb290W2pdKV07CisgICAgfQorICAgIG51bTIgPSBBTFBIQV9UT1tNT0ROTihyb290W2pdICogKEZDUiAtIDEpICsgTk4pXTsKKyAgICBkZW4gPSAwOworICAgIAorICAgIC8qIGxhbWJkYVtpKzFdIGZvciBpIGV2ZW4gaXMgdGhlIGZvcm1hbCBkZXJpdmF0aXZlIGxhbWJkYV9wciBvZiBsYW1iZGFbaV0gKi8KKyAgICBmb3IgKGkgPSBtaW4oZGVnX2xhbWJkYSxOUk9PVFMtMSkgJiB+MTsgaSA+PSAwOyBpIC09MikgeworICAgICAgaWYobGFtYmRhW2krMV0gIT0gQTApCisJZGVuIF49IEFMUEhBX1RPW01PRE5OKGxhbWJkYVtpKzFdICsgaSAqIHJvb3Rbal0pXTsKKyAgICB9CisjaWYgREVCVUcgPj0gMQorICAgIGlmIChkZW4gPT0gMCkgeworICAgICAgcHJpbnRmKCJcbiBFUlJPUjogZGVub21pbmF0b3IgPSAwXG4iKTsKKyAgICAgIGNvdW50ID0gLTE7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBBcHBseSBlcnJvciB0byBkYXRhICovCisgICAgaWYgKG51bTEgIT0gMCAmJiBsb2Nbal0gPj0gUEFEKSB7CisgICAgICBkYXRhW2xvY1tqXS1QQURdIF49IEFMUEhBX1RPW01PRE5OKElOREVYX09GW251bTFdICsgSU5ERVhfT0ZbbnVtMl0gKyBOTiAtIElOREVYX09GW2Rlbl0pXTsKKyAgICB9CisgIH0KKyBmaW5pc2g6CisgIGlmKGVyYXNfcG9zICE9IE5VTEwpeworICAgIGZvcihpPTA7aTxjb3VudDtpKyspCisgICAgICBlcmFzX3Bvc1tpXSA9IGxvY1tpXTsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9mZWMvZGVjb2RlX3JzLmggYi9mZWMvZGVjb2RlX3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2NWNmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kZWNvZGVfcnMuaApAQCAtMCwwICsxLDI5OCBAQAorLyogVGhlIGd1dHMgb2YgdGhlIFJlZWQtU29sb21vbiBkZWNvZGVyLCBtZWFudCB0byBiZSAjaW5jbHVkZWQKKyAqIGludG8gYSBmdW5jdGlvbiBib2R5IHdpdGggdGhlIGZvbGxvd2luZyB0eXBlZGVmcywgbWFjcm9zIGFuZCB2YXJpYWJsZXMgc3VwcGxpZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kZSBwYXJhbWV0ZXJzOgorCisgKiBkYXRhX3QgLSBhIHR5cGVkZWYgZm9yIHRoZSBkYXRhIHN5bWJvbAorICogZGF0YV90IGRhdGFbXSAtIGFycmF5IG9mIE5OIGRhdGEgYW5kIHBhcml0eSBzeW1ib2xzIHRvIGJlIGNvcnJlY3RlZCBpbiBwbGFjZQorICogcmV0dmFsIC0gYW4gaW50ZWdlciBsdmFsdWUgaW50byB3aGljaCB0aGUgZGVjb2RlcidzIHJldHVybiBjb2RlIGlzIHdyaXR0ZW4KKyAqIE5ST09UUyAtIHRoZSBudW1iZXIgb2Ygcm9vdHMgaW4gdGhlIFJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwsCisgKiAgICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHBhcml0eSBzeW1ib2xzIGluIGEgYmxvY2suCisgICAgICAgICAgICBJbnRlZ2VyIHZhcmlhYmxlIG9yIGxpdGVyYWwuCisgKiBOTiAtIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhIFJTIGJsb2NrLiBJbnRlZ2VyIHZhcmlhYmxlIG9yIGxpdGVyYWwuCisgKiBQQUQgLSB0aGUgbnVtYmVyIG9mIHBhZCBzeW1ib2xzIGluIGEgYmxvY2suIEludGVnZXIgdmFyaWFibGUgb3IgbGl0ZXJhbC4KKyAqIEFMUEhBX1RPIC0gVGhlIGFkZHJlc3Mgb2YgYW4gYXJyYXkgb2YgTk4gZWxlbWVudHMgdG8gY29udmVydCBHYWxvaXMgZmllbGQKKyAqICAgICAgICAgICAgZWxlbWVudHMgaW4gaW5kZXggKGxvZykgZm9ybSB0byBwb2x5bm9taWFsIGZvcm0uIFJlYWQgb25seS4KKyAqIElOREVYX09GIC0gVGhlIGFkZHJlc3Mgb2YgYW4gYXJyYXkgb2YgTk4gZWxlbWVudHMgdG8gY29udmVydCBHYWxvaXMgZmllbGQKKyAqICAgICAgICAgICAgZWxlbWVudHMgaW4gcG9seW5vbWlhbCBmb3JtIHRvIGluZGV4IChsb2cpIGZvcm0uIFJlYWQgb25seS4KKyAqIE1PRE5OIC0gYSBmdW5jdGlvbiB0byByZWR1Y2UgaXRzIGFyZ3VtZW50IG1vZHVsbyBOTi4gTWF5IGJlIGlubGluZSBvciBhIG1hY3JvLgorICogRkNSIC0gQW4gaW50ZWdlciBsaXRlcmFsIG9yIHZhcmlhYmxlIHNwZWNpZnlpbmcgdGhlIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBSZWVkLVNvbG9tb24gZ2VuZXJhdG9yIHBvbHlub21pYWwuIEludGVnZXIgdmFyaWFibGUgb3IgbGl0ZXJhbC4KKyAqIFBSSU0gLSBUaGUgcHJpbWl0aXZlIHJvb3Qgb2YgdGhlIGdlbmVyYXRvciBwb2x5LiBJbnRlZ2VyIHZhcmlhYmxlIG9yIGxpdGVyYWwuCisgKiBERUJVRyAtIElmIHNldCB0byAxIG9yIG1vcmUsIGRvIHZhcmlvdXMgaW50ZXJuYWwgY29uc2lzdGVuY3kgY2hlY2tpbmcuIExlYXZlIHRoaXMKKyAqICAgICAgICAgdW5kZWZpbmVkIGZvciBwcm9kdWN0aW9uIGNvZGUKKworICogVGhlIG1lbXNldCgpLCBtZW1tb3ZlKCksIGFuZCBtZW1jcHkoKSBmdW5jdGlvbnMgYXJlIHVzZWQuIFRoZSBhcHByb3ByaWF0ZSBoZWFkZXIKKyAqIGZpbGUgZGVjbGFyaW5nIHRoZXNlIGZ1bmN0aW9ucyAodXN1YWxseSA8c3RyaW5nLmg+KSBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBjYWxsaW5nCisgKiBwcm9ncmFtLgorICovCisKKworI2lmICFkZWZpbmVkKE5ST09UUykKKyNlcnJvciAiTlJPT1RTIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChOTikKKyNlcnJvciAiTk4gbm90IGRlZmluZWQiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBBRCkKKyNlcnJvciAiUEFEIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChBTFBIQV9UTykKKyNlcnJvciAiQUxQSEFfVE8gbm90IGRlZmluZWQiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElOREVYX09GKQorI2Vycm9yICJJTkRFWF9PRiBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTU9ETk4pCisjZXJyb3IgIk1PRE5OIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGQ1IpCisjZXJyb3IgIkZDUiBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUFJJTSkKKyNlcnJvciAiUFJJTSBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTlVMTCkKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyN1bmRlZiBNSU4KKyNkZWZpbmUJTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyN1bmRlZiBBMAorI2RlZmluZSBBMCAoTk4pCisKK3sKKyAgaW50IGRlZ19sYW1iZGEsIGVsLCBkZWdfb21lZ2E7CisgIGludCBpLCBqLCByLGs7CisgIGRhdGFfdCB1LHEsdG1wLG51bTEsbnVtMixkZW4sZGlzY3JfcjsKKyAgZGF0YV90IGxhbWJkYVtOUk9PVFMrMV0sIHNbTlJPT1RTXTsJLyogRXJyK0VyYXMgTG9jYXRvciBwb2x5CisJCQkJCSAqIGFuZCBzeW5kcm9tZSBwb2x5ICovCisgIGRhdGFfdCBiW05ST09UUysxXSwgdFtOUk9PVFMrMV0sIG9tZWdhW05ST09UUysxXTsKKyAgZGF0YV90IHJvb3RbTlJPT1RTXSwgcmVnW05ST09UUysxXSwgbG9jW05ST09UU107CisgIGludCBzeW5fZXJyb3IsIGNvdW50OworCisgIC8qIGZvcm0gdGhlIHN5bmRyb21lczsgaS5lLiwgZXZhbHVhdGUgZGF0YSh4KSBhdCByb290cyBvZiBnKHgpICovCisgIGZvcihpPTA7aTxOUk9PVFM7aSsrKQorICAgIHNbaV0gPSBkYXRhWzBdOworCisgIGZvcihqPTE7ajxOTi1QQUQ7aisrKXsKKyAgICBmb3IoaT0wO2k8TlJPT1RTO2krKyl7CisgICAgICBpZihzW2ldID09IDApeworCXNbaV0gPSBkYXRhW2pdOworICAgICAgfSBlbHNlIHsKKwlzW2ldID0gZGF0YVtqXSBeIEFMUEhBX1RPW01PRE5OKElOREVYX09GW3NbaV1dICsgKEZDUitpKSpQUklNKV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ29udmVydCBzeW5kcm9tZXMgdG8gaW5kZXggZm9ybSwgY2hlY2tpbmcgZm9yIG5vbnplcm8gY29uZGl0aW9uICovCisgIHN5bl9lcnJvciA9IDA7CisgIGZvcihpPTA7aTxOUk9PVFM7aSsrKXsKKyAgICBzeW5fZXJyb3IgfD0gc1tpXTsKKyAgICBzW2ldID0gSU5ERVhfT0Zbc1tpXV07CisgIH0KKworICBpZiAoIXN5bl9lcnJvcikgeworICAgIC8qIGlmIHN5bmRyb21lIGlzIHplcm8sIGRhdGFbXSBpcyBhIGNvZGV3b3JkIGFuZCB0aGVyZSBhcmUgbm8KKyAgICAgKiBlcnJvcnMgdG8gY29ycmVjdC4gU28gcmV0dXJuIGRhdGFbXSB1bm1vZGlmaWVkCisgICAgICovCisgICAgY291bnQgPSAwOworICAgIGdvdG8gZmluaXNoOworICB9CisgIG1lbXNldCgmbGFtYmRhWzFdLDAsTlJPT1RTKnNpemVvZihsYW1iZGFbMF0pKTsKKyAgbGFtYmRhWzBdID0gMTsKKworICBpZiAobm9fZXJhcyA+IDApIHsKKyAgICAvKiBJbml0IGxhbWJkYSB0byBiZSB0aGUgZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwgKi8KKyAgICBsYW1iZGFbMV0gPSBBTFBIQV9UT1tNT0ROTihQUklNKihOTi0xLWVyYXNfcG9zWzBdKSldOworICAgIGZvciAoaSA9IDE7IGkgPCBub19lcmFzOyBpKyspIHsKKyAgICAgIHUgPSBNT0ROTihQUklNKihOTi0xLWVyYXNfcG9zW2ldKSk7CisgICAgICBmb3IgKGogPSBpKzE7IGogPiAwOyBqLS0pIHsKKwl0bXAgPSBJTkRFWF9PRltsYW1iZGFbaiAtIDFdXTsKKwlpZih0bXAgIT0gQTApCisJICBsYW1iZGFbal0gXj0gQUxQSEFfVE9bTU9ETk4odSArIHRtcCldOworICAgICAgfQorICAgIH0KKworI2lmIERFQlVHID49IDEKKyAgICAvKiBUZXN0IGNvZGUgdGhhdCB2ZXJpZmllcyB0aGUgZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwganVzdCBjb25zdHJ1Y3RlZAorICAgICAgIE5lZWRlZCBvbmx5IGZvciBkZWNvZGVyIGRlYnVnZ2luZy4gKi8KKyAgICAKKyAgICAvKiBmaW5kIHJvb3RzIG9mIHRoZSBlcmFzdXJlIGxvY2F0aW9uIHBvbHlub21pYWwgKi8KKyAgICBmb3IoaT0xO2k8PW5vX2VyYXM7aSsrKQorICAgICAgcmVnW2ldID0gSU5ERVhfT0ZbbGFtYmRhW2ldXTsKKworICAgIGNvdW50ID0gMDsKKyAgICBmb3IgKGkgPSAxLGs9SVBSSU0tMTsgaSA8PSBOTjsgaSsrLGsgPSBNT0ROTihrK0lQUklNKSkgeworICAgICAgcSA9IDE7CisgICAgICBmb3IgKGogPSAxOyBqIDw9IG5vX2VyYXM7IGorKykKKwlpZiAocmVnW2pdICE9IEEwKSB7CisJICByZWdbal0gPSBNT0ROTihyZWdbal0gKyBqKTsKKwkgIHEgXj0gQUxQSEFfVE9bcmVnW2pdXTsKKwl9CisgICAgICBpZiAocSAhPSAwKQorCWNvbnRpbnVlOworICAgICAgLyogc3RvcmUgcm9vdCBhbmQgZXJyb3IgbG9jYXRpb24gbnVtYmVyIGluZGljZXMgKi8KKyAgICAgIHJvb3RbY291bnRdID0gaTsKKyAgICAgIGxvY1tjb3VudF0gPSBrOworICAgICAgY291bnQrKzsKKyAgICB9CisgICAgaWYgKGNvdW50ICE9IG5vX2VyYXMpIHsKKyAgICAgIHByaW50ZigiY291bnQgPSAlZCBub19lcmFzID0gJWRcbiBsYW1iZGEoeCkgaXMgV1JPTkdcbiIsY291bnQsbm9fZXJhcyk7CisgICAgICBjb3VudCA9IC0xOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorI2lmIERFQlVHID49IDIKKyAgICBwcmludGYoIlxuIEVyYXN1cmUgcG9zaXRpb25zIGFzIGRldGVybWluZWQgYnkgcm9vdHMgb2YgRXJhcyBMb2MgUG9seTpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgcHJpbnRmKCIlZCAiLCBsb2NbaV0pOworICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKyAgZm9yKGk9MDtpPE5ST09UUysxO2krKykKKyAgICBiW2ldID0gSU5ERVhfT0ZbbGFtYmRhW2ldXTsKKyAgCisgIC8qCisgICAqIEJlZ2luIEJlcmxla2FtcC1NYXNzZXkgYWxnb3JpdGhtIHRvIGRldGVybWluZSBlcnJvcitlcmFzdXJlCisgICAqIGxvY2F0b3IgcG9seW5vbWlhbAorICAgKi8KKyAgciA9IG5vX2VyYXM7CisgIGVsID0gbm9fZXJhczsKKyAgd2hpbGUgKCsrciA8PSBOUk9PVFMpIHsJLyogciBpcyB0aGUgc3RlcCBudW1iZXIgKi8KKyAgICAvKiBDb21wdXRlIGRpc2NyZXBhbmN5IGF0IHRoZSByLXRoIHN0ZXAgaW4gcG9seS1mb3JtICovCisgICAgZGlzY3JfciA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKyl7CisgICAgICBpZiAoKGxhbWJkYVtpXSAhPSAwKSAmJiAoc1tyLWktMV0gIT0gQTApKSB7CisJZGlzY3JfciBePSBBTFBIQV9UT1tNT0ROTihJTkRFWF9PRltsYW1iZGFbaV1dICsgc1tyLWktMV0pXTsKKyAgICAgIH0KKyAgICB9CisgICAgZGlzY3JfciA9IElOREVYX09GW2Rpc2NyX3JdOwkvKiBJbmRleCBmb3JtICovCisgICAgaWYgKGRpc2NyX3IgPT0gQTApIHsKKyAgICAgIC8qIDIgbGluZXMgYmVsb3c6IEIoeCkgPC0tIHgqQih4KSAqLworICAgICAgbWVtbW92ZSgmYlsxXSxiLE5ST09UUypzaXplb2YoYlswXSkpOworICAgICAgYlswXSA9IEEwOworICAgIH0gZWxzZSB7CisgICAgICAvKiA3IGxpbmVzIGJlbG93OiBUKHgpIDwtLSBsYW1iZGEoeCkgLSBkaXNjcl9yKngqYih4KSAqLworICAgICAgdFswXSA9IGxhbWJkYVswXTsKKyAgICAgIGZvciAoaSA9IDAgOyBpIDwgTlJPT1RTOyBpKyspIHsKKwlpZihiW2ldICE9IEEwKQorCSAgdFtpKzFdID0gbGFtYmRhW2krMV0gXiBBTFBIQV9UT1tNT0ROTihkaXNjcl9yICsgYltpXSldOworCWVsc2UKKwkgIHRbaSsxXSA9IGxhbWJkYVtpKzFdOworICAgICAgfQorICAgICAgaWYgKDIgKiBlbCA8PSByICsgbm9fZXJhcyAtIDEpIHsKKwllbCA9IHIgKyBub19lcmFzIC0gZWw7CisJLyoKKwkgKiAyIGxpbmVzIGJlbG93OiBCKHgpIDwtLSBpbnYoZGlzY3JfcikgKgorCSAqIGxhbWJkYSh4KQorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gTlJPT1RTOyBpKyspCisJICBiW2ldID0gKGxhbWJkYVtpXSA9PSAwKSA/IEEwIDogTU9ETk4oSU5ERVhfT0ZbbGFtYmRhW2ldXSAtIGRpc2NyX3IgKyBOTik7CisgICAgICB9IGVsc2UgeworCS8qIDIgbGluZXMgYmVsb3c6IEIoeCkgPC0tIHgqQih4KSAqLworCW1lbW1vdmUoJmJbMV0sYixOUk9PVFMqc2l6ZW9mKGJbMF0pKTsKKwliWzBdID0gQTA7CisgICAgICB9CisgICAgICBtZW1jcHkobGFtYmRhLHQsKE5ST09UUysxKSpzaXplb2YodFswXSkpOworICAgIH0KKyAgfQorCisgIC8qIENvbnZlcnQgbGFtYmRhIHRvIGluZGV4IGZvcm0gYW5kIGNvbXB1dGUgZGVnKGxhbWJkYSh4KSkgKi8KKyAgZGVnX2xhbWJkYSA9IDA7CisgIGZvcihpPTA7aTxOUk9PVFMrMTtpKyspeworICAgIGxhbWJkYVtpXSA9IElOREVYX09GW2xhbWJkYVtpXV07CisgICAgaWYobGFtYmRhW2ldICE9IEEwKQorICAgICAgZGVnX2xhbWJkYSA9IGk7CisgIH0KKyAgLyogRmluZCByb290cyBvZiB0aGUgZXJyb3IrZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwgYnkgQ2hpZW4gc2VhcmNoICovCisgIG1lbWNweSgmcmVnWzFdLCZsYW1iZGFbMV0sTlJPT1RTKnNpemVvZihyZWdbMF0pKTsKKyAgY291bnQgPSAwOwkJLyogTnVtYmVyIG9mIHJvb3RzIG9mIGxhbWJkYSh4KSAqLworICBmb3IgKGkgPSAxLGs9SVBSSU0tMTsgaSA8PSBOTjsgaSsrLGsgPSBNT0ROTihrK0lQUklNKSkgeworICAgIHEgPSAxOyAvKiBsYW1iZGFbMF0gaXMgYWx3YXlzIDAgKi8KKyAgICBmb3IgKGogPSBkZWdfbGFtYmRhOyBqID4gMDsgai0tKXsKKyAgICAgIGlmIChyZWdbal0gIT0gQTApIHsKKwlyZWdbal0gPSBNT0ROTihyZWdbal0gKyBqKTsKKwlxIF49IEFMUEhBX1RPW3JlZ1tqXV07CisgICAgICB9CisgICAgfQorICAgIGlmIChxICE9IDApCisgICAgICBjb250aW51ZTsgLyogTm90IGEgcm9vdCAqLworICAgIC8qIHN0b3JlIHJvb3QgKGluZGV4LWZvcm0pIGFuZCBlcnJvciBsb2NhdGlvbiBudW1iZXIgKi8KKyNpZiBERUJVRz49MgorICAgIHByaW50ZigiY291bnQgJWQgcm9vdCAlZCBsb2MgJWRcbiIsY291bnQsaSxrKTsKKyNlbmRpZgorICAgIHJvb3RbY291bnRdID0gaTsKKyAgICBsb2NbY291bnRdID0gazsKKyAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIG1heCBwb3NzaWJsZSByb290cywKKyAgICAgKiBhYm9ydCB0aGUgc2VhcmNoIHRvIHNhdmUgdGltZQorICAgICAqLworICAgIGlmKCsrY291bnQgPT0gZGVnX2xhbWJkYSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChkZWdfbGFtYmRhICE9IGNvdW50KSB7CisgICAgLyoKKyAgICAgKiBkZWcobGFtYmRhKSB1bmVxdWFsIHRvIG51bWJlciBvZiByb290cyA9PiB1bmNvcnJlY3RhYmxlCisgICAgICogZXJyb3IgZGV0ZWN0ZWQKKyAgICAgKi8KKyAgICBjb3VudCA9IC0xOworICAgIGdvdG8gZmluaXNoOworICB9CisgIC8qCisgICAqIENvbXB1dGUgZXJyK2VyYXMgZXZhbHVhdG9yIHBvbHkgb21lZ2EoeCkgPSBzKHgpKmxhbWJkYSh4KSAobW9kdWxvCisgICAqIHgqKk5ST09UUykuIGluIGluZGV4IGZvcm0uIEFsc28gZmluZCBkZWcob21lZ2EpLgorICAgKi8KKyAgZGVnX29tZWdhID0gZGVnX2xhbWJkYS0xOworICBmb3IgKGkgPSAwOyBpIDw9IGRlZ19vbWVnYTtpKyspeworICAgIHRtcCA9IDA7CisgICAgZm9yKGo9aTtqID49IDA7IGotLSl7CisgICAgICBpZiAoKHNbaSAtIGpdICE9IEEwKSAmJiAobGFtYmRhW2pdICE9IEEwKSkKKwl0bXAgXj0gQUxQSEFfVE9bTU9ETk4oc1tpIC0gal0gKyBsYW1iZGFbal0pXTsKKyAgICB9CisgICAgb21lZ2FbaV0gPSBJTkRFWF9PRlt0bXBdOworICB9CisKKyAgLyoKKyAgICogQ29tcHV0ZSBlcnJvciB2YWx1ZXMgaW4gcG9seS1mb3JtLiBudW0xID0gb21lZ2EoaW52KFgobCkpKSwgbnVtMiA9CisgICAqIGludihYKGwpKSoqKEZDUi0xKSBhbmQgZGVuID0gbGFtYmRhX3ByKGludihYKGwpKSkgYWxsIGluIHBvbHktZm9ybQorICAgKi8KKyAgZm9yIChqID0gY291bnQtMTsgaiA+PTA7IGotLSkgeworICAgIG51bTEgPSAwOworICAgIGZvciAoaSA9IGRlZ19vbWVnYTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChvbWVnYVtpXSAhPSBBMCkKKwludW0xICBePSBBTFBIQV9UT1tNT0ROTihvbWVnYVtpXSArIGkgKiByb290W2pdKV07CisgICAgfQorICAgIG51bTIgPSBBTFBIQV9UT1tNT0ROTihyb290W2pdICogKEZDUiAtIDEpICsgTk4pXTsKKyAgICBkZW4gPSAwOworICAgIAorICAgIC8qIGxhbWJkYVtpKzFdIGZvciBpIGV2ZW4gaXMgdGhlIGZvcm1hbCBkZXJpdmF0aXZlIGxhbWJkYV9wciBvZiBsYW1iZGFbaV0gKi8KKyAgICBmb3IgKGkgPSBNSU4oZGVnX2xhbWJkYSxOUk9PVFMtMSkgJiB+MTsgaSA+PSAwOyBpIC09MikgeworICAgICAgaWYobGFtYmRhW2krMV0gIT0gQTApCisJZGVuIF49IEFMUEhBX1RPW01PRE5OKGxhbWJkYVtpKzFdICsgaSAqIHJvb3Rbal0pXTsKKyAgICB9CisjaWYgREVCVUcgPj0gMQorICAgIGlmIChkZW4gPT0gMCkgeworICAgICAgcHJpbnRmKCJcbiBFUlJPUjogZGVub21pbmF0b3IgPSAwXG4iKTsKKyAgICAgIGNvdW50ID0gLTE7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBBcHBseSBlcnJvciB0byBkYXRhICovCisgICAgaWYgKG51bTEgIT0gMCAmJiBsb2Nbal0gPj0gUEFEKSB7CisgICAgICBkYXRhW2xvY1tqXS1QQURdIF49IEFMUEhBX1RPW01PRE5OKElOREVYX09GW251bTFdICsgSU5ERVhfT0ZbbnVtMl0gKyBOTiAtIElOREVYX09GW2Rlbl0pXTsKKyAgICB9CisgIH0KKyBmaW5pc2g6CisgIGlmKGVyYXNfcG9zICE9IE5VTEwpeworICAgIGZvcihpPTA7aTxjb3VudDtpKyspCisgICAgICBlcmFzX3Bvc1tpXSA9IGxvY1tpXTsKKyAgfQorICByZXR2YWwgPSBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2ZlYy9kZWNvZGVfcnNfOC5jIGIvZmVjL2RlY29kZV9yc184LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1YjBkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kZWNvZGVfcnNfOC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIEdlbmVyYWwgcHVycG9zZSBSZWVkLVNvbG9tb24gZGVjb2RlciBmb3IgOC1iaXQgc3ltYm9scyBvciBsZXNzCisgKiBDb3B5cmlnaHQgMjAwMyBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZml4ZWQuaCIKKworaW50IGRlY29kZV9yc184KGRhdGFfdCAqZGF0YSwgaW50ICplcmFzX3BvcywgaW50IG5vX2VyYXMsIGludCBwYWQpeworICBpbnQgcmV0dmFsOworIAorICBpZihwYWQgPCAwIHx8IHBhZCA+IDIyMil7CisgICAgcmV0dXJuIC0xOworICB9CisKKyNpbmNsdWRlICJkZWNvZGVfcnMuaCIKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9mZWMvZGVjb2RlX3JzX2Njc2RzLmMgYi9mZWMvZGVjb2RlX3JzX2Njc2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyNDZiNAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kZWNvZGVfcnNfY2NzZHMuYwpAQCAtMCwwICsxLDI2IEBACisvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIGFyb3VuZCB0aGUgZml4ZWQgOC1iaXQgZGVjb2RlciwgcGVyZm9ybWluZyB0aGUKKyAqIGJhc2lzIHRyYW5zZm9ybWF0aW9ucyBuZWNlc3NhcnkgdG8gbWVldCB0aGUgQ0NTRFMgc3RhbmRhcmQKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgImNjc2RzLmgiCisjaW5jbHVkZSAiZmVjLmgiCisKK2ludCBkZWNvZGVfcnNfY2NzZHMoZGF0YV90ICpkYXRhLGludCAqZXJhc19wb3MsaW50IG5vX2VyYXMsaW50IHBhZCl7CisgIGludCBpLHI7CisgIGRhdGFfdCBjZGF0YVtOTl07CisKKyAgLyogQ29udmVydCBkYXRhIGZyb20gZHVhbCBiYXNpcyB0byBjb252ZW50aW9uYWwgKi8KKyAgZm9yKGk9MDtpPE5OLXBhZDtpKyspCisgICAgY2RhdGFbaV0gPSBUYWwxdGFiW2RhdGFbaV1dOworCisgIHIgPSBkZWNvZGVfcnNfOChjZGF0YSxlcmFzX3Bvcyxub19lcmFzLHBhZCk7CisKKyAgaWYociA+IDApeworICAgIC8qIENvbnZlcnQgZnJvbSBjb252ZW50aW9uYWwgdG8gZHVhbCBiYXNpcyAqLworICAgIGZvcihpPTA7aTxOTi1wYWQ7aSsrKQorICAgICAgZGF0YVtpXSA9IFRhbHRhYltjZGF0YVtpXV07CisgIH0KKyAgcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9mZWMvZGVjb2RlX3JzX2NoYXIuYyBiL2ZlYy9kZWNvZGVfcnNfY2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDUyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZGVjb2RlX3JzX2NoYXIuYwpAQCAtMCwwICsxLDIyIEBACisvKiBHZW5lcmFsIHB1cnBvc2UgUmVlZC1Tb2xvbW9uIGRlY29kZXIgZm9yIDgtYml0IHN5bWJvbHMgb3IgbGVzcworICogQ29weXJpZ2h0IDIwMDMgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNoYXIuaCIKKyNpbmNsdWRlICJycy1jb21tb24uaCIKKworaW50IGRlY29kZV9yc19jaGFyKHZvaWQgKnAsIGRhdGFfdCAqZGF0YSwgaW50ICplcmFzX3BvcywgaW50IG5vX2VyYXMpeworICBpbnQgcmV0dmFsOworICBzdHJ1Y3QgcnMgKnJzID0gKHN0cnVjdCBycyAqKXA7CisgCisjaW5jbHVkZSAiZGVjb2RlX3JzLmgiCisgIAorICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZmVjL2RlY29kZV9yc19pbnQuYyBiL2ZlYy9kZWNvZGVfcnNfaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmMWExZgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kZWNvZGVfcnNfaW50LmMKQEAgLTAsMCArMSwyMiBAQAorLyogR2VuZXJhbCBwdXJwb3NlIFJlZWQtU29sb21vbiBkZWNvZGVyCisgKiBDb3B5cmlnaHQgMjAwMyBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50LmgiCisjaW5jbHVkZSAicnMtY29tbW9uLmgiCisKK2ludCBkZWNvZGVfcnNfaW50KHZvaWQgKnAsIGRhdGFfdCAqZGF0YSwgaW50ICplcmFzX3BvcywgaW50IG5vX2VyYXMpeworICBpbnQgcmV0dmFsOworICBzdHJ1Y3QgcnMgKnJzID0gKHN0cnVjdCBycyAqKXA7CisgCisjaW5jbHVkZSAiZGVjb2RlX3JzLmgiCisgIAorICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZmVjL2RvdHByb2QuYyBiL2ZlYy9kb3Rwcm9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZTkxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kb3Rwcm9kLmMKQEAgLTAsMCArMSw5NCBAQAorLyogMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGRvdCBwcm9kdWN0CisgKiBTd2l0Y2ggdG8gYXBwcm9wcmlhdGUgdmVyc2lvbnMKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybgorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordm9pZCAqaW5pdGRwX3BvcnQoc2lnbmVkIHNob3J0IGNvZWZmc1tdLGludCBsZW4pOworbG9uZyBkb3Rwcm9kX3BvcnQodm9pZCAqcCxzaWduZWQgc2hvcnQgKmIpOwordm9pZCBmcmVlZHBfcG9ydCh2b2lkICpwKTsKKworI2lmZGVmIF9faTM4Nl9fCit2b2lkICppbml0ZHBfbW14KHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKTsKK3ZvaWQgKmluaXRkcF9zc2UyKHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKTsKK2xvbmcgZG90cHJvZF9tbXgodm9pZCAqcCxzaWduZWQgc2hvcnQgKmIpOworbG9uZyBkb3Rwcm9kX3NzZTIodm9pZCAqcCxzaWduZWQgc2hvcnQgKmIpOwordm9pZCBmcmVlZHBfbW14KHZvaWQgKnApOwordm9pZCBmcmVlZHBfc3NlMih2b2lkICpwKTsKKyNlbmRpZgorCisjaWZkZWYgX19WRUNfXwordm9pZCAqaW5pdGRwX2F2KHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKTsKK2xvbmcgZG90cHJvZF9hdih2b2lkICpwLHNpZ25lZCBzaG9ydCAqYik7Cit2b2lkIGZyZWVkcF9hdih2b2lkICpwKTsKKyNlbmRpZgorCisvKiBDcmVhdGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IgZm9yIHVzZSB3aXRoIHRoZSBkb3QgcHJvZHVjdCBmdW5jdGlvbiAqLwordm9pZCAqaW5pdGRwKHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKXsKKyAgZmluZF9jcHVfbW9kZSgpOworCisgIHN3aXRjaChDcHVfbW9kZSl7CisgIGNhc2UgUE9SVDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gaW5pdGRwX3BvcnQoY29lZmZzLGxlbik7CisjaWZkZWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgIGNhc2UgU1NFOgorICAgIHJldHVybiBpbml0ZHBfbW14KGNvZWZmcyxsZW4pOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIGluaXRkcF9zc2UyKGNvZWZmcyxsZW4pOworI2VuZGlmCisKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICByZXR1cm4gaW5pdGRwX2F2KGNvZWZmcyxsZW4pOworI2VuZGlmCisgIH0KK30KKworCisvKiBGcmVlIGEgZG90IHByb2R1Y3QgZGVzY3JpcHRvciBjcmVhdGVkIGVhcmxpZXIgKi8KK3ZvaWQgZnJlZWRwKHZvaWQgKnApeworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisjaWZkZWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgIGNhc2UgU1NFOgorICAgIHJldHVybiBmcmVlZHBfbW14KHApOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIGZyZWVkcF9zc2UyKHApOworI2VuZGlmCisjaWZkZWYgX19WRUNfXworICBjYXNlIEFMVElWRUM6CisgICAgcmV0dXJuIGZyZWVkcF9hdihwKTsKKyNlbmRpZgorICB9Cit9CisKKy8qIENvbXB1dGUgYSBkb3QgcHJvZHVjdCBnaXZlbiBhIGRlc2NyaXB0b3IgYW5kIGFuIGlucHV0IGFycmF5CisgKiBUaGUgbGVuZ3RoIGlzIHRha2VuIGZyb20gdGhlIGRlc2NyaXB0b3IKKyAqLworbG9uZyBkb3Rwcm9kKHZvaWQgKnAsc2lnbmVkIHNob3J0IGFbXSl7CisgIHN3aXRjaChDcHVfbW9kZSl7CisgIGNhc2UgUE9SVDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZG90cHJvZF9wb3J0KHAsYSk7CisjaWZkZWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgIGNhc2UgU1NFOgorICAgIHJldHVybiBkb3Rwcm9kX21teChwLGEpOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIGRvdHByb2Rfc3NlMihwLGEpOworI2VuZGlmCisKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICByZXR1cm4gZG90cHJvZF9hdihwLGEpOworI2VuZGlmCisgIH0KK30KKworCmRpZmYgLS1naXQgYS9mZWMvZG90cHJvZC5oIGIvZmVjL2RvdHByb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYyYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2RvdHByb2QuaApAQCAtMCwwICsxLDE1IEBACisvKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgZG90cHJvZHVjdCBmdW5jdGlvbiAqLworCitzdHJ1Y3QgZG90cHJvZCB7CisgIGludCBsZW47IC8qIE51bWJlciBvZiBjb2VmZmljaWVudHMgKi8KKworICAvKiBPbiBhIE1NWCBvciBTU0UgbWFjaGluZSwgdGhlc2UgaG9sZCA0IGNvcGllcyBvZiB0aGUgY29lZmZpY2llbnRzLAorICAgKiBwcmVzaGlmdGVkIGJ5IDAsMSwyLDMgd29yZHMgdG8gbWVldCBhbGwgcG9zc2libGUgaW5wdXQgZGF0YQorICAgKiBhbGlnbm1lbnRzIChzZWUgSW50ZWwgYXA1NTkgb24gTU1YIGRvdCBwcm9kdWN0cykuCisgICAqCisgICAqIFNTRTIgaXMgc2ltaWxhciwgYnV0IHdpdGggOCB3b3JkcyBhdCBhIHRpbWUKKyAgICoKKyAgICogT24gYSBub24tTU1YIG1hY2hpbmUsIG9ubHkgb25lIGNvcHkgaXMgcHJlc2VudAorICAgKi8KKyAgc2lnbmVkIHNob3J0ICpjb2VmZnNbOF07Cit9OwpkaWZmIC0tZ2l0IGEvZmVjL2RvdHByb2RfYXYuYyBiL2ZlYy9kb3Rwcm9kX2F2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MDQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kb3Rwcm9kX2F2LmMKQEAgLTAsMCArMSw5MyBAQAorLyogMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGRvdCBwcm9kdWN0CisgKiBBbHRpdmVjLWFzc2lzdGVkIHZlcnNpb24KKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybgorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworc3RydWN0IGRvdHByb2QgeworICBpbnQgbGVuOyAvKiBOdW1iZXIgb2YgY29lZmZpY2llbnRzICovCisKKyAgLyogT24gYW4gQWx0aXZlYyBtYWNoaW5lLCB0aGVzZSBob2xkIDggY29waWVzIG9mIHRoZSBjb2VmZmljaWVudHMsCisgICAqIHByZXNoaWZ0ZWQgYnkgMCwxLC4uNyB3b3JkcyB0byBtZWV0IGFsbCBwb3NzaWJsZSBpbnB1dCBkYXRhCisgICAqLworICBzaWduZWQgc2hvcnQgKmNvZWZmc1s4XTsKK307CisKKy8qIENyZWF0ZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvciBmb3IgdXNlIHdpdGggdGhlIGRvdCBwcm9kdWN0IGZ1bmN0aW9uICovCit2b2lkICppbml0ZHBfYXYoc2lnbmVkIHNob3J0IGNvZWZmc1tdLGludCBsZW4peworICBzdHJ1Y3QgZG90cHJvZCAqZHA7CisgIGludCBpLGo7CisKKyAgaWYobGVuID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZHAgPSAoc3RydWN0IGRvdHByb2QgKiljYWxsb2MoMSxzaXplb2Yoc3RydWN0IGRvdHByb2QpKTsKKyAgZHAtPmxlbiA9IGxlbjsKKworICAvKiBNYWtlIDggY29waWVzIG9mIGNvZWZmaWNpZW50cywgb25lIGZvciBlYWNoIGRhdGEgYWxpZ25tZW50LAorICAgKiBlYWNoIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgKi8KKyAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICBkcC0+Y29lZmZzW2ldID0gY2FsbG9jKDErKGxlbitpLTEpLzgsc2l6ZW9mKHZlY3RvciBzaWduZWQgc2hvcnQpKTsKKyAgICBmb3Ioaj0wO2o8bGVuO2orKykKKyAgICAgIGRwLT5jb2VmZnNbaV1baitpXSA9IGNvZWZmc1tqXTsKKyAgfQorICByZXR1cm4gKHZvaWQgKilkcDsKK30KKworCisvKiBGcmVlIGEgZG90IHByb2R1Y3QgZGVzY3JpcHRvciBjcmVhdGVkIGVhcmxpZXIgKi8KK3ZvaWQgZnJlZWRwX2F2KHZvaWQgKnApeworICBzdHJ1Y3QgZG90cHJvZCAqZHAgPSAoc3RydWN0IGRvdHByb2QgKilwOworICBpbnQgaTsKKworICBmb3IoaT0wO2k8ODtpKyspCisgICAgaWYoZHAtPmNvZWZmc1tpXSAhPSBOVUxMKQorICAgICAgZnJlZShkcC0+Y29lZmZzW2ldKTsKKyAgZnJlZShkcCk7Cit9CisKKy8qIENvbXB1dGUgYSBkb3QgcHJvZHVjdCBnaXZlbiBhIGRlc2NyaXB0b3IgYW5kIGFuIGlucHV0IGFycmF5CisgKiBUaGUgbGVuZ3RoIGlzIHRha2VuIGZyb20gdGhlIGRlc2NyaXB0b3IKKyAqLworbG9uZyBkb3Rwcm9kX2F2KHZvaWQgKnAsc2lnbmVkIHNob3J0IGFbXSl7CisgIHN0cnVjdCBkb3Rwcm9kICpkcCA9IChzdHJ1Y3QgZG90cHJvZCAqKXA7CisgIGludCBhbDsKKyAgdmVjdG9yIHNpZ25lZCBzaG9ydCAqYXIsKmQ7CisgIHZlY3RvciBzaWduZWQgaW50IHN1bXMwLHN1bXMxLHN1bXMyLHN1bXMzOworICB1bmlvbiB7IHZlY3RvciBzaWduZWQgaW50IHY7IHNpZ25lZCBpbnQgd1s0XTt9IHM7CisgIGludCBuYmxvY2tzOworICAgIAorICAvKiByb3VuZCBhciBkb3duIHRvIGJlZ2lubmluZyBvZiAxNi1ieXRlIGJsb2NrIGNvbnRhaW5pbmcgMHRoIGVsZW1lbnQgb2YKKyAgICogaW5wdXQgYnVmZmVyLiBUaGVuIHNldCBkIHRvIG9uZSBvZiA4IHNldHMgb2Ygc2hpZnRlZCBjb2VmZmljaWVudHMKKyAgICovCisgIGFyID0gKHZlY3RvciBzaWduZWQgc2hvcnQgKikoKGludClhICYgfjE1KTsKKyAgYWwgPSAoKGludClhICYgMTUpL3NpemVvZihzaWduZWQgc2hvcnQpOworICBkID0gKHZlY3RvciBzaWduZWQgc2hvcnQgKilkcC0+Y29lZmZzW2FsXTsKKyAgCisgIG5ibG9ja3MgPSAoZHAtPmxlbithbC0xKS84KzE7CisgIAorICAvKiBTdW0gaW50byBmb3VyIHZlY3RvcnMgZWFjaCBob2xkaW5nIGZvdXIgMzItYml0IHBhcnRpYWwgc3VtcyAqLworICBzdW1zMyA9IHN1bXMyID0gc3VtczEgPSBzdW1zMCA9ICh2ZWN0b3Igc2lnbmVkIGludCkoMCk7CisgIHdoaWxlKG5ibG9ja3MgPj0gNCl7CisgICAgc3VtczAgPSB2ZWNfbXN1bXMoYXJbbmJsb2Nrcy0xXSxkW25ibG9ja3MtMV0sc3VtczApOworICAgIHN1bXMxID0gdmVjX21zdW1zKGFyW25ibG9ja3MtMl0sZFtuYmxvY2tzLTJdLHN1bXMxKTsKKyAgICBzdW1zMiA9IHZlY19tc3VtcyhhcltuYmxvY2tzLTNdLGRbbmJsb2Nrcy0zXSxzdW1zMik7CisgICAgc3VtczMgPSB2ZWNfbXN1bXMoYXJbbmJsb2Nrcy00XSxkW25ibG9ja3MtNF0sc3VtczMpOworICAgIG5ibG9ja3MgLT0gNDsKKyAgfQorICBzdW1zMCA9IHZlY19hZGRzKHN1bXMwLHN1bXMxKTsKKyAgc3VtczIgPSB2ZWNfYWRkcyhzdW1zMixzdW1zMyk7CisgIHN1bXMwID0gdmVjX2FkZHMoc3VtczAsc3VtczIpOworICB3aGlsZShuYmxvY2tzLS0gPiAwKXsKKyAgICBzdW1zMCA9IHZlY19tc3VtcyhhcltuYmxvY2tzXSxkW25ibG9ja3NdLHN1bXMwKTsKKyAgfQorICAvKiBTdW0gNCBwYXJ0aWFsIHN1bXMgaW50byBmaW5hbCByZXN1bHQgKi8KKyAgcy52ID0gdmVjX3N1bXMoc3VtczAsKHZlY3RvciBzaWduZWQgaW50KSgwKSk7CisgIAorICByZXR1cm4gcy53WzNdOworfQorCisKZGlmZiAtLWdpdCBhL2ZlYy9kb3Rwcm9kX21teC5jIGIvZmVjL2RvdHByb2RfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxNmFmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kb3Rwcm9kX21teC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIDE2LWJpdCBzaWduZWQgaW50ZWdlciBkb3QgcHJvZHVjdAorICogTU1YIGFzc2lzdGVkIHZlcnNpb247IGFsc28gZm9yIFNTRQorICoKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybgorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworc3RydWN0IGRvdHByb2QgeworICBpbnQgbGVuOyAvKiBOdW1iZXIgb2YgY29lZmZpY2llbnRzICovCisKKyAgLyogT24gYSBNTVggb3IgU1NFIG1hY2hpbmUsIHRoZXNlIGhvbGQgNCBjb3BpZXMgb2YgdGhlIGNvZWZmaWNpZW50cywKKyAgICogcHJlc2hpZnRlZCBieSAwLDEsMiwzIHdvcmRzIHRvIG1lZXQgYWxsIHBvc3NpYmxlIGlucHV0IGRhdGEKKyAgICogYWxpZ25tZW50cyAoc2VlIEludGVsIGFwNTU5IG9uIE1NWCBkb3QgcHJvZHVjdHMpLgorICAgKi8KKyAgc2lnbmVkIHNob3J0ICpjb2VmZnNbNF07Cit9OworbG9uZyBkb3Rwcm9kX21teF9hc3Npc3Qoc2lnbmVkIHNob3J0ICphLHNpZ25lZCBzaG9ydCAqYixpbnQgY250KTsKKworLyogQ3JlYXRlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yIGZvciB1c2Ugd2l0aCB0aGUgZG90IHByb2R1Y3QgZnVuY3Rpb24gKi8KK3ZvaWQgKmluaXRkcF9tbXgoc2lnbmVkIHNob3J0IGNvZWZmc1tdLGludCBsZW4peworICBzdHJ1Y3QgZG90cHJvZCAqZHA7CisgIGludCBpLGo7CisKKworICBpZihsZW4gPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkcCA9IChzdHJ1Y3QgZG90cHJvZCAqKWNhbGxvYygxLHNpemVvZihzdHJ1Y3QgZG90cHJvZCkpOworICBkcC0+bGVuID0gbGVuOworCisgIC8qIE1ha2UgNCBjb3BpZXMgb2YgY29lZmZpY2llbnRzLCBvbmUgZm9yIGVhY2ggZGF0YSBhbGlnbm1lbnQgKi8KKyAgZm9yKGk9MDtpPDQ7aSsrKXsKKyAgICBkcC0+Y29lZmZzW2ldID0gKHNpZ25lZCBzaG9ydCAqKWNhbGxvYygxKyhsZW4raS0xKS80LAorCQkJCQkgICA0KnNpemVvZihzaWduZWQgc2hvcnQpKTsKKyAgICBmb3Ioaj0wO2o8bGVuO2orKykKKyAgICAgIGRwLT5jb2VmZnNbaV1baitpXSA9IGNvZWZmc1tqXTsKKyAgfQorICByZXR1cm4gKHZvaWQgKilkcDsKK30KKworCisvKiBGcmVlIGEgZG90IHByb2R1Y3QgZGVzY3JpcHRvciBjcmVhdGVkIGVhcmxpZXIgKi8KK3ZvaWQgZnJlZWRwX21teCh2b2lkICpwKXsKKyAgc3RydWN0IGRvdHByb2QgKmRwID0gKHN0cnVjdCBkb3Rwcm9kICopcDsKKyAgaW50IGk7CisKKyAgZm9yKGk9MDtpPDQ7aSsrKQorICAgIGlmKGRwLT5jb2VmZnNbaV0gIT0gTlVMTCkKKyAgICAgIGZyZWUoZHAtPmNvZWZmc1tpXSk7CisgIGZyZWUoZHApOworfQorCisvKiBDb21wdXRlIGEgZG90IHByb2R1Y3QgZ2l2ZW4gYSBkZXNjcmlwdG9yIGFuZCBhbiBpbnB1dCBhcnJheQorICogVGhlIGxlbmd0aCBpcyB0YWtlbiBmcm9tIHRoZSBkZXNjcmlwdG9yCisgKi8KK2xvbmcgZG90cHJvZF9tbXgodm9pZCAqcCxzaWduZWQgc2hvcnQgYVtdKXsKKyAgc3RydWN0IGRvdHByb2QgKmRwID0gKHN0cnVjdCBkb3Rwcm9kICopcDsKKyAgaW50IGFsOworICBzaWduZWQgc2hvcnQgKmFyOworICAgICAgCisgIC8qIFJvdW5kIGlucHV0IGRhdGEgYWRkcmVzcyBkb3duIHRvIDggYnl0ZSBib3VuZGFyeQorICAgKiBOQjogZGVwZW5kaW5nIG9uIHRoZSBhbGlnbm1lbnQgb2YgYVtdLCBtZW1vcnkKKyAgICogYmVmb3JlIGFbXSB3aWxsIGJlIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgZG9uJ3QgbWF0dGVyIHNpbmNlIHRoZXknbGwKKyAgICogYmUgbXVsdGlwbGllZCBieSB6ZXJvIGNvZWZmaWNpZW50cy4gSSBjYW4ndCBjb25jZWl2ZSBvZiBhbnkKKyAgICogc2l0dWF0aW9uIHdoZXJlIHRoaXMgY291bGQgY2F1c2UgYSBzZWdmYXVsdCBzaW5jZSBtZW1vcnkgcHJvdGVjdGlvbgorICAgKiBpbiB0aGUgeDg2IG1hY2hpbmVzIGlzIGRvbmUgb24gbXVjaCBsYXJnZXIgYm91bmRhcmllcworICAgKi8KKyAgYXIgPSAoc2lnbmVkIHNob3J0ICopKChpbnQpYSAmIH43KTsKKyAgCisgIC8qIENob29zZSBvbmUgb2YgNCBzZXRzIG9mIHByZS1zaGlmdGVkIGNvZWZmaWNpZW50cy4gYWwgaXMgYm90aCB0aGUKKyAgICogaW5kZXggaW50byBkcC0+Y29lZmZzW10gYW5kIHRoZSBudW1iZXIgb2YgMCB3b3JkcyBwYWRkZWQgb250bworICAgKiB0aGF0IGNvZWZmaWNpZW50cyBhcnJheSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzCisgICAqLworICBhbCA9IGEgLSBhcjsKKyAgCisgIC8qIENhbGwgYXNzZW1ibGVyIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmssIHBhc3NpbmcgbnVtYmVyIG9mIDQtd29yZCBibG9ja3MgKi8KKyAgcmV0dXJuIGRvdHByb2RfbW14X2Fzc2lzdChhcixkcC0+Y29lZmZzW2FsXSwoZHAtPmxlbithbC0xKS80KzEpOworfQorCmRpZmYgLS1naXQgYS9mZWMvZG90cHJvZF9tbXhfYXNzaXN0LnMgYi9mZWMvZG90cHJvZF9tbXhfYXNzaXN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9kb3Rwcm9kX21teF9hc3Npc3QucwpAQCAtMCwwICsxLDgzIEBACisjIFNJTUQgTU1YIGRvdCBwcm9kdWN0CisjIEVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBDIGNvZGU6CisjIGxvbmcgZG90cHJvZChzaWduZWQgc2hvcnQgKmEsc2lnbmVkIHNob3J0ICpiLGludCBjbnQpCisjIHsKKyMJbG9uZyBzdW0gPSAwOyAKKyMJY250ICo9IDQ7IAorIwl3aGlsZShjbnQtLSkKKyMJCXN1bSArPSAqYSsrICsgKmIrKzsKKyMJcmV0dXJuIHN1bTsKKyMgfQorIyBhIGFuZCBiIHNob3VsZCBhbHNvIGJlIDY0LWJpdCBhbGlnbmVkLCBvciBzcGVlZCB3aWxsIHN1ZmZlciBncmVhdGx5CisjIENvcHlyaWdodCAxOTk5LCBQaGlsIEthcm4gS0E5UQorIyBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKwkKKwkudGV4dAorCS5nbG9iYWwgZG90cHJvZF9tbXhfYXNzaXN0CisJLnR5cGUgZG90cHJvZF9tbXhfYXNzaXN0LEBmdW5jdGlvbgorZG90cHJvZF9tbXhfYXNzaXN0OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKwltb3ZsIDgoJWVicCksJWVzaQkjIGEKKwltb3ZsIDEyKCVlYnApLCVlZGkJIyBiCisJbW92bCAxNiglZWJwKSwlZWN4CSMgY250CisJcHhvciAlbW0wLCVtbTAJCSMgY2xlYXIgcnVubmluZyBzdW0gKGluIHR3byAzMi1iaXQgaGFsdmVzKQorCQorIyBNTVggZG90IHByb2R1Y3QgbG9vcCB1bnJvbGxlZCA0IHRpbWVzLCBjcnVuY2hpbmcgMTYgdGVybXMgcGVyIGxvb3AKKwkuYWxpZ24gMTYKKy5Mb29wMToJc3VibCAkNCwlZWN4CisJamwgICAuTG9vcDFEb25lCisJCisJbW92cSAoJWVzaSksJW1tMQkjIG1tMSA9IGFbM10sYVsyXSxhWzFdLGFbMF0KKyAJcG1hZGR3ZCAoJWVkaSksJW1tMQkjIG1tMSA9IGJbM10qYVszXStiWzJdKmFbMl0sYlsxXSphWzFdK2JbMF0qYVswXQorCXBhZGRkICVtbTEsJW1tMAorCQorCW1vdnEgOCglZXNpKSwlbW0xCisJcG1hZGR3ZCA4KCVlZGkpLCVtbTEKKwlwYWRkZCAlbW0xLCVtbTAKKworCW1vdnEgMTYoJWVzaSksJW1tMQorCXBtYWRkd2QgMTYoJWVkaSksJW1tMQorCXBhZGRkICVtbTEsJW1tMAorCisJbW92cSAyNCglZXNpKSwlbW0xCisJYWRkbCAkMzIsJWVzaQkKKwlwbWFkZHdkIDI0KCVlZGkpLCVtbTEKKwlhZGRsICQzMiwlZWRpCQorCXBhZGRkICVtbTEsJW1tMAorCisJam1wIC5Mb29wMQorLkxvb3AxRG9uZToKKwkKKwlhZGRsICQ0LCVlY3gJCisJCisjIE1NWCBkb3QgcHJvZHVjdCBsb29wLCBub3QgdW5yb2xsZWQsIGNydW5jaGluZyA0IHRlcm1zIHBlciBsb29wCisjIFRoaXMgY291bGQgYmUgcmVkb25lIGFzIER1ZmYncyBEZXZpY2Ugb24gdGhlIHVucm9sbGVkIGxvb3AgYWJvdmUKKy5Mb29wMjoJc3VibCAkMSwlZWN4CisJamwgICAuTG9vcDJEb25lCisJCisJbW92cSAoJWVzaSksJW1tMQorCWFkZGwgJDgsJWVzaQorCXBtYWRkd2QgKCVlZGkpLCVtbTEKKwlhZGRsICQ4LCVlZGkKKwlwYWRkZCAlbW0xLCVtbTAKKwlqbXAgLkxvb3AyCisuTG9vcDJEb25lOgorCQorCW1vdmQgJW1tMCwlZWJ4CQkjIHJpZ2h0LWhhbmQgd29yZCB0byBlYngKKwlwdW5wY2toZHEgJW1tMCwlbW0wCSMgbGVmdC1oYW5kIHdvcmQgdG8gcmlnaHQgc2lkZSBvZiAlbW0wCisJbW92ZCAlbW0wLCVlYXgKKwlhZGRsICVlYngsJWVheAkJIyBydW5uaW5nIHN1bSBub3cgaW4gJWVheAorCWVtbXMJCQkjIGRvbmUgd2l0aCBNTVgKKwkKKwlwb3BsICVlYngKKwlwb3BsICVlY3gKKwlwb3BsICVlZGkKKwlwb3BsICVlc2kKKwltb3ZsICVlYnAsJWVzcAorCXBvcGwgJWVicAorCXJldApkaWZmIC0tZ2l0IGEvZmVjL2RvdHByb2RfcG9ydC5jIGIvZmVjL2RvdHByb2RfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZG90cHJvZF9wb3J0LmMKQEAgLTAsMCArMSw1OCBAQAorLyogMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGRvdCBwcm9kdWN0CisgKiBQb3J0YWJsZSBDIHZlcnNpb24KKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybgorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworc3RydWN0IGRvdHByb2QgeworICBpbnQgbGVuOyAvKiBOdW1iZXIgb2YgY29lZmZpY2llbnRzICovCisKKyAgc2lnbmVkIHNob3J0ICpjb2VmZnM7Cit9OworCisvKiBDcmVhdGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IgZm9yIHVzZSB3aXRoIHRoZSBkb3QgcHJvZHVjdCBmdW5jdGlvbiAqLwordm9pZCAqaW5pdGRwX3BvcnQoc2lnbmVkIHNob3J0IGNvZWZmc1tdLGludCBsZW4peworICBzdHJ1Y3QgZG90cHJvZCAqZHA7CisgIGludCBqOworCisgIGlmKGxlbiA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIGRwID0gKHN0cnVjdCBkb3Rwcm9kICopY2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBkb3Rwcm9kKSk7CisgIGRwLT5sZW4gPSBsZW47CisKKyAgLyogSnVzdCBvbmUgY29weSBvZiB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgQyB2ZXJzaW9uICovCisgIGRwLT5jb2VmZnMgPSAoc2lnbmVkIHNob3J0ICopY2FsbG9jKGxlbixzaXplb2Yoc2lnbmVkIHNob3J0KSk7CisgIGZvcihqPTA7ajxsZW47aisrKQorICAgIGRwLT5jb2VmZnNbal0gPSBjb2VmZnNbal07CisgIHJldHVybiAodm9pZCAqKWRwOworfQorCisKKy8qIEZyZWUgYSBkb3QgcHJvZHVjdCBkZXNjcmlwdG9yIGNyZWF0ZWQgZWFybGllciAqLwordm9pZCBmcmVlZHBfcG9ydCh2b2lkICpwKXsKKyAgc3RydWN0IGRvdHByb2QgKmRwID0gKHN0cnVjdCBkb3Rwcm9kICopcDsKKworICBpZihkcC0+Y29lZmZzICE9IE5VTEwpCisgICAgICBmcmVlKGRwLT5jb2VmZnMpOworICBmcmVlKGRwKTsKK30KKworLyogQ29tcHV0ZSBhIGRvdCBwcm9kdWN0IGdpdmVuIGEgZGVzY3JpcHRvciBhbmQgYW4gaW5wdXQgYXJyYXkKKyAqIFRoZSBsZW5ndGggaXMgdGFrZW4gZnJvbSB0aGUgZGVzY3JpcHRvcgorICovCitsb25nIGRvdHByb2RfcG9ydCh2b2lkICpwLHNpZ25lZCBzaG9ydCBhW10peworICBzdHJ1Y3QgZG90cHJvZCAqZHAgPSAoc3RydWN0IGRvdHByb2QgKilwOworICBsb25nIGNvcnI7CisgIGludCBpOworCisgIGNvcnIgPSAwOworICBmb3IoaT0wO2k8ZHAtPmxlbjtpKyspeworICAgIGNvcnIgKz0gKGxvbmcpYVtpXSAqIGRwLT5jb2VmZnNbaV07CisgIH0KKyAgcmV0dXJuIGNvcnI7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZmVjL2RvdHByb2Rfc3NlMi5jIGIvZmVjL2RvdHByb2Rfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGRkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZG90cHJvZF9zc2UyLmMKQEAgLTAsMCArMSw3MiBAQAorLyogMTYtYml0IHNpZ25lZCBpbnRlZ2VyIGRvdCBwcm9kdWN0CisgKiBTU0UyIHZlcnNpb24KKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybgorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworc3RydWN0IGRvdHByb2QgeworICBpbnQgbGVuOyAvKiBOdW1iZXIgb2YgY29lZmZpY2llbnRzICovCisKKyAgLyogT24gYSBTU0UyIG1hY2hpbmUsIHRoZXNlIGhvbGQgOCBjb3BpZXMgb2YgdGhlIGNvZWZmaWNpZW50cywKKyAgICogcHJlc2hpZnRlZCBieSAwLDEsLi43IHdvcmRzIHRvIG1lZXQgYWxsIHBvc3NpYmxlIGlucHV0IGRhdGEKKyAgICogYWxpZ25tZW50cyAoc2VlIEludGVsIGFwNTU5IG9uIE1NWCBkb3QgcHJvZHVjdHMpLgorICAgKi8KKyAgc2lnbmVkIHNob3J0ICpjb2VmZnNbOF07Cit9OworCitsb25nIGRvdHByb2Rfc3NlMl9hc3Npc3Qoc2lnbmVkIHNob3J0ICphLHNpZ25lZCBzaG9ydCAqYixpbnQgY250KTsKKworLyogQ3JlYXRlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yIGZvciB1c2Ugd2l0aCB0aGUgZG90IHByb2R1Y3QgZnVuY3Rpb24gKi8KK3ZvaWQgKmluaXRkcF9zc2UyKHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKXsKKyAgc3RydWN0IGRvdHByb2QgKmRwOworICBpbnQgaSxqLGJsa3NpemU7CisKKyAgaWYobGVuID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZHAgPSAoc3RydWN0IGRvdHByb2QgKiljYWxsb2MoMSxzaXplb2Yoc3RydWN0IGRvdHByb2QpKTsKKyAgZHAtPmxlbiA9IGxlbjsKKworICAvKiBNYWtlIDggY29waWVzIG9mIGNvZWZmaWNpZW50cywgb25lIGZvciBlYWNoIGRhdGEgYWxpZ25tZW50LAorICAgKiBlYWNoIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgKi8KKyAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICBibGtzaXplID0gKDErKGxlbitpLTEpLzgpICogOCpzaXplb2Yoc2lnbmVkIHNob3J0KTsKKyAgICBwb3NpeF9tZW1hbGlnbigodm9pZCAqKikmZHAtPmNvZWZmc1tpXSwxNixibGtzaXplKTsKKyAgICBtZW1zZXQoZHAtPmNvZWZmc1tpXSwwLGJsa3NpemUpOworICAgIGZvcihqPTA7ajxsZW47aisrKQorICAgICAgZHAtPmNvZWZmc1tpXVtqK2ldID0gY29lZmZzW2pdOworICB9CisgIHJldHVybiAodm9pZCAqKWRwOworfQorCisKKy8qIEZyZWUgYSBkb3QgcHJvZHVjdCBkZXNjcmlwdG9yIGNyZWF0ZWQgZWFybGllciAqLwordm9pZCBmcmVlZHBfc3NlMih2b2lkICpwKXsKKyAgc3RydWN0IGRvdHByb2QgKmRwID0gKHN0cnVjdCBkb3Rwcm9kICopcDsKKyAgaW50IGk7CisKKyAgZm9yKGk9MDtpPDg7aSsrKQorICAgIGlmKGRwLT5jb2VmZnNbaV0gIT0gTlVMTCkKKyAgICAgIGZyZWUoZHAtPmNvZWZmc1tpXSk7CisgIGZyZWUoZHApOworfQorCisvKiBDb21wdXRlIGEgZG90IHByb2R1Y3QgZ2l2ZW4gYSBkZXNjcmlwdG9yIGFuZCBhbiBpbnB1dCBhcnJheQorICogVGhlIGxlbmd0aCBpcyB0YWtlbiBmcm9tIHRoZSBkZXNjcmlwdG9yCisgKi8KK2xvbmcgZG90cHJvZF9zc2UyKHZvaWQgKnAsc2lnbmVkIHNob3J0IGFbXSl7CisgIHN0cnVjdCBkb3Rwcm9kICpkcCA9IChzdHJ1Y3QgZG90cHJvZCAqKXA7CisgIGludCBhbDsKKyAgc2lnbmVkIHNob3J0ICphcjsKKyAgCisgIGFyID0gKHNpZ25lZCBzaG9ydCAqKSgoaW50KWEgJiB+MTUpOworICBhbCA9IGEgLSBhcjsKKyAgCisgIC8qIENhbGwgYXNzZW1ibGVyIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmssIHBhc3NpbmcgbnVtYmVyIG9mIDgtd29yZCBibG9ja3MgKi8KKyAgcmV0dXJuIGRvdHByb2Rfc3NlMl9hc3Npc3QoYXIsZHAtPmNvZWZmc1thbF0sKGRwLT5sZW4rYWwtMSkvOCsxKTsKK30KZGlmZiAtLWdpdCBhL2ZlYy9kb3Rwcm9kX3NzZTJfYXNzaXN0LnMgYi9mZWMvZG90cHJvZF9zc2UyX2Fzc2lzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZG90cHJvZF9zc2UyX2Fzc2lzdC5zCkBAIC0wLDAgKzEsODUgQEAKKyMgU0lNRCBTU0UyIGRvdCBwcm9kdWN0CisjIEVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBDIGNvZGU6CisjIGxvbmcgZG90cHJvZChzaWduZWQgc2hvcnQgKmEsc2lnbmVkIHNob3J0ICpiLGludCBjbnQpCisjIHsKKyMJbG9uZyBzdW0gPSAwOyAKKyMJY250ICo9IDg7IAorIwl3aGlsZShjbnQtLSkKKyMJCXN1bSArPSAqYSsrICsgKmIrKzsKKyMJcmV0dXJuIHN1bTsKKyMgfQorIyBhIGFuZCBiIG11c3QgYmUgMTI4LWJpdCBhbGlnbmVkCisjIENvcHlyaWdodCAyMDAxLCBQaGlsIEthcm4gS0E5UQorIyBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKwkKKwkudGV4dAorCS5nbG9iYWwgZG90cHJvZF9zc2UyX2Fzc2lzdAorCS50eXBlIGRvdHByb2Rfc3NlMl9hc3Npc3QsQGZ1bmN0aW9uCitkb3Rwcm9kX3NzZTJfYXNzaXN0OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKwltb3ZsIDgoJWVicCksJWVzaQkjIGEKKwltb3ZsIDEyKCVlYnApLCVlZGkJIyBiCisJbW92bCAxNiglZWJwKSwlZWN4CSMgY250CisJcHhvciAleG1tMCwleG1tMAkJIyBjbGVhciBydW5uaW5nIHN1bSAoaW4gdHdvIDMyLWJpdCBoYWx2ZXMpCisJCisjIFNTRTIgZG90IHByb2R1Y3QgbG9vcCB1bnJvbGxlZCA0IHRpbWVzLCBjcnVuY2hpbmcgMzIgdGVybXMgcGVyIGxvb3AKKwkuYWxpZ24gMTYKKy5Mb29wMToJc3VibCAkNCwlZWN4CisJamwgICAuTG9vcDFEb25lCisJCisJbW92ZHFhICglZXNpKSwleG1tMQorIAlwbWFkZHdkICglZWRpKSwleG1tMQorCXBhZGRkICV4bW0xLCV4bW0wCisJCisJbW92ZHFhIDE2KCVlc2kpLCV4bW0xCisJcG1hZGR3ZCAxNiglZWRpKSwleG1tMQorCXBhZGRkICV4bW0xLCV4bW0wCisKKwltb3ZkcWEgMzIoJWVzaSksJXhtbTEKKwlwbWFkZHdkIDMyKCVlZGkpLCV4bW0xCisJcGFkZGQgJXhtbTEsJXhtbTAKKworCW1vdmRxYSA0OCglZXNpKSwleG1tMQorCWFkZGwgJDY0LCVlc2kJCisJcG1hZGR3ZCA0OCglZWRpKSwleG1tMQorCWFkZGwgJDY0LCVlZGkJCisJcGFkZGQgJXhtbTEsJXhtbTAKKworCWptcCAuTG9vcDEKKy5Mb29wMURvbmU6CisJCisJYWRkbCAkNCwlZWN4CQorCQorIyBTU0UyIGRvdCBwcm9kdWN0IGxvb3AsIG5vdCB1bnJvbGxlZCwgY3J1bmNoaW5nIDQgdGVybXMgcGVyIGxvb3AKKyMgVGhpcyBjb3VsZCBiZSByZWRvbmUgYXMgRHVmZidzIERldmljZSBvbiB0aGUgdW5yb2xsZWQgbG9vcCBhYm92ZQorLkxvb3AyOglzdWJsICQxLCVlY3gKKwlqbCAgIC5Mb29wMkRvbmUKKwkKKwltb3ZkcWEgKCVlc2kpLCV4bW0xCisJYWRkbCAkMTYsJWVzaQorCXBtYWRkd2QgKCVlZGkpLCV4bW0xCisJYWRkbCAkMTYsJWVkaQorCXBhZGRkICV4bW0xLCV4bW0wCisJam1wIC5Mb29wMgorLkxvb3AyRG9uZToKKworCW1vdmRxYSAleG1tMCwleG1tMQorCXBzcmxkcSAkOCwleG1tMAorCXBhZGRkICV4bW0xLCV4bW0wCisJbW92ZCAleG1tMCwlZWF4CQkjIHJpZ2h0LWhhbmQgd29yZCB0byBlYXgKKwlwc3JsZHEgJDQsJXhtbTAKKwltb3ZkICV4bW0wLCVlYngKKwlhZGRsICVlYngsJWVheAorCisJcG9wbCAlZWJ4CisJcG9wbCAlZWN4CisJcG9wbCAlZWRpCisJcG9wbCAlZXNpCisJbW92bCAlZWJwLCVlc3AKKwlwb3BsICVlYnAKKwlyZXQKZGlmZiAtLWdpdCBhL2ZlYy9kc3AuMyBiL2ZlYy9kc3AuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc5NGRhCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2RzcC4zCkBAIC0wLDAgKzEsNjMgQEAKKy5USCBEU1AgMworLlNIIE5BTUUKK2luaXRkcCwgZnJlZWRwLCBkb3Rwcm9kLCBzdW1zcSwgcGVha3ZhbCAtXCBTSU1ELWFzc2lzdGVkCitkaWdpdGFsIHNpZ25hbCBwcm9jZXNzaW5nIHByaW1pdGl2ZXMKKy5TSCBTWU5PUFNJUworLm5mCisuZnQKKyNpbmNsdWRlICJmZWMuaCIKKwordm9pZCAqaW5pdGRwKHNpZ25lZCBzaG9ydCAqY29lZmZzLGludCBsZW4pOworbG9uZyBkb3Rwcm9kKHZvaWQgKnAsc2lnbmVkIHNob3J0ICphKTsKK3ZvaWQgZnJlZWRwKHZvaWQgKnApOworCit1bnNpZ25lZCBsb25nIGxvbmcgc3Vtc3Eoc2lnbmVkIHNob3J0ICppbixpbnQgY250KTsKKworaW50IHBlYWt2YWwoc2lnbmVkIHNob3J0ICpiLGludCBjbnQpOworCisuU0ggREVTQ1JJUFRJT04KK1RoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIHNldmVyYWwgYmFzaWMgcHJpbWl0aXZlcyB1c2VmdWwgaW4gZGlnaXRhbAorc2lnbmFsIHByb2Nlc3NpbmcgKERTUCksIGVzcGVjaWFsbHkgaW4gbW9kZW1zLiAgVGhlIFxmQmluaXRkcFxmUiwKK1xmQmRvdHByb2RcZlIgYW5kIFxmQmZyZWVkcFxmUiBmdW5jdGlvbnMgaW1wbGVtZW50IGFuIGludGVnZXIgZG90Citwcm9kdWN0IHVzZWZ1bCBpbiBjb3JyZWxhdGlvbiBhbmQgZmlsdGVyaW5nIG9wZXJhdGlvbnMgb24gc2lnbmVkCisxNi1iaXQgaW50ZWdlcnMuIFxmQnN1bXNxXGZSIGNvbXB1dGVzIHRoZSBzdW0KK29mIHRoZSBzcXVhcmVzIG9mIGFuIGFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMsCit1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgZW5lcmd5IG9mIGEgc2lnbmFsLiBcZkJwZWFrdmFsXGZSIHJldHVybnMgdGhlCithYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCBtYWdpdHVkZSBlbGVtZW50IGluIHRoZSBpbnB1dCBhcnJheSwKK3VzZWZ1bCBmb3Igc2NhbGluZyBhIHNpZ25hbCdzIGFtcGxpdHVkZS4KKworRWFjaCBmdW5jdGlvbiB1c2VzIElBMzIgb3IgUG93ZXJQQyBBbHRpdmVjIGluc3RydWN0aW9ucyB3aGVuCithdmFpbGFibGU7IG90aGVyd2lzZSwgYSBwb3J0YWJsZSBDIHZlcnNpb24gaXMgdXNlZC4KKworLlNIIFVTQUdFCitUbyBjcmVhdGUgYSBGSVIgZmlsdGVyIG9yIGNvcnJlbGF0b3IsIGNhbGwgXGZCaW5pdGRwXGZSIHdpdGggdGhlCitjb2VmZmljaWVudHMgaW4gXGZCY29lZmZcZlIgYW5kIHRoZWlyIG51bWJlciBpbiBcZkJsZW5cZlIuICBUaGlzCitjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHJldHVybnMgYSBoYW5kbGUuCisKK1RvIGNvbXB1dGUgYSBkb3QgcHJvZHVjdCwgcGFzcyB0aGUgaGFuZGxlIGZyb20gXGZCaW5pdGRwXGZSIGFuZCB0aGUKK2lucHV0IGFycmF5IHRvIFxmQmRvdHByb2RcZlIuIE5vIGxlbmd0aCBmaWVsZCBpcyBuZWVkZWQgYXMgdGhlIG51bWJlcgorb2Ygc2FtcGxlcyB3aWxsIGJlIHRha2VuIGZyb20gdGhlIFxmQmxlblxmUiBwYXJhbWV0ZXIgb3JpZ2luYWxseSBnaXZlbgordG8gXGZCaW5pdGRwXGZSLiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGFzIG1hbnkgc2FtcGxlcyBpbiB0aGUgaW5wdXQKK2FycmF5IGFzIHRoZXJlIHdlcmUgY29lZmZpY2llbnRzIHBhc3NlZCB0byBcZkJpbml0ZHBcZlIuCisKK1doZW4gdGhlIGZpbHRlciBvciBjb3JyZWxhdG9yIGlzIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBkYXRhIHN0cnVjdHVyZXMKK21heSBiZSBmcmVlZCBieSBwYXNzaW5nIHRoZSBoYW5kbGUgdG8gXGZCZnJlZWRwXGZSLgorCitUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3Igc2NhbGluZyB0aGUgaW5wdXRzIHRvIFxmQmluaXRkcFxmUiBhbmQKK1xmQmRvdHByb2RcZlIsIGFzIHRoZSAzMi1iaXQgcmVzdWx0IGZyb20gXGZCZG90cHJvZFxmUiB3aWxsIHNpbGVudGx5Cit3cmFwIGFyb3VuZCBpbiB0aGUgZXZlbnQgb2Ygb3ZlcmZsb3cuCisKK1RvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiBhbiBhcnJheSBvZiBzaWduZWQgMTYtYml0CitpbnRlZ2VycywgdXNlIHN1bXNxXGZSLiBUaGlzIHJldHVybnMgYSA2NCBiaXQgc3VtLgorCitcZkJwZWFrdmFsXGZSIGNvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIDE2LWJpdCBlbGVtZW50IGluCit0aGUgaW5wdXQgYXJyYXkgYW5kIHJldHVybnMgdGhlIGxhcmdlc3QuCisKKy5TSCBSRVRVUk4gVkFMVUVTCisKK1xmQmluaXRkcFxmUiByZXR1cm5zIGEgaGFuZGxlIHRoYXQgcG9pbnRzIHRvIGEgY29udHJvbCBibG9jaywgb3IgTlVMTCBpbgordGhlIGV2ZW50IG9mIGFuIGVycm9yIChzdWNoIGFzIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSkuIFxmQnN1bXNxXGZSCithbmQgXGZCcGVha3ZhbFxmUiBoYXZlIG5vIGVycm9yIHJldHVybnMuCisKKy5TSCBBVVRIT1IgYW5kIENPUFlSSUdIVAorUGhpbCBLYXJuLCBLQTlRIChrYXJuQGthOXEubmV0KQpkaWZmIC0tZ2l0IGEvZmVjL2R0ZXN0LmMgYi9mZWMvZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTRjYjAzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2R0ZXN0LmMKQEAgLTAsMCArMSw5OSBAQAorLyogVGVzdCBkb3QtcHJvZHVjdCBmdW5jdGlvbiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSAiZmVjLmgiCisKKyNpZiBIQVZFX0dFVE9QVF9MT05HCitzdHJ1Y3Qgb3B0aW9uIE9wdGlvbnNbXSA9IHsKKyAgeyJmb3JjZS1hbHRpdmVjIiwwLE5VTEwsJ2EnfSwKKyAgeyJmb3JjZS1wb3J0IiwwLE5VTEwsJ3AnfSwKKyAgeyJmb3JjZS1tbXgiLDAsTlVMTCwnbSd9LAorICB7ImZvcmNlLXNzZSIsMCxOVUxMLCdzJ30sCisgIHsiZm9yY2Utc3NlMiIsMCxOVUxMLCd0J30sCisgIHsidHJpYWxzIiwwLE5VTEwsJ24nfSwKKyAge05VTEx9LAorfTsKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10peworICBzaG9ydCBjb2VmZnNbNTEyXTsKKyAgc2hvcnQgaW5wdXRbMjA0OF07CisgIGludCB0cmlhbHM9MTAwMCxkOworICBpbnQgZXJyb3JzID0gMDsKKworI2lmIEhBVkVfR0VUT1BUX0xPTkcKKyAgd2hpbGUoKGQgPSBnZXRvcHRfbG9uZyhhcmdjLGFyZ3YsImFwbXN0bjoiLE9wdGlvbnMsTlVMTCkpICE9IEVPRil7CisjZWxzZQorICB3aGlsZSgoZCA9IGdldG9wdChhcmdjLGFyZ3YsImFwbXN0bjoiKSkgIT0gRU9GKXsKKyNlbmRpZgorICAgIHN3aXRjaChkKXsKKyAgICBjYXNlICdhJzoKKyAgICAgIENwdV9tb2RlID0gQUxUSVZFQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgQ3B1X21vZGUgPSBQT1JUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICBDcHVfbW9kZSA9IE1NWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgQ3B1X21vZGUgPSBTU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgIENwdV9tb2RlID0gU1NFMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgorICAgICAgdHJpYWxzID0gYXRvaShvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgd2hpbGUodHJpYWxzLS0peworICAgIGxvbmcgcG9ydF9yZXN1bHQ7CisgICAgbG9uZyBzaW1kX3Jlc3VsdDsKKyAgICBpbnQgbnRhcHM7CisgICAgaW50IGk7CisgICAgaW50IGNzdW0gPSAwOworICAgIGludCBvZmZzZXQ7CisgICAgdm9pZCAqZHBfc2ltZCwqZHBfcG9ydDsKKworICAgIC8qIEdlbmVyYXRlIHNldCBvZiBjb2VmZmljaWVudHMKKyAgICAgKiBsaW1pdCBzdW0gb2YgYWJzb2x1dGUgdmFsdWVzIHRvIDMyNzY3IHRvIGF2b2lkIG92ZXJmbG93CisgICAgICovCisgICAgbWVtc2V0KGNvZWZmcywwLHNpemVvZihjb2VmZnMpKTsKKyAgICBmb3IoaT0wO2k8NTEyO2krKyl7CisgICAgICBkb3VibGUgZ3Y7CisKKyAgICAgIGd2ID0gbm9ybWFsX3JhbmQoMC4sMTAwLik7CisgICAgICBpZihjc3VtICsgZmFicyhndikgPiAzMjc2NykKKwlicmVhazsKKyAgICAgIGNvZWZmc1tpXSA9IGd2OworICAgICAgY3N1bSArPSBmYWJzKGd2KTsKKyAgICB9CisgICAgbnRhcHMgPSBpOworCisgICAgLyogQ29tcGFyZSByZXN1bHRzIHRvIHBvcnRhYmxlIEMgdmVyc2lvbiBmb3IgYSBidW5jaCBvZiByYW5kb20gZGF0YSBidWZmZXJzIGFuZCBvZmZzZXRzICovCisgICAgZHBfc2ltZCA9IGluaXRkcChjb2VmZnMsbnRhcHMpOworICAgIGRwX3BvcnQgPSBpbml0ZHBfcG9ydChjb2VmZnMsbnRhcHMpOworICAgIAorICAgIGZvcihpPTA7aTwyMDQ4O2krKykKKyAgICAgIGlucHV0W2ldID0gcmFuZG9tKCk7CisgICAgCisgICAgb2Zmc2V0ID0gcmFuZG9tKCkgJiA1MTE7CisKKyAgICBzaW1kX3Jlc3VsdCA9IGRvdHByb2QoZHBfc2ltZCxpbnB1dCtvZmZzZXQpOworICAgIHBvcnRfcmVzdWx0ID0gZG90cHJvZF9wb3J0KGRwX3BvcnQsaW5wdXQrb2Zmc2V0KTsKKyAgICBpZihzaW1kX3Jlc3VsdCAhPSBwb3J0X3Jlc3VsdCl7CisgICAgICBlcnJvcnMrKzsKKyAgICB9CisgIH0KKyAgcHJpbnRmKCJkdGVzdDogJWQgZXJyb3JzXG4iLGVycm9ycyk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9mZWMvZW5jb2RlX3JzLmMgYi9mZWMvZW5jb2RlX3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0OTA5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9lbmNvZGVfcnMuYwpAQCAtMCwwICsxLDUyIEBACisvKiBSZWVkLVNvbG9tb24gZW5jb2RlcgorICogQ29weXJpZ2h0IDIwMDIsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEZJWEVECisjaW5jbHVkZSAiZml4ZWQuaCIKKyNlbGlmIGRlZmluZWQoQklHU1lNKQorI2luY2x1ZGUgImludC5oIgorI2Vsc2UKKyNpbmNsdWRlICJjaGFyLmgiCisjZW5kaWYKKwordm9pZCBFTkNPREVfUlMoCisjaWZkZWYgRklYRUQKK2RhdGFfdCAqZGF0YSwgZGF0YV90ICpiYixpbnQgcGFkKXsKKyNlbHNlCit2b2lkICpwLGRhdGFfdCAqZGF0YSwgZGF0YV90ICpiYil7CisgIHN0cnVjdCBycyAqcnMgPSAoc3RydWN0IHJzICopcDsKKyNlbmRpZgorICBpbnQgaSwgajsKKyAgZGF0YV90IGZlZWRiYWNrOworCisjaWZkZWYgRklYRUQKKyAgLyogQ2hlY2sgcGFkIHBhcmFtZXRlciBmb3IgdmFsaWRpdHkgKi8KKyAgaWYocGFkIDwgMCB8fCBwYWQgPj0gTk4pCisgICAgcmV0dXJuOworI2VuZGlmCisKKyAgbWVtc2V0KGJiLDAsTlJPT1RTKnNpemVvZihkYXRhX3QpKTsKKworICBmb3IoaT0wO2k8Tk4tTlJPT1RTLVBBRDtpKyspeworICAgIGZlZWRiYWNrID0gSU5ERVhfT0ZbZGF0YVtpXSBeIGJiWzBdXTsKKyAgICBpZihmZWVkYmFjayAhPSBBMCl7ICAgICAgLyogZmVlZGJhY2sgdGVybSBpcyBub24temVybyAqLworI2lmZGVmIFVOTk9STUFMSVpFRAorICAgICAgLyogVGhpcyBsaW5lIGlzIHVubmVjZXNzYXJ5IHdoZW4gR0VOUE9MWVtOUk9PVFNdIGlzIHVuaXR5LCBhcyBpdCBtdXN0CisgICAgICAgKiBhbHdheXMgYmUgZm9yIHRoZSBwb2x5bm9taWFscyBjb25zdHJ1Y3RlZCBieSBpbml0X3JzKCkKKyAgICAgICAqLworICAgICAgZmVlZGJhY2sgPSBNT0ROTihOTiAtIEdFTlBPTFlbTlJPT1RTXSArIGZlZWRiYWNrKTsKKyNlbmRpZgorICAgICAgZm9yKGo9MTtqPE5ST09UUztqKyspCisJYmJbal0gXj0gQUxQSEFfVE9bTU9ETk4oZmVlZGJhY2sgKyBHRU5QT0xZW05ST09UUy1qXSldOworICAgIH0KKyAgICAvKiBTaGlmdCAqLworICAgIG1lbW1vdmUoJmJiWzBdLCZiYlsxXSxzaXplb2YoZGF0YV90KSooTlJPT1RTLTEpKTsKKyAgICBpZihmZWVkYmFjayAhPSBBMCkKKyAgICAgIGJiW05ST09UUy0xXSA9IEFMUEhBX1RPW01PRE5OKGZlZWRiYWNrICsgR0VOUE9MWVswXSldOworICAgIGVsc2UKKyAgICAgIGJiW05ST09UUy0xXSA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZlYy9lbmNvZGVfcnMuaCBiL2ZlYy9lbmNvZGVfcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE1N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL2VuY29kZV9ycy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIFRoZSBndXRzIG9mIHRoZSBSZWVkLVNvbG9tb24gZW5jb2RlciwgbWVhbnQgdG8gYmUgI2luY2x1ZGVkCisgKiBpbnRvIGEgZnVuY3Rpb24gYm9keSB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZWRlZnMsIG1hY3JvcyBhbmQgdmFyaWFibGVzIHN1cHBsaWVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIGNvZGUgcGFyYW1ldGVyczoKKworICogZGF0YV90IC0gYSB0eXBlZGVmIGZvciB0aGUgZGF0YSBzeW1ib2wKKyAqIGRhdGFfdCBkYXRhW10gLSBhcnJheSBvZiBOTi1OUk9PVFMtUEFEIGFuZCB0eXBlIGRhdGFfdCB0byBiZSBlbmNvZGVkCisgKiBkYXRhX3QgcGFyaXR5W10gLSBhbiBhcnJheSBvZiBOUk9PVFMgYW5kIHR5cGUgZGF0YV90IHRvIGJlIHdyaXR0ZW4gd2l0aCBwYXJpdHkgc3ltYm9scworICogTlJPT1RTIC0gdGhlIG51bWJlciBvZiByb290cyBpbiB0aGUgUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCwKKyAqICAgICAgICAgIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgcGFyaXR5IHN5bWJvbHMgaW4gYSBibG9jay4KKyAgICAgICAgICAgIEludGVnZXIgdmFyaWFibGUgb3IgbGl0ZXJhbC4KKwkgICAgKiAKKyAqIE5OIC0gdGhlIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGluIGEgUlMgYmxvY2suIEludGVnZXIgdmFyaWFibGUgb3IgbGl0ZXJhbC4KKyAqIFBBRCAtIHRoZSBudW1iZXIgb2YgcGFkIHN5bWJvbHMgaW4gYSBibG9jay4gSW50ZWdlciB2YXJpYWJsZSBvciBsaXRlcmFsLgorICogQUxQSEFfVE8gLSBUaGUgYWRkcmVzcyBvZiBhbiBhcnJheSBvZiBOTiBlbGVtZW50cyB0byBjb252ZXJ0IEdhbG9pcyBmaWVsZAorICogICAgICAgICAgICBlbGVtZW50cyBpbiBpbmRleCAobG9nKSBmb3JtIHRvIHBvbHlub21pYWwgZm9ybS4gUmVhZCBvbmx5LgorICogSU5ERVhfT0YgLSBUaGUgYWRkcmVzcyBvZiBhbiBhcnJheSBvZiBOTiBlbGVtZW50cyB0byBjb252ZXJ0IEdhbG9pcyBmaWVsZAorICogICAgICAgICAgICBlbGVtZW50cyBpbiBwb2x5bm9taWFsIGZvcm0gdG8gaW5kZXggKGxvZykgZm9ybS4gUmVhZCBvbmx5LgorICogTU9ETk4gLSBhIGZ1bmN0aW9uIHRvIHJlZHVjZSBpdHMgYXJndW1lbnQgbW9kdWxvIE5OLiBNYXkgYmUgaW5saW5lIG9yIGEgbWFjcm8uCisgKiBHRU5QT0xZIC0gYW4gYXJyYXkgb2YgTlJPT1RTKzEgZWxlbWVudHMgY29udGFpbmluZyB0aGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgaW4gaW5kZXggZm9ybQorCisgKiBUaGUgbWVtc2V0KCkgYW5kIG1lbW1vdmUoKSBmdW5jdGlvbnMgYXJlIHVzZWQuIFRoZSBhcHByb3ByaWF0ZSBoZWFkZXIKKyAqIGZpbGUgZGVjbGFyaW5nIHRoZXNlIGZ1bmN0aW9ucyAodXN1YWxseSA8c3RyaW5nLmg+KSBtdXN0IGJlIGluY2x1ZGVkIGJ5IHRoZSBjYWxsaW5nCisgKiBwcm9ncmFtLgorCisgKiBDb3B5cmlnaHQgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworCisKKyN1bmRlZiBBMAorI2RlZmluZSBBMCAoTk4pIC8qIFNwZWNpYWwgcmVzZXJ2ZWQgdmFsdWUgZW5jb2RpbmcgemVybyBpbiBpbmRleCBmb3JtICovCisKK3sKKyAgaW50IGksIGo7CisgIGRhdGFfdCBmZWVkYmFjazsKKworICBtZW1zZXQocGFyaXR5LDAsTlJPT1RTKnNpemVvZihkYXRhX3QpKTsKKworICBmb3IoaT0wO2k8Tk4tTlJPT1RTLVBBRDtpKyspeworICAgIGZlZWRiYWNrID0gSU5ERVhfT0ZbZGF0YVtpXSBeIHBhcml0eVswXV07CisgICAgaWYoZmVlZGJhY2sgIT0gQTApeyAgICAgIC8qIGZlZWRiYWNrIHRlcm0gaXMgbm9uLXplcm8gKi8KKyNpZmRlZiBVTk5PUk1BTElaRUQKKyAgICAgIC8qIFRoaXMgbGluZSBpcyB1bm5lY2Vzc2FyeSB3aGVuIEdFTlBPTFlbTlJPT1RTXSBpcyB1bml0eSwgYXMgaXQgbXVzdAorICAgICAgICogYWx3YXlzIGJlIGZvciB0aGUgcG9seW5vbWlhbHMgY29uc3RydWN0ZWQgYnkgaW5pdF9ycygpCisgICAgICAgKi8KKyAgICAgIGZlZWRiYWNrID0gTU9ETk4oTk4gLSBHRU5QT0xZW05ST09UU10gKyBmZWVkYmFjayk7CisjZW5kaWYKKyAgICAgIGZvcihqPTE7ajxOUk9PVFM7aisrKQorCXBhcml0eVtqXSBePSBBTFBIQV9UT1tNT0ROTihmZWVkYmFjayArIEdFTlBPTFlbTlJPT1RTLWpdKV07CisgICAgfQorICAgIC8qIFNoaWZ0ICovCisgICAgbWVtbW92ZSgmcGFyaXR5WzBdLCZwYXJpdHlbMV0sc2l6ZW9mKGRhdGFfdCkqKE5ST09UUy0xKSk7CisgICAgaWYoZmVlZGJhY2sgIT0gQTApCisgICAgICBwYXJpdHlbTlJPT1RTLTFdID0gQUxQSEFfVE9bTU9ETk4oZmVlZGJhY2sgKyBHRU5QT0xZWzBdKV07CisgICAgZWxzZQorICAgICAgcGFyaXR5W05ST09UUy0xXSA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZlYy9lbmNvZGVfcnNfOC5jIGIvZmVjL2VuY29kZV9yc184LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhZWNjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9lbmNvZGVfcnNfOC5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiBSZWVkLVNvbG9tb24gZW5jb2RlcgorICogQ29weXJpZ2h0IDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmaXhlZC5oIgorI2lmZGVmIF9fVkVDX18KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKworCitzdGF0aWMgZW51bSB7VU5LTk9XTj0wLE1NWCxTU0UsU1NFMixBTFRJVkVDLFBPUlR9IGNwdV9tb2RlOworCitzdGF0aWMgdm9pZCBlbmNvZGVfcnNfOF9jKGRhdGFfdCAqZGF0YSwgZGF0YV90ICpwYXJpdHksaW50IHBhZCk7CisjaWYgX192ZWNfXworc3RhdGljIHZvaWQgZW5jb2RlX3JzXzhfYXYoZGF0YV90ICpkYXRhLCBkYXRhX3QgKnBhcml0eSxpbnQgcGFkKTsKKyNlbmRpZgorI2lmIF9faTM4Nl9fCitpbnQgY3B1X2ZlYXR1cmVzKHZvaWQpOworI2VuZGlmCisKK3ZvaWQgZW5jb2RlX3JzXzgoZGF0YV90ICpkYXRhLCBkYXRhX3QgKnBhcml0eSxpbnQgcGFkKXsKKyAgaWYoY3B1X21vZGUgPT0gVU5LTk9XTil7CisjaWZkZWYgX19pMzg2X18KKyAgICBpbnQgZjsKKyAgICAvKiBGaWd1cmUgb3V0IHdoYXQga2luZCBvZiBDUFUgd2UgaGF2ZSAqLworICAgIGYgPSBjcHVfZmVhdHVyZXMoKTsKKyAgICBpZihmICYgKDE8PDI2KSl7IC8qIFNTRTIgaXMgcHJlc2VudCAqLworICAgICAgY3B1X21vZGUgPSBTU0UyOworICAgIH0gZWxzZSBpZihmICYgKDE8PDI1KSl7IC8qIFNTRSBpcyBwcmVzZW50ICovCisgICAgICBjcHVfbW9kZSA9IFNTRTsKKyAgICB9IGVsc2UgaWYoZiAmICgxPDwyMykpeyAvKiBNTVggaXMgcHJlc2VudCAqLworICAgICAgY3B1X21vZGUgPSBNTVg7CisgICAgfSBlbHNlIHsgLyogTm8gU0lNRCBhdCBhbGwgKi8KKyAgICAgIGNwdV9tb2RlID0gUE9SVDsKKyAgICB9CisjZWxpZiBfX1ZFQ19fCisgICAgLyogQXNrIHRoZSBPUyBpZiB3ZSBoYXZlIEFsdGl2ZWMgc3VwcG9ydCAqLworICAgIGludCBzZWxlY3RvcnNbMl0gPSB7IENUTF9IVywgSFdfVkVDVE9SVU5JVCB9OworICAgIGludCBoYXNWZWN0b3JVbml0ID0gMDsKKyAgICBzaXplX3QgbGVuZ3RoID0gc2l6ZW9mKGhhc1ZlY3RvclVuaXQpOworICAgIGludCBlcnJvciA9IHN5c2N0bChzZWxlY3RvcnMsIDIsICZoYXNWZWN0b3JVbml0LCAmbGVuZ3RoLCBOVUxMLCAwKTsKKyAgICBpZigwID09IGVycm9yICYmIGhhc1ZlY3RvclVuaXQpCisgICAgICBjcHVfbW9kZSA9IEFMVElWRUM7CisgICAgZWxzZQorICAgICAgY3B1X21vZGUgPSBQT1JUOworI2Vsc2UKKyAgICBjcHVfbW9kZSA9IFBPUlQ7CisjZW5kaWYKKyAgfQorICBzd2l0Y2goY3B1X21vZGUpeworI2lmIF9fdmVjX18KKyAgY2FzZSBBTFRJVkVDOgorICAgIGVuY29kZV9yc184X2F2KGRhdGEscGFyaXR5LHBhZCk7CisgICAgcmV0dXJuOworI2VuZGlmCisjaWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgIGNhc2UgU1NFOgorICBjYXNlIFNTRTI6CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBlbmNvZGVfcnNfOF9jKGRhdGEscGFyaXR5LHBhZCk7CisgICAgcmV0dXJuOworICB9Cit9CisKKyNpZiBfX3ZlY19fIC8qIFBvd2VyUEMgRzQvRzUgQWx0aXZlYyBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSAqLworCitzdGF0aWMgdmVjdG9yIHVuc2lnbmVkIGNoYXIgcmV2ZXJzZSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCwxNSwxNCwxMywxMiwxMSwxMCw5LDgsNyw2LDUsNCwzLDIsMSk7CitzdGF0aWMgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc2hpZnRfcmlnaHQgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwKTsKKworLyogTG9va3VwIHRhYmxlIGZvciBmZWVkYmFjayBtdWx0aXBsaWNhdGlvbnMKKyAqIFRoZXNlIGFyZSB0aGUgbG93IGhhbGYgb2YgdGhlIGNvZWZmaWNpZW50cy4gU2luY2UgdGhlIGdlbmVyYXRvciBwb2x5bm9taWFsIGlzCisgKiBwYWxpbmRyb21pYywgd2UgZm9ybSB0aGUgb3RoZXIgaGFsZiBieSByZXZlcnNpbmcgdGhpcyBvbmUKKyAqLworZXh0ZXJuIHN0YXRpYyB1bmlvbiB7IHZlY3RvciB1bnNpZ25lZCBjaGFyIHY7IHVuc2lnbmVkIGNoYXIgY1sxNl07IH0gdGFibGVbMjU2XTsKKworc3RhdGljIHZvaWQgZW5jb2RlX3JzXzhfYXYoZGF0YV90ICpkYXRhLCBkYXRhX3QgKnBhcml0eSxpbnQgcGFkKXsKKyAgdW5pb24geyB2ZWN0b3IgdW5zaWduZWQgY2hhciB2WzJdOyB1bnNpZ25lZCBjaGFyIGNbMzJdOyB9IHNoaWZ0X3JlZ2lzdGVyOworICBpbnQgaTsKKworICBzaGlmdF9yZWdpc3Rlci52WzBdID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKTsKKyAgc2hpZnRfcmVnaXN0ZXIudlsxXSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCk7CisgIAorICBmb3IoaT0wO2k8Tk4tTlJPT1RTLXBhZDtpKyspeworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIGZlZWRiYWNrMCxmZWVkYmFjazE7CisgICAgdW5zaWduZWQgY2hhciBmOworCisgICAgZiA9IGRhdGFbaV0gXiBzaGlmdF9yZWdpc3Rlci5jWzMxXTsKKyAgICBmZWVkYmFjazEgPSB0YWJsZVtmXS52OworICAgIGZlZWRiYWNrMCA9IHZlY19wZXJtKGZlZWRiYWNrMSxmZWVkYmFjazEscmV2ZXJzZSk7CisKKyAgICAvKiBTaGlmdCByaWdodCBvbmUgYnl0ZSAqLworICAgIHNoaWZ0X3JlZ2lzdGVyLnZbMV0gPSB2ZWNfcGVybShzaGlmdF9yZWdpc3Rlci52WzBdLHNoaWZ0X3JlZ2lzdGVyLnZbMV0sc2hpZnRfcmlnaHQpIF4gZmVlZGJhY2sxOworICAgIHNoaWZ0X3JlZ2lzdGVyLnZbMF0gPSB2ZWNfc3JvKHNoaWZ0X3JlZ2lzdGVyLnZbMF0sKHZlY3RvciB1bnNpZ25lZCBjaGFyKSg4KSkgXiBmZWVkYmFjazA7CisgICAgc2hpZnRfcmVnaXN0ZXIuY1swXSA9IGY7CisgIH0KKyAgZm9yKGk9MDtpPE5ST09UUztpKyspCisgICAgcGFyaXR5W05ST09UUy1pLTFdID0gc2hpZnRfcmVnaXN0ZXIuY1tpXTsKK30KKyNlbmRpZgorCisvKiBQb3J0YWJsZSBDIHZlcnNpb24gKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9yc184X2MoZGF0YV90ICpkYXRhLCBkYXRhX3QgKnBhcml0eSxpbnQgcGFkKXsKKworI2luY2x1ZGUgImVuY29kZV9ycy5oIgorCit9CmRpZmYgLS1naXQgYS9mZWMvZW5jb2RlX3JzX2F2LmMgYi9mZWMvZW5jb2RlX3JzX2F2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlNTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9lbmNvZGVfcnNfYXYuYwpAQCAtMCwwICsxLDYxIEBACisvKiBGYXN0IFJlZWQtU29sb21vbiBlbmNvZGVyIGZvciAoMjU1LDIyMykgQ0NTRFMgY29kZSBvbiBQb3dlclBDIEc0L0c1IHVzaW5nIEFsdGl2ZWMgaW5zdHJ1Y3Rpb25zCisgKiBDb3B5cmlnaHQgMjAwNCwgUGhpbCBLYXJuIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmaXhlZC5oIgorCisvKiBMb29rdXAgdGFibGUgZm9yIGZlZWRiYWNrIG11bHRpcGxpY2F0aW9ucworICogVGhlc2UgYXJlIHRoZSBsb3cgaGFsZiBvZiB0aGUgY29lZmZpY2llbnRzLiBTaW5jZSB0aGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgaXMKKyAqIHBhbGluZHJvbWljLCB3ZSBmb3JtIGl0IGJ5IHJldmVyc2luZyB0aGVzZSBvbiB0aGUgZmx5CisgKi8KK3N0YXRpYyB1bmlvbiB7IHZlY3RvciB1bnNpZ25lZCBjaGFyIHY7IHVuc2lnbmVkIGNoYXIgY1sxNl07IH0gdGFibGVbMjU2XTsKKworc3RhdGljIHZlY3RvciB1bnNpZ25lZCBjaGFyIHJldmVyc2UgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDAsMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEpOworc3RhdGljIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNoaWZ0X3JpZ2h0ID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCk7CisKK2V4dGVybiBkYXRhX3QgQ0NTRFNfYWxwaGFfdG9bXTsKK2V4dGVybiBkYXRhX3QgQ0NTRFNfaW5kZXhfb2ZbXTsKK2V4dGVybiBkYXRhX3QgQ0NTRFNfcG9seVtdOworCit2b2lkIHJzX2luaXRfYXYoKXsKKyAgaW50IGksajsKKworICAvKiBUaGUgUG93ZXJQQyBpcyBiaWctZW5kaWFuLCBzbyB0aGUgbG93LW9yZGVyIGJ5dGUgb2YgZWFjaCB2ZWN0b3IgY29udGFpbnMgdGhlIGhpZ2hlc3Qgb3JkZXIgdGVybSBpbiB0aGUgcG9seW5vbWlhbCAqLworICBmb3Ioaj0wO2o8MTY7aisrKXsKKyAgICB0YWJsZVswXS5jW2pdID0gMDsKKyAgICBmb3IoaT0xO2k8MjU2O2krKyl7CisgICAgICB0YWJsZVtpXS5jWzE2LWotMV0gPSBDQ1NEU19hbHBoYV90b1tNT0ROTihDQ1NEU19wb2x5W2orMV0gKyBDQ1NEU19pbmRleF9vZltpXSldOworICAgIH0KKyAgfQorI2lmIDAKKyAgZm9yKGk9MDtpPDI1NjtpKyspeworICAgIHByaW50ZigidGFibGVbJTNkXSA9ICUzdnVcbiIsaSx0YWJsZVtpXS52KTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgZW5jb2RlX3JzX2F2KHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgY2hhciAqcGFyaXR5LGludCBwYWQpeworICB1bmlvbiB7IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZbMl07IHVuc2lnbmVkIGNoYXIgY1szMl07IH0gc2hpZnRfcmVnaXN0ZXI7CisgIGludCBpOworCisgIHNoaWZ0X3JlZ2lzdGVyLnZbMF0gPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDApOworICBzaGlmdF9yZWdpc3Rlci52WzFdID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgwKTsKKyAgCisgIGZvcihpPTA7aTxOTi1OUk9PVFMtcGFkO2krKyl7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgZmVlZGJhY2swLGZlZWRiYWNrMTsKKyAgICB1bnNpZ25lZCBjaGFyIGY7CisKKyAgICBmID0gZGF0YVtpXSBeIHNoaWZ0X3JlZ2lzdGVyLmNbMzFdOworICAgIGZlZWRiYWNrMSA9IHRhYmxlW2ZdLnY7CisgICAgZmVlZGJhY2swID0gdmVjX3Blcm0oZmVlZGJhY2sxLGZlZWRiYWNrMSxyZXZlcnNlKTsKKworICAgIC8qIFNoaWZ0IHJpZ2h0IG9uZSBieXRlICovCisgICAgc2hpZnRfcmVnaXN0ZXIudlsxXSA9IHZlY19wZXJtKHNoaWZ0X3JlZ2lzdGVyLnZbMF0sc2hpZnRfcmVnaXN0ZXIudlsxXSxzaGlmdF9yaWdodCkgXiBmZWVkYmFjazE7CisgICAgc2hpZnRfcmVnaXN0ZXIudlswXSA9IHZlY19zcm8oc2hpZnRfcmVnaXN0ZXIudlswXSwodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDgpKSBeIGZlZWRiYWNrMDsKKyAgICBzaGlmdF9yZWdpc3Rlci5jWzBdID0gZjsKKyAgfQorICBmb3IoaT0wO2k8TlJPT1RTO2krKykKKyAgICBwYXJpdHlbTlJPT1RTLWktMV0gPSBzaGlmdF9yZWdpc3Rlci5jW2ldOworfQpkaWZmIC0tZ2l0IGEvZmVjL2VuY29kZV9yc19jY3Nkcy5jIGIvZmVjL2VuY29kZV9yc19jY3Nkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmVjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZW5jb2RlX3JzX2Njc2RzLmMKQEAgLTAsMCArMSwyNCBAQAorLyogVGhpcyBmdW5jdGlvbiB3cmFwcyBhcm91bmQgdGhlIGZpeGVkIDgtYml0IGVuY29kZXIsIHBlcmZvcm1pbmcgdGhlCisgKiBiYXNpcyB0cmFuc2Zvcm1hdGlvbnMgbmVjZXNzYXJ5IHRvIG1lZXQgdGhlIENDU0RTIHN0YW5kYXJkCisgKgorICogQ29weXJpZ2h0IDIwMDIsIFBoaWwgS2FybiwgS0E5UQorICogZml4ZWQgYnVnIEF1ZyAyMDA3CisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgImNjc2RzLmgiCisjaW5jbHVkZSAiZmVjLmgiCisKK3ZvaWQgZW5jb2RlX3JzX2Njc2RzKGRhdGFfdCAqZGF0YSxkYXRhX3QgKnBhcml0eSxpbnQgcGFkKXsKKyAgaW50IGk7CisgIGRhdGFfdCBjZGF0YVtOTi1OUk9PVFNdOworCisgIC8qIENvbnZlcnQgZGF0YSBmcm9tIGR1YWwgYmFzaXMgdG8gY29udmVudGlvbmFsICovCisgIGZvcihpPTA7aTxOTi1OUk9PVFMtcGFkO2krKykKKyAgICBjZGF0YVtpXSA9IFRhbDF0YWJbZGF0YVtpXV07CisKKyAgZW5jb2RlX3JzXzgoY2RhdGEscGFyaXR5LHBhZCk7CisKKyAgLyogQ29udmVydCBwYXJpdHkgZnJvbSBjb252ZW50aW9uYWwgdG8gZHVhbCBiYXNpcyAqLworICBmb3IoaT0wO2k8TlJPT1RTO2krKykKKyAgICBwYXJpdHlbaV0gPSBUYWx0YWJbcGFyaXR5W2ldXTsKK30KZGlmZiAtLWdpdCBhL2ZlYy9lbmNvZGVfcnNfY2hhci5jIGIvZmVjL2VuY29kZV9yc19jaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliZjJiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9lbmNvZGVfcnNfY2hhci5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIFJlZWQtU29sb21vbiBlbmNvZGVyCisgKiBDb3B5cmlnaHQgMjAwMiwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY2hhci5oIgorI2luY2x1ZGUgInJzLWNvbW1vbi5oIgorCit2b2lkIGVuY29kZV9yc19jaGFyKHZvaWQgKnAsZGF0YV90ICpkYXRhLCBkYXRhX3QgKnBhcml0eSl7CisgIHN0cnVjdCBycyAqcnMgPSAoc3RydWN0IHJzICopcDsKKworI2luY2x1ZGUgImVuY29kZV9ycy5oIgorCit9CmRpZmYgLS1naXQgYS9mZWMvZW5jb2RlX3JzX2ludC5jIGIvZmVjL2VuY29kZV9yc19pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzljZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL2VuY29kZV9yc19pbnQuYwpAQCAtMCwwICsxLDE1IEBACisvKiBSZWVkLVNvbG9tb24gZW5jb2RlcgorICogQ29weXJpZ2h0IDIwMDMsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludC5oIgorI2luY2x1ZGUgInJzLWNvbW1vbi5oIgorCit2b2lkIGVuY29kZV9yc19pbnQodm9pZCAqcCxkYXRhX3QgKmRhdGEsIGRhdGFfdCAqcGFyaXR5KXsKKyAgc3RydWN0IHJzICpycyA9IChzdHJ1Y3QgcnMgKilwOworCisjaW5jbHVkZSAiZW5jb2RlX3JzLmgiCisKK30KZGlmZiAtLWdpdCBhL2ZlYy9leGVyY2lzZS5jIGIvZmVjL2V4ZXJjaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlMDA4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9leGVyY2lzZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBFeGVyY2lzZSBhbiBSUyBjb2RlYyBhIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgdXNpbmcgcmFuZG9tCisgKiBkYXRhIGFuZCBlcnJvciBwYXR0ZXJucworICoKKyAqIENvcHlyaWdodCAyMDAyIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNkZWZpbmUgRkxBR19FUkFTVVJFIDEgLyogUmFuZG9tbHkgZmxhZyA1MCUgb2YgZXJyb3JzIGFzIGVyYXN1cmVzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgRklYRUQKKyNpbmNsdWRlICJmaXhlZC5oIgorI2RlZmluZSBFWEVSQ0lTRSBleGVyY2lzZV84CisjZWxpZiBkZWZpbmVkKENDU0RTKQorI2luY2x1ZGUgImZpeGVkLmgiCisjaW5jbHVkZSAiY2NzZHMuaCIKKyNkZWZpbmUgRVhFUkNJU0UgZXhlcmNpc2VfY2NzZHMKKyNlbGlmIGRlZmluZWQoQklHU1lNKQorI2luY2x1ZGUgImludC5oIgorI2RlZmluZSBFWEVSQ0lTRSBleGVyY2lzZV9pbnQKKyNlbHNlCisjaW5jbHVkZSAiY2hhci5oIgorI2RlZmluZSBFWEVSQ0lTRSBleGVyY2lzZV9jaGFyCisjZW5kaWYKKworI2lmZGVmIEZJWEVECisjZGVmaW5lIFBSSU5UUEFSTSBwcmludGYoIigyNTUsMjIzKToiKTsKKyNlbGlmIGRlZmluZWQoQ0NTRFMpCisjZGVmaW5lIFBSSU5UUEFSTSBwcmludGYoIkNDU0RTICgyNTUsMjIzKToiKTsKKyNlbHNlCisjZGVmaW5lIFBSSU5UUEFSTSBwcmludGYoIiglZCwlZCk6Iixycy0+bm4scnMtPm5uLXJzLT5ucm9vdHMpOworI2VuZGlmCisKKy8qIEV4ZXJjaXNlIHRoZSBSUyBjb2RlYyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgKi8KK2ludCBFWEVSQ0lTRSgKKyNpZiAhZGVmaW5lZChDQ1NEUykgJiYgIWRlZmluZWQoRklYRUQpCit2b2lkICpwLAorI2VuZGlmCitpbnQgdHJpYWxzKXsKKyNpZiAhZGVmaW5lZChDQ1NEUykgJiYgIWRlZmluZWQoRklYRUQpCisgIHN0cnVjdCBycyAqcnMgPSAoc3RydWN0IHJzICopcDsKKyNlbmRpZgorICBkYXRhX3QgYmxvY2tbTk5dLHRibG9ja1tOTl07CisgIGludCBpOworICBpbnQgZXJyb3JzOworICBpbnQgZXJybG9jc1tOTl07CisgIGludCBkZXJybG9jc1tOUk9PVFNdOworICBpbnQgZGVycm9yczsKKyAgaW50IGVycnZhbCxlcnJsb2M7CisgIGludCBlcmFzdXJlczsKKyAgaW50IGRlY29kZXJfZXJyb3JzID0gMDsKKworICB3aGlsZSh0cmlhbHMtLSAhPSAwKXsKKyAgICAvKiBUZXN0IHVwIHRvIHRoZSBlcnJvciBjb3JyZWN0aW9uIGNhcGFjaXR5IG9mIHRoZSBjb2RlICovCisgICAgZm9yKGVycm9ycz0wO2Vycm9ycyA8PSBOUk9PVFMvMjtlcnJvcnMrKyl7CisKKyAgICAgIC8qIExvYWQgYmxvY2sgd2l0aCByYW5kb20gZGF0YSBhbmQgZW5jb2RlICovCisgICAgICBmb3IoaT0wO2k8Tk4tTlJPT1RTO2krKykKKwlibG9ja1tpXSA9IHJhbmRvbSgpICYgTk47CisgICAgICAKKyNpZiBkZWZpbmVkKENDU0RTKSB8fCBkZWZpbmVkKEZJWEVEKQorICAgICAgRU5DT0RFX1JTKCZibG9ja1swXSwmYmxvY2tbTk4tTlJPT1RTXSwwKTsKKyNlbHNlCisgICAgICBFTkNPREVfUlMocnMsJmJsb2NrWzBdLCZibG9ja1tOTi1OUk9PVFNdKTsKKyNlbmRpZgorCisgICAgICAvKiBNYWtlIHRlbXAgY29weSwgc2VlZCB3aXRoIGVycm9ycyAqLworICAgICAgbWVtY3B5KHRibG9jayxibG9jayxzaXplb2YodGJsb2NrKSk7CisgICAgICBtZW1zZXQoZXJybG9jcywwLHNpemVvZihlcnJsb2NzKSk7CisgICAgICBtZW1zZXQoZGVycmxvY3MsMCxzaXplb2YoZGVycmxvY3MpKTsKKyAgICAgIGVyYXN1cmVzPTA7CisgICAgICBmb3IoaT0wO2k8ZXJyb3JzO2krKyl7CisJZG8geworCSAgZXJydmFsID0gcmFuZG9tKCkgJiBOTjsKKwl9IHdoaWxlKGVycnZhbCA9PSAwKTsgLyogRXJyb3IgdmFsdWUgbXVzdCBiZSBub256ZXJvICovCisKKwlkbyB7CisJICBlcnJsb2MgPSByYW5kb20oKSAlIE5OOworCX0gd2hpbGUoZXJybG9jc1tlcnJsb2NdICE9IDApOyAvKiBNdXN0IG5vdCBjaG9vc2UgdGhlIHNhbWUgbG9jYXRpb24gdHdpY2UgKi8KKworCWVycmxvY3NbZXJybG9jXSA9IDE7CisKKyNpZiBGTEFHX0VSQVNVUkUKKwlpZihyYW5kb20oKSAmIDEpIC8qIDUwLTUwIGNoYW5jZSAqLworCSAgZGVycmxvY3NbZXJhc3VyZXMrK10gPSBlcnJsb2M7CisjZW5kaWYKKwl0YmxvY2tbZXJybG9jXSBePSBlcnJ2YWw7CisgICAgICB9CisKKyAgICAgIC8qIERlY29kZSB0aGUgZXJyb3JlZCBibG9jayAqLworI2lmIGRlZmluZWQoQ0NTRFMpIHx8IGRlZmluZWQoRklYRUQpCisgICAgICBkZXJyb3JzID0gREVDT0RFX1JTKHRibG9jayxkZXJybG9jcyxlcmFzdXJlcywwKTsKKyNlbHNlCisgICAgICBkZXJyb3JzID0gREVDT0RFX1JTKHJzLHRibG9jayxkZXJybG9jcyxlcmFzdXJlcyk7CisjZW5kaWYKKworICAgICAgaWYoZGVycm9ycyAhPSBlcnJvcnMpeworCVBSSU5UUEFSTQorCXByaW50ZigiIGRlY29kZXIgc2F5cyAlZCBlcnJvcnMsIHRydWUgbnVtYmVyIGlzICVkXG4iLGRlcnJvcnMsZXJyb3JzKTsKKwlkZWNvZGVyX2Vycm9ycysrOworICAgICAgfQorICAgICAgZm9yKGk9MDtpPGRlcnJvcnM7aSsrKXsKKwlpZihlcnJsb2NzW2RlcnJsb2NzW2ldXSA9PSAwKXsKKwkgIFBSSU5UUEFSTQorCSAgcHJpbnRmKCIgZGVjb2RlciBpbmRpY2F0ZXMgZXJyb3IgaW4gbG9jYXRpb24gJWQgd2l0aG91dCBlcnJvclxuIixkZXJybG9jc1tpXSk7CisJICBkZWNvZGVyX2Vycm9ycysrOworCX0KKyAgICAgIH0KKyAgICAgIGlmKG1lbWNtcCh0YmxvY2ssYmxvY2ssc2l6ZW9mKHRibG9jaykpICE9IDApeworCVBSSU5UUEFSTQorCXByaW50ZigiIHVuY29ycmVjdGVkIGVycm9ycyEgb3V0cHV0IF4gaW5wdXQ6Iik7CisJZGVjb2Rlcl9lcnJvcnMrKzsKKwlmb3IoaT0wO2k8Tk47aSsrKQorCSAgcHJpbnRmKCIgJTAyeCIsdGJsb2NrW2ldIF4gYmxvY2tbaV0pOworCXByaW50ZigiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGRlY29kZXJfZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvZmVjL2ZlYy5jIGIvZmVjL2ZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTYwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZmVjLmMKQEAgLTAsMCArMSw2NiBAQAorLyogVXRpbGl0eSByb3V0aW5lcyBmb3IgRkVDIHN1cHBvcnQKKyAqIENvcHlyaWdodCAyMDA0LCBQaGlsIEthcm4sIEtBOVEKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordW5zaWduZWQgY2hhciBQYXJ0YWJbMjU2XTsKK2ludCBQX2luaXQ7CisKKy8qIENyZWF0ZSAyNTYtZW50cnkgb2RkLXBhcml0eSBsb29rdXAgdGFibGUKKyAqIE5lZWRlZCBvbmx5IG9uIG5vbi1pYTMyIG1hY2hpbmVzCisgKi8KK3ZvaWQgcGFydGFiX2luaXQodm9pZCl7CisgIGludCBpLGNudCx0aTsKKworICAvKiBJbml0aWFsaXplIHBhcml0eSBsb29rdXAgdGFibGUgKi8KKyAgZm9yKGk9MDtpPDI1NjtpKyspeworICAgIGNudCA9IDA7CisgICAgdGkgPSBpOworICAgIHdoaWxlKHRpKXsKKyAgICAgIGlmKHRpICYgMSkKKwljbnQrKzsKKyAgICAgIHRpID4+PSAxOworICAgIH0KKyAgICBQYXJ0YWJbaV0gPSBjbnQgJiAxOworICB9CisgIFBfaW5pdD0xOworfQorCisvKiBMb29rdXAgdGFibGUgZ2l2aW5nIGNvdW50IG9mIDEgYml0cyBmb3IgaW50ZWdlcnMgMC0yNTUgKi8KK2ludCBCaXRjbnRbXSA9IHsKKyAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLAorIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCisgMSwgMiwgMiwgMywgMiwgMywgMywgNCwKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCisgMiwgMywgMywgNCwgMywgNCwgNCwgNSwKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgMSwgMiwgMiwgMywgMiwgMywgMywgNCwKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsCisgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwKKyA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAorIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCisgMiwgMywgMywgNCwgMywgNCwgNCwgNSwKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgMiwgMywgMywgNCwgMywgNCwgNCwgNSwKKyAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywKKyAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwKKyA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAorIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCisgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywKKyA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAorIDUsIDYsIDYsIDcsIDYsIDcsIDcsIDgsCit9OworCmRpZmYgLS1naXQgYS9mZWMvZmVjLmggYi9mZWMvZmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlODQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9mZWMuaApAQCAtMCwwICsxLDM0NyBAQAorLyogVXNlciBpbmNsdWRlIGZpbGUgZm9yIGxpYmZlYworICogQ29weXJpZ2h0IDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKworI2lmbmRlZiBfRkVDX0hfCisjZGVmaW5lIF9GRUNfSF8KKworLyogcj0xLzIgaz03IGNvbnZvbHV0aW9uYWwgZW5jb2RlciBwb2x5bm9taWFscworICogVGhlIE5BU0EtRFNOIGNvbnZlbnRpb24gaXMgdG8gdXNlIFYyN1BPTFlBIGludmVydGVkLCB0aGVuIFYyN1BPTFlCCisgKiBUaGUgQ0NTRFMvTkFTQS1HU0ZDIGNvbnZlbnRpb24gaXMgdG8gdXNlIFYyN1BPTFlCLCB0aGVuIFYyN1BPTFlBIGludmVydGVkCisgKi8KKyNkZWZpbmUJVjI3UE9MWUEJMHg2ZAorI2RlZmluZQlWMjdQT0xZQgkweDRmCisKK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjcoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbChpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI3KHZvaWQgKnZwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgdXBkYXRlX3ZpdGVyYmkyN19ibGsodm9pZCAqdnAsdW5zaWduZWQgY2hhciBzeW1bXSxpbnQgbnBhaXJzKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI3KHZvaWQgKnZwLCB1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGludCBuYml0cyx1bnNpZ25lZCBpbnQgZW5kc3RhdGUpOwordm9pZCBkZWxldGVfdml0ZXJiaTI3KHZvaWQgKnZwKTsKKworI2lmZGVmIF9fVkVDX18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjdfYXYoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9hdihpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI3X2F2KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI3X2F2KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyN19hdih2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjdfbW14KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfbW14KGludCBwb2x5c1syXSk7CitpbnQgaW5pdF92aXRlcmJpMjdfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI3X21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMjdfbW14KHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMjdfYmxrX21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyN19zc2UoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9zc2UoaW50IHBvbHlzWzJdKTsKK2ludCBpbml0X3ZpdGVyYmkyN19zc2Uodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMjdfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyN19zc2Uodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCit2b2lkICpjcmVhdGVfdml0ZXJiaTI3X3NzZTIoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9zc2UyKGludCBwb2x5c1syXSk7CitpbnQgaW5pdF92aXRlcmJpMjdfc3NlMih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkyN19zc2UyKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyN19zc2UyKHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMjdfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CisjZW5kaWYKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyN19wb3J0KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfcG9ydChpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI3X3BvcnQodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMjdfcG9ydCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMjdfcG9ydCh2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19wb3J0KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCisvKiByPTEvMiBrPTkgY29udm9sdXRpb25hbCBlbmNvZGVyIHBvbHlub21pYWxzICovCisjZGVmaW5lCVYyOVBPTFlBCTB4MWFmCisjZGVmaW5lCVYyOVBPTFlCCTB4MTFkCisKK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjkoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbChpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI5KHZvaWQgKnZwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgdXBkYXRlX3ZpdGVyYmkyOV9ibGsodm9pZCAqdnAsdW5zaWduZWQgY2hhciBzeW1zW10saW50IG5iaXRzKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5KHZvaWQgKnZwLCB1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGludCBuYml0cyx1bnNpZ25lZCBpbnQgZW5kc3RhdGUpOwordm9pZCBkZWxldGVfdml0ZXJiaTI5KHZvaWQgKnZwKTsKKworI2lmZGVmIF9fVkVDX18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjlfYXYoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9hdihpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI5X2F2KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X2F2KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOV9hdih2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTI5X2Jsa19hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjlfbW14KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWxfbW14KGludCBwb2x5c1syXSk7CitpbnQgaW5pdF92aXRlcmJpMjlfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMjlfbW14KHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMjlfYmxrX21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyOV9zc2UoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9zc2UoaW50IHBvbHlzWzJdKTsKK2ludCBpbml0X3ZpdGVyYmkyOV9zc2Uodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMjlfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOV9zc2Uodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCit2b2lkICpjcmVhdGVfdml0ZXJiaTI5X3NzZTIoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9zc2UyKGludCBwb2x5c1syXSk7CitpbnQgaW5pdF92aXRlcmJpMjlfc3NlMih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkyOV9zc2UyKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOV9zc2UyKHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMjlfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CisjZW5kaWYKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyOV9wb3J0KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWxfcG9ydChpbnQgcG9seXNbMl0pOworaW50IGluaXRfdml0ZXJiaTI5X3BvcnQodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMjlfcG9ydCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMjlfcG9ydCh2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTI5X2Jsa19wb3J0KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCisvKiByPTEvMyBrPTkgY29udm9sdXRpb25hbCBlbmNvZGVyIHBvbHlub21pYWxzICovCisjZGVmaW5lCVYzOVBPTFlBCTB4MWVkCisjZGVmaW5lCVYzOVBPTFlCCTB4MTliCisjZGVmaW5lCVYzOVBPTFlDCTB4MTI3CisKK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMzkoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbChpbnQgcG9seXNbM10pOworaW50IGluaXRfdml0ZXJiaTM5KHZvaWQgKnZwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgdXBkYXRlX3ZpdGVyYmkzOV9ibGsodm9pZCAqdnAsdW5zaWduZWQgY2hhciBzeW1zW10saW50IG5iaXRzKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTM5KHZvaWQgKnZwLCB1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGludCBuYml0cyx1bnNpZ25lZCBpbnQgZW5kc3RhdGUpOwordm9pZCBkZWxldGVfdml0ZXJiaTM5KHZvaWQgKnZwKTsKKworI2lmZGVmIF9fVkVDX18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMzlfYXYoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9hdihpbnQgcG9seXNbM10pOworaW50IGluaXRfdml0ZXJiaTM5X2F2KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTM5X2F2KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOV9hdih2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsa19hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMzlfbW14KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfbW14KGludCBwb2x5c1szXSk7CitpbnQgaW5pdF92aXRlcmJpMzlfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTM5X21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMzlfbW14KHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMzlfYmxrX21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9zc2UoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UoaW50IHBvbHlzWzNdKTsKK2ludCBpbml0X3ZpdGVyYmkzOV9zc2Uodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMzlfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOV9zc2Uodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmkzOV9ibGtfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCit2b2lkICpjcmVhdGVfdml0ZXJiaTM5X3NzZTIoaW50IGxlbik7Cit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UyKGludCBwb2x5c1szXSk7CitpbnQgaW5pdF92aXRlcmJpMzlfc3NlMih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkzOV9zc2UyKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOV9zc2UyKHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpMzlfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CisjZW5kaWYKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9wb3J0KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfcG9ydChpbnQgcG9seXNbM10pOworaW50IGluaXRfdml0ZXJiaTM5X3BvcnQodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpMzlfcG9ydCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpMzlfcG9ydCh2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsa19wb3J0KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCisKKy8qIHI9MS82IGs9MTUgQ2Fzc2luaSBjb252b2x1dGlvbmFsIGVuY29kZXIgcG9seW5vbWlhbHMgd2l0aG91dCBzeW1ib2wgaW52ZXJzaW9uCisgKiBkZnJlZSA9IDU2CisgKiBUaGVzZSBiaXRzIG1heSBiZSBsZWZ0LXJpZ2h0IGZsaXBwZWQgZnJvbSBzb21lIHRleHRib29rIHJlcHJlc2VudGF0aW9uczsKKyAqIGhlcmUgSSBoYXZlIHRoZSBiaXRzIGVudGVyaW5nIHRoZSBzaGlmdCByZWdpc3RlciBmcm9tIHRoZSByaWdodCAobG93KSBlbmQKKyAqCisgKiBTb21lIG90aGVyIHNwYWNlY3JhZnQgdXNlIHRoZSBzYW1lIGNvZGUsIGJ1dCB3aXRoIHRoZSBwb2x5bm9taWFscyBpbiBhIGRpZmZlcmVudCBvcmRlci4KKyAqIEUuZy4sIE1hcnMgUGF0aGZpbmRlciBhbmQgU1RFUkVPIHN3YXAgUE9MWUMgYW5kIFBPTFlELiBBbGwgdXNlIGFsdGVybmF0ZSBzeW1ib2wgaW52ZXJzaW9uLAorICogc28gdXNlIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWwoKSBhcyBhcHByb3ByaWF0ZS4KKyAqLworI2RlZmluZQlWNjE1UE9MWUEJMDQyNjMxCisjZGVmaW5lCVY2MTVQT0xZQgkwNDcyNDUKKyNkZWZpbmUgVjYxNVBPTFlDICAgICAgIDA1NjUwNworI2RlZmluZSBWNjE1UE9MWUQgICAgICAgMDczMzYzCisjZGVmaW5lIFY2MTVQT0xZRSAgICAgICAwNzcyNjcKKyNkZWZpbmUgVjYxNVBPTFlGICAgICAgIDA2NDUzNworCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNShpbnQgbGVuKTsKK3ZvaWQgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbChpbnQgcG9seXNbNl0pOworaW50IGluaXRfdml0ZXJiaTYxNSh2b2lkICp2cCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IHVwZGF0ZV92aXRlcmJpNjE1X2Jsayh2b2lkICp2cCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTUodm9pZCAqdnAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpNjE1KHZvaWQgKnZwKTsKKworI2lmZGVmIF9fVkVDX18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpNjE1X2F2KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX2F2KGludCBwb2x5c1s2XSk7CitpbnQgaW5pdF92aXRlcmJpNjE1X2F2KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTYxNV9hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpNjE1X2F2KHZvaWQgKnApOworaW50IHVwZGF0ZV92aXRlcmJpNjE1X2Jsa19hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpNjE1X21teChpbnQgbGVuKTsKK3ZvaWQgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9tbXgoaW50IHBvbHlzWzZdKTsKK2ludCBpbml0X3ZpdGVyYmk2MTVfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKTsKK2ludCBjaGFpbmJhY2tfdml0ZXJiaTYxNV9tbXgodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGludCBuYml0cyx1bnNpZ25lZCBpbnQgZW5kc3RhdGUpOwordm9pZCBkZWxldGVfdml0ZXJiaTYxNV9tbXgodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX21teCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsKKwordm9pZCAqY3JlYXRlX3ZpdGVyYmk2MTVfc3NlKGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX3NzZShpbnQgcG9seXNbNl0pOworaW50IGluaXRfdml0ZXJiaTYxNV9zc2Uodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IGNoYWluYmFja192aXRlcmJpNjE1X3NzZSh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpNjE1X3NzZSh2b2lkICpwKTsKK2ludCB1cGRhdGVfdml0ZXJiaTYxNV9ibGtfc3NlKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpOworCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNV9zc2UyKGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX3NzZTIoaW50IHBvbHlzWzZdKTsKK2ludCBpbml0X3ZpdGVyYmk2MTVfc3NlMih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTVfc3NlMih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpNjE1X3NzZTIodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CisKKyNlbmRpZgorCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNV9wb3J0KGludCBsZW4pOwordm9pZCBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX3BvcnQoaW50IHBvbHlzWzZdKTsKK2ludCBpbml0X3ZpdGVyYmk2MTVfcG9ydCh2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTVfcG9ydCh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgaW50IG5iaXRzLHVuc2lnbmVkIGludCBlbmRzdGF0ZSk7Cit2b2lkIGRlbGV0ZV92aXRlcmJpNjE1X3BvcnQodm9pZCAqcCk7CitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3BvcnQodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyk7CisKKworLyogR2VuZXJhbCBwdXJwb3NlIFJTIGNvZGVjLCA4LWJpdCBzeW1ib2xzICovCit2b2lkIGVuY29kZV9yc19jaGFyKHZvaWQgKnJzLHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgY2hhciAqcGFyaXR5KTsKK2ludCBkZWNvZGVfcnNfY2hhcih2b2lkICpycyx1bnNpZ25lZCBjaGFyICpkYXRhLGludCAqZXJhc19wb3MsCisJCSAgIGludCBub19lcmFzKTsKK3ZvaWQgKmluaXRfcnNfY2hhcihpbnQgc3ltc2l6ZSxpbnQgZ2Zwb2x5LAorCQkgICBpbnQgZmNyLGludCBwcmltLGludCBucm9vdHMsCisJCSAgIGludCBwYWQpOwordm9pZCBmcmVlX3JzX2NoYXIodm9pZCAqcnMpOworCisvKiBHZW5lcmFsIHB1cnBvc2UgUlMgY29kZWMsIGludGVnZXIgc3ltYm9scyAqLwordm9pZCBlbmNvZGVfcnNfaW50KHZvaWQgKnJzLGludCAqZGF0YSxpbnQgKnBhcml0eSk7CitpbnQgZGVjb2RlX3JzX2ludCh2b2lkICpycyxpbnQgKmRhdGEsaW50ICplcmFzX3BvcyxpbnQgbm9fZXJhcyk7Cit2b2lkICppbml0X3JzX2ludChpbnQgc3ltc2l6ZSxpbnQgZ2Zwb2x5LGludCBmY3IsCisJCSAgaW50IHByaW0saW50IG5yb290cyxpbnQgcGFkKTsKK3ZvaWQgZnJlZV9yc19pbnQodm9pZCAqcnMpOworCisvKiBDQ1NEUyBzdGFuZGFyZCAoMjU1LDIyMykgUlMgY29kZWMgd2l0aCBjb252ZW50aW9uYWwgKCpub3QqIGR1YWwtYmFzaXMpCisgKiBzeW1ib2wgcmVwcmVzZW50YXRpb24KKyAqLwordm9pZCBlbmNvZGVfcnNfOCh1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGNoYXIgKnBhcml0eSxpbnQgcGFkKTsKK2ludCBkZWNvZGVfcnNfOCh1bnNpZ25lZCBjaGFyICpkYXRhLGludCAqZXJhc19wb3MsaW50IG5vX2VyYXMsaW50IHBhZCk7CisKKy8qIENDU0RTIHN0YW5kYXJkICgyNTUsMjIzKSBSUyBjb2RlYyB3aXRoIGR1YWwtYmFzaXMgc3ltYm9sIHJlcHJlc2VudGF0aW9uICovCit2b2lkIGVuY29kZV9yc19jY3Nkcyh1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGNoYXIgKnBhcml0eSxpbnQgcGFkKTsKK2ludCBkZWNvZGVfcnNfY2NzZHModW5zaWduZWQgY2hhciAqZGF0YSxpbnQgKmVyYXNfcG9zLGludCBub19lcmFzLGludCBwYWQpOworCisvKiBUYWJsZXMgdG8gbWFwIGZyb20gY29udmVudGlvbmFsLT5kdWFsIChUYWx0YWIpIGFuZAorICogZHVhbC0+Y29udmVudGlvbmFsIChUYWwxdGFiKSBiYXNlcworICovCitleHRlcm4gdW5zaWduZWQgY2hhciBUYWx0YWJbXSxUYWwxdGFiW107CisKKworLyogQ1BVIFNJTUQgaW5zdHJ1Y3Rpb24gc2V0IGF2YWlsYWJsZSAqLworZXh0ZXJuIGVudW0gY3B1X21vZGUge1VOS05PV049MCxQT1JULE1NWCxTU0UsU1NFMixBTFRJVkVDfSBDcHVfbW9kZTsKK3ZvaWQgZmluZF9jcHVfbW9kZSh2b2lkKTsgLyogQ2FsbCB0aGlzIG9uY2UgYXQgc3RhcnR1cCB0byBzZXQgQ3B1X21vZGUgKi8KKworLyogRGV0ZXJtaW5lIHBhcml0eSBvZiBhcmd1bWVudDogMSA9IG9kZCwgMCA9IGV2ZW4gKi8KKyNpZmRlZiBfX2kzODZfXworc3RhdGljIGlubGluZSBpbnQgcGFyaXR5Yih1bnNpZ25lZCBjaGFyIHgpeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRlc3QgJTEsJTE7c2V0cG8gJTAiIDogIj1nIih4KSA6ICJyIiAoeCkpOworICByZXR1cm4geDsKK30KKyNlbHNlCit2b2lkIHBhcnRhYl9pbml0KCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcml0eWIodW5zaWduZWQgY2hhciB4KXsKKyAgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgUGFydGFiWzI1Nl07CisgIGV4dGVybiBpbnQgUF9pbml0OworICBpZighUF9pbml0KXsKKyAgICBwYXJ0YWJfaW5pdCgpOworICB9CisgIHJldHVybiBQYXJ0YWJbeF07Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW5saW5lIGludCBwYXJpdHkoaW50IHgpeworICAvKiBGb2xkIGRvd24gdG8gb25lIGJ5dGUgKi8KKyAgeCBePSAoeCA+PiAxNik7CisgIHggXj0gKHggPj4gOCk7CisgIHJldHVybiBwYXJpdHliKHgpOworfQorCisvKiBVc2VmdWwgdXRpbGl0aWVzIGZvciBzaW11bGF0aW9uICovCitkb3VibGUgbm9ybWFsX3JhbmQoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KTsKK3Vuc2lnbmVkIGNoYXIgYWRkbm9pc2UoaW50IHN5bSxkb3VibGUgYW1wLGRvdWJsZSBnYWluLGRvdWJsZSBvZmZzZXQsaW50IGNsaXApOworCitleHRlcm4gaW50IEJpdGNudFtdOworCisvKiBEb3QgcHJvZHVjdCBmdW5jdGlvbnMgKi8KK3ZvaWQgKmluaXRkcChzaWduZWQgc2hvcnQgY29lZmZzW10saW50IGxlbik7Cit2b2lkIGZyZWVkcCh2b2lkICpkcCk7Citsb25nIGRvdHByb2Qodm9pZCAqZHAsc2lnbmVkIHNob3J0IGFbXSk7CisKK3ZvaWQgKmluaXRkcF9wb3J0KHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKTsKK3ZvaWQgZnJlZWRwX3BvcnQodm9pZCAqZHApOworbG9uZyBkb3Rwcm9kX3BvcnQodm9pZCAqZHAsc2lnbmVkIHNob3J0IGFbXSk7CisKKyNpZmRlZiBfX2kzODZfXwordm9pZCAqaW5pdGRwX21teChzaWduZWQgc2hvcnQgY29lZmZzW10saW50IGxlbik7Cit2b2lkIGZyZWVkcF9tbXgodm9pZCAqZHApOworbG9uZyBkb3Rwcm9kX21teCh2b2lkICpkcCxzaWduZWQgc2hvcnQgYVtdKTsKKwordm9pZCAqaW5pdGRwX3NzZShzaWduZWQgc2hvcnQgY29lZmZzW10saW50IGxlbik7Cit2b2lkIGZyZWVkcF9zc2Uodm9pZCAqZHApOworbG9uZyBkb3Rwcm9kX3NzZSh2b2lkICpkcCxzaWduZWQgc2hvcnQgYVtdKTsKKwordm9pZCAqaW5pdGRwX3NzZTIoc2lnbmVkIHNob3J0IGNvZWZmc1tdLGludCBsZW4pOwordm9pZCBmcmVlZHBfc3NlMih2b2lkICpkcCk7Citsb25nIGRvdHByb2Rfc3NlMih2b2lkICpkcCxzaWduZWQgc2hvcnQgYVtdKTsKKyNlbmRpZgorCisjaWZkZWYgX19WRUNfXwordm9pZCAqaW5pdGRwX2F2KHNpZ25lZCBzaG9ydCBjb2VmZnNbXSxpbnQgbGVuKTsKK3ZvaWQgZnJlZWRwX2F2KHZvaWQgKmRwKTsKK2xvbmcgZG90cHJvZF9hdih2b2lkICpkcCxzaWduZWQgc2hvcnQgYVtdKTsKKyNlbmRpZgorCisvKiBTdW0gb2Ygc3F1YXJlcyAtIGFjY2VwdHMgc2lnbmVkIHNob3J0cywgcHJvZHVjZXMgdW5zaWduZWQgbG9uZyBsb25nICovCit1bnNpZ25lZCBsb25nIGxvbmcgc3Vtc3Eoc2lnbmVkIHNob3J0ICppbixpbnQgY250KTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9wb3J0KHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7CisKKyNpZmRlZiBfX2kzODZfXwordW5zaWduZWQgbG9uZyBsb25nIHN1bXNxX21teChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOwordW5zaWduZWQgbG9uZyBsb25nIHN1bXNxX3NzZShzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOwordW5zaWduZWQgbG9uZyBsb25nIHN1bXNxX3NzZTIoc2lnbmVkIHNob3J0ICppbixpbnQgY250KTsKKyNlbmRpZgorI2lmZGVmIF9fVkVDX18KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9hdihzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOworI2VuZGlmCisKKworLyogTG93LWxldmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgKi8KKworaW50IGNwdV9mZWF0dXJlcyh2b2lkKTsKKworI2VuZGlmIC8qIF9GRUNfSF8gKi8KKworCisKZGlmZiAtLWdpdCBhL2ZlYy9maXhlZC5oIGIvZmVjL2ZpeGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMjdiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9maXhlZC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIFN0dWZmIHNwZWNpZmljIHRvIHRoZSBDQ1NEUyAoMjU1LDIyMykgUlMgY29kZWMKKyAqICgyNTUsMjIzKSBjb2RlIG92ZXIgR0YoMjU2KS4gTm90ZTogdGhlIGNvbnZlbnRpb25hbCBiYXNpcyBpcyBzdGlsbAorICogdXNlZDsgdGhlIGR1YWwtYmFzaXMgbWFwcGluZ3MgYXJlIHBlcmZvcm1lZCBpbiBbZW58ZGVdY29kZV9yc19jY3Nkcy5jCisgKgorICogQ29weXJpZ2h0IDIwMDMgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGRhdGFfdDsKKworc3RhdGljIGlubGluZSBpbnQgbW9kMjU1KGludCB4KXsKKyAgd2hpbGUgKHggPj0gMjU1KSB7CisgICAgeCAtPSAyNTU7CisgICAgeCA9ICh4ID4+IDgpICsgKHggJiAyNTUpOworICB9CisgIHJldHVybiB4OworfQorI2RlZmluZSBNT0ROTih4KSBtb2QyNTUoeCkKKworZXh0ZXJuIGRhdGFfdCBDQ1NEU19hbHBoYV90b1tdOworZXh0ZXJuIGRhdGFfdCBDQ1NEU19pbmRleF9vZltdOworZXh0ZXJuIGRhdGFfdCBDQ1NEU19wb2x5W107CisKKyNkZWZpbmUgTU0gOAorI2RlZmluZSBOTiAyNTUKKyNkZWZpbmUgQUxQSEFfVE8gQ0NTRFNfYWxwaGFfdG8KKyNkZWZpbmUgSU5ERVhfT0YgQ0NTRFNfaW5kZXhfb2YKKyNkZWZpbmUgR0VOUE9MWSBDQ1NEU19wb2x5CisjZGVmaW5lIE5ST09UUyAzMgorI2RlZmluZSBGQ1IgMTEyCisjZGVmaW5lIFBSSU0gMTEKKyNkZWZpbmUgSVBSSU0gMTE2CisjZGVmaW5lIFBBRCBwYWQKKwpkaWZmIC0tZ2l0IGEvZmVjL2dlbl9jY3Nkcy5jIGIvZmVjL2dlbl9jY3Nkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTJlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvZ2VuX2Njc2RzLmMKQEAgLTAsMCArMSwzOSBAQAorLyogR2VuZXJhdGUgdGFibGVzIGZvciBDQ1NEUyBjb2RlCisgKiBDb3B5cmlnaHQgMjAwMiBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJjaGFyLmgiCisjaW5jbHVkZSAicnMtY29tbW9uLmgiCisjaW5jbHVkZSAiZmVjLmgiCisKK2ludCBtYWluKCl7CisgIHN0cnVjdCBycyAqcnM7CisgIGludCBpOworCisgIHJzID0gaW5pdF9yc19jaGFyKDgsMHgxODcsMTEyLDExLDMyLDApOyAvKiBDQ1NEUyBzdGFuZGFyZCAqLworICBhc3NlcnQocnMgIT0gTlVMTCk7CisgIHByaW50ZigiY2hhciBDQ1NEU19hbHBoYV90b1tdID0geyIpOworICBmb3IoaT0wO2k8MjU2O2krKyl7CisgICAgaWYoKGkgJSAxNikgPT0gMCkKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIjB4JTAyeCwiLHJzLT5hbHBoYV90b1tpXSk7CisgIH0KKyAgcHJpbnRmKCJcbn07XG5cbmNoYXIgQ0NTRFNfaW5kZXhfb2ZbXSA9IHsiKTsKKyAgZm9yKGk9MDtpPDI1NjtpKyspeworICAgIGlmKChpICUgMTYpID09IDApCisgICAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIlM2QsIixycy0+aW5kZXhfb2ZbaV0pOworICB9CisgIHByaW50ZigiXG59O1xuXG5jaGFyIENDU0RTX3BvbHlbXSA9IHsiKTsKKyAgZm9yKGk9MDtpPDMzO2krKyl7CisgICAgaWYoKGkgJSAxNikgPT0gMCkKKyAgICAgIHByaW50ZigiXG4iKTsKKworICAgIHByaW50ZigiJTNkLCIscnMtPmdlbnBvbHlbaV0pOworICB9CisgIHByaW50ZigiXG59O1xuIik7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9mZWMvZ2VuX2Njc2RzX3RhbC5jIGIvZmVjL2dlbl9jY3Nkc190YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc1NTAzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2dlbl9jY3Nkc190YWwuYwpAQCAtMCwwICsxLDUzIEBACisvKiBDb252ZXJzaW9uIGxvb2t1cCB0YWJsZXMgZnJvbSBjb252ZW50aW9uYWwgYWxwaGEgdG8gQmVybGVrYW1wJ3MKKyAqIGR1YWwtYmFzaXMgcmVwcmVzZW50YXRpb24uIFVzZWQgaW4gdGhlIENDU0RTIHZlcnNpb24gb25seS4KKyAqIHRhbHRhYltdIC0tIGNvbnZlcnQgY29udmVudGlvbmFsIHRvIGR1YWwgYmFzaXMKKyAqIHRhbDF0YWJbXSAtLSBjb252ZXJ0IGR1YWwgYmFzaXMgdG8gY29udmVudGlvbmFsCisKKyAqIE5vdGU6IHRoZSBhY3R1YWwgUlMgZW5jb2Rlci9kZWNvZGVyIHdvcmtzIHdpdGggdGhlIGNvbnZlbnRpb25hbCBiYXNpcy4KKyAqIFNvIGRhdGEgaXMgY29udmVydGVkIGZyb20gZHVhbCB0byBjb252ZW50aW9uYWwgYmFzaXMgYmVmb3JlIGVpdGhlcgorICogZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYW5kIHRoZW4gY29udmVydGVkIGJhY2suCisgKgorICogQ29weXJpZ2h0IDIwMDIgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgRFRZUEUgdW5zaWduZWQgY2hhcgorRFRZUEUgVGFsdGFiWzI1Nl0sVGFsMXRhYlsyNTZdOworCitzdGF0aWMgRFRZUEUgdGFsW10gPSB7IDB4OGQsIDB4ZWYsIDB4ZWMsIDB4ODYsIDB4ZmEsIDB4OTksIDB4YWYsIDB4N2IgfTsKKworLyogR2VuZXJhdGUgY29udmVyc2lvbiBsb29rdXAgdGFibGVzIGJldHdlZW4gY29udmVudGlvbmFsIGFscGhhIHJlcHJlc2VudGF0aW9uCisgKiAoQCoqNywgQCoqNiwgLi4uQCoqMCkKKyAqICBhbmQgQmVybGVrYW1wJ3MgZHVhbCBiYXNpcyByZXByZXNlbnRhdGlvbgorICogKGwwLCBsMSwgLi4ubDcpCisgKi8KK2ludCBtYWluKCl7CisgIGludCBpLGosazsKKworICBmb3IoaT0wO2k8MjU2O2krKyl7LyogRm9yIGVhY2ggdmFsdWUgb2YgaW5wdXQgKi8KKyAgICBUYWx0YWJbaV0gPSAwOworICAgIGZvcihqPTA7ajw4O2orKykgLyogZm9yIGVhY2ggY29sdW1uIG9mIG1hdHJpeCAqLworICAgICAgZm9yKGs9MDtrPDg7aysrKXsgLyogZm9yIGVhY2ggcm93IG9mIG1hdHJpeCAqLworCWlmKGkgJiAoMTw8aykpCisJICAgVGFsdGFiW2ldIF49IHRhbFs3LWtdICYgKDE8PGopOworICAgICAgfQorICAgIFRhbDF0YWJbVGFsdGFiW2ldXSA9IGk7CisgIH0KKyAgcHJpbnRmKCJ1bnNpZ25lZCBjaGFyIFRhbHRhYltdID0ge1xuIik7CisgIGZvcihpPTA7aTwyNTY7aSsrKXsKKyAgICBpZigoaSAlIDE2KSA9PSAwKQorICAgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiMHglMDJ4LCIsVGFsdGFiW2ldKTsKKyAgfQorICBwcmludGYoIlxufTtcblxudW5zaWduZWQgY2hhciBUYWwxdGFiW10gPSB7Iik7CisgIGZvcihpPTA7aTwyNTY7aSsrKXsKKyAgICBpZigoaSAlIDE2KSA9PSAwKQorICAgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiMHglMDJ4LCIsVGFsMXRhYltpXSk7CisgIH0KKyAgcHJpbnRmKCJcbn07XG4iKTsKKyAgZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZmVjL2luaXRfcnMuYyBiL2ZlYy9pbml0X3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxY2Y0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9pbml0X3JzLmMKQEAgLTAsMCArMSwzOSBAQAorLyogSW5pdGlhbGl6ZSBhIFJTIGNvZGVjCisgKgorICogQ29weXJpZ2h0IDIwMDIgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCisjaWYgIWRlZmluZWQoTlVMTCkKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyNpbmNsdWRlICJycy1jb21tb24uaCIKKwordm9pZCBmcmVlX3JzKHZvaWQgKnApeworICBzdHJ1Y3QgcnMgKnJzID0gKHN0cnVjdCBycyAqKXA7CisKKyAgZnJlZShycy0+YWxwaGFfdG8pOworICBmcmVlKHJzLT5pbmRleF9vZik7CisgIGZyZWUocnMtPmdlbnBvbHkpOworICBmcmVlKHJzKTsKK30KKworLyogSW5pdGlhbGl6ZSBhIFJlZWQtU29sb21vbiBjb2RlYworICogc3ltc2l6ZSA9IHN5bWJvbCBzaXplLCBiaXRzCisgKiBnZnBvbHkgPSBGaWVsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKKyAqIGZjciA9IGZpcnN0IHJvb3Qgb2YgUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCwgaW5kZXggZm9ybQorICogcHJpbSA9IHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHBvbHlub21pYWwgcm9vdHMKKyAqIG5yb290cyA9IFJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZGVncmVlIChudW1iZXIgb2Ygcm9vdHMpCisgKiBwYWQgPSBwYWRkaW5nIGJ5dGVzIGF0IGZyb250IG9mIHNob3J0ZW5lZCBibG9jaworICovCit2b2lkICppbml0X3JzX2NvbW1vbihpbnQgc3ltc2l6ZSxpbnQgZ2Zwb2x5LGludCBmY3IsaW50IHByaW0sCisJaW50IG5yb290cyxpbnQgcGFkKXsKKyAgc3RydWN0IHJzICpyczsKKworI2luY2x1ZGUgImluaXRfcnMuaCIKKworICByZXR1cm4gcnM7Cit9CmRpZmYgLS1naXQgYS9mZWMvaW5pdF9ycy5oIGIvZmVjL2luaXRfcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI1ZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2luaXRfcnMuaApAQCAtMCwwICsxLDEwNiBAQAorLyogQ29tbW9uIGNvZGUgZm9yIGludGlhbGl6aW5nIGEgUmVlZC1Tb2xvbW9uIGNvbnRyb2wgYmxvY2sgKGNoYXIgb3IgaW50IHN5bWJvbHMpCisgKiBDb3B5cmlnaHQgMjAwNCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjdW5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisKK3sKKyAgaW50IGksIGosIHNyLHJvb3QsaXByaW07CisKKyAgcnMgPSBOVUxMOworICAvKiBDaGVjayBwYXJhbWV0ZXIgcmFuZ2VzICovCisgIGlmKHN5bXNpemUgPCAwIHx8IHN5bXNpemUgPiA4KihpbnQpc2l6ZW9mKGRhdGFfdCkpeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmKGZjciA8IDAgfHwgZmNyID49ICgxPDxzeW1zaXplKSkKKyAgICBnb3RvIGRvbmU7CisgIGlmKHByaW0gPD0gMCB8fCBwcmltID49ICgxPDxzeW1zaXplKSkKKyAgICBnb3RvIGRvbmU7CisgIGlmKG5yb290cyA8IDAgfHwgbnJvb3RzID49ICgxPDxzeW1zaXplKSkKKyAgICBnb3RvIGRvbmU7IC8qIENhbid0IGhhdmUgbW9yZSByb290cyB0aGFuIHN5bWJvbCB2YWx1ZXMhICovCisgIGlmKHBhZCA8IDAgfHwgcGFkID49ICgoMTw8c3ltc2l6ZSkgLTEgLSBucm9vdHMpKQorICAgIGdvdG8gZG9uZTsgLyogVG9vIG11Y2ggcGFkZGluZyAqLworCisgIHJzID0gKHN0cnVjdCBycyAqKWNhbGxvYygxLHNpemVvZihzdHJ1Y3QgcnMpKTsKKyAgaWYocnMgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgcnMtPm1tID0gc3ltc2l6ZTsKKyAgcnMtPm5uID0gKDE8PHN5bXNpemUpLTE7CisgIHJzLT5wYWQgPSBwYWQ7CisKKyAgcnMtPmFscGhhX3RvID0gKGRhdGFfdCAqKW1hbGxvYyhzaXplb2YoZGF0YV90KSoocnMtPm5uKzEpKTsKKyAgaWYocnMtPmFscGhhX3RvID09IE5VTEwpeworICAgIGZyZWUocnMpOworICAgIHJzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgcnMtPmluZGV4X29mID0gKGRhdGFfdCAqKW1hbGxvYyhzaXplb2YoZGF0YV90KSoocnMtPm5uKzEpKTsKKyAgaWYocnMtPmluZGV4X29mID09IE5VTEwpeworICAgIGZyZWUocnMtPmFscGhhX3RvKTsKKyAgICBmcmVlKHJzKTsKKyAgICBycyA9IE5VTEw7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogR2VuZXJhdGUgR2Fsb2lzIGZpZWxkIGxvb2t1cCB0YWJsZXMgKi8KKyAgcnMtPmluZGV4X29mWzBdID0gQTA7IC8qIGxvZyh6ZXJvKSA9IC1pbmYgKi8KKyAgcnMtPmFscGhhX3RvW0EwXSA9IDA7IC8qIGFscGhhKiotaW5mID0gMCAqLworICBzciA9IDE7CisgIGZvcihpPTA7aTxycy0+bm47aSsrKXsKKyAgICBycy0+aW5kZXhfb2Zbc3JdID0gaTsKKyAgICBycy0+YWxwaGFfdG9baV0gPSBzcjsKKyAgICBzciA8PD0gMTsKKyAgICBpZihzciAmICgxPDxzeW1zaXplKSkKKyAgICAgIHNyIF49IGdmcG9seTsKKyAgICBzciAmPSBycy0+bm47CisgIH0KKyAgaWYoc3IgIT0gMSl7CisgICAgLyogZmllbGQgZ2VuZXJhdG9yIHBvbHlub21pYWwgaXMgbm90IHByaW1pdGl2ZSEgKi8KKyAgICBmcmVlKHJzLT5hbHBoYV90byk7CisgICAgZnJlZShycy0+aW5kZXhfb2YpOworICAgIGZyZWUocnMpOworICAgIHJzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBGb3JtIFJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZnJvbSBpdHMgcm9vdHMgKi8KKyAgcnMtPmdlbnBvbHkgPSAoZGF0YV90ICopbWFsbG9jKHNpemVvZihkYXRhX3QpKihucm9vdHMrMSkpOworICBpZihycy0+Z2VucG9seSA9PSBOVUxMKXsKKyAgICBmcmVlKHJzLT5hbHBoYV90byk7CisgICAgZnJlZShycy0+aW5kZXhfb2YpOworICAgIGZyZWUocnMpOworICAgIHJzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgcnMtPmZjciA9IGZjcjsKKyAgcnMtPnByaW0gPSBwcmltOworICBycy0+bnJvb3RzID0gbnJvb3RzOworCisgIC8qIEZpbmQgcHJpbS10aCByb290IG9mIDEsIHVzZWQgaW4gZGVjb2RpbmcgKi8KKyAgZm9yKGlwcmltPTE7KGlwcmltICUgcHJpbSkgIT0gMDtpcHJpbSArPSBycy0+bm4pCisgICAgOworICBycy0+aXByaW0gPSBpcHJpbSAvIHByaW07CisKKyAgcnMtPmdlbnBvbHlbMF0gPSAxOworICBmb3IgKGkgPSAwLHJvb3Q9ZmNyKnByaW07IGkgPCBucm9vdHM7IGkrKyxyb290ICs9IHByaW0pIHsKKyAgICBycy0+Z2VucG9seVtpKzFdID0gMTsKKworICAgIC8qIE11bHRpcGx5IHJzLT5nZW5wb2x5W10gYnkgIEAqKihyb290ICsgeCkgKi8KKyAgICBmb3IgKGogPSBpOyBqID4gMDsgai0tKXsKKyAgICAgIGlmIChycy0+Z2VucG9seVtqXSAhPSAwKQorCXJzLT5nZW5wb2x5W2pdID0gcnMtPmdlbnBvbHlbai0xXSBeIHJzLT5hbHBoYV90b1ttb2Rubihycyxycy0+aW5kZXhfb2ZbcnMtPmdlbnBvbHlbal1dICsgcm9vdCldOworICAgICAgZWxzZQorCXJzLT5nZW5wb2x5W2pdID0gcnMtPmdlbnBvbHlbai0xXTsKKyAgICB9CisgICAgLyogcnMtPmdlbnBvbHlbMF0gY2FuIG5ldmVyIGJlIHplcm8gKi8KKyAgICBycy0+Z2VucG9seVswXSA9IHJzLT5hbHBoYV90b1ttb2Rubihycyxycy0+aW5kZXhfb2ZbcnMtPmdlbnBvbHlbMF1dICsgcm9vdCldOworICB9CisgIC8qIGNvbnZlcnQgcnMtPmdlbnBvbHlbXSB0byBpbmRleCBmb3JtIGZvciBxdWlja2VyIGVuY29kaW5nICovCisgIGZvciAoaSA9IDA7IGkgPD0gbnJvb3RzOyBpKyspCisgICAgcnMtPmdlbnBvbHlbaV0gPSBycy0+aW5kZXhfb2ZbcnMtPmdlbnBvbHlbaV1dOworIGRvbmU6OworCit9CmRpZmYgLS1naXQgYS9mZWMvaW5pdF9yc19jaGFyLmMgYi9mZWMvaW5pdF9yc19jaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMDk5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9pbml0X3JzX2NoYXIuYwpAQCAtMCwwICsxLDM1IEBACisvKiBJbml0aWFsaXplIGEgUlMgY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJjaGFyLmgiCisjaW5jbHVkZSAicnMtY29tbW9uLmgiCisKK3ZvaWQgZnJlZV9yc19jaGFyKHZvaWQgKnApeworICBzdHJ1Y3QgcnMgKnJzID0gKHN0cnVjdCBycyAqKXA7CisKKyAgZnJlZShycy0+YWxwaGFfdG8pOworICBmcmVlKHJzLT5pbmRleF9vZik7CisgIGZyZWUocnMtPmdlbnBvbHkpOworICBmcmVlKHJzKTsKK30KKworLyogSW5pdGlhbGl6ZSBhIFJlZWQtU29sb21vbiBjb2RlYworICogc3ltc2l6ZSA9IHN5bWJvbCBzaXplLCBiaXRzCisgKiBnZnBvbHkgPSBGaWVsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKKyAqIGZjciA9IGZpcnN0IHJvb3Qgb2YgUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCwgaW5kZXggZm9ybQorICogcHJpbSA9IHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHBvbHlub21pYWwgcm9vdHMKKyAqIG5yb290cyA9IFJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZGVncmVlIChudW1iZXIgb2Ygcm9vdHMpCisgKiBwYWQgPSBwYWRkaW5nIGJ5dGVzIGF0IGZyb250IG9mIHNob3J0ZW5lZCBibG9jaworICovCit2b2lkICppbml0X3JzX2NoYXIoaW50IHN5bXNpemUsaW50IGdmcG9seSxpbnQgZmNyLGludCBwcmltLAorCWludCBucm9vdHMsaW50IHBhZCl7CisgIHN0cnVjdCBycyAqcnM7CisKKyNpbmNsdWRlICJpbml0X3JzLmgiCisKKyAgcmV0dXJuIHJzOworfQpkaWZmIC0tZ2l0IGEvZmVjL2luaXRfcnNfaW50LmMgYi9mZWMvaW5pdF9yc19pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjAzNmMyCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2luaXRfcnNfaW50LmMKQEAgLTAsMCArMSwzNSBAQAorLyogSW5pdGlhbGl6ZSBhIFJTIGNvZGVjCisgKgorICogQ29weXJpZ2h0IDIwMDIgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiaW50LmgiCisjaW5jbHVkZSAicnMtY29tbW9uLmgiCisKK3ZvaWQgZnJlZV9yc19pbnQodm9pZCAqcCl7CisgIHN0cnVjdCBycyAqcnMgPSAoc3RydWN0IHJzICopcDsKKworICBmcmVlKHJzLT5hbHBoYV90byk7CisgIGZyZWUocnMtPmluZGV4X29mKTsKKyAgZnJlZShycy0+Z2VucG9seSk7CisgIGZyZWUocnMpOworfQorCisvKiBJbml0aWFsaXplIGEgUmVlZC1Tb2xvbW9uIGNvZGVjCisgKiBzeW1zaXplID0gc3ltYm9sIHNpemUsIGJpdHMKKyAqIGdmcG9seSA9IEZpZWxkIGdlbmVyYXRvciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cworICogZmNyID0gZmlyc3Qgcm9vdCBvZiBSUyBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsLCBpbmRleCBmb3JtCisgKiBwcmltID0gcHJpbWl0aXZlIGVsZW1lbnQgdG8gZ2VuZXJhdGUgcG9seW5vbWlhbCByb290cworICogbnJvb3RzID0gUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBkZWdyZWUgKG51bWJlciBvZiByb290cykKKyAqIHBhZCA9IHBhZGRpbmcgYnl0ZXMgYXQgZnJvbnQgb2Ygc2hvcnRlbmVkIGJsb2NrCisgKi8KK3ZvaWQgKmluaXRfcnNfaW50KGludCBzeW1zaXplLGludCBnZnBvbHksaW50IGZjcixpbnQgcHJpbSwKKwlpbnQgbnJvb3RzLGludCBwYWQpeworICBzdHJ1Y3QgcnMgKnJzOworCisjaW5jbHVkZSAiaW5pdF9ycy5oIgorCisgIHJldHVybiByczsKK30KZGlmZiAtLWdpdCBhL2ZlYy9pbnN0YWxsLXNoIGIvZmVjL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTlkZTIzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUxIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwkJY2htb2RjbWQ9IiIKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2ZlYy9pbnQuaCBiL2ZlYy9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU4NjVkCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL2ludC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIFN0dWZmIHNwZWNpZmljIHRvIHRoZSBnZW5lcmFsIChpbnRlZ2VyKSB2ZXJzaW9uIG9mIHRoZSBSZWVkLVNvbG9tb24gY29kZWNzCisgKgorICogQ29weXJpZ2h0IDIwMDMsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGRhdGFfdDsKKworI2RlZmluZSBNT0ROTih4KSBtb2Rubihycyx4KQorCisjZGVmaW5lIE1NIChycy0+bW0pCisjZGVmaW5lIE5OIChycy0+bm4pCisjZGVmaW5lIEFMUEhBX1RPIChycy0+YWxwaGFfdG8pIAorI2RlZmluZSBJTkRFWF9PRiAocnMtPmluZGV4X29mKQorI2RlZmluZSBHRU5QT0xZIChycy0+Z2VucG9seSkKKyNkZWZpbmUgTlJPT1RTIChycy0+bnJvb3RzKQorI2RlZmluZSBGQ1IgKHJzLT5mY3IpCisjZGVmaW5lIFBSSU0gKHJzLT5wcmltKQorI2RlZmluZSBJUFJJTSAocnMtPmlwcmltKQorI2RlZmluZSBQQUQgKHJzLT5wYWQpCisjZGVmaW5lIEEwIChOTikKKworCmRpZmYgLS1naXQgYS9mZWMvbGVzc2VyLnR4dCBiL2ZlYy9sZXNzZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvbGVzc2VyLnR4dApAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCisgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKKyB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKK2NhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKK3RoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCitzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKK2EgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKK2FsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCitwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgorb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgorRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvZmVjL21ha2VmaWxlLmluIGIvZmVjL21ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmRmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvbWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNDIgQEAKKyMgTWFrZWZpbGUgcHJvdG90eXBlIGZvciBjb25maWd1cmUKKyMgQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisjIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorCisjIEBjb25maWd1cmVfaW5wdXRACitzcmNkaXIgPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK1ZQQVRIID0gQHNyY2RpckAKK0NDPUBDQ0AKK0xJQlM9QE1MSUJTQCBmZWMubyBzaW0ubyB2aXRlcmJpMjcubyB2aXRlcmJpMjdfcG9ydC5vIHZpdGVyYmkyOS5vIHZpdGVyYmkyOV9wb3J0Lm8gXAorCXZpdGVyYmkzOS5vIHZpdGVyYmkzOV9wb3J0Lm8gXAorCXZpdGVyYmk2MTUubyB2aXRlcmJpNjE1X3BvcnQubyBlbmNvZGVfcnNfY2hhci5vIGVuY29kZV9yc19pbnQubyBlbmNvZGVfcnNfOC5vIFwKKwlkZWNvZGVfcnNfY2hhci5vIGRlY29kZV9yc19pbnQubyBkZWNvZGVfcnNfOC5vIFwKKwlpbml0X3JzX2NoYXIubyBpbml0X3JzX2ludC5vIGNjc2RzX3RhYi5vIFwKKwllbmNvZGVfcnNfY2NzZHMubyBkZWNvZGVfcnNfY2NzZHMubyBjY3Nkc190YWwubyBcCisJZG90cHJvZC5vIGRvdHByb2RfcG9ydC5vIFwKKwlwZWFrdmFsLm8gcGVha3ZhbF9wb3J0Lm8gXAorCXN1bXNxLm8gc3Vtc3FfcG9ydC5vCisKK0NGTEFHUz1AQ0ZMQUdTQCAtSS4gLVdhbGwgQEFSQ0hfT1BUSU9OQAorCitTSEFSRURfTElCPUBTSF9MSUJACisKK2FsbDogbGliZmVjLmEgJChTSEFSRURfTElCKQorCit0ZXN0OiB2dGVzdDI3IHZ0ZXN0MjkgdnRlc3QzOSB2dGVzdDYxNSByc3Rlc3QgZHRlc3Qgc3Vtc3FfdGVzdCBwZWFrdGVzdAorCUBlY2hvICJDb3JyZWN0bmVzcyB0ZXN0czoiCisJLi92dGVzdDI3IC1lIDMuMCAtbiAxMDAwIC12CisJLi92dGVzdDI5IC1lIDIuNSAtbiAxMDAwIC12CisJLi92dGVzdDM5IC1lIDIuNSAtbiAxMDAwIC12CisJLi92dGVzdDYxNSAtZSAxLjAgLW4gMTAwIC12CisJLi9yc3Rlc3QKKwkuL2R0ZXN0CisJLi9zdW1zcV90ZXN0CisJLi9wZWFrdGVzdAorCUBlY2hvICJTcGVlZCB0ZXN0czoiCisJLi92dGVzdDI3CisJLi92dGVzdDI5CisJLi92dGVzdDM5CisJLi92dGVzdDYxNQorCitpbnN0YWxsOiBhbGwKKwlta2RpciAtcCBAbGliZGlyQCAKKwlpbnN0YWxsIC1tIDY0NCAtcCAkKFNIQVJFRF9MSUIpIGxpYmZlYy5hIEBsaWJkaXJACisjCShjZCBAbGliZGlyQDtsbiAtZiAtcyAkKFNIQVJFRF9MSUIpIGxpYmZlYy5zbykKKwlAUkVCSU5EQAorCW1rZGlyIC1wIEBpbmNsdWRlZGlyQAorCWluc3RhbGwgLW0gNjQ0IC1wIGZlYy5oIEBpbmNsdWRlZGlyQAorCW1rZGlyIC1tIDA3NTUgLXAgQG1hbmRpckAvbWFuMworCWluc3RhbGwgLW0gNjQ0IC1wIHNpbWQtdml0ZXJiaS4zIHJzLjMgZHNwLjMgQG1hbmRpckAvbWFuMworCitwZWFrdGVzdDogcGVha3Rlc3QubyBsaWJmZWMuYQorCWdjYyAtZyAtbyAkQCAkXgorCitzdW1zcV90ZXN0OiBzdW1zcV90ZXN0Lm8gbGliZmVjLmEKKwlnY2MgLWcgLW8gJEAgJF4KKworZHRlc3Q6IGR0ZXN0Lm8gbGliZmVjLmEKKwlnY2MgLWcgLW8gJEAgJF4gLWxtCisKK3Z0ZXN0Mjc6IHZ0ZXN0MjcubyBsaWJmZWMuYQorCWdjYyAtZyAtbyAkQCAkXiAtbG0KKwordnRlc3QyOTogdnRlc3QyOS5vIGxpYmZlYy5hCisJZ2NjIC1nIC1vICRAICReIC1sbQorCit2dGVzdDM5OiB2dGVzdDM5Lm8gbGliZmVjLmEKKwlnY2MgLWcgLW8gJEAgJF4gLWxtCisKK3Z0ZXN0NjE1OiB2dGVzdDYxNS5vIGxpYmZlYy5hCisJZ2NjIC1nIC1vICRAICReIC1sbQorCityc3Rlc3Q6IHJzdGVzdC5vIGxpYmZlYy5hCisJZ2NjIC1nIC1vICRAICReCisKK3JzX3NwZWVkdGVzdDogcnNfc3BlZWR0ZXN0Lm8gbGliZmVjLmEKKwlnY2MgLWcgLW8gJEAgJF4JCisKKyMgZm9yIHNvbWUgcmVhc29uLCB0aGUgdGVzdCBwcm9ncmFtcyB3aXRob3V0IGFyZ3Mgc2VnZmF1bHQgb24gdGhlIFBQQyB3aXRoIC1PMiBvcHRpbWl6YXRpb24uIER1bm5vIHdoeSAtIGNvbXBpbGVyIGJ1Zz8KK3Z0ZXN0MjcubzogdnRlc3QyNy5jIGZlYy5oCisJZ2NjIC1nIC1jICQ8CisKK3Z0ZXN0MjkubzogdnRlc3QyOS5jIGZlYy5oCisJZ2NjIC1nIC1jICQ8CisKK3Z0ZXN0MzkubzogdnRlc3QzOS5jIGZlYy5oCisJZ2NjIC1nIC1jICQ8CisKK3Z0ZXN0NjE1Lm86IHZ0ZXN0NjE1LmMgZmVjLmgKKwlnY2MgLWcgLWMgJDwKKworbGliZmVjLmE6ICQoTElCUykKKwlhciBydiAkQCAkXgorCXJhbmxpYiBsaWJmZWMuYQorCisjIGZvciBEYXJ3aW4KK2xpYmZlYy5keWxpYjogJChMSUJTKQorCSQoQ0MpIC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgJEAgLW8gJEAgJF4KKworIyBmb3IgTGludXggZXQgYWwKK2xpYmZlYy5zbzogJChMSUJTKQorCWdjYyAtc2hhcmVkIC1YbGlua2VyIC1zb25hbWU9JEAgLW8gJEAgLVdsLC13aG9sZS1hcmNoaXZlICReIC1XbCwtbm8td2hvbGUtYXJjaGl2ZSAtbGMKKworZG90cHJvZC5vOiBkb3Rwcm9kLmMgZmVjLmgKKworZG90cHJvZF9wb3J0Lm86IGRvdHByb2RfcG9ydC5jIGZlYy5oCisKK3ZpdGVyYmkyNy5vOiB2aXRlcmJpMjcuYyBmZWMuaAorCit2aXRlcmJpMjdfcG9ydC5vOiB2aXRlcmJpMjdfcG9ydC5jIGZlYy5oCisKK3ZpdGVyYmkyOS5vOiB2aXRlcmJpMjkuYyBmZWMuaAorCit2aXRlcmJpMzkubzogdml0ZXJiaTM5LmMgZmVjLmgKKwordml0ZXJiaTM5X3BvcnQubzogdml0ZXJiaTM5X3BvcnQuYyBmZWMuaAorCit2aXRlcmJpMzlfc3NlMi5vOiB2aXRlcmJpMzlfc3NlMi5jIGZlYy5oCisKK3ZpdGVyYmkzOV9zc2Uubzogdml0ZXJiaTM5X3NzZS5jIGZlYy5oCisKK3ZpdGVyYmkzOV9tbXgubzogdml0ZXJiaTM5X21teC5jIGZlYy5oCisKK2VuY29kZV9yc19jaGFyLm86IGVuY29kZV9yc19jaGFyLmMgY2hhci5oIHJzLWNvbW1vbi5oCisKK2VuY29kZV9yc19pbnQubzogZW5jb2RlX3JzX2ludC5jIGludC5oIHJzLWNvbW1vbi5oCisKK2VuY29kZV9yc184Lm86IGVuY29kZV9yc184LmMgZml4ZWQuaAorCitlbmNvZGVfcnNfYXYubzogZW5jb2RlX3JzX2F2LmMgZml4ZWQuaAorCitkZWNvZGVfcnNfY2hhci5vOiBkZWNvZGVfcnNfY2hhci5jIGNoYXIuaCBycy1jb21tb24uaAorCitkZWNvZGVfcnNfaW50Lm86IGRlY29kZV9yc19pbnQuYyBpbnQuaCBycy1jb21tb24uaAorCitkZWNvZGVfcnNfOC5vOiBkZWNvZGVfcnNfOC5jIGZpeGVkLmgKKworaW5pdF9yc19jaGFyLm86IGluaXRfcnNfY2hhci5jIGNoYXIuaCBycy1jb21tb24uaAorCitpbml0X3JzX2ludC5vOiBpbml0X3JzX2ludC5jIGludC5oIHJzLWNvbW1vbi5oCisKK2Njc2RzX3RhYi5vOiBjY3Nkc190YWIuYworCitjY3Nkc190YWIuYzogZ2VuX2Njc2RzCisJLi9nZW5fY2NzZHMgPiBjY3Nkc190YWIuYworCitnZW5fY2NzZHM6IGdlbl9jY3Nkcy5vIGluaXRfcnNfY2hhci5vCisJZ2NjIC1vICRAICReCisKK2dlbl9jY3Nkcy5vOiBnZW5fY2NzZHMuYworCWdjYyAgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKK2Njc2RzX3RhbC5vOiBjY3Nkc190YWwuYworCitjY3Nkc190YWwuYzogZ2VuX2Njc2RzX3RhbAorCS4vZ2VuX2Njc2RzX3RhbCA+IGNjc2RzX3RhbC5jCisKK2V4ZXJjaXNlX2NoYXIubzogZXhlcmNpc2UuYworCWdjYyAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworZXhlcmNpc2VfaW50Lm86IGV4ZXJjaXNlLmMKKwlnY2MgLURCSUdTWU09MSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworZXhlcmNpc2VfOC5vOiBleGVyY2lzZS5jCisJZ2NjIC1ERklYRUQ9MSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworZXhlcmNpc2VfY2NzZHMubzogZXhlcmNpc2UuYworCWdjYyAtRENDU0RTPTEgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKK3ZpdGVyYmkyNy5vOiB2aXRlcmJpMjcuYyBmZWMuaAorCit2aXRlcmJpMjdfcG9ydC5vOiB2aXRlcmJpMjdfcG9ydC5jIGZlYy5oCisKK3ZpdGVyYmkyN19hdi5vOiB2aXRlcmJpMjdfYXYuYyBmZWMuaAorCit2aXRlcmJpMjdfbW14Lm86IHZpdGVyYmkyN19tbXguYyBmZWMuaAorCWdjYyAkKENGTEFHUykgLW1tbXggLWMgLW8gJEAgJDwKKwordml0ZXJiaTI3X3NzZS5vOiB2aXRlcmJpMjdfc3NlLmMgZmVjLmgKKwlnY2MgJChDRkxBR1MpIC1tc3NlIC1jIC1vICRAICQ8CisKK3ZpdGVyYmkyN19zc2UyLm86IHZpdGVyYmkyN19zc2UyLmMgZmVjLmgKKwlnY2MgJChDRkxBR1MpIC1tc3NlMiAtYyAtbyAkQCAkPAorCit2aXRlcmJpMjkubzogdml0ZXJiaTI5LmMgZmVjLmgKKwordml0ZXJiaTI5X3BvcnQubzogdml0ZXJiaTI5X3BvcnQuYyBmZWMuaAorCit2aXRlcmJpMjlfYXYubzogdml0ZXJiaTI5X2F2LmMgZmVjLmgKKwordml0ZXJiaTI5X21teC5vOiB2aXRlcmJpMjlfbW14LmMgZmVjLmgKKwlnY2MgJChDRkxBR1MpIC1tbW14IC1jIC1vICRAICQ8CisKK3ZpdGVyYmkyOV9zc2Uubzogdml0ZXJiaTI5X3NzZS5jIGZlYy5oCisJZ2NjICQoQ0ZMQUdTKSAtbXNzZSAtYyAtbyAkQCAkPAorCit2aXRlcmJpMjlfc3NlMi5vOiB2aXRlcmJpMjlfc3NlMi5jIGZlYy5oCisJZ2NjICQoQ0ZMQUdTKSAtbXNzZTIgLWMgLW8gJEAgJDwKKwordml0ZXJiaTM5Lm86IHZpdGVyYmkzOS5jIGZlYy5oCisKK3ZpdGVyYmkzOV9wb3J0Lm86IHZpdGVyYmkzOV9wb3J0LmMgZmVjLmgKKwordml0ZXJiaTM5X2F2Lm86IHZpdGVyYmkzOV9hdi5jIGZlYy5oCisKK3ZpdGVyYmkzOV9tbXgubzogdml0ZXJiaTM5X21teC5jIGZlYy5oCisJZ2NjICQoQ0ZMQUdTKSAtbW1teCAtYyAtbyAkQCAkPAorCit2aXRlcmJpMzlfc3NlLm86IHZpdGVyYmkzOV9zc2UuYyBmZWMuaAorCWdjYyAkKENGTEFHUykgLW1zc2UgLWMgLW8gJEAgJDwKKwordml0ZXJiaTM5X3NzZTIubzogdml0ZXJiaTM5X3NzZTIuYyBmZWMuaAorCWdjYyAkKENGTEFHUykgLW1zc2UyIC1jIC1vICRAICQ8CisKK3ZpdGVyYmk2MTUubzogdml0ZXJiaTYxNS5jIGZlYy5oCisKK3ZpdGVyYmk2MTVfcG9ydC5vOiB2aXRlcmJpNjE1X3BvcnQuYyBmZWMuaAorCit2aXRlcmJpNjE1X2F2Lm86IHZpdGVyYmk2MTVfYXYuYyBmZWMuaAorCit2aXRlcmJpNjE1X21teC5vOiB2aXRlcmJpNjE1X21teC5jIGZlYy5oCisJZ2NjICQoQ0ZMQUdTKSAtbW1teCAtYyAtbyAkQCAkPAorCit2aXRlcmJpNjE1X3NzZS5vOiB2aXRlcmJpNjE1X3NzZS5jIGZlYy5oCisJZ2NjICQoQ0ZMQUdTKSAtbXNzZSAtYyAtbyAkQCAkPAorCit2aXRlcmJpNjE1X3NzZTIubzogdml0ZXJiaTYxNV9zc2UyLmMgZmVjLmgKKwlnY2MgJChDRkxBR1MpIC1tc3NlMiAtYyAtbyAkQCAkPAorCitjcHVfbW9kZV94ODYubzogY3B1X21vZGVfeDg2LmMgZmVjLmgKKworY3B1X21vZGVfcHBjLm86IGNwdV9tb2RlX3BwYy5jIGZlYy5oCisKKworY2xlYW46CisJcm0gLWYgKi5vICQoU0hBUkVEX0xJQikgKi5hIHJzX3NwZWVkdGVzdCBwZWFrdGVzdCBzdW1zcV90ZXN0IGR0ZXN0IHZ0ZXN0MjcgdnRlc3QyOSB2dGVzdDM5IHZ0ZXN0NjE1IHJzdGVzdCBjY3Nkc190YWIuYyBjY3Nkc190YWwuYyBnZW5fY2NzZHMgZ2VuX2Njc2RzX3RhbCBjb3JlCisJcm0gLXJmIGF1dG9tNHRlLmNhY2hlCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBjb25maWcubG9nIGNvbmZpZy5jYWNoZSBjb25maWcuc3RhdHVzIGNvbmZpZy5oIG1ha2VmaWxlCisKZGlmZiAtLWdpdCBhL2ZlYy9tbXhiZmx5MjcucyBiL2ZlYy9tbXhiZmx5MjcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWJiZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL21teGJmbHkyNy5zCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBJbnRlbCBTSU1EIE1NWCBpbXBsZW1lbnRhdGlvbiBvZiBWaXRlcmJpIEFDUyBidXR0ZXJmbGllcworICAgZm9yIDY0LXN0YXRlIChrPTcpIGNvbnZvbHV0aW9uYWwgY29kZQorICAgQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgICBUaGlzIGNvZGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisKKyAgIGludCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19tbXgoc3RydWN0IHYyNyAqdnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpIDsgCisqLworCSMgTU1YICg2NC1iaXQgU0lNRCkgdmVyc2lvbgorCSMgcmVxdWlyZXMgUGVudGl1bS1NTVgsIFBlbnRpdW0tSUkgb3IgYmV0dGVyCisKKwkjIFRoZXNlIGFyZSBvZmZzZXRzIGludG8gc3RydWN0IHYyNywgZGVmaW5lZCBpbiB2aXRlcmJpMjdfbW14LmMKKwkuc2V0IERQLDEyOAorCS5zZXQgT0xETUVUUklDUywxMzIKKwkuc2V0IE5FV01FVFJJQ1MsMTM2CisJLnRleHQJCisJLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19tbXgsTWV0dGFiMjdfMSxNZXR0YWIyN18yCisJLnR5cGUgdXBkYXRlX3ZpdGVyYmkyN19ibGtfbW14LEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQordXBkYXRlX3ZpdGVyYmkyN19ibGtfbW14OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVkeAorCXB1c2hsICVlYngKKwkKKwltb3ZsIDgoJWVicCksJWVkeAkjIGVkeCA9IHZwCisJdGVzdGwgJWVkeCwlZWR4CisJam56ICAwZgorCW1vdmwgLTEsJWVheAorCWptcCAgZXJyCQkKKzA6CW1vdmwgT0xETUVUUklDUyglZWR4KSwlZXNpCSMgZXNpIC0+IG9sZCBtZXRyaWNzCisJbW92bCBORVdNRVRSSUNTKCVlZHgpLCVlZGkJIyBlZGkgLT4gbmV3IG1ldHJpY3MKKwltb3ZsIERQKCVlZHgpLCVlZHgJIyBlZHggLT4gZGVjaXNpb25zCisKKzE6CW1vdmwgMTYoJWVicCksJWVheAkjIGVheCA9IG5iaXRzCisJZGVjbCAlZWF4CisJamwgICAyZgkJCSMgcGFzc2VkIHplcm8sIHdlJ3JlIGRvbmUKKwltb3ZsICVlYXgsMTYoJWVicCkKKworCW1vdmwgMTIoJWVicCksJWVieAkjIGVieCA9IHN5bXMKKwltb3Z3ICglZWJ4KSwlYXgJCSMgYXggPSBzZWNvbmQgc3ltYm9sIDogZmlyc3Qgc3ltYm9sCisJYWRkbCAkMiwlZWJ4CisJbW92bCAlZWJ4LDEyKCVlYnApCisKKwltb3ZiICVhaCwlYmwKKwlhbmRsICQyNTUsJWVheAorCWFuZGwgJDI1NSwlZWJ4CisKKwkjIHNoaWZ0IGludG8gZmlyc3QgYXJyYXkgaW5kZXggZGltZW5zaW9uIHNsb3QKKwlzaGxsICQ1LCVlYXgKKwlzaGxsICQ1LCVlYngKKworCSMgZWFjaCBpbnZvY2F0aW9uIG9mIHRoaXMgbWFjcm8gd2lsbCBkbyA4IGJ1dHRlcmZsaWVzIGluIHBhcmFsbGVsCisJLk1BQ1JPIGJ1dHRlcmZseSBHUk9VUAorCSMgQ29tcHV0ZSBicmFuY2ggbWV0cmljcworCW1vdnEgKE1ldHRhYjI3XzErOCpcR1JPVVApKCVlYXgpLCVtbTMKKwltb3ZxIGZpZnRlZW5zLCVtbTAJCisKKwlwYWRkYiAoTWV0dGFiMjdfMis4KlxHUk9VUCkoJWVieCksJW1tMworCXBhZGRiIG9uZXMsJW1tMyAgIyBlbXVsYXRlIHBhdmdiIC0gdGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeQorCXBzcmxxICQxLCVtbTMKKwlwYW5kICVtbTAsJW1tMworCisJbW92cSAoOCpcR1JPVVApKCVlc2kpLCVtbTYJIyBJbmNvbWluZyBwYXRoIG1ldHJpYywgaGlnaCBiaXQgPSAwCisJbW92cSAoKDgqXEdST1VQKSszMikoJWVzaSksJW1tMiAjIEluY29taW5nIHBhdGggbWV0cmljLCBoaWdoIGJpdCA9IDEKKwltb3ZxICVtbTYsJW1tMQkKKwltb3ZxICVtbTIsJW1tNworCQorCXBhZGRiICVtbTMsJW1tNgorCXBhZGRiICVtbTMsJW1tMgorCXB4b3IgICVtbTAsJW1tMwkJICMgaW52ZXJ0IGJyYW5jaCBtZXRyaWMKKwlwYWRkYiAlbW0zLCVtbTcJCSAjIHBhdGggbWV0cmljIGZvciBpbnZlcnRlZCBzeW1ib2xzCisJcGFkZGIgJW1tMywlbW0xCisKKwkjIGxpdmUgcmVnaXN0ZXJzIDEgMiA2IDcKKwkjIENvbXBhcmUgbW02IGFuZCBtbTc7ICBtbTEgYW5kIG1tMgorCXB4b3IgJW1tMywlbW0zCQorCW1vdnEgJW1tNiwlbW00CisJbW92cSAlbW0xLCVtbTUJCisJcHN1YmIgJW1tNywlbW00CQkjIG1tNCA9IG1tNiAtIG1tNworCXBzdWJiICVtbTIsJW1tNQkJIyBtbTUgPSBtbTEgLSBtbTIKKwlwY21wZ3RiICVtbTMsJW1tNAkjIG1tNCA9IGZpcnN0IHNldCBvZiBkZWNpc2lvbnMgKGZmID0gMSBiZXR0ZXIpCisJcGNtcGd0YiAlbW0zLCVtbTUJIyBtbTUgPSBzZWNvbmQgc2V0IG9mIGRlY2lzaW9ucwkJCisKKwkjIGxpdmUgcmVnaXN0ZXJzIDEgMiA0IDUgNiA3CisJIyBzZWxlY3Qgc3Vydml2b3JzCisJbW92cSAlbW00LCVtbTAKKwlwYW5kICVtbTQsJW1tNwkKKwltb3ZxICVtbTUsJW1tMwkKKwlwYW5kICVtbTUsJW1tMgkKKwlwYW5kbiAlbW02LCVtbTAKKwlwYW5kbiAlbW0xLCVtbTMJCisJcG9yICVtbTAsJW1tNwkJIyBtbTcgPSBmaXJzdCBzZXQgb2Ygc3Vydml2b3JzCisJcG9yICVtbTMsJW1tMgkJIyBtbTIgPSBzZWNvbmQgc2V0IG9mIHN1cnZpdm9ycwkKKworCSMgbGl2ZSByZWdpc3RlcnMgMiA0IDUgNworCSMgaW50ZXJsZWF2ZSAmIHN0b3JlIGRlY2lzaW9ucyBpbiBtbTQsIG1tNQorCSMgaW50ZXJsZWF2ZSAmIHN0b3JlIG5ldyBicmFuY2ggbWV0cmljcyBpbiBtbTIsIG1tNwkJCisJbW92cSAlbW00LCVtbTMKKwltb3ZxICVtbTcsJW1tMAkKKwlwdW5wY2toYncgJW1tNSwlbW00CisJcHVucGNrbGJ3ICVtbTUsJW1tMworCXB1bnBja2xidyAlbW0yLCVtbTcJIyBpbnRlcmxlYXZlIHNlY29uZCA4IG5ldyBtZXRyaWNzCisJcHVucGNraGJ3ICVtbTIsJW1tMAkjIGludGVybGVhdmUgZmlyc3QgOCBuZXcgbWV0cmljcworCW1vdnEgJW1tNCwoMTYqXEdST1VQKzgpKCVlZHgpCisJbW92cSAlbW0zLCgxNipcR1JPVVApKCVlZHgpCisJbW92cSAlbW03LCgxNipcR1JPVVApKCVlZGkpCisJbW92cSAlbW0wLCgxNipcR1JPVVArOCkoJWVkaSkJCisKKwkuZW5kbQorCisjIGludm9rZSBtYWNybyA0IHRpbWVzIGZvciBhIHRvdGFsIG9mIDMyIGJ1dHRlcmZsaWVzCisJYnV0dGVyZmx5IEdST1VQPTAKKwlidXR0ZXJmbHkgR1JPVVA9MQorCWJ1dHRlcmZseSBHUk9VUD0yCisJYnV0dGVyZmx5IEdST1VQPTMKKworCWFkZGwgJDY0LCVlZHgJCSMgYnVtcCBkZWNpc2lvbiBwb2ludGVyCQkJCisKKwkjIHN3YXAgbWV0cmljcworCW1vdmwgJWVzaSwlZWF4CisJbW92bCAlZWRpLCVlc2kKKwltb3ZsICVlYXgsJWVkaQorCWptcCAxYgorCisyOgllbW1zCisJbW92bCA4KCVlYnApLCVlYngJIyBlYnggPSB2cAorCSMgc3Rhc2ggbWV0cmljIHBvaW50ZXJzCisJbW92bCAlZXNpLE9MRE1FVFJJQ1MoJWVieCkKKwltb3ZsICVlZGksTkVXTUVUUklDUyglZWJ4KQorCW1vdmwgJWVkeCxEUCglZWJ4KQkjIHN0YXNoIGluY3JlbWVudGVkIHZhbHVlIG9mIHZwLT5kcAorCXhvcmwgJWVheCwlZWF4CitlcnI6CXBvcGwgJWVieAorCXBvcGwgJWVkeAorCXBvcGwgJWVkaQorCXBvcGwgJWVzaQorCXBvcGwgJWVicAorCXJldAorCisJLmRhdGEKKwkuYWxpZ24gOAorZmlmdGVlbnM6CQorCS5ieXRlIDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1CisJCisJLmFsaWduIDgKK29uZXM6CS5ieXRlIDEsMSwxLDEsMSwxLDEsMQpkaWZmIC0tZ2l0IGEvZmVjL21teGJmbHkyOS5zIGIvZmVjL21teGJmbHkyOS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2NhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvbW14YmZseTI5LnMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIEludGVsIFNJTUQgTU1YIGltcGxlbWVudGF0aW9uIG9mIFZpdGVyYmkgQUNTIGJ1dHRlcmZsaWVzCisgICBmb3IgMjU2LXN0YXRlIChrPTkpIGNvbnZvbHV0aW9uYWwgY29kZQorICAgQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgICBUaGlzIGNvZGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisKKyAgIHZvaWQgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfbW14KHN0cnVjdCB2MjkgKnZwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKTsgCisqLworCisJIyBUaGVzZSBhcmUgb2Zmc2V0cyBpbnRvIHN0cnVjdCB2MjksIGRlZmluZWQgaW4gdml0ZXJiaTI5LmgKKwkuc2V0IERQLDUxMgorCS5zZXQgT0xETUVUUklDUyw1MTYKKwkuc2V0IE5FV01FVFJJQ1MsNTIwCisJLnRleHQJCisJLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI5X2Jsa19tbXgsTWV0dGFiMjlfMSxNZXR0YWIyOV8yCisJLnR5cGUgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfbW14LEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQorCSMgTU1YICg2NC1iaXQgU0lNRCkgdmVyc2lvbgorCSMgcmVxdWlyZXMgUGVudGl1bS1NTVgsIFBlbnRpdW0tSUkgb3IgYmV0dGVyCisKK3VwZGF0ZV92aXRlcmJpMjlfYmxrX21teDoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVkaQorCXB1c2hsICVlZHgKKwlwdXNobCAlZWJ4CisJCisJbW92bCA4KCVlYnApLCVlZHgJIyBlZHggPSB2cAorCW1vdmwgOCglZWJwKSwlZWR4CSMgZWR4ID0gdnAKKwl0ZXN0bCAlZWR4LCVlZHgKKwlqbnogIDBmCisJbW92bCAtMSwlZWF4CisJam1wICBlcnIJCQorMDoJbW92bCBPTERNRVRSSUNTKCVlZHgpLCVlc2kJIyBlc2kgLT4gb2xkIG1ldHJpY3MKKwltb3ZsIE5FV01FVFJJQ1MoJWVkeCksJWVkaQkjIGVkaSAtPiBuZXcgbWV0cmljcworCW1vdmwgRFAoJWVkeCksJWVkeAkjIGVkeCAtPiBkZWNpc2lvbnMKKworMToJbW92bCAxNiglZWJwKSwlZWF4CSMgZWF4ID0gbmJpdHMKKwlkZWNsICVlYXgKKwlqbCAgIDJmCQkJIyBwYXNzZWQgemVybywgd2UncmUgZG9uZQorCW1vdmwgJWVheCwxNiglZWJwKQorCisJbW92bCAxMiglZWJwKSwlZWJ4CSMgZWJ4ID0gc3ltcworCW1vdncgKCVlYngpLCVheAkJIyBheCA9IHNlY29uZCBzeW1ib2wgOiBmaXJzdCBzeW1ib2wKKwlhZGRsICQyLCVlYngKKwltb3ZsICVlYngsMTIoJWVicCkKKworCW1vdmIgJWFoLCVibAorCWFuZGwgJDI1NSwlZWF4CisJYW5kbCAkMjU1LCVlYngKKwkKKwkjIHNoaWZ0IGludG8gZmlyc3QgYXJyYXkgaW5kZXggZGltZW5zaW9uIHNsb3QKKwlzaGxsICQ3LCVlYXgKKwlzaGxsICQ3LCVlYngKKworCSMgZWFjaCBpbnZvY2F0aW9uIG9mIHRoaXMgbWFjcm8gd2lsbCBkbyA4IGJ1dHRlcmZsaWVzIGluIHBhcmFsbGVsCisJLk1BQ1JPIGJ1dHRlcmZseSBHUk9VUAorCSMgQ29tcHV0ZSBicmFuY2ggbWV0cmljcworCW1vdnEgKE1ldHRhYjI5XzErOCpcR1JPVVApKCVlYXgpLCVtbTMKKwltb3ZxIGZpZnRlZW5zLCVtbTAJCisJcGFkZGIgKE1ldHRhYjI5XzIrOCpcR1JPVVApKCVlYngpLCVtbTMKKwlwYWRkYiBvbmVzLCVtbTMgICMgZW11bGF0ZSBwYXZnYiAtIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkKKwlwc3JscSAkMSwlbW0zCisJcGFuZCAlbW0wLCVtbTMKKworCW1vdnEgKDgqXEdST1VQKSglZXNpKSwlbW02CSMgSW5jb21pbmcgcGF0aCBtZXRyaWMsIGhpZ2ggYml0ID0gMAorCW1vdnEgKCg4KlxHUk9VUCkrMTI4KSglZXNpKSwlbW0yICMgSW5jb21pbmcgcGF0aCBtZXRyaWMsIGhpZ2ggYml0ID0gMQorCW1vdnEgJW1tNiwlbW0xCQorCW1vdnEgJW1tMiwlbW03CisJCisJcGFkZGIgJW1tMywlbW02CisJcGFkZGIgJW1tMywlbW0yCisJcHhvciAgJW1tMCwlbW0zCQkgIyBpbnZlcnQgYnJhbmNoIG1ldHJpYworCXBhZGRiICVtbTMsJW1tNwkJICMgcGF0aCBtZXRyaWMgZm9yIGludmVydGVkIHN5bWJvbHMKKwlwYWRkYiAlbW0zLCVtbTEKKworCSMgbGl2ZSByZWdpc3RlcnMgMSAyIDYgNworCSMgQ29tcGFyZSBtbTYgYW5kIG1tNzsgIG1tMSBhbmQgbW0yCisJcHhvciAlbW0zLCVtbTMJCisJbW92cSAlbW02LCVtbTQKKwltb3ZxICVtbTEsJW1tNQkKKwlwc3ViYiAlbW03LCVtbTQJCSMgbW00ID0gbW02IC0gbW03CisJcHN1YmIgJW1tMiwlbW01CQkjIG1tNSA9IG1tMSAtIG1tMgorCXBjbXBndGIgJW1tMywlbW00CSMgbW00ID0gZmlyc3Qgc2V0IG9mIGRlY2lzaW9ucyAoZmYgPSAxIGJldHRlcikKKwlwY21wZ3RiICVtbTMsJW1tNQkjIG1tNSA9IHNlY29uZCBzZXQgb2YgZGVjaXNpb25zCQkKKworCSMgbGl2ZSByZWdpc3RlcnMgMSAyIDQgNSA2IDcKKwkjIHNlbGVjdCBzdXJ2aXZvcnMKKwltb3ZxICVtbTQsJW1tMAorCXBhbmQgJW1tNCwlbW03CQorCW1vdnEgJW1tNSwlbW0zCQorCXBhbmQgJW1tNSwlbW0yCQorCXBhbmRuICVtbTYsJW1tMAorCXBhbmRuICVtbTEsJW1tMwkKKwlwb3IgJW1tMCwlbW03CQkjIG1tNyA9IGZpcnN0IHNldCBvZiBzdXJ2aXZvcnMKKwlwb3IgJW1tMywlbW0yCQkjIG1tMiA9IHNlY29uZCBzZXQgb2Ygc3Vydml2b3JzCQorCisJIyBsaXZlIHJlZ2lzdGVycyAyIDQgNSA3CisJIyBpbnRlcmxlYXZlICYgc3RvcmUgZGVjaXNpb25zIGluIG1tNCwgbW01CisJIyBpbnRlcmxlYXZlICYgc3RvcmUgbmV3IGJyYW5jaCBtZXRyaWNzIGluIG1tMiwgbW03CQkKKwltb3ZxICVtbTQsJW1tMworCW1vdnEgJW1tNywlbW0wCQorCXB1bnBja2hidyAlbW01LCVtbTQKKwlwdW5wY2tsYncgJW1tNSwlbW0zCisJcHVucGNrbGJ3ICVtbTIsJW1tNwkjIGludGVybGVhdmUgc2Vjb25kIDggbmV3IG1ldHJpY3MKKwlwdW5wY2toYncgJW1tMiwlbW0wCSMgaW50ZXJsZWF2ZSBmaXJzdCA4IG5ldyBtZXRyaWNzCisJbW92cSAlbW00LCgxNipcR1JPVVArOCkoJWVkeCkKKwltb3ZxICVtbTMsKDE2KlxHUk9VUCkoJWVkeCkKKwltb3ZxICVtbTcsKDE2KlxHUk9VUCkoJWVkaSkKKwltb3ZxICVtbTAsKDE2KlxHUk9VUCs4KSglZWRpKQkKKworCS5lbmRtCisKKyMgaW52b2tlIG1hY3JvIDE2IHRpbWVzIGZvciBhIHRvdGFsIG9mIDEyOCBidXR0ZXJmbGllcworCWJ1dHRlcmZseSBHUk9VUD0wCisJYnV0dGVyZmx5IEdST1VQPTEKKwlidXR0ZXJmbHkgR1JPVVA9MgorCWJ1dHRlcmZseSBHUk9VUD0zCisJYnV0dGVyZmx5IEdST1VQPTQKKwlidXR0ZXJmbHkgR1JPVVA9NQorCWJ1dHRlcmZseSBHUk9VUD02CisJYnV0dGVyZmx5IEdST1VQPTcKKwlidXR0ZXJmbHkgR1JPVVA9OAorCWJ1dHRlcmZseSBHUk9VUD05CisJYnV0dGVyZmx5IEdST1VQPTEwCisJYnV0dGVyZmx5IEdST1VQPTExCisJYnV0dGVyZmx5IEdST1VQPTEyCisJYnV0dGVyZmx5IEdST1VQPTEzCisJYnV0dGVyZmx5IEdST1VQPTE0CisJYnV0dGVyZmx5IEdST1VQPTE1CisKKwlhZGRsICQyNTYsJWVkeAkJIyBidW1wIGRlY2lzaW9uIHBvaW50ZXIJCQkKKworCSMgc3dhcCBtZXRyaWNzCisJbW92bCAlZXNpLCVlYXgKKwltb3ZsICVlZGksJWVzaQorCW1vdmwgJWVheCwlZWRpCisJam1wIDFiCisKKzI6CWVtbXMKKwltb3ZsIDgoJWVicCksJWVieAkjIGVieCA9IHZwCisJIyBzdGFzaCBtZXRyaWMgcG9pbnRlcnMKKwltb3ZsICVlc2ksT0xETUVUUklDUyglZWJ4KQorCW1vdmwgJWVkaSxORVdNRVRSSUNTKCVlYngpCisJbW92bCAlZWR4LERQKCVlYngpCSMgc3Rhc2ggaW5jcmVtZW50ZWQgdmFsdWUgb2YgdnAtPmRwCisJeG9ybCAlZWF4LCVlYXgKK2VycjoJcG9wbCAlZWJ4CisJcG9wbCAlZWR4CisJcG9wbCAlZWRpCisJcG9wbCAlZXNpCisJcG9wbCAlZWJwCisJcmV0CisKKwkuZGF0YQorCS5hbGlnbiA4CitmaWZ0ZWVuczoJCisJLmJ5dGUgMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUKKworCS5hbGlnbiA4CitvbmVzOgkuYnl0ZSAxLDEsMSwxLDEsMSwxLDEKZGlmZiAtLWdpdCBhL2ZlYy9wZWFrX21teF9hc3Npc3QucyBiL2ZlYy9wZWFrX21teF9hc3Npc3QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWU4MzFmCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3BlYWtfbW14X2Fzc2lzdC5zCkBAIC0wLDAgKzEsNzAgQEAKKyMgTU1YIGFzc2lzdCByb3V0aW5lcyBmb3IgcGVha3ZhbAorIyBDb3B5cmlnaHQgMjAwMSBQaGlsIEthcm4sIEtBOVEKKyMgTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisKKwkudGV4dAorCisjIEZpbmQgcGVhayB2YWx1ZSBpbiBzaWduZWQgMTYtYml0IGlucHV0IHNhbXBsZXMKKyMgIGludCBwZWFrdmFsX21teChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOwkKKwkuZ2xvYmFsIHBlYWt2YWxfbW14CisJLnR5cGUgcGVha3ZhbF9tbXgsQGZ1bmN0aW9uCisJLmFsaWduIDE2CitwZWFrdmFsX21teDoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisKKwlweG9yICVtbTcsJW1tNwkJIyBjbGVhciBwZWFrCisJCisxOglzdWJsICQ0LCVlY3gKKwlqbCAyZgorCW1vdnEgKCVlc2kpLCVtbTAKKwltb3ZxICVtbTAsJW1tMQkKKwlwc3JhdyAkMTUsJW1tMQkJIyBtbTEgPSAxJ3MgaWYgbmVnYXRpdmUsIDAncyBpZiBwb3NpdGl2ZQorCXB4b3IgJW1tMSwlbW0wCQkjIGNvbXBsZW1lbnQgbmVnYXRpdmVzCisJcHN1YncgJW1tMSwlbW0wCQkjIGFkZCAxIHRvIG5lZ2F0aXZlcworCW1vdnEgJW1tNywlbW02CQkjIGNvcHkgcHJldmlvdXMgcGVhaworCXBjbXBndHcgJW1tMCwlbW02CSMgZmYgPT0gb2xkIHBlYWsgZ3JlYXRlcgorCXBhbmQgJW1tNiwlbW03CQkjIHNlbGVjdCBvbGQgcGVha3MgdGhhdCBhcmUgZ3JlYXRlcgorCXBhbmRuICVtbTAsJW1tNgkJIyBzZWxlY3QgbmV3IHZhbHVlcyB0aGF0IGFyZSBncmVhdGVyCisJcG9yICVtbTYsJW1tNworCQorCWFkZGwgJDgsJWVzaQorCWptcCAxYgkKKworMjoJbW92ZCAlbW03LCVlYXgKKwlwc3JscSAkMTYsJW1tNworCWFuZGwgJDB4ZmZmZiwlZWF4CisJCisJbW92ZCAlbW03LCVlZHgKKwlwc3JscSAkMTYsJW1tNworCWFuZGwgJDB4ZmZmZiwlZWR4CisJY21wbCAlZWR4LCVlYXgKKwlqbmwgIDNmCisJbW92bCAlZWR4LCVlYXgKKzM6CQkKKwltb3ZkICVtbTcsJWVkeAorCXBzcmxxICQxNiwlbW03CisJYW5kbCAkMHhmZmZmLCVlZHgKKwljbXBsICVlZHgsJWVheAorCWpubCA0ZgorCW1vdmwgJWVkeCwlZWF4Cis0OgkJCisJbW92ZCAlbW03LCVlZHgKKwlhbmRsICQweGZmZmYsJWVkeAorCWNtcGwgJWVkeCwlZWF4CisJam5sIDVmCisJbW92bCAlZWR4LCVlYXgKKzU6CQorCWVtbXMKKwlwb3BsICVlYngKKwlwb3BsICVlY3gKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKKwkKZGlmZiAtLWdpdCBhL2ZlYy9wZWFrX3NzZTJfYXNzaXN0LnMgYi9mZWMvcGVha19zc2UyX2Fzc2lzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWUzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcGVha19zc2UyX2Fzc2lzdC5zCkBAIC0wLDAgKzEsNTEgQEAKKyMgU1NFMiBhc3Npc3Qgcm91dGluZXMgZm9yIHBlYWt2YWwKKyMgQ29weXJpZ2h0IDIwMDEgUGhpbCBLYXJuLCBLQTlRCisjIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIChHUEwpCisKKwkudGV4dAorCisjIEZpbmQgcGVhayBhYnNvbHV0ZSB2YWx1ZSBpbiBzaWduZWQgMTYtYml0IGlucHV0IHNhbXBsZXMKKyMgIGludCBwZWFrdmFsX3NzZTIoc2lnbmVkIHNob3J0ICppbixpbnQgY250KTsKKwkuZ2xvYmFsIHBlYWt2YWxfc3NlMgorCS50eXBlIHBlYWt2YWxfc3NlMixAZnVuY3Rpb24KKwkuYWxpZ24gMTYKK3BlYWt2YWxfc3NlMjoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVjeAorCisJbW92bCA4KCVlYnApLCVlc2kKKwltb3ZsIDEyKCVlYnApLCVlY3gKKworCXB4b3IgJXhtbTcsJXhtbTcJIyBjbGVhciBwZWFrCisJCisxOglzdWJsICQ4LCVlY3gKKwlqbCAyZgorCW1vdmFwcyAoJWVzaSksJXhtbTAKKwltb3ZhcHMgJXhtbTAsJXhtbTEJCisJcHNyYXcgJDE1LCV4bW0xCQkjIHhtbTEgPSAxJ3MgaWYgbmVnYXRpdmUsIDAncyBpZiBwb3NpdGl2ZQorCXB4b3IgJXhtbTEsJXhtbTAJIyBjb21wbGVtZW50IG5lZ2F0aXZlcworCXBzdWJ3ICV4bW0xLCV4bW0wCSMgYWRkIDEgdG8gbmVnYXRpdmVzCisJcG1heHN3ICV4bW0wLCV4bW03CSMgc3RvcmUgcGVhaworCQorCWFkZGwgJDE2LCVlc2kKKwlqbXAgMWIKKworMjoJbW92YXBzICV4bW03LCV4bW0wCisJcHNybGRxICQ4LCV4bW0wCisJcG1heHN3ICV4bW0wLCV4bW03CisJbW92YXBzICV4bW03LCV4bW0wCisJcHNybHEgJDMyLCV4bW0wCisJcG1heHN3ICV4bW0wLCV4bW03CisJbW92YXBzICV4bW03LCV4bW0wCisJcHNybHEgJDE2LCV4bW0wCisJcG1heHN3ICV4bW0wLCV4bW03CSMgbWluIHZhbHVlIGluIGxvdyB3b3JkIG9mICV4bW03CisJCisJbW92ZCAleG1tNywlZWF4CisJYW5kbCAkMHhmZmZmLCVlYXgKKworCXBvcGwgJWVjeAorCXBvcGwgJWVzaQorCXBvcGwgJWVicAorCXJldApkaWZmIC0tZ2l0IGEvZmVjL3BlYWtfc3NlX2Fzc2lzdC5zIGIvZmVjL3BlYWtfc3NlX2Fzc2lzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNmZjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcGVha19zc2VfYXNzaXN0LnMKQEAgLTAsMCArMSw0OSBAQAorIyBTU0UgYXNzaXN0IHJvdXRpbmVzIGZvciBwZWFrdmFsCisjIENvcHlyaWdodCAyMDAxIFBoaWwgS2FybiwgS0E5UQorIyBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKworCS50ZXh0CisKKyMgRmluZCBwZWFrIGFic29sdXRlIHZhbHVlIGluIHNpZ25lZCAxNi1iaXQgaW5wdXQgc2FtcGxlcworIyAgaW50IHBlYWt2YWxfc3NlKHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7CisJLmdsb2JhbCBwZWFrdmFsX3NzZQorCS50eXBlIHBlYWt2YWxfc3NlLEBmdW5jdGlvbgorCS5hbGlnbiAxNgorcGVha3ZhbF9zc2U6CisJcHVzaGwgJWVicAorCW1vdmwgJWVzcCwlZWJwCisJcHVzaGwgJWVzaQorCXB1c2hsICVlY3gKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisKKwlweG9yICVtbTcsJW1tNwkJIyBjbGVhciBwZWFrCisJCisxOglzdWJsICQ0LCVlY3gKKwlqbCAyZgorCW1vdnEgKCVlc2kpLCVtbTAKKwltb3ZxICVtbTAsJW1tMQkKKwlwc3JhdyAkMTUsJW1tMQkJIyBtbTEgPSAxJ3MgaWYgbmVnYXRpdmUsIDAncyBpZiBwb3NpdGl2ZQorCXB4b3IgJW1tMSwlbW0wCQkjIGNvbXBsZW1lbnQgbmVnYXRpdmVzCisJcHN1YncgJW1tMSwlbW0wCQkjIGFkZCAxIHRvIG5lZ2F0aXZlcworCXBtYXhzdyAlbW0wLCVtbTcJIyBzdG9yZSBwZWFrCisJCisJYWRkbCAkOCwlZXNpCisJam1wIDFiCQorCisyOgltb3ZxICVtbTcsJW1tMAorCXBzcmxxICQzMiwlbW0wCisJcG1heHN3ICVtbTAsJW1tNworCW1vdnEgJW1tNywlbW0wCisJcHNybHEgJDE2LCVtbTAKKwlwbWF4c3cgJW1tMCwlbW03CSMgbWluIHZhbHVlIGluIGxvdyB3b3JkIG9mICVtbTcKKwkKKwltb3ZkICVtbTcsJWVheAorCWFuZGwgJDB4ZmZmZiwlZWF4CisKKwllbW1zCisJcG9wbCAlZWN4CisJcG9wbCAlZXNpCisJcG9wbCAlZWJwCisJcmV0CmRpZmYgLS1naXQgYS9mZWMvcGVha3Rlc3QuYyBiL2ZlYy9wZWFrdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNGIyODAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcGVha3Rlc3QuYwpAQCAtMCwwICsxLDM4IEBACisvKiBWZXJpZnkgY29ycmVjdG5lc3Mgb2YgdGhlIHBlYWsgcm91dGluZQorICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyogVGhlc2UgdmFsdWVzIHNob3VsZCB0cmlnZ2VyIGxlYWRpbmcvdHJhaWxpbmcgYXJyYXkgZnJhZ21lbnQgaGFuZGxpbmcgKi8KKyNkZWZpbmUgTlNBTVAgMjAwMDAyCisjZGVmaW5lIE9GRlNFVCAxCisKK2ludCBwZWFrdmFsKHNpZ25lZCBzaG9ydCAqLGludCk7CitpbnQgcGVha3ZhbF9wb3J0KHNpZ25lZCBzaG9ydCAqLGludCk7CisKK2ludCBtYWluKCl7CisgIGludCBpLHM7CisgIGludCByZXN1bHQscnJlc3VsdDsKKyAgc2lnbmVkIHNob3J0IHNhbXBsZXNbTlNBTVBdOworCisgIHNyYW5kb20odGltZShOVUxMKSk7CisKKyAgZm9yKGk9MDtpPE5TQU1QO2krKyl7CisgICAgZG8geworICAgICAgcyA9IHJhbmRvbSgpICYgMHgwZmZmOworICAgIH0gd2hpbGUocyA9PSAweDgwMDApOworICAgIHNhbXBsZXNbaV0gPSBzOworICB9CisgIHNhbXBsZXNbNV0gPSAyNTAwMDsKKworICBycmVzdWx0ID0gcGVha3ZhbF9wb3J0KCZzYW1wbGVzW09GRlNFVF0sTlNBTVAtT0ZGU0VUKTsKKyAgcmVzdWx0ID0gcGVha3ZhbCgmc2FtcGxlc1tPRkZTRVRdLE5TQU1QLU9GRlNFVCk7CisgIGlmKHJlc3VsdCA9PSBycmVzdWx0KXsKKyAgICBwcmludGYoIk9LXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoInBlYWsgbWlzbWF0Y2g6ICVkICE9ICVkXG4iLHJlc3VsdCxycmVzdWx0KTsKKyAgfQorICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZmVjL3BlYWt2YWwuYyBiL2ZlYy9wZWFrdmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExYTNhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9wZWFrdmFsLmMKQEAgLTAsMCArMSwzOSBAQAorLyogU3dpdGNoIHRvIGFwcHJvcHJpYXRlIHZlcnNpb24gb2YgcGVha3ZhbCByb3V0aW5lCisgKiBDb3B5cmlnaHQgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCitpbnQgcGVha3ZhbF9wb3J0KHNpZ25lZCBzaG9ydCAqYixpbnQgY250KTsKKyNpZmRlZiBfX2kzODZfXworaW50IHBlYWt2YWxfbW14KHNpZ25lZCBzaG9ydCAqYixpbnQgY250KTsKK2ludCBwZWFrdmFsX3NzZShzaWduZWQgc2hvcnQgKmIsaW50IGNudCk7CitpbnQgcGVha3ZhbF9zc2UyKHNpZ25lZCBzaG9ydCAqYixpbnQgY250KTsKKyNlbmRpZgorCisjaWZkZWYgX19WRUNfXworaW50IHBlYWt2YWxfYXYoc2lnbmVkIHNob3J0ICpiLGludCBjbnQpOworI2VuZGlmCisKK2ludCBwZWFrdmFsKHNpZ25lZCBzaG9ydCAqYixpbnQgY250KXsKKyAgZmluZF9jcHVfbW9kZSgpOworCisgIHN3aXRjaChDcHVfbW9kZSl7CisgIGNhc2UgUE9SVDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gcGVha3ZhbF9wb3J0KGIsY250KTsKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIE1NWDoKKyAgICByZXR1cm4gcGVha3ZhbF9tbXgoYixjbnQpOworICBjYXNlIFNTRToKKyAgICByZXR1cm4gcGVha3ZhbF9zc2UoYixjbnQpOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIHBlYWt2YWxfc3NlMihiLGNudCk7CisjZW5kaWYKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICByZXR1cm4gcGVha3ZhbF9hdihiLGNudCk7CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3BlYWt2YWxfYXYuYyBiL2ZlYy9wZWFrdmFsX2F2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1NGMxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9wZWFrdmFsX2F2LmMKQEAgLTAsMCArMSw2MSBAQAorLyogUmV0dXJuIHRoZSBsYXJnZXN0IGFic29sdXRlIHZhbHVlIG9mIGEgdmVjdG9yIG9mIHNpZ25lZCBzaG9ydHMKKworICogVGhpcyBpcyB0aGUgQWx0aXZlYyBTSU1EIHZlcnNpb24uCisKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKworI2luY2x1ZGUgImZlYy5oIgorCitzaWduZWQgc2hvcnQgcGVha3ZhbF9hdihzaWduZWQgc2hvcnQgKmluLGludCBjbnQpeworICB2ZWN0b3Igc2lnbmVkIHNob3J0IHg7CisgIGludCBwYWQ7CisgIHVuaW9uIHsgdmVjdG9yIHNpZ25lZCBjaGFyIGN2OyB2ZWN0b3Igc2lnbmVkIHNob3J0IGh2OyBzaWduZWQgc2hvcnQgc1s4XTsgc2lnbmVkIGNoYXIgY1sxNl07fSBzOworICB2ZWN0b3Igc2lnbmVkIHNob3J0IHNtYWxsZXN0LGxhcmdlc3Q7CisKKyAgc21hbGxlc3QgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkoMCk7CisgIGxhcmdlc3QgPSAodmVjdG9yIHNpZ25lZCBzaG9ydCkoMCk7CisgIGlmKChwYWQgPSAoaW50KWluICYgMTUpIT0wKXsKKyAgICAvKiBMb2FkIHVuYWxpZ25lZCBsZWFkaW5nIHdvcmQgKi8KKyAgICB4ID0gdmVjX3Blcm0odmVjX2xkKDAsaW4pLCh2ZWN0b3Igc2lnbmVkIHNob3J0KSgwKSx2ZWNfbHZzbCgwLGluKSk7CisgICAgaWYoY250IDwgOCl7IC8qIFNoaWZ0IHJpZ2h0IHRvIGNob3Agc3R1ZmYgYmV5b25kIGVuZCBvZiBzaG9ydCBibG9jayAqLworICAgICAgcy5jWzE1XSA9ICg4LWNudCk8PDQ7CisgICAgICB4ID0gdmVjX3Nybyh4LHMuY3YpOworICAgIH0KKyAgICBzbWFsbGVzdCA9IHZlY19taW4oc21hbGxlc3QseCk7CisgICAgbGFyZ2VzdCA9IHZlY19tYXgobGFyZ2VzdCx4KTsKKyAgICBpbiArPSA4LXBhZC8yOworICAgIGNudCAtPSA4LXBhZC8yOworICB9CisgIC8qIEV2ZXJ5dGhpbmcgaXMgbm93IGFsaWduZWQsIHJpcCB0aHJvdWdoIG1vc3Qgb2YgdGhlIGJsb2NrICovCisgIHdoaWxlKGNudCA+PSA4KXsKKyAgICB4ID0gdmVjX2xkKDAsaW4pOworICAgIHNtYWxsZXN0ID0gdmVjX21pbihzbWFsbGVzdCx4KTsKKyAgICBsYXJnZXN0ID0gdmVjX21heChsYXJnZXN0LHgpOworICAgIGluICs9IDg7CisgICAgY250IC09IDg7CisgIH0KKyAgLyogSGFuZGxlIHRyYWlsaW5nIGZyYWdtZW50LCBpZiBhbnkgKi8KKyAgaWYoY250ID4gMCl7CisgICAgeCA9IHZlY19sZCgwLGluKTsKKyAgICBzLmNbMTVdID0gKDgtY250KTw8NDsKKyAgICB4ID0gdmVjX3Nybyh4LHMuY3YpOworICAgIHNtYWxsZXN0ID0gdmVjX21pbihzbWFsbGVzdCx4KTsKKyAgICBsYXJnZXN0ID0gdmVjX21heChsYXJnZXN0LHgpOworICB9CisgIC8qIENvbWJpbmUgYW5kIGV4dHJhY3QgcmVzdWx0ICovCisgIGxhcmdlc3QgPSB2ZWNfbWF4KGxhcmdlc3QsdmVjX2FicyhzbWFsbGVzdCkpOworCisgIHMuY1sxNV0gPSA2NDsgLyogU2hpZnQgcmlnaHQgZm91ciAxNi1iaXQgd29yZHMgKi8KKyAgbGFyZ2VzdCA9IHZlY19tYXgobGFyZ2VzdCx2ZWNfc3JvKGxhcmdlc3Qscy5jdikpOworCisgIHMuY1sxNV0gPSAzMjsgLyogU2hpZnQgcmlnaHQgdHdvIDE2LWJpdCB3b3JkcyAqLworICBsYXJnZXN0ID0gdmVjX21heChsYXJnZXN0LHZlY19zcm8obGFyZ2VzdCxzLmN2KSk7CisKKyAgcy5jWzE1XSA9IDE2OyAvKiBTaGlmdCByaWdodCBvbmUgMTYtYml0IHdvcmQgKi8KKyAgbGFyZ2VzdCA9IHZlY19tYXgobGFyZ2VzdCx2ZWNfc3JvKGxhcmdlc3Qscy5jdikpOworCisgIHMuaHYgPSBsYXJnZXN0OworICByZXR1cm4gcy5zWzddOworfQpkaWZmIC0tZ2l0IGEvZmVjL3BlYWt2YWxfbW14LmMgYi9mZWMvcGVha3ZhbF9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZmZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3BlYWt2YWxfbW14LmMKQEAgLTAsMCArMSwzNCBAQAorLyogV3JhcHBlciBmb3IgdGhlIE1NWCB2ZXJzaW9uIG9mIHBlYWt2YWwKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50IHBlYWt2YWxfbW14X2Fzc2lzdChzaWduZWQgc2hvcnQgKixpbnQpOworCitpbnQgcGVha3ZhbF9tbXgoc2lnbmVkIHNob3J0ICpiLGludCBjbnQpeworICBpbnQgcGVhayA9IDA7CisgIGludCBhOworCisgIHdoaWxlKCgoaW50KWIgJiA3KSAhPSAwICYmIGNudCAhPSAwKXsKKyAgICBhID0gYWJzKCpiKTsKKyAgICBpZihhID4gcGVhaykKKyAgICAgIHBlYWsgPSBhOworICAgIGIrKzsKKyAgICBjbnQtLTsKKyAgfQorICBhID0gcGVha3ZhbF9tbXhfYXNzaXN0KGIsY250KTsKKyAgaWYoYSA+IHBlYWspCisgICAgcGVhayA9IGE7CisgIGIgKz0gY250ICYgfjM7CisgIGNudCAmPSAzOworCisgIHdoaWxlKGNudCAhPSAwKXsKKyAgICBhID0gYWJzKCpiKTsKKyAgICBpZihhID4gcGVhaykKKyAgICAgIHBlYWsgPSBhOworICAgIGIrKzsKKyAgICBjbnQtLTsKKyAgfQorICByZXR1cm4gcGVhazsKK30gIApkaWZmIC0tZ2l0IGEvZmVjL3BlYWt2YWxfbW14X2Fzc2lzdC5zIGIvZmVjL3BlYWt2YWxfbW14X2Fzc2lzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2NiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcGVha3ZhbF9tbXhfYXNzaXN0LnMKQEAgLTAsMCArMSw3MCBAQAorIyBNTVggYXNzaXN0IHJvdXRpbmVzIGZvciBwZWFrdmFsCisjIENvcHlyaWdodCAyMDAxIFBoaWwgS2FybiwgS0E5UQorIyBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKworCS50ZXh0CisKKyMgRmluZCBwZWFrIHZhbHVlIGluIHNpZ25lZCAxNi1iaXQgaW5wdXQgc2FtcGxlcworIyAgaW50IHBlYWt2YWxfbW14X2Fzc2lzdChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOwkKKwkuZ2xvYmFsIHBlYWt2YWxfbW14X2Fzc2lzdAorCS50eXBlIHBlYWt2YWxfbW14X2Fzc2lzdCxAZnVuY3Rpb24KKwkuYWxpZ24gMTYKK3BlYWt2YWxfbW14X2Fzc2lzdDoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisKKwlweG9yICVtbTcsJW1tNwkJIyBjbGVhciBwZWFrCisJCisxOglzdWJsICQ0LCVlY3gKKwlqbCAyZgorCW1vdnEgKCVlc2kpLCVtbTAKKwltb3ZxICVtbTAsJW1tMQkKKwlwc3JhdyAkMTUsJW1tMQkJIyBtbTEgPSAxJ3MgaWYgbmVnYXRpdmUsIDAncyBpZiBwb3NpdGl2ZQorCXB4b3IgJW1tMSwlbW0wCQkjIGNvbXBsZW1lbnQgbmVnYXRpdmVzCisJcHN1YncgJW1tMSwlbW0wCQkjIGFkZCAxIHRvIG5lZ2F0aXZlcworCW1vdnEgJW1tNywlbW02CQkjIGNvcHkgcHJldmlvdXMgcGVhaworCXBjbXBndHcgJW1tMCwlbW02CSMgZmYgPT0gb2xkIHBlYWsgZ3JlYXRlcgorCXBhbmQgJW1tNiwlbW03CQkjIHNlbGVjdCBvbGQgcGVha3MgdGhhdCBhcmUgZ3JlYXRlcgorCXBhbmRuICVtbTAsJW1tNgkJIyBzZWxlY3QgbmV3IHZhbHVlcyB0aGF0IGFyZSBncmVhdGVyCisJcG9yICVtbTYsJW1tNworCQorCWFkZGwgJDgsJWVzaQorCWptcCAxYgkKKworMjoJbW92ZCAlbW03LCVlYXgKKwlwc3JscSAkMTYsJW1tNworCWFuZGwgJDB4ZmZmZiwlZWF4CisJCisJbW92ZCAlbW03LCVlZHgKKwlwc3JscSAkMTYsJW1tNworCWFuZGwgJDB4ZmZmZiwlZWR4CisJY21wbCAlZWR4LCVlYXgKKwlqbmwgIDNmCisJbW92bCAlZWR4LCVlYXgKKzM6CQkKKwltb3ZkICVtbTcsJWVkeAorCXBzcmxxICQxNiwlbW03CisJYW5kbCAkMHhmZmZmLCVlZHgKKwljbXBsICVlZHgsJWVheAorCWpubCA0ZgorCW1vdmwgJWVkeCwlZWF4Cis0OgkJCisJbW92ZCAlbW03LCVlZHgKKwlhbmRsICQweGZmZmYsJWVkeAorCWNtcGwgJWVkeCwlZWF4CisJam5sIDVmCisJbW92bCAlZWR4LCVlYXgKKzU6CQorCWVtbXMKKwlwb3BsICVlYngKKwlwb3BsICVlY3gKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKKwkKZGlmZiAtLWdpdCBhL2ZlYy9wZWFrdmFsX3BvcnQuYyBiL2ZlYy9wZWFrdmFsX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FiMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3BlYWt2YWxfcG9ydC5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFBvcnRhYmxlIEMgdmVyc2lvbiBvZiBwZWFrdmFsCisgKiBDb3B5cmlnaHQgMjAwNCBQaGlsIEthcm4sIEtBOVEKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgoraW50IHBlYWt2YWxfcG9ydChzaWduZWQgc2hvcnQgKmIsaW50IGxlbil7CisgIGludCBwZWFrID0gMDsKKyAgaW50IGEsaTsKKworICBmb3IoaT0wO2k8bGVuO2krKyl7CisgICAgYSA9IGFicyhiW2ldKTsKKyAgICBpZihhID4gcGVhaykKKyAgICAgIHBlYWsgPSBhOworICB9CisgIHJldHVybiBwZWFrOworfQpkaWZmIC0tZ2l0IGEvZmVjL3BlYWt2YWxfc3NlLmMgYi9mZWMvcGVha3ZhbF9zc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY4YjdmCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3BlYWt2YWxfc3NlLmMKQEAgLTAsMCArMSwzNSBAQAorLyogSUEtMzIgU1NFIHZlcnNpb24gb2YgcGVha3ZhbAorICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCitpbnQgcGVha3ZhbF9zc2VfYXNzaXN0KHNpZ25lZCBzaG9ydCAqLGludCk7CisKK2ludCBwZWFrdmFsX3NzZShzaWduZWQgc2hvcnQgKmIsaW50IGNudCl7CisgIGludCBwZWFrID0gMDsKKyAgaW50IGE7CisKKyAgd2hpbGUoKChpbnQpYiAmIDcpICE9IDAgJiYgY250ICE9IDApeworICAgIGEgPSBhYnMoKmIpOworICAgIGlmKGEgPiBwZWFrKQorICAgICAgcGVhayA9IGE7CisgICAgYisrOworICAgIGNudC0tOworICB9CisgIGEgPSBwZWFrdmFsX3NzZV9hc3Npc3QoYixjbnQpOworICBpZihhID4gcGVhaykKKyAgICBwZWFrID0gYTsKKyAgYiArPSBjbnQgJiB+MzsKKyAgY250ICY9IDM7CisKKyAgd2hpbGUoY250ICE9IDApeworICAgIGEgPSBhYnMoKmIpOworICAgIGlmKGEgPiBwZWFrKQorICAgICAgcGVhayA9IGE7CisgICAgYisrOworICAgIGNudC0tOworICB9CisgIHJldHVybiBwZWFrOworfSAgCmRpZmYgLS1naXQgYS9mZWMvcGVha3ZhbF9zc2UyLmMgYi9mZWMvcGVha3ZhbF9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkOTA1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9wZWFrdmFsX3NzZTIuYwpAQCAtMCwwICsxLDM0IEBACisvKiBQb3J0YWJsZSBDIHZlcnNpb24gb2YgcGVha3ZhbAorICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworaW50IHBlYWt2YWxfc3NlMl9hc3Npc3Qoc2lnbmVkIHNob3J0ICosaW50KTsKKworaW50IHBlYWt2YWxfc3NlMihzaWduZWQgc2hvcnQgKmIsaW50IGNudCl7CisgIGludCBwZWFrID0gMDsKKyAgaW50IGE7CisKKyAgd2hpbGUoKChpbnQpYiAmIDE1KSAhPSAwICYmIGNudCAhPSAwKXsKKyAgICBhID0gYWJzKCpiKTsKKyAgICBpZihhID4gcGVhaykKKyAgICAgIHBlYWsgPSBhOworICAgIGIrKzsKKyAgICBjbnQtLTsKKyAgfQorICBhID0gcGVha3ZhbF9zc2UyX2Fzc2lzdChiLGNudCk7CisgIGlmKGEgPiBwZWFrKQorICAgIHBlYWsgPSBhOworICBiICs9IGNudCAmIH43OworICBjbnQgJj0gNzsKKworICB3aGlsZShjbnQgIT0gMCl7CisgICAgYSA9IGFicygqYik7CisgICAgaWYoYSA+IHBlYWspCisgICAgICBwZWFrID0gYTsKKyAgICBiKys7CisgICAgY250LS07CisgIH0KKyAgcmV0dXJuIHBlYWs7Cit9ICAKZGlmZiAtLWdpdCBhL2ZlYy9wZWFrdmFsX3NzZTJfYXNzaXN0LnMgYi9mZWMvcGVha3ZhbF9zc2UyX2Fzc2lzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTU4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcGVha3ZhbF9zc2UyX2Fzc2lzdC5zCkBAIC0wLDAgKzEsNTEgQEAKKyMgU1NFMiBhc3Npc3Qgcm91dGluZXMgZm9yIHBlYWt2YWwKKyMgQ29weXJpZ2h0IDIwMDEgUGhpbCBLYXJuLCBLQTlRCisjIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorCisJLnRleHQKKworIyBGaW5kIHBlYWsgYWJzb2x1dGUgdmFsdWUgaW4gc2lnbmVkIDE2LWJpdCBpbnB1dCBzYW1wbGVzCisjICBpbnQgcGVha3ZhbF9zc2UyX2Fzc2lzdChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOworCS5nbG9iYWwgcGVha3ZhbF9zc2UyX2Fzc2lzdAorCS50eXBlIHBlYWt2YWxfc3NlMl9hc3Npc3QsQGZ1bmN0aW9uCisJLmFsaWduIDE2CitwZWFrdmFsX3NzZTJfYXNzaXN0OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWN4CisKKwltb3ZsIDgoJWVicCksJWVzaQorCW1vdmwgMTIoJWVicCksJWVjeAorCisJcHhvciAleG1tNywleG1tNwkjIGNsZWFyIHBlYWsKKwkKKzE6CXN1YmwgJDgsJWVjeAorCWpsIDJmCisJbW92YXBzICglZXNpKSwleG1tMAorCW1vdmFwcyAleG1tMCwleG1tMQkKKwlwc3JhdyAkMTUsJXhtbTEJCSMgeG1tMSA9IDEncyBpZiBuZWdhdGl2ZSwgMCdzIGlmIHBvc2l0aXZlCisJcHhvciAleG1tMSwleG1tMAkjIGNvbXBsZW1lbnQgbmVnYXRpdmVzCisJcHN1YncgJXhtbTEsJXhtbTAJIyBhZGQgMSB0byBuZWdhdGl2ZXMKKwlwbWF4c3cgJXhtbTAsJXhtbTcJIyBzdG9yZSBwZWFrCisJCisJYWRkbCAkMTYsJWVzaQorCWptcCAxYgorCisyOgltb3ZhcHMgJXhtbTcsJXhtbTAKKwlwc3JsZHEgJDgsJXhtbTAKKwlwbWF4c3cgJXhtbTAsJXhtbTcKKwltb3ZhcHMgJXhtbTcsJXhtbTAKKwlwc3JscSAkMzIsJXhtbTAKKwlwbWF4c3cgJXhtbTAsJXhtbTcKKwltb3ZhcHMgJXhtbTcsJXhtbTAKKwlwc3JscSAkMTYsJXhtbTAKKwlwbWF4c3cgJXhtbTAsJXhtbTcJIyBtaW4gdmFsdWUgaW4gbG93IHdvcmQgb2YgJXhtbTcKKwkKKwltb3ZkICV4bW03LCVlYXgKKwlhbmRsICQweGZmZmYsJWVheAorCisJcG9wbCAlZWN4CisJcG9wbCAlZXNpCisJcG9wbCAlZWJwCisJcmV0CmRpZmYgLS1naXQgYS9mZWMvcGVha3ZhbF9zc2VfYXNzaXN0LnMgYi9mZWMvcGVha3ZhbF9zc2VfYXNzaXN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3YzgwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9wZWFrdmFsX3NzZV9hc3Npc3QucwpAQCAtMCwwICsxLDQ5IEBACisjIFNTRSBhc3Npc3Qgcm91dGluZXMgZm9yIHBlYWt2YWwKKyMgQ29weXJpZ2h0IDIwMDEgUGhpbCBLYXJuLCBLQTlRCisjIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorCisJLnRleHQKKworIyBGaW5kIHBlYWsgYWJzb2x1dGUgdmFsdWUgaW4gc2lnbmVkIDE2LWJpdCBpbnB1dCBzYW1wbGVzCisjICBpbnQgcGVha3ZhbF9zc2VfYXNzaXN0KHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7CisJLmdsb2JhbCBwZWFrdmFsX3NzZV9hc3Npc3QKKwkudHlwZSBwZWFrdmFsX3NzZV9hc3Npc3QsQGZ1bmN0aW9uCisJLmFsaWduIDE2CitwZWFrdmFsX3NzZV9hc3Npc3Q6CisJcHVzaGwgJWVicAorCW1vdmwgJWVzcCwlZWJwCisJcHVzaGwgJWVzaQorCXB1c2hsICVlY3gKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisKKwlweG9yICVtbTcsJW1tNwkJIyBjbGVhciBwZWFrCisJCisxOglzdWJsICQ0LCVlY3gKKwlqbCAyZgorCW1vdnEgKCVlc2kpLCVtbTAKKwltb3ZxICVtbTAsJW1tMQkKKwlwc3JhdyAkMTUsJW1tMQkJIyBtbTEgPSAxJ3MgaWYgbmVnYXRpdmUsIDAncyBpZiBwb3NpdGl2ZQorCXB4b3IgJW1tMSwlbW0wCQkjIGNvbXBsZW1lbnQgbmVnYXRpdmVzCisJcHN1YncgJW1tMSwlbW0wCQkjIGFkZCAxIHRvIG5lZ2F0aXZlcworCXBtYXhzdyAlbW0wLCVtbTcJIyBzdG9yZSBwZWFrCisJCisJYWRkbCAkOCwlZXNpCisJam1wIDFiCQorCisyOgltb3ZxICVtbTcsJW1tMAorCXBzcmxxICQzMiwlbW0wCisJcG1heHN3ICVtbTAsJW1tNworCW1vdnEgJW1tNywlbW0wCisJcHNybHEgJDE2LCVtbTAKKwlwbWF4c3cgJW1tMCwlbW03CSMgbWluIHZhbHVlIGluIGxvdyB3b3JkIG9mICVtbTcKKwkKKwltb3ZkICVtbTcsJWVheAorCWFuZGwgJDB4ZmZmZiwlZWF4CisKKwllbW1zCisJcG9wbCAlZWN4CisJcG9wbCAlZXNpCisJcG9wbCAlZWJwCisJcmV0CmRpZmYgLS1naXQgYS9mZWMvcnMtY29tbW9uLmggYi9mZWMvcnMtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0ZWIzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9ycy1jb21tb24uaApAQCAtMCwwICsxLDI2IEBACisvKiBTdHVmZiBjb21tb24gdG8gYWxsIHRoZSBnZW5lcmFsLXB1cnBvc2UgUmVlZC1Tb2xvbW9uIGNvZGVjcworICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworCisvKiBSZWVkLVNvbG9tb24gY29kZWMgY29udHJvbCBibG9jayAqLworc3RydWN0IHJzIHsKKyAgaW50IG1tOyAgICAgICAgICAgICAgLyogQml0cyBwZXIgc3ltYm9sICovCisgIGludCBubjsgICAgICAgICAgICAgIC8qIFN5bWJvbHMgcGVyIGJsb2NrICg9ICgxPDxtbSktMSkgKi8KKyAgZGF0YV90ICphbHBoYV90bzsgICAgIC8qIGxvZyBsb29rdXAgdGFibGUgKi8KKyAgZGF0YV90ICppbmRleF9vZjsgICAgIC8qIEFudGlsb2cgbG9va3VwIHRhYmxlICovCisgIGRhdGFfdCAqZ2VucG9seTsgICAgICAvKiBHZW5lcmF0b3IgcG9seW5vbWlhbCAqLworICBpbnQgbnJvb3RzOyAgICAgLyogTnVtYmVyIG9mIGdlbmVyYXRvciByb290cyA9IG51bWJlciBvZiBwYXJpdHkgc3ltYm9scyAqLworICBpbnQgZmNyOyAgICAgICAgLyogRmlyc3QgY29uc2VjdXRpdmUgcm9vdCwgaW5kZXggZm9ybSAqLworICBpbnQgcHJpbTsgICAgICAgLyogUHJpbWl0aXZlIGVsZW1lbnQsIGluZGV4IGZvcm0gKi8KKyAgaW50IGlwcmltOyAgICAgIC8qIHByaW0tdGggcm9vdCBvZiAxLCBpbmRleCBmb3JtICovCisgIGludCBwYWQ7ICAgICAgICAvKiBQYWRkaW5nIGJ5dGVzIGluIHNob3J0ZW5lZCBibG9jayAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgbW9kbm4oc3RydWN0IHJzICpycyxpbnQgeCl7CisgIHdoaWxlICh4ID49IHJzLT5ubikgeworICAgIHggLT0gcnMtPm5uOworICAgIHggPSAoeCA+PiBycy0+bW0pICsgKHggJiBycy0+bm4pOworICB9CisgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvZmVjL3JzLjMgYi9mZWMvcnMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcxNTAzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3JzLjMKQEAgLTAsMCArMSwxOTggQEAKKy5USCBSRUVELVNPTE9NT04gMworLlNIIE5BTUUKK2luaXRfcnNfaW50LCBlbmNvZGVfcnNfaW50LCBkZWNvZGVfcnNfaW50LCBmcmVlX3JzX2ludCwKK2luaXRfcnNfY2hhciwgZW5jb2RlX3JzX2NoYXIsIGRlY29kZV9yc19jaGFyLCBmcmVlX3JzX2NoYXIsCitlbmNvZGVfcnNfOCwgZGVjb2RlX3JzXzgsIGVuY29kZV9yc19jY3NkcywgZGVjb2RlX3JzX2Njc2RzCitcLSBSZWVkLVNvbG9tb24gZW5jb2RpbmcvZGVjb2RpbmcKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgImZlYy5oIgorCit2b2lkICppbml0X3JzX2ludChpbnQgc3ltc2l6ZSxpbnQgZ2Zwb2x5LGludCBmY3IsaW50IHByaW0sCisgICAgIGludCBucm9vdHMsaW50IHBhZCk7CisKK3ZvaWQgZW5jb2RlX3JzX2ludCh2b2lkICpycyxpbnQgKmRhdGEsaW50ICpwYXJpdHkpOworCitpbnQgZGVjb2RlX3JzX2ludCh2b2lkICpycyxpbnQgKmRhdGEsaW50ICplcmFzX3BvcyxpbnQgbm9fZXJhcyk7CisKK3ZvaWQgZnJlZV9yc19pbnQodm9pZCAqcnMpOworCisKK3ZvaWQgKmluaXRfcnNfY2hhcihpbnQgc3ltc2l6ZSxpbnQgZ2Zwb2x5LGludCBmY3IsaW50IHByaW0sCisgICAgIGludCBucm9vdHMsaW50IHBhZCk7CisKK3ZvaWQgZW5jb2RlX3JzX2NoYXIodm9pZCAqcnMsdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgdW5zaWduZWQgY2hhciAqcGFyaXR5KTsKKworaW50IGRlY29kZV9yc19jaGFyKHZvaWQgKnJzLHVuc2lnbmVkIGNoYXIgKmRhdGEsaW50ICplcmFzX3BvcywKKyAgICAgaW50IG5vX2VyYXMpOworCit2b2lkIGZyZWVfcnNfY2hhcih2b2lkICpycyk7CisKKwordm9pZCBlbmNvZGVfcnNfOCh1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGNoYXIgKnBhcml0eSwKKyAgICAgaW50IHBhZCk7CisKK2ludCBkZWNvZGVfcnNfOCh1bnNpZ25lZCBjaGFyICpkYXRhLGludCAqZXJhc19wb3MsaW50IG5vX2VyYXMsCisgICAgIGludCBwYWQpOworCisKK3ZvaWQgZW5jb2RlX3JzX2Njc2RzKHVuc2lnbmVkIGNoYXIgKmRhdGEsdW5zaWduZWQgY2hhciAqcGFyaXR5LAorICAgICBpbnQgcGFkKTsKKworaW50IGRlY29kZV9yc19jY3Nkcyh1bnNpZ25lZCBjaGFyICpkYXRhLGludCAqZXJhc19wb3MsaW50IG5vX2VyYXMsCisgICAgIGludCBwYWQpOworCit1bnNpZ25lZCBjaGFyIFRhbHRhYlsyNTZdOwordW5zaWduZWQgY2hhciBUYWwxdGFiWzI1Nl07CisKKy5maQorCisuU0ggREVTQ1JJUFRJT04KK1RoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgUmVlZC1Tb2xvbW9uIGVycm9yIGNvbnRyb2wgZW5jb2RpbmcgYW5kCitkZWNvZGluZy4gRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgaW4gYSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucywgdGhyZWUKK3NldHMgb2YgZnVuY3Rpb25zIGFyZSBzdXBwbGllZC4gVG8gYWNjZXNzIHRoZXNlIGZ1bmN0aW9ucywgYWRkICItbGZlYyIKK3RvIHlvdXIgbGlua2VyIGNvbW1hbmQgbGluZS4KKworVGhlIGZ1bmN0aW9ucyB3aXRoIG5hbWVzIGVuZGluZyBpbiBcZkJfaW50XGZSIGhhbmRsZSBkYXRhIGluIGludGVnZXIgYXJyYXlzLAorcGVybWl0dGluZyBhcmJpdHJhcmlseSBsYXJnZSBjb2Rld29yZHMgbGltaXRlZCBvbmx5IGJ5IG1hY2hpbmUKK3Jlc291cmNlcy4KKworVGhlIGZ1bmN0aW9ucyB3aXRoIG5hbWVzIGVuZGluZyBpbiBcZkJfY2hhclxmUiB0YWtlIHVuc2lnbmVkIGNoYXIgYXJyYXlzIGFuZCBjYW4KK2hhbmRsZSBjb2RlcyB3aXRoIHN5bWJvbHMgb2YgOCBiaXRzIG9yIGxlc3MgKGkuZS4sIHdpdGggY29kZXdvcmRzIG9mCisyNTUgc3ltYm9scyBvciBsZXNzKS4KKworXGZCZW5jb2RlX3JzXzhcZlIgYW5kIFxmQmRlY29kZV9yc184XGZSIGltcGxlbWVudCBhIHNwZWNpZmljCisoMjU1LDIyMykgY29kZSB3aXRoIDgtYml0IHN5bWJvbHMgc3BlY2lmaWVkIGJ5IHRoZSBDQ1NEUzoKK2EgZmllbGQgZ2VuZXJhdG9yIG9mIDEgKyBYICsgWF4yICsgWF43ICsgWF44IGFuZCBhIGNvZGUKK2dlbmVyYXRvciB3aXRoIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3QgPSAxMTIgYW5kIGEgcHJpbWl0aXZlIGVsZW1lbnQgb2YKKzExLiBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBjb252ZW50aW9uYWwKK3BvbHlub21pYWwgZm9ybSwgXGZJbm90XGZSIHRoZSBkdWFsLWJhc2lzIHNwZWNpZmllZCBpbgordGhlIENDU0RTIHN0YW5kYXJkLCB0byByZXByZXNlbnQgc3ltYm9scy4gVGhpcyBjb2RlIG1heSBiZQorc2hvcnRlbmVkIGJ5IGdpdmluZyBhIG5vbi16ZXJvIFxmQnBhZFxmUiB2YWx1ZSB0byBwcm9kdWNlIGEKKygyNTUtXGZCcGFkXGZSLDIyMy1cZkJwYWRcZlIpIGNvZGUuIFRoZSBwYWRkaW5nIHdpbGwgY29uc2lzdCBvZiB0aGUKK3NwZWNpZmllZCBudW1iZXIgb2YgemVyb2VzIGF0IHRoZSBmcm9udCBvZiB0aGUgZnVsbCBjb2Rld29yZC4KKworRm9yIGZ1bGwgQ0NTRFMgY29tcGF0aWJpbGl0eSwgXGZCZW5jb2RlX3JzX2Njc2RzXGZSIGFuZAorXGZCZGVjb2RlX3JzX2Njc2RzXGZSIGFyZSBwcm92aWRlZC4gVGhlc2UgZnVuY3Rpb25zIHVzZSB0d28gbG9va3VwCit0YWJsZXMsIFxmQlRhbHRhYlxmUiB0byBjb252ZXJ0IGZyb20gY29udmVudGlvbmFsIHRvIGR1YWwtYmFzaXMsIGFuZAorXGZCVGFsMXRhYlxmUiB0byBwZXJmb3JtIHRoZSBpbnZlcnNlIG1hcHBpbmcgZnJvbSBkdWFsLWJhc2lzIHRvCitjb252ZW50aW9uYWwgZm9ybSwgYmVmb3JlIGFuZCBhZnRlciBjYWxscyB0byBcZkJlbmNvZGVfcnNfOFxmUgorYW5kIFxmQmRlY29kZV9yc184XGZSLgorCitUaGUgXGZCXzhcZlIgYW5kIFxmQl9jY3Nkc1xmUiBmdW5jdGlvbnMgZG8gbm90IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24uCisKK1RvIHVzZSB0aGUgZ2VuZXJhbCBwdXJwb3NlIFJTIGVuY29kZXIgb3IgZGVjb2RlciAoaS5lLiwKK3RoZSBcZkJfY2hhclxmUiBvciBcZkJfaW50XGZSIHZlcnNpb25zKSwgdGhlIHVzZXIgbXVzdCBmaXJzdAorY2FsbCBcZkJpbml0X3JzX2ludFxmUiBvciBcZkJpbml0X3JzX2NoYXJcZlIgYXMgYXBwcm9wcmlhdGUuIFRoZQorYXJndW1lbnRzIGFyZSBhcyBmb2xsb3dzOgorCitcZkJzeW1zaXplXGZSIGdpdmVzIHRoZSBzeW1ib2wgc2l6ZSBpbiBiaXRzLCB1cCB0byA4IGZvciBcZkJpbml0X3JzX2NoYXJcZlIKK29yIDMyIGZvciBcZkJpbml0X3JzX2ludFxmUiBvbiBhIG1hY2hpbmUgd2l0aCAzMi1iaXQgaW50cyAodGhvdWdoIHN1Y2ggYQoraHVnZSBjb2RlIHdvdWxkIGV4aGF1c3QgbWVtb3J5IGxpbWl0cyBvbiBhIDMyLWJpdCBtYWNoaW5lKS4gVGhlIHJlc3VsdGluZworUmVlZC1Tb2xvbW9uIGNvZGUgd29yZCB3aWxsIGhhdmUgMl5cZkJzeW1zaXplXGZSIC0gMSBzeW1ib2xzLAorZWFjaCBjb250YWluaW5nIFxmQnN5bXNpemVcZlIgYml0cy4gVGhlIGNvZGV3b3JkIG1heSBiZSBzaG9ydGVuZWQgd2l0aCB0aGUKK1xmQnBhZFxmUiBwYXJhbWV0ZXIgZGVzY3JpYmVkIGJlbG93LgorCitcZkJnZnBvbHlcZlIgZ2l2ZXMgdGhlIGV4dGVuZGVkIEdhbG9pcyBmaWVsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBjb2VmZmljaWVudHMsCit3aXRoIHRoZSAwdGggY29lZmZpY2llbnQgaW4gdGhlIGxvdyBvcmRlciBiaXQuIFRoZSBwb2x5bm9taWFsCitcZkltdXN0XGZSIGJlIHByaW1pdGl2ZTsgaWYgbm90LCB0aGUgY2FsbCB3aWxsIGZhaWwgYW5kIE5VTEwgd2lsbCBiZQorcmV0dXJuZWQuCisKK1xmQmZjclxmUiBnaXZlcywgaW4gaW5kZXggZm9ybSwgdGhlIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3Qgb2YgdGhlCitSZWVkIFNvbG9tb24gY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbC4KKworXGZCcHJpbVxmUiBnaXZlcywgaW4gaW5kZXggZm9ybSwgdGhlIHByaW1pdGl2ZSBlbGVtZW50IGluIHRoZSBHYWxvaXMgZmllbGQKK3VzZWQgdG8gZ2VuZXJhdGUgdGhlIFJlZWQgU29sb21vbiBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsLgorCitcZkJucm9vdHNcZlIgZ2l2ZXMgdGhlIG51bWJlciBvZiByb290cyBpbiB0aGUgUmVlZCBTb2xvbW9uIGNvZGUKK2dlbmVyYXRvciBwb2x5bm9taWFsLiBUaGlzIGVxdWFscyB0aGUgbnVtYmVyIG9mIHBhcml0eSBzeW1ib2xzCitwZXIgY29kZSBibG9jay4KKworXGZCcGFkXGZSIGdpdmVzIHRoZSBudW1iZXIgb2YgbGVhZGluZyBzeW1ib2xzIGluIHRoZSBjb2Rld29yZAordGhhdCBhcmUgaW1wbGljaXRseSBwYWRkZWQgdG8gemVybyBpbiBhIHNob3J0ZW5lZCBjb2RlIGJsb2NrLiAKKworVGhlIHJlc3VsdGluZyBSZWVkLVNvbG9tb24gY29kZSBoYXMgcGFyYW1ldGVycyAoTixLKSwgd2hlcmUKK04gPSAyXlxmQnN5bXNpemVcZlIgLSBcZkJwYWRcZlIgLSAxIGFuZCBLID0gTi1cZkJucm9vdHNcZlIuCisKK1RoZSBcZkJlbmNvZGVfcnNfY2hhclxmUiBhbmQgXGZCZW5jb2RlX3JzX2ludFxmUiBmdW5jdGlvbnMgYWNjZXB0Cit0aGUgcG9pbnRlciByZXR1cm5lZCBieSBcZkJpbml0X3JzX2NoYXJcZlIgb3IKK1xmQmluaXRfcnNfaW50XGZSLCByZXNwZWN0aXZlbHksIHRvCitlbmNvZGUgYSBibG9jayBvZiBkYXRhIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29kZS4KK1RoZSBpbnB1dCBkYXRhIGFycmF5IGlzIGV4cGVjdGVkIHRvCitjb250YWluIEsgc3ltYm9scyAob2YgXGZCc3ltc2l6ZVxmUiBiaXRzIGVhY2gsIHJpZ2h0IGp1c3RpZmllZAoraW4gZWFjaCBjaGFyIG9yIGludCkgYW5kIFxmQm5yb290c1xmUiBwYXJpdHkgc3ltYm9scyB3aWxsIGJlIHBsYWNlZAoraW50byB0aGUgXGZCcGFyaXR5XGZSIGFycmF5LCByaWdodCBqdXN0aWZpZWQuCisKK1RoZSBcZkJkZWNvZGVfXGZSIGZ1bmN0aW9ucyBjb3JyZWN0Cit0aGUgZXJyb3JzIGluIGEgUmVlZC1Tb2xvbW9uIGNvZGV3b3JkIG9mIE4gc3ltYm9scyB1cCB0byB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgY29kZS4KK0FuIG9wdGlvbmFsIGxpc3Qgb2YgImVyYXNlZCIgc3ltYm9sIGluZGljZXMgbWF5IGJlIGdpdmVuIGluIHRoZSBcZkJlcmFzX3Bvc1xmUgorYXJyYXkgdG8gYXNzaXN0IHRoZSBkZWNvZGVyOyB0aGlzIHBhcmFtZXRlciBtYXkgYmUgTlVMTCBpZiBubyBlcmFzdXJlcworYXJlIGdpdmVuLiBUaGUgbnVtYmVyIG9mIGVyYXNlZCBzeW1ib2xzIG11c3QgYmUgZ2l2ZW4gaW4gdGhlIFxmQm5vX2VyYXNcZlIKK3BhcmFtZXRlci4KKworVG8gbWF4aW1pemUgcGVyZm9ybWFuY2UsIHRoZSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgcGVyZm9ybSBubworInNhbml0eSBjaGVja2luZyIgb2YgdGhlaXIgaW5wdXRzLiBEZWNvZGVyIGZhaWx1cmUgbWF5IHJlc3VsdCBpZgorXGZCZXJhc19wb3NcZlIgY29udGFpbnMgZHVwbGljYXRlIGVudHJpZXMsIGFuZCBib3RoIGVuY29kZXIgYW5kCitkZWNvZGVyIHdpbGwgZmFpbCBpZiBhbiBpbnB1dCBzeW1ib2wgZXhjZWVkcyBpdHMgYWxsb3dhYmxlIHJhbmdlLgorKFN5bWJvbCByYW5nZSBvdmVyZmxvdyBjYW5ub3Qgb2NjdXIgd2l0aCB0aGUgXGZCXzhcZlIgb3IKK1xmQl9jY3Nkc1xmUiBmdW5jdGlvbnMsCitvciB3aXRoIHRoZSBcZkJfY2hhclxmUiBmdW5jdGlvbnMgd2hlbiA4LWJpdCBzeW1ib2xzIGFyZSBzcGVjaWZpZWQuKQorCitUaGUgZGVjb2RlciBjb3JyZWN0cyB0aGUgc3ltYm9scyAiaW4gcGxhY2UiLCByZXR1cm5pbmcgdGhlIG51bWJlcgorb2Ygc3ltYm9scyBpbiBlcnJvci4gSWYgdGhlIGNvZGV3b3JkIGlzIHVuY29ycmVjdGFibGUsIC0xIGlzIHJldHVybmVkCithbmQgdGhlIGRhdGEgYmxvY2sgaXMgdW5jaGFuZ2VkLiBJZiBcZkJlcmFzX3Bvc1xmUiBpcyBub24tbnVsbCwgaXQgaXMKK3VzZWQgdG8gcmV0dXJuIGEgbGlzdCBvZiBjb3JyZWN0ZWQgc3ltYm9sIHBvc2l0aW9ucywgaW4gbm8gcGFydGljdWxhcgorb3JkZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlCithcnJheSBwYXNzZWQgdGhyb3VnaCB0aGlzIHBhcmFtZXRlciBcZkltdXN0XGZSIGhhdmUgYXQgbGVhc3QgXGZCbnJvb3RzXGZSCitlbGVtZW50cyB0byBwcmV2ZW50IGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93LgorCitUaGUgXGZCZnJlZV9yc19pbnRcZlIgYW5kIFxmQmZyZWVfcnNfY2hhclxmUiBmdW5jdGlvbnMgZnJlZSB0aGUgaW50ZXJuYWwKK3NwYWNlIGFsbG9jYXRlZCBieSB0aGUgXGZCaW5pdF9yc19pbnRcZlIgYW5kIFxmQmluaXRfcnNfY2hhclxmUiBmdW5jdGlvbnMsCityZXNwZWNpdGl2ZWx5LgorCitUaGUgZnVuY3Rpb25zIFxmQmVuY29kZV9yc184XGZSIGFuZCBcZkJkZWNvZGVfcnNfOFxmUiBkbyBub3QgaGF2ZQorY29ycmVzcG9uZGluZyBcZkJpbml0XGZSIGFuZCBcZkJmcmVlXGZSLCBub3IgZG8gdGhleSB0YWtlIHRoZQorXGZCcnNcZlIgYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIG90aGVyIGZ1bmN0aW9ucyBhcyB0aGVpciBwYXJhbWV0ZXJzCithcmUgc3RhdGljYWxseSBjb21waWxlZC4gVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCBhIGNvZGUKK2VxdWl2YWxlbnQgdG8gY2FsbGluZworCitcZkJpbml0X3JzX2NoYXJcZlIoOCwweDE4NywxMTIsMTEsMzIscGFkKTsKKworYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcgcG9pbnRlciB3aXRoIFxmQmVuY29kZV9yc19jaGFyXGZSIGFuZAorXGZCZGVjb2RlX3JzX2NoYXJcZlIuCisKKy5TSCBSRVRVUk4gVkFMVUVTCitcZkJpbml0X3JzX2ludFxmUiBhbmQgXGZCaW5pdF9yc19jaGFyXGZSIHJldHVybiBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwKK2NvbnRyb2wgc3RydWN0dXJlIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZW5jb2RlLCBkZWNvZGUKK2FuZCBmcmVlIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zIHJldHVybiBOVUxMIG9uIGVycm9yLgorCitUaGUgXGZCZGVjb2RlX1xmUiBmdW5jdGlvbnMgcmV0dXJuIGEgY291bnQgb2YgY29ycmVjdGVkCitzeW1ib2xzLCBvciAtMSBpZiB0aGUgYmxvY2sgd2FzIHVuY29ycmVjdGlibGUuCisKKy5TSCBBVVRIT1IKK1BoaWwgS2FybiwgS0E5USAoa2FybkBrYTlxLm5ldCksIGJhc2VkIGhlYXZpbHkgb24gZWFybGllciB3b3JrIGJ5IFJvYmVydAorTW9yZWxvcy1aYXJhZ296YSAocm9iZXJ0QHNwZWN0cmEuZW5nLmhhd2FpaS5lZHUpIGFuZCBIYXJpIFRoaXJ1bW9vcnRoeQorKGhhcml0QHNwZWN0cmEuZW5nLmhhd2FpaS5lZHUpLiBFeHRyYSBpbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5IERldG1hcgorV2VseiAoZHdlbHpAd2ViLmRlKS4KKworLlNIIENPUFlSSUdIVAorQ29weXJpZ2h0IDIwMDQsIFBoaWwgS2FybiwgS0E5US4gTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKS4KKworLlNIIFNFRSBBTFNPCitDQ1NEUyAxMDEuMC1CLTY6IFRlbGVtZXRyeSBDaGFubmVsIENvZGluZy4KK2h0dHA6Ly93d3cuY2NzZHMub3JnL2RvY3VtZW50cy8xMDF4MGI2LnBkZgorCisuU0ggTk9URQorQ0NTRFMgY2hvc2UgdGhlICJkdWFsIGJhc2lzIiBzeW1ib2wgcmVwcmVzZW50YXRpb24gYmVjYXVzZSBpdAorc2ltcGxpZmllZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBSZWVkLVNvbG9tb24gZW5jb2RlciBpbiBkZWRpY2F0ZWQKK2hhcmR3YXJlLiBIb3dldmVyLCB0aGlzIGFwcHJvYWNoIGhvbGRzIG5vIGFkdmFudGFnZXMgZm9yIGEgc29mdHdhcmUKK2ltcGxlbWVudGF0aW9uIG9uIGEgZ2VuZXJhbCBwdXJwb3NlIGNvbXB1dGVyLCBzbyB1c2Ugb2YgdGhlIGR1YWwgYmFzaXMKK2lzIHJlY29tbWVuZGVkIG9ubHkgaWYgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDQ1NEUyBzdGFuZGFyZCBpcyBuZWVkZWQsCitlLmcuLCB0byBkZWNvZGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nIHNwYWNlY3JhZnQgdXNpbmcgdGhlIENDU0RTCitzdGFuZGFyZC4gSWYgeW91IGp1c3Qgd2FudCBhIGZhc3QgKDI1NSwyMjMpIFJTIGNvZGVjIHdpdGhvdXQgbmVlZGluZwordG8gaW50ZXJvcGVyYXRlIHdpdGggYSBDQ1NEUyBzdGFuZGFyZCBjb2RlLCB1c2UgXGZCZW5jb2RlX3JzXzhcZlIKK2FuZCBcZkJkZWNvZGVfcnNfOFxmUi4KKwpkaWZmIC0tZ2l0IGEvZmVjL3JzX3NwZWVkdGVzdC5jIGIvZmVjL3JzX3NwZWVkdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWYxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvcnNfc3BlZWR0ZXN0LmMKQEAgLTAsMCArMSw1NCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK2ludCBtYWluKCl7CisgIHVuc2lnbmVkIGNoYXIgYmxvY2tbMjU1XTsKKyAgaW50IGk7CisgIHZvaWQgKnJzOworICBzdHJ1Y3QgcnVzYWdlIHN0YXJ0LGZpbmlzaDsKKyAgZG91YmxlIGV4dGltZTsKKyAgaW50IHRyaWFscyA9IDEwMDAwOworCisgIGZvcihpPTA7aTwyMjM7aSsrKQorICAgIGJsb2NrW2ldID0gMHgwMTsKKworICBycyA9IGluaXRfcnNfY2hhcig4LDB4MTg3LDExMiwxMSwzMiwwKTsKKyAgZW5jb2RlX3JzX2NoYXIocnMsYmxvY2ssJmJsb2NrWzIyM10pOworCisgIGdldHJ1c2FnZShSVVNBR0VfU0VMRiwmc3RhcnQpOworICBmb3IoaT0wO2k8dHJpYWxzO2krKyl7CisjaWYgMAorICAgIGJsb2NrWzBdIF49IDB4ZmY7IC8qIEludHJvZHVjZSBhbiBlcnJvciAqLworICAgIGJsb2NrWzJdIF49IDB4ZmY7IC8qIEludHJvZHVjZSBhbiBlcnJvciAqLworI2VuZGlmCisgICAgZGVjb2RlX3JzX2NoYXIocnMsYmxvY2ssTlVMTCwwKTsKKyAgfQorICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJmZpbmlzaCk7CisgIGV4dGltZSA9IGZpbmlzaC5ydV91dGltZS50dl9zZWMgLSBzdGFydC5ydV91dGltZS50dl9zZWMgKyAxZS02KihmaW5pc2gucnVfdXRpbWUudHZfdXNlYyAtIHN0YXJ0LnJ1X3V0aW1lLnR2X3VzZWMpOworICAKKyAgcHJpbnRmKCJFeGVjdXRpb24gdGltZSBmb3IgJWQgUmVlZC1Tb2xvbW9uIGJsb2NrcyB1c2luZyBnZW5lcmFsIGRlY29kZXI6ICUuMmYgc2VjXG4iLHRyaWFscyxleHRpbWUpOworICBwcmludGYoImRlY29kZXIgc3BlZWQ6ICVnIGJpdHMvc1xuIix0cmlhbHMqMjIzKjgvZXh0aW1lKTsKKworCisgIGVuY29kZV9yc184KGJsb2NrLCZibG9ja1syMjNdLDApOworICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJnN0YXJ0KTsKKyAgZm9yKGk9MDtpPHRyaWFscztpKyspeworI2lmIDAKKyAgICBibG9ja1swXSBePSAweGZmOyAvKiBJbnRyb2R1Y2UgYW4gZXJyb3IgKi8KKyAgICBibG9ja1syXSBePSAweGZmOyAvKiBJbnRyb2R1Y2UgYW4gZXJyb3IgKi8KKyNlbmRpZgorICAgIGRlY29kZV9yc184KGJsb2NrLE5VTEwsMCwwKTsKKyAgfQorICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJmZpbmlzaCk7CisgIGV4dGltZSA9IGZpbmlzaC5ydV91dGltZS50dl9zZWMgLSBzdGFydC5ydV91dGltZS50dl9zZWMgKyAxZS02KihmaW5pc2gucnVfdXRpbWUudHZfdXNlYyAtIHN0YXJ0LnJ1X3V0aW1lLnR2X3VzZWMpOworICBwcmludGYoIkV4ZWN1dGlvbiB0aW1lIGZvciAlZCBSZWVkLVNvbG9tb24gYmxvY2tzIHVzaW5nIENDU0RTIGRlY29kZXI6ICUuMmYgc2VjXG4iLHRyaWFscyxleHRpbWUpOworICBwcmludGYoImRlY29kZXIgc3BlZWQ6ICVnIGJpdHMvc1xuIix0cmlhbHMqMjIzKjgvZXh0aW1lKTsKKworICBleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9mZWMvcnN0ZXN0LmMgYi9mZWMvcnN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YjQwYQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9yc3Rlc3QuYwpAQCAtMCwwICsxLDI5NiBAQAorLyogVGVzdCB0aGUgUmVlZC1Tb2xvbW9uIGNvZGVjcworICogZm9yIHZhcmlvdXMgYmxvY2sgc2l6ZXMgYW5kIHdpdGggcmFuZG9tIGRhdGEgYW5kIHJhbmRvbSBlcnJvciBwYXR0ZXJucworICoKKyAqIENvcHlyaWdodCAyMDAyIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImZlYy5oIgorCisKK3N0cnVjdCBldGFiIHsKKyAgaW50IHN5bXNpemU7CisgIGludCBnZW5wb2x5OworICBpbnQgZmNzOworICBpbnQgcHJpbTsKKyAgaW50IG5yb290czsKKyAgaW50IG50cmlhbHM7Cit9IFRhYltdID0geworICB7MiwgMHg3LCAgICAgMSwgICAxLCAxLCAxMCB9LAorICB7MywgMHhiLCAgICAgMSwgICAxLCAyLCAxMCB9LAorICB7NCwgMHgxMywgICAgMSwgICAxLCA0LCAxMCB9LAorICB7NSwgMHgyNSwgICAgMSwgICAxLCA2LCAxMCB9LAorICB7NiwgMHg0MywgICAgMSwgICAxLCA4LCAxMCB9LAorICB7NywgMHg4OSwgICAgMSwgICAxLCAxMCwgMTAgfSwKKyAgezgsIDB4MTFkLCAgIDEsICAgMSwgMzIsIDEwIH0sCisgIHs4LCAweDE4NywgICAxMTIsMTEsIDMyLCAxMCB9LCAvKiBEdXBsaWNhdGVzIENDU0RTIGNvZGVjICovCisgIHs5LCAweDIxMSwgICAxLCAgIDEsIDMyLCAxMCB9LAorICB7MTAsMHg0MDksICAgMSwgICAxLCAzMiwgMTAgfSwKKyAgezExLDB4ODA1LCAgIDEsICAgMSwgMzIsIDEwIH0sCisgIHsxMiwweDEwNTMsICAxLCAgIDEsIDMyLCA1IH0sCisgIHsxMywweDIwMWIsICAxLCAgIDEsIDMyLCAyIH0sCisgIHsxNCwweDQ0NDMsICAxLCAgIDEsIDMyLCAxIH0sCisgIHsxNSwweDgwMDMsICAxLCAgIDEsIDMyLCAxIH0sCisgIHsxNiwweDExMDBiLCAxLCAgIDEsIDMyLCAxIH0sCisgIHswLCAwLCAwLCAwLCAwfSwKK307CisKK2ludCBleGVyY2lzZV9jaGFyKHN0cnVjdCBldGFiICplKTsKK2ludCBleGVyY2lzZV9pbnQoc3RydWN0IGV0YWIgKmUpOworaW50IGV4ZXJjaXNlXzgodm9pZCk7CisKK2ludCBtYWluKCl7CisgIGludCBpOworCisgIHNyYW5kb20odGltZShOVUxMKSk7CisKKyAgcHJpbnRmKCJUZXN0aW5nIGZpeGVkIENDU0RTIGVuY29kZXIuLi5cbiIpOworICBleGVyY2lzZV84KCk7CisgIGZvcihpPTA7VGFiW2ldLnN5bXNpemUgIT0gMDtpKyspeworICAgIGludCBubixrazsKKworICAgIG5uID0gKDE8PFRhYltpXS5zeW1zaXplKSAtIDE7CisgICAga2sgPSBubiAtIFRhYltpXS5ucm9vdHM7CisgICAgcHJpbnRmKCJUZXN0aW5nICglZCwlZCkgY29kZS4uLlxuIixubixrayk7CisgICAgaWYoVGFiW2ldLnN5bXNpemUgPD0gOCkKKyAgICAgIGV4ZXJjaXNlX2NoYXIoJlRhYltpXSk7CisgICAgZWxzZQorICAgICAgZXhlcmNpc2VfaW50KCZUYWJbaV0pOworICB9CisgIGV4aXQoMCk7Cit9CisKK2ludCBleGVyY2lzZV84KHZvaWQpeworICBpbnQgbm4gPSAyNTU7CisgIHVuc2lnbmVkIGNoYXIgYmxvY2tbbm5dLHRibG9ja1tubl07CisgIGludCBlcnJsb2NzW25uXSxkZXJybG9jc1tubl07CisgIGludCBpOworICBpbnQgZXJyb3JzOworICBpbnQgZGVycm9ycyxrazsKKyAgaW50IGVycnZhbCxlcnJsb2M7CisgIGludCBlcmFzdXJlczsKKyAgaW50IGRlY29kZXJfZXJyb3JzID0gMDsKKworICAvKiBDb21wdXRlIGNvZGUgcGFyYW1ldGVycyAqLworICBrayA9IDIyMzsKKworCisgIC8qIFRlc3QgdXAgdG8gdGhlIGVycm9yIGNvcnJlY3Rpb24gY2FwYWNpdHkgb2YgdGhlIGNvZGUgKi8KKyAgZm9yKGVycm9ycz0wO2Vycm9yczw9KG5uLWtrKS8yO2Vycm9ycysrKXsKKworICAgIC8qIExvYWQgYmxvY2sgd2l0aCByYW5kb20gZGF0YSBhbmQgZW5jb2RlICovCisgICAgZm9yKGk9MDtpPGtrO2krKykKKyAgICAgIGJsb2NrW2ldID0gcmFuZG9tKCkgJiBubjsKKyAgICBtZW1jcHkodGJsb2NrLGJsb2NrLHNpemVvZihibG9jaykpOworICAgIGVuY29kZV9yc184KGJsb2NrLCZibG9ja1tra10sMCk7CisKKyAgICAvKiBNYWtlIHRlbXAgY29weSwgc2VlZCB3aXRoIGVycm9ycyAqLworICAgIG1lbWNweSh0YmxvY2ssYmxvY2ssc2l6ZW9mKGJsb2NrKSk7CisgICAgbWVtc2V0KGVycmxvY3MsMCxzaXplb2YoZXJybG9jcykpOworICAgIG1lbXNldChkZXJybG9jcywwLHNpemVvZihkZXJybG9jcykpOworICAgIGVyYXN1cmVzPTA7CisgICAgZm9yKGk9MDtpPGVycm9ycztpKyspeworICAgICAgZG8geworCWVycnZhbCA9IHJhbmRvbSgpICYgbm47CisgICAgICB9IHdoaWxlKGVycnZhbCA9PSAwKTsgLyogRXJyb3IgdmFsdWUgbXVzdCBiZSBub256ZXJvICovCisgICAgICAKKyAgICAgIGRvIHsKKwllcnJsb2MgPSByYW5kb20oKSAlIG5uOworICAgICAgfSB3aGlsZShlcnJsb2NzW2VycmxvY10gIT0gMCk7IC8qIE11c3Qgbm90IGNob29zZSB0aGUgc2FtZSBsb2NhdGlvbiB0d2ljZSAqLworICAgICAgCisgICAgICBlcnJsb2NzW2VycmxvY10gPSAxOworCisjaWYgRkxBR19FUkFTVVJFCisgICAgICBpZihyYW5kb20oKSAmIDEpIC8qIDUwLTUwIGNoYW5jZSAqLworCWRlcnJsb2NzW2VyYXN1cmVzKytdID0gZXJybG9jOworI2VuZGlmCisgICAgICB0YmxvY2tbZXJybG9jXSBePSBlcnJ2YWw7CisgICAgfQorCisgICAgLyogRGVjb2RlIHRoZSBlcnJvcmVkIGJsb2NrICovCisgICAgZGVycm9ycyA9IGRlY29kZV9yc184KHRibG9jayxkZXJybG9jcyxlcmFzdXJlcywwKTsKKworICAgIGlmKGRlcnJvcnMgIT0gZXJyb3JzKXsKKwlwcmludGYoIiglZCwlZCkgZGVjb2RlciBzYXlzICVkIGVycm9ycywgdHJ1ZSBudW1iZXIgaXMgJWRcbiIsbm4sa2ssZGVycm9ycyxlcnJvcnMpOworCWRlY29kZXJfZXJyb3JzKys7CisgICAgfQorICAgIGZvcihpPTA7aTxkZXJyb3JzO2krKyl7CisgICAgICBpZihlcnJsb2NzW2RlcnJsb2NzW2ldXSA9PSAwKXsKKwlwcmludGYoIiglZCwlZCkgZGVjb2RlciBpbmRpY2F0ZXMgZXJyb3IgaW4gbG9jYXRpb24gJWQgd2l0aG91dCBlcnJvclxuIixubixrayxkZXJybG9jc1tpXSk7CisJZGVjb2Rlcl9lcnJvcnMrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobWVtY21wKHRibG9jayxibG9jayxzaXplb2YodGJsb2NrKSkgIT0gMCl7CisgICAgICBwcmludGYoIiglZCwlZCkgZGVjb2RlciB1bmNvcnJlY3RlZCBlcnJvcnMhIG91dHB1dCBeIGlucHV0OiIsbm4sa2spOworICAgICAgZGVjb2Rlcl9lcnJvcnMrKzsKKyAgICAgIGZvcihpPTA7aTxubjtpKyspCisJcHJpbnRmKCIgJTAyeCIsdGJsb2NrW2ldIF4gYmxvY2tbaV0pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gZGVjb2Rlcl9lcnJvcnM7Cit9CisKKworaW50IGV4ZXJjaXNlX2NoYXIoc3RydWN0IGV0YWIgKmUpeworICBpbnQgbm4gPSAoMTw8ZS0+c3ltc2l6ZSkgLSAxOworICB1bnNpZ25lZCBjaGFyIGJsb2NrW25uXSx0YmxvY2tbbm5dOworICBpbnQgZXJybG9jc1tubl0sZGVycmxvY3Nbbm5dOworICBpbnQgaTsKKyAgaW50IGVycm9yczsKKyAgaW50IGRlcnJvcnMsa2s7CisgIGludCBlcnJ2YWwsZXJybG9jOworICBpbnQgZXJhc3VyZXM7CisgIGludCBkZWNvZGVyX2Vycm9ycyA9IDA7CisgIHZvaWQgKnJzOworCisgIGlmKGUtPnN5bXNpemUgPiA4KQorICAgIHJldHVybiAtMTsKKworICAvKiBDb21wdXRlIGNvZGUgcGFyYW1ldGVycyAqLworICBrayA9IG5uIC0gZS0+bnJvb3RzOworCisgIHJzID0gaW5pdF9yc19jaGFyKGUtPnN5bXNpemUsZS0+Z2VucG9seSxlLT5mY3MsZS0+cHJpbSxlLT5ucm9vdHMsMCk7CisgIGlmKHJzID09IE5VTEwpeworICAgIHByaW50ZigiaW5pdF9yc19jaGFyIGZhaWxlZCFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvKiBUZXN0IHVwIHRvIHRoZSBlcnJvciBjb3JyZWN0aW9uIGNhcGFjaXR5IG9mIHRoZSBjb2RlICovCisgIGZvcihlcnJvcnM9MDtlcnJvcnMgPD0gZS0+bnJvb3RzLzI7ZXJyb3JzKyspeworCisgICAgLyogTG9hZCBibG9jayB3aXRoIHJhbmRvbSBkYXRhIGFuZCBlbmNvZGUgKi8KKyAgICBmb3IoaT0wO2k8a2s7aSsrKQorICAgICAgYmxvY2tbaV0gPSByYW5kb20oKSAmIG5uOworICAgIG1lbWNweSh0YmxvY2ssYmxvY2ssc2l6ZW9mKGJsb2NrKSk7CisgICAgZW5jb2RlX3JzX2NoYXIocnMsYmxvY2ssJmJsb2NrW2trXSk7CisKKyAgICAvKiBNYWtlIHRlbXAgY29weSwgc2VlZCB3aXRoIGVycm9ycyAqLworICAgIG1lbWNweSh0YmxvY2ssYmxvY2ssc2l6ZW9mKGJsb2NrKSk7CisgICAgbWVtc2V0KGVycmxvY3MsMCxzaXplb2YoZXJybG9jcykpOworICAgIG1lbXNldChkZXJybG9jcywwLHNpemVvZihkZXJybG9jcykpOworICAgIGVyYXN1cmVzPTA7CisgICAgZm9yKGk9MDtpPGVycm9ycztpKyspeworICAgICAgZG8geworCWVycnZhbCA9IHJhbmRvbSgpICYgbm47CisgICAgICB9IHdoaWxlKGVycnZhbCA9PSAwKTsgLyogRXJyb3IgdmFsdWUgbXVzdCBiZSBub256ZXJvICovCisgICAgICAKKyAgICAgIGRvIHsKKwllcnJsb2MgPSByYW5kb20oKSAlIG5uOworICAgICAgfSB3aGlsZShlcnJsb2NzW2VycmxvY10gIT0gMCk7IC8qIE11c3Qgbm90IGNob29zZSB0aGUgc2FtZSBsb2NhdGlvbiB0d2ljZSAqLworICAgICAgCisgICAgICBlcnJsb2NzW2VycmxvY10gPSAxOworCisjaWYgRkxBR19FUkFTVVJFCisgICAgICBpZihyYW5kb20oKSAmIDEpIC8qIDUwLTUwIGNoYW5jZSAqLworCWRlcnJsb2NzW2VyYXN1cmVzKytdID0gZXJybG9jOworI2VuZGlmCisgICAgICB0YmxvY2tbZXJybG9jXSBePSBlcnJ2YWw7CisgICAgfQorCisgICAgLyogRGVjb2RlIHRoZSBlcnJvcmVkIGJsb2NrICovCisgICAgZGVycm9ycyA9IGRlY29kZV9yc19jaGFyKHJzLHRibG9jayxkZXJybG9jcyxlcmFzdXJlcyk7CisKKyAgICBpZihkZXJyb3JzICE9IGVycm9ycyl7CisJcHJpbnRmKCIoJWQsJWQpIGRlY29kZXIgc2F5cyAlZCBlcnJvcnMsIHRydWUgbnVtYmVyIGlzICVkXG4iLG5uLGtrLGRlcnJvcnMsZXJyb3JzKTsKKwlkZWNvZGVyX2Vycm9ycysrOworICAgIH0KKyAgICBmb3IoaT0wO2k8ZGVycm9ycztpKyspeworICAgICAgaWYoZXJybG9jc1tkZXJybG9jc1tpXV0gPT0gMCl7CisJcHJpbnRmKCIoJWQsJWQpIGRlY29kZXIgaW5kaWNhdGVzIGVycm9yIGluIGxvY2F0aW9uICVkIHdpdGhvdXQgZXJyb3JcbiIsbm4sa2ssZGVycmxvY3NbaV0pOworCWRlY29kZXJfZXJyb3JzKys7CisgICAgICB9CisgICAgfQorICAgIGlmKG1lbWNtcCh0YmxvY2ssYmxvY2ssc2l6ZW9mKHRibG9jaykpICE9IDApeworICAgICAgcHJpbnRmKCIoJWQsJWQpIGRlY29kZXIgdW5jb3JyZWN0ZWQgZXJyb3JzISBvdXRwdXQgXiBpbnB1dDoiLG5uLGtrKTsKKyAgICAgIGRlY29kZXJfZXJyb3JzKys7CisgICAgICBmb3IoaT0wO2k8bm47aSsrKQorCXByaW50ZigiICUwMngiLHRibG9ja1tpXSBeIGJsb2NrW2ldKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgIH0KKworICBmcmVlX3JzX2NoYXIocnMpOworICByZXR1cm4gMDsKK30KKworaW50IGV4ZXJjaXNlX2ludChzdHJ1Y3QgZXRhYiAqZSl7CisgIGludCBubiA9ICgxPDxlLT5zeW1zaXplKSAtIDE7CisgIGludCBibG9ja1tubl0sdGJsb2NrW25uXTsKKyAgaW50IGVycmxvY3Nbbm5dLGRlcnJsb2NzW25uXTsKKyAgaW50IGk7CisgIGludCBlcnJvcnM7CisgIGludCBkZXJyb3JzLGtrOworICBpbnQgZXJydmFsLGVycmxvYzsKKyAgaW50IGVyYXN1cmVzOworICBpbnQgZGVjb2Rlcl9lcnJvcnMgPSAwOworICB2b2lkICpyczsKKworICAvKiBDb21wdXRlIGNvZGUgcGFyYW1ldGVycyAqLworICBrayA9IG5uIC0gZS0+bnJvb3RzOworCisgIHJzID0gaW5pdF9yc19pbnQoZS0+c3ltc2l6ZSxlLT5nZW5wb2x5LGUtPmZjcyxlLT5wcmltLGUtPm5yb290cywwKTsKKyAgaWYocnMgPT0gTlVMTCl7CisgICAgcHJpbnRmKCJpbml0X3JzX2ludCBmYWlsZWQhXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLyogVGVzdCB1cCB0byB0aGUgZXJyb3IgY29ycmVjdGlvbiBjYXBhY2l0eSBvZiB0aGUgY29kZSAqLworICBmb3IoZXJyb3JzPTA7ZXJyb3JzIDw9IGUtPm5yb290cy8yO2Vycm9ycysrKXsKKworICAgIC8qIExvYWQgYmxvY2sgd2l0aCByYW5kb20gZGF0YSBhbmQgZW5jb2RlICovCisgICAgZm9yKGk9MDtpPGtrO2krKykKKyAgICAgIGJsb2NrW2ldID0gcmFuZG9tKCkgJiBubjsKKyAgICBtZW1jcHkodGJsb2NrLGJsb2NrLHNpemVvZihibG9jaykpOworICAgIGVuY29kZV9yc19pbnQocnMsYmxvY2ssJmJsb2NrW2trXSk7CisKKyAgICAvKiBNYWtlIHRlbXAgY29weSwgc2VlZCB3aXRoIGVycm9ycyAqLworICAgIG1lbWNweSh0YmxvY2ssYmxvY2ssc2l6ZW9mKGJsb2NrKSk7CisgICAgbWVtc2V0KGVycmxvY3MsMCxzaXplb2YoZXJybG9jcykpOworICAgIG1lbXNldChkZXJybG9jcywwLHNpemVvZihkZXJybG9jcykpOworICAgIGVyYXN1cmVzPTA7CisgICAgZm9yKGk9MDtpPGVycm9ycztpKyspeworICAgICAgZG8geworCWVycnZhbCA9IHJhbmRvbSgpICYgbm47CisgICAgICB9IHdoaWxlKGVycnZhbCA9PSAwKTsgLyogRXJyb3IgdmFsdWUgbXVzdCBiZSBub256ZXJvICovCisgICAgICAKKyAgICAgIGRvIHsKKwllcnJsb2MgPSByYW5kb20oKSAlIG5uOworICAgICAgfSB3aGlsZShlcnJsb2NzW2VycmxvY10gIT0gMCk7IC8qIE11c3Qgbm90IGNob29zZSB0aGUgc2FtZSBsb2NhdGlvbiB0d2ljZSAqLworICAgICAgCisgICAgICBlcnJsb2NzW2VycmxvY10gPSAxOworCisjaWYgRkxBR19FUkFTVVJFCisgICAgICBpZihyYW5kb20oKSAmIDEpIC8qIDUwLTUwIGNoYW5jZSAqLworCWRlcnJsb2NzW2VyYXN1cmVzKytdID0gZXJybG9jOworI2VuZGlmCisgICAgICB0YmxvY2tbZXJybG9jXSBePSBlcnJ2YWw7CisgICAgfQorCisgICAgLyogRGVjb2RlIHRoZSBlcnJvcmVkIGJsb2NrICovCisgICAgZGVycm9ycyA9IGRlY29kZV9yc19pbnQocnMsdGJsb2NrLGRlcnJsb2NzLGVyYXN1cmVzKTsKKworICAgIGlmKGRlcnJvcnMgIT0gZXJyb3JzKXsKKwlwcmludGYoIiglZCwlZCkgZGVjb2RlciBzYXlzICVkIGVycm9ycywgdHJ1ZSBudW1iZXIgaXMgJWRcbiIsbm4sa2ssZGVycm9ycyxlcnJvcnMpOworCWRlY29kZXJfZXJyb3JzKys7CisgICAgfQorICAgIGZvcihpPTA7aTxkZXJyb3JzO2krKyl7CisgICAgICBpZihlcnJsb2NzW2RlcnJsb2NzW2ldXSA9PSAwKXsKKwlwcmludGYoIiglZCwlZCkgZGVjb2RlciBpbmRpY2F0ZXMgZXJyb3IgaW4gbG9jYXRpb24gJWQgd2l0aG91dCBlcnJvclxuIixubixrayxkZXJybG9jc1tpXSk7CisJZGVjb2Rlcl9lcnJvcnMrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobWVtY21wKHRibG9jayxibG9jayxzaXplb2YodGJsb2NrKSkgIT0gMCl7CisgICAgICBwcmludGYoIiglZCwlZCkgZGVjb2RlciB1bmNvcnJlY3RlZCBlcnJvcnMhIG91dHB1dCBeIGlucHV0OiIsbm4sa2spOworICAgICAgZGVjb2Rlcl9lcnJvcnMrKzsKKyAgICAgIGZvcihpPTA7aTxubjtpKyspCisJcHJpbnRmKCIgJTAyeCIsdGJsb2NrW2ldIF4gYmxvY2tbaV0pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorCisgIGZyZWVfcnNfaW50KHJzKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZWMvc2ltLmMgYi9mZWMvc2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxYjA0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zaW0uYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCisjZGVmaW5lCU1BWF9SQU5ET00JMHg3ZmZmZmZmZgorCisvKiBHZW5lcmF0ZSBnYXVzc2lhbiByYW5kb20gZG91YmxlIHdpdGggc3BlY2lmaWVkIG1lYW4gYW5kIHN0ZF9kZXYgKi8KK2RvdWJsZSBub3JtYWxfcmFuZChkb3VibGUgbWVhbiwgZG91YmxlIHN0ZF9kZXYpCit7CisgIGRvdWJsZSBmYWMscnNxLHYxLHYyOworICBzdGF0aWMgZG91YmxlIGdzZXQ7CisgIHN0YXRpYyBpbnQgaXNldDsKKworICBpZihpc2V0KXsKKyAgICAvKiBBbHJlYWR5IGdvdCBvbmUgKi8KKyAgICBpc2V0ID0gMDsKKyAgICByZXR1cm4gbWVhbiArIHN0ZF9kZXYqZ3NldDsKKyAgfQorICAvKiBHZW5lcmF0ZSB0d28gZXZlbmx5IGRpc3RyaWJ1dGVkIG51bWJlcnMgYmV0d2VlbiAtMSBhbmQgKzEKKyAgICogdGhhdCBhcmUgaW5zaWRlIHRoZSB1bml0IGNpcmNsZQorICAgKi8KKyAgZG8geworICAgIHYxID0gMi4wICogKGRvdWJsZSlyYW5kb20oKSAvIE1BWF9SQU5ET00gLSAxOworICAgIHYyID0gMi4wICogKGRvdWJsZSlyYW5kb20oKSAvIE1BWF9SQU5ET00gLSAxOworICAgIHJzcSA9IHYxKnYxICsgdjIqdjI7CisgIH0gd2hpbGUocnNxID49IDEuMCB8fCByc3EgPT0gMC4wKTsKKyAgZmFjID0gc3FydCgtMi4wKmxvZyhyc3EpL3JzcSk7CisgIGdzZXQgPSB2MSpmYWM7CisgIGlzZXQrKzsKKyAgcmV0dXJuIG1lYW4gKyBzdGRfZGV2KnYyKmZhYzsKK30KKwordW5zaWduZWQgY2hhciBhZGRub2lzZShpbnQgc3ltLGRvdWJsZSBhbXAsZG91YmxlIGdhaW4sZG91YmxlIG9mZnNldCxpbnQgY2xpcCl7CisgIGludCBzYW1wbGU7CisgICAgCisgIHNhbXBsZSA9IG9mZnNldCArIGdhaW4qbm9ybWFsX3JhbmQoc3ltP2FtcDotYW1wLDEuMCk7CisgIC8qIENsaXAgdG8gOC1iaXQgb2Zmc2V0IHJhbmdlICovCisgIGlmKHNhbXBsZSA8IDApCisgICAgc2FtcGxlID0gMDsKKyAgZWxzZSBpZihzYW1wbGUgPiBjbGlwKQorICAgIHNhbXBsZSA9IGNsaXA7CisgIHJldHVybiBzYW1wbGU7Cit9CmRpZmYgLS1naXQgYS9mZWMvc2ltZC12aXRlcmJpLjMgYi9mZWMvc2ltZC12aXRlcmJpLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NzU5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zaW1kLXZpdGVyYmkuMwpAQCAtMCwwICsxLDI0NyBAQAorLlRIIFNJTUQtVklURVJCSSAzCisuU0ggTkFNRQorY3JlYXRlX3ZpdGVyYmkyNywgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsLCBpbml0X3ZpdGVyYmkyNywgdXBkYXRlX3ZpdGVyYmkyN19ibGssCitjaGFpbmJhY2tfdml0ZXJiaTI3LCBkZWxldGVfdml0ZXJiaTI3LAorY3JlYXRlX3ZpdGVyYmkyOSwgc2V0X3ZpdGVyYmlfMjlfcG9seW5vbWlhbCwgaW5pdF92aXRlcmJpMjksIHVwZGF0ZV92aXRlcmJpMjlfYmxrLAorY2hhaW5iYWNrX3ZpdGVyYmkyOSwgZGVsZXRlX3ZpdGVyYmkyOSwKK2NyZWF0ZV92aXRlcmJpMzksIHNldF92aXRlcmJpXzM5X3BvbHlub21pYWwsIGluaXRfdml0ZXJiaTM5LCB1cGRhdGVfdml0ZXJiaTM5X2JsaywKK2NoYWluYmFja192aXRlcmJpMzksIGRlbGV0ZV92aXRlcmJpMzksCitjcmVhdGVfdml0ZXJiaTYxNSwgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbCwgaW5pdF92aXRlcmJpNjE1LCB1cGRhdGVfdml0ZXJiaTYxNV9ibGssCitjaGFpbmJhY2tfdml0ZXJiaTYxNSwgZGVsZXRlX3ZpdGVyYmk2MTUgLVwgSUEzMiBTSU1ELWFzc2lzdGVkIFZpdGVyYmkgZGVjb2RlcnMKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgImZlYy5oIgordm9pZCAqY3JlYXRlX3ZpdGVyYmkyNyhpbnQgYmxvY2tsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWwoaW50IHBvbHlzWzJdKTsKK2ludCBpbml0X3ZpdGVyYmkyNyh2b2lkICp2cCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IHVwZGF0ZV92aXRlcmJpMjdfYmxrKHZvaWQgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkyNyh2b2lkICp2cCwgdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyNyh2b2lkICp2cCk7CisuZmkKKy5zcAorLm5mCisuZnQgQgordm9pZCAqY3JlYXRlX3ZpdGVyYmkyOShpbnQgYmxvY2tsZW4pOwordm9pZCBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWwoaW50IHBvbHlzWzJdKTsKK2ludCBpbml0X3ZpdGVyYmkyOSh2b2lkICp2cCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IHVwZGF0ZV92aXRlcmJpMjlfYmxrKHZvaWQgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkyOSh2b2lkICp2cCwgdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOSh2b2lkICp2cCk7CisuZmkKKy5zcAorLm5mCisuZnQgQgordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOShpbnQgYmxvY2tsZW4pOwordm9pZCBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWwoaW50IHBvbHlzWzNdKTsKK2ludCBpbml0X3ZpdGVyYmkzOSh2b2lkICp2cCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IHVwZGF0ZV92aXRlcmJpMzlfYmxrKHZvaWQgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyk7CitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkzOSh2b2lkICp2cCwgdW5zaWduZWQgY2hhciAqZGF0YSx1bnNpZ25lZCBpbnQgbmJpdHMsdW5zaWduZWQgaW50IGVuZHN0YXRlKTsKK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOSh2b2lkICp2cCk7CisuZmkKKy5zcAorLm5mCisuZnQgQgordm9pZCAqY3JlYXRlX3ZpdGVyYmk2MTUoaW50IGJsb2NrbGVuKTsKK3ZvaWQgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbChpbnQgcG9seXNbNl0pOworaW50IGluaXRfdml0ZXJiaTYxNSh2b2lkICp2cCxpbnQgc3RhcnRpbmdfc3RhdGUpOworaW50IHVwZGF0ZV92aXRlcmJpNjE1X2Jsayh2b2lkICp2cCx1bnNpZ25lZCBjaGFyIHN5bXNbXSxpbnQgbmJpdHMpOworaW50IGNoYWluYmFja192aXRlcmJpNjE1KHZvaWQgKnZwLCB1bnNpZ25lZCBjaGFyICpkYXRhLHVuc2lnbmVkIGludCBuYml0cyx1bnNpZ25lZCBpbnQgZW5kc3RhdGUpOwordm9pZCBkZWxldGVfdml0ZXJiaTYxNSh2b2lkICp2cCk7CisuZmkKKy5TSCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCBoaWdoIHBlcmZvcm1hbmNlIFZpdGVyYmkgZGVjb2RlcnMgZm9yIGZvdXIKK2NvbnZvbHV0aW9uYWwgY29kZXM6IGEgcmF0ZSAxLzIgY29uc3RyYWludCBsZW5ndGggNyAoaz03KSBjb2RlCisoInZpdGVyYmkyNyIpLCBhIHJhdGUgMS8yIGs9OSBjb2RlICgidml0ZXJiaTI5IiksCithIHJhdGUgMS8zIGs9OSBjb2RlICgidml0ZXJiaTM5IikgYW5kIGEgcmF0ZSAxLzYgaz0xNSBjb2RlICgidml0ZXJiaTYxNSIpLgorVGhlIGRlY29kZXJzIHVzZSB0aGUgSW50ZWwgSUEzMiBvciBQb3dlclBDIFNJTUQgaW5zdHJ1Y3Rpb24gc2V0cywgaWYgYXZhaWxhYmxlLCB0byBpbXByb3ZlCitkZWNvZGluZyBzcGVlZC4KKworT24gdGhlIElBMzIgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBTSU1EIGluc3RydWN0aW9uIHNldHMuIFRoZSBmaXJzdAorYW5kIG1vc3QgY29tbW9uIGlzIE1NWCwgaW50cm9kdWNlZCBvbiBsYXRlciBJbnRlbCBQZW50aXVtcyBhbmQgdGhlbiBvbgordGhlIEludGVsIFBlbnRpdW0gSUkgYW5kIG1vc3QgSW50ZWwgY2xvbmVzIChBTUQgSzYsIFRyYW5zbWV0YSBDcnVzb2UsCitldGMpLiAgU1NFIHdhcyBpbnRyb2R1Y2VkIG9uIHRoZSBQZW50aXVtIElJSSBhbmQgbGF0ZXIgaW1wbGVtZW50ZWQgaW4KK3RoZSBBTUQgQXRobG9uIDQgKEFNRCBjYWxscyBpdCAiM0QgTm93ISAgUHJvZmVzc2lvbmFsIikuIE1vc3QKK3JlY2VudGx5LCBTU0UyIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBJbnRlbCBQZW50aXVtIDQsIGFuZCBoYXMgYmVlbgorYWRvcHRlZCBieSBtb3JlIHJlY2VudCBBTUQgQ1BVcy4gVGhlIHByZXNlbmNlIG9mIFNTRTIgaW1wbGllcyB0aGUKK2V4aXN0ZW5jZSBvZiBTU0UsIHdoaWNoIGluIHR1cm4gaW1wbGllcyBNTVguCisKK0FsdGl2ZWMgaXMgdGhlIFBvd2VyUEMgU0lNRCBpbnN0cnVjdGlvbiBzZXQuIEl0IGlzIHJvdWdobHkgY29tcGFyYWJsZQordG8gU1NFMi4gQWx0aXZlYyB3YXMgaW50cm9kdWNlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgaW4gdGhlIEFwcGxlCitNYWNpbnRvc2ggRzQ7IGl0IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgRzUuIEFsdGl2ZWMgaXMgYWN0dWFsbHkgYQorTW90b3JvbGEgdHJhZGVtYXJrOyBBcHBsZSBjYWxscyBpdCAiVmVsb2NpdHkgRW5naW5lIiBhbmQgSUJNIGNhbGxzIGl0CisiVk1YIi4gQWxsIHJlZmVyIHRvIHRoZSBzYW1lIHRoaW5nLgorCitXaGVuIGJ1aWx0IGZvciB0aGUgSUEzMiBvciBQUEMgYXJjaGl0ZWN0dXJlcywgdGhlIGZ1bmN0aW9ucworYXV0b21hdGljYWxseSB1c2UgdGhlIG1vc3QgcG93ZXJmdWwgU0lNRCBpbnN0cnVjdGlvbiBzZXQgYXZhaWxhYmxlLiBJZgorbm8gU0lNRCBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSwgb3IgaWYgdGhlIGxpYnJhcnkgaXMgYnVpbHQgZm9yIGEKK25vbi1JQTMyLCBub24tUFBDIG1hY2hpbmUsIGEgcG9ydGFibGUgQyB2ZXJzaW9uIGlzIGV4ZWN1dGVkCitpbnN0ZWFkLgorCisuU0ggVVNBR0UKK0ZvdXIgdmVyc2lvbnMgb2YgZWFjaCBmdW5jdGlvbiBhcmUgcHJvdmlkZWQsIG9uZSBmb3IgZWFjaCBjb2RlLgorSW4gdGhlIGZvbGxvd2luZyBkaXNjdXNzaW9uLCBjaGFuZ2UgInZpdGVyYmkiIHRvICJ2aXRlcmJpMjciLCAidml0ZXJiaTI5IiwgInZpdGVyYmkzOSIKK29yICJ2aXRlcmJpNjE1IiBhcyBkZXNpcmVkLiAKKworQmVmb3JlIFZpdGVyYmkgZGVjb2RpbmcgY2FuIGJlZ2luLCBhbiBpbnN0YW5jZSBtdXN0IGZpcnN0IGJlIGNyZWF0ZWQgd2l0aAorXGZCY3JlYXRlX3ZpdGVyYmkoKVxmUi4gIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KK2FuIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlCitjb250YWluaW5nIHRoZSBwYXRoIG1ldHJpY3MgYW5kIHRoZSBicmFuY2gKK2RlY2lzaW9ucy4gXGZCY3JlYXRlX3ZpdGVyYmkoKVxmUiB0YWtlcyBvbmUgYXJndW1lbnQgdGhhdCBnaXZlcyB0aGUKK2xlbmd0aCBvZiB0aGUgZGF0YSBibG9jayBpbiBiaXRzLiBZb3UgXGZJbXVzdCBub3RcZlIgYXR0ZW1wdCB0bworZGVjb2RlIGEgYmxvY2sgbG9uZ2VyIHRoYW4gdGhlIGxlbmd0aCBnaXZlbiB0byBcZkJjcmVhdGVfdml0ZXJiaSgpXGZSLgorCitCZWZvcmUgZGVjb2RpbmcgYSBuZXcgZnJhbWUsCitcZkJpbml0X3ZpdGVyYmkoKVxmUiBtdXN0IGJlIGNhbGxlZCB0byByZXNldCB0aGUgZGVjb2RlciBzdGF0ZS4KK0l0IGFjY2VwdHMgdGhlIGluc3RhbmNlIHBvaW50ZXIgcmV0dXJuZWQgYnkKK1xmQmNyZWF0ZV92aXRlcmJpKClcZlIgYW5kIHRoZSBpbml0aWFsIHN0YXJ0aW5nIHN0YXRlIG9mIHRoZQorY29udm9sdXRpb25hbCBlbmNvZGVyICh1c3VhbGx5IDApLiBJZiB0aGUgaW5pdGlhbCBzdGFydGluZyBzdGF0ZSBpcyB1bmtub3duIG9yCitpbmNvcnJlY3QsIHRoZSBkZWNvZGVyIHdpbGwgc3RpbGwgZnVuY3Rpb24gYnV0IHRoZSBkZWNvZGVkIGRhdGEgbWF5IGJlCitpbmNvcnJlY3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jay4KKworQmxvY2tzIG9mIHJlY2VpdmVkIHN5bWJvbHMgYXJlIHByb2Nlc3NlZCB3aXRoIGNhbGxzIHRvCitcZkJ1cGRhdGVfdml0ZXJiaV9ibGsoKVxmUi4gIFRoZSBcZkJuYml0c1xmUiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZQorbnVtYmVyIG9mIFxmSWRhdGEgYml0c1xmUiAobm90IGNoYW5uZWwgc3ltYm9scykgcmVwcmVzZW50ZWQgYnkgdGhlCitcZkJzeW1zXGZSIGJ1ZmZlci4gKEZvciByYXRlIDEvMiBjb2RlcywgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluCitcZkJzeW1zXGZSIGlzIHR3aWNlIFxmSW5iaXRzXGZSLCBhbmQgc28gb24uKQorRWFjaCBzeW1ib2wgaXMgZXhwZWN0ZWQgdG8gcmFuZ2UKK2Zyb20gMCB0aHJvdWdoIDI1NSwgd2l0aCAwIGNvcnJlc3BvbmRpbmcgdG8gYSAic3Ryb25nIDAiIGFuZCAyNTUKK2NvcnJlc3BvbmRpbmcgdG8gYSAic3Ryb25nIDEiLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorZGV0ZXJtaW5pbmcgdGhlIHByb3BlciBwYWlyaW5nIG9mIGlucHV0IHN5bWJvbHMgKGNvbW1vbmx5IGtub3duIGFzCitkZWNvZGVyIHN5bWJvbCBwaGFzaW5nKS4KKworQXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHRoZSBkYXRhIGlzIHJlY292ZXJlZCB3aXRoIGEgY2FsbCB0bworXGZCY2hhaW5iYWNrX3ZpdGVyYmkoKVxmUi4gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHBvaW50ZXIgdG8gdGhlCitkZWNvZGVyIGluc3RhbmNlLCBhIHBvaW50ZXIgdG8gYSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZQorZGVjb2RlZCBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4sIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIChub3QgYnl0ZXMpCit0aGF0IGFyZSB0byBiZSBkZWNvZGVkLCBhbmQgdGhlIHRlcm1pbmFsIHN0YXRlIG9mIHRoZSBjb252b2x1dGlvbmFsCitlbmNvZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lICh1c3VhbGx5IDApLiBJZiB0aGUgdGVybWluYWwgc3RhdGUgaXMKK2luY29ycmVjdCBvciB1bmtub3duLCB0aGUgZGVjb2RlZCBkYXRhIGJpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUKK21heSBiZSB1bnJlbGlhYmxlLiBUaGUgZGVjb2RlZCBkYXRhIGlzIHdyaXR0ZW4gaW4gYmlnLWVuZGlhbiBvcmRlciwKK2kuZS4sIHRoZSBmaXJzdCBiaXQgaW4gdGhlIGZyYW1lIGlzIHdyaXR0ZW4gaW50byB0aGUgaGlnaCBvcmRlciBiaXQgb2YKK3RoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIuIElmIHRoZSBmcmFtZSBpcyBub3QgYW4gaW50ZWdyYWwgbnVtYmVyCitvZiBieXRlcyBsb25nLCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgZnJhbWUgd2lsbAorYmUgdW51c2VkLgorCitOb3RlIHRoYXQgdGhlIGRlY29kZXJzIGFzc3VtZSB0aGUgdXNlIG9mIGEgdGFpbCwgaS5lLiwgdGhlIGVuY29kaW5nCithbmQgdHJhbnNtaXNzaW9uIG9mIGEgc3VmZmljaWVudCBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGJleW9uZCB0aGUgZW5kCitvZiB0aGUgdXNlciBkYXRhIHRvIGZvcmNlIHRoZSBjb252b2x1dGlvbmFsIGVuY29kZXIgaW50byB0aGUga25vd24KK3Rlcm1pbmFsIHN0YXRlIGdpdmVuIHRvIFxmQmNoYWluYmFja192aXRlcmJpKClcZlIuIFRoZSB0YWlsIGlzCithbHdheXMgb25lIGJpdCBsZXNzIHRoYW4gdGhlIGNvbnN0cmFpbnQgbGVuZ3RoIG9mIHRoZSBjb2RlLCBzbyB0aGUgaz03Citjb2RlIHVzZXMgNiB0YWlsIGJpdHMgKDEyIHRhaWwgc3ltYm9scyksIHRoZSBrPTkgY29kZSB1c2VzIDggdGFpbCBiaXRzCisoMTYgdGFpbCBzeW1ib2xzKSBhbmQgdGhlIGs9MTUgY29kZSB1c2VzIDE0IHRhaWwgYml0cyAoODQgdGFpbAorc3ltYm9scykuCisKK1RoZSB0YWlsIGJpdHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoIGFyZ3VtZW50cyB0bworXGZCY3JlYXRlX3ZpdGVyYmkoKVxmUiBhbmQgXGZCY2hhaW5iYWNrX3ZpdGVyYmkoKVxmUi4gRm9yIGV4YW1wbGUsIGlmCit0aGUgYmxvY2sgY29udGFpbnMgMTAwMCB1c2VyIGJpdHMsIHRoZW4gdGhpcyB3b3VsZCBiZSB0aGUgbGVuZ3RoCitwYXJhbWV0ZXIgZ2l2ZW4gdG8gXGZCY3JlYXRlX3ZpdGVyYmkyNygpXGZSIGFuZAorXGZCY2hhaW5iYWNrX3ZpdGVyYmkyNygpXGZSLCBhbmQgXGZCdXBkYXRlX3ZpdGVyYmkyN19ibGsoKVxmUiB3b3VsZCBiZSBjYWxsZWQKK3dpdGggYSB0b3RhbCBvZiAyMDEyIHN5bWJvbHMgLSB0aGUgbGFzdCAxMiBlbmNvZGVkIHN5bWJvbHMKK3JlcHJlc2VudGluZyB0aGUgdGFpbCBiaXRzLgorCitBZnRlciB0aGUgY2FsbCB0byBcZkJjaGFpbmJhY2tfdml0ZXJiaSgpXGZSLCB0aGUgZGVjb2RlciBtYXkgYmUgcmVzZXQKK3dpdGggYSBjYWxsIHRvIFxmQmluaXRfdml0ZXJiaSgpXGZSIGFuZCBhbm90aGVyIGJsb2NrIGNhbiBiZSBkZWNvZGVkLgorQWx0ZXJuYXRpdmVseSwgXGZCZGVsZXRlX3ZpdGVyYmkoKVxmUiBjYW4gYmUgY2FsbGVkIHRvIGZyZWUgYWxsIHJlc291cmNlcwordXNlZCBieSB0aGUgVml0ZXJiaSBkZWNvZGVyLgorCitUaGUgXGZCc2V0X3ZpdGVyYmlfcG9seW5vbWlhbCgpXGZSIGZ1bmN0aW9uIGFsbG93cyB1c2Ugb2Ygb3RoZXIgdGhhbiB0aGUgZGVmYXVsdAorY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbHMuIEFsdGhvdWdoIG9ubHkgb25lIHNldCBvZiBwb2x5bm9taWFscyBhcmUgZ2VuZXJhbGx5Cit1c2VkIHdpdGggZWFjaCBjb2RlLCB0aGVyZSBjYW4gYXJlIGRpZmZlcmVudCBjb252ZW50aW9ucyBhcyB0byB0aGVpciBvcmRlciBhbmQKK3N5bWJvbCBwb2xhcml0eSwgYW5kIHRoZXNlIGZ1bmN0aW9ucyBzaW1wbGlmaWVzIHRoZWlyIHVzZS4KKworVGhlIGRlZmF1bHQgcG9seW5vbWlhbHMgZm9yIHRoZSB2aXRlcmJpMjcgcm91dGVzCithcmUgdGhvc2Ugb2YgdGhlIE5BU0EtSlBMIGNvbnZlbnRpb24gXGZJd2l0aG91dFxmUiBzeW1ib2wgaW52ZXJzaW9uLgorVGhlIE5BU0EtSlBMIGNvbnZlbnRpb24gbm9ybWFsbHkgaW52ZXJ0cyB0aGUgZmlyc3Qgc3ltYm9sLgorVGhlIENDU0RTL05BU0EtR1NGQyBjb252ZW50aW9uIHN3YXBzIHRoZSB0d28gc3ltYm9scyBhbmQgaW52ZXJ0cyB0aGUgc2Vjb25kLgorLnNwCitUbyBzZXQgdGhlIE5BU0EtSlBMIGNvbnZlbnRpb24gd2l0aCBzeW1ib2wgaW52ZXJzaW9uOgorLnNwCisubmYKKy5mdCBCCitpbnQgcG9seXNbMl0gPSB7IC1WMjdQT0xZQSxWMjdQT0xZQiB9Oworc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsKHBvbHlzKTsKKy5mdCBSCisuZmkKKy5zcAorYW5kIHRvIHNldCB0aGUgQ0NTRFMgY29udmVudGlvbiB3aXRoIHN5bWJvbCBpbnZlcnNpb246Cisuc3AKKy5uZgorLmZ0IEIKK2ludCBwb2x5c1syXSA9IHsgVjI3UE9MWUIsLVYyN1BPTFlBIH07CitzZXRfdml0ZXJiaTI3X3BvbHlub21pYWwocG9seXMpOworLmZ0IFIKKy5maQorLnNwCitUaGUgZGVmYXVsdCBwb2x5bm9taWFscyBmb3IgdGhlIHZpdGVyYmk2MTUgcm91dGluZXMKK2FyZSB0aG9zZSB1c2VkIGJ5IHRoZSBDYXNzaW5pIHNwYWNlY3JhZnQgXGZJd2l0aG91dFxmUgorc3ltYm9sIGludmVyc2lvbi4gTWFycyBQYXRoZmluZGVyIChNUEYpIGFuZCBTVEVSRU8KK3N3YXAgdGhlIHRoaXJkIGFuZCBmb3VydGggcG9seW5vbWlhbHMuCitCb3RoIGNvbnZlbnRpb25zIGludmVydCB0aGUKK2ZpcnN0LCB0aGlyZCBhbmQgZmlmdGggc3ltYm9scy4gUmVmZXIgdG8gZmVjLmggZm9yIHRoZSBwb2x5bm9taWFsIGNvbnN0YW50IGRlZmluaXRpb25zLgorLnNwCitUbyBzZXQgdGhlIENhc3NpbmkgY29udmVudGlvbiB3aXRoIHN5bWJvbCBpbnZlcnNpb24sIGRvIHRoZSBmb2xsb3dpbmc6CisKKy5uZgorLmZ0IEIKK2ludCBwb2x5c1s2XSA9IHsgLVY2MTVQT0xZQSxWNjE1UE9MWUIsLVY2MTVQT0xZQyxWNjE1UE9MWUQsLVY2MTVQT0xZRSxWNjE1UE9MWUYgfTsKK3NldF92aXRlcmJpNjE1X3BvbHlub21pYWwocG9seXMpOworLmZ0IFIKKy5maQorLnNwCithbmQgdG8gc2V0IHRoZSBNUEYvU1RFUkVPIGNvbnZlbnRpb24gd2l0aCBzeW1ib2wgaW52ZXJzaW9uOgorLnNwCisubmYKKy5mdCBCCitpbnQgcG9seXNbNl0gPSB7IC1WNjE1UE9MWUEsVjYxNVBPTFlCLC1WNjE1UE9MWUQsVjYxNVBPTFlDLC1WNjE1UE9MWUUsVjYxNVBPTFlGIH07CitzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsKHBvbHlzKTsKKy5mdCBSCisuZmkKKworRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBjb2RlCitnZW5lcmF0b3IgcG9seW5vbWlhbHMgZm9yIFxmSWFsbFxmUiBpbnN0YW5jZXMgb2YgY29ycmVzcG9uZGluZyBWaXRlcmJpIGRlY29kZXIsCitpbmNsdWRpbmcgdGhvc2UgYWxyZWFkeSBjcmVhdGVkLgorCisuU0ggRVJST1IgUEVSRk9STUFOQ0UKK1RoZXNlIGRlY29kZXJzIGhhdmUgYWxsIGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkIGFuZCBmb3VuZCB0byBwcm92aWRlCitwZXJmb3JtYW5jZSBjb25zaXN0ZW50IHdpdGggdGhhdCBleHBlY3RlZCBmb3Igc29mdC1kZWNpc2lvbiBWaXRlcmJpCitkZWNvZGluZyB3aXRoIDgtYml0IHN5bWJvbHMuCisKK0R1ZSB0byBpbnRlcm5hbCBkaWZmZXJlbmNlcywgdGhlIGltcGxlbWVudGF0aW9ucwordmFyeSBzbGlnaHRseSBpbiBlcnJvciBwZXJmb3JtYW5jZS4gSW4KK2dlbmVyYWwsIHRoZSBwb3J0YWJsZSBDIHZlcnNpb25zIGV4aGliaXQgdGhlIGJlc3QgZXJyb3IgcGVyZm9ybWFuY2UKK2JlY2F1c2UgdGhleSB1c2UgZnVsbC1zaXplZCBicmFuY2ggbWV0cmljcywgYW5kIHRoZSBNTVggdmVyc2lvbnMKK2V4aGliaXQgdGhlIHdvcnN0IGJlY2F1c2UgdGhleSB1c2UgOC1iaXQgYnJhbmNoIG1ldHJpY3Mgd2l0aCBtb2R1bG8KK2NvbXBhcmlzb25zLiBUaGUgU1NFLCBTU0UyIGFuZCBBbHRpdmVjIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcj0xLzIgaz03IGFuZAorcj0xLzIgaz05IGNvZGVzIHVzZSB1bnNpZ25lZAorOC1iaXQgYnJhbmNoIG1ldHJpY3MsIGFuZCBhcmUgYWxtb3N0IGFzIGdvb2QgYXMgdGhlIEMgdmVyc2lvbnMuICBUaGUKK3I9MS8zIGs9OSBhbmQgcj0xLzYgaz0xNSBjb2RlcyBhcmUgaW1wbGVtZW50ZWQgd2l0aCAxNi1iaXQgcGF0aCBtZXRyaWNzIGluIGFsbCBTSU1ECit2ZXJzaW9ucy4KKworLlNIIERJUkVDVCBBQ0NFU1MgVE8gU1BFQ0lGSUMgRlVOQ1RJT04gVkVSU0lPTlMKK0NhbGxpbmcgdGhlIGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUgYXV0b21hdGljYWxseSBjYWxscyB0aGUgYXBwcm9wcmlhdGUKK3ZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgQ1BVIHR5cGUgYW5kIGF2YWlsYWJsZSBTSU1ECitpbnN0cnVjdGlvbnMuIEEgcGFydGljdWxhciB2ZXJzaW9uIGNhbiBhbHNvIGJlIGNhbGxlZCBkaXJlY3RseSBieQorYXBwZW5kaW5nIHRoZSBhcHByb3ByaWF0ZSBzdWZmaXggdG8gdGhlIGZ1bmN0aW9uIG5hbWUuIFRoZSBhdmFpbGFibGUKK3N1ZmZpeGVzIGFyZSAiX21teCIsICJfc3NlIiwgIl9zc2UyIiwgIl9hdiIgYW5kICJfcG9ydCIsIGZvciB0aGUgTU1YLAorU1NFLCBTU0UyLCBBbHRpdmVjIGFuZCBwb3J0YWJsZSB2ZXJzaW9ucywgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwKK3RoZSBTU0UyIHZlcnNpb24gb2YgdGhlIHVwZGF0ZV92aXRlcmJpMjdfYmxrKCkgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQKK2FzIHVwZGF0ZV92aXRlcmJpMjdfYmxrX3NzZTIoKS4KKworTmF0dXJhbGx5LCB0aGUgX2F2IGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgb24gdGhlIFBvd2VyUEMgYW5kIHRoZQorX21teCwgX3NzZSBhbmQgX3NzZTIgdmVyc2lvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIElBLTMyLiBDYWxsaW5nCithIFNJTUQtZW5hYmxlZCBmdW5jdGlvbiBvbiBhIENQVSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYXBwcm9wcmlhdGUKK3NldCBvZiBpbnN0cnVjdGlvbnMgd2lsbCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBleGNlcHRpb24uCisKKy5TSCBSRVRVUk4gVkFMVUVTCitcZkJjcmVhdGVfdml0ZXJiaVxmUiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcKK3RoZSBkZWNvZGVyIHN0YXRlLiAKK1RoZSBvdGhlciBmdW5jdGlvbnMgcmV0dXJuIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4KKworLlNIIEFVVEhPUiAmIENPUFlSSUdIVAorUGhpbCBLYXJuLCBLQTlRIChrYXJuQGthOXEubmV0KQorCisuU0ggTElDRU5TRQorVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaW1pdGVkIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpLgorCisKZGlmZiAtLWdpdCBhL2ZlYy9zcXRlc3QuYyBiL2ZlYy9zcXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFiYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3NxdGVzdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIFZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0aGUgc3VtLW9mLXNxdWFyZSByb3V0aW5lcyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisvKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHRyaWdnZXIgbGVhZGluZy90cmFpbGluZyBhcnJheSBmcmFnbWVudCBoYW5kbGluZyAqLworI2RlZmluZSBOU0FNUCAyMDAwMDIKKyNkZWZpbmUgT0ZGU0VUIDEKKworbG9uZyBsb25nIHN1bXNxX3dxKHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7Citsb25nIGxvbmcgc3Vtc3Ffd3FfcmVmKHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7CisKK2ludCBtYWluKCl7CisgIGludCBpOworICBsb25nIGxvbmcgcmVzdWx0LHJyZXN1bHQ7CisgIHNpZ25lZCBzaG9ydCBzYW1wbGVzW05TQU1QXTsKKworICBzcmFuZG9tKHRpbWUoTlVMTCkpOworCisgIGZvcihpPTA7aTxOU0FNUDtpKyspCisgICAgc2FtcGxlc1tpXSA9IHJhbmRvbSgpICYgMHhmZmZmOworCisgIHJyZXN1bHQgPSBzdW1zcV93cSgmc2FtcGxlc1tPRkZTRVRdLE5TQU1QLU9GRlNFVCk7CisgIHJlc3VsdCA9IHN1bXNxX3dxKCZzYW1wbGVzW09GRlNFVF0sTlNBTVAtT0ZGU0VUKTsKKyAgaWYocmVzdWx0ID09IHJyZXN1bHQpeworICAgIHByaW50ZigiT0tcbiIpOworICB9IGVsc2UgeworICAgIHByaW50Zigic3VtIG1pc21hdGNoOiAlbGxkICE9ICVsbGRcbiIscmVzdWx0LHJyZXN1bHQpOworICB9CisgIGV4aXQoMCk7Cit9CisKK2xvbmcgbG9uZyBzdW1zcV93cV9yZWYoc2lnbmVkIHNob3J0ICppbixpbnQgY250KXsKKyAgbG9uZyBsb25nIHN1bSA9IDA7CisgIGludCBpOworCisgIGZvcihpPTA7aTxjbnQ7aSsrKXsKKyAgICBzdW0gKz0gKGxvbmcpaW5baV0gKiBpbltpXTsKKyAgfQorICByZXR1cm4gc3VtOworfQorCmRpZmYgLS1naXQgYS9mZWMvc3NlMmJmbHkyNy5zIGIvZmVjL3NzZTJiZmx5MjcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQyMmEyCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3NzZTJiZmx5MjcucwpAQCAtMCwwICsxLDIwMiBAQAorLyogSW50ZWwgU0lNRCAoU1NFMikgaW1wbGVtZW50YXRpb25zIG9mIFZpdGVyYmkgQUNTIGJ1dHRlcmZsaWVzCisgICBmb3IgNjQtc3RhdGUgKGs9NykgY29udm9sdXRpb25hbCBjb2RlCisgICBDb3B5cmlnaHQgMjAwMyBQaGlsIEthcm4sIEtBOVEKKyAgIFRoaXMgY29kZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKworICAgdm9pZCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19zc2UyKHN0cnVjdCB2MjcgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cykgOyAKKyovCisJIyBTU0UyICgxMjgtYml0IGludGVnZXIgU0lNRCkgdmVyc2lvbgorCSMgUmVxdWlyZXMgUGVudGl1bSA0IG9yIGJldHRlcgorCisJIyBUaGVzZSBhcmUgb2Zmc2V0cyBpbnRvIHN0cnVjdCB2MjcsIGRlZmluZWQgaW4gdml0ZXJiaTI3LmgKKwkuc2V0IERQLDEyOAorCS5zZXQgT0xETUVUUklDUywxMzIKKwkuc2V0IE5FV01FVFJJQ1MsMTM2CisJLnRleHQJCisJLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19zc2UyLEJyYW5jaHRhYjI3X3NzZTIKKwkudHlwZSB1cGRhdGVfdml0ZXJiaTI3X2Jsa19zc2UyLEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQordXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlMjoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVkaQorCXB1c2hsICVlZHgKKwlwdXNobCAlZWJ4CisJCisJbW92bCA4KCVlYnApLCVlZHgJIyBlZHggPSB2cAorCXRlc3RsICVlZHgsJWVkeAorCWpueiAgMGYKKwltb3ZsIC0xLCVlYXgKKwlqbXAgIGVycgkJCiswOgltb3ZsIE9MRE1FVFJJQ1MoJWVkeCksJWVzaQkjIGVzaSAtPiBvbGQgbWV0cmljcworCW1vdmwgTkVXTUVUUklDUyglZWR4KSwlZWRpCSMgZWRpIC0+IG5ldyBtZXRyaWNzCisJbW92bCBEUCglZWR4KSwlZWR4CSMgZWR4IC0+IGRlY2lzaW9ucworCisxOgltb3ZsIDE2KCVlYnApLCVlYXgJIyBlYXggPSBuYml0cworCWRlY2wgJWVheAorCWpsICAgMmYJCQkjIHBhc3NlZCB6ZXJvLCB3ZSdyZSBkb25lCisJbW92bCAlZWF4LDE2KCVlYnApCisKKwl4b3JsICVlYXgsJWVheAorCW1vdmwgMTIoJWVicCksJWVieAkjIGVieCA9IHN5bXMKKwltb3ZiICglZWJ4KSwlYWwKKwltb3ZkICVlYXgsJXhtbTYJCSMgeG1tNlswXSA9IGZpcnN0IHN5bWJvbAorCW1vdmIgMSglZWJ4KSwlYWwKKwltb3ZkICVlYXgsJXhtbTUJCSMgeG1tNVswXSA9IHNlY29uZCBzeW1ib2wKKwlhZGRsICQyLCVlYngKKwltb3ZsICVlYngsMTIoJWVicCkKKworCXB1bnBja2xidyAleG1tNiwleG1tNgkjIHhtbTZbMV0gPSB4bW02WzBdCisJcHVucGNrbGJ3ICV4bW01LCV4bW01CisJcHNodWZsdyAkMCwleG1tNiwleG1tNgkjIGNvcHkgbG93IHdvcmQgdG8gbG93IDMKKwlwc2h1Zmx3ICQwLCV4bW01LCV4bW01CisJcHVucGNrbHFkcSAleG1tNiwleG1tNiAgIyBwcm9wYWdhdGUgdG8gYWxsIDE2CisJcHVucGNrbHFkcSAleG1tNSwleG1tNQorCSMgeG1tNiBub3cgY29udGFpbnMgZmlyc3Qgc3ltYm9sIGluIGVhY2ggYnl0ZSwgeG1tNSB0aGUgc2Vjb25kCisKKwltb3ZkcWEgdGhpcnR5b25lcywleG1tNworCQorCSMgZWFjaCBpbnZvY2F0aW9uIG9mIHRoaXMgbWFjcm8gZG9lcyAxNiBidXR0ZXJmbGllcyBpbiBwYXJhbGxlbAorCS5NQUNSTyBidXR0ZXJmbHkgR1JPVVAKKwkjIGNvbXB1dGUgYnJhbmNoIG1ldHJpY3MKKwltb3ZkcWEgQnJhbmNodGFiMjdfc3NlMisoMTYqXEdST1VQKSwleG1tNAorCW1vdmRxYSBCcmFuY2h0YWIyN19zc2UyKzMyKygxNipcR1JPVVApLCV4bW0zCisJcHhvciAleG1tNiwleG1tNAorCXB4b3IgJXhtbTUsJXhtbTMKKwkKKwkjIGNvbXB1dGUgNS1iaXQgYnJhbmNoIG1ldHJpYyBpbiB4bW00IGJ5IGFkZGluZyB0aGUgaW5kaXZpZHVhbCBzeW1ib2wgbWV0cmljcworCSMgVGhpcyBpcyBva2F5IGZvciB0aGlzCisJIyBjb2RlIGJlY2F1c2UgdGhlIHdvcnN0LWNhc2UgbWV0cmljIHNwcmVhZCAoYXQgaGlnaCBFYi9ObykgaXMgb25seSAxMjAsCisJIyB3ZWxsIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygb3VyIHVuc2lnbmVkIDgtYml0IHBhdGggbWV0cmljcywgYW5kIGV2ZW4gd2l0aGluCisJIyB0aGUgcmFuZ2Ugb2Ygc2lnbmVkIDgtYml0IHBhdGggbWV0cmljcworCXBhdmdiICV4bW0zLCV4bW00CisJcHNybHcgJDMsJXhtbTQKKworCXBhbmQgJXhtbTcsJXhtbTQKKworCW1vdmRxYSAoMTYqXEdST1VQKSglZXNpKSwleG1tMAkjIEluY29taW5nIHBhdGggbWV0cmljLCBoaWdoIGJpdCA9IDAKKwltb3ZkcWEgKCgxNipcR1JPVVApKzMyKSglZXNpKSwleG1tMwkjIEluY29taW5nIHBhdGggbWV0cmljLCBoaWdoIGJpdCA9IDEKKwltb3ZkcWEgJXhtbTAsJXhtbTIKKwltb3ZkcWEgJXhtbTMsJXhtbTEKKwlwYWRkdXNiICV4bW00LCV4bW0wCSMgbm90ZSB1c2Ugb2Ygc2F0dXJhdGluZyBhcml0aG1ldGljCisJcGFkZHVzYiAleG1tNCwleG1tMwkjIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IHdoeSBub3Q/CisJCisJIyBuZWdhdGUgYnJhbmNoIG1ldHJpY3MKKwlweG9yICV4bW03LCV4bW00CisJcGFkZHVzYiAleG1tNCwleG1tMQorCXBhZGR1c2IgJXhtbTQsJXhtbTIJCisJCisJIyBGaW5kIHN1cnZpdm9ycywgbGVhdmUgaW4gbW0wLDIKKwlwbWludWIgJXhtbTEsJXhtbTAKKwlwbWludWIgJXhtbTMsJXhtbTIKKwkjIGdldCBkZWNpc2lvbnMsIGxlYXZlIGluIG1tMSwzCisJcGNtcGVxYiAleG1tMCwleG1tMQorCXBjbXBlcWIgJXhtbTIsJXhtbTMKKwkKKwkjIGludGVybGVhdmUgYW5kIHN0b3JlIG5ldyBicmFuY2ggbWV0cmljcyBpbiBtbTAsMgorCW1vdmRxYSAleG1tMCwleG1tNAorCXB1bnBja2hidyAleG1tMiwleG1tMAkjIGludGVybGVhdmUgc2Vjb25kIDE2IG5ldyBtZXRyaWNzCisJcHVucGNrbGJ3ICV4bW0yLCV4bW00CSMgaW50ZXJsZWF2ZSBmaXJzdCAxNiBuZXcgbWV0cmljcworCW1vdmRxYSAleG1tMCwoMzIqXEdST1VQKzE2KSglZWRpKQorCW1vdmRxYSAleG1tNCwoMzIqXEdST1VQKSglZWRpKQorCisJIyBpbnRlcmxlYXZlIGRlY2lzaW9ucyAmIHN0b3JlCisJbW92ZHFhICV4bW0xLCV4bW00CisJcHVucGNraGJ3ICV4bW0zLCV4bW0xCisJcHVucGNrbGJ3ICV4bW0zLCV4bW00CisJIyB3b3JrIGFyb3VuZCBidWcgaW4gZ2FzIGR1ZSB0byBJbnRlbCBkb2MgZXJyb3IKKwkuYnl0ZSAweDY2LDB4MGYsMHhkNywweGQ5CSMgcG1vdm1za2IgJXhtbTEsJWVieAorCXNobGwgJDE2LCVlYngKKwkuYnl0ZSAweDY2LDB4MGYsMHhkNywweGM0CSMgcG1vdm1za2IgJXhtbTQsJWVheAorCW9ybCAlZWF4LCVlYngKKwltb3ZsICVlYngsKDQqXEdST1VQKSglZWR4KQorCS5lbmRtCisKKwkjIGludm9rZSBtYWNybyAyIHRpbWVzIGZvciBhIHRvdGFsIG9mIDMyIGJ1dHRlcmZsaWVzCisJYnV0dGVyZmx5IEdST1VQPTAKKwlidXR0ZXJmbHkgR1JPVVA9MQorCisJYWRkbCAkOCwlZWR4CQkjIGJ1bXAgZGVjaXNpb24gcG9pbnRlcgorCQkKKwkjIFNlZSBpZiB3ZSBoYXZlIHRvIG5vcm1hbGl6ZS4gVGhpcyByZXF1aXJlcyBhbiBleHBsYW5hdGlvbi4gV2UgZG9uJ3Qgd2FudAorCSMgb3VyIHBhdGggbWV0cmljcyB0byBleGNlZWQgMjU1IG9uIHRoZSAqbmV4dCogaXRlcmF0aW9uLiBTaW5jZSB0aGUKKwkjIGxhcmdlc3QgYnJhbmNoIG1ldHJpYyBpcyAzMCwgdGhhdCBtZWFucyB3ZSBkb24ndCB3YW50IGFueSB0byBleGNlZWQgMjI1CisJIyBvbiAqdGhpcyogaXRlcmF0aW9uLiBSYXRoZXIgdGhhbiBsb29rIHRoZW0gYWxsLCB3ZSBqdXN0IHBpY2sgYW4gYXJiaXRyYXJ5IG9uZQorCSMgKHRoZSBmaXJzdCkgYW5kIHNlZSBpZiBpdCBleGNlZWRzIDIyNS0xMjA9MTA1LCB3aGVyZSAxMjAgaXMgdGhlIGV4cGVyaW1lbnRhbGx5LQorCSMgZGV0ZXJtaW5lZCB3b3JzdC1jYXNlIG1ldHJpYyBzcHJlYWQgZm9yIHRoaXMgY29kZSBhbmQgYnJhbmNoIG1ldHJpY3MgaW4gdGhlIHJhbmdlIDAtMzAuCisJCisJIyBUaGlzIGlzIGV4dHJlbWVseSBjb25zZXJ2YXRpdmUsIGFuZCBlbXBpcmljYWwgdGVzdGluZyBhdCBhIHZhcmlldHkgb2YgRWIvTm9zIG1pZ2h0CisJIyBzaG93IHRoYXQgYSBoaWdoZXIgdGhyZXNob2xkIGNvdWxkIGJlIHVzZWQgd2l0aG91dCBhZmZlY3RpbmcgQkVSIHBlcmZvcm1hbmNlCisJbW92bCAoJWVkaSksJWVheAkjIGV4dHJhY3QgZmlyc3Qgb3V0cHV0IG1ldHJpYworCWFuZGwgJDI1NSwlZWF4CisJY21wICQxMDUsJWVheAorCWpsZSBkb25lCQkjIE5vLCBubyBuZWVkIHRvIG5vcm1hbGl6ZQorCisJIyBOb3JtYWxpemUgYnkgZmluZGluZyBzbWFsbGVzdCBtZXRyaWMgYW5kIHN1YnRyYWN0aW5nIGl0CisJIyBmcm9tIGFsbCBtZXRyaWNzLiBXZSBjYW4ndCBqdXN0IHBpY2sgYW4gYXJiaXRyYXJ5IHNtYWxsIGNvbnN0YW50IGJlY2F1c2UKKwkjIHRoZSBtaW5pbXVtIG1ldHJpYyBtaWdodCBiZSB6ZXJvIQorCW1vdmRxYSAoJWVkaSksJXhtbTAKKwltb3ZkcWEgJXhtbTAsJXhtbTQJCisJbW92ZHFhIDE2KCVlZGkpLCV4bW0xCisJcG1pbnViICV4bW0xLCV4bW00CisJbW92ZHFhIDMyKCVlZGkpLCV4bW0yCisJcG1pbnViICV4bW0yLCV4bW00CQorCW1vdmRxYSA0OCglZWRpKSwleG1tMwkKKwlwbWludWIgJXhtbTMsJXhtbTQKKworCSMgY3J1bmNoIGRvd24gdG8gc2luZ2xlIGxvd2VzdCBtZXRyaWMKKwltb3ZkcWEgJXhtbTQsJXhtbTUKKwlwc3JsZHEgJDgsJXhtbTUgICAgICMgdGhlIGNvdW50IHRvIHBzcmxkcSBpcyBieXRlcywgbm90IGJpdHMhCisJcG1pbnViICV4bW01LCV4bW00CisJbW92ZHFhICV4bW00LCV4bW01CisJcHNybHEgJDMyLCV4bW01CisJcG1pbnViICV4bW01LCV4bW00CisJbW92ZHFhICV4bW00LCV4bW01CisJcHNybHEgJDE2LCV4bW01CisJcG1pbnViICV4bW01LCV4bW00CisJbW92ZHFhICV4bW00LCV4bW01CisJcHNybHEgJDgsJXhtbTUKKwlwbWludWIgJXhtbTUsJXhtbTQJIyBub3cgaW4gbG93ZXN0IGJ5dGUgb2YgJXhtbTQKKworCXB1bnBja2xidyAleG1tNCwleG1tNAkjIGxvd2VzdCAyIGJ5dGVzCisJcHNodWZsdyAkMCwleG1tNCwleG1tNCAgIyBsb3dlc3QgOCBieXRlcworCXB1bnBja2xxZHEgJXhtbTQsJXhtbTQJIyBhbGwgMTYgYnl0ZXMKKwkKKwkjIHhtbTQgbm93IGNvbnRhaW5zIGxvd2VzdCBtZXRyaWMgaW4gYWxsIDE2IGJ5dGVzCisJIyBzdWJ0cmFjdCBpdCBmcm9tIGV2ZXJ5IG91dHB1dCBtZXRyaWMKKwlwc3VidXNiICV4bW00LCV4bW0wCisJcHN1YnVzYiAleG1tNCwleG1tMQorCXBzdWJ1c2IgJXhtbTQsJXhtbTIKKwlwc3VidXNiICV4bW00LCV4bW0zCQorCW1vdmRxYSAleG1tMCwoJWVkaSkKKwltb3ZkcWEgJXhtbTEsMTYoJWVkaSkJCisJbW92ZHFhICV4bW0yLDMyKCVlZGkpCQorCW1vdmRxYSAleG1tMyw0OCglZWRpKQkKKwkKK2RvbmU6CQkKKwkjIHN3YXAgbWV0cmljcworCW1vdmwgJWVzaSwlZWF4CisJbW92bCAlZWRpLCVlc2kKKwltb3ZsICVlYXgsJWVkaQorCWptcCAxYgorCQorMjoJbW92bCA4KCVlYnApLCVlYngJIyBlYnggPSB2cAorCSMgc3Rhc2ggbWV0cmljIHBvaW50ZXJzCisJbW92bCAlZXNpLE9MRE1FVFJJQ1MoJWVieCkKKwltb3ZsICVlZGksTkVXTUVUUklDUyglZWJ4KQorCW1vdmwgJWVkeCxEUCglZWJ4KQkjIHN0YXNoIGluY3JlbWVudGVkIHZhbHVlIG9mIHZwLT5kcAorCXhvcmwgJWVheCwlZWF4CitlcnI6CXBvcGwgJWVieAorCXBvcGwgJWVkeAorCXBvcGwgJWVkaQorCXBvcGwgJWVzaQorCXBvcGwgJWVicAorCXJldAorCisJLmRhdGEKKwkuYWxpZ24gMTYKKwordGhpcnR5b25lczoKKwkuYnl0ZSAzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMSwzMQpkaWZmIC0tZ2l0IGEvZmVjL3NzZTJiZmx5MjkucyBiL2ZlYy9zc2UyYmZseTI5LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhMTc0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zc2UyYmZseTI5LnMKQEAgLTAsMCArMSwyNDUgQEAKKy8qIEludGVsIFNJTUQgU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBWaXRlcmJpIEFDUyBidXR0ZXJmbGllcworICAgZm9yIDI1Ni1zdGF0ZSAoaz05KSBjb252b2x1dGlvbmFsIGNvZGUKKyAgIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICAgVGhpcyBjb2RlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorCisgICB2b2lkIHVwZGF0ZV92aXRlcmJpMjlfYmxrX3NzZTIoc3RydWN0IHYyOSAqdnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpIDsgCisqLworCisJIyBTU0UyICgxMjgtYml0IGludGVnZXIgU0lNRCkgdmVyc2lvbgorCSMgUmVxdWlyZXMgUGVudGl1bSA0IG9yIGJldHRlcgorCSMgVGhlc2UgYXJlIG9mZnNldHMgaW50byBzdHJ1Y3QgdjI5LCBkZWZpbmVkIGluIHZpdGVyYmkyOS5oCisJLnNldCBEUCw1MTIKKwkuc2V0IE9MRE1FVFJJQ1MsNTE2CisJLnNldCBORVdNRVRSSUNTLDUyMAorCisJLnRleHQJCisJLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI5X2Jsa19zc2UyLEJyYW5jaHRhYjI5X3NzZTIKKwkudHlwZSB1cGRhdGVfdml0ZXJiaTI5X2Jsa19zc2UyLEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQordXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlMjoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVkaQorCXB1c2hsICVlZHgKKwlwdXNobCAlZWJ4CisJCisJbW92bCA4KCVlYnApLCVlZHgJIyBlZHggPSB2cAorCXRlc3RsICVlZHgsJWVkeAorCWpueiAgMGYKKwltb3ZsIC0xLCVlYXgKKwlqbXAgIGVycgkJCiswOgltb3ZsIE9MRE1FVFJJQ1MoJWVkeCksJWVzaQkjIGVzaSAtPiBvbGQgbWV0cmljcworCW1vdmwgTkVXTUVUUklDUyglZWR4KSwlZWRpCSMgZWRpIC0+IG5ldyBtZXRyaWNzCisJbW92bCBEUCglZWR4KSwlZWR4CSMgZWR4IC0+IGRlY2lzaW9ucworCisxOgltb3ZsIDE2KCVlYnApLCVlYXgJIyBlYXggPSBuYml0cworCWRlY2wgJWVheAorCWpsICAgMmYJCQkjIHBhc3NlZCB6ZXJvLCB3ZSdyZSBkb25lCisJbW92bCAlZWF4LDE2KCVlYnApCisJCisJeG9ybCAlZWF4LCVlYXgKKwltb3ZsIDEyKCVlYnApLCVlYngJIyBlYnggPSBzeW1zCisJbW92YiAoJWVieCksJWFsCisJbW92ZCAlZWF4LCV4bW02CQkjIHhtbTZbMF0gPSBmaXJzdCBzeW1ib2wKKwltb3ZiIDEoJWVieCksJWFsCisJbW92ZCAlZWF4LCV4bW01CQkjIHhtbTVbMF0gPSBzZWNvbmQgc3ltYm9sCisJYWRkbCAkMiwlZWJ4CisJbW92bCAlZWJ4LDEyKCVlYnApCisKKwlwdW5wY2tsYncgJXhtbTYsJXhtbTYJIyB4bW02WzFdID0geG1tNlswXQorCXB1bnBja2xidyAleG1tNSwleG1tNQorCW1vdmRxYSB0aGlydHlvbmVzLCV4bW03CisJcHNodWZsdyAkMCwleG1tNiwleG1tNgkjIGNvcHkgbG93IHdvcmQgdG8gbG93IDMKKwlwc2h1Zmx3ICQwLCV4bW01LCV4bW01CisJcHVucGNrbHFkcSAleG1tNiwleG1tNiAgIyBwcm9wYWdhdGUgdG8gYWxsIDE2CisJcHVucGNrbHFkcSAleG1tNSwleG1tNQorCSMgeG1tNiBub3cgY29udGFpbnMgZmlyc3Qgc3ltYm9sIGluIGVhY2ggYnl0ZSwgeG1tNSB0aGUgc2Vjb25kCisKKwltb3ZkcWEgdGhpcnR5b25lcywleG1tNworCQorCSMgZWFjaCBpbnZvY2F0aW9uIG9mIHRoaXMgbWFjcm8gZG9lcyAxNiBidXR0ZXJmbGllcyBpbiBwYXJhbGxlbAorCS5NQUNSTyBidXR0ZXJmbHkgR1JPVVAKKwkjIGNvbXB1dGUgYnJhbmNoIG1ldHJpY3MKKwltb3ZkcWEgQnJhbmNodGFiMjlfc3NlMisoMTYqXEdST1VQKSwleG1tNAorCW1vdmRxYSBCcmFuY2h0YWIyOV9zc2UyKzEyOCsoMTYqXEdST1VQKSwleG1tMworCXB4b3IgJXhtbTYsJXhtbTQKKwlweG9yICV4bW01LCV4bW0zCisJcGF2Z2IgJXhtbTMsJXhtbTQKKwlwc3JsdyAkMywleG1tNAorCisJcGFuZCAleG1tNywleG1tNAkjIHhtbTQgY29udGFpbnMgYnJhbmNoIG1ldHJpY3MKKwkKKwltb3ZkcWEgKDE2KlxHUk9VUCkoJWVzaSksJXhtbTAJIyBJbmNvbWluZyBwYXRoIG1ldHJpYywgaGlnaCBiaXQgPSAwCisJbW92ZHFhICgoMTYqXEdST1VQKSsxMjgpKCVlc2kpLCV4bW0zCSMgSW5jb21pbmcgcGF0aCBtZXRyaWMsIGhpZ2ggYml0ID0gMQorCW1vdmRxYSAleG1tMCwleG1tMgorCW1vdmRxYSAleG1tMywleG1tMQorCXBhZGR1c2IgJXhtbTQsJXhtbTAKKwlwYWRkdXNiICV4bW00LCV4bW0zCisJCisJIyBpbnZlcnQgYnJhbmNoIG1ldHJpY3MKKwlweG9yICV4bW03LCV4bW00CisJCisJcGFkZHVzYiAleG1tNCwleG1tMQorCXBhZGR1c2IgJXhtbTQsJXhtbTIKKwkKKwkjIEZpbmQgc3Vydml2b3JzLCBsZWF2ZSBpbiBtbTAsMgorCXBtaW51YiAleG1tMSwleG1tMAorCXBtaW51YiAleG1tMywleG1tMgorCSMgZ2V0IGRlY2lzaW9ucywgbGVhdmUgaW4gbW0xLDMKKwlwY21wZXFiICV4bW0wLCV4bW0xCisJcGNtcGVxYiAleG1tMiwleG1tMworCQorCSMgaW50ZXJsZWF2ZSBhbmQgc3RvcmUgbmV3IGJyYW5jaCBtZXRyaWNzIGluIG1tMCwyCisJbW92ZHFhICV4bW0wLCV4bW00CisJcHVucGNraGJ3ICV4bW0yLCV4bW0wCSMgaW50ZXJsZWF2ZSBzZWNvbmQgMTYgbmV3IG1ldHJpY3MKKwlwdW5wY2tsYncgJXhtbTIsJXhtbTQJIyBpbnRlcmxlYXZlIGZpcnN0IDE2IG5ldyBtZXRyaWNzCisJbW92ZHFhICV4bW0wLCgzMipcR1JPVVArMTYpKCVlZGkpCisJbW92ZHFhICV4bW00LCgzMipcR1JPVVApKCVlZGkpCisKKwkjIGludGVybGVhdmUgZGVjaXNpb25zICYgc3RvcmUKKwltb3ZkcWEgJXhtbTEsJXhtbTQKKwlwdW5wY2toYncgJXhtbTMsJXhtbTEKKwlwdW5wY2tsYncgJXhtbTMsJXhtbTQKKwkjIHdvcmsgYXJvdW5kIGJ1ZyBpbiBnYXMgZHVlIHRvIEludGVsIGRvYyBlcnJvcgorCS5ieXRlIDB4NjYsMHgwZiwweGQ3LDB4ZDkJIyBwbW92bXNrYiAleG1tMSwlZWJ4CisJc2hsbCAkMTYsJWVieAorCS5ieXRlIDB4NjYsMHgwZiwweGQ3LDB4YzQJIyBwbW92bXNrYiAleG1tNCwlZWF4CisJb3JsICVlYXgsJWVieAorCW1vdmwgJWVieCwoNCpcR1JPVVApKCVlZHgpCisJLmVuZG0KKworCSMgaW52b2tlIG1hY3JvIDggdGltZXMgZm9yIGEgdG90YWwgb2YgMTI4IGJ1dHRlcmZsaWVzCisJYnV0dGVyZmx5IEdST1VQPTAKKwlidXR0ZXJmbHkgR1JPVVA9MQorCWJ1dHRlcmZseSBHUk9VUD0yCisJYnV0dGVyZmx5IEdST1VQPTMKKwlidXR0ZXJmbHkgR1JPVVA9NAorCWJ1dHRlcmZseSBHUk9VUD01CisJYnV0dGVyZmx5IEdST1VQPTYKKwlidXR0ZXJmbHkgR1JPVVA9NworCisJYWRkbCAkMzIsJWVkeAkJIyBidW1wIGRlY2lzaW9uIHBvaW50ZXIKKwkJCisJIyBzZWUgaWYgd2UgaGF2ZSB0byBub3JtYWxpemUKKwltb3ZsICglZWRpKSwlZWF4CSMgZXh0cmFjdCBmaXJzdCBvdXRwdXQgbWV0cmljCisJYW5kbCAkMjU1LCVlYXgKKwljbXAgJDUwLCVlYXgJCSMgaXMgaXQgZ3JlYXRlciB0aGFuIDUwPworCW1vdmwgJDAsJWVheAorCWpsZSBkb25lCQkjIE5vLCBubyBuZWVkIHRvIG5vcm1hbGl6ZQorCisJIyBOb3JtYWxpemUgYnkgZmluZGluZyBzbWFsbGVzdCBtZXRyaWMgYW5kIHN1YnRyYWN0aW5nIGl0CisJIyBmcm9tIGFsbCBtZXRyaWNzCisJbW92ZHFhICglZWRpKSwleG1tMAorCXBtaW51YiAxNiglZWRpKSwleG1tMAorCXBtaW51YiAzMiglZWRpKSwleG1tMAorCXBtaW51YiA0OCglZWRpKSwleG1tMAorCXBtaW51YiA2NCglZWRpKSwleG1tMAorCXBtaW51YiA4MCglZWRpKSwleG1tMAorCXBtaW51YiA5NiglZWRpKSwleG1tMAkKKwlwbWludWIgMTEyKCVlZGkpLCV4bW0wCQorCXBtaW51YiAxMjgoJWVkaSksJXhtbTAKKwlwbWludWIgMTQ0KCVlZGkpLCV4bW0wCisJcG1pbnViIDE2MCglZWRpKSwleG1tMAorCXBtaW51YiAxNzYoJWVkaSksJXhtbTAKKwlwbWludWIgMTkyKCVlZGkpLCV4bW0wCisJcG1pbnViIDIwOCglZWRpKSwleG1tMAorCXBtaW51YiAyMjQoJWVkaSksJXhtbTAKKwlwbWludWIgMjQwKCVlZGkpLCV4bW0wCQkJCQkJCQorCisJIyBjcnVuY2ggZG93biB0byBzaW5nbGUgbG93ZXN0IG1ldHJpYworCW1vdmRxYSAleG1tMCwleG1tMQorCXBzcmxkcSAkOCwleG1tMCAgICAgIyB0aGUgY291bnQgdG8gcHNybGRxIGlzIGJ5dGVzLCBub3QgYml0cyEKKwlwbWludWIgJXhtbTEsJXhtbTAKKwltb3ZkcWEgJXhtbTAsJXhtbTEKKwlwc3JscSAkMzIsJXhtbTAKKwlwbWludWIgJXhtbTEsJXhtbTAKKwltb3ZkcWEgJXhtbTAsJXhtbTEKKwlwc3JscSAkMTYsJXhtbTAKKwlwbWludWIgJXhtbTEsJXhtbTAKKwltb3ZkcWEgJXhtbTAsJXhtbTEKKwlwc3JscSAkOCwleG1tMAorCXBtaW51YiAleG1tMSwleG1tMAorCisJcHVucGNrbGJ3ICV4bW0wLCV4bW0wCSMgbG93ZXN0IDIgYnl0ZXMKKwlwc2h1Zmx3ICQwLCV4bW0wLCV4bW0wICAjIGxvd2VzdCA4IGJ5dGVzCisJcHVucGNrbHFkcSAleG1tMCwleG1tMAkjIGFsbCAxNiBieXRlcworCisJIyB4bW0wIG5vdyBjb250YWlucyBsb3dlc3QgbWV0cmljIGluIGFsbCAxNiBieXRlcworCSMgc3VidHJhY3QgaXQgZnJvbSBldmVyeSBvdXRwdXQgbWV0cmljCisJbW92ZHFhICglZWRpKSwleG1tMQorCXBzdWJ1c2IgJXhtbTAsJXhtbTEKKwltb3ZkcWEgJXhtbTEsKCVlZGkpCisJbW92ZHFhIDE2KCVlZGkpLCV4bW0xCisJcHN1YnVzYiAleG1tMCwleG1tMQorCW1vdmRxYSAleG1tMSwxNiglZWRpKQkKKwltb3ZkcWEgMzIoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwzMiglZWRpKQkKKwltb3ZkcWEgNDgoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSw0OCglZWRpKQkKKwltb3ZkcWEgNjQoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSw2NCglZWRpKQkKKwltb3ZkcWEgODAoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSw4MCglZWRpKQkKKwltb3ZkcWEgOTYoJWVkaSksJXhtbTEJCisJcHN1YnVzYiAleG1tMCwleG1tMQkKKwltb3ZkcWEgJXhtbTEsOTYoJWVkaSkJCisJbW92ZHFhIDExMiglZWRpKSwleG1tMQkKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwxMTIoJWVkaSkJCisJbW92ZHFhIDEyOCglZWRpKSwleG1tMQorCXBzdWJ1c2IgJXhtbTAsJXhtbTEJCisJbW92ZHFhICV4bW0xLDEyOCglZWRpKQkKKwltb3ZkcWEgMTQ0KCVlZGkpLCV4bW0xCisJcHN1YnVzYiAleG1tMCwleG1tMQkKKwltb3ZkcWEgJXhtbTEsMTQ0KCVlZGkpCQorCW1vdmRxYSAxNjAoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwxNjAoJWVkaSkJCisJbW92ZHFhIDE3NiglZWRpKSwleG1tMQorCXBzdWJ1c2IgJXhtbTAsJXhtbTEKKwltb3ZkcWEgJXhtbTEsMTc2KCVlZGkpCQorCW1vdmRxYSAxOTIoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwxOTIoJWVkaSkJCisJbW92ZHFhIDIwOCglZWRpKSwleG1tMQorCXBzdWJ1c2IgJXhtbTAsJXhtbTEKKwltb3ZkcWEgJXhtbTEsMjA4KCVlZGkpCQorCW1vdmRxYSAyMjQoJWVkaSksJXhtbTEKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwyMjQoJWVkaSkJCisJbW92ZHFhIDI0MCglZWRpKSwleG1tMQkJCQkJCQkKKwlwc3VidXNiICV4bW0wLCV4bW0xCQorCW1vdmRxYSAleG1tMSwyNDAoJWVkaSkJCisJCitkb25lOgkJCisJIyBzd2FwIG1ldHJpY3MKKwltb3ZsICVlc2ksJWVheAorCW1vdmwgJWVkaSwlZXNpCisJbW92bCAlZWF4LCVlZGkKKwlqbXAgMWIKKwkKKzI6CW1vdmwgOCglZWJwKSwlZWJ4CSMgZWJ4ID0gdnAKKwkjIHN0YXNoIG1ldHJpYyBwb2ludGVycworCW1vdmwgJWVzaSxPTERNRVRSSUNTKCVlYngpCisJbW92bCAlZWRpLE5FV01FVFJJQ1MoJWVieCkKKwltb3ZsICVlZHgsRFAoJWVieCkJIyBzdGFzaCBpbmNyZW1lbnRlZCB2YWx1ZSBvZiB2cC0+ZHAKKwl4b3JsICVlYXgsJWVheAorZXJyOglwb3BsICVlYngKKwlwb3BsICVlZHgKKwlwb3BsICVlZGkKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKKwkKKwkuZGF0YQorCS5hbGlnbiAxNgordGhpcnR5b25lczoJCisJLmJ5dGUgMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEKKwpkaWZmIC0tZ2l0IGEvZmVjL3NzZWJmbHkyNy5zIGIvZmVjL3NzZWJmbHkyNy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDQ1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvc3NlYmZseTI3LnMKQEAgLTAsMCArMSwyMDUgQEAKKy8qIEludGVsIFNJTUQgKFNTRSkgaW1wbGVtZW50YXRpb24gb2YgVml0ZXJiaSBBQ1MgYnV0dGVyZmxpZXMKKyAgIGZvciA2NC1zdGF0ZSAoaz03KSBjb252b2x1dGlvbmFsIGNvZGUKKyAgIENvcHlyaWdodCAyMDAxIFBoaWwgS2FybiwgS0E5UQorICAgVGhpcyBjb2RlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorCisgICBpbnQgdXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlKHN0cnVjdCB2MjcgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cykgOyAKKyovCisKKwkjIFNTRSAoNjQtYml0IGludGVnZXIgU0lNRCkgdmVyc2lvbgorCSMgUmVxdWlyZXMgUGVudGl1bSBJSUkgb3IgYmV0dGVyCisKKwkjIFRoZXNlIGFyZSBvZmZzZXRzIGludG8gc3RydWN0IHYyNywgZGVmaW5lZCBpbiB2aXRlcmJpMjcuaAorCS5zZXQgRFAsMTI4CisJLnNldCBPTERNRVRSSUNTLDEzMgorCS5zZXQgTkVXTUVUUklDUywxMzYKKy50ZXh0CQorLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19zc2UsQnJhbmNodGFiMjdfc3NlCisJLnR5cGUgdXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlLEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQordXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVkeAorCXB1c2hsICVlYngKKwkKKwltb3ZsIDgoJWVicCksJWVkeAkjIGVkeCA9IHZwCisJdGVzdGwgJWVkeCwlZWR4CisJam56ICAwZgorCW1vdmwgLTEsJWVheAorCWptcCAgZXJyCQkKKzA6CW1vdmwgT0xETUVUUklDUyglZWR4KSwlZXNpCSMgZXNpIC0+IG9sZCBtZXRyaWNzCisJbW92bCBORVdNRVRSSUNTKCVlZHgpLCVlZGkJIyBlZGkgLT4gbmV3IG1ldHJpY3MKKwltb3ZsIERQKCVlZHgpLCVlZHgJIyBlZHggLT4gZGVjaXNpb25zCisKKzE6CW1vdmwgMTYoJWVicCksJWVheAkjIGVheCA9IG5iaXRzCisJZGVjbCAlZWF4CisJamwgICAyZgkJCSMgcGFzc2VkIHplcm8sIHdlJ3JlIGRvbmUKKwltb3ZsICVlYXgsMTYoJWVicCkKKworCXhvcmwgJWVheCwlZWF4CisJbW92bCAxMiglZWJwKSwlZWJ4CSMgJWVieCA9IHN5bXMKKwltb3ZiICglZWJ4KSwlYWwKKwltb3ZkICVlYXgsJW1tNgkJIyBtbTZbMF0gPSBmaXJzdCBzeW1ib2wKKwltb3ZiIDEoJWVieCksJWFsCisJbW92ZCAlZWF4LCVtbTUJCSMgbW01WzBdID0gc2Vjb25kIHN5bWJvbAorCWFkZGwgJDIsJWVieAorCW1vdmwgJWVieCwxMiglZWJwKQorCisJcHVucGNrbGJ3ICVtbTYsJW1tNgkjIG1tNlsxXSA9IG1tNlswXQorCXB1bnBja2xidyAlbW01LCVtbTUKKwltb3ZxIHRoaXJ0eW9uZXMsJW1tNworCisJcHNodWZ3ICQwLCVtbTYsJW1tNgkjIGNvcHkgbG93IHdvcmQgdG8gdXBwZXIgMworCXBzaHVmdyAkMCwlbW01LCVtbTUKKwkjIG1tNiBub3cgY29udGFpbnMgZmlyc3Qgc3ltYm9sIGluIGVhY2ggYnl0ZSwgbW01IHRoZSBzZWNvbmQKKworCSMgZWFjaCBpbnZvY2F0aW9uIG9mIHRoaXMgbWFjcm8gZG9lcyA4IGJ1dHRlcmZsaWVzIGluIHBhcmFsbGVsCisJLk1BQ1JPIGJ1dHRlcmZseSBHUk9VUAorCSMgY29tcHV0ZSBicmFuY2ggbWV0cmljcworCW1vdnEgQnJhbmNodGFiMjdfc3NlKyg4KlxHUk9VUCksJW1tNAorCW1vdnEgQnJhbmNodGFiMjdfc3NlKzMyKyg4KlxHUk9VUCksJW1tMworCXB4b3IgJW1tNiwlbW00CisJcHhvciAlbW01LCVtbTMKKwlwYXZnYiAlbW0zLCVtbTQJCQkjIG1tNCBjb250YWlucyBicmFuY2ggbWV0cmljcworCXBzcmx3ICQzLCVtbTQKKwlwYW5kICVtbTcsJW1tNAorCQorCW1vdnEgKDgqXEdST1VQKSglZXNpKSwlbW0wCSMgSW5jb21pbmcgcGF0aCBtZXRyaWMsIGhpZ2ggYml0ID0gMAorCW1vdnEgKCg4KlxHUk9VUCkrMzIpKCVlc2kpLCVtbTMJIyBJbmNvbWluZyBwYXRoIG1ldHJpYywgaGlnaCBiaXQgPSAxCisJbW92cSAlbW0wLCVtbTIKKwltb3ZxICVtbTMsJW1tMQorCXBhZGR1c2IgJW1tNCwlbW0wCisJcGFkZHVzYiAlbW00LCVtbTMKKwkKKwkjIGludmVydCBicmFuY2ggbWV0cmljcy4gVGhpcyB3b3JrcyBvbmx5IGJlY2F1c2UgdGhleSdyZSA1IGJpdHMKKwlweG9yICVtbTcsJW1tNAorCQorCXBhZGR1c2IgJW1tNCwlbW0xCisJcGFkZHVzYiAlbW00LCVtbTIKKwkKKwkjIEZpbmQgc3Vydml2b3JzLCBsZWF2ZSBpbiBtbTAsMgorCXBtaW51YiAlbW0xLCVtbTAKKwlwbWludWIgJW1tMywlbW0yCisJIyBnZXQgZGVjaXNpb25zLCBsZWF2ZSBpbiBtbTEsMworCXBjbXBlcWIgJW1tMCwlbW0xCisJcGNtcGVxYiAlbW0yLCVtbTMKKwkKKwkjIGludGVybGVhdmUgYW5kIHN0b3JlIG5ldyBicmFuY2ggbWV0cmljcyBpbiBtbTAsMgorCW1vdnEgJW1tMCwlbW00CisJcHVucGNraGJ3ICVtbTIsJW1tMAkjIGludGVybGVhdmUgc2Vjb25kIDggbmV3IG1ldHJpY3MKKwlwdW5wY2tsYncgJW1tMiwlbW00CSMgaW50ZXJsZWF2ZSBmaXJzdCA4IG5ldyBtZXRyaWNzCisJbW92cSAlbW0wLCgxNipcR1JPVVArOCkoJWVkaSkKKwltb3ZxICVtbTQsKDE2KlxHUk9VUCkoJWVkaSkKKworCSMgaW50ZXJsZWF2ZSBkZWNpc2lvbnMsIGFjY3VtdWxhdGUgaW50byAlZWJ4CisJbW92cSAlbW0xLCVtbTQKKwlwdW5wY2toYncgJW1tMywlbW0xCisJcHVucGNrbGJ3ICVtbTMsJW1tNAorCSMgRHVlIHRvIGFuIGVycm9yIGluIHRoZSBJbnRlbCBpbnN0cnVjdGlvbiBzZXQgcmVmICh0aGUgcmVnaXN0ZXIKKwkjIGZpZWxkcyBhcmUgc3dhcHBlZCksIGdhcyBhc3NlbWJsZXMgcG1vdm1za2IgaW5jb3JyZWN0bHkKKwkjIFNlZSBodHRwOi8vbWFpbC5nbnUub3JnL3BpcGVybWFpbC9idWctZ251LXV0aWxzLzIwMDAtQXVndXN0LzAwMjM0MS5odG1sCisJLmJ5dGUgMHgwZiwweGQ3LDB4YzEJIyBwbW92bXNrYiAlbW0xLCVlYXgKKwlzaGxsICQoKDE2KlxHUk9VUCs4KSYzMSksJWVheAorCW9ybCAlZWF4LCVlYngKKwkuYnl0ZSAweDBmLDB4ZDcsMHhjNAkjIHBtb3Ztc2tiICVtbTQsJWVheAorCXNobGwgJCgoMTYqXEdST1VQKSYzMSksJWVheAorCW9ybCAlZWF4LCVlYngKKwkuZW5kbQorCisJIyBpbnZva2UgbWFjcm8gNCB0aW1lcyBmb3IgYSB0b3RhbCBvZiAzMiBidXR0ZXJmbGllcworCXhvcmwgJWVieCwlZWJ4CQkjIGNsZWFyIGRlY2lzaW9ucworCWJ1dHRlcmZseSBHUk9VUD0wCisJYnV0dGVyZmx5IEdST1VQPTEKKwltb3ZsICVlYngsKCVlZHgpCSMgc3Rhc2ggZmlyc3QgMzIgZGVjaXNpb25zCisJeG9ybCAlZWJ4LCVlYngKKwlidXR0ZXJmbHkgR1JPVVA9MgorCWJ1dHRlcmZseSBHUk9VUD0zCisJbW92bCAlZWJ4LDQoJWVkeCkJIyBzdGFzaCBzZWNvbmQgMzIgZGVjaXNpb25zCisKKwlhZGRsICQ4LCVlZHgJCSMgYnVtcCBkZWNpc2lvbiBwb2ludGVyCisJCQorCSMgc2VlIGlmIHdlIGhhdmUgdG8gbm9ybWFsaXplCisJbW92bCAoJWVkaSksJWVheAkjIGV4dHJhY3QgZmlyc3Qgb3V0cHV0IG1ldHJpYworCWFuZGwgJDI1NSwlZWF4CisJY21wbCAkMTUwLCVlYXgJCSMgaXMgaXQgZ3JlYXRlciB0aGFuIDE1MD8KKwltb3ZsICQwLCVlYXgKKwlqbGUgZG9uZQkJIyBObywgbm8gbmVlZCB0byBub3JtYWxpemUKKworCSMgTm9ybWFsaXplIGJ5IGZpbmRpbmcgc21hbGxlc3QgbWV0cmljIGFuZCBzdWJ0cmFjdGluZyBpdAorCSMgZnJvbSBhbGwgbWV0cmljcworCW1vdnEgKCVlZGkpLCVtbTAKKwlwbWludWIgOCglZWRpKSwlbW0wCisJcG1pbnViIDE2KCVlZGkpLCVtbTAKKwlwbWludWIgMjQoJWVkaSksJW1tMAorCXBtaW51YiAzMiglZWRpKSwlbW0wCisJcG1pbnViIDQwKCVlZGkpLCVtbTAKKwlwbWludWIgNDgoJWVkaSksJW1tMAorCXBtaW51YiA1NiglZWRpKSwlbW0wCisJIyBtbTAgY29udGFpbnMgOCBzbWFsbGVzdCBtZXRyaWNzCisJIyBjcnVuY2ggZG93biB0byBzaW5nbGUgbG93ZXN0IG1ldHJpYworCW1vdnEgJW1tMCwlbW0xCisJcHNybHEgJDMyLCVtbTAKKwlwbWludWIgJW1tMSwlbW0wCisJbW92cSAlbW0wLCVtbTEKKwlwc3JscSAkMTYsJW1tMAorCXBtaW51YiAlbW0xLCVtbTAKKwltb3ZxICVtbTAsJW1tMQorCXBzcmxxICQ4LCVtbTAKKwlwbWludWIgJW1tMSwlbW0wCisJcHVucGNrbGJ3ICVtbTAsJW1tMAkjIGV4cGFuZCB0byBhbGwgOCBieXRlcworCXBzaHVmdyAkMCwlbW0wLCVtbTAKKworCSMgbW0wIG5vdyBjb250YWlucyBsb3dlc3QgbWV0cmljIGluIGFsbCA4IGJ5dGVzCisJIyBzdWJ0cmFjdCBpdCBmcm9tIGV2ZXJ5IG91dHB1dCBtZXRyaWMKKwkjIFRyYXNoZXMgJW1tNworCS5tYWNybyBQU1VCVVNCTSBSRUcsTUVNCisJbW92cSBcTUVNLCVtbTcKKwlwc3VidXNiIFxSRUcsJW1tNworCW1vdnEgJW1tNyxcTUVNCisJLmVuZG0KKwkKKwlQU1VCVVNCTSAlbW0wLCglZWRpKQorCVBTVUJVU0JNICVtbTAsOCglZWRpKQorCVBTVUJVU0JNICVtbTAsMTYoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDI0KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwzMiglZWRpKQorCVBTVUJVU0JNICVtbTAsNDAoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDQ4KCVlZGkpCisJUFNVQlVTQk0gJW1tMCw1NiglZWRpKQorCisJbW92ZCAlbW0wLCVlYXgKKwlhbmQgJDB4ZmYsJWVheAorCitkb25lOgkjIHN3YXAgbWV0cmljcworCW1vdmwgJWVzaSwlZWF4CisJbW92bCAlZWRpLCVlc2kKKwltb3ZsICVlYXgsJWVkaQorCWptcCAxYgorCQorMjoJZW1tcworCW1vdmwgOCglZWJwKSwlZWJ4CSMgZWJ4ID0gdnAKKwkjIHN0YXNoIG1ldHJpYyBwb2ludGVycworCW1vdmwgJWVzaSxPTERNRVRSSUNTKCVlYngpCisJbW92bCAlZWRpLE5FV01FVFJJQ1MoJWVieCkKKwltb3ZsICVlZHgsRFAoJWVieCkJIyBzdGFzaCBpbmNyZW1lbnRlZCB2YWx1ZSBvZiB2cC0+ZHAKKwl4b3JsICVlYXgsJWVheAorZXJyOglwb3BsICVlYngKKwlwb3BsICVlZHgKKwlwb3BsICVlZGkKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKworCXJldAorCisJLmRhdGEKKwkKKwkuYWxpZ24gMTYKK3RoaXJ0eW9uZXM6CisJLmJ5dGUgMzEsMzEsMzEsMzEsMzEsMzEsMzEsMzEKKwkKKwkKKwpkaWZmIC0tZ2l0IGEvZmVjL3NzZWJmbHkyOS5zIGIvZmVjL3NzZWJmbHkyOS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDIxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvc3NlYmZseTI5LnMKQEAgLTAsMCArMSwyNzEgQEAKKy8qIEludGVsIFNJTUQgU1NFIGltcGxlbWVudGF0aW9uIG9mIFZpdGVyYmkgQUNTIGJ1dHRlcmZsaWVzCisgICBmb3IgMjU2LXN0YXRlIChrPTkpIGNvbnZvbHV0aW9uYWwgY29kZQorICAgQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgICBUaGlzIGNvZGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisKKyAgIHZvaWQgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlKHN0cnVjdCB2MjkgKnZwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyk7IAorKi8KKwkjIFNTRSAoNjQtYml0IGludGVnZXIgU0lNRCkgdmVyc2lvbgorCSMgUmVxdWlyZXMgUGVudGl1bSBJSUkgb3IgYmV0dGVyCisJIyBUaGVzZSBhcmUgb2Zmc2V0cyBpbnRvIHN0cnVjdCB2MjksIGRlZmluZWQgaW4gdml0ZXJiaTI5LmgKKwkuc2V0IERQLDUxMgorCS5zZXQgT0xETUVUUklDUyw1MTYKKwkuc2V0IE5FV01FVFJJQ1MsNTIwCisJLnRleHQJCisJLmdsb2JhbCB1cGRhdGVfdml0ZXJiaTI5X2Jsa19zc2UsQnJhbmNodGFiMjlfc3NlCisJLnR5cGUgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlLEBmdW5jdGlvbgorCS5hbGlnbiAxNgorCQordXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXB1c2hsICVlc2kKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVkeAorCXB1c2hsICVlYngKKworCW1vdmwgOCglZWJwKSwlZWR4CSMgZWR4ID0gdnAKKwl0ZXN0bCAlZWR4LCVlZHgKKwlqbnogIDBmCisJbW92bCAtMSwlZWF4CisJam1wICBlcnIJCQorMDoJbW92bCBPTERNRVRSSUNTKCVlZHgpLCVlc2kJIyBlc2kgLT4gb2xkIG1ldHJpY3MKKwltb3ZsIE5FV01FVFJJQ1MoJWVkeCksJWVkaQkjIGVkaSAtPiBuZXcgbWV0cmljcworCW1vdmwgRFAoJWVkeCksJWVkeAkjIGVkeCAtPiBkZWNpc2lvbnMKKworMToJbW92bCAxNiglZWJwKSwlZWF4CSMgZWF4ID0gbmJpdHMKKwlkZWNsICVlYXgKKwlqbCAgIDJmCQkJIyBwYXNzZWQgemVybywgd2UncmUgZG9uZQorCW1vdmwgJWVheCwxNiglZWJwKQorCQorCXhvcmwgJWVheCwlZWF4CisJbW92bCAxMiglZWJwKSwlZWJ4CSMgZWJ4ID0gc3ltcworCW1vdmIgKCVlYngpLCVhbAorCW1vdmQgJWVheCwlbW02CQkjIG1tNlswXSA9IGZpcnN0IHN5bWJvbAorCW1vdmIgMSglZWJ4KSwlYWwKKwltb3ZkICVlYXgsJW1tNQkJIyBtbTVbMF0gPSBzZWNvbmQgc3ltYm9sCisJYWRkbCAkMiwlZWJ4CisJbW92bCAlZWJ4LDEyKCVlYnApCisKKwlwdW5wY2tsYncgJW1tNiwlbW02CSMgbW02WzFdID0gbW02WzBdCisJcHVucGNrbGJ3ICVtbTUsJW1tNQorCisJbW92cSB0aGlydHlvbmVzLCVtbTcKKwlwc2h1ZncgJDAsJW1tNiwlbW02CSMgY29weSBsb3cgd29yZCB0byB1cHBlciAzCisJcHNodWZ3ICQwLCVtbTUsJW1tNQorCSMgbW02IG5vdyBjb250YWlucyBmaXJzdCBzeW1ib2wgaW4gZWFjaCBieXRlLCBtbTUgdGhlIHNlY29uZAorCisJIyBlYWNoIGludm9jYXRpb24gb2YgdGhpcyBtYWNybyBkb2VzIDggYnV0dGVyZmxpZXMgaW4gcGFyYWxsZWwKKwkuTUFDUk8gYnV0dGVyZmx5IEdST1VQCisJIyBjb21wdXRlIGJyYW5jaCBtZXRyaWNzCisJbW92cSBCcmFuY2h0YWIyOV9zc2UrKDgqXEdST1VQKSwlbW00CisJbW92cSBCcmFuY2h0YWIyOV9zc2UrMTI4Kyg4KlxHUk9VUCksJW1tMworCXB4b3IgJW1tNiwlbW00CisJcHhvciAlbW01LCVtbTMKKwlwYXZnYiAlbW0zLCVtbTQJCQkjIG1tNCBjb250YWlucyBicmFuY2ggbWV0cmljcworCXBzcmx3ICQzLCVtbTQKKwlwYW5kICVtbTcsJW1tNAorCisJbW92cSAoOCpcR1JPVVApKCVlc2kpLCVtbTAJIyBJbmNvbWluZyBwYXRoIG1ldHJpYywgaGlnaCBiaXQgPSAwCisJbW92cSAoKDgqXEdST1VQKSsxMjgpKCVlc2kpLCVtbTMJIyBJbmNvbWluZyBwYXRoIG1ldHJpYywgaGlnaCBiaXQgPSAxCisJbW92cSAlbW0wLCVtbTIKKwltb3ZxICVtbTMsJW1tMQorCXBhZGR1c2IgJW1tNCwlbW0wCisJcGFkZHVzYiAlbW00LCVtbTMKKwkKKwkjIGludmVydCBicmFuY2ggbWV0cmljcy4gVGhpcyB3b3JrcyBvbmx5IGJlY2F1c2UgdGhleSdyZSA1IGJpdHMKKwlweG9yICVtbTcsJW1tNAorCQorCXBhZGR1c2IgJW1tNCwlbW0xCisJcGFkZHVzYiAlbW00LCVtbTIKKwkKKwkjIEZpbmQgc3Vydml2b3JzLCBsZWF2ZSBpbiBtbTAsMgorCXBtaW51YiAlbW0xLCVtbTAKKwlwbWludWIgJW1tMywlbW0yCisJIyBnZXQgZGVjaXNpb25zLCBsZWF2ZSBpbiBtbTEsMworCXBjbXBlcWIgJW1tMCwlbW0xCisJcGNtcGVxYiAlbW0yLCVtbTMKKwkKKwkjIGludGVybGVhdmUgYW5kIHN0b3JlIG5ldyBicmFuY2ggbWV0cmljcyBpbiBtbTAsMgorCW1vdnEgJW1tMCwlbW00CisJcHVucGNraGJ3ICVtbTIsJW1tMAkjIGludGVybGVhdmUgc2Vjb25kIDggbmV3IG1ldHJpY3MKKwlwdW5wY2tsYncgJW1tMiwlbW00CSMgaW50ZXJsZWF2ZSBmaXJzdCA4IG5ldyBtZXRyaWNzCisJbW92cSAlbW0wLCgxNipcR1JPVVArOCkoJWVkaSkKKwltb3ZxICVtbTQsKDE2KlxHUk9VUCkoJWVkaSkKKworCSMgaW50ZXJsZWF2ZSBkZWNpc2lvbnMsIGFjY3VtdWxhdGUgaW50byAlZWJ4CisJbW92cSAlbW0xLCVtbTQKKwlwdW5wY2toYncgJW1tMywlbW0xCisJcHVucGNrbGJ3ICVtbTMsJW1tNAorCSMgRHVlIHRvIGFuIGVycm9yIGluIHRoZSBJbnRlbCBpbnN0cnVjdGlvbiBzZXQgcmVmICh0aGUgcmVnaXN0ZXIKKwkjIGZpZWxkcyBhcmUgc3dhcHBlZCksIGdhcyBhc3NlbWJsZXMgcG1vdm1za2IgaW5jb3JyZWN0bHkKKwkjIFNlZSBodHRwOi8vbWFpbC5nbnUub3JnL3BpcGVybWFpbC9idWctZ251LXV0aWxzLzIwMDAtQXVndXN0LzAwMjM0MS5odG1sCisJLmJ5dGUgMHgwZiwweGQ3LDB4YzEJIyBwbW92bXNrYiAlbW0xLCVlYXgKKwlzaGxsICQoKDE2KlxHUk9VUCs4KSYzMSksJWVheAorCW9ybCAlZWF4LCVlYngKKwkuYnl0ZSAweDBmLDB4ZDcsMHhjNAkjIHBtb3Ztc2tiICVtbTQsJWVheAorCXNobGwgJCgoMTYqXEdST1VQKSYzMSksJWVheAorCW9ybCAlZWF4LCVlYngKKwkuZW5kbQorCisJIyBpbnZva2UgbWFjcm8gMTYgdGltZXMgZm9yIGEgdG90YWwgb2YgMTI4IGJ1dHRlcmZsaWVzCisJeG9ybCAlZWJ4LCVlYngJCSMgY2xlYXIgZGVjaXNpb25zCisJYnV0dGVyZmx5IEdST1VQPTAKKwlidXR0ZXJmbHkgR1JPVVA9MQorCW1vdmwgJWVieCwoJWVkeCkJIyBzdGFzaCBmaXJzdCAzMiBkZWNpc2lvbnMKKwl4b3JsICVlYngsJWVieAorCWJ1dHRlcmZseSBHUk9VUD0yCisJYnV0dGVyZmx5IEdST1VQPTMKKwltb3ZsICVlYngsNCglZWR4KQkjIHN0YXNoIHNlY29uZCAzMiBkZWNpc2lvbnMKKwl4b3JsICVlYngsJWVieAkJIyBjbGVhciBkZWNpc2lvbnMKKwlidXR0ZXJmbHkgR1JPVVA9NAorCWJ1dHRlcmZseSBHUk9VUD01CisJbW92bCAlZWJ4LDgoJWVkeCkJIyBzdGFzaCBmaXJzdCAzMiBkZWNpc2lvbnMKKwl4b3JsICVlYngsJWVieAorCWJ1dHRlcmZseSBHUk9VUD02CisJYnV0dGVyZmx5IEdST1VQPTcKKwltb3ZsICVlYngsMTIoJWVkeCkJIyBzdGFzaCBzZWNvbmQgMzIgZGVjaXNpb25zCisJeG9ybCAlZWJ4LCVlYngJCSMgY2xlYXIgZGVjaXNpb25zCisJYnV0dGVyZmx5IEdST1VQPTgKKwlidXR0ZXJmbHkgR1JPVVA9OQorCW1vdmwgJWVieCwxNiglZWR4KQkjIHN0YXNoIGZpcnN0IDMyIGRlY2lzaW9ucworCXhvcmwgJWVieCwlZWJ4CisJYnV0dGVyZmx5IEdST1VQPTEwCisJYnV0dGVyZmx5IEdST1VQPTExCisJbW92bCAlZWJ4LDIwKCVlZHgpCSMgc3Rhc2ggc2Vjb25kIDMyIGRlY2lzaW9ucworCXhvcmwgJWVieCwlZWJ4CQkjIGNsZWFyIGRlY2lzaW9ucworCWJ1dHRlcmZseSBHUk9VUD0xMgorCWJ1dHRlcmZseSBHUk9VUD0xMworCW1vdmwgJWVieCwyNCglZWR4KQkjIHN0YXNoIGZpcnN0IDMyIGRlY2lzaW9ucworCXhvcmwgJWVieCwlZWJ4CisJYnV0dGVyZmx5IEdST1VQPTE0CisJYnV0dGVyZmx5IEdST1VQPTE1CisJbW92bCAlZWJ4LDI4KCVlZHgpCSMgc3Rhc2ggc2Vjb25kIDMyIGRlY2lzaW9ucworCisJYWRkbCAkMzIsJWVkeAkJIyBidW1wIGRlY2lzaW9uIHBvaW50ZXIKKwkJCisJIyBzZWUgaWYgd2UgaGF2ZSB0byBub3JtYWxpemUKKwltb3ZsICglZWRpKSwlZWF4CSMgZXh0cmFjdCBmaXJzdCBvdXRwdXQgbWV0cmljCisJYW5kbCAkMjU1LCVlYXgKKwljbXAgJDUwLCVlYXgJCSMgaXMgaXQgZ3JlYXRlciB0aGFuIDUwPworCW1vdmwgJDAsJWVheAorCWpsZSBkb25lCQkjIE5vLCBubyBuZWVkIHRvIG5vcm1hbGl6ZQorCisJIyBOb3JtYWxpemUgYnkgZmluZGluZyBzbWFsbGVzdCBtZXRyaWMgYW5kIHN1YnRyYWN0aW5nIGl0CisJIyBmcm9tIGFsbCBtZXRyaWNzCisJbW92cSAoJWVkaSksJW1tMAorCXBtaW51YiA4KCVlZGkpLCVtbTAKKwlwbWludWIgMTYoJWVkaSksJW1tMAorCXBtaW51YiAyNCglZWRpKSwlbW0wCisJcG1pbnViIDMyKCVlZGkpLCVtbTAKKwlwbWludWIgNDAoJWVkaSksJW1tMAorCXBtaW51YiA0OCglZWRpKSwlbW0wCisJcG1pbnViIDU2KCVlZGkpLCVtbTAKKwlwbWludWIgNjQoJWVkaSksJW1tMAorCXBtaW51YiA3MiglZWRpKSwlbW0wCisJcG1pbnViIDgwKCVlZGkpLCVtbTAJCisJcG1pbnViIDg4KCVlZGkpLCVtbTAKKwlwbWludWIgOTYoJWVkaSksJW1tMAorCXBtaW51YiAxMDQoJWVkaSksJW1tMAorCXBtaW51YiAxMTIoJWVkaSksJW1tMAorCXBtaW51YiAxMjAoJWVkaSksJW1tMAorCXBtaW51YiAxMjgoJWVkaSksJW1tMAorCXBtaW51YiAxMzYoJWVkaSksJW1tMAorCXBtaW51YiAxNDQoJWVkaSksJW1tMAorCXBtaW51YiAxNTIoJWVkaSksJW1tMAorCXBtaW51YiAxNjAoJWVkaSksJW1tMAorCXBtaW51YiAxNjgoJWVkaSksJW1tMAorCXBtaW51YiAxNzYoJWVkaSksJW1tMAorCXBtaW51YiAxODQoJWVkaSksJW1tMAorCXBtaW51YiAxOTIoJWVkaSksJW1tMAorCXBtaW51YiAyMDAoJWVkaSksJW1tMAorCXBtaW51YiAyMDgoJWVkaSksJW1tMAorCXBtaW51YiAyMTYoJWVkaSksJW1tMAorCXBtaW51YiAyMjQoJWVkaSksJW1tMAorCXBtaW51YiAyMzIoJWVkaSksJW1tMAorCXBtaW51YiAyNDAoJWVkaSksJW1tMAorCXBtaW51YiAyNDgoJWVkaSksJW1tMAorCSMgbW0wIGNvbnRhaW5zIDggc21hbGxlc3QgbWV0cmljcworCSMgY3J1bmNoIGRvd24gdG8gc2luZ2xlIGxvd2VzdCBtZXRyaWMKKwltb3ZxICVtbTAsJW1tMQorCXBzcmxxICQzMiwlbW0wCisJcG1pbnViICVtbTEsJW1tMAorCW1vdnEgJW1tMCwlbW0xCisJcHNybHEgJDE2LCVtbTAKKwlwbWludWIgJW1tMSwlbW0wCisJbW92cSAlbW0wLCVtbTEKKwlwc3JscSAkOCwlbW0wCisJcG1pbnViICVtbTEsJW1tMAorCW1vdnEgOCglZWRpKSwlbW0xCSMgcmVsb2FkCisJcHVucGNrbGJ3ICVtbTAsJW1tMAkjIGV4cGFuZCB0byBhbGwgOCBieXRlcworCXBzaHVmdyAkMCwlbW0wLCVtbTAKKworCSMgbW0wIG5vdyBjb250YWlucyBsb3dlc3QgbWV0cmljIGluIGFsbCA4IGJ5dGVzCisJIyBzdWJ0cmFjdCBpdCBmcm9tIGV2ZXJ5IG91dHB1dCBtZXRyaWMKKwkjIFRyYXNoZXMgJW1tNworCS5tYWNybyBQU1VCVVNCTSBSRUcsTUVNCisJbW92cSBcTUVNLCVtbTcKKwlwc3VidXNiIFxSRUcsJW1tNworCW1vdnEgJW1tNyxcTUVNCisJLmVuZG0KKwkKKwlQU1VCVVNCTSAlbW0wLCglZWRpKQorCVBTVUJVU0JNICVtbTAsOCglZWRpKQorCVBTVUJVU0JNICVtbTAsMTYoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDI0KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwzMiglZWRpKQorCVBTVUJVU0JNICVtbTAsNDAoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDQ4KCVlZGkpCisJUFNVQlVTQk0gJW1tMCw1NiglZWRpKQorCVBTVUJVU0JNICVtbTAsNjQoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDcyKCVlZGkpCisJUFNVQlVTQk0gJW1tMCw4MCglZWRpKQkKKwlQU1VCVVNCTSAlbW0wLDg4KCVlZGkpCisJUFNVQlVTQk0gJW1tMCw5NiglZWRpKQorCVBTVUJVU0JNICVtbTAsMTA0KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwxMTIoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDEyMCglZWRpKQorCVBTVUJVU0JNICVtbTAsMTI4KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwxMzYoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDE0NCglZWRpKQorCVBTVUJVU0JNICVtbTAsMTUyKCVlZGkpCisJUFNVQlVTQk0gJW1tMCwxNjAoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDE2OCglZWRpKQorCVBTVUJVU0JNICVtbTAsMTc2KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwxODQoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDE5MiglZWRpKQorCVBTVUJVU0JNICVtbTAsMjAwKCVlZGkpCisJUFNVQlVTQk0gJW1tMCwyMDgoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDIxNiglZWRpKQorCVBTVUJVU0JNICVtbTAsMjI0KCVlZGkpCisJUFNVQlVTQk0gJW1tMCwyMzIoJWVkaSkKKwlQU1VCVVNCTSAlbW0wLDI0MCglZWRpKQorCVBTVUJVU0JNICVtbTAsMjQ4KCVlZGkpCisKK2RvbmU6CQkKKwkjIHN3YXAgbWV0cmljcworCW1vdmwgJWVzaSwlZWF4CisJbW92bCAlZWRpLCVlc2kKKwltb3ZsICVlYXgsJWVkaQorCWptcCAxYgorCQorMjoJZW1tcworCW1vdmwgOCglZWJwKSwlZWJ4CSMgZWJ4ID0gdnAKKwkjIHN0YXNoIG1ldHJpYyBwb2ludGVycworCW1vdmwgJWVzaSxPTERNRVRSSUNTKCVlYngpCisJbW92bCAlZWRpLE5FV01FVFJJQ1MoJWVieCkKKwltb3ZsICVlZHgsRFAoJWVieCkJIyBzdGFzaCBpbmNyZW1lbnRlZCB2YWx1ZSBvZiB2cC0+ZHAKKwl4b3JsICVlYXgsJWVheAorZXJyOglwb3BsICVlYngKKwlwb3BsICVlZHgKKwlwb3BsICVlZGkKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKKworCS5kYXRhCisJLmFsaWduIDgKK3RoaXJ0eW9uZXM6CQorCS5ieXRlIDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxCisJCisKZGlmZiAtLWdpdCBhL2ZlYy9zdW1zcS5jIGIvZmVjL3N1bXNxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNmEzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zdW1zcS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiBhIHZlY3RvciBvZiBzaWduZWQgc2hvcnRzCisKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCit1bnNpZ25lZCBsb25nIGxvbmcgc3Vtc3FfcG9ydChzaWduZWQgc2hvcnQgKixpbnQpOworCisjaWZkZWYgX19pMzg2X18KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9tbXgoc2lnbmVkIHNob3J0ICosaW50KTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9zc2Uoc2lnbmVkIHNob3J0ICosaW50KTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9zc2UyKHNpZ25lZCBzaG9ydCAqLGludCk7CisjZW5kaWYKKworI2lmZGVmIF9fVkVDX18KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcV9hdihzaWduZWQgc2hvcnQgKixpbnQpOworI2VuZGlmCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzdW1zcShzaWduZWQgc2hvcnQgKmluLGludCBjbnQpeworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHN1bXNxX3BvcnQoaW4sY250KTsKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIFNTRToKKyAgY2FzZSBNTVg6CisgICAgcmV0dXJuIHN1bXNxX21teChpbixjbnQpOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIHN1bXNxX3NzZTIoaW4sY250KTsKKyNlbmRpZgorCisjaWZkZWYgX19WRUNfXworICBjYXNlIEFMVElWRUM6CisgICAgcmV0dXJuIHN1bXNxX2F2KGluLGNudCk7CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3N1bXNxX2F2LmMgYi9mZWMvc3Vtc3FfYXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M2YWNmCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3N1bXNxX2F2LmMKQEAgLTAsMCArMSw3OCBAQAorLyogQ29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIGEgdmVjdG9yIG9mIHNpZ25lZCBzaG9ydHMKKworICogVGhpcyBpcyB0aGUgQWx0aXZlYyBTSU1EIHZlcnNpb24uIEl0J3MgYSBsaXR0bGUgaGFpcnkgYmVjYXVzZSBBbHRpdmVjCisgKiBkb2VzIG5vdCBkbyA2NC1iaXQgb3BlcmF0aW9ucyBkaXJlY3RseSwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlIHNlcGFyYXRlCisgKiAzMi1iaXQgc3VtcyBhbmQgY2FycmllcworCisgKiBDb3B5cmlnaHQgMjAwNCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisKKyNpbmNsdWRlICJmZWMuaCIKKwordW5zaWduZWQgbG9uZyBsb25nIHN1bXNxX2F2KHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCl7CisgIGxvbmcgbG9uZyBzdW07CisgIHZlY3RvciBzaWduZWQgc2hvcnQgeDsKKyAgdmVjdG9yIHVuc2lnbmVkIGludCBzdW1zLGNhcnJpZXMsczEsczI7CisgIGludCBwYWQ7CisgIHVuaW9uIHsgdmVjdG9yIHVuc2lnbmVkIGNoYXIgY3Y7IHZlY3RvciB1bnNpZ25lZCBpbnQgaXY7IHVuc2lnbmVkIGludCB3WzRdOyB1bnNpZ25lZCBjaGFyIGNbMTZdO30gczsKKworICBjYXJyaWVzID0gc3VtcyA9ICh2ZWN0b3IgdW5zaWduZWQgaW50KSgwKTsKKyAgaWYoKHBhZCA9IChpbnQpaW4gJiAxNSkhPTApeworICAgIC8qIExvYWQgdW5hbGlnbmVkIGxlYWRpbmcgd29yZCAqLworICAgIHggPSB2ZWNfcGVybSh2ZWNfbGQoMCxpbiksKHZlY3RvciBzaWduZWQgc2hvcnQpKDApLHZlY19sdnNsKDAsaW4pKTsKKyAgICBpZihjbnQgPCA4KXsgLyogU2hpZnQgcmlnaHQgdG8gY2hvcCBzdHVmZiBiZXlvbmQgZW5kIG9mIHNob3J0IGJsb2NrICovCisgICAgICBzLmNbMTVdID0gKDgtY250KTw8NDsKKyAgICAgIHggPSB2ZWNfc3JvKHgscy5jdik7CisgICAgfQorICAgIHN1bXMgPSAodmVjdG9yIHVuc2lnbmVkIGludCl2ZWNfbXN1bSh4LHgsKHZlY3RvciBzaWduZWQgaW50KSgwKSk7CisgICAgaW4gKz0gOC1wYWQvMjsKKyAgICBjbnQgLT0gOC1wYWQvMjsKKyAgfQorICAvKiBFdmVyeXRoaW5nIGlzIG5vdyBhbGlnbmVkLCByaXAgdGhyb3VnaCBtb3N0IG9mIHRoZSBibG9jayAqLworICB3aGlsZShjbnQgPj0gOCl7CisgICAgeCA9IHZlY19sZCgwLGluKTsKKyAgICAvKiBBIHNpbmdsZSB2ZWNfbXN1bSBjYW5ub3Qgb3ZlcmZsb3csIGJ1dCB3ZSBoYXZlIHRvIHN1bSBpdCB3aXRoCisgICAgICogdGhlIGVhcmxpZXIgdGVybXMgc2VwYXJhdGVseSB0byBoYW5kbGUgdGhlIGNhcnJpZXMKKyAgICAgKiBUaGUgY2FzdCB0byB1bnNpZ25lZCBpcyBPSyBiZWNhdXNlIHNxdWFyZXMgYXJlIGFsd2F5cyBwb3NpdGl2ZQorICAgICAqLworICAgIHMxID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX21zdW0oeCx4LCh2ZWN0b3Igc2lnbmVkIGludCkoMCkpOworICAgIGNhcnJpZXMgPSB2ZWNfYWRkKGNhcnJpZXMsdmVjX2FkZGMoc3VtcyxzMSkpOworICAgIHN1bXMgPSB2ZWNfYWRkKHN1bXMsczEpOworICAgIGluICs9IDg7CisgICAgY250IC09IDg7CisgIH0KKyAgLyogSGFuZGxlIHRyYWlsaW5nIGZyYWdtZW50LCBpZiBhbnkgKi8KKyAgaWYoY250ID4gMCl7CisgICAgeCA9IHZlY19sZCgwLGluKTsKKyAgICBzLmNbMTVdID0gKDgtY250KTw8NDsKKyAgICB4ID0gdmVjX3Nybyh4LHMuY3YpOworICAgIHMxID0gKHZlY3RvciB1bnNpZ25lZCBpbnQpdmVjX21zdW0oeCx4LCh2ZWN0b3Igc2lnbmVkIGludCkoMCkpOworICAgIGNhcnJpZXMgPSB2ZWNfYWRkKGNhcnJpZXMsdmVjX2FkZGMoc3VtcyxzMSkpOworICAgIHN1bXMgPSB2ZWNfYWRkKHN1bXMsczEpOworICB9CisgIC8qIENvbWJpbmUgNCBzdWItc3VtcyBhbmQgY2FycmllcyAqLworICBzLmNbMTVdID0gNjQ7IC8qIFNoaWZ0IHJpZ2h0IHR3byAzMi1iaXQgd29yZHMgKi8KKyAgczEgPSB2ZWNfc3JvKHN1bXMscy5jdik7CisgIHMyID0gdmVjX3NybyhjYXJyaWVzLHMuY3YpOworICBjYXJyaWVzID0gdmVjX2FkZChjYXJyaWVzLHZlY19hZGRjKHN1bXMsczEpKTsKKyAgc3VtcyA9IHZlY19hZGQoc3VtcyxzMSk7CisgIGNhcnJpZXMgPSB2ZWNfYWRkKGNhcnJpZXMsczIpOworCisgIHMuY1sxNV0gPSAzMjsgLyogU2hpZnQgcmlnaHQgb25lIDMyLWJpdCB3b3JkICovCisgIHMxID0gdmVjX3NybyhzdW1zLHMuY3YpOworICBzMiA9IHZlY19zcm8oY2FycmllcyxzLmN2KTsKKyAgY2FycmllcyA9IHZlY19hZGQoY2Fycmllcyx2ZWNfYWRkYyhzdW1zLHMxKSk7CisgIHN1bXMgPSB2ZWNfYWRkKHN1bXMsczEpOworICBjYXJyaWVzID0gdmVjX2FkZChjYXJyaWVzLHMyKTsKKworICAvKiBFeHRyYWN0IHN1bSBhbmQgY2FycmllcyBmcm9tIHJpZ2h0LWhhbmQgd29yZHMgYW5kIGNvbWJpbmUgaW50byByZXN1bHQgKi8KKyAgcy5pdiA9IHN1bXM7CisgIHN1bSA9IHMud1szXTsKKworICBzLml2ID0gY2FycmllczsKKyAgc3VtICs9IChsb25nIGxvbmcpcy53WzNdIDw8IDMyOworCisgIHJldHVybiBzdW07Cit9CisKZGlmZiAtLWdpdCBhL2ZlYy9zdW1zcV9tbXguYyBiL2ZlYy9zdW1zcV9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY2ODMxCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3N1bXNxX21teC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiBhIHZlY3RvciBvZiBzaWduZWQgc2hvcnRzCisKKyAqICBNTVgtYXNzaXN0ZWQgdmVyc2lvbiAoYWxzbyB1c2VkIG9uIFNTRSkKKworICogVGhlIFNTRTIgYW5kIE1NWCBhc3Npc3Qgcm91dGluZXMgYm90aCBvcGVyYXRlIG9uIG11bHRpcGxlcyBvZgorICogOCB3b3JkczsgdGhleSBkaWZmZXIgb25seSBpbiB0aGVpciBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICg4IGJ5dGVzCisgKiBmb3IgTU1YLCAxNiBieXRlcyBmb3IgU1NFMikKKworICogQ29weXJpZ2h0IDIwMDQgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKworbG9uZyBsb25nIHN1bXNxX21teF9hc3Npc3Qoc2lnbmVkIHNob3J0ICosaW50KTsKKworbG9uZyBsb25nIHN1bXNxX21teChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpeworICBsb25nIGxvbmcgc3VtID0gMDsKKworICAvKiBIYW5kbGUgc3R1ZmYgYmVmb3JlIHRoZSBuZXh0IDgtYnl0ZSBib3VuZGFyeSAqLworICB3aGlsZSgoKGludClpbiAmIDcpICE9IDAgJiYgY250ICE9IDApeworICAgIHN1bSArPSAobG9uZylpblswXSAqIGluWzBdOworICAgIGluKys7CisgICAgY250LS07CisgIH0KKyAgc3VtICs9IHN1bXNxX21teF9hc3Npc3QoaW4sY250KTsKKyAgaW4gKz0gY250ICYgfjc7CisgIGNudCAmPSA3OworCisgIC8qIEhhbmRsZSB1cCB0byA3IHdvcmRzIGF0IGVuZCAqLworICB3aGlsZShjbnQgIT0gMCl7CisgICAgc3VtICs9IChsb25nKWluWzBdICogaW5bMF07CisgICAgaW4rKzsKKyAgICBjbnQtLTsKKyAgfQorICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEvZmVjL3N1bXNxX21teF9hc3Npc3QucyBiL2ZlYy9zdW1zcV9tbXhfYXNzaXN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiYWM2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zdW1zcV9tbXhfYXNzaXN0LnMKQEAgLTAsMCArMSw4MyBAQAorIyBNTVggYXNzaXN0IHJvdXRpbmVzIGZvciBzdW1zcQorIyBDb3B5cmlnaHQgMjAwMSBQaGlsIEthcm4sIEtBOVEKKyMgTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgKEdQTCkKKworCS50ZXh0CisKKyMgRXZhbHVhdGUgc3VtIG9mIHNxdWFyZXMgb2Ygc2lnbmVkIDE2LWJpdCBpbnB1dCBzYW1wbGVzCisjICBsb25nIGxvbmcgc3Vtc3FfbW14X2Fzc2lzdChzaWduZWQgc2hvcnQgKmluLGludCBjbnQpOwkKKwkuZ2xvYmFsIHN1bXNxX21teF9hc3Npc3QKKwkudHlwZSBzdW1zcV9tbXhfYXNzaXN0LEBmdW5jdGlvbgorCS5hbGlnbiAxNgorc3Vtc3FfbW14X2Fzc2lzdDoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisJeG9yICVlYXgsJWVheAorCXhvciAlZWR4LCVlZHgKKworCSMgU2luY2UgNCAqIDMyNzY3KioyIDwgMioqMzIsIHdlIGNhbiBhY2N1bXVsYXRlIHR3byBhdCBhIHRpbWUKKzE6CXN1YmwgJDgsJWVjeAorCWpsIDJmCisJbW92cSAoJWVzaSksJW1tMAkjIFMwIFMxIFMyIFMzCisJcG1hZGR3ZCAlbW0wLCVtbTAJIyAoUzBeMitTMV4yKSAoUzJeMitTM14yKQorCW1vdnEgOCglZXNpKSwlbW02CSMgUzQgUzUgUzYgUzcKKwlwbWFkZHdkICVtbTYsJW1tNgkjIChTNF4yK1M1XjIpIChTNl4yK1M3XjIpCisJcGFkZGQgJW1tNiwlbW0wCQkjIChTMF4yK1MxXjIrUzReMitTNV4yKShTMl4yK1MzXjIrUzZeMitTN14yKQorCW1vdmQgJW1tMCwlZWJ4CisJYWRkbCAlZWJ4LCVlYXgKKwlhZGNsICQwLCVlZHgKKwlwc3JscSAkMzIsJW1tMAorCW1vdmQgJW1tMCwlZWJ4CisJYWRkbCAlZWJ4LCVlYXgKKwlhZGNsICQwLCVlZHgKKwlhZGRsICQxNiwlZXNpCisJam1wIDFiCisJCisyOgllbW1zCisJcG9wbCAlZWJ4CisJcG9wbCAlZWN4CisJcG9wbCAlZXNpCisJcG9wbCAlZWJwCisJcmV0CisJCisjIEV2YWx1YXRlIHN1bSBvZiBzcXVhcmVzIG9mIHNpZ25lZCAxNi1iaXQgaW5wdXQgc2FtcGxlcworIyAgbG9uZyBzdW1zcV93ZF9tbXhfYXNzaXN0KHNpZ25lZCBzaG9ydCAqaW4saW50IGNudCk7CisjICBRdWljayB2ZXJzaW9uLCBvbmx5IHNhZmUgZm9yIHNtYWxsIG51bWJlcnMgb2Ygc21hbGwgaW5wdXQgdmFsdWVzLi4uCisJLmdsb2JhbCBzdW1zcV93ZF9tbXhfYXNzaXN0CisJLnR5cGUgc3Vtc3Ffd2RfbW14X2Fzc2lzdCxAZnVuY3Rpb24KKwkuYWxpZ24gMTYKK3N1bXNxX3dkX21teF9hc3Npc3Q6CisJcHVzaGwgJWVicAorCW1vdmwgJWVzcCwlZWJwCisJcHVzaGwgJWVzaQorCisJbW92bCA4KCVlYnApLCVlc2kKKwltb3ZsIDEyKCVlYnApLCVlY3gKKwlweG9yICVtbTIsJW1tMgkJIyB6ZXJvIHN1bQorCisxOglzdWJsICQ4LCVlY3gKKwlqbCAyZgorCW1vdnEgKCVlc2kpLCVtbTAJIyBTMCBTMSBTMiBTMworCXBtYWRkd2QgJW1tMCwlbW0wCSMgKFMwKlMwK1MxKlMxKSAoUzIqUzIrUzMqUzMpCisJbW92cSA4KCVlc2kpLCVtbTEKKwlwbWFkZHdkICVtbTEsJW1tMQorCXBhZGRkICVtbTEsJW1tMgorCXBhZGRkICVtbTAsJW1tMgkJIyBhY2N1bXVsYXRlCisKKwlhZGRsICQxNiwlZXNpCisJam1wIDFiCQorCisyOgltb3ZkICVtbTIsJWVheAkJIyBldmVuIHN1bQkKKwlwc3JscSAkMzIsJW1tMgorCW1vdmQgJW1tMiwlZWR4CQkjIG9kZCBzdW0KKwlhZGRsICVlZHgsJWVheAorCWVtbXMKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKZGlmZiAtLWdpdCBhL2ZlYy9zdW1zcV9wb3J0LmMgYi9mZWMvc3Vtc3FfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGI0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvc3Vtc3FfcG9ydC5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiBhIHZlY3RvciBvZiBzaWduZWQgc2hvcnRzCisKKyAqICBQb3J0YWJsZSBDIHZlcnNpb24KKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKwordW5zaWduZWQgbG9uZyBsb25nIHN1bXNxX3BvcnQoc2lnbmVkIHNob3J0ICppbixpbnQgY250KXsKKyAgbG9uZyBsb25nIHN1bSA9IDA7CisgIGludCBpOworCisgIGZvcihpPTA7aTxjbnQ7aSsrKXsKKyAgICBzdW0gKz0gKGludClpbltpXSAqIChpbnQpaW5baV07CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2ZlYy9zdW1zcV9zc2UyLmMgYi9mZWMvc3Vtc3Ffc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWQyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvc3Vtc3Ffc3NlMi5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiBhIHZlY3RvciBvZiBzaWduZWQgc2hvcnRzCisKKyAqIFRoZSBTU0UyIGFuZCBNTVggYXNzaXN0IHJvdXRpbmVzIGJvdGggb3BlcmF0ZSBvbiBtdWx0aXBsZXMgb2YKKyAqIDggd29yZHM7IHRoZXkgZGlmZmVyIG9ubHkgaW4gdGhlaXIgYWxpZ25tZW50IHJlcXVpcmVtZW50cyAoOCBieXRlcworICogZm9yIE1NWCwgMTYgYnl0ZXMgZm9yIFNTRTIpCisKKyAqIENvcHlyaWdodCAyMDA0IFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisKK2xvbmcgbG9uZyBzdW1zcV9zc2UyX2Fzc2lzdChzaWduZWQgc2hvcnQgKixpbnQpOworCitsb25nIGxvbmcgc3Vtc3Ffc3NlMihzaWduZWQgc2hvcnQgKmluLGludCBjbnQpeworICBsb25nIGxvbmcgc3VtID0gMDsKKworICAvKiBIYW5kbGUgc3R1ZmYgYmVmb3JlIHRoZSBuZXh0IDgtYnl0ZSBib3VuZGFyeSAqLworICB3aGlsZSgoKGludClpbiAmIDE1KSAhPSAwICYmIGNudCAhPSAwKXsKKyAgICBzdW0gKz0gKGxvbmcpaW5bMF0gKiBpblswXTsKKyAgICBpbisrOworICAgIGNudC0tOworICB9CisgIHN1bSArPSBzdW1zcV9zc2UyX2Fzc2lzdChpbixjbnQpOworICBpbiArPSBjbnQgJiB+NzsKKyAgY250ICY9IDc7CisKKyAgLyogSGFuZGxlIHVwIHRvIDcgdHJhaWxpbmcgd29yZHMgKi8KKyAgd2hpbGUoY250ICE9IDApeworICAgIHN1bSArPSAobG9uZylpblswXSAqIGluWzBdOworICAgIGluKys7CisgICAgY250LS07CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2ZlYy9zdW1zcV9zc2UyX2Fzc2lzdC5zIGIvZmVjL3N1bXNxX3NzZTJfYXNzaXN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNGVlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy9zdW1zcV9zc2UyX2Fzc2lzdC5zCkBAIC0wLDAgKzEsNDkgQEAKKyMgU1NFMiBhc3Npc3Qgcm91dGluZXMgZm9yIHN1bXNxCisjIENvcHlyaWdodCAyMDAxIFBoaWwgS2FybiwgS0E5UQorIyBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKQorCisJLnRleHQKKyMgRXZhbHVhdGUgc3VtIG9mIHNxdWFyZXMgb2Ygc2lnbmVkIDE2LWJpdCBpbnB1dCBzYW1wbGVzCisjICBsb25nIGxvbmcgc3Vtc3Ffc3NlMl9hc3Npc3Qoc2lnbmVkIHNob3J0ICppbixpbnQgY250KTsJCisJLmdsb2JhbCBzdW1zcV9zc2UyX2Fzc2lzdAorCS50eXBlIHN1bXNxX3NzZTJfYXNzaXN0LEBmdW5jdGlvbgorCS5hbGlnbiAxNgorc3Vtc3Ffc3NlMl9hc3Npc3Q6CisJcHVzaGwgJWVicAorCW1vdmwgJWVzcCwlZWJwCisJcHVzaGwgJWVzaQorCXB1c2hsICVlY3gKKworCW1vdmwgOCglZWJwKSwlZXNpCisJbW92bCAxMiglZWJwKSwlZWN4CisJcHhvciAleG1tMiwleG1tMgkJIyB6ZXJvIHN1bQorCW1vdmFwcyBsb3csJXhtbTMJCSMgbG9hZCBtYXNrCisKKzE6CXN1YmwgJDgsJWVjeAorCWpsIDJmCisJbW92YXBzICglZXNpKSwleG1tMAkjIFMwIFMxIFMyIFMzIFM0IFM1IFM2IFM3CisJcG1hZGR3ZCAleG1tMCwleG1tMAkjIChTMCpTMCtTMSpTMSkgKFMyKlMyK1MzKlMzKSAoUzQqUzQrUzUqUzUpIChTNipTNitTNypTNykKKwltb3ZhcHMgJXhtbTAsJXhtbTEKKwlwYW5kICV4bW0zLCV4bW0xCSMgKFMwKlMwK1MxKlMxKSAwIChTNCpTNCtTNSpTNSkgMAorCXBhZGRxICV4bW0xLCV4bW0yCSMgc3VtIGV2ZW4tbnVtYmVyZWQgZHdvcmRzCisJcHNybHEgJDMyLCV4bW0wCQkjIChTMipTMitTMypTMykgMCAoUzYqUzYrUzcqUzcpIDAKKwlwYWRkcSAleG1tMCwleG1tMgkjIHN1bSBvZGQtbnVtYmVyZWQgZHdvcmRzCisJYWRkbCAkMTYsJWVzaQorCWptcCAxYgkKKworMjoJbW92YXBzICV4bW0yLCV4bW0wCisJcHNybGRxICQ4LCV4bW0wCisJcGFkZHEgJXhtbTIsJXhtbTAJIyBjb21iaW5lIDY0LWJpdCBzdW1zCisKKwltb3ZkICV4bW0wLCVlYXgJCSMgbG93IDMyIGJpdHMgb2Ygc3VtCisJcHNybGRxICQ0LCV4bW0wCisJbW92ZCAleG1tMCwlZWR4CQkjIGhpZ2ggMzIgYml0cyBvZiBzdW0KKwkKKwlwb3BsICVlY3gKKwlwb3BsICVlc2kKKwlwb3BsICVlYnAKKwlyZXQKKworCS5kYXRhCisJLmFsaWduIDE2Citsb3c6CS5ieXRlIDI1NSwyNTUsMjU1LDI1NSwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwwLDAsMCwwCmRpZmYgLS1naXQgYS9mZWMvc3Vtc3FfdGVzdC5jIGIvZmVjL3N1bXNxX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGViZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3N1bXNxX3Rlc3QuYwpAQCAtMCwwICsxLDEwMSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImZlYy5oIgorCisjaWYgSEFWRV9HRVRPUFRfTE9ORworc3RydWN0IG9wdGlvbiBPcHRpb25zW10gPSB7CisgIHsiZnJhbWUtbGVuZ3RoIiwxLE5VTEwsJ2wnfSwKKyAgeyJmcmFtZS1jb3VudCIsMSxOVUxMLCduJ30sCisgIHsidmVyYm9zZSIsMCxOVUxMLCd2J30sCisgIHsiZm9yY2UtYWx0aXZlYyIsMCxOVUxMLCdhJ30sCisgIHsiZm9yY2UtcG9ydCIsMCxOVUxMLCdwJ30sCisgIHsiZm9yY2UtbW14IiwwLE5VTEwsJ20nfSwKKyAgeyJmb3JjZS1zc2UiLDAsTlVMTCwncyd9LAorICB7ImZvcmNlLXNzZTIiLDAsTlVMTCwndCd9LAorICB7TlVMTH0sCit9OworI2VuZGlmCisKK2ludCBWZXJib3NlID0gMDsKKworaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKXsKKyAgc2lnbmVkIHNob3J0ICpidWY7CisgIGludCBpLGQsdHJpYWwsdHJpYWxzPTEwMDAwOworICBpbnQgYnVmc2l6ZSA9IDIwNDg7CisgIGxvbmcgbG9uZyBwb3J0X3N1bSxzaW1kX3N1bTsKKyAgdGltZV90IHQ7CisgIGludCB0aW1ldHJpYWxzPTA7CisKKyAgZmluZF9jcHVfbW9kZSgpOworICB0aW1lKCZ0KTsKKyAgc3JhbmRvbSh0KTsKKworI2lmIEhBVkVfR0VUT1BUX0xPTkcKKyAgd2hpbGUoKGQgPSBnZXRvcHRfbG9uZyhhcmdjLGFyZ3YsInZhcG1zdGw6bjpUIixPcHRpb25zLE5VTEwpKSAhPSBFT0YpeworI2Vsc2UKKyAgd2hpbGUoKGQgPSBnZXRvcHQoYXJnYyxhcmd2LCJ2YXBtc3RsOm46VCIpKSAhPSBFT0YpeworI2VuZGlmCisgICAgc3dpdGNoKGQpeworICAgIGNhc2UgJ2EnOgorICAgICAgQ3B1X21vZGUgPSBBTFRJVkVDOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgICBDcHVfbW9kZSA9IFBPUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIENwdV9tb2RlID0gTU1YOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBDcHVfbW9kZSA9IFNTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgQ3B1X21vZGUgPSBTU0UyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBidWZzaXplID0gYXRvaShvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICB0cmlhbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICAgIFZlcmJvc2UrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1QnOgorICAgICAgdGltZXRyaWFscysrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgYnVmID0gKHNpZ25lZCBzaG9ydCAqKWNhbGxvYyhidWZzaXplLHNpemVvZihzaWduZWQgc2hvcnQpKTsKKyAgaWYodGltZXRyaWFscyl7CisgICAgZm9yKHRyaWFsPTA7dHJpYWw8dHJpYWxzO3RyaWFsKyspeworICAgICAgKHZvaWQpc3Vtc3EoYnVmLGJ1ZnNpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IodHJpYWw9MDt0cmlhbDx0cmlhbHM7dHJpYWwrKyl7CisgICAgICBpbnQgbGVuZ3RoLG9mZnNldDsKKworICAgICAgb2Zmc2V0ID0gcmFuZG9tKCkgJiA3OworICAgICAgbGVuZ3RoID0gKHJhbmRvbSgpICUgYnVmc2l6ZSkgLSBvZmZzZXQ7CisgICAgICBpZihsZW5ndGggPD0gMCkKKwljb250aW51ZTsKKyAgICAgIGZvcihpPTA7aTxidWZzaXplO2krKykKKwlidWZbaV0gPSByYW5kb20oKTsKKyAgICAgIAorICAgICAgcG9ydF9zdW0gPSBzdW1zcV9wb3J0KGJ1ZitvZmZzZXQsbGVuZ3RoKTsKKyAgICAgIHNpbWRfc3VtID0gc3Vtc3EoYnVmK29mZnNldCxsZW5ndGgpOworICAgICAgaWYocG9ydF9zdW0gIT0gc2ltZF9zdW0peworCXByaW50Zigib2Zmc2V0ICVkIGxlbiAlZCBwb3J0X3N1bSA9ICVsbGQgc2ltZF9zdW0gPSAlbGxkICIsb2Zmc2V0LGxlbmd0aCxwb3J0X3N1bSxzaW1kX3N1bSk7CisJCisJcHJpbnRmKCJFUlJPUiEgZGlmZiA9ICVsbGRcbiIsc2ltZF9zdW0tcG9ydF9zdW0pOworICAgICAgfQorICAgIH0KKyAgfQorICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyNy5jIGIvZmVjL3ZpdGVyYmkyNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGRhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTI3LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIEs9NyByPTEvMiBWaXRlcmJpIGRlY29kZXIgd2l0aCBvcHRpb25hbCBJbnRlbCBvciBQb3dlclBDIFNJTUQKKyAqIENvcHlyaWdodCBGZWIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgImZlYy5oIgorCisvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjcoaW50IGxlbil7CisgIGZpbmRfY3B1X21vZGUoKTsKKworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpMjdfcG9ydChsZW4pOworI2lmZGVmIF9fVkVDX18KKyAgY2FzZSBBTFRJVkVDOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTI3X2F2KGxlbik7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIE1NWDoKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmkyN19tbXgobGVuKTsKKyAgY2FzZSBTU0U6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpMjdfc3NlKGxlbik7CisgIGNhc2UgU1NFMjoKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmkyN19zc2UyKGxlbik7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbChpbnQgcG9seXNbMl0peworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisgICAgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsX3BvcnQocG9seXMpOworICAgIGJyZWFrOworI2lmZGVmIF9fVkVDX18KKyAgY2FzZSBBTFRJVkVDOgorICAgIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9hdihwb2x5cyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIE1NWDoKKyAgICBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfbW14KHBvbHlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBTU0U6CisgICAgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsX3NzZShwb2x5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgU1NFMjoKKyAgICBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfc3NlMihwb2x5cyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgfQorfQorCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMjcodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICAgIHN3aXRjaChDcHVfbW9kZSl7CisgICAgY2FzZSBQT1JUOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMjdfcG9ydChwLHN0YXJ0aW5nX3N0YXRlKTsKKyNpZmRlZiBfX1ZFQ19fCisgICAgY2FzZSBBTFRJVkVDOgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTI3X2F2KHAsc3RhcnRpbmdfc3RhdGUpOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgICBjYXNlIE1NWDoKKyAgICAgIHJldHVybiBpbml0X3ZpdGVyYmkyN19tbXgocCxzdGFydGluZ19zdGF0ZSk7CisgICAgY2FzZSBTU0U6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMjdfc3NlKHAsc3RhcnRpbmdfc3RhdGUpOworICAgIGNhc2UgU1NFMjoKKyAgICAgIHJldHVybiBpbml0X3ZpdGVyYmkyN19zc2UyKHAsc3RhcnRpbmdfc3RhdGUpOworI2VuZGlmCisgICAgfQorfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMjcoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpMjdfcG9ydChwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworI2lmZGVmIF9fVkVDX18KKyAgICBjYXNlIEFMVElWRUM6CisgICAgICByZXR1cm4gY2hhaW5iYWNrX3ZpdGVyYmkyN19hdihwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgICBjYXNlIE1NWDoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTI3X21teChwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworICAgIGNhc2UgU1NFOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpMjdfc3NlKHAsZGF0YSxuYml0cyxlbmRzdGF0ZSk7CisgICAgY2FzZSBTU0UyOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpMjdfc3NlMihwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworI2VuZGlmCisgICAgfQorfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyNyh2b2lkICpwKXsKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgZGVsZXRlX3ZpdGVyYmkyN19wb3J0KHApOworICAgICAgYnJlYWs7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIGRlbGV0ZV92aXRlcmJpMjdfYXYocCk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICBkZWxldGVfdml0ZXJiaTI3X21teChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1NFOgorICAgICAgZGVsZXRlX3ZpdGVyYmkyN19zc2UocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNTRTI6CisgICAgICBkZWxldGVfdml0ZXJiaTI3X3NzZTIocCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KK30KKworLyogVXBkYXRlIGRlY29kZXIgd2l0aCBhIGJsb2NrIG9mIGRlbW9kdWxhdGVkIHN5bWJvbHMKKyAqIE5vdGUgdGhhdCBuYml0cyBpcyB0aGUgbnVtYmVyIG9mIGRlY29kZWQgZGF0YSBiaXRzLCBub3QgdGhlIG51bWJlcgorICogb2Ygc3ltYm9scyEKKyAqLworaW50IHVwZGF0ZV92aXRlcmJpMjdfYmxrKHZvaWQgKnAsdW5zaWduZWQgY2hhciBzeW1zW10saW50IG5iaXRzKXsKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisgICAgdXBkYXRlX3ZpdGVyYmkyN19ibGtfcG9ydChwLHN5bXMsbmJpdHMpOworICAgIGJyZWFrOworI2lmZGVmIF9fVkVDX18KKyAgY2FzZSBBTFRJVkVDOgorICAgIHVwZGF0ZV92aXRlcmJpMjdfYmxrX2F2KHAsc3ltcyxuYml0cyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIE1NWDoKKyAgICB1cGRhdGVfdml0ZXJiaTI3X2Jsa19tbXgocCxzeW1zLG5iaXRzKTsKKyAgICBicmVhazsKKyAgY2FzZSBTU0U6CisgICAgdXBkYXRlX3ZpdGVyYmkyN19ibGtfc3NlKHAsc3ltcyxuYml0cyk7CisgICAgYnJlYWs7CisgIGNhc2UgU1NFMjoKKyAgICB1cGRhdGVfdml0ZXJiaTI3X2Jsa19zc2UyKHAsc3ltcyxuYml0cyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMjdfYXYuYyBiL2ZlYy92aXRlcmJpMjdfYXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ3MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkyN19hdi5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBLPTcgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIGZvciBQb3dlclBDIEc0L0c1IEFsdGl2ZWMgaW5zdHJ1Y3Rpb25zCisgKiBGZWIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZlYy5oIgorCit0eXBlZGVmIHVuaW9uIHsgbG9uZyBsb25nIHA7IHVuc2lnbmVkIGNoYXIgY1s2NF07IHZlY3RvciBib29sIGNoYXIgdls0XTsgfSBkZWNpc2lvbl90OwordHlwZWRlZiB1bmlvbiB7IGxvbmcgbG9uZyBwOyB1bnNpZ25lZCBjaGFyIGNbNjRdOyB2ZWN0b3IgdW5zaWduZWQgY2hhciB2WzRdOyB9IG1ldHJpY190OworCitzdGF0aWMgdW5pb24gYnJhbmNodGFiMjcgeyB1bnNpZ25lZCBjaGFyIGNbMzJdOyB2ZWN0b3IgdW5zaWduZWQgY2hhciB2WzJdO30gQnJhbmNodGFiMjdbMl07CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIKKyAqIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgYWxzbyBjaGFuZ2luZyByZWZlcmVuY2VzIGluIFttbXh8c3NlfHNzZTJdYmZseTI5LnMhCisgKi8KK3N0cnVjdCB2MjcgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkyN19hdih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2MjcgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDQ7aSsrKQorICAgIHZwLT5tZXRyaWNzMS52W2ldID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKSg2Myk7CisgIHZwLT5vbGRfbWV0cmljcyA9ICZ2cC0+bWV0cmljczE7CisgIHZwLT5uZXdfbWV0cmljcyA9ICZ2cC0+bWV0cmljczI7CisgIHZwLT5kcCA9IHZwLT5kZWNpc2lvbnM7CisgIHZwLT5vbGRfbWV0cmljcy0+Y1tzdGFydGluZ19zdGF0ZSAmIDYzXSA9IDA7IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsX2F2KGludCBwb2x5c1syXSl7CisgIGludCBzdGF0ZTsKKworICBmb3Ioc3RhdGU9MDtzdGF0ZSA8IDMyO3N0YXRlKyspeworICAgIEJyYW5jaHRhYjI3WzBdLmNbc3RhdGVdID0gKHBvbHlzWzBdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgYWJzKHBvbHlzWzBdKSkgPyAyNTUgOiAwOworICAgIEJyYW5jaHRhYjI3WzFdLmNbc3RhdGVdID0gKHBvbHlzWzFdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgYWJzKHBvbHlzWzFdKSkgPyAyNTUgOiAwOworICB9CisgIEluaXQrKzsKK30KKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI3X2F2KGludCBsZW4peworICBzdHJ1Y3QgdjI3ICp2cDsKKworICBpZighSW5pdCl7CisgICAgaW50IHBvbHlzWzJdID0geyBWMjdQT0xZQSxWMjdQT0xZQiB9OworICAgIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9hdihwb2x5cyk7CisgIH0KKyAgaWYoKHZwID0gKHN0cnVjdCB2MjcgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2MjcpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSAoZGVjaXNpb25fdCAqKW1hbGxvYygobGVuKzYpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGluaXRfdml0ZXJiaTI3X2F2KHZwLDApOworICByZXR1cm4gdnA7Cit9CisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkyN19hdigKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKyAgc3RydWN0IHYyNyAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkID0gKGRlY2lzaW9uX3QgKil2cC0+ZGVjaXNpb25zOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogTWFrZSByb29tIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBlbmNvZGVyIHJlZ2lzdGVyIHNvIHdlIGNhbgorICAgKiBhY2N1bXVsYXRlIGEgZnVsbCBieXRlIG9mIGRlY29kZWQgZGF0YQorICAgKi8KKyAgZW5kc3RhdGUgJT0gNjQ7CisgIGVuZHN0YXRlIDw8PSAyOworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDY7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisgICAgCisgICAgayA9IGRbbmJpdHNdLmNbZW5kc3RhdGU+PjJdICYgMTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID0gKGVuZHN0YXRlID4+IDEpIHwgKGsgPDwgNyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTI3X2F2KHZvaWQgKnApeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisvKiBQcm9jZXNzIHJlY2VpdmVkIHN5bWJvbHMgKi8KK2ludCB1cGRhdGVfdml0ZXJiaTI3X2Jsa19hdih2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKXsKKyAgc3RydWN0IHYyNyAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSAoZGVjaXNpb25fdCAqKXZwLT5kcDsKKyAgd2hpbGUobmJpdHMtLSl7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc3Vydml2b3IwLHN1cnZpdm9yMSxzeW0wdixzeW0xdjsKKyAgICB2ZWN0b3IgYm9vbCBjaGFyIGRlY2lzaW9uMCxkZWNpc2lvbjE7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgbWV0cmljLG1fbWV0cmljLG0wLG0xLG0yLG0zOworICAgIHZvaWQgKnRtcDsKKworICAgIC8qIHN5bTB2LjAgPSBzeW1zWzBdOyBzeW0wdi4xID0gc3ltc1sxXSAqLworICAgIHN5bTB2ID0gdmVjX3Blcm0odmVjX2xkKDAsc3ltcyksdmVjX2xkKDEsc3ltcyksdmVjX2x2c2woMCxzeW1zKSk7CisKKyAgICBzeW0xdiA9IHZlY19zcGxhdChzeW0wdiwxKTsgLyogU3BsYXQgc3ltc1sxXSBhY3Jvc3Mgc3ltMXYgKi8KKyAgICBzeW0wdiA9IHZlY19zcGxhdChzeW0wdiwwKTsgLyogU3BsYXQgc3ltc1swXSBhY3Jvc3Mgc3ltMHYgKi8KKyAgICBzeW1zICs9IDI7CisKKyAgICAvKiBEbyB0aGUgMzIgYnV0dGVyZmxpZXMgYXMgdHdvIGludGVybGVhdmVkIGdyb3VwcyBvZiAxNiBlYWNoIHRvIGtlZXAgdGhlIHBpcGVzIGZ1bGwgKi8KKworICAgIC8qIEZvcm0gZmlyc3Qgc2V0IG9mIDE2IGJyYW5jaCBtZXRyaWNzICovCisgICAgbWV0cmljID0gdmVjX2F2Zyh2ZWNfeG9yKEJyYW5jaHRhYjI3WzBdLnZbMF0sc3ltMHYpLHZlY194b3IoQnJhbmNodGFiMjdbMV0udlswXSxzeW0xdikpOworICAgIG1ldHJpYyA9IHZlY19zcihtZXRyaWMsKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgzKSk7CisgICAgbV9tZXRyaWMgPSB2ZWNfc3ViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMzEpLG1ldHJpYyk7CisgICAgCisgICAgLyogRm9ybSBmaXJzdCBzZXQgb2YgcGF0aCBtZXRyaWNzICovCisgICAgbTAgPSB2ZWNfYWRkcyh2cC0+b2xkX21ldHJpY3MtPnZbMF0sbWV0cmljKTsKKyAgICBtMyA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dlsyXSxtZXRyaWMpOworICAgIG0xID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzJdLG1fbWV0cmljKTsKKyAgICBtMiA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dlswXSxtX21ldHJpYyk7CisgICAgCisgICAgLyogRm9ybSBzZWNvbmQgc2V0IG9mIDE2IGJyYW5jaCBtZXRyaWNzICovCisgICAgbWV0cmljID0gdmVjX2F2Zyh2ZWNfeG9yKEJyYW5jaHRhYjI3WzBdLnZbMV0sc3ltMHYpLHZlY194b3IoQnJhbmNodGFiMjdbMV0udlsxXSxzeW0xdikpOworICAgIG1ldHJpYyA9IHZlY19zcihtZXRyaWMsKHZlY3RvciB1bnNpZ25lZCBjaGFyKSgzKSk7CisgICAgbV9tZXRyaWMgPSB2ZWNfc3ViKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMzEpLG1ldHJpYyk7CisKKyAgICAvKiBDb21wYXJlIGFuZCBzZWxlY3QgZmlyc3Qgc2V0ICovCisgICAgZGVjaXNpb24wID0gdmVjX2NtcGd0KG0wLG0xKTsKKyAgICBkZWNpc2lvbjEgPSB2ZWNfY21wZ3QobTIsbTMpOworICAgIHN1cnZpdm9yMCA9IHZlY19taW4obTAsbTEpOworICAgIHN1cnZpdm9yMSA9IHZlY19taW4obTIsbTMpOworICAgIAorICAgIC8qIENvbXB1dGUgc2Vjb25kIHNldCBvZiBwYXRoIG1ldHJpY3MgKi8KKyAgICBtMCA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dlsxXSxtZXRyaWMpOworICAgIG0zID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzNdLG1ldHJpYyk7CisgICAgbTEgPSB2ZWNfYWRkcyh2cC0+b2xkX21ldHJpY3MtPnZbM10sbV9tZXRyaWMpOworICAgIG0yID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzFdLG1fbWV0cmljKTsKKworICAgIC8qIEludGVybGVhdmUgYW5kIHN0b3JlIGZpcnN0IGRlY2lzaW9ucyBhbmQgc3Vydml2b3JzICovCisgICAgZC0+dlswXSA9IHZlY19tZXJnZWgoZGVjaXNpb24wLGRlY2lzaW9uMSk7CisgICAgZC0+dlsxXSA9IHZlY19tZXJnZWwoZGVjaXNpb24wLGRlY2lzaW9uMSk7CisgICAgdnAtPm5ld19tZXRyaWNzLT52WzBdID0gdmVjX21lcmdlaChzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICB2cC0+bmV3X21ldHJpY3MtPnZbMV0gPSB2ZWNfbWVyZ2VsKHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgIAorICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdCBzZWNvbmQgc2V0ICovCisgICAgZGVjaXNpb24wID0gdmVjX2NtcGd0KG0wLG0xKTsKKyAgICBkZWNpc2lvbjEgPSB2ZWNfY21wZ3QobTIsbTMpOworICAgIHN1cnZpdm9yMCA9IHZlY19taW4obTAsbTEpOworICAgIHN1cnZpdm9yMSA9IHZlY19taW4obTIsbTMpOworCisgICAgLyogSW50ZXJsZWF2ZSBhbmQgc3RvcmUgc2Vjb25kIHNldCBvZiBkZWNpc2lvbnMgYW5kIHN1cnZpdm9ycyAqLworICAgIGQtPnZbMl0gPSB2ZWNfbWVyZ2VoKGRlY2lzaW9uMCxkZWNpc2lvbjEpOworICAgIGQtPnZbM10gPSB2ZWNfbWVyZ2VsKGRlY2lzaW9uMCxkZWNpc2lvbjEpOworICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyXSA9IHZlY19tZXJnZWgoc3Vydml2b3IwLHN1cnZpdm9yMSk7CisgICAgdnAtPm5ld19tZXRyaWNzLT52WzNdID0gdmVjX21lcmdlbChzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgIAorICAgIC8qIHJlbm9ybWFsaXplIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmKHZwLT5uZXdfbWV0cmljcy0+Y1swXSA+PSAxMDUpeworICAgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgc2NhbGUwLHNjYWxlMTsKKworICAgICAgLyogRmluZCBzbWFsbGVzdCBtZXRyaWMgYW5kIHNwbGF0ICovCisgICAgICBzY2FsZTAgPSB2ZWNfbWluKHZwLT5uZXdfbWV0cmljcy0+dlswXSx2cC0+bmV3X21ldHJpY3MtPnZbMV0pOworICAgICAgc2NhbGUxID0gdmVjX21pbih2cC0+bmV3X21ldHJpY3MtPnZbMl0sdnAtPm5ld19tZXRyaWNzLT52WzNdKTsKKyAgICAgIHNjYWxlMCA9IHZlY19taW4oc2NhbGUwLHNjYWxlMSk7CisgICAgICBzY2FsZTAgPSB2ZWNfbWluKHNjYWxlMCx2ZWNfc2xkKHNjYWxlMCxzY2FsZTAsOCkpOworICAgICAgc2NhbGUwID0gdmVjX21pbihzY2FsZTAsdmVjX3NsZChzY2FsZTAsc2NhbGUwLDQpKTsKKyAgICAgIHNjYWxlMCA9IHZlY19taW4oc2NhbGUwLHZlY19zbGQoc2NhbGUwLHNjYWxlMCwyKSk7CisgICAgICBzY2FsZTAgPSB2ZWNfbWluKHNjYWxlMCx2ZWNfc2xkKHNjYWxlMCxzY2FsZTAsMSkpOworCisgICAgICAvKiBOb3cgc3VidHJhY3QgZnJvbSBhbGwgbWV0cmljcyAqLworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzBdID0gdmVjX3N1YnModnAtPm5ld19tZXRyaWNzLT52WzBdLHNjYWxlMCk7CisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMV0gPSB2ZWNfc3Vicyh2cC0+bmV3X21ldHJpY3MtPnZbMV0sc2NhbGUwKTsKKyAgICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyXSA9IHZlY19zdWJzKHZwLT5uZXdfbWV0cmljcy0+dlsyXSxzY2FsZTApOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzNdID0gdmVjX3N1YnModnAtPm5ld19tZXRyaWNzLT52WzNdLHNjYWxlMCk7CisgICAgfQorICAgIGQrKzsKKyAgICAvKiBTd2FwIHBvaW50ZXJzIHRvIG9sZCBhbmQgbmV3IG1ldHJpY3MgKi8KKyAgICB0bXAgPSB2cC0+b2xkX21ldHJpY3M7CisgICAgdnAtPm9sZF9tZXRyaWNzID0gdnAtPm5ld19tZXRyaWNzOworICAgIHZwLT5uZXdfbWV0cmljcyA9IHRtcDsKKyAgfQorICB2cC0+ZHAgPSBkOworCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mZWMvdml0ZXJiaTI3X21teC5jIGIvZmVjL3ZpdGVyYmkyN19tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ1MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkyN19tbXguYwpAQCAtMCwwICsxLDExNSBAQAorLyogSz03IHI9MS8yIFZpdGVyYmkgZGVjb2RlciBmb3IgTU1YCisgKiBDb3B5cmlnaHQgRmViIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxtbWludHJpbi5oPgorI2luY2x1ZGUgImZlYy5oIgorCit0eXBlZGVmIHVuaW9uIHsgY2hhciBjWzY0XTsgX19tNjQgdls4XTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBjWzY0XTsgX19tNjQgdls4XTt9IG1ldHJpY190OworCit1bnNpZ25lZCBjaGFyIE1ldHRhYjI3XzFbMjU2XVszMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7Cit1bnNpZ25lZCBjaGFyIE1ldHRhYjI3XzJbMjU2XVszMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIKKyAqIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgYWxzbyBjaGFuZ2luZyByZWZlcmVuY2VzIGluIG1teGJmbHkyNy5zIQorICovCitzdHJ1Y3QgdjI3IHsKKyAgbWV0cmljX3QgbWV0cmljczE7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAxICovCisgIG1ldHJpY190IG1ldHJpY3MyOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMiAqLworICBkZWNpc2lvbl90ICpkcDsgICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGRlY2lzaW9uICovCisgIG1ldHJpY190ICpvbGRfbWV0cmljcywqbmV3X21ldHJpY3M7IC8qIFBvaW50ZXJzIHRvIHBhdGggbWV0cmljcywgc3dhcHBlZCBvbiBldmVyeSBiaXQgKi8KKyAgZGVjaXNpb25fdCAqZGVjaXNpb25zOyAgIC8qIEJlZ2lubmluZyBvZiBkZWNpc2lvbnMgZm9yIGJsb2NrICovCit9OworCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMjdfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYyNyAqdnAgPSAoc3RydWN0IHYyNyAqKXA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGZvcihpPTA7aTw2NDtpKyspCisgICAgdnAtPm1ldHJpY3MxLmNbaV0gPSA2MzsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPmNbc3RhcnRpbmdfc3RhdGUgJiA2M10gPSAwOyAvKiBCaWFzIGtub3duIHN0YXJ0IHN0YXRlICovCisgIHJldHVybiAwOworfQorCit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9tbXgoaW50IHBvbHlzWzJdKXsKKyAgaW50IHN0YXRlOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgMzI7c3RhdGUrKyl7CisgICAgaW50IHN5bWJvbDsKKyAgICBmb3Ioc3ltYm9sID0gMDtzeW1ib2wgPCAyNTY7c3ltYm9sKyspeworICAgICAgaW50IHN5bTsKKworICAgICAgc3ltID0gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1swXSkpIF4gKHBvbHlzWzBdIDwgMCk7CisgICAgICBNZXR0YWIyN18xW3N5bWJvbF1bc3RhdGVdID0gKHN5bSA/ICgyNTUtc3ltYm9sKTpzeW1ib2wpIC8gMTY7CisKKyAgICAgIHN5bSA9IHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSBeIChwb2x5c1sxXSA8IDApOworICAgICAgTWV0dGFiMjdfMltzeW1ib2xdW3N0YXRlXSA9IChzeW0gPyAoMjU1LXN5bWJvbCk6c3ltYm9sKSAvIDE2OworICAgIH0KKyAgfQorICBJbml0Kys7Cit9CisKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI3X21teChpbnQgbGVuKXsKKyAgc3RydWN0IHYyNyAqdnA7CisgIGludCBwb2x5c1syXSA9IHsgVjI3UE9MWUEsIFYyN1BPTFlCIH07CisgIAorICBpZihJbml0ID09IDApeworICAgIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9tbXgocG9seXMpOworICB9CisgIGlmKCh2cCA9IChzdHJ1Y3QgdjI3ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjI3KSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSAoZGVjaXNpb25fdCAqKW1hbGxvYygobGVuKzYpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGluaXRfdml0ZXJiaTI3X21teCh2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMjdfbW14KAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworCisgIHN0cnVjdCB2MjcgKnZwID0gKHN0cnVjdCB2MjcgKilwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSAoZGVjaXNpb25fdCAqKXZwLT5kZWNpc2lvbnM7CisgIGVuZHN0YXRlICY9IDYzOworICBkICs9IDY7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisKKyAgICBrID0gZFtuYml0c10uY1tlbmRzdGF0ZT4+Ml0gJiAxOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGUgPSAoZW5kc3RhdGUgPj4gMSkgfCAoayA8PCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMjdfbW14KHZvaWQgKnApeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyN19wb3J0LmMgYi9mZWMvdml0ZXJiaTI3X3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2FjMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkyN19wb3J0LmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIEs9NyByPTEvMiBWaXRlcmJpIGRlY29kZXIgaW4gcG9ydGFibGUgQworICogQ29weXJpZ2h0IEZlYiAyMDA0LCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgaW50IHdbNjRdOyB9IG1ldHJpY190OwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGxvbmcgd1syXTt9IGRlY2lzaW9uX3Q7CitzdGF0aWMgdW5pb24gYnJhbmNodGFiMjcgeyB1bnNpZ25lZCBjaGFyIGNbMzJdOyB9IEJyYW5jaHRhYjI3WzJdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyCisgKiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGFsc28gY2hhbmdpbmcgcmVmZXJlbmNlcyBpbiBbbW14fHNzZXxzc2UyXWJmbHkyOS5zIQorICovCitzdHJ1Y3QgdjI3IHsKKyAgbWV0cmljX3QgbWV0cmljczE7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAxICovCisgIG1ldHJpY190IG1ldHJpY3MyOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMiAqLworICBkZWNpc2lvbl90ICpkcDsgICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGRlY2lzaW9uICovCisgIG1ldHJpY190ICpvbGRfbWV0cmljcywqbmV3X21ldHJpY3M7IC8qIFBvaW50ZXJzIHRvIHBhdGggbWV0cmljcywgc3dhcHBlZCBvbiBldmVyeSBiaXQgKi8KKyAgZGVjaXNpb25fdCAqZGVjaXNpb25zOyAgIC8qIEJlZ2lubmluZyBvZiBkZWNpc2lvbnMgZm9yIGJsb2NrICovCit9OworCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMjdfcG9ydCh2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2MjcgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDY0O2krKykKKyAgICB2cC0+bWV0cmljczEud1tpXSA9IDYzOworCisgIHZwLT5vbGRfbWV0cmljcyA9ICZ2cC0+bWV0cmljczE7CisgIHZwLT5uZXdfbWV0cmljcyA9ICZ2cC0+bWV0cmljczI7CisgIHZwLT5kcCA9IHZwLT5kZWNpc2lvbnM7CisgIHZwLT5vbGRfbWV0cmljcy0+d1tzdGFydGluZ19zdGF0ZSAmIDYzXSA9IDA7IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsX3BvcnQoaW50IHBvbHlzWzJdKXsKKyAgaW50IHN0YXRlOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgMzI7c3RhdGUrKyl7CisgICAgQnJhbmNodGFiMjdbMF0uY1tzdGF0ZV0gPSAocG9seXNbMF0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMF0pKSA/IDI1NSA6IDA7CisgICAgQnJhbmNodGFiMjdbMV0uY1tzdGF0ZV0gPSAocG9seXNbMV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjdfcG9ydChpbnQgbGVuKXsKKyAgc3RydWN0IHYyNyAqdnA7CisKKyAgaWYoIUluaXQpeworICAgIGludCBwb2x5c1syXSA9IHsgVjI3UE9MWUEsIFYyN1BPTFlCIH07CisgICAgc2V0X3ZpdGVyYmkyN19wb2x5bm9taWFsX3BvcnQocG9seXMpOworICB9CisgIGlmKCh2cCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHYyNykpKSA9PSBOVUxMKQorICAgICByZXR1cm4gTlVMTDsKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSBtYWxsb2MoKGxlbis2KSpzaXplb2YoZGVjaXNpb25fdCkpKSA9PSBOVUxMKXsKKyAgICBmcmVlKHZwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbml0X3ZpdGVyYmkyN19wb3J0KHZwLDApOworCisgIHJldHVybiB2cDsKK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI3X3BvcnQoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2MjcgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBkID0gdnAtPmRlY2lzaW9uczsKKyAgLyogTWFrZSByb29tIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBlbmNvZGVyIHJlZ2lzdGVyIHNvIHdlIGNhbgorICAgKiBhY2N1bXVsYXRlIGEgZnVsbCBieXRlIG9mIGRlY29kZWQgZGF0YQorICAgKi8KKyAgZW5kc3RhdGUgJT0gNjQ7CisgIGVuZHN0YXRlIDw8PSAyOworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDY7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisKKyAgICBrID0gKGRbbmJpdHNdLndbKGVuZHN0YXRlPj4yKS8zMl0gPj4gKChlbmRzdGF0ZT4+MiklMzIpKSAmIDE7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZSA9IChlbmRzdGF0ZSA+PiAxKSB8IChrIDw8IDcpOworICB9CisgIHJldHVybiAwOworfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyN19wb3J0KHZvaWQgKnApeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisvKiBDLWxhbmd1YWdlIGJ1dHRlcmZseSAqLworI2RlZmluZSBCRkxZKGkpIHtcCit1bnNpZ25lZCBpbnQgbWV0cmljLG0wLG0xLGRlY2lzaW9uO1wKKyAgICBtZXRyaWMgPSAoQnJhbmNodGFiMjdbMF0uY1tpXSBeIHN5bTApICsgKEJyYW5jaHRhYjI3WzFdLmNbaV0gXiBzeW0xKTtcCisgICAgbTAgPSB2cC0+b2xkX21ldHJpY3MtPndbaV0gKyBtZXRyaWM7XAorICAgIG0xID0gdnAtPm9sZF9tZXRyaWNzLT53W2krMzJdICsgKDUxMCAtIG1ldHJpYyk7XAorICAgIGRlY2lzaW9uID0gKHNpZ25lZCBpbnQpKG0wLW0xKSA+IDA7XAorICAgIHZwLT5uZXdfbWV0cmljcy0+d1syKmldID0gZGVjaXNpb24gPyBtMSA6IG0wO1wKKyAgICBkLT53W2kvMTZdIHw9IGRlY2lzaW9uIDw8ICgoMippKSYzMSk7XAorICAgIG0wIC09IChtZXRyaWMrbWV0cmljLTUxMCk7XAorICAgIG0xICs9IChtZXRyaWMrbWV0cmljLTUxMCk7XAorICAgIGRlY2lzaW9uID0gKHNpZ25lZCBpbnQpKG0wLW0xKSA+IDA7XAorICAgIHZwLT5uZXdfbWV0cmljcy0+d1syKmkrMV0gPSBkZWNpc2lvbiA/IG0xIDogbTA7XAorICAgIGQtPndbaS8xNl0gfD0gZGVjaXNpb24gPDwgKCgyKmkrMSkmMzEpO1wKK30KKworLyogVXBkYXRlIGRlY29kZXIgd2l0aCBhIGJsb2NrIG9mIGRlbW9kdWxhdGVkIHN5bWJvbHMKKyAqIE5vdGUgdGhhdCBuYml0cyBpcyB0aGUgbnVtYmVyIG9mIGRlY29kZWQgZGF0YSBiaXRzLCBub3QgdGhlIG51bWJlcgorICogb2Ygc3ltYm9scyEKKyAqLworaW50IHVwZGF0ZV92aXRlcmJpMjdfYmxrX3BvcnQodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MjcgKnZwID0gcDsKKyAgdm9pZCAqdG1wOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSAoZGVjaXNpb25fdCAqKXZwLT5kcDsKKyAgd2hpbGUobmJpdHMtLSl7CisgICAgdW5zaWduZWQgY2hhciBzeW0wLHN5bTE7CisKKyAgICBkLT53WzBdID0gZC0+d1sxXSA9IDA7CisgICAgc3ltMCA9ICpzeW1zKys7CisgICAgc3ltMSA9ICpzeW1zKys7CisgICAgCisgICAgQkZMWSgwKTsKKyAgICBCRkxZKDEpOworICAgIEJGTFkoMik7CisgICAgQkZMWSgzKTsKKyAgICBCRkxZKDQpOworICAgIEJGTFkoNSk7CisgICAgQkZMWSg2KTsKKyAgICBCRkxZKDcpOworICAgIEJGTFkoOCk7CisgICAgQkZMWSg5KTsKKyAgICBCRkxZKDEwKTsKKyAgICBCRkxZKDExKTsKKyAgICBCRkxZKDEyKTsKKyAgICBCRkxZKDEzKTsKKyAgICBCRkxZKDE0KTsKKyAgICBCRkxZKDE1KTsKKyAgICBCRkxZKDE2KTsKKyAgICBCRkxZKDE3KTsKKyAgICBCRkxZKDE4KTsKKyAgICBCRkxZKDE5KTsKKyAgICBCRkxZKDIwKTsKKyAgICBCRkxZKDIxKTsKKyAgICBCRkxZKDIyKTsKKyAgICBCRkxZKDIzKTsKKyAgICBCRkxZKDI0KTsKKyAgICBCRkxZKDI1KTsKKyAgICBCRkxZKDI2KTsKKyAgICBCRkxZKDI3KTsKKyAgICBCRkxZKDI4KTsKKyAgICBCRkxZKDI5KTsKKyAgICBCRkxZKDMwKTsKKyAgICBCRkxZKDMxKTsKKyAgICBkKys7CisgICAgLyogU3dhcCBwb2ludGVycyB0byBvbGQgYW5kIG5ldyBtZXRyaWNzICovCisgICAgdG1wID0gdnAtPm9sZF9tZXRyaWNzOworICAgIHZwLT5vbGRfbWV0cmljcyA9IHZwLT5uZXdfbWV0cmljczsKKyAgICB2cC0+bmV3X21ldHJpY3MgPSB0bXA7CisgIH0gICAgCisgIHZwLT5kcCA9IGQ7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyN19zc2UuYyBiL2ZlYy92aXRlcmJpMjdfc3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZjI4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpMjdfc3NlLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIEs9NyByPTEvMiBWaXRlcmJpIGRlY29kZXIgZm9yIFNTRQorICogRmViIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgY1s2NF07IH0gbWV0cmljX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgbG9uZyB3WzJdOyB1bnNpZ25lZCBjaGFyIGNbOF07IF9fbTY0IHZbMV07fSBkZWNpc2lvbl90OwordW5pb24gYnJhbmNodGFiMjcgeyB1bnNpZ25lZCBjaGFyIGNbMzJdOyBfX202NCB2WzRdO30gQnJhbmNodGFiMjdfc3NlWzJdOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyCisgKiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGFsc28gY2hhbmdpbmcgcmVmZXJlbmNlcyBpbiBzc2ViZmx5MjcucyEKKyAqLworc3RydWN0IHYyNyB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgZGVjaXNpb25fdCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIGRlY2lzaW9uX3QgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI3X3NzZShpbnQgbGVuKXsKKyAgc3RydWN0IHYyNyAqdnA7CisKKyAgaWYoIUluaXQpeworICAgIGludCBwb2x5c1syXSA9IHsgVjI3UE9MWUEsIFYyN1BPTFlCIH07CisKKyAgICBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfc3NlKHBvbHlzKTsKKyAgfQorICBpZigodnAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2MjcpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSBtYWxsb2MoKGxlbis2KSpzaXplb2YoZGVjaXNpb25fdCkpKSA9PSBOVUxMKXsKKyAgICBmcmVlKHZwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbml0X3ZpdGVyYmkyNyh2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpMjdfcG9seW5vbWlhbF9zc2UoaW50IHBvbHlzWzJdKXsKKyAgaW50IHN0YXRlOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgMzI7c3RhdGUrKyl7CisgICAgQnJhbmNodGFiMjdfc3NlWzBdLmNbc3RhdGVdID0gKHBvbHlzWzBdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgYWJzKHBvbHlzWzBdKSkgPyAyNTUgOiAwOworICAgIEJyYW5jaHRhYjI3X3NzZVsxXS5jW3N0YXRlXSA9IChwb2x5c1sxXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1sxXSkpID8gMjU1IDogMDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkyN19zc2Uodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGZvcihpPTA7aTw2NDtpKyspCisgICAgdnAtPm1ldHJpY3MxLmNbaV0gPSA2MzsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPmNbc3RhcnRpbmdfc3RhdGUgJiA2M10gPSAwOyAvKiBCaWFzIGtub3duIHN0YXJ0IHN0YXRlICovCisgIHJldHVybiAwOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMjdfc3NlKAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQ7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBkID0gdnAtPmRlY2lzaW9uczsKKyAgLyogTWFrZSByb29tIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBlbmNvZGVyIHJlZ2lzdGVyIHNvIHdlIGNhbgorICAgKiBhY2N1bXVsYXRlIGEgZnVsbCBieXRlIG9mIGRlY29kZWQgZGF0YQorICAgKi8KKyAgZW5kc3RhdGUgJT0gNjQ7CisgIGVuZHN0YXRlIDw8PSAyOworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDY7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisKKyAgICBrID0gKGRbbmJpdHNdLmNbKGVuZHN0YXRlPj4yKS84XSA+PiAoKGVuZHN0YXRlPj4yKSU4KSkgJiAxOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGUgPSAoZW5kc3RhdGUgPj4gMSkgfCAoayA8PCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMjdfc3NlKHZvaWQgKnApeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyN19zc2UyLmMgYi9mZWMvdml0ZXJiaTI3X3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAxNzEwCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkyN19zc2UyLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIEs9NyByPTEvMiBWaXRlcmJpIGRlY29kZXIgZm9yIFNTRTIKKyAqIEZlYiAyMDA0LCBQaGlsIEthcm4sIEtBOVEKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIGNbNjRdOyBfX20xMjhpIHZbNF07IH0gbWV0cmljX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgbG9uZyB3WzJdOyB1bnNpZ25lZCBjaGFyIGNbOF07IHVuc2lnbmVkIHNob3J0IHNbNF07IF9fbTY0IHZbMV07fSBkZWNpc2lvbl90OwordW5pb24gYnJhbmNodGFiMjcgeyB1bnNpZ25lZCBjaGFyIGNbMzJdOyBfX20xMjhpIHZbMl07fSBCcmFuY2h0YWIyN19zc2UyWzJdOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyCisgKiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGFsc28gY2hhbmdpbmcgcmVmZXJlbmNlcyBpbiBzc2UyYmZseTI3LnMhCisgKi8KK3N0cnVjdCB2MjcgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkyN19zc2UyKHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYyNyAqdnAgPSBwOworICBpbnQgaTsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBmb3IoaT0wO2k8NjQ7aSsrKQorICAgIHZwLT5tZXRyaWNzMS5jW2ldID0gNjM7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5jW3N0YXJ0aW5nX3N0YXRlICYgNjNdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKwordm9pZCBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfc3NlMihpbnQgcG9seXNbMl0peworICBpbnQgc3RhdGU7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCAzMjtzdGF0ZSsrKXsKKyAgICBCcmFuY2h0YWIyN19zc2UyWzBdLmNbc3RhdGVdID0gKHBvbHlzWzBdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgYWJzKHBvbHlzWzBdKSkgPyAyNTUgOiAwOworICAgIEJyYW5jaHRhYjI3X3NzZTJbMV0uY1tzdGF0ZV0gPSAocG9seXNbMV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyN19zc2UyKGludCBsZW4peworICB2b2lkICpwOworICBzdHJ1Y3QgdjI3ICp2cDsKKworICBpZighSW5pdCl7CisgICAgaW50IHBvbHlzWzJdID0geyBWMjdQT0xZQSwgVjI3UE9MWUIgfTsKKyAgICBzZXRfdml0ZXJiaTI3X3BvbHlub21pYWxfc3NlMihwb2x5cyk7CisgIH0KKyAgLyogT3JkaW5hcnkgbWFsbG9jKCkgb25seSByZXR1cm5zIDgtYnl0ZSBhbGlnbm1lbnQsIHdlIG5lZWQgMTYgKi8KKyAgaWYocG9zaXhfbWVtYWxpZ24oJnAsIHNpemVvZihfX20xMjhpKSxzaXplb2Yoc3RydWN0IHYyNykpKQorICAgIHJldHVybiBOVUxMOworICB2cCA9IChzdHJ1Y3QgdjI3ICopcDsKKworICBpZigocCA9IG1hbGxvYygobGVuKzYpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZwLT5kZWNpc2lvbnMgPSAoZGVjaXNpb25fdCAqKXA7CisgIGluaXRfdml0ZXJiaTI3X3NzZTIodnAsMCk7CisKKyAgcmV0dXJuIHZwOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMjdfc3NlMigKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKyAgc3RydWN0IHYyNyAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSB2cC0+ZGVjaXNpb25zOworICAvKiBNYWtlIHJvb20gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGVuY29kZXIgcmVnaXN0ZXIgc28gd2UgY2FuCisgICAqIGFjY3VtdWxhdGUgYSBmdWxsIGJ5dGUgb2YgZGVjb2RlZCBkYXRhCisgICAqLworICBlbmRzdGF0ZSAlPSA2NDsKKyAgZW5kc3RhdGUgPDw9IDI7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gNjsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKworICAgIGsgPSAoZFtuYml0c10uY1soZW5kc3RhdGU+PjIpLzhdID4+ICgoZW5kc3RhdGU+PjIpJTgpKSAmIDE7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZSA9IChlbmRzdGF0ZSA+PiAxKSB8IChrIDw8IDcpOworICB9CisgIHJldHVybiAwOworfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyN19zc2UyKHZvaWQgKnApeworICBzdHJ1Y3QgdjI3ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisKKyNpZiAwCisvKiBUaGlzIGNvZGUgaXMgdHVybmVkIG9mZiBiZWNhdXNlIGl0J3Mgc2xvd2VyIHRoYW4gbXkgaGFuZC1jcmFmdGVkIGFzc2VtYmxlciBpbiBzc2UyYmZseTI3LnMuIEJ1dCBpdCBkb2VzIHdvcmsuICovCit2b2lkIHVwZGF0ZV92aXRlcmJpMjdfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MjcgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuOworICBkID0gKGRlY2lzaW9uX3QgKil2cC0+ZHA7CisgIHdoaWxlKG5iaXRzLS0peworICAgIF9fbTEyOGkgc3ltMHYsc3ltMXY7CisgICAgdm9pZCAqdG1wOworICAgIGludCBpOworICAgIAorICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX2VwaTgoc3ltc1swXSk7CisgICAgc3ltMXYgPSBfbW1fc2V0MV9lcGk4KHN5bXNbMV0pOworICAgIHN5bXMgKz0gMjsKKworICAgIGZvcihpPTA7aTwyO2krKyl7CisgICAgICBfX20xMjhpIGRlY2lzaW9uMCxkZWNpc2lvbjEsbWV0cmljLG1fbWV0cmljLG0wLG0xLG0yLG0zLHN1cnZpdm9yMCxzdXJ2aXZvcjE7CisKKyAgICAgIC8qIEZvcm0gYnJhbmNoIG1ldHJpY3MgKi8KKyAgICAgIG1ldHJpYyA9IF9tbV9hdmdfZXB1OChfbW1feG9yX3NpMTI4KEJyYW5jaHRhYjI3X3NzZTJbMF0udltpXSxzeW0wdiksX21tX3hvcl9zaTEyOChCcmFuY2h0YWIyN19zc2UyWzFdLnZbaV0sc3ltMXYpKTsKKyAgICAgIC8qIFRoZXJlJ3Mgbm8gcGFja2VkIGJ5dGVzIHJpZ2h0IHNoaWZ0IGluIFNTRTIsIHNvIHdlIHVzZSB0aGUgd29yZCB2ZXJzaW9uIGFuZCBtYXNrCisgICAgICAgKiAoSSdtICpyZWFsbHkqIHN0YXJ0aW5nIHRvIGxpa2UgQWx0aXZlYy4uLikKKyAgICAgICAqLworICAgICAgbWV0cmljID0gX21tX3NybGlfZXBpMTYobWV0cmljLDMpOworICAgICAgbWV0cmljID0gX21tX2FuZF9zaTEyOChtZXRyaWMsX21tX3NldDFfZXBpOCgzMSkpOworICAgICAgbV9tZXRyaWMgPSBfbW1fc3ViX2VwaTgoX21tX3NldDFfZXBpOCgzMSksbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIEFkZCBicmFuY2ggbWV0cmljcyB0byBwYXRoIG1ldHJpY3MgKi8KKyAgICAgIG0wID0gX21tX2FkZF9lcGk4KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtZXRyaWMpOworICAgICAgbTMgPSBfbW1fYWRkX2VwaTgodnAtPm9sZF9tZXRyaWNzLT52WzIraV0sbWV0cmljKTsKKyAgICAgIG0xID0gX21tX2FkZF9lcGk4KHZwLT5vbGRfbWV0cmljcy0+dlsyK2ldLG1fbWV0cmljKTsKKyAgICAgIG0yID0gX21tX2FkZF9lcGk4KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtX21ldHJpYyk7CisgICAgCisgICAgICAvKiBDb21wYXJlIGFuZCBzZWxlY3QsIHVzaW5nIG1vZHVsbyBhcml0aG1ldGljICovCisgICAgICBkZWNpc2lvbjAgPSBfbW1fY21wZ3RfZXBpOChfbW1fc3ViX2VwaTgobTAsbTEpLF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworICAgICAgZGVjaXNpb24xID0gX21tX2NtcGd0X2VwaTgoX21tX3N1Yl9lcGk4KG0yLG0zKSxfbW1fc2V0emVyb19zaTEyOCgpKTsKKyAgICAgIHN1cnZpdm9yMCA9IF9tbV9vcl9zaTEyOChfbW1fYW5kX3NpMTI4KGRlY2lzaW9uMCxtMSksX21tX2FuZG5vdF9zaTEyOChkZWNpc2lvbjAsbTApKTsKKyAgICAgIHN1cnZpdm9yMSA9IF9tbV9vcl9zaTEyOChfbW1fYW5kX3NpMTI4KGRlY2lzaW9uMSxtMyksX21tX2FuZG5vdF9zaTEyOChkZWNpc2lvbjEsbTIpKTsKKyAKKyAgICAgIC8qIFBhY2sgZWFjaCBzZXQgb2YgZGVjaXNpb25zIGludG8gMTYgYml0cyAqLworICAgICAgZC0+c1syKmldID0gX21tX21vdmVtYXNrX2VwaTgoX21tX3VucGFja2xvX2VwaTgoZGVjaXNpb24wLGRlY2lzaW9uMSkpOworICAgICAgZC0+c1syKmkrMV0gPSBfbW1fbW92ZW1hc2tfZXBpOChfbW1fdW5wYWNraGlfZXBpOChkZWNpc2lvbjAsZGVjaXNpb24xKSk7CisKKyAgICAgIC8qIFN0b3JlIHN1cnZpdmluZyBtZXRyaWNzICovCisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IF9tbV91bnBhY2tsb19lcGk4KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaSsxXSA9IF9tbV91bnBhY2toaV9lcGk4KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgIH0KKyAgICBkKys7CisgICAgLyogU3dhcCBwb2ludGVycyB0byBvbGQgYW5kIG5ldyBtZXRyaWNzICovCisgICAgdG1wID0gdnAtPm9sZF9tZXRyaWNzOworICAgIHZwLT5vbGRfbWV0cmljcyA9IHZwLT5uZXdfbWV0cmljczsKKyAgICB2cC0+bmV3X21ldHJpY3MgPSB0bXA7CisgIH0KKyAgdnAtPmRwID0gZDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyOS5jIGIvZmVjL3ZpdGVyYmkyOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwY2JiMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTI5LmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIFN3aXRjaCB0byBLPTkgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIHdpdGggb3B0aW9uYWwgSW50ZWwgb3IgUG93ZXJQQyBTSU1ECisgKiBDb3B5cmlnaHQgRmViIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI5KGludCBsZW4peworICBmaW5kX2NwdV9tb2RlKCk7CisKKyAgc3dpdGNoKENwdV9tb2RlKXsKKyAgY2FzZSBQT1JUOgorICBkZWZhdWx0OgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTI5X3BvcnQobGVuKTsKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmkyOV9hdihsZW4pOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpMjlfbW14KGxlbik7CisgIGNhc2UgU1NFOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTI5X3NzZShsZW4pOworICBjYXNlIFNTRTI6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpMjlfc3NlMihsZW4pOworI2VuZGlmCisgIH0KK30KKwordm9pZCBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWwoaW50IHBvbHlzWzJdKXsKKyAgc3dpdGNoKENwdV9tb2RlKXsKKyAgY2FzZSBQT1JUOgorICBkZWZhdWx0OgorICAgIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9wb3J0KHBvbHlzKTsKKyAgICBicmVhazsKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWxfYXYocG9seXMpOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgY2FzZSBNTVg6CisgICAgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsX21teChwb2x5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgU1NFOgorICAgIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9zc2UocG9seXMpOworICAgIGJyZWFrOworICBjYXNlIFNTRTI6CisgICAgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsX3NzZTIocG9seXMpOworICAgIGJyZWFrOworI2VuZGlmCisgIH0KK30KKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTI5KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTI5X3BvcnQocCxzdGFydGluZ19zdGF0ZSk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiBpbml0X3ZpdGVyYmkyOV9hdihwLHN0YXJ0aW5nX3N0YXRlKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMjlfbW14KHAsc3RhcnRpbmdfc3RhdGUpOworICAgIGNhc2UgU1NFOgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTI5X3NzZShwLHN0YXJ0aW5nX3N0YXRlKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMjlfc3NlMihwLHN0YXJ0aW5nX3N0YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5KAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworCisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTI5X3BvcnQocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNpZmRlZiBfX1ZFQ19fCisgICAgY2FzZSBBTFRJVkVDOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpMjlfYXYocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICByZXR1cm4gY2hhaW5iYWNrX3ZpdGVyYmkyOV9tbXgocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyAgICBjYXNlIFNTRToKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTI5X3NzZShwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworICAgIGNhc2UgU1NFMjoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTI5X3NzZTIocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMjkodm9pZCAqcCl7CisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGRlbGV0ZV92aXRlcmJpMjlfcG9ydChwKTsKKyAgICAgIGJyZWFrOworI2lmZGVmIF9fVkVDX18KKyAgICBjYXNlIEFMVElWRUM6CisgICAgICBkZWxldGVfdml0ZXJiaTI5X2F2KHApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICAgIGNhc2UgTU1YOgorICAgICAgZGVsZXRlX3ZpdGVyYmkyOV9tbXgocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNTRToKKyAgICAgIGRlbGV0ZV92aXRlcmJpMjlfc3NlKHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0UyOgorICAgICAgZGVsZXRlX3ZpdGVyYmkyOV9zc2UyKHApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIFVwZGF0ZSBkZWNvZGVyIHdpdGggYSBibG9jayBvZiBkZW1vZHVsYXRlZCBzeW1ib2xzCisgKiBOb3RlIHRoYXQgbmJpdHMgaXMgdGhlIG51bWJlciBvZiBkZWNvZGVkIGRhdGEgYml0cywgbm90IHRoZSBudW1iZXIKKyAqIG9mIHN5bWJvbHMhCisgKi8KK2ludCB1cGRhdGVfdml0ZXJiaTI5X2Jsayh2b2lkICpwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyl7CisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTI5X2Jsa19wb3J0KHAsc3ltcyxuYml0cyk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTI5X2Jsa19hdihwLHN5bXMsbmJpdHMpOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgICBjYXNlIE1NWDoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTI5X2Jsa19tbXgocCxzeW1zLG5iaXRzKTsKKyAgICBjYXNlIFNTRToKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTI5X2Jsa19zc2UocCxzeW1zLG5iaXRzKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gdXBkYXRlX3ZpdGVyYmkyOV9ibGtfc3NlMihwLHN5bXMsbmJpdHMpOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkyOV9hdi5jIGIvZmVjL3ZpdGVyYmkyOV9hdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzhkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTI5X2F2LmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIEs9OSByPTEvMiBWaXRlcmJpIGRlY29kZXIgZm9yIFBvd2VyUEMgRzQvRzUgQWx0aXZlYworICogQ29weXJpZ2h0IEZlYiAyMDA0LCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIGNbMjU2XTsgdmVjdG9yIGJvb2wgY2hhciB2WzE2XTsgfSBkZWNpc2lvbl90OwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgY1syNTZdOyB2ZWN0b3IgdW5zaWduZWQgY2hhciB2WzE2XTsgfSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjI5IHsgdW5zaWduZWQgY2hhciBjWzEyOF07IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZbOF07IH0gQnJhbmNodGFiMjlbMl07CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIgKi8KK3N0cnVjdCB2MjkgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkyOV9hdih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDE2O2krKykKKyAgICB2cC0+bWV0cmljczEudltpXSA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoNjMpOworCisgIHZwLT5vbGRfbWV0cmljcyA9ICZ2cC0+bWV0cmljczE7CisgIHZwLT5uZXdfbWV0cmljcyA9ICZ2cC0+bWV0cmljczI7CisgIHZwLT5kcCA9IHZwLT5kZWNpc2lvbnM7CisgIHZwLT5vbGRfbWV0cmljcy0+Y1tzdGFydGluZ19zdGF0ZSAmIDI1NV0gPSAwOyAvKiBCaWFzIGtub3duIHN0YXJ0IHN0YXRlICovCisgIHJldHVybiAwOworfQorCit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9hdihpbnQgcG9seXNbMl0peworICBpbnQgc3RhdGU7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCAxMjg7c3RhdGUrKyl7CisgICAgQnJhbmNodGFiMjlbMF0uY1tzdGF0ZV0gPSAocG9seXNbMF0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMF0pKSA/IDI1NSA6IDA7CisgICAgQnJhbmNodGFiMjlbMV0uY1tzdGF0ZV0gPSAocG9seXNbMV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgKmNyZWF0ZV92aXRlcmJpMjlfYXYoaW50IGxlbil7CisgIHN0cnVjdCB2MjkgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbMl0gPSB7IFYyOVBPTFlBLFYyOVBPTFlCIH07CisgICAgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsX2F2KHBvbHlzKTsKKyAgfQorICBpZigodnAgPSAoc3RydWN0IHYyOSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHYyOSkpKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBpZigodnAtPmRlY2lzaW9ucyA9IChkZWNpc2lvbl90ICopbWFsbG9jKChsZW4rOCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5pdF92aXRlcmJpMjlfYXYodnAsMCk7CisgIHJldHVybiB2cDsKK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X2F2KAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworICBzdHJ1Y3QgdjI5ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQ7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRlY2lzaW9uczsgIAorICAvKiBNYWtlIHJvb20gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGVuY29kZXIgcmVnaXN0ZXIgc28gd2UgY2FuCisgICAqIGFjY3VtdWxhdGUgYSBmdWxsIGJ5dGUgb2YgZGVjb2RlZCBkYXRhCisgICAqLworICBlbmRzdGF0ZSAlPSAyNTY7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKyAgICAKKyAgICBrID0gZFtuYml0c10uY1tlbmRzdGF0ZV0gJiAxOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGUgPSAoZW5kc3RhdGUgPj4gMSkgfCAoayA8PCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOV9hdih2b2lkICpwKXsKKyAgc3RydWN0IHYyOSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KKworCitpbnQgdXBkYXRlX3ZpdGVyYmkyOV9ibGtfYXYodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworCisgIHdoaWxlKG5iaXRzLS0peworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHN5bTF2LHN5bTJ2OworICAgIHZvaWQgKnRtcDsKKyAgICAKKyAgICAvKiBBbGwgdGhpcyBzZWVtcyBuZWNlc3NhcnkganVzdCB0byBsb2FkIGEgYnl0ZSBpbnRvIGFsbCBlbGVtZW50cyBvZiBhIHZlY3RvciEgKi8KKyAgICBzeW0xdiA9IHZlY19wZXJtKHZlY19sZCgwLHN5bXMpLHZlY19sZCgxLHN5bXMpLHZlY19sdnNsKDAsc3ltcykpOyAvKiBzeW0xdi4wID0gc3ltc1swXTsgc3ltMXYuMSA9IHN5bXNbMV0gKi8KKyAgICBzeW0ydiA9IHZlY19zcGxhdChzeW0xdiwxKTsgLyogU3BsYXQgc3ltc1sxXSBhY3Jvc3Mgc3ltMnYgKi8KKyAgICBzeW0xdiA9IHZlY19zcGxhdChzeW0xdiwwKTsgLyogU3BsYXQgc3ltc1swXSBhY3Jvc3Mgc3ltMXYgKi8KKyAgICBzeW1zICs9IDI7CisgICAgCisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICAgIHZlY3RvciBib29sIGNoYXIgZGVjaXNpb24wLGRlY2lzaW9uMTsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIG1ldHJpYyxtX21ldHJpYyxtMCxtMSxtMixtMyxzdXJ2aXZvcjAsc3Vydml2b3IxOworCisgICAgICAvKiBGb3JtIGJyYW5jaCBtZXRyaWNzICovCisgICAgICBtZXRyaWMgPSB2ZWNfYXZnKHZlY194b3IoQnJhbmNodGFiMjlbMF0udltpXSxzeW0xdiksdmVjX3hvcihCcmFuY2h0YWIyOVsxXS52W2ldLHN5bTJ2KSk7CisgICAgICBtZXRyaWMgPSB2ZWNfc3IobWV0cmljLCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMykpOworICAgICAgbV9tZXRyaWMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDMxKSAtIG1ldHJpYzsKKyAgICAKKyAgICAgIC8qIEFkZCBicmFuY2ggbWV0cmljcyB0byBwYXRoIG1ldHJpY3MgKi8KKyAgICAgIG0wID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52W2ldLG1ldHJpYyk7CisgICAgICBtMyA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dls4K2ldLG1ldHJpYyk7CisgICAgICBtMSA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dls4K2ldLG1fbWV0cmljKTsKKyAgICAgIG0yID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52W2ldLG1fbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdCBmaXJzdCBzZXQgKi8KKyAgICAgIGRlY2lzaW9uMCA9IHZlY19jbXBndChtMCxtMSk7CisgICAgICBkZWNpc2lvbjEgPSB2ZWNfY21wZ3QobTIsbTMpOworICAgICAgc3Vydml2b3IwID0gdmVjX21pbihtMCxtMSk7CisgICAgICBzdXJ2aXZvcjEgPSB2ZWNfbWluKG0yLG0zKTsKKworICAgICAgLyogSW50ZXJsZWF2ZSBhbmQgc3RvcmUgZGVjaXNpb25zIGFuZCBzdXJ2aXZvcnMgKi8KKyAgICAgIGQtPnZbMippXSA9IHZlY19tZXJnZWgoZGVjaXNpb24wLGRlY2lzaW9uMSk7CisgICAgICBkLT52WzIqaSsxXSA9IHZlY19tZXJnZWwoZGVjaXNpb24wLGRlY2lzaW9uMSk7CisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IHZlY19tZXJnZWgoc3Vydml2b3IwLHN1cnZpdm9yMSk7CisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippKzFdID0gdmVjX21lcmdlbChzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICB9CisgICAgZCsrOworICAgIC8qIHJlbm9ybWFsaXplIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmKHZwLT5uZXdfbWV0cmljcy0+Y1swXSA+PSA1MCl7CisgICAgICBpbnQgaTsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHNjYWxlMCxzY2FsZTE7CisKKyAgICAgIC8qIEZpbmQgc21hbGxlc3QgbWV0cmljIGFuZCBzcGxhdCAqLworICAgICAgc2NhbGUwID0gdnAtPm5ld19tZXRyaWNzLT52WzBdOworICAgICAgc2NhbGUxID0gdnAtPm5ld19tZXRyaWNzLT52WzFdOworICAgICAgZm9yKGk9MjtpPDE2O2krPTIpeworCXNjYWxlMCA9IHZlY19taW4oc2NhbGUwLHZwLT5uZXdfbWV0cmljcy0+dltpXSk7CisJc2NhbGUxID0gdmVjX21pbihzY2FsZTEsdnAtPm5ld19tZXRyaWNzLT52W2krMV0pOworICAgICAgfQorICAgICAgc2NhbGUwID0gdmVjX21pbihzY2FsZTAsc2NhbGUxKTsKKyAgICAgIHNjYWxlMCA9IHZlY19taW4oc2NhbGUwLHZlY19zbGQoc2NhbGUwLHNjYWxlMCw4KSk7CisgICAgICBzY2FsZTAgPSB2ZWNfbWluKHNjYWxlMCx2ZWNfc2xkKHNjYWxlMCxzY2FsZTAsNCkpOworICAgICAgc2NhbGUwID0gdmVjX21pbihzY2FsZTAsdmVjX3NsZChzY2FsZTAsc2NhbGUwLDIpKTsKKyAgICAgIHNjYWxlMCA9IHZlY19taW4oc2NhbGUwLHZlY19zbGQoc2NhbGUwLHNjYWxlMCwxKSk7CisKKyAgICAgIC8qIE5vdyBzdWJ0cmFjdCBmcm9tIGFsbCBtZXRyaWNzICovCisgICAgICBmb3IoaT0wO2k8MTY7aSsrKQorCXZwLT5uZXdfbWV0cmljcy0+dltpXSA9IHZlY19zdWJzKHZwLT5uZXdfbWV0cmljcy0+dltpXSxzY2FsZTApOworICAgIH0KKyAgICAvKiBTd2FwIHBvaW50ZXJzIHRvIG9sZCBhbmQgbmV3IG1ldHJpY3MgKi8KKyAgICB0bXAgPSB2cC0+b2xkX21ldHJpY3M7CisgICAgdnAtPm9sZF9tZXRyaWNzID0gdnAtPm5ld19tZXRyaWNzOworICAgIHZwLT5uZXdfbWV0cmljcyA9IHRtcDsKKyAgfQorICB2cC0+ZHAgPSBkOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMjlfbW14LmMgYi9mZWMvdml0ZXJiaTI5X21teC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2Y0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTI5X21teC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBLPTkgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIGZvciBNTVgKKyAqIENvcHlyaWdodCBGZWIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IGNoYXIgY1syNTZdOyBfX202NCB2WzMyXTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBjWzI1Nl07IF9fbTY0IHZbMzJdO30gbWV0cmljX3Q7CisKK3Vuc2lnbmVkIGNoYXIgTWV0dGFiMjlfMVsyNTZdWzEyOF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKK3Vuc2lnbmVkIGNoYXIgTWV0dGFiMjlfMlsyNTZdWzEyOF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlcgorICogRG9uJ3QgY2hhbmdlIHRoaXMgd2l0aG91dCBhbHNvIGNoYW5naW5nIHJlZmVyZW5jZXMgaW4gbW14YmZseTI5LnMhCisgKi8KK3N0cnVjdCB2MjkgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyOV9tbXgoaW50IGxlbil7CisgIHN0cnVjdCB2MjkgKnZwOworCisgIGlmKEluaXQgPT0gMCl7CisgICAgaW50IHBvbHlzWzJdID0ge1YyOVBPTFlBLFYyOVBPTFlCfTsKKworICAgIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9tbXgocG9seXMpOworICB9CisgIGlmKCh2cCA9IChzdHJ1Y3QgdjI5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjI5KSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSAoZGVjaXNpb25fdCAqKW1hbGxvYygobGVuKzgpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGluaXRfdml0ZXJiaTI5KHZwLDApOworICByZXR1cm4gdnA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsX21teChpbnQgcG9seXNbMl0peworICBpbnQgc3RhdGU7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCAxMjg7c3RhdGUrKyl7CisgICAgaW50IHN5bWJvbDsKKworICAgIGZvcihzeW1ib2wgPSAwO3N5bWJvbCA8IDI1NjtzeW1ib2wrKyl7CisgICAgICBpbnQgc3ltOworCisgICAgICBzeW0gPSBwYXJpdHkoKDIqc3RhdGUpICYgYWJzKHBvbHlzWzBdKSkgXiAocG9seXNbMF0gPCAwKTsKKyAgICAgIE1ldHRhYjI5XzFbc3ltYm9sXVtzdGF0ZV0gPSAoc3ltID8gKDI1NS1zeW1ib2wpOnN5bWJvbCkgLyAxNjsKKworICAgICAgc3ltID0gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1sxXSkpIF4gKHBvbHlzWzFdIDwgMCk7CisgICAgICBNZXR0YWIyOV8yW3N5bWJvbF1bc3RhdGVdID0gKHN5bSA/ICgyNTUtc3ltYm9sKTpzeW1ib2wpIC8gMTY7CisgICAgfQorICB9CisgIEluaXQrKzsKK30KKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTI5X21teCh2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDI1NjtpKyspCisgICAgdnAtPm1ldHJpY3MxLmNbaV0gPSA2MzsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPmNbc3RhcnRpbmdfc3RhdGUgJiAyNTVdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X21teCgKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKworICBzdHJ1Y3QgdjI5ICp2cCA9IChzdHJ1Y3QgdjI5ICopcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGQgPSAoZGVjaXNpb25fdCAqKXZwLT5kZWNpc2lvbnM7CisgIGVuZHN0YXRlICY9IDI1NTsKKyAgZCArPSA4OyAvKiBMb29rIHBhc3QgdGFpbCAqLworICB3aGlsZShuYml0cy0tICE9IDApeworICAgIGludCBrOworCisgICAgayA9IGRbbmJpdHNdLmNbZW5kc3RhdGVdICYgMTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID0gKGVuZHN0YXRlID4+IDEpIHwgKGsgPDwgNyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTI5X21teCh2b2lkICpwKXsKKyAgc3RydWN0IHYyOSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMjlfcG9ydC5jIGIvZmVjL3ZpdGVyYmkyOV9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyZGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpMjlfcG9ydC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBLPTkgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIGluIHBvcnRhYmxlIEMKKyAqIENvcHlyaWdodCBGZWIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBpbnQgd1syNTZdOyB9IG1ldHJpY190OwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGxvbmcgd1s4XTt9IGRlY2lzaW9uX3Q7CisKK3N0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgY1sxMjhdOyB9IEJyYW5jaHRhYjI5WzJdOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyICovCitzdHJ1Y3QgdjI5IHsKKyAgbWV0cmljX3QgbWV0cmljczE7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAxICovCisgIG1ldHJpY190IG1ldHJpY3MyOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMiAqLworICBkZWNpc2lvbl90ICpkcDsgICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGRlY2lzaW9uICovCisgIG1ldHJpY190ICpvbGRfbWV0cmljcywqbmV3X21ldHJpY3M7IC8qIFBvaW50ZXJzIHRvIHBhdGggbWV0cmljcywgc3dhcHBlZCBvbiBldmVyeSBiaXQgKi8KKyAgZGVjaXNpb25fdCAqZGVjaXNpb25zOyAgIC8qIEJlZ2lubmluZyBvZiBkZWNpc2lvbnMgZm9yIGJsb2NrICovCit9OworCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMjlfcG9ydCh2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDI1NjtpKyspCisgICAgdnAtPm1ldHJpY3MxLndbaV0gPSA2MzsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPndbc3RhcnRpbmdfc3RhdGUgJiAyNTVdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKwordm9pZCBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWxfcG9ydChpbnQgcG9seXNbMl0peworICBpbnQgc3RhdGU7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCAxMjg7c3RhdGUrKyl7CisgICAgQnJhbmNodGFiMjlbMF0uY1tzdGF0ZV0gPSAocG9seXNbMF0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMF0pKSA/IDI1NSA6IDA7CisgICAgQnJhbmNodGFiMjlbMV0uY1tzdGF0ZV0gPSAocG9seXNbMV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkyOV9wb3J0KGludCBsZW4peworICBzdHJ1Y3QgdjI5ICp2cDsKKworICBpZighSW5pdCl7CisgICAgaW50IHBvbHlzWzJdID0ge1YyOVBPTFlBLFYyOVBPTFlCfTsKKyAgICBzZXRfdml0ZXJiaTI5X3BvbHlub21pYWxfcG9ydChwb2x5cyk7CisgIH0KKyAgaWYoKHZwID0gKHN0cnVjdCB2MjkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2MjkpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZigodnAtPmRlY2lzaW9ucyA9IChkZWNpc2lvbl90ICopbWFsbG9jKChsZW4rOCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5pdF92aXRlcmJpMjlfcG9ydCh2cCwwKTsKKworICByZXR1cm4gdnA7Cit9CisKKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X3BvcnQoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGQgPSB2cC0+ZGVjaXNpb25zOworICAvKiBNYWtlIHJvb20gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGVuY29kZXIgcmVnaXN0ZXIgc28gd2UgY2FuCisgICAqIGFjY3VtdWxhdGUgYSBmdWxsIGJ5dGUgb2YgZGVjb2RlZCBkYXRhCisgICAqLworICBlbmRzdGF0ZSAlPSAyNTY7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKyAgICAKKyAgICBrID0gKGRbbmJpdHNdLndbKGVuZHN0YXRlKS8zMl0gPj4gKGVuZHN0YXRlJTMyKSkgJiAxOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGUgPSAoZW5kc3RhdGUgPj4gMSkgfCAoayA8PCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkyOV9wb3J0KHZvaWQgKnApeworICBzdHJ1Y3QgdjI5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisvKiBDLWxhbmd1YWdlIGJ1dHRlcmZseSAqLworI2RlZmluZSBCRkxZKGkpIHtcCit1bnNpZ25lZCBpbnQgbWV0cmljLG0wLG0xLGRlY2lzaW9uO1wKKyAgICBtZXRyaWMgPSAoQnJhbmNodGFiMjlbMF0uY1tpXSBeIHN5bTApICsgKEJyYW5jaHRhYjI5WzFdLmNbaV0gXiBzeW0xKTtcCisgICAgbTAgPSB2cC0+b2xkX21ldHJpY3MtPndbaV0gKyBtZXRyaWM7XAorICAgIG0xID0gdnAtPm9sZF9tZXRyaWNzLT53W2krMTI4XSArICg1MTAgLSBtZXRyaWMpO1wKKyAgICBkZWNpc2lvbiA9IChzaWduZWQgaW50KShtMC1tMSkgPiAwO1wKKyAgICB2cC0+bmV3X21ldHJpY3MtPndbMippXSA9IGRlY2lzaW9uID8gbTEgOiBtMDtcCisgICAgZC0+d1tpLzE2XSB8PSBkZWNpc2lvbiA8PCAoKDIqaSkmMzEpO1wKKyAgICBtMCAtPSAobWV0cmljK21ldHJpYy01MTApO1wKKyAgICBtMSArPSAobWV0cmljK21ldHJpYy01MTApO1wKKyAgICBkZWNpc2lvbiA9IChzaWduZWQgaW50KShtMC1tMSkgPiAwO1wKKyAgICB2cC0+bmV3X21ldHJpY3MtPndbMippKzFdID0gZGVjaXNpb24gPyBtMSA6IG0wO1wKKyAgICBkLT53W2kvMTZdIHw9IGRlY2lzaW9uIDw8ICgoMippKzEpJjMxKTtcCit9CisKKy8qIFVwZGF0ZSBkZWNvZGVyIHdpdGggYSBibG9jayBvZiBkZW1vZHVsYXRlZCBzeW1ib2xzCisgKiBOb3RlIHRoYXQgbmJpdHMgaXMgdGhlIG51bWJlciBvZiBkZWNvZGVkIGRhdGEgYml0cywgbm90IHRoZSBudW1iZXIKKyAqIG9mIHN5bWJvbHMhCisgKi8KKworaW50IHVwZGF0ZV92aXRlcmJpMjlfYmxrX3BvcnQodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MjkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICAKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworICB3aGlsZShuYml0cy0tKXsKKyAgICB2b2lkICp0bXA7CisgICAgdW5zaWduZWQgY2hhciBzeW0wLHN5bTE7CisgICAgaW50IGk7CisKKyAgICBmb3IoaT0wO2k8ODtpKyspCisgICAgICBkLT53W2ldID0gMDsKKyAgICBzeW0wID0gKnN5bXMrKzsKKyAgICBzeW0xID0gKnN5bXMrKzsKKyAgICAKKyAgICBmb3IoaT0wO2k8MTI4O2krKykKKyAgICAgIEJGTFkoaSk7CisKKyAgICBkKys7CisgICAgdG1wID0gdnAtPm9sZF9tZXRyaWNzOworICAgIHZwLT5vbGRfbWV0cmljcyA9IHZwLT5uZXdfbWV0cmljczsKKyAgICB2cC0+bmV3X21ldHJpY3MgPSB0bXA7CisgIH0gIAorICB2cC0+ZHAgPSBkOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMjlfc3NlLmMgYi9mZWMvdml0ZXJiaTI5X3NzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTJlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTI5X3NzZS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBLPTkgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIGZvciBTU0UKKyAqIENvcHlyaWdodCBGZWIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIHdbMjU2XTsgX19tNjQgdlszMl07fSBtZXRyaWNfdDsKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbOF07IHVuc2lnbmVkIGNoYXIgY1szMl07IF9fbTY0IHZbNF07fSBkZWNpc2lvbl90OworCit1bmlvbiBicmFuY2h0YWIyOSB7IHVuc2lnbmVkIGNoYXIgY1sxMjhdOyB9IEJyYW5jaHRhYjI5X3NzZVsyXTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlcgorICogRG9uJ3QgY2hhbmdlIHRoaXMgd2l0aG91dCBhbHNvIGNoYW5naW5nIHJlZmVyZW5jZXMgaW4gW21teHxzc2V8c3NlMl1iZmx5MjkucyEKKyAqLworc3RydWN0IHYyOSB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgZGVjaXNpb25fdCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIGRlY2lzaW9uX3QgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI5X3NzZShpbnQgbGVuKXsKKyAgc3RydWN0IHYyOSAqdnA7CisKKyAgaWYoIUluaXQpeworICAgIGludCBwb2x5c1syXSA9IHsgVjI5UE9MWUEsVjI5UE9MWUIgfTsKKworICAgIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9zc2UocG9seXMpOworICB9CisgIGlmKCh2cCA9IChzdHJ1Y3QgdjI5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjI5KSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmKCh2cC0+ZGVjaXNpb25zID0gKGRlY2lzaW9uX3QgKiltYWxsb2MoKGxlbis4KSpzaXplb2YoZGVjaXNpb25fdCkpKSA9PSBOVUxMKXsKKyAgICBmcmVlKHZwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbml0X3ZpdGVyYmkyOSh2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpMjlfcG9seW5vbWlhbF9zc2UoaW50IHBvbHlzWzJdKXsKKyAgaW50IHN0YXRlOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgMTI4O3N0YXRlKyspeworICAgIEJyYW5jaHRhYjI5X3NzZVswXS5jW3N0YXRlXSA9IChwb2x5c1swXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1swXSkpID8gMjU1IDogMDsKKyAgICBCcmFuY2h0YWIyOV9zc2VbMV0uY1tzdGF0ZV0gPSAocG9seXNbMV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMjlfc3NlKHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYyOSAqdnAgPSBwOworICBpbnQgaTsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBmb3IoaT0wO2k8MjU2O2krKykKKyAgICB2cC0+bWV0cmljczEud1tpXSA9IDIwMDsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPndbc3RhcnRpbmdfc3RhdGUgJiAyNTVdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTI5X3NzZSgKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKyAgc3RydWN0IHYyOSAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSB2cC0+ZGVjaXNpb25zOworICAvKiBNYWtlIHJvb20gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGVuY29kZXIgcmVnaXN0ZXIgc28gd2UgY2FuCisgICAqIGFjY3VtdWxhdGUgYSBmdWxsIGJ5dGUgb2YgZGVjb2RlZCBkYXRhCisgICAqLworICBlbmRzdGF0ZSAlPSAyNTY7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKyAgICAKKyAgICBrID0gKGRbbmJpdHNdLmNbZW5kc3RhdGUvOF0gPj4gKGVuZHN0YXRlJTgpKSAmIDE7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZSA9IChlbmRzdGF0ZSA+PiAxKSB8IChrIDw8IDcpOworICB9CisgIHJldHVybiAwOworfQorCisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTI5X3NzZSh2b2lkICpwKXsKKyAgc3RydWN0IHYyOSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMjlfc3NlMi5jIGIvZmVjL3ZpdGVyYmkyOV9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3MzM2YwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpMjlfc3NlMi5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiBLPTkgcj0xLzIgVml0ZXJiaSBkZWNvZGVyIGZvciBTU0UyCisgKiBDb3B5cmlnaHQgRmViIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgImZlYy5oIgorCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBjWzI1Nl07IF9fbTEyOGkgdlsxNl07fSBtZXRyaWNfdDsKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbOF07IHVuc2lnbmVkIGNoYXIgY1szMl07fSBkZWNpc2lvbl90OworCit1bmlvbiBicmFuY2h0YWIyOSB7IHVuc2lnbmVkIGNoYXIgY1sxMjhdOyB9IEJyYW5jaHRhYjI5X3NzZTJbMl07CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIKKyAqIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgYWxzbyBjaGFuZ2luZyByZWZlcmVuY2VzIGluIHNzZTJiZmx5MjkucyEKKyAqLworc3RydWN0IHYyOSB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgZGVjaXNpb25fdCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIGRlY2lzaW9uX3QgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTI5X3NzZTIodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICBzdHJ1Y3QgdjI5ICp2cCA9IHA7CisgIGludCBpOworCisgIGZvcihpPTA7aTwyNTY7aSsrKQorICAgIHZwLT5tZXRyaWNzMS5jW2ldID0gNjM7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5jW3N0YXJ0aW5nX3N0YXRlICYgMjU1XSA9IDA7IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsX3NzZTIoaW50IHBvbHlzWzJdKXsKKyAgaW50IHN0YXRlOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgMTI4O3N0YXRlKyspeworICAgIEJyYW5jaHRhYjI5X3NzZTJbMF0uY1tzdGF0ZV0gPSAocG9seXNbMF0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbMF0pKSA/IDI1NSA6IDA7CisgICAgQnJhbmNodGFiMjlfc3NlMlsxXS5jW3N0YXRlXSA9IChwb2x5c1sxXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1sxXSkpID8gMjU1IDogMDsKKyAgfQorICBJbml0Kys7Cit9CisKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTI5X3NzZTIoaW50IGxlbil7CisgIHZvaWQgKnA7CisgIHN0cnVjdCB2MjkgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbMl0gPSB7VjI5UE9MWUEsVjI5UE9MWUJ9OworCisgICAgc2V0X3ZpdGVyYmkyOV9wb2x5bm9taWFsKHBvbHlzKTsKKyAgfQorICAvKiBPcmRpbmFyeSBtYWxsb2MoKSBvbmx5IHJldHVybnMgOC1ieXRlIGFsaWdubWVudCwgd2UgbmVlZCAxNiAqLworICBpZihwb3NpeF9tZW1hbGlnbigmcCwgc2l6ZW9mKF9fbTEyOGkpLHNpemVvZihzdHJ1Y3QgdjI5KSkpCisgICAgcmV0dXJuIE5VTEw7CisgIHZwID0gKHN0cnVjdCB2MjkgKilwOworICBpZigocCA9IG1hbGxvYygobGVuKzgpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZwLT5kZWNpc2lvbnMgPSAoZGVjaXNpb25fdCAqKXA7CisgIGluaXRfdml0ZXJiaTI5X3NzZTIodnAsMCk7CisgIHJldHVybiB2cDsKK30KKworCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMjlfc3NlMigKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKyAgc3RydWN0IHYyOSAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGQgPSB2cC0+ZGVjaXNpb25zOworCisgIC8qIE1ha2Ugcm9vbSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZW5jb2RlciByZWdpc3RlciBzbyB3ZSBjYW4KKyAgICogYWNjdW11bGF0ZSBhIGZ1bGwgYnl0ZSBvZiBkZWNvZGVkIGRhdGEKKyAgICovCisgIGVuZHN0YXRlICU9IDI1NjsKKworICAvKiBUaGUgc3RvcmUgaW50byBkYXRhW10gb25seSBuZWVkcyB0byBiZSBkb25lIGV2ZXJ5IDggYml0cy4KKyAgICogQnV0IHRoaXMgYXZvaWRzIGEgY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgdGhlIHdyaXRlcyB3aWxsCisgICAqIGNvbWJpbmUgaW4gdGhlIGNhY2hlIGFueXdheQorICAgKi8KKyAgZCArPSA4OyAvKiBMb29rIHBhc3QgdGFpbCAqLworICB3aGlsZShuYml0cy0tICE9IDApeworICAgIGludCBrOworICAgIAorICAgIGsgPSAoZFtuYml0c10uY1tlbmRzdGF0ZS84XSA+PiAoZW5kc3RhdGUlOCkpICYgMTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID0gKGVuZHN0YXRlID4+IDEpIHwgKGsgPDwgNyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMjlfc3NlMih2b2lkICpwKXsKKyAgc3RydWN0IHYyOSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMzkuYyBiL2ZlYy92aXRlcmJpMzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI4YzJjCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkzOS5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiBTd2l0Y2ggdG8gSz05IHI9MS8zIFZpdGVyYmkgZGVjb2RlciB3aXRoIG9wdGlvbmFsIEludGVsIG9yIFBvd2VyUEMgU0lNRAorICogQ29weXJpZ2h0IEF1ZyAyMDA2LCBQaGlsIEthcm4sIEtBOVEKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSAiZmVjLmgiCisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOShpbnQgbGVuKXsKKyAgZmluZF9jcHVfbW9kZSgpOworCisgIHN3aXRjaChDcHVfbW9kZSl7CisgIGNhc2UgUE9SVDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmkzOV9wb3J0KGxlbik7CisjaWZkZWYgX19WRUNfXworICBjYXNlIEFMVElWRUM6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpMzlfYXYobGVuKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgIGNhc2UgTU1YOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTM5X21teChsZW4pOworICBjYXNlIFNTRToKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmkzOV9zc2UobGVuKTsKKyAgY2FzZSBTU0UyOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTM5X3NzZTIobGVuKTsKKyNlbmRpZgorICB9Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsKGludCBwb2x5c1szXSl7CisgIHN3aXRjaChDcHVfbW9kZSl7CisgIGNhc2UgUE9SVDoKKyAgZGVmYXVsdDoKKyAgICBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfcG9ydChwb2x5cyk7CisgICAgYnJlYWs7CisjaWZkZWYgX19WRUNfXworICBjYXNlIEFMVElWRUM6CisgICAgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsX2F2KHBvbHlzKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgIGNhc2UgTU1YOgorICAgIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9tbXgocG9seXMpOworICAgIGJyZWFrOworICBjYXNlIFNTRToKKyAgICBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfc3NlKHBvbHlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBTU0UyOgorICAgIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UyKHBvbHlzKTsKKyAgICBicmVhazsKKyNlbmRpZgorICB9Cit9CisKKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTM5KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTM5X3BvcnQocCxzdGFydGluZ19zdGF0ZSk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiBpbml0X3ZpdGVyYmkzOV9hdihwLHN0YXJ0aW5nX3N0YXRlKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMzlfbW14KHAsc3RhcnRpbmdfc3RhdGUpOworICAgIGNhc2UgU1NFOgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTM5X3NzZShwLHN0YXJ0aW5nX3N0YXRlKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpMzlfc3NlMihwLHN0YXJ0aW5nX3N0YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTM5KAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworCisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTM5X3BvcnQocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNpZmRlZiBfX1ZFQ19fCisgICAgY2FzZSBBTFRJVkVDOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpMzlfYXYocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICByZXR1cm4gY2hhaW5iYWNrX3ZpdGVyYmkzOV9tbXgocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyAgICBjYXNlIFNTRToKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTM5X3NzZShwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworICAgIGNhc2UgU1NFMjoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTM5X3NzZTIocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMzkodm9pZCAqcCl7CisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGRlbGV0ZV92aXRlcmJpMzlfcG9ydChwKTsKKyAgICAgIGJyZWFrOworI2lmZGVmIF9fVkVDX18KKyAgICBjYXNlIEFMVElWRUM6CisgICAgICBkZWxldGVfdml0ZXJiaTM5X2F2KHApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICAgIGNhc2UgTU1YOgorICAgICAgZGVsZXRlX3ZpdGVyYmkzOV9tbXgocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNTRToKKyAgICAgIGRlbGV0ZV92aXRlcmJpMzlfc3NlKHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0UyOgorICAgICAgZGVsZXRlX3ZpdGVyYmkzOV9zc2UyKHApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIFVwZGF0ZSBkZWNvZGVyIHdpdGggYSBibG9jayBvZiBkZW1vZHVsYXRlZCBzeW1ib2xzCisgKiBOb3RlIHRoYXQgbmJpdHMgaXMgdGhlIG51bWJlciBvZiBkZWNvZGVkIGRhdGEgYml0cywgbm90IHRoZSBudW1iZXIKKyAqIG9mIHN5bWJvbHMhCisgKi8KK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsayh2b2lkICpwLHVuc2lnbmVkIGNoYXIgc3ltc1tdLGludCBuYml0cyl7CisgICAgc3dpdGNoKENwdV9tb2RlKXsKKyAgICBjYXNlIFBPUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTM5X2Jsa19wb3J0KHAsc3ltcyxuYml0cyk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTM5X2Jsa19hdihwLHN5bXMsbmJpdHMpOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgICBjYXNlIE1NWDoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTM5X2Jsa19tbXgocCxzeW1zLG5iaXRzKTsKKyAgICBjYXNlIFNTRToKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTM5X2Jsa19zc2UocCxzeW1zLG5iaXRzKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gdXBkYXRlX3ZpdGVyYmkzOV9ibGtfc3NlMihwLHN5bXMsbmJpdHMpOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkzOV9hdi5jIGIvZmVjL3ZpdGVyYmkzOV9hdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTM5X2F2LmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qIEs9OSByPTEvMyBWaXRlcmJpIGRlY29kZXIgZm9yIFBvd2VyUEMgRzQvRzUgQWx0aXZlYyB2ZWN0b3IgaW5zdHJ1Y3Rpb25zCisgKiA4LWJpdCBvZmZzZXQtYmluYXJ5IHNvZnQgZGVjaXNpb24gc2FtcGxlcworICogQ29weXJpZ2h0IEF1ZyAyMDA2LCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgY1syXVsxNl07IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZbMl07IH0gZGVjaXNpb25fdDsKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBzaG9ydCBzWzI1Nl07IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2WzMyXTsgfSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjM5IHsgdW5zaWduZWQgc2hvcnQgc1sxMjhdOyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdlsxNl07fSBCcmFuY2h0YWIzOVszXTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlciAqLworc3RydWN0IHYzOSB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgdm9pZCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIHZvaWQgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTM5X2F2KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYzOSAqdnAgPSBwOworICBpbnQgaTsKKworICBmb3IoaT0wO2k8MzI7aSsrKQorICAgIHZwLT5tZXRyaWNzMS52W2ldID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoMTAwMCk7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5zW3N0YXJ0aW5nX3N0YXRlICYgMjU1XSA9IDA7IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsX2F2KGludCBwb2x5c1szXSl7CisgIGludCBzdGF0ZTsKKworICBmb3Ioc3RhdGU9MDtzdGF0ZSA8IDEyODtzdGF0ZSsrKXsKKyAgICBCcmFuY2h0YWIzOVswXS5zW3N0YXRlXSA9IChwb2x5c1swXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1swXSkpID8gMjU1IDogMDsKKyAgICBCcmFuY2h0YWIzOVsxXS5zW3N0YXRlXSA9IChwb2x5c1sxXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1sxXSkpID8gMjU1IDogMDsKKyAgICBCcmFuY2h0YWIzOVsyXS5zW3N0YXRlXSA9IChwb2x5c1syXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1syXSkpID8gMjU1IDogMDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9hdihpbnQgbGVuKXsKKyAgc3RydWN0IHYzOSAqdnA7CisKKyAgaWYoIUluaXQpeworICAgIGludCBwb2x5c1szXSA9IHsgVjM5UE9MWUEsIFYzOVBPTFlCLCBWMzlQT0xZQyB9OworCisgICAgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsX2F2KHBvbHlzKTsKKyAgfQorICB2cCA9IChzdHJ1Y3QgdjM5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjM5KSk7CisgIHZwLT5kZWNpc2lvbnMgPSBtYWxsb2Moc2l6ZW9mKGRlY2lzaW9uX3QpKihsZW4rOCkpOworICBpbml0X3ZpdGVyYmkzOV9hdih2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMzlfYXYoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZCA9IChkZWNpc2lvbl90ICopdnAtPmRlY2lzaW9uczsKKyAgaW50IHBhdGhfbWV0cmljOworCisgIC8qIE1ha2Ugcm9vbSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZW5jb2RlciByZWdpc3RlciBzbyB3ZSBjYW4KKyAgICogYWNjdW11bGF0ZSBhIGZ1bGwgYnl0ZSBvZiBkZWNvZGVkIGRhdGEKKyAgICovCisgIGVuZHN0YXRlICU9IDI1NjsKKworICBwYXRoX21ldHJpYyA9IHZwLT5vbGRfbWV0cmljcy0+c1tlbmRzdGF0ZV07CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKyAgICAKKyAgICBrID0gKGRbbmJpdHNdLmNbZW5kc3RhdGUgPj4gN11bZW5kc3RhdGUgJiAxNV0gJiAoMHg4MCA+PiAoKGVuZHN0YXRlPj40KSY3KSkgKSA/IDEgOiAwOworICAgIGVuZHN0YXRlID0gKGsgPDwgNykgfCAoZW5kc3RhdGUgPj4gMSk7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZTsKKyAgfQorICByZXR1cm4gcGF0aF9tZXRyaWM7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTM5X2F2KHZvaWQgKnApeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCitpbnQgdXBkYXRlX3ZpdGVyYmkzOV9ibGtfYXYodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworICBpbnQgcGF0aF9tZXRyaWMgPSAwOworICB2ZWN0b3IgdW5zaWduZWQgY2hhciBkZWNpc2lvbnMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDApOworCisgIHdoaWxlKG5iaXRzLS0peworICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBzeW12LHN5bTB2LHN5bTF2LHN5bTJ2OworICAgIHZlY3RvciB1bnNpZ25lZCBjaGFyIHM7CisgICAgdm9pZCAqdG1wOworICAgIGludCBpOworICAgIAorICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzID0gKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wZXJtKHZlY19sZCgwLHN5bXMpLHZlY19sZCg1LHN5bXMpLHZlY19sdnNsKDAsc3ltcykpOworCisgICAgc3ltdiA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdmVjX21lcmdlaCgodmVjdG9yIHVuc2lnbmVkIGNoYXIpKDApLHMpOyAgICAvKiBVbnNpZ25lZCBieXRlLT53b3JkIHVucGFjayAqLyAKKyAgICBzeW0wdiA9IHZlY19zcGxhdChzeW12LDApOworICAgIHN5bTF2ID0gdmVjX3NwbGF0KHN5bXYsMSk7CisgICAgc3ltMnYgPSB2ZWNfc3BsYXQoc3ltdiwyKTsKKyAgICBzeW1zICs9IDM7CisgICAgCisgICAgZm9yKGk9MDtpPDE2O2krKyl7CisgICAgICB2ZWN0b3IgYm9vbCBzaG9ydCBkZWNpc2lvbjAsZGVjaXNpb24xOworICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IG1ldHJpYyxtX21ldHJpYyxtMCxtMSxtMixtMyxzdXJ2aXZvcjAsc3Vydml2b3IxOworCisgICAgICAvKiBGb3JtIGJyYW5jaCBtZXRyaWNzCisgICAgICAgKiBCZWNhdXNlIEJyYW5jaHRhYiB0YWtlcyBvbiB2YWx1ZXMgMCBhbmQgMjU1LCBhbmQgdGhlIHZhbHVlcyBvZiBzeW0/diBhcmUgb2Zmc2V0IGJpbmFyeSBpbiB0aGUgcmFuZ2UgMC0yNTUsCisgICAgICAgKiB0aGUgWE9SIG9wZXJhdGlvbnMgY29uc3RpdHV0ZSBjb25kaXRpb25hbCBuZWdhdGlvbi4KKyAgICAgICAqIHRoZSBtZXRyaWNzIGFyZSBpbiB0aGUgcmFuZ2UgMC03NjUKKyAgICAgICAqLworICAgICAgbTAgPSB2ZWNfYWRkKHZlY194b3IoQnJhbmNodGFiMzlbMF0udltpXSxzeW0wdiksdmVjX3hvcihCcmFuY2h0YWIzOVsxXS52W2ldLHN5bTF2KSk7CisgICAgICBtMSA9IHZlY194b3IoQnJhbmNodGFiMzlbMl0udltpXSxzeW0ydik7CisgICAgICBtZXRyaWMgPSB2ZWNfYWRkKG0wLG0xKTsKKyAgICAgIG1fbWV0cmljID0gdmVjX3N1YigodmVjdG9yIHVuc2lnbmVkIHNob3J0KSg3NjUpLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IHZlY19hZGRzKHZwLT5vbGRfbWV0cmljcy0+dltpXSxtZXRyaWMpOworICAgICAgbTMgPSB2ZWNfYWRkcyh2cC0+b2xkX21ldHJpY3MtPnZbMTYraV0sbWV0cmljKTsKKyAgICAgIG0xID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzE2K2ldLG1fbWV0cmljKTsKKyAgICAgIG0yID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52W2ldLG1fbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdCAqLworICAgICAgZGVjaXNpb24wID0gdmVjX2NtcGd0KG0wLG0xKTsKKyAgICAgIGRlY2lzaW9uMSA9IHZlY19jbXBndChtMixtMyk7CisgICAgICBzdXJ2aXZvcjAgPSB2ZWNfbWluKG0wLG0xKTsKKyAgICAgIHN1cnZpdm9yMSA9IHZlY19taW4obTIsbTMpOworICAgIAorICAgICAgLyogU3RvcmUgZGVjaXNpb25zIGFuZCBzdXJ2aXZvcnMuCisgICAgICAgKiBUbyBzYXZlIHNwYWNlIHdpdGhvdXQgU1NFMidzIGhhbmR5IFBNT1ZNU0tCIGluc3RydWN0aW9uLCB3ZSBwYWNrIGFuZCBzdG9yZSB0aGVtIGluCisgICAgICAgKiBhIGZ1bm55IGludGVybGVhdmVkIGZhc2hpb24gdGhhdCB3ZSB1bmRvIGluIHRoZSBjaGFpbmJhY2sgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGRlY2lzaW9ucyA9IHZlY19hZGQoZGVjaXNpb25zLGRlY2lzaW9ucyk7IC8qIFNoaWZ0IGVhY2ggYnl0ZSAxIGJpdCB0byB0aGUgbGVmdCAqLworCisgICAgICAvKiBCb29sZWFucyBhcmUgZWl0aGVyIDB4ZmYgb3IgMHgwMC4gU3VidHJhY3RpbmcgMHgwMCBsZWF2ZXMgdGhlIGxzYiB6ZXJvOyBzdWJ0cmFjdGluZworICAgICAgICogMHhmZiBpcyBlcXVpdmFsZW50IHRvIGFkZGluZyAxLCB3aGljaCBzZXRzIHRoZSBsc2IuCisgICAgICAgKi8KKyAgICAgIGRlY2lzaW9ucyA9IHZlY19zdWIoZGVjaXNpb25zLCh2ZWN0b3IgdW5zaWduZWQgY2hhcil2ZWNfcGFjayh2ZWNfbWVyZ2VoKGRlY2lzaW9uMCxkZWNpc2lvbjEpLHZlY19tZXJnZWwoZGVjaXNpb24wLGRlY2lzaW9uMSkpKTsKKworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaV0gPSB2ZWNfbWVyZ2VoKHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaSsxXSA9IHZlY19tZXJnZWwoc3Vydml2b3IwLHN1cnZpdm9yMSk7CisKKyAgICAgIGlmKChpICUgOCkgPT0gNyl7CisJLyogV2UndmUgYWNjdW11bGF0ZWQgYSB0b3RhbCBvZiAxMjggZGVjaXNpb25zLCBzdGFzaCBhbmQgc3RhcnQgYWdhaW4gKi8KKwlkLT52W2k+PjNdID0gZGVjaXNpb25zOyAvKiBObyBuZWVkIHRvIGNsZWFyLCB0aGUgbmV3IGJpdHMgd2lsbCByZXBsYWNlIHRoZSBvbGQgKi8KKyAgICAgIH0KKyAgICB9CisjaWYgMAorICAgIC8qIEV4cGVyaW1lbnRhbGx5IGRldGVybWluZSBtZXRyaWMgc3ByZWFkCisgICAgICogVGhlIHJlc3VsdHMgYXJlIGZpeGVkIGZvciBhIGdpdmVuIGNvZGUgYW5kIGlucHV0IHN5bWJvbCBzaXplCisgICAgICovCisgICAgeworICAgICAgaW50IGk7CisgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgbWluX21ldHJpYzsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBtYXhfbWV0cmljOworICAgICAgdW5pb24geyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdjsgdW5zaWduZWQgc2hvcnQgc1s4XTt9IHQ7CisgICAgICBpbnQgbWluaW11bSxtYXhpbXVtOworICAgICAgc3RhdGljIGludCBtYXhfc3ByZWFkID0gMDsKKworICAgICAgbWluX21ldHJpYyA9IG1heF9tZXRyaWMgPSB2cC0+bmV3X21ldHJpY3MtPnZbMF07CisgICAgICBmb3IoaT0xO2k8MzI7aSsrKXsKKwltaW5fbWV0cmljID0gdmVjX21pbihtaW5fbWV0cmljLHZwLT5uZXdfbWV0cmljcy0+dltpXSk7CisJbWF4X21ldHJpYyA9IHZlY19tYXgobWF4X21ldHJpYyx2cC0+bmV3X21ldHJpY3MtPnZbaV0pOworICAgICAgfQorICAgICAgbWluX21ldHJpYyA9IHZlY19taW4obWluX21ldHJpYyx2ZWNfc2xkKG1pbl9tZXRyaWMsbWluX21ldHJpYyw4KSk7CisgICAgICBtYXhfbWV0cmljID0gdmVjX21heChtYXhfbWV0cmljLHZlY19zbGQobWF4X21ldHJpYyxtYXhfbWV0cmljLDgpKTsKKyAgICAgIG1pbl9tZXRyaWMgPSB2ZWNfbWluKG1pbl9tZXRyaWMsdmVjX3NsZChtaW5fbWV0cmljLG1pbl9tZXRyaWMsNCkpOworICAgICAgbWF4X21ldHJpYyA9IHZlY19tYXgobWF4X21ldHJpYyx2ZWNfc2xkKG1heF9tZXRyaWMsbWF4X21ldHJpYyw0KSk7CisgICAgICBtaW5fbWV0cmljID0gdmVjX21pbihtaW5fbWV0cmljLHZlY19zbGQobWluX21ldHJpYyxtaW5fbWV0cmljLDIpKTsKKyAgICAgIG1heF9tZXRyaWMgPSB2ZWNfbWF4KG1heF9tZXRyaWMsdmVjX3NsZChtYXhfbWV0cmljLG1heF9tZXRyaWMsMikpOworCisgICAgICB0LnYgPSBtaW5fbWV0cmljOworICAgICAgbWluaW11bSA9IHQuc1swXTsKKyAgICAgIHQudiA9IG1heF9tZXRyaWM7CisgICAgICBtYXhpbXVtID0gdC5zWzBdOworICAgICAgaWYobWF4aW11bS1taW5pbXVtID4gbWF4X3NwcmVhZCl7CisJbWF4X3NwcmVhZCA9IG1heGltdW0tbWluaW11bTsKKwlwcmludGYoIm1ldHJpYyBzcHJlYWQgPSAlZFxuIixtYXhfc3ByZWFkKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFJlbm9ybWFsaXplIGlmIG5lY2Vzc2FyeS4gVGhpcyBkZXNlcnZlcyBzb21lIGV4cGxhbmF0aW9uLgorICAgICAqIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHNwcmVhZCwgZm91bmQgYnkgZXhwZXJpbWVudCwgZm9yIDggYml0IHN5bWJvbHMgaXMgYWJvdXQgMzgyNQorICAgICAqIFNvIGJ5IGxvb2tpbmcgYXQgb25lIGFyYml0cmFyeSBtZXRyaWMgd2UgY2FuIHRlbGwgaWYgYW55IG9mIHRoZW0gaGF2ZSBwb3NzaWJseSBzYXR1cmF0ZWQuCisgICAgICogSG93ZXZlciwgdGhpcyBpcyB2ZXJ5IGNvbnNlcnZhdGl2ZS4gTGFyZ2Ugc3ByZWFkcyBvY2N1ciBvbmx5IGF0IHZlcnkgaGlnaCBFYi9Obywgd2hlcmUKKyAgICAgKiBzYXR1cmF0aW5nIGEgYmFkIHBhdGggbWV0cmljIGRvZXNuJ3QgZG8gbXVjaCB0byBpbmNyZWFzZSBpdHMgY2hhbmNlcyBvZiBiZWluZyBlcnJvbmVvdXNseSBjaG9zZW4gYXMgYSBzdXJ2aXZvci4KKworICAgICAqIEF0IG1vcmUgaW50ZXJlc3RpbmcgKGxvdykgRWIvTm8gcmF0aW9zLCB0aGUgc3ByZWFkcyBhcmUgbXVjaCBzbWFsbGVyIHNvIG91ciBjaGFuY2VzIG9mIHNhdHVyYXRpbmcgYSBtZXRyaWMKKyAgICAgKiBieSBub3Qgbm90IG5vcm1hbGl6aW5nIHdoZW4gd2Ugc2hvdWxkIGFyZSBleHRyZW1lbHkgbG93LiBTbyBlaXRoZXIgd2F5LCB0aGUgcmlzayB0byBwZXJmb3JtYW5jZSBpcyBzbWFsbC4KKworICAgICAqIEFsbCB0aGlzIGlzIGJvcm5lIG91dCBieSBleHBlcmltZW50LgorICAgICAqLworICAgIGlmKHZwLT5uZXdfbWV0cmljcy0+c1swXSA+PSBVU0hSVF9NQVgtNTAwMCl7CisgICAgICB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgc2NhbGU7CisgICAgICB1bmlvbiB7IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2OyB1bnNpZ25lZCBzaG9ydCBzWzhdO30gdDsKKyAgICAgIAorICAgICAgLyogRmluZCBzbWFsbGVzdCBtZXRyaWMgYW5kIHNwbGF0ICovCisgICAgICBzY2FsZSA9IHZwLT5uZXdfbWV0cmljcy0+dlswXTsKKyAgICAgIGZvcihpPTE7aTwzMjtpKyspCisJc2NhbGUgPSB2ZWNfbWluKHNjYWxlLHZwLT5uZXdfbWV0cmljcy0+dltpXSk7CisKKyAgICAgIHNjYWxlID0gdmVjX21pbihzY2FsZSx2ZWNfc2xkKHNjYWxlLHNjYWxlLDgpKTsKKyAgICAgIHNjYWxlID0gdmVjX21pbihzY2FsZSx2ZWNfc2xkKHNjYWxlLHNjYWxlLDQpKTsKKyAgICAgIHNjYWxlID0gdmVjX21pbihzY2FsZSx2ZWNfc2xkKHNjYWxlLHNjYWxlLDIpKTsKKworICAgICAgLyogU3VidHJhY3QgaXQgZnJvbSBhbGwgbWV0cmljcworICAgICAgICogV29yayBiYWNrd2FyZHMgdG8gdHJ5IHRvIGltcHJvdmUgdGhlIGNhY2hlIGhpdCByYXRpbywgYXNzdW1pbmcgTFJVCisgICAgICAgKi8KKyAgICAgIGZvcihpPTMxO2k+PTA7aS0tKQorCXZwLT5uZXdfbWV0cmljcy0+dltpXSA9IHZlY19zdWJzKHZwLT5uZXdfbWV0cmljcy0+dltpXSxzY2FsZSk7CisgICAgICB0LnYgPSBzY2FsZTsKKyAgICAgIHBhdGhfbWV0cmljICs9IHQuc1swXTsKKyAgICB9CisgICAgZCsrOworICAgIC8qIFN3YXAgcG9pbnRlcnMgdG8gb2xkIGFuZCBuZXcgbWV0cmljcyAqLworICAgIHRtcCA9IHZwLT5vbGRfbWV0cmljczsKKyAgICB2cC0+b2xkX21ldHJpY3MgPSB2cC0+bmV3X21ldHJpY3M7CisgICAgdnAtPm5ld19tZXRyaWNzID0gdG1wOworICB9CisgIHZwLT5kcCA9IGQ7CisgIHJldHVybiBwYXRoX21ldHJpYzsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpMzlfbW14LmMgYi9mZWMvdml0ZXJiaTM5X21teC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTM5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTM5X21teC5jCkBAIC0wLDAgKzEsMTg1IEBACisvKiBLPTkgcj0xLzMgVml0ZXJiaSBkZWNvZGVyIGZvciB4ODYgTU1YCisgKiBBdWcgMjAwNiwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPG1taW50cmluLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgY1syNTZdOyBfX202NCB2WzMyXTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgc2hvcnQgc1syNTZdOyBfX202NCB2WzY0XTt9IG1ldHJpY190OworCitzdGF0aWMgdW5pb24gYnJhbmNodGFiMzkgeyB1bnNpZ25lZCBzaG9ydCBzWzEyOF07IF9fbTY0IHZbMzJdO30gQnJhbmNodGFiMzlbM107CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIgKi8KK3N0cnVjdCB2MzkgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIHZvaWQgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICB2b2lkICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkzOV9tbXgodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGZvcihpPTA7aTwyNTY7aSsrKQorICAgIHZwLT5tZXRyaWNzMS5zW2ldID0gMTAwMDsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPnNbc3RhcnRpbmdfc3RhdGUgJiAyNTVdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKwordm9pZCBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfbW14KGludCBwb2x5c1szXSl7CisgIGludCBzdGF0ZTsKKworICBmb3Ioc3RhdGU9MDtzdGF0ZSA8IDEyODtzdGF0ZSsrKXsKKyAgICBCcmFuY2h0YWIzOVswXS5zW3N0YXRlXSA9IChwb2x5c1swXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIHBvbHlzWzBdKSA/IDI1NTowOworICAgIEJyYW5jaHRhYjM5WzFdLnNbc3RhdGVdID0gKHBvbHlzWzFdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgcG9seXNbMV0pID8gMjU1OjA7CisgICAgQnJhbmNodGFiMzlbMl0uc1tzdGF0ZV0gPSAocG9seXNbMl0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBwb2x5c1syXSkgPyAyNTU6MDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9tbXgoaW50IGxlbil7CisgIHN0cnVjdCB2MzkgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbM10gPSB7IFYzOVBPTFlBLFYzOVBPTFlCLFYzOVBPTFlDIH07CisgICAgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsX21teChwb2x5cyk7CisgIH0KKyAgaWYoKHZwID0gKHN0cnVjdCB2MzkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2MzkpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSBtYWxsb2MoKGxlbis4KSpzaXplb2YoZGVjaXNpb25fdCkpKSA9PSBOVUxMKXsKKyAgICBmcmVlKHZwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbml0X3ZpdGVyYmkzOV9tbXgodnAsMCk7CisgIHJldHVybiB2cDsKK30KKworCisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkzOV9tbXgoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKyAgaW50IHBhdGhfbWV0cmljOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRlY2lzaW9uczsKKyAgCisgIGVuZHN0YXRlICU9IDI1NjsKKworICBwYXRoX21ldHJpYyA9IHZwLT5vbGRfbWV0cmljcy0+c1tlbmRzdGF0ZV07CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKworICAgIGsgPSBkW25iaXRzXS5jW2VuZHN0YXRlXSAmIDE7CisgICAgZW5kc3RhdGUgPSAoayA8PCA3KSB8IChlbmRzdGF0ZSA+PiAxKTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlOworICB9CisgIHJldHVybiBwYXRoX21ldHJpYzsKK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMzlfbW14KHZvaWQgKnApeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisKK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsa19tbXgodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKyAgaW50IHBhdGhfbWV0cmljID0gMDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGQgPSAoZGVjaXNpb25fdCAqKXZwLT5kcDsKKyAgCisgIHdoaWxlKG5iaXRzLS0peworICAgIF9fbTY0IHN5bTB2LHN5bTF2LHN5bTJ2OworICAgIHZvaWQgKnRtcDsKKyAgICBpbnQgaTsKKyAgICAKKyAgICAvKiBTcGxhdCB0aGUgMHRoIHN5bWJvbCBhY3Jvc3Mgc3ltMHYsIHRoZSAxc3Qgc3ltYm9sIGFjcm9zcyBzeW0xdiwgZXRjICovCisgICAgc3ltMHYgPSBfbW1fc2V0MV9waTE2KHN5bXNbMF0pOworICAgIHN5bTF2ID0gX21tX3NldDFfcGkxNihzeW1zWzFdKTsKKyAgICBzeW0ydiA9IF9tbV9zZXQxX3BpMTYoc3ltc1syXSk7CisgICAgc3ltcyArPSAzOworCisgICAgZm9yKGk9MDtpPDMyO2krKyl7CisgICAgICBfX202NCBkZWNpc2lvbjAsZGVjaXNpb24xLG1ldHJpYyxtX21ldHJpYyxtMCxtMSxtMixtMyxzdXJ2aXZvcjAsc3Vydml2b3IxOworCisgICAgICAvKiBGb3JtIGJyYW5jaCBtZXRyaWNzCisgICAgICAgKiBCZWNhdXNlIEJyYW5jaHRhYiB0YWtlcyBvbiB2YWx1ZXMgMCBhbmQgMjU1LCBhbmQgdGhlIHZhbHVlcyBvZiBzeW0/diBhcmUgb2Zmc2V0IGJpbmFyeSBpbiB0aGUgcmFuZ2UgMC0yNTUsCisgICAgICAgKiB0aGUgWE9SIG9wZXJhdGlvbnMgY29uc3RpdHV0ZSBjb25kaXRpb25hbCBuZWdhdGlvbi4KKyAgICAgICAqIG1ldHJpYyBhbmQgbV9tZXRyaWMgKC1tZXRyaWMpIGFyZSBpbiB0aGUgcmFuZ2UgMC0xNTMwCisgICAgICAgKi8KKyAgICAgIG0wID0gX21tX2FkZF9waTE2KF9tbV94b3Jfc2k2NChCcmFuY2h0YWIzOVswXS52W2ldLHN5bTB2KSxfbW1feG9yX3NpNjQoQnJhbmNodGFiMzlbMV0udltpXSxzeW0xdikpOworICAgICAgbWV0cmljID0gX21tX2FkZF9waTE2KF9tbV94b3Jfc2k2NChCcmFuY2h0YWIzOVsyXS52W2ldLHN5bTJ2KSxtMCk7CisgICAgICBtX21ldHJpYyA9IF9tbV9zdWJfcGkxNihfbW1fc2V0MV9waTE2KDc2NSksbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIEFkZCBicmFuY2ggbWV0cmljcyB0byBwYXRoIG1ldHJpY3MgKi8KKyAgICAgIG0wID0gX21tX2FkZF9waTE2KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtZXRyaWMpOworICAgICAgbTMgPSBfbW1fYWRkX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52WzMyK2ldLG1ldHJpYyk7CisgICAgICBtMSA9IF9tbV9hZGRfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMzIraV0sbV9tZXRyaWMpOworICAgICAgbTIgPSBfbW1fYWRkX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52W2ldLG1fbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdAorICAgICAgICogVGhlcmUncyBubyBwYWNrZWQgbWluIGluc3RydWN0aW9uIGluIE1NWCwgc28gd2UgdXNlIG1vZHVsbyBhcml0aG1ldGljCisgICAgICAgKiB0byBmb3JtIHRoZSBkZWNpc2lvbnMgYW5kIHRoZW4gZG8gdGhlIHNlbGVjdCB0aGUgaGFyZCB3YXkKKyAgICAgICAqLworICAgICAgZGVjaXNpb24wID0gX21tX2NtcGd0X3BpMTYoX21tX3N1Yl9waTE2KG0wLG0xKSxfbW1fc2V0emVyb19zaTY0KCkpOworICAgICAgZGVjaXNpb24xID0gX21tX2NtcGd0X3BpMTYoX21tX3N1Yl9waTE2KG0yLG0zKSxfbW1fc2V0emVyb19zaTY0KCkpOworICAgICAgc3Vydml2b3IwID0gX21tX29yX3NpNjQoX21tX2FuZF9zaTY0KGRlY2lzaW9uMCxtMSksX21tX2FuZG5vdF9zaTY0KGRlY2lzaW9uMCxtMCkpOworICAgICAgc3Vydml2b3IxID0gX21tX29yX3NpNjQoX21tX2FuZF9zaTY0KGRlY2lzaW9uMSxtMyksX21tX2FuZG5vdF9zaTY0KGRlY2lzaW9uMSxtMikpOworIAorICAgICAgLyogTWVyZ2UgZGVjaXNpb25zIGFuZCBzdG9yZSBhcyBieXRlcyAqLworICAgICAgZC0+dltpXSA9IF9tbV91bnBhY2tsb19waTgoX21tX3BhY2tzX3BpMTYoZGVjaXNpb24wLF9tbV9zZXR6ZXJvX3NpNjQoKSksX21tX3BhY2tzX3BpMTYoZGVjaXNpb24xLF9tbV9zZXR6ZXJvX3NpNjQoKSkpOworCisgICAgICAvKiBTdG9yZSBzdXJ2aXZpbmcgbWV0cmljcyAqLworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaV0gPSBfbW1fdW5wYWNrbG9fcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyKmkrMV0gPSBfbW1fdW5wYWNraGlfcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICB9CisgICAgaWYodnAtPm5ld19tZXRyaWNzLT5zWzBdIDwgdnAtPm9sZF9tZXRyaWNzLT5zWzBdKQorICAgICAgcGF0aF9tZXRyaWMgKz0gNjU1MzY7IC8qIEhhY2s6IHdyYXBhcm91bmQgcHJvYmFibHkgb2NjdXJlZCAqLworICAgIGQrKzsKKyAgICAvKiBTd2FwIHBvaW50ZXJzIHRvIG9sZCBhbmQgbmV3IG1ldHJpY3MgKi8KKyAgICB0bXAgPSB2cC0+b2xkX21ldHJpY3M7CisgICAgdnAtPm9sZF9tZXRyaWNzID0gdnAtPm5ld19tZXRyaWNzOworICAgIHZwLT5uZXdfbWV0cmljcyA9IHRtcDsKKyAgfQorICB2cC0+ZHAgPSBkOworICBfbW1fZW1wdHkoKTsKKyAgcmV0dXJuIHBhdGhfbWV0cmljOworfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmkzOV9wb3J0LmMgYi9mZWMvdml0ZXJiaTM5X3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg1YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkzOV9wb3J0LmMKQEAgLTAsMCArMSwxNjggQEAKKy8qIEs9OSByPTEvMyBWaXRlcmJpIGRlY29kZXIgaW4gcG9ydGFibGUgQworICogQ29weXJpZ2h0IEF1ZyAyMDA2LCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGludCB3WzI1Nl07IH0gbWV0cmljX3Q7Cit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgbG9uZyB3WzhdO30gZGVjaXNpb25fdDsKKworc3RhdGljIHVuaW9uIHsgdW5zaWduZWQgY2hhciBjWzEyOF07IH0gQnJhbmNodGFiMzlbM107CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIgKi8KK3N0cnVjdCB2MzkgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmkzOV9wb3J0KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYzOSAqdnAgPSBwOworICBpbnQgaTsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBmb3IoaT0wO2k8MjU2O2krKykKKyAgICB2cC0+bWV0cmljczEud1tpXSA9IDYzOworCisgIHZwLT5vbGRfbWV0cmljcyA9ICZ2cC0+bWV0cmljczE7CisgIHZwLT5uZXdfbWV0cmljcyA9ICZ2cC0+bWV0cmljczI7CisgIHZwLT5kcCA9IHZwLT5kZWNpc2lvbnM7CisgIHZwLT5vbGRfbWV0cmljcy0+d1tzdGFydGluZ19zdGF0ZSAmIDI1NV0gPSAwOyAvKiBCaWFzIGtub3duIHN0YXJ0IHN0YXRlICovCisgIHJldHVybiAwOworfQorCit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9wb3J0KGludCBwb2x5c1szXSl7CisgIGludCBzdGF0ZTsKKworICBmb3Ioc3RhdGU9MDtzdGF0ZSA8IDEyODtzdGF0ZSsrKXsKKyAgICBCcmFuY2h0YWIzOVswXS5jW3N0YXRlXSA9IChwb2x5c1swXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1swXSkpID8gMjU1IDogMDsKKyAgICBCcmFuY2h0YWIzOVsxXS5jW3N0YXRlXSA9IChwb2x5c1sxXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1sxXSkpID8gMjU1IDogMDsKKyAgICBCcmFuY2h0YWIzOVsyXS5jW3N0YXRlXSA9IChwb2x5c1syXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1syXSkpID8gMjU1IDogMDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9wb3J0KGludCBsZW4peworICBzdHJ1Y3QgdjM5ICp2cDsKKworICBpZighSW5pdCl7CisgICAgaW50IHBvbHlzWzNdID0ge1YzOVBPTFlBLFYzOVBPTFlCLFYzOVBPTFlDfTsKKyAgICBzZXRfdml0ZXJiaTM5X3BvbHlub21pYWxfcG9ydChwb2x5cyk7CisgIH0KKyAgaWYoKHZwID0gKHN0cnVjdCB2MzkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2MzkpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZigodnAtPmRlY2lzaW9ucyA9IChkZWNpc2lvbl90ICopbWFsbG9jKChsZW4rOCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5pdF92aXRlcmJpMzlfcG9ydCh2cCwwKTsKKworICByZXR1cm4gdnA7Cit9CisKKworLyogVml0ZXJiaSBjaGFpbmJhY2sgKi8KK2ludCBjaGFpbmJhY2tfdml0ZXJiaTM5X3BvcnQoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGQgPSB2cC0+ZGVjaXNpb25zOworICAvKiBNYWtlIHJvb20gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGVuY29kZXIgcmVnaXN0ZXIgc28gd2UgY2FuCisgICAqIGFjY3VtdWxhdGUgYSBmdWxsIGJ5dGUgb2YgZGVjb2RlZCBkYXRhCisgICAqLworICBlbmRzdGF0ZSAlPSAyNTY7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKyAgICAKKyAgICBrID0gKGRbbmJpdHNdLndbKGVuZHN0YXRlKS8zMl0gPj4gKGVuZHN0YXRlJTMyKSkgJiAxOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGUgPSAoZW5kc3RhdGUgPj4gMSkgfCAoayA8PCA3KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOV9wb3J0KHZvaWQgKnApeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisvKiBDLWxhbmd1YWdlIGJ1dHRlcmZseSAqLworI2RlZmluZSBCRkxZKGkpIHtcCit1bnNpZ25lZCBpbnQgbWV0cmljLG0wLG0xLGRlY2lzaW9uO1wKKyAgICBtZXRyaWMgPSAoQnJhbmNodGFiMzlbMF0uY1tpXSBeIHN5bTApICsgKEJyYW5jaHRhYjM5WzFdLmNbaV0gXiBzeW0xKSArIFwKKyAgICAgKEJyYW5jaHRhYjM5WzJdLmNbaV0gXiBzeW0yKTtcCisgICAgbTAgPSB2cC0+b2xkX21ldHJpY3MtPndbaV0gKyBtZXRyaWM7XAorICAgIG0xID0gdnAtPm9sZF9tZXRyaWNzLT53W2krMTI4XSArICg3NjUgLSBtZXRyaWMpO1wKKyAgICBkZWNpc2lvbiA9IChzaWduZWQgaW50KShtMC1tMSkgPiAwO1wKKyAgICB2cC0+bmV3X21ldHJpY3MtPndbMippXSA9IGRlY2lzaW9uID8gbTEgOiBtMDtcCisgICAgZC0+d1tpLzE2XSB8PSBkZWNpc2lvbiA8PCAoKDIqaSkmMzEpO1wKKyAgICBtMCAtPSAobWV0cmljK21ldHJpYy03NjUpO1wKKyAgICBtMSArPSAobWV0cmljK21ldHJpYy03NjUpO1wKKyAgICBkZWNpc2lvbiA9IChzaWduZWQgaW50KShtMC1tMSkgPiAwO1wKKyAgICB2cC0+bmV3X21ldHJpY3MtPndbMippKzFdID0gZGVjaXNpb24gPyBtMSA6IG0wO1wKKyAgICBkLT53W2kvMTZdIHw9IGRlY2lzaW9uIDw8ICgoMippKzEpJjMxKTtcCit9CisKKy8qIFVwZGF0ZSBkZWNvZGVyIHdpdGggYSBibG9jayBvZiBkZW1vZHVsYXRlZCBzeW1ib2xzCisgKiBOb3RlIHRoYXQgbmJpdHMgaXMgdGhlIG51bWJlciBvZiBkZWNvZGVkIGRhdGEgYml0cywgbm90IHRoZSBudW1iZXIKKyAqIG9mIHN5bWJvbHMhCisgKi8KKworaW50IHVwZGF0ZV92aXRlcmJpMzlfYmxrX3BvcnQodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICAKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworICB3aGlsZShuYml0cy0tKXsKKyAgICB2b2lkICp0bXA7CisgICAgdW5zaWduZWQgY2hhciBzeW0wLHN5bTEsc3ltMjsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7aTw4O2krKykKKyAgICAgIGQtPndbaV0gPSAwOworICAgIHN5bTAgPSAqc3ltcysrOworICAgIHN5bTEgPSAqc3ltcysrOworICAgIHN5bTIgPSAqc3ltcysrOworCisgICAgZm9yKGk9MDtpPDEyODtpKyspCisgICAgICBCRkxZKGkpOworCisgICAgZCsrOworICAgIHRtcCA9IHZwLT5vbGRfbWV0cmljczsKKyAgICB2cC0+b2xkX21ldHJpY3MgPSB2cC0+bmV3X21ldHJpY3M7CisgICAgdnAtPm5ld19tZXRyaWNzID0gdG1wOworICB9ICAKKyAgdnAtPmRwID0gZDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mZWMvdml0ZXJiaTM5X3NzZS5jIGIvZmVjL3ZpdGVyYmkzOV9zc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYyODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmkzOV9zc2UuYwpAQCAtMCwwICsxLDIwMSBAQAorLyogSz05IHI9MS8zIFZpdGVyYmkgZGVjb2RlciBmb3IgeDg2IFNTRQorICogQ29weXJpZ2h0IEF1ZyAyMDA2LCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKQorICovCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJmZWMuaCIKKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGxvbmcgd1s4XTsgdW5zaWduZWQgY2hhciBjWzMyXTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgc2lnbmVkIHNob3J0IHNbMjU2XTsgX19tNjQgdls2NF07fSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjM5IHsgdW5zaWduZWQgc2hvcnQgc1sxMjhdOyBfX202NCB2WzMyXTt9IEJyYW5jaHRhYjM5WzNdOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyICovCitzdHJ1Y3QgdjM5IHsKKyAgbWV0cmljX3QgbWV0cmljczE7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAxICovCisgIG1ldHJpY190IG1ldHJpY3MyOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMiAqLworICB2b2lkICpkcDsgICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGRlY2lzaW9uICovCisgIG1ldHJpY190ICpvbGRfbWV0cmljcywqbmV3X21ldHJpY3M7IC8qIFBvaW50ZXJzIHRvIHBhdGggbWV0cmljcywgc3dhcHBlZCBvbiBldmVyeSBiaXQgKi8KKyAgdm9pZCAqZGVjaXNpb25zOyAgIC8qIEJlZ2lubmluZyBvZiBkZWNpc2lvbnMgZm9yIGJsb2NrICovCit9OworCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpMzlfc3NlKHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHYzOSAqdnAgPSBwOworICBpbnQgaTsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBmb3IoaT0wO2k8MjU2O2krKykKKyAgICB2cC0+bWV0cmljczEuc1tpXSA9IChTSFJUX01JTisxMDAwKTsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPnNbc3RhcnRpbmdfc3RhdGUgJiAyNTVdID0gU0hSVF9NSU47IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmkzOV9zc2UoaW50IGxlbil7CisgIHN0cnVjdCB2MzkgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbM10gPSB7IFYzOVBPTFlBLCBWMzlQT0xZQiwgVjM5UE9MWUMgfTsKKworICAgIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UocG9seXMpOworICB9CisgIGlmKCh2cCA9IChzdHJ1Y3QgdjM5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjM5KSkpID09IE5VTEwpeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmKCh2cC0+ZGVjaXNpb25zID0gbWFsbG9jKChsZW4rOCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5pdF92aXRlcmJpMzlfc3NlKHZwLDApOworICByZXR1cm4gdnA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmkzOV9wb2x5bm9taWFsX3NzZShpbnQgcG9seXNbM10peworICBpbnQgc3RhdGU7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCAxMjg7c3RhdGUrKyl7CisgICAgQnJhbmNodGFiMzlbMF0uc1tzdGF0ZV0gPSAocG9seXNbMF0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBwb2x5c1swXSkgPyAyNTU6MDsKKyAgICBCcmFuY2h0YWIzOVsxXS5zW3N0YXRlXSA9IChwb2x5c1sxXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIHBvbHlzWzFdKSA/IDI1NTowOworICAgIEJyYW5jaHRhYjM5WzJdLnNbc3RhdGVdID0gKHBvbHlzWzJdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgcG9seXNbMl0pID8gMjU1OjA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpMzlfc3NlKAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQ7CisgIGludCBwYXRoX21ldHJpYzsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBkID0gKGRlY2lzaW9uX3QgKil2cC0+ZGVjaXNpb25zOyAgCisgIGVuZHN0YXRlICU9IDI1NjsKKworICBwYXRoX21ldHJpYyA9IHZwLT5vbGRfbWV0cmljcy0+c1tlbmRzdGF0ZV07CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gODsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKworICAgIC8qICAgIGsgPSAoZFtuYml0c10ud1tlbmRzdGF0ZS8zMl0gPj4gKGVuZHN0YXRlJTMyKSkgJiAxOyovCisgICAgayA9IChkW25iaXRzXS5jW2VuZHN0YXRlLzhdID4+IChlbmRzdGF0ZSU4KSkgJiAxOworICAgIGVuZHN0YXRlID0gKGsgPDwgNykgfCAoZW5kc3RhdGUgPj4gMSk7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZTsKKyAgfQorICByZXR1cm4gcGF0aF9tZXRyaWMgLSBTSFJUX01JTjsKK30KKworLyogRGVsZXRlIGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkIGRlbGV0ZV92aXRlcmJpMzlfc3NlKHZvaWQgKnApeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisKK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsa19zc2Uodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2MzkgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKyAgaW50IHBhdGhfbWV0cmljID0gMDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBkID0gKGRlY2lzaW9uX3QgKil2cC0+ZHA7CisgIHdoaWxlKG5iaXRzLS0peworICAgIF9fbTY0IHN5bTB2LHN5bTF2LHN5bTJ2OworICAgIHZvaWQgKnRtcDsKKyAgICBpbnQgaTsKKworICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX3BpMTYoc3ltc1swXSk7CisgICAgc3ltMXYgPSBfbW1fc2V0MV9waTE2KHN5bXNbMV0pOworICAgIHN5bTJ2ID0gX21tX3NldDFfcGkxNihzeW1zWzJdKTsKKyAgICBzeW1zICs9IDM7CisKKyAgICBmb3IoaT0wO2k8MzI7aSsrKXsKKyAgICAgIF9fbTY0IGRlY2lzaW9uMCxkZWNpc2lvbjEsbWV0cmljLG1fbWV0cmljLG0wLG0xLG0yLG0zLHN1cnZpdm9yMCxzdXJ2aXZvcjE7CisKKyAgICAgIC8qIEZvcm0gYnJhbmNoIG1ldHJpY3MKKyAgICAgICAqIEJlY2F1c2UgQnJhbmNodGFiIHRha2VzIG9uIHZhbHVlcyAwIGFuZCAyNTUsIGFuZCB0aGUgdmFsdWVzIG9mIHN5bT92IGFyZSBvZmZzZXQgYmluYXJ5IGluIHRoZSByYW5nZSAwLTI1NSwKKyAgICAgICAqIHRoZSBYT1Igb3BlcmF0aW9ucyBjb25zdGl0dXRlIGNvbmRpdGlvbmFsIG5lZ2F0aW9uLgorICAgICAgICogbWV0cmljIGFuZCBtX21ldHJpYyAoLW1ldHJpYykgYXJlIGluIHRoZSByYW5nZSAwLTc2NQorICAgICAgICovCisgICAgICBtMCA9IF9tbV9hZGRfcGkxNihfbW1feG9yX3NpNjQoQnJhbmNodGFiMzlbMF0udltpXSxzeW0wdiksX21tX3hvcl9zaTY0KEJyYW5jaHRhYjM5WzFdLnZbaV0sc3ltMXYpKTsKKyAgICAgIG1ldHJpYyA9IF9tbV9hZGRfcGkxNihfbW1feG9yX3NpNjQoQnJhbmNodGFiMzlbMl0udltpXSxzeW0ydiksbTApOworICAgICAgbV9tZXRyaWMgPSBfbW1fc3ViX3BpMTYoX21tX3NldDFfcGkxNig3NjUpLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52W2ldLG1ldHJpYyk7CisgICAgICBtMyA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52WzMyK2ldLG1ldHJpYyk7CisgICAgICBtMSA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52WzMyK2ldLG1fbWV0cmljKTsKKyAgICAgIG0yID0gX21tX2FkZHNfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbaV0sbV9tZXRyaWMpOworICAgIAorICAgICAgLyogQ29tcGFyZSBhbmQgc2VsZWN0ICovCisgICAgICBzdXJ2aXZvcjAgPSBfbW1fbWluX3BpMTYobTAsbTEpOworICAgICAgc3Vydml2b3IxID0gX21tX21pbl9waTE2KG0yLG0zKTsKKyAgICAgIGRlY2lzaW9uMCA9IF9tbV9jbXBlcV9waTE2KHN1cnZpdm9yMCxtMSk7CisgICAgICBkZWNpc2lvbjEgPSBfbW1fY21wZXFfcGkxNihzdXJ2aXZvcjEsbTMpOworIAorICAgICAgLyogUGFjayBkZWNpc2lvbnMgaW50byA4IGJpdHMgYW5kIHN0b3JlICovCisgICAgICBkLT5jW2ldID0gX21tX21vdmVtYXNrX3BpOChfbW1fdW5wYWNrbG9fcGk4KF9tbV9wYWNrc19waTE2KGRlY2lzaW9uMCxfbW1fc2V0emVyb19zaTY0KCkpLF9tbV9wYWNrc19waTE2KGRlY2lzaW9uMSxfbW1fc2V0emVyb19zaTY0KCkpKSk7CisKKyAgICAgIC8qIFN0b3JlIHN1cnZpdmluZyBtZXRyaWNzICovCisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IF9tbV91bnBhY2tsb19waTE2KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaSsxXSA9IF9tbV91bnBhY2toaV9waTE2KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgIH0KKyAgICAvKiBTZWUgaWYgd2UgbmVlZCB0byByZW5vcm1hbGl6ZQorICAgICAqIE1heCBtZXRyaWMgc3ByZWFkIGZvciB0aGlzIGNvZGUgd2l0aCAwLTI1NSBicmFuY2ggbWV0cmljcyBpcyAxMjc1MAorICAgICAqLworICAgIGlmKHZwLT5uZXdfbWV0cmljcy0+c1swXSA+PSBTSFJUX01BWC01MDAwKXsKKyAgICAgIGludCBpLGFkanVzdDsKKyAgICAgIF9fbTY0IGFkanVzdHY7CisgICAgICB1bmlvbiB7IF9fbTY0IHY7IHNpZ25lZCBzaG9ydCB3WzRdOyB9IHQ7CisKKyAgICAgIC8qIEZpbmQgc21hbGxlc3QgbWV0cmljIGFuZCBzZXQgYWRqdXN0diB0byBicmluZyBpdCBkb3duIHRvIFNIUlRfTUlOICovCisgICAgICBhZGp1c3R2ID0gdnAtPm5ld19tZXRyaWNzLT52WzBdOworICAgICAgZm9yKGk9MTtpPDY0O2krKykKKwlhZGp1c3R2ID0gX21tX21pbl9waTE2KGFkanVzdHYsdnAtPm5ld19tZXRyaWNzLT52W2ldKTsKKworICAgICAgYWRqdXN0diA9IF9tbV9taW5fcGkxNihhZGp1c3R2LF9tbV9zcmxpX3NpNjQoYWRqdXN0diwzMikpOworICAgICAgYWRqdXN0diA9IF9tbV9taW5fcGkxNihhZGp1c3R2LF9tbV9zcmxpX3NpNjQoYWRqdXN0diwxNikpOyAgICAKKyAgICAgIHQudiA9IGFkanVzdHY7CisgICAgICBhZGp1c3QgPSB0LndbMF0gLSBTSFJUX01JTjsKKyAgICAgIHBhdGhfbWV0cmljICs9IGFkanVzdDsKKyAgICAgIGFkanVzdHYgPSBfbW1fc2V0MV9waTE2KGFkanVzdCk7CisgICAgICAKKyAgICAgIGZvcihpPTA7aTw2NDtpKyspCisJdnAtPm5ld19tZXRyaWNzLT52W2ldID0gX21tX3N1Yl9waTE2KHZwLT5uZXdfbWV0cmljcy0+dltpXSxhZGp1c3R2KTsKKyAgICB9CisgICAgZCsrOworICAgIC8qIFN3YXAgcG9pbnRlcnMgdG8gb2xkIGFuZCBuZXcgbWV0cmljcyAqLworICAgIHRtcCA9IHZwLT5vbGRfbWV0cmljczsKKyAgICB2cC0+b2xkX21ldHJpY3MgPSB2cC0+bmV3X21ldHJpY3M7CisgICAgdnAtPm5ld19tZXRyaWNzID0gdG1wOworICB9CisgIHZwLT5kcCA9IGQ7CisgIF9tbV9lbXB0eSgpOworICByZXR1cm4gcGF0aF9tZXRyaWM7Cit9CmRpZmYgLS1naXQgYS9mZWMvdml0ZXJiaTM5X3NzZTIuYyBiL2ZlYy92aXRlcmJpMzlfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTM5X3NzZTIuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogSz0xNSByPTEvNiBWaXRlcmJpIGRlY29kZXIgZm9yIHg4NiBTU0UyCisgKiBDb3B5cmlnaHQgTWFyIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgImZlYy5oIgorCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgbG9uZyB3WzhdOyB1bnNpZ25lZCBzaG9ydCBzWzE2XTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgc2lnbmVkIHNob3J0IHNbMjU2XTsgX19tMTI4aSB2WzMyXTt9IG1ldHJpY190OworCitzdGF0aWMgdW5pb24gYnJhbmNodGFiMzkgeyB1bnNpZ25lZCBzaG9ydCBzWzEyOF07IF9fbTEyOGkgdlsxNl07fSBCcmFuY2h0YWIzOVszXTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlciAqLworc3RydWN0IHYzOSB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgdm9pZCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIHZvaWQgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTM5X3NzZTIodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisgIGludCBpOworCisgIGZvcihpPTA7aTwyNTY7aSsrKQorICAgIHZwLT5tZXRyaWNzMS5zW2ldID0gKFNIUlRfTUlOKzEwMDApOworCisgIHZwLT5vbGRfbWV0cmljcyA9ICZ2cC0+bWV0cmljczE7CisgIHZwLT5uZXdfbWV0cmljcyA9ICZ2cC0+bWV0cmljczI7CisgIHZwLT5kcCA9IHZwLT5kZWNpc2lvbnM7CisgIHZwLT5vbGRfbWV0cmljcy0+c1tzdGFydGluZ19zdGF0ZSAmIDI1NV0gPSBTSFJUX01JTjsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTM5X3NzZTIoaW50IGxlbil7CisgIHZvaWQgKnA7CisgIHN0cnVjdCB2MzkgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbM10gPSB7IFYzOVBPTFlBLCBWMzlQT0xZQiwgVjM5UE9MWUMgfTsKKworICAgIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UyKHBvbHlzKTsKKyAgfQorICAvKiBPcmRpbmFyeSBtYWxsb2MoKSBvbmx5IHJldHVybnMgOC1ieXRlIGFsaWdubWVudCwgd2UgbmVlZCAxNiAqLworICBpZihwb3NpeF9tZW1hbGlnbigmcCwgc2l6ZW9mKF9fbTEyOGkpLHNpemVvZihzdHJ1Y3QgdjM5KSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdnAgPSAoc3RydWN0IHYzOSAqKXA7CisgIGlmKChwID0gbWFsbG9jKChsZW4rOCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdnAtPmRlY2lzaW9ucyA9IChkZWNpc2lvbl90ICopcDsKKyAgaW5pdF92aXRlcmJpMzlfc3NlMih2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpMzlfcG9seW5vbWlhbF9zc2UyKGludCBwb2x5c1szXSl7CisgIGludCBzdGF0ZTsKKworICBmb3Ioc3RhdGU9MDtzdGF0ZSA8IDEyODtzdGF0ZSsrKXsKKyAgICBCcmFuY2h0YWIzOVswXS5zW3N0YXRlXSA9IChwb2x5c1swXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIHBvbHlzWzBdKSA/IDI1NTowOworICAgIEJyYW5jaHRhYjM5WzFdLnNbc3RhdGVdID0gKHBvbHlzWzFdIDwgMCkgXiBwYXJpdHkoKDIqc3RhdGUpICYgcG9seXNbMV0pID8gMjU1OjA7CisgICAgQnJhbmNodGFiMzlbMl0uc1tzdGF0ZV0gPSAocG9seXNbMl0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBwb2x5c1syXSkgPyAyNTU6MDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmkzOV9zc2UyKAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQgPSAoZGVjaXNpb25fdCAqKXZwLT5kZWNpc2lvbnM7CisgIGludCBwYXRoX21ldHJpYzsKKworICBlbmRzdGF0ZSAlPSAyNTY7CisKKyAgcGF0aF9tZXRyaWMgPSB2cC0+b2xkX21ldHJpY3MtPnNbZW5kc3RhdGVdOworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDg7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisKKyAgICBrID0gKGRbbmJpdHNdLndbZW5kc3RhdGUvMzJdID4+IChlbmRzdGF0ZSUzMikpICYgMTsKKyAgICBlbmRzdGF0ZSA9IChrIDw8IDcpIHwgKGVuZHN0YXRlID4+IDEpOworICAgIGRhdGFbbmJpdHM+PjNdID0gZW5kc3RhdGU7CisgIH0KKyAgcmV0dXJuIHBhdGhfbWV0cmljOworfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmkzOV9zc2UyKHZvaWQgKnApeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisKK2ludCB1cGRhdGVfdml0ZXJiaTM5X2Jsa19zc2UyKHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpeworICBzdHJ1Y3QgdjM5ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQgPSAoZGVjaXNpb25fdCAqKXZwLT5kcDsKKyAgaW50IHBhdGhfbWV0cmljID0gMDsKKworICB3aGlsZShuYml0cy0tKXsKKyAgICBfX20xMjhpIHN5bTB2LHN5bTF2LHN5bTJ2OworICAgIHZvaWQgKnRtcDsKKyAgICBpbnQgaTsKKworICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX2VwaTE2KHN5bXNbMF0pOworICAgIHN5bTF2ID0gX21tX3NldDFfZXBpMTYoc3ltc1sxXSk7CisgICAgc3ltMnYgPSBfbW1fc2V0MV9lcGkxNihzeW1zWzJdKTsKKyAgICBzeW1zICs9IDM7CisKKyAgICAvKiBTU0UyIGRvZXNuJ3Qgc3VwcG9ydCBzYXR1cmF0ZWQgYWRkcyBvbiB1bnNpZ25lZCBzaG9ydHMsIHNvIHdlIGhhdmUgdG8gdXNlIHNpZ25lZCBzaG9ydHMgKi8KKyAgICBmb3IoaT0wO2k8MTY7aSsrKXsKKyAgICAgIF9fbTEyOGkgZGVjaXNpb24wLGRlY2lzaW9uMSxtZXRyaWMsbV9tZXRyaWMsbTAsbTEsbTIsbTMsc3Vydml2b3IwLHN1cnZpdm9yMTsKKworICAgICAgLyogRm9ybSBicmFuY2ggbWV0cmljcworICAgICAgICogQmVjYXVzZSBCcmFuY2h0YWIgdGFrZXMgb24gdmFsdWVzIDAgYW5kIDI1NSwgYW5kIHRoZSB2YWx1ZXMgb2Ygc3ltP3YgYXJlIG9mZnNldCBiaW5hcnkgaW4gdGhlIHJhbmdlIDAtMjU1LAorICAgICAgICogdGhlIFhPUiBvcGVyYXRpb25zIGNvbnN0aXR1dGUgY29uZGl0aW9uYWwgbmVnYXRpb24uCisgICAgICAgKiBtZXRyaWMgYW5kIG1fbWV0cmljICgtbWV0cmljKSBhcmUgaW4gdGhlIHJhbmdlIDAtNzY1CisgICAgICAgKi8KKyAgICAgIG0wID0gX21tX2FkZF9lcGkxNihfbW1feG9yX3NpMTI4KEJyYW5jaHRhYjM5WzBdLnZbaV0sc3ltMHYpLF9tbV94b3Jfc2kxMjgoQnJhbmNodGFiMzlbMV0udltpXSxzeW0xdikpOworICAgICAgbWV0cmljID0gX21tX2FkZF9lcGkxNihfbW1feG9yX3NpMTI4KEJyYW5jaHRhYjM5WzJdLnZbaV0sc3ltMnYpLG0wKTsKKyAgICAgIG1fbWV0cmljID0gX21tX3N1Yl9lcGkxNihfbW1fc2V0MV9lcGkxNig3NjUpLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IF9tbV9hZGRzX2VwaTE2KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtZXRyaWMpOworICAgICAgbTMgPSBfbW1fYWRkc19lcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMTYraV0sbWV0cmljKTsKKyAgICAgIG0xID0gX21tX2FkZHNfZXBpMTYodnAtPm9sZF9tZXRyaWNzLT52WzE2K2ldLG1fbWV0cmljKTsKKyAgICAgIG0yID0gX21tX2FkZHNfZXBpMTYodnAtPm9sZF9tZXRyaWNzLT52W2ldLG1fbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdCAqLworICAgICAgc3Vydml2b3IwID0gX21tX21pbl9lcGkxNihtMCxtMSk7CisgICAgICBzdXJ2aXZvcjEgPSBfbW1fbWluX2VwaTE2KG0yLG0zKTsKKyAgICAgIGRlY2lzaW9uMCA9IF9tbV9jbXBlcV9lcGkxNihzdXJ2aXZvcjAsbTEpOworICAgICAgZGVjaXNpb24xID0gX21tX2NtcGVxX2VwaTE2KHN1cnZpdm9yMSxtMyk7CisgCisgICAgICAvKiBQYWNrIGVhY2ggc2V0IG9mIGRlY2lzaW9ucyBpbnRvIDggOC1iaXQgYnl0ZXMsIHRoZW4gaW50ZXJsZWF2ZSB0aGVtIGFuZCBjb21wcmVzcyBpbnRvIDE2IGJpdHMgKi8KKyAgICAgIGQtPnNbaV0gPSBfbW1fbW92ZW1hc2tfZXBpOChfbW1fdW5wYWNrbG9fZXBpOChfbW1fcGFja3NfZXBpMTYoZGVjaXNpb24wLF9tbV9zZXR6ZXJvX3NpMTI4KCkpLF9tbV9wYWNrc19lcGkxNihkZWNpc2lvbjEsX21tX3NldHplcm9fc2kxMjgoKSkpKTsKKworICAgICAgLyogU3RvcmUgc3Vydml2aW5nIG1ldHJpY3MgKi8KKyAgICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyKmldID0gX21tX3VucGFja2xvX2VwaTE2KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaSsxXSA9IF9tbV91bnBhY2toaV9lcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICB9CisgICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gcmVub3JtYWxpemUgKi8KKyAgICBpZih2cC0+bmV3X21ldHJpY3MtPnNbMF0gPj0gU0hSVF9NQVgtNTAwMCl7CisgICAgICBpbnQgaSxhZGp1c3Q7CisgICAgICBfX20xMjhpIGFkanVzdHY7CisgICAgICB1bmlvbiB7IF9fbTEyOGkgdjsgc2lnbmVkIHNob3J0IHdbOF07IH0gdDsKKyAgICAgIAorICAgICAgLyogRmluZCBzbWFsbGVzdCBtZXRyaWMgYW5kIHNldCBhZGp1c3R2IHRvIGJyaW5nIGl0IGRvd24gdG8gU0hSVF9NSU4gKi8KKyAgICAgIGFkanVzdHYgPSB2cC0+bmV3X21ldHJpY3MtPnZbMF07CisgICAgICBmb3IoaT0xO2k8MzI7aSsrKQorCWFkanVzdHYgPSBfbW1fbWluX2VwaTE2KGFkanVzdHYsdnAtPm5ld19tZXRyaWNzLT52W2ldKTsKKworICAgICAgYWRqdXN0diA9IF9tbV9taW5fZXBpMTYoYWRqdXN0dixfbW1fc3JsaV9zaTEyOChhZGp1c3R2LDgpKTsKKyAgICAgIGFkanVzdHYgPSBfbW1fbWluX2VwaTE2KGFkanVzdHYsX21tX3NybGlfc2kxMjgoYWRqdXN0diw0KSk7CisgICAgICBhZGp1c3R2ID0gX21tX21pbl9lcGkxNihhZGp1c3R2LF9tbV9zcmxpX3NpMTI4KGFkanVzdHYsMikpOworICAgICAgdC52ID0gYWRqdXN0djsKKyAgICAgIGFkanVzdCA9IHQud1swXSAtIFNIUlRfTUlOOworICAgICAgcGF0aF9tZXRyaWMgKz0gYWRqdXN0OworICAgICAgYWRqdXN0diA9IF9tbV9zZXQxX2VwaTE2KGFkanVzdCk7CisKKyAgICAgIC8qIFdlIGNhbm5vdCB1c2UgYSBzYXR1cmF0ZWQgc3VidHJhY3QsIGJlY2F1c2Ugd2Ugb2Z0ZW4gaGF2ZSB0byBhZGp1c3QgYnkgbW9yZSB0aGFuIFNIUlRfTUFYCisgICAgICAgKiBUaGlzIGlzIG9rYXkgc2luY2UgaXQgY2FuJ3Qgb3ZlcmZsb3cgYW55d2F5CisgICAgICAgKi8KKyAgICAgIGZvcihpPTA7aTwzMjtpKyspCisJdnAtPm5ld19tZXRyaWNzLT52W2ldID0gX21tX3N1Yl9lcGkxNih2cC0+bmV3X21ldHJpY3MtPnZbaV0sYWRqdXN0dik7CisgICAgfQorICAgIGQrKzsKKyAgICAvKiBTd2FwIHBvaW50ZXJzIHRvIG9sZCBhbmQgbmV3IG1ldHJpY3MgKi8KKyAgICB0bXAgPSB2cC0+b2xkX21ldHJpY3M7CisgICAgdnAtPm9sZF9tZXRyaWNzID0gdnAtPm5ld19tZXRyaWNzOworICAgIHZwLT5uZXdfbWV0cmljcyA9IHRtcDsKKyAgfQorICB2cC0+ZHAgPSBkOworICByZXR1cm4gcGF0aF9tZXRyaWM7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmk2MTUuYyBiL2ZlYy92aXRlcmJpNjE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkYTUxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpNjE1LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIEs9MTUgcj0xLzYgVml0ZXJiaSBkZWNvZGVyIHdpdGggb3B0aW9uYWwgSW50ZWwgb3IgUG93ZXJQQyBTSU1ECisgKiBDb3B5cmlnaHQgRmViIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJmZWMuaCIKKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNShpbnQgbGVuKXsKKworICBmaW5kX2NwdV9tb2RlKCk7CisKKyAgc3dpdGNoKENwdV9tb2RlKXsKKyAgY2FzZSBQT1JUOgorICBkZWZhdWx0OgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTYxNV9wb3J0KGxlbik7CisjaWZkZWYgX19WRUNfXworICBjYXNlIEFMVElWRUM6CisgICAgcmV0dXJuIGNyZWF0ZV92aXRlcmJpNjE1X2F2KGxlbik7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICBjYXNlIE1NWDoKKyAgICByZXR1cm4gY3JlYXRlX3ZpdGVyYmk2MTVfbW14KGxlbik7CisgIGNhc2UgU1NFOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTYxNV9zc2UobGVuKTsKKyAgY2FzZSBTU0UyOgorICAgIHJldHVybiBjcmVhdGVfdml0ZXJiaTYxNV9zc2UyKGxlbik7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWwoaW50IHBvbHlzWzZdKXsKKworICBzd2l0Y2goQ3B1X21vZGUpeworICBjYXNlIFBPUlQ6CisgIGRlZmF1bHQ6CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9wb3J0KHBvbHlzKTsKKyAgICBicmVhazsKKyNpZmRlZiBfX1ZFQ19fCisgIGNhc2UgQUxUSVZFQzoKKyAgICBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX2F2KHBvbHlzKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgIGNhc2UgTU1YOgorICAgIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWxfbW14KHBvbHlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBTU0U6CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9zc2UocG9seXMpOworICAgIGJyZWFrOworICBjYXNlIFNTRTI6CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9zc2UyKHBvbHlzKTsKKyAgICBicmVhazsKKyNlbmRpZgorICB9Cit9CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmk2MTUodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICAgIHN3aXRjaChDcHVfbW9kZSl7CisgICAgY2FzZSBQT1JUOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpNjE1X3BvcnQocCxzdGFydGluZ19zdGF0ZSk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiBpbml0X3ZpdGVyYmk2MTVfYXYocCxzdGFydGluZ19zdGF0ZSk7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICAgIGNhc2UgTU1YOgorICAgICAgcmV0dXJuIGluaXRfdml0ZXJiaTYxNV9tbXgocCxzdGFydGluZ19zdGF0ZSk7CisgICAgY2FzZSBTU0U6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpNjE1X3NzZShwLHN0YXJ0aW5nX3N0YXRlKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gaW5pdF92aXRlcmJpNjE1X3NzZTIocCxzdGFydGluZ19zdGF0ZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTUoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpNjE1X3BvcnQocCxkYXRhLG5iaXRzLGVuZHN0YXRlKTsKKyNpZmRlZiBfX1ZFQ19fCisgICAgY2FzZSBBTFRJVkVDOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpNjE1X2F2KHAsZGF0YSxuYml0cyxlbmRzdGF0ZSk7CisjZW5kaWYKKyNpZmRlZiBfX2kzODZfXworICAgIGNhc2UgTU1YOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpNjE1X21teChwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworICAgIGNhc2UgU1NFOgorICAgICAgcmV0dXJuIGNoYWluYmFja192aXRlcmJpNjE1X3NzZShwLGRhdGEsbmJpdHMsZW5kc3RhdGUpOworICAgIGNhc2UgU1NFMjoKKyAgICAgIHJldHVybiBjaGFpbmJhY2tfdml0ZXJiaTYxNV9zc2UyKHAsZGF0YSxuYml0cyxlbmRzdGF0ZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTYxNSh2b2lkICpwKXsKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgZGVsZXRlX3ZpdGVyYmk2MTVfcG9ydChwKTsKKyAgICAgIGJyZWFrOworI2lmZGVmIF9fVkVDX18KKyAgICBjYXNlIEFMVElWRUM6CisgICAgICBkZWxldGVfdml0ZXJiaTYxNV9hdihwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgX19pMzg2X18KKyAgICBjYXNlIE1NWDoKKyAgICAgIGRlbGV0ZV92aXRlcmJpNjE1X21teChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1NFOgorICAgICAgZGVsZXRlX3ZpdGVyYmk2MTVfc3NlKHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0UyOgorICAgICAgZGVsZXRlX3ZpdGVyYmk2MTVfc3NlMihwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorfQorCisvKiBVcGRhdGUgZGVjb2RlciB3aXRoIGEgYmxvY2sgb2YgZGVtb2R1bGF0ZWQgc3ltYm9scworICogTm90ZSB0aGF0IG5iaXRzIGlzIHRoZSBudW1iZXIgb2YgZGVjb2RlZCBkYXRhIGJpdHMsIG5vdCB0aGUgbnVtYmVyCisgKiBvZiBzeW1ib2xzIQorICovCitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrKHZvaWQgKnAsdW5zaWduZWQgY2hhciBzeW1zW10saW50IG5iaXRzKXsKKyAgICBzd2l0Y2goQ3B1X21vZGUpeworICAgIGNhc2UgUE9SVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHVwZGF0ZV92aXRlcmJpNjE1X2Jsa19wb3J0KHAsc3ltcyxuYml0cyk7CisjaWZkZWYgX19WRUNfXworICAgIGNhc2UgQUxUSVZFQzoKKyAgICAgIHJldHVybiB1cGRhdGVfdml0ZXJiaTYxNV9ibGtfYXYocCxzeW1zLG5iaXRzKTsKKyNlbmRpZgorI2lmZGVmIF9faTM4Nl9fCisgICAgY2FzZSBNTVg6CisgICAgICByZXR1cm4gdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX21teChwLHN5bXMsbmJpdHMpOworICAgIGNhc2UgU1NFOgorICAgICAgcmV0dXJuIHVwZGF0ZV92aXRlcmJpNjE1X2Jsa19zc2UocCxzeW1zLG5iaXRzKTsKKyAgICBjYXNlIFNTRTI6CisgICAgICByZXR1cm4gdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3NzZTIocCxzeW1zLG5iaXRzKTsKKyNlbmRpZgorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmk2MTVfYXYuYyBiL2ZlYy92aXRlcmJpNjE1X2F2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2Y2U5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpNjE1X2F2LmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qIEs9MTUgcj0xLzYgVml0ZXJiaSBkZWNvZGVyIGZvciBQb3dlclBDIEc0L0c1IEFsdGl2ZWMgdmVjdG9yIGluc3RydWN0aW9ucworICogOC1iaXQgb2Zmc2V0LWJpbmFyeSBzb2Z0IGRlY2lzaW9uIHNhbXBsZXMKKyAqIENvcHlyaWdodCBNYXIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIGNbMTI4XVsxNl07IHZlY3RvciB1bnNpZ25lZCBjaGFyIHZbMTI4XTsgfSBkZWNpc2lvbl90OwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIHNob3J0IHNbMTYzODRdOyB2ZWN0b3IgdW5zaWduZWQgc2hvcnQgdlsyMDQ4XTsgfSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjYxNSB7IHVuc2lnbmVkIHNob3J0IHNbODE5Ml07IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2WzEwMjRdO30gQnJhbmNodGFiNjE1WzZdOworc3RhdGljIGludCBJbml0ID0gMDsKKworLyogU3RhdGUgaW5mbyBmb3IgaW5zdGFuY2Ugb2YgVml0ZXJiaSBkZWNvZGVyICovCitzdHJ1Y3QgdjYxNSB7CisgIG1ldHJpY190IG1ldHJpY3MxOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMSAqLworICBtZXRyaWNfdCBtZXRyaWNzMjsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDIgKi8KKyAgdm9pZCAqZHA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBkZWNpc2lvbiAqLworICBtZXRyaWNfdCAqb2xkX21ldHJpY3MsKm5ld19tZXRyaWNzOyAvKiBQb2ludGVycyB0byBwYXRoIG1ldHJpY3MsIHN3YXBwZWQgb24gZXZlcnkgYml0ICovCisgIHZvaWQgKmRlY2lzaW9uczsgICAvKiBCZWdpbm5pbmcgb2YgZGVjaXNpb25zIGZvciBibG9jayAqLworfTsKKworLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgZm9yIHN0YXJ0IG9mIG5ldyBmcmFtZSAqLworaW50IGluaXRfdml0ZXJiaTYxNV9hdih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yKGk9MDtpPDIwNDg7aSsrKQorICAgIHZwLT5tZXRyaWNzMS52W2ldID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCkoNTAwMCk7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5zW3N0YXJ0aW5nX3N0YXRlICYgMTYzODNdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNV9hdihpbnQgbGVuKXsKKyAgc3RydWN0IHY2MTUgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbNl0gPSB7IFY2MTVQT0xZQSxWNjE1UE9MWUIsVjYxNVBPTFlDLFY2MTVQT0xZRCxWNjE1UE9MWUUsVjYxNVBPTFlGIH07CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9hdihwb2x5cyk7CisgIH0KKyAgdnAgPSAoc3RydWN0IHY2MTUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2NjE1KSk7CisgIHZwLT5kZWNpc2lvbnMgPSBtYWxsb2Moc2l6ZW9mKGRlY2lzaW9uX3QpKihsZW4rMTQpKTsKKyAgaW5pdF92aXRlcmJpNjE1X2F2KHZwLDApOworICByZXR1cm4gdnA7Cit9CisKK3ZvaWQgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9hdihpbnQgcG9seXNbNl0peworICBpbnQgc3RhdGU7CisgIGludCBpOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgODE5MjtzdGF0ZSsrKXsKKyAgICBmb3IoaT0wO2k8NjtpKyspCisgICAgICBCcmFuY2h0YWI2MTVbaV0uc1tzdGF0ZV0gPSAocG9seXNbaV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbaV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTVfYXYoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQgPSAoZGVjaXNpb25fdCAqKXZwLT5kZWNpc2lvbnM7CisgIGludCBwYXRoX21ldHJpYzsKKworICBlbmRzdGF0ZSAlPSAxNjM4NDsKKworICBwYXRoX21ldHJpYyA9IHZwLT5vbGRfbWV0cmljcy0+c1tlbmRzdGF0ZV07CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gMTQ7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisgICAgCisgICAgayA9IChkW25iaXRzXS5jW2VuZHN0YXRlID4+IDddW2VuZHN0YXRlICYgMTVdICYgKDB4ODAgPj4gKChlbmRzdGF0ZT4+NCkmNykpICkgPyAxIDogMDsKKyAgICBlbmRzdGF0ZSA9IChrIDw8IDEzKSB8IChlbmRzdGF0ZSA+PiAxKTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID4+IDY7CisgIH0KKyAgcmV0dXJuIHBhdGhfbWV0cmljOworfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmk2MTVfYXYodm9pZCAqcCl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX2F2KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkID0gKGRlY2lzaW9uX3QgKil2cC0+ZHA7CisgIGludCBwYXRoX21ldHJpYyA9IDA7CisgIHZlY3RvciB1bnNpZ25lZCBjaGFyIGRlY2lzaW9ucyA9ICh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCk7CisKKyAgd2hpbGUobmJpdHMtLSl7CisgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHN5bXYsc3ltMHYsc3ltMXYsc3ltMnYsc3ltM3Ysc3ltNHYsc3ltNXY7CisgICAgdmVjdG9yIHVuc2lnbmVkIGNoYXIgczsKKyAgICB2b2lkICp0bXA7CisgICAgaW50IGk7CisgICAgCisgICAgLyogU3BsYXQgdGhlIDB0aCBzeW1ib2wgYWNyb3NzIHN5bTB2LCB0aGUgMXN0IHN5bWJvbCBhY3Jvc3Mgc3ltMXYsIGV0YyAqLworICAgIHMgPSAodmVjdG9yIHVuc2lnbmVkIGNoYXIpdmVjX3Blcm0odmVjX2xkKDAsc3ltcyksdmVjX2xkKDUsc3ltcyksdmVjX2x2c2woMCxzeW1zKSk7CisKKyAgICBzeW12ID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2ZWNfbWVyZ2VoKCh2ZWN0b3IgdW5zaWduZWQgY2hhcikoMCkscyk7ICAgIC8qIFVuc2lnbmVkIGJ5dGUtPndvcmQgdW5wYWNrICovIAorICAgIHN5bTB2ID0gdmVjX3NwbGF0KHN5bXYsMCk7CisgICAgc3ltMXYgPSB2ZWNfc3BsYXQoc3ltdiwxKTsKKyAgICBzeW0ydiA9IHZlY19zcGxhdChzeW12LDIpOworICAgIHN5bTN2ID0gdmVjX3NwbGF0KHN5bXYsMyk7CisgICAgc3ltNHYgPSB2ZWNfc3BsYXQoc3ltdiw0KTsKKyAgICBzeW01diA9IHZlY19zcGxhdChzeW12LDUpOworICAgIHN5bXMgKz0gNjsKKyAgICAKKyAgICBmb3IoaT0wO2k8MTAyNDtpKyspeworICAgICAgdmVjdG9yIGJvb2wgc2hvcnQgZGVjaXNpb24wLGRlY2lzaW9uMTsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBtZXRyaWMsbV9tZXRyaWMsbTAsbTEsbTIsbTMsc3Vydml2b3IwLHN1cnZpdm9yMTsKKworICAgICAgLyogRm9ybSBicmFuY2ggbWV0cmljcworICAgICAgICogQmVjYXVzZSBCcmFuY2h0YWIgdGFrZXMgb24gdmFsdWVzIDAgYW5kIDI1NSwgYW5kIHRoZSB2YWx1ZXMgb2Ygc3ltP3YgYXJlIG9mZnNldCBiaW5hcnkgaW4gdGhlIHJhbmdlIDAtMjU1LAorICAgICAgICogdGhlIFhPUiBvcGVyYXRpb25zIGNvbnN0aXR1dGUgY29uZGl0aW9uYWwgbmVnYXRpb24uCisgICAgICAgKiBtZXRyaWMgYW5kIG1fbWV0cmljICgtbWV0cmljKSBhcmUgaW4gdGhlIHJhbmdlIDAtMTUzMAorICAgICAgICovCisgICAgICBtMCA9IHZlY19hZGQodmVjX3hvcihCcmFuY2h0YWI2MTVbMF0udltpXSxzeW0wdiksdmVjX3hvcihCcmFuY2h0YWI2MTVbMV0udltpXSxzeW0xdikpOworICAgICAgbTEgPSB2ZWNfYWRkKHZlY194b3IoQnJhbmNodGFiNjE1WzJdLnZbaV0sc3ltMnYpLHZlY194b3IoQnJhbmNodGFiNjE1WzNdLnZbaV0sc3ltM3YpKTsKKyAgICAgIG0yID0gdmVjX2FkZCh2ZWNfeG9yKEJyYW5jaHRhYjYxNVs0XS52W2ldLHN5bTR2KSx2ZWNfeG9yKEJyYW5jaHRhYjYxNVs1XS52W2ldLHN5bTV2KSk7CisgICAgICBtZXRyaWMgPSB2ZWNfYWRkKG0wLG0xKTsKKyAgICAgIG1ldHJpYyA9IHZlY19hZGQobWV0cmljLG0yKTsKKyAgICAgIG1fbWV0cmljID0gdmVjX3N1YigodmVjdG9yIHVuc2lnbmVkIHNob3J0KSgxNTMwKSxtZXRyaWMpOworICAgIAorICAgICAgLyogQWRkIGJyYW5jaCBtZXRyaWNzIHRvIHBhdGggbWV0cmljcyAqLworICAgICAgbTAgPSB2ZWNfYWRkcyh2cC0+b2xkX21ldHJpY3MtPnZbaV0sbWV0cmljKTsKKyAgICAgIG0zID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzEwMjQraV0sbWV0cmljKTsKKyAgICAgIG0xID0gdmVjX2FkZHModnAtPm9sZF9tZXRyaWNzLT52WzEwMjQraV0sbV9tZXRyaWMpOworICAgICAgbTIgPSB2ZWNfYWRkcyh2cC0+b2xkX21ldHJpY3MtPnZbaV0sbV9tZXRyaWMpOworICAgIAorICAgICAgLyogQ29tcGFyZSBhbmQgc2VsZWN0ICovCisgICAgICBkZWNpc2lvbjAgPSB2ZWNfY21wZ3QobTAsbTEpOworICAgICAgZGVjaXNpb24xID0gdmVjX2NtcGd0KG0yLG0zKTsKKyAgICAgIHN1cnZpdm9yMCA9IHZlY19taW4obTAsbTEpOworICAgICAgc3Vydml2b3IxID0gdmVjX21pbihtMixtMyk7CisgICAgCisgICAgICAvKiBTdG9yZSBkZWNpc2lvbnMgYW5kIHN1cnZpdm9ycy4KKyAgICAgICAqIFRvIHNhdmUgc3BhY2Ugd2l0aG91dCBTU0UyJ3MgaGFuZHkgUE1PVk1TS0IgaW5zdHJ1Y3Rpb24sIHdlIHBhY2sgYW5kIHN0b3JlIHRoZW0gaW4KKyAgICAgICAqIGEgZnVubnkgaW50ZXJsZWF2ZWQgZmFzaGlvbiB0aGF0IHdlIHVuZG8gaW4gdGhlIGNoYWluYmFjayBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgZGVjaXNpb25zID0gdmVjX2FkZChkZWNpc2lvbnMsZGVjaXNpb25zKTsgLyogU2hpZnQgZWFjaCBieXRlIDEgYml0IHRvIHRoZSBsZWZ0ICovCisKKyAgICAgIC8qIEJvb2xlYW5zIGFyZSBlaXRoZXIgMHhmZiBvciAweDAwLiBTdWJ0cmFjdGluZyAweDAwIGxlYXZlcyB0aGUgbHNiIHplcm87IHN1YnRyYWN0aW5nCisgICAgICAgKiAweGZmIGlzIGVxdWl2YWxlbnQgdG8gYWRkaW5nIDEsIHdoaWNoIHNldHMgdGhlIGxzYi4KKyAgICAgICAqLworICAgICAgZGVjaXNpb25zID0gdmVjX3N1YihkZWNpc2lvbnMsKHZlY3RvciB1bnNpZ25lZCBjaGFyKXZlY19wYWNrKHZlY19tZXJnZWgoZGVjaXNpb24wLGRlY2lzaW9uMSksdmVjX21lcmdlbChkZWNpc2lvbjAsZGVjaXNpb24xKSkpOworCisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IHZlY19tZXJnZWgoc3Vydml2b3IwLHN1cnZpdm9yMSk7CisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippKzFdID0gdmVjX21lcmdlbChzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKworICAgICAgaWYoKGkgJSA4KSA9PSA3KXsKKwkvKiBXZSd2ZSBhY2N1bXVsYXRlZCBhIHRvdGFsIG9mIDEyOCBkZWNpc2lvbnMsIHN0YXNoIGFuZCBzdGFydCBhZ2FpbiAqLworCWQtPnZbaT4+M10gPSBkZWNpc2lvbnM7IC8qIE5vIG5lZWQgdG8gY2xlYXIsIHRoZSBuZXcgYml0cyB3aWxsIHJlcGxhY2UgdGhlIG9sZCAqLworICAgICAgfQorICAgIH0KKyNpZiAwCisgICAgLyogRXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lIG1ldHJpYyBzcHJlYWQKKyAgICAgKiBUaGUgcmVzdWx0cyBhcmUgZml4ZWQgZm9yIGEgZ2l2ZW4gY29kZSBhbmQgaW5wdXQgc3ltYm9sIHNpemUKKyAgICAgKi8KKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBtaW5fbWV0cmljOworICAgICAgdmVjdG9yIHVuc2lnbmVkIHNob3J0IG1heF9tZXRyaWM7CisgICAgICB1bmlvbiB7IHZlY3RvciB1bnNpZ25lZCBzaG9ydCB2OyB1bnNpZ25lZCBzaG9ydCBzWzhdO30gdDsKKyAgICAgIGludCBtaW5pbXVtLG1heGltdW07CisgICAgICBzdGF0aWMgaW50IG1heF9zcHJlYWQgPSAwOworCisgICAgICBtaW5fbWV0cmljID0gbWF4X21ldHJpYyA9IHZwLT5uZXdfbWV0cmljcy0+dlswXTsKKyAgICAgIGZvcihpPTE7aTwyMDQ4O2krKyl7CisJbWluX21ldHJpYyA9IHZlY19taW4obWluX21ldHJpYyx2cC0+bmV3X21ldHJpY3MtPnZbaV0pOworCW1heF9tZXRyaWMgPSB2ZWNfbWF4KG1heF9tZXRyaWMsdnAtPm5ld19tZXRyaWNzLT52W2ldKTsKKyAgICAgIH0KKyAgICAgIG1pbl9tZXRyaWMgPSB2ZWNfbWluKG1pbl9tZXRyaWMsdmVjX3NsZChtaW5fbWV0cmljLG1pbl9tZXRyaWMsOCkpOworICAgICAgbWF4X21ldHJpYyA9IHZlY19tYXgobWF4X21ldHJpYyx2ZWNfc2xkKG1heF9tZXRyaWMsbWF4X21ldHJpYyw4KSk7CisgICAgICBtaW5fbWV0cmljID0gdmVjX21pbihtaW5fbWV0cmljLHZlY19zbGQobWluX21ldHJpYyxtaW5fbWV0cmljLDQpKTsKKyAgICAgIG1heF9tZXRyaWMgPSB2ZWNfbWF4KG1heF9tZXRyaWMsdmVjX3NsZChtYXhfbWV0cmljLG1heF9tZXRyaWMsNCkpOworICAgICAgbWluX21ldHJpYyA9IHZlY19taW4obWluX21ldHJpYyx2ZWNfc2xkKG1pbl9tZXRyaWMsbWluX21ldHJpYywyKSk7CisgICAgICBtYXhfbWV0cmljID0gdmVjX21heChtYXhfbWV0cmljLHZlY19zbGQobWF4X21ldHJpYyxtYXhfbWV0cmljLDIpKTsKKworICAgICAgdC52ID0gbWluX21ldHJpYzsKKyAgICAgIG1pbmltdW0gPSB0LnNbMF07CisgICAgICB0LnYgPSBtYXhfbWV0cmljOworICAgICAgbWF4aW11bSA9IHQuc1swXTsKKyAgICAgIGlmKG1heGltdW0tbWluaW11bSA+IG1heF9zcHJlYWQpeworCW1heF9zcHJlYWQgPSBtYXhpbXVtLW1pbmltdW07CisJcHJpbnRmKCJtZXRyaWMgc3ByZWFkID0gJWRcbiIsbWF4X3NwcmVhZCk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBSZW5vcm1hbGl6ZSBpZiBuZWNlc3NhcnkuIFRoaXMgZGVzZXJ2ZXMgc29tZSBleHBsYW5hdGlvbi4KKworICAgICAqIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHNwcmVhZCwgZm91bmQgYnkgZXhwZXJpbWVudCwgZm9yIDQtYml0IHN5bWJvbHMgaXMgNDA1OyBmb3IgOCBiaXQgc3ltYm9scywgaXQncyAxMjc1MC4KKyAgICAgKiBTbyBieSBsb29raW5nIGF0IG9uZSBhcmJpdHJhcnkgbWV0cmljIHdlIGNhbiB0ZWxsIGlmIGFueSBvZiB0aGVtIGhhdmUgcG9zc2libHkgc2F0dXJhdGVkLgorICAgICAqIEhvd2V2ZXIsIHRoaXMgaXMgdmVyeSBjb25zZXJ2YXRpdmUuIExhcmdlIHNwcmVhZHMgb2NjdXIgb25seSBhdCB2ZXJ5IGhpZ2ggRWIvTm8sIHdoZXJlCisgICAgICogc2F0dXJhdGluZyBhIGJhZCBwYXRoIG1ldHJpYyBkb2Vzbid0IGRvIG11Y2ggdG8gaW5jcmVhc2UgaXRzIGNoYW5jZXMgb2YgYmVpbmcgZXJyb25lb3VzbHkgY2hvc2VuIGFzIGEgc3Vydml2b3IuCisKKyAgICAgKiBBdCBtb3JlIGludGVyZXN0aW5nIChsb3cpIEViL05vIHJhdGlvcywgdGhlIHNwcmVhZHMgYXJlIG11Y2ggc21hbGxlciBzbyBvdXIgY2hhbmNlcyBvZiBzYXR1cmF0aW5nIGEgbWV0cmljCisgICAgICogYnkgbm90IG5vdCBub3JtYWxpemluZyB3aGVuIHdlIHNob3VsZCBhcmUgZXh0cmVtZWx5IGxvdy4gU28gZWl0aGVyIHdheSwgdGhlIHJpc2sgdG8gcGVyZm9ybWFuY2UgaXMgc21hbGwuCisKKyAgICAgKiBBbGwgdGhpcyBpcyBib3JuZSBvdXQgYnkgZXhwZXJpbWVudC4KKyAgICAgKi8KKyAgICBpZih2cC0+bmV3X21ldHJpY3MtPnNbMF0gPj0gVVNIUlRfTUFYLTEyNzUwKXsKKyAgICAgIHZlY3RvciB1bnNpZ25lZCBzaG9ydCBzY2FsZTsKKyAgICAgIHVuaW9uIHsgdmVjdG9yIHVuc2lnbmVkIHNob3J0IHY7IHVuc2lnbmVkIHNob3J0IHNbOF07fSB0OworICAgICAgCisgICAgICAvKiBGaW5kIHNtYWxsZXN0IG1ldHJpYyBhbmQgc3BsYXQgKi8KKyAgICAgIHNjYWxlID0gdnAtPm5ld19tZXRyaWNzLT52WzBdOworICAgICAgZm9yKGk9MTtpPDIwNDg7aSsrKQorCXNjYWxlID0gdmVjX21pbihzY2FsZSx2cC0+bmV3X21ldHJpY3MtPnZbaV0pOworCisgICAgICBzY2FsZSA9IHZlY19taW4oc2NhbGUsdmVjX3NsZChzY2FsZSxzY2FsZSw4KSk7CisgICAgICBzY2FsZSA9IHZlY19taW4oc2NhbGUsdmVjX3NsZChzY2FsZSxzY2FsZSw0KSk7CisgICAgICBzY2FsZSA9IHZlY19taW4oc2NhbGUsdmVjX3NsZChzY2FsZSxzY2FsZSwyKSk7CisKKyAgICAgIC8qIFN1YnRyYWN0IGl0IGZyb20gYWxsIG1ldHJpY3MKKyAgICAgICAqIFdvcmsgYmFja3dhcmRzIHRvIHRyeSB0byBpbXByb3ZlIHRoZSBjYWNoZSBoaXQgcmF0aW8sIGFzc3VtaW5nIExSVQorICAgICAgICovCisgICAgICBmb3IoaT0yMDQ3O2k+PTA7aS0tKQorCXZwLT5uZXdfbWV0cmljcy0+dltpXSA9IHZlY19zdWJzKHZwLT5uZXdfbWV0cmljcy0+dltpXSxzY2FsZSk7CisgICAgICB0LnYgPSBzY2FsZTsKKyAgICAgIHBhdGhfbWV0cmljICs9IHQuc1swXTsKKyAgICB9CisgICAgZCsrOworICAgIC8qIFN3YXAgcG9pbnRlcnMgdG8gb2xkIGFuZCBuZXcgbWV0cmljcyAqLworICAgIHRtcCA9IHZwLT5vbGRfbWV0cmljczsKKyAgICB2cC0+b2xkX21ldHJpY3MgPSB2cC0+bmV3X21ldHJpY3M7CisgICAgdnAtPm5ld19tZXRyaWNzID0gdG1wOworICB9CisgIHZwLT5kcCA9IGQ7CisgIHJldHVybiBwYXRoX21ldHJpYzsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpNjE1X21teC5jIGIvZmVjL3ZpdGVyYmk2MTVfbW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhNTZmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92aXRlcmJpNjE1X21teC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiBLPTE1IHI9MS82IFZpdGVyYmkgZGVjb2RlciBmb3IgeDg2IE1NWAorICogTWFyIDIwMDQsIFBoaWwgS2FybiwgS0E5UQorICogTWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgKi8KKyNpbmNsdWRlIDxtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIGNbMTYzODRdOyBfX202NCB2WzIwNDhdO30gZGVjaXNpb25fdDsKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBzaG9ydCBzWzE2Mzg0XTsgX19tNjQgdls0MDk2XTt9IG1ldHJpY190OworCitzdGF0aWMgdW5pb24gYnJhbmNodGFiNjE1IHsgdW5zaWduZWQgc2hvcnQgc1s4MTkyXTsgX19tNjQgdlsyMDQ4XTt9IEJyYW5jaHRhYjYxNVs2XTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlciAqLworc3RydWN0IHY2MTUgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIHZvaWQgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICB2b2lkICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmk2MTVfbW14KHZvaWQgKnAsaW50IHN0YXJ0aW5nX3N0YXRlKXsKKyAgc3RydWN0IHY2MTUgKnZwID0gcDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZm9yKGk9MDtpPDE2Mzg0O2krKykKKyAgICB2cC0+bWV0cmljczEuc1tpXSA9IDUwMDA7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5zW3N0YXJ0aW5nX3N0YXRlICYgMTYzODNdID0gMDsgLyogQmlhcyBrbm93biBzdGFydCBzdGF0ZSAqLworICByZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgVml0ZXJiaSBkZWNvZGVyICovCit2b2lkICpjcmVhdGVfdml0ZXJiaTYxNV9tbXgoaW50IGxlbil7CisgIHN0cnVjdCB2NjE1ICp2cDsKKworICBpZighSW5pdCl7CisgICAgaW50IHBvbHlzWzZdID0geyBWNjE1UE9MWUEsVjYxNVBPTFlCLFY2MTVQT0xZQyxWNjE1UE9MWUQsVjYxNVBPTFlFLFY2MTVQT0xZRiB9OworICAgIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWxfbW14KHBvbHlzKTsKKyAgfQorCisgIGlmKCh2cCA9IChzdHJ1Y3QgdjYxNSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHY2MTUpKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYoKHZwLT5kZWNpc2lvbnMgPSBtYWxsb2MoKGxlbisxNCkqc2l6ZW9mKGRlY2lzaW9uX3QpKSkgPT0gTlVMTCl7CisgICAgZnJlZSh2cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5pdF92aXRlcmJpNjE1X21teCh2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWxfbW14KGludCBwb2x5c1s2XSl7CisgIGludCBzdGF0ZTsKKyAgaW50IGk7CisKKyAgZm9yKHN0YXRlPTA7c3RhdGUgPCA4MTkyO3N0YXRlKyspeworICAgIGZvcihpPTA7aTw2O2krKykKKyAgICAgIEJyYW5jaHRhYjYxNVtpXS5zW3N0YXRlXSA9IChwb2x5c1tpXSA8IDApIF4gcGFyaXR5KCgyKnN0YXRlKSAmIGFicyhwb2x5c1tpXSkpID8gMjU1IDogMDsKKyAgfQorICBJbml0Kys7Cit9CisKKy8qIFZpdGVyYmkgY2hhaW5iYWNrICovCitpbnQgY2hhaW5iYWNrX3ZpdGVyYmk2MTVfbW14KAorICAgICAgdm9pZCAqcCwKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIC8qIERlY29kZWQgb3V0cHV0IGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGludCBuYml0cywgLyogTnVtYmVyIG9mIGRhdGEgYml0cyAqLworICAgICAgdW5zaWduZWQgaW50IGVuZHN0YXRlKXsgLyogVGVybWluYWwgZW5jb2RlciBzdGF0ZSAqLworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRlY2lzaW9uczsKKyAgCisgIGVuZHN0YXRlICU9IDE2Mzg0OworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDE0OyAvKiBMb29rIHBhc3QgdGFpbCAqLworICB3aGlsZShuYml0cy0tICE9IDApeworICAgIGludCBrOworCisgICAgayA9IGRbbmJpdHNdLmNbZW5kc3RhdGVdICYgMTsKKyAgICBlbmRzdGF0ZSA9IChrIDw8IDEzKSB8IChlbmRzdGF0ZSA+PiAxKTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID4+IDY7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTYxNV9tbXgodm9pZCAqcCl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisKKyAgaWYodnAgIT0gTlVMTCl7CisgICAgZnJlZSh2cC0+ZGVjaXNpb25zKTsKKyAgICBmcmVlKHZwKTsKKyAgfQorfQorCisKK2ludCB1cGRhdGVfdml0ZXJiaTYxNV9ibGtfbW14KHZvaWQgKnAsdW5zaWduZWQgY2hhciAqc3ltcyxpbnQgbmJpdHMpeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworICBkZWNpc2lvbl90ICpkOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworICAKKyAgd2hpbGUobmJpdHMtLSl7CisgICAgX19tNjQgc3ltMHYsc3ltMXYsc3ltMnYsc3ltM3Ysc3ltNHYsc3ltNXY7CisgICAgdm9pZCAqdG1wOworICAgIGludCBpOworICAgIAorICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX3BpMTYoc3ltc1swXSk7CisgICAgc3ltMXYgPSBfbW1fc2V0MV9waTE2KHN5bXNbMV0pOworICAgIHN5bTJ2ID0gX21tX3NldDFfcGkxNihzeW1zWzJdKTsKKyAgICBzeW0zdiA9IF9tbV9zZXQxX3BpMTYoc3ltc1szXSk7CisgICAgc3ltNHYgPSBfbW1fc2V0MV9waTE2KHN5bXNbNF0pOworICAgIHN5bTV2ID0gX21tX3NldDFfcGkxNihzeW1zWzVdKTsKKyAgICBzeW1zICs9IDY7CisKKyAgICBmb3IoaT0wO2k8MjA0ODtpKyspeworICAgICAgX19tNjQgZGVjaXNpb24wLGRlY2lzaW9uMSxtZXRyaWMsbV9tZXRyaWMsbTAsbTEsbTIsbTMsc3Vydml2b3IwLHN1cnZpdm9yMTsKKworICAgICAgLyogRm9ybSBicmFuY2ggbWV0cmljcworICAgICAgICogQmVjYXVzZSBCcmFuY2h0YWIgdGFrZXMgb24gdmFsdWVzIDAgYW5kIDI1NSwgYW5kIHRoZSB2YWx1ZXMgb2Ygc3ltP3YgYXJlIG9mZnNldCBiaW5hcnkgaW4gdGhlIHJhbmdlIDAtMjU1LAorICAgICAgICogdGhlIFhPUiBvcGVyYXRpb25zIGNvbnN0aXR1dGUgY29uZGl0aW9uYWwgbmVnYXRpb24uCisgICAgICAgKiBtZXRyaWMgYW5kIG1fbWV0cmljICgtbWV0cmljKSBhcmUgaW4gdGhlIHJhbmdlIDAtMTUzMAorICAgICAgICovCisgICAgICBtMCA9IF9tbV9hZGRfcGkxNihfbW1feG9yX3NpNjQoQnJhbmNodGFiNjE1WzBdLnZbaV0sc3ltMHYpLF9tbV94b3Jfc2k2NChCcmFuY2h0YWI2MTVbMV0udltpXSxzeW0xdikpOworICAgICAgbTEgPSBfbW1fYWRkX3BpMTYoX21tX3hvcl9zaTY0KEJyYW5jaHRhYjYxNVsyXS52W2ldLHN5bTJ2KSxfbW1feG9yX3NpNjQoQnJhbmNodGFiNjE1WzNdLnZbaV0sc3ltM3YpKTsKKyAgICAgIG0yID0gX21tX2FkZF9waTE2KF9tbV94b3Jfc2k2NChCcmFuY2h0YWI2MTVbNF0udltpXSxzeW00diksX21tX3hvcl9zaTY0KEJyYW5jaHRhYjYxNVs1XS52W2ldLHN5bTV2KSk7CisgICAgICBtZXRyaWMgPSBfbW1fYWRkX3BpMTYobTAsX21tX2FkZF9waTE2KG0xLG0yKSk7CisgICAgICBtX21ldHJpYyA9IF9tbV9zdWJfcGkxNihfbW1fc2V0MV9waTE2KDE1MzApLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IF9tbV9hZGRfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbaV0sbWV0cmljKTsKKyAgICAgIG0zID0gX21tX2FkZF9waTE2KHZwLT5vbGRfbWV0cmljcy0+dlsyMDQ4K2ldLG1ldHJpYyk7CisgICAgICBtMSA9IF9tbV9hZGRfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMjA0OCtpXSxtX21ldHJpYyk7CisgICAgICBtMiA9IF9tbV9hZGRfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbaV0sbV9tZXRyaWMpOworICAgIAorICAgICAgLyogQ29tcGFyZSBhbmQgc2VsZWN0CisgICAgICAgKiBUaGVyZSdzIG5vIHBhY2tlZCBtaW4gaW5zdHJ1Y3Rpb24gaW4gTU1YLCBzbyB3ZSB1c2UgbW9kdWxvIGFyaXRobWV0aWMKKyAgICAgICAqIHRvIGZvcm0gdGhlIGRlY2lzaW9ucyBhbmQgdGhlbiBkbyB0aGUgc2VsZWN0IHRoZSBoYXJkIHdheQorICAgICAgICovCisgICAgICBkZWNpc2lvbjAgPSBfbW1fY21wZ3RfcGkxNihfbW1fc3ViX3BpMTYobTAsbTEpLF9tbV9zZXR6ZXJvX3NpNjQoKSk7CisgICAgICBkZWNpc2lvbjEgPSBfbW1fY21wZ3RfcGkxNihfbW1fc3ViX3BpMTYobTIsbTMpLF9tbV9zZXR6ZXJvX3NpNjQoKSk7CisgICAgICBzdXJ2aXZvcjAgPSBfbW1fb3Jfc2k2NChfbW1fYW5kX3NpNjQoZGVjaXNpb24wLG0xKSxfbW1fYW5kbm90X3NpNjQoZGVjaXNpb24wLG0wKSk7CisgICAgICBzdXJ2aXZvcjEgPSBfbW1fb3Jfc2k2NChfbW1fYW5kX3NpNjQoZGVjaXNpb24xLG0zKSxfbW1fYW5kbm90X3NpNjQoZGVjaXNpb24xLG0yKSk7CisgCisgICAgICAvKiBNZXJnZSBkZWNpc2lvbnMgYW5kIHN0b3JlIGFzIGJ5dGVzICovCisgICAgICBkLT52W2ldID0gX21tX3VucGFja2xvX3BpOChfbW1fcGFja3NfcGkxNihkZWNpc2lvbjAsX21tX3NldHplcm9fc2k2NCgpKSxfbW1fcGFja3NfcGkxNihkZWNpc2lvbjEsX21tX3NldHplcm9fc2k2NCgpKSk7CisKKyAgICAgIC8qIFN0b3JlIHN1cnZpdmluZyBtZXRyaWNzICovCisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IF9tbV91bnBhY2tsb19waTE2KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaSsxXSA9IF9tbV91bnBhY2toaV9waTE2KHN1cnZpdm9yMCxzdXJ2aXZvcjEpOworICAgIH0KKyAgICBkKys7CisgICAgLyogU3dhcCBwb2ludGVycyB0byBvbGQgYW5kIG5ldyBtZXRyaWNzICovCisgICAgdG1wID0gdnAtPm9sZF9tZXRyaWNzOworICAgIHZwLT5vbGRfbWV0cmljcyA9IHZwLT5uZXdfbWV0cmljczsKKyAgICB2cC0+bmV3X21ldHJpY3MgPSB0bXA7CisgIH0KKyAgdnAtPmRwID0gZDsKKyAgX21tX2VtcHR5KCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmVjL3ZpdGVyYmk2MTVfcG9ydC5jIGIvZmVjL3ZpdGVyYmk2MTVfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmRkODAKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTYxNV9wb3J0LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIEs9MTUgcj0xLzYgVml0ZXJiaSBkZWNvZGVyIGluIHBvcnRhYmxlIEMKKyAqIENvcHlyaWdodCBNYXIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbNTEyXTsgdW5zaWduZWQgY2hhciBjWzIwNDhdO30gZGVjaXNpb25fdDsKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbMTYzODRdOyB9IG1ldHJpY190OworCitzdGF0aWMgdW5pb24gYnJhbmNodGFiNjE1IHsgdW5zaWduZWQgbG9uZyB3WzgxOTJdOyB9IEJyYW5jaHRhYjYxNVs2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlciAqLworc3RydWN0IHY2MTUgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIGRlY2lzaW9uX3QgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICBkZWNpc2lvbl90ICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmk2MTVfcG9ydChpbnQgbGVuKXsKKyAgc3RydWN0IHY2MTUgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbNl0gPSB7IFY2MTVQT0xZQSxWNjE1UE9MWUIsVjYxNVBPTFlDLFY2MTVQT0xZRCxWNjE1UE9MWUUsVjYxNVBPTFlGIH07CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9wb3J0KHBvbHlzKTsKKyAgfQorICBpZigodnAgPSAoc3RydWN0IHY2MTUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2NjE1KSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmKCh2cC0+ZGVjaXNpb25zID0gbWFsbG9jKChsZW4rMTQpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGluaXRfdml0ZXJiaTYxNSh2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWxfcG9ydChpbnQgcG9seXNbNl0peworICBpbnQgc3RhdGU7CisgIGludCBpOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgODE5MjtzdGF0ZSsrKXsKKyAgICBmb3IoaT0wO2k8NjtpKyspCisgICAgICBCcmFuY2h0YWI2MTVbaV0ud1tzdGF0ZV0gPSAocG9seXNbaV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbaV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpNjE1X3BvcnQodm9pZCAqcCxpbnQgc3RhcnRpbmdfc3RhdGUpeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworICBpbnQgaTsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBmb3IoaT0wO2k8MTYzODQ7aSsrKQorICAgIHZwLT5tZXRyaWNzMS53W2ldID0gMTAwMDsKKworICB2cC0+b2xkX21ldHJpY3MgPSAmdnAtPm1ldHJpY3MxOworICB2cC0+bmV3X21ldHJpY3MgPSAmdnAtPm1ldHJpY3MyOworICB2cC0+ZHAgPSB2cC0+ZGVjaXNpb25zOworICB2cC0+b2xkX21ldHJpY3MtPndbc3RhcnRpbmdfc3RhdGUgJiAxNjM4M10gPSAwOyAvKiBCaWFzIGtub3duIHN0YXJ0IHN0YXRlICovCisgIHJldHVybiAwOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpNjE1X3BvcnQoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQ7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRlY2lzaW9uczsgIAorICBlbmRzdGF0ZSAlPSAxNjM4NDsKKworICAvKiBUaGUgc3RvcmUgaW50byBkYXRhW10gb25seSBuZWVkcyB0byBiZSBkb25lIGV2ZXJ5IDggYml0cy4KKyAgICogQnV0IHRoaXMgYXZvaWRzIGEgY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgdGhlIHdyaXRlcyB3aWxsCisgICAqIGNvbWJpbmUgaW4gdGhlIGNhY2hlIGFueXdheQorICAgKi8KKyAgZCArPSAxNDsgLyogTG9vayBwYXN0IHRhaWwgKi8KKyAgd2hpbGUobmJpdHMtLSAhPSAwKXsKKyAgICBpbnQgazsKKworICAgIGsgPSAoZFtuYml0c10uY1tlbmRzdGF0ZS84XSA+PiAoZW5kc3RhdGUlOCkpICYgMTsKKyAgICBlbmRzdGF0ZSA9IChrIDw8IDEzKSB8IChlbmRzdGF0ZSA+PiAxKTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID4+IDY7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTYxNV9wb3J0KHZvaWQgKnApeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KKworLyogQy1sYW5ndWFnZSBidXR0ZXJmbHkgKi8KKyNkZWZpbmUgQkZMWShpKSB7XAordW5zaWduZWQgbG9uZyBtZXRyaWMsbTAsbTEsbTIsbTMsZGVjaXNpb24wLGRlY2lzaW9uMTtcCisgICAgbWV0cmljID0gKChCcmFuY2h0YWI2MTVbMF0ud1tpXSBeIHN5bXNbMF0pICsgKEJyYW5jaHRhYjYxNVsxXS53W2ldIF4gc3ltc1sxXSlcCisJICAgICAgKyhCcmFuY2h0YWI2MTVbMl0ud1tpXSBeIHN5bXNbMl0pICsgKEJyYW5jaHRhYjYxNVszXS53W2ldIF4gc3ltc1szXSlcCisJICAgICAgKyhCcmFuY2h0YWI2MTVbNF0ud1tpXSBeIHN5bXNbNF0pICsgKEJyYW5jaHRhYjYxNVs1XS53W2ldIF4gc3ltc1s1XSkpO1wKKyAgICBtMCA9IHZwLT5vbGRfbWV0cmljcy0+d1tpXSArIG1ldHJpYztcCisgICAgbTEgPSB2cC0+b2xkX21ldHJpY3MtPndbaSs4MTkyXSArICgxNTMwIC0gbWV0cmljKTtcCisgICAgbTIgPSB2cC0+b2xkX21ldHJpY3MtPndbaV0gKyAoMTUzMC1tZXRyaWMpO1wKKyAgICBtMyA9IHZwLT5vbGRfbWV0cmljcy0+d1tpKzgxOTJdICsgbWV0cmljO1wKKyAgICBkZWNpc2lvbjAgPSAoc2lnbmVkIGxvbmcpKG0wLW0xKSA+PSAwO1wKKyAgICBkZWNpc2lvbjEgPSAoc2lnbmVkIGxvbmcpKG0yLW0zKSA+PSAwO1wKKyAgICB2cC0+bmV3X21ldHJpY3MtPndbMippXSA9IGRlY2lzaW9uMCA/IG0xIDogbTA7XAorICAgIHZwLT5uZXdfbWV0cmljcy0+d1syKmkrMV0gPSBkZWNpc2lvbjEgPyBtMyA6IG0yO1wKKyAgICBkLT5jW2kvNF0gfD0gKChkZWNpc2lvbjB8KGRlY2lzaW9uMTw8MSkpIDw8ICgoMippKSY3KSk7XAorfQorLyogVXBkYXRlIGRlY29kZXIgd2l0aCBhIGJsb2NrIG9mIGRlbW9kdWxhdGVkIHN5bWJvbHMKKyAqIE5vdGUgdGhhdCBuYml0cyBpcyB0aGUgbnVtYmVyIG9mIGRlY29kZWQgZGF0YSBiaXRzLCBub3QgdGhlIG51bWJlcgorICogb2Ygc3ltYm9scyEKKyAqLworCitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3BvcnQodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIHZvaWQgKnRtcDsKKyAgZGVjaXNpb25fdCAqZDsKKyAgaW50IGk7CisKKyAgaWYocCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgZCA9IChkZWNpc2lvbl90ICopdnAtPmRwOworICB3aGlsZShuYml0cy0tKXsKKyAgICBtZW1zZXQoZCwwLHNpemVvZihkZWNpc2lvbl90KSk7CisgICAgZm9yKGk9MDtpPDgxOTI7aSsrKQorICAgICAgQkZMWShpKTsKKworICAgIHN5bXMgKz0gNjsKKyAgICBkKys7CisgICAgLyogU3dhcCBwb2ludGVycyB0byBvbGQgYW5kIG5ldyBtZXRyaWNzICovCisgICAgdG1wID0gdnAtPm9sZF9tZXRyaWNzOworICAgIHZwLT5vbGRfbWV0cmljcyA9IHZwLT5uZXdfbWV0cmljczsKKyAgICB2cC0+bmV3X21ldHJpY3MgPSB0bXA7CisgIH0gICAgCisgIHZwLT5kcCA9IGQ7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mZWMvdml0ZXJiaTYxNV9zc2UuYyBiL2ZlYy92aXRlcmJpNjE1X3NzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGY4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9mZWMvdml0ZXJiaTYxNV9zc2UuYwpAQCAtMCwwICsxLDIwMSBAQAorLyogSz0xNSByPTEvNiBWaXRlcmJpIGRlY29kZXIgZm9yIHg4NiBTU0UKKyAqIENvcHlyaWdodCBNYXIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbNTEyXTsgdW5zaWduZWQgY2hhciBjWzIwNDhdO30gZGVjaXNpb25fdDsKK3R5cGVkZWYgdW5pb24geyBzaWduZWQgc2hvcnQgc1sxNjM4NF07IF9fbTY0IHZbNDA5Nl07fSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjYxNSB7IHVuc2lnbmVkIHNob3J0IHNbODE5Ml07IF9fbTY0IHZbMjA0OF07fSBCcmFuY2h0YWI2MTVbNl07CitzdGF0aWMgaW50IEluaXQgPSAwOworCisvKiBTdGF0ZSBpbmZvIGZvciBpbnN0YW5jZSBvZiBWaXRlcmJpIGRlY29kZXIgKi8KK3N0cnVjdCB2NjE1IHsKKyAgbWV0cmljX3QgbWV0cmljczE7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAxICovCisgIG1ldHJpY190IG1ldHJpY3MyOyAvKiBwYXRoIG1ldHJpYyBidWZmZXIgMiAqLworICB2b2lkICpkcDsgICAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IGRlY2lzaW9uICovCisgIG1ldHJpY190ICpvbGRfbWV0cmljcywqbmV3X21ldHJpY3M7IC8qIFBvaW50ZXJzIHRvIHBhdGggbWV0cmljcywgc3dhcHBlZCBvbiBldmVyeSBiaXQgKi8KKyAgdm9pZCAqZGVjaXNpb25zOyAgIC8qIEJlZ2lubmluZyBvZiBkZWNpc2lvbnMgZm9yIGJsb2NrICovCit9OworCisvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciBmb3Igc3RhcnQgb2YgbmV3IGZyYW1lICovCitpbnQgaW5pdF92aXRlcmJpNjE1X3NzZSh2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGZvcihpPTA7aTwxNjM4NDtpKyspCisgICAgdnAtPm1ldHJpY3MxLnNbaV0gPSAoU0hSVF9NSU4rNTAwMCk7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5zW3N0YXJ0aW5nX3N0YXRlICYgMTYzODNdID0gU0hSVF9NSU47IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmk2MTVfc3NlKGludCBsZW4peworICBzdHJ1Y3QgdjYxNSAqdnA7CisKKyAgaWYoIUluaXQpeworICAgIGludCBwb2x5c1s2XSA9IHsgVjYxNVBPTFlBLFY2MTVQT0xZQixWNjE1UE9MWUMsVjYxNVBPTFlELFY2MTVQT0xZRSxWNjE1UE9MWUYgfTsKKyAgICBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX3NzZShwb2x5cyk7CisgIH0KKworICBpZigodnAgPSAoc3RydWN0IHY2MTUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB2NjE1KSkpID09IE5VTEwpeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmKCh2cC0+ZGVjaXNpb25zID0gbWFsbG9jKChsZW4rMTQpKnNpemVvZihkZWNpc2lvbl90KSkpID09IE5VTEwpeworICAgIGZyZWUodnApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGluaXRfdml0ZXJiaTYxNV9zc2UodnAsMCk7CisgIHJldHVybiB2cDsKK30KKwordm9pZCBzZXRfdml0ZXJiaTYxNV9wb2x5bm9taWFsX3NzZShpbnQgcG9seXNbNl0peworICBpbnQgc3RhdGU7CisgIGludCBpOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgODE5MjtzdGF0ZSsrKXsKKyAgICBmb3IoaT0wO2k8NjtpKyspCisgICAgICBCcmFuY2h0YWI2MTVbaV0uc1tzdGF0ZV0gPSAocG9seXNbaV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbaV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpNjE1X3NzZSgKKyAgICAgIHZvaWQgKnAsCisgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCAvKiBEZWNvZGVkIG91dHB1dCBkYXRhICovCisgICAgICB1bnNpZ25lZCBpbnQgbmJpdHMsIC8qIE51bWJlciBvZiBkYXRhIGJpdHMgKi8KKyAgICAgIHVuc2lnbmVkIGludCBlbmRzdGF0ZSl7IC8qIFRlcm1pbmFsIGVuY29kZXIgc3RhdGUgKi8KKyAgc3RydWN0IHY2MTUgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBkID0gKGRlY2lzaW9uX3QgKil2cC0+ZGVjaXNpb25zOyAgCisgIGVuZHN0YXRlICU9IDE2Mzg0OworCisgIC8qIFRoZSBzdG9yZSBpbnRvIGRhdGFbXSBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgZXZlcnkgOCBiaXRzLgorICAgKiBCdXQgdGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbCBicmFuY2gsIGFuZCB0aGUgd3JpdGVzIHdpbGwKKyAgICogY29tYmluZSBpbiB0aGUgY2FjaGUgYW55d2F5CisgICAqLworICBkICs9IDE0OyAvKiBMb29rIHBhc3QgdGFpbCAqLworICB3aGlsZShuYml0cy0tICE9IDApeworICAgIGludCBrOworCisgICAgLyogICAgayA9IChkW25iaXRzXS53W2VuZHN0YXRlLzMyXSA+PiAoZW5kc3RhdGUlMzIpKSAmIDE7Ki8KKyAgICBrID0gKGRbbmJpdHNdLmNbZW5kc3RhdGUvOF0gPj4gKGVuZHN0YXRlJTgpKSAmIDE7CisgICAgZW5kc3RhdGUgPSAoayA8PCAxMykgfCAoZW5kc3RhdGUgPj4gMSk7CisgICAgZGF0YVtuYml0cz4+M10gPSBlbmRzdGF0ZSA+PiA2OworICB9CisgIHJldHVybiAwOworfQorCisvKiBEZWxldGUgaW5zdGFuY2Ugb2YgYSBWaXRlcmJpIGRlY29kZXIgKi8KK3ZvaWQgZGVsZXRlX3ZpdGVyYmk2MTVfc3NlKHZvaWQgKnApeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KKworCitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3NzZSh2b2lkICpwLHVuc2lnbmVkIGNoYXIgKnN5bXMsaW50IG5iaXRzKXsKKyAgc3RydWN0IHY2MTUgKnZwID0gcDsKKyAgZGVjaXNpb25fdCAqZDsKKworICBpZihwID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBkID0gKGRlY2lzaW9uX3QgKil2cC0+ZHA7CisgIHdoaWxlKG5iaXRzLS0peworICAgIF9fbTY0IHN5bTB2LHN5bTF2LHN5bTJ2LHN5bTN2LHN5bTR2LHN5bTV2OworICAgIHZvaWQgKnRtcDsKKyAgICBpbnQgaTsKKworICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX3BpMTYoc3ltc1swXSk7CisgICAgc3ltMXYgPSBfbW1fc2V0MV9waTE2KHN5bXNbMV0pOworICAgIHN5bTJ2ID0gX21tX3NldDFfcGkxNihzeW1zWzJdKTsKKyAgICBzeW0zdiA9IF9tbV9zZXQxX3BpMTYoc3ltc1szXSk7CisgICAgc3ltNHYgPSBfbW1fc2V0MV9waTE2KHN5bXNbNF0pOworICAgIHN5bTV2ID0gX21tX3NldDFfcGkxNihzeW1zWzVdKTsKKyAgICBzeW1zICs9IDY7CisKKyAgICBmb3IoaT0wO2k8MjA0ODtpKyspeworICAgICAgX19tNjQgZGVjaXNpb24wLGRlY2lzaW9uMSxtZXRyaWMsbV9tZXRyaWMsbTAsbTEsbTIsbTMsc3Vydml2b3IwLHN1cnZpdm9yMTsKKworICAgICAgLyogRm9ybSBicmFuY2ggbWV0cmljcworICAgICAgICogQmVjYXVzZSBCcmFuY2h0YWIgdGFrZXMgb24gdmFsdWVzIDAgYW5kIDI1NSwgYW5kIHRoZSB2YWx1ZXMgb2Ygc3ltP3YgYXJlIG9mZnNldCBiaW5hcnkgaW4gdGhlIHJhbmdlIDAtMjU1LAorICAgICAgICogdGhlIFhPUiBvcGVyYXRpb25zIGNvbnN0aXR1dGUgY29uZGl0aW9uYWwgbmVnYXRpb24uCisgICAgICAgKiBtZXRyaWMgYW5kIG1fbWV0cmljICgtbWV0cmljKSBhcmUgaW4gdGhlIHJhbmdlIDAtMTUzMAorICAgICAgICovCisgICAgICBtMCA9IF9tbV9hZGRfcGkxNihfbW1feG9yX3NpNjQoQnJhbmNodGFiNjE1WzBdLnZbaV0sc3ltMHYpLF9tbV94b3Jfc2k2NChCcmFuY2h0YWI2MTVbMV0udltpXSxzeW0xdikpOworICAgICAgbTEgPSBfbW1fYWRkX3BpMTYoX21tX3hvcl9zaTY0KEJyYW5jaHRhYjYxNVsyXS52W2ldLHN5bTJ2KSxfbW1feG9yX3NpNjQoQnJhbmNodGFiNjE1WzNdLnZbaV0sc3ltM3YpKTsKKyAgICAgIG0yID0gX21tX2FkZF9waTE2KF9tbV94b3Jfc2k2NChCcmFuY2h0YWI2MTVbNF0udltpXSxzeW00diksX21tX3hvcl9zaTY0KEJyYW5jaHRhYjYxNVs1XS52W2ldLHN5bTV2KSk7CisgICAgICBtZXRyaWMgPSBfbW1fYWRkX3BpMTYobTAsX21tX2FkZF9waTE2KG0xLG0yKSk7CisgICAgICBtX21ldHJpYyA9IF9tbV9zdWJfcGkxNihfbW1fc2V0MV9waTE2KDE1MzApLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52W2ldLG1ldHJpYyk7CisgICAgICBtMyA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52WzIwNDgraV0sbWV0cmljKTsKKyAgICAgIG0xID0gX21tX2FkZHNfcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMjA0OCtpXSxtX21ldHJpYyk7CisgICAgICBtMiA9IF9tbV9hZGRzX3BpMTYodnAtPm9sZF9tZXRyaWNzLT52W2ldLG1fbWV0cmljKTsKKyAgICAKKyAgICAgIC8qIENvbXBhcmUgYW5kIHNlbGVjdCAqLworICAgICAgc3Vydml2b3IwID0gX21tX21pbl9waTE2KG0wLG0xKTsKKyAgICAgIHN1cnZpdm9yMSA9IF9tbV9taW5fcGkxNihtMixtMyk7CisgICAgICBkZWNpc2lvbjAgPSBfbW1fY21wZXFfcGkxNihzdXJ2aXZvcjAsbTEpOworICAgICAgZGVjaXNpb24xID0gX21tX2NtcGVxX3BpMTYoc3Vydml2b3IxLG0zKTsKKyAKKyAgICAgIC8qIFBhY2sgZGVjaXNpb25zIGludG8gOCBiaXRzIGFuZCBzdG9yZSAqLworICAgICAgZC0+Y1tpXSA9IF9tbV9tb3ZlbWFza19waTgoX21tX3VucGFja2xvX3BpOChfbW1fcGFja3NfcGkxNihkZWNpc2lvbjAsX21tX3NldHplcm9fc2k2NCgpKSxfbW1fcGFja3NfcGkxNihkZWNpc2lvbjEsX21tX3NldHplcm9fc2k2NCgpKSkpOworCisgICAgICAvKiBTdG9yZSBzdXJ2aXZpbmcgbWV0cmljcyAqLworICAgICAgdnAtPm5ld19tZXRyaWNzLT52WzIqaV0gPSBfbW1fdW5wYWNrbG9fcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyKmkrMV0gPSBfbW1fdW5wYWNraGlfcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICB9CisgICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gcmVub3JtYWxpemUKKyAgICAgKiBNYXggbWV0cmljIHNwcmVhZCBmb3IgdGhpcyBjb2RlIHdpdGggMC0yNTUgYnJhbmNoIG1ldHJpY3MgaXMgMTI3NTAKKyAgICAgKi8KKyAgICBpZih2cC0+bmV3X21ldHJpY3MtPnNbMF0gPj0gU0hSVF9NQVgtMTI3NTApeworICAgICAgaW50IGksYWRqdXN0OworICAgICAgX19tNjQgYWRqdXN0djsKKyAgICAgIHVuaW9uIHsgX19tNjQgdjsgc2lnbmVkIHNob3J0IHdbNF07IH0gdDsKKworICAgICAgLyogRmluZCBzbWFsbGVzdCBtZXRyaWMgYW5kIHNldCBhZGp1c3R2IHRvIGJyaW5nIGl0IGRvd24gdG8gU0hSVF9NSU4gKi8KKyAgICAgIGFkanVzdHYgPSB2cC0+bmV3X21ldHJpY3MtPnZbMF07CisgICAgICBmb3IoaT0xO2k8NDA5NjtpKyspCisJYWRqdXN0diA9IF9tbV9taW5fcGkxNihhZGp1c3R2LHZwLT5uZXdfbWV0cmljcy0+dltpXSk7CisKKyAgICAgIGFkanVzdHYgPSBfbW1fbWluX3BpMTYoYWRqdXN0dixfbW1fc3JsaV9zaTY0KGFkanVzdHYsMzIpKTsKKyAgICAgIGFkanVzdHYgPSBfbW1fbWluX3BpMTYoYWRqdXN0dixfbW1fc3JsaV9zaTY0KGFkanVzdHYsMTYpKTsgICAgCisgICAgICB0LnYgPSBhZGp1c3R2OworICAgICAgYWRqdXN0ID0gdC53WzBdIC0gU0hSVF9NSU47CisgICAgICBhZGp1c3R2ID0gX21tX3NldDFfcGkxNihhZGp1c3QpOworICAgICAgCisgICAgICBmb3IoaT0wO2k8NDA5NjtpKyspCisJdnAtPm5ld19tZXRyaWNzLT52W2ldID0gX21tX3N1Yl9waTE2KHZwLT5uZXdfbWV0cmljcy0+dltpXSxhZGp1c3R2KTsKKyAgICB9CisgICAgZCsrOworICAgIC8qIFN3YXAgcG9pbnRlcnMgdG8gb2xkIGFuZCBuZXcgbWV0cmljcyAqLworICAgIHRtcCA9IHZwLT5vbGRfbWV0cmljczsKKyAgICB2cC0+b2xkX21ldHJpY3MgPSB2cC0+bmV3X21ldHJpY3M7CisgICAgdnAtPm5ld19tZXRyaWNzID0gdG1wOworICB9CisgIHZwLT5kcCA9IGQ7CisgIF9tbV9lbXB0eSgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZlYy92aXRlcmJpNjE1X3NzZTIuYyBiL2ZlYy92aXRlcmJpNjE1X3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjcxMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmVjL3ZpdGVyYmk2MTVfc3NlMi5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBLPTE1IHI9MS82IFZpdGVyYmkgZGVjb2RlciBmb3IgeDg2IFNTRTIKKyAqIENvcHlyaWdodCBNYXIgMjAwNCwgUGhpbCBLYXJuLCBLQTlRCisgKiBNYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAqLworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBsb25nIHdbNTEyXTsgdW5zaWduZWQgc2hvcnQgc1sxMDI0XTt9IGRlY2lzaW9uX3Q7Cit0eXBlZGVmIHVuaW9uIHsgc2lnbmVkIHNob3J0IHNbMTYzODRdOyBfX20xMjhpIHZbMjA0OF07fSBtZXRyaWNfdDsKKworc3RhdGljIHVuaW9uIGJyYW5jaHRhYjYxNSB7IHVuc2lnbmVkIHNob3J0IHNbODE5Ml07IF9fbTEyOGkgdlsxMDI0XTt9IEJyYW5jaHRhYjYxNVs2XTsKK3N0YXRpYyBpbnQgSW5pdCA9IDA7CisKKy8qIFN0YXRlIGluZm8gZm9yIGluc3RhbmNlIG9mIFZpdGVyYmkgZGVjb2RlciAqLworc3RydWN0IHY2MTUgeworICBtZXRyaWNfdCBtZXRyaWNzMTsgLyogcGF0aCBtZXRyaWMgYnVmZmVyIDEgKi8KKyAgbWV0cmljX3QgbWV0cmljczI7IC8qIHBhdGggbWV0cmljIGJ1ZmZlciAyICovCisgIHZvaWQgKmRwOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgZGVjaXNpb24gKi8KKyAgbWV0cmljX3QgKm9sZF9tZXRyaWNzLCpuZXdfbWV0cmljczsgLyogUG9pbnRlcnMgdG8gcGF0aCBtZXRyaWNzLCBzd2FwcGVkIG9uIGV2ZXJ5IGJpdCAqLworICB2b2lkICpkZWNpc2lvbnM7ICAgLyogQmVnaW5uaW5nIG9mIGRlY2lzaW9ucyBmb3IgYmxvY2sgKi8KK307CisKKy8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyIGZvciBzdGFydCBvZiBuZXcgZnJhbWUgKi8KK2ludCBpbml0X3ZpdGVyYmk2MTVfc3NlMih2b2lkICpwLGludCBzdGFydGluZ19zdGF0ZSl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGludCBpOworCisgIGlmKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGZvcihpPTA7aTwxNjM4NDtpKyspCisgICAgdnAtPm1ldHJpY3MxLnNbaV0gPSAoU0hSVF9NSU4rNTAwMCk7CisKKyAgdnAtPm9sZF9tZXRyaWNzID0gJnZwLT5tZXRyaWNzMTsKKyAgdnAtPm5ld19tZXRyaWNzID0gJnZwLT5tZXRyaWNzMjsKKyAgdnAtPmRwID0gdnAtPmRlY2lzaW9uczsKKyAgdnAtPm9sZF9tZXRyaWNzLT5zW3N0YXJ0aW5nX3N0YXRlICYgMTYzODNdID0gU0hSVF9NSU47IC8qIEJpYXMga25vd24gc3RhcnQgc3RhdGUgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCAqY3JlYXRlX3ZpdGVyYmk2MTVfc3NlMihpbnQgbGVuKXsKKyAgdm9pZCAqcDsKKyAgc3RydWN0IHY2MTUgKnZwOworCisgIGlmKCFJbml0KXsKKyAgICBpbnQgcG9seXNbNl0gPSB7IFY2MTVQT0xZQSxWNjE1UE9MWUIsVjYxNVBPTFlDLFY2MTVQT0xZRCxWNjE1UE9MWUUsVjYxNVBPTFlGIH07CisgICAgc2V0X3ZpdGVyYmk2MTVfcG9seW5vbWlhbF9zc2UyKHBvbHlzKTsKKyAgfQorCisgIC8qIE9yZGluYXJ5IG1hbGxvYygpIG9ubHkgcmV0dXJucyA4LWJ5dGUgYWxpZ25tZW50LCB3ZSBuZWVkIDE2ICovCisgIGlmKHBvc2l4X21lbWFsaWduKCZwLCBzaXplb2YoX19tMTI4aSksc2l6ZW9mKHN0cnVjdCB2NjE1KSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdnAgPSAoc3RydWN0IHY2MTUgKilwOworICBpZigocCA9IG1hbGxvYygobGVuKzE0KSpzaXplb2YoZGVjaXNpb25fdCkpKSA9PSBOVUxMKXsKKyAgICBmcmVlKHZwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2cC0+ZGVjaXNpb25zID0gKGRlY2lzaW9uX3QgKilwOworICBpbml0X3ZpdGVyYmk2MTVfc3NlMih2cCwwKTsKKyAgcmV0dXJuIHZwOworfQorCit2b2lkIHNldF92aXRlcmJpNjE1X3BvbHlub21pYWxfc3NlMihpbnQgcG9seXNbNl0peworICBpbnQgc3RhdGU7CisgIGludCBpOworCisgIGZvcihzdGF0ZT0wO3N0YXRlIDwgODE5MjtzdGF0ZSsrKXsKKyAgICBmb3IoaT0wO2k8NjtpKyspCisgICAgICBCcmFuY2h0YWI2MTVbaV0uc1tzdGF0ZV0gPSAocG9seXNbaV0gPCAwKSBeIHBhcml0eSgoMipzdGF0ZSkgJiBhYnMocG9seXNbaV0pKSA/IDI1NSA6IDA7CisgIH0KKyAgSW5pdCsrOworfQorCisvKiBWaXRlcmJpIGNoYWluYmFjayAqLworaW50IGNoYWluYmFja192aXRlcmJpNjE1X3NzZTIoCisgICAgICB2b2lkICpwLAorICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgLyogRGVjb2RlZCBvdXRwdXQgZGF0YSAqLworICAgICAgdW5zaWduZWQgaW50IG5iaXRzLCAvKiBOdW1iZXIgb2YgZGF0YSBiaXRzICovCisgICAgICB1bnNpZ25lZCBpbnQgZW5kc3RhdGUpeyAvKiBUZXJtaW5hbCBlbmNvZGVyIHN0YXRlICovCisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQgPSAoZGVjaXNpb25fdCAqKXZwLT5kZWNpc2lvbnM7CisKKyAgZW5kc3RhdGUgJT0gMTYzODQ7CisKKyAgLyogVGhlIHN0b3JlIGludG8gZGF0YVtdIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBldmVyeSA4IGJpdHMuCisgICAqIEJ1dCB0aGlzIGF2b2lkcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHRoZSB3cml0ZXMgd2lsbAorICAgKiBjb21iaW5lIGluIHRoZSBjYWNoZSBhbnl3YXkKKyAgICovCisgIGQgKz0gMTQ7IC8qIExvb2sgcGFzdCB0YWlsICovCisgIHdoaWxlKG5iaXRzLS0gIT0gMCl7CisgICAgaW50IGs7CisKKyAgICBrID0gKGRbbmJpdHNdLndbZW5kc3RhdGUvMzJdID4+IChlbmRzdGF0ZSUzMikpICYgMTsKKyAgICBlbmRzdGF0ZSA9IChrIDw8IDEzKSB8IChlbmRzdGF0ZSA+PiAxKTsKKyAgICBkYXRhW25iaXRzPj4zXSA9IGVuZHN0YXRlID4+IDY7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBpbnN0YW5jZSBvZiBhIFZpdGVyYmkgZGVjb2RlciAqLwordm9pZCBkZWxldGVfdml0ZXJiaTYxNV9zc2UyKHZvaWQgKnApeworICBzdHJ1Y3QgdjYxNSAqdnAgPSBwOworCisgIGlmKHZwICE9IE5VTEwpeworICAgIGZyZWUodnAtPmRlY2lzaW9ucyk7CisgICAgZnJlZSh2cCk7CisgIH0KK30KKworCitpbnQgdXBkYXRlX3ZpdGVyYmk2MTVfYmxrX3NzZTIodm9pZCAqcCx1bnNpZ25lZCBjaGFyICpzeW1zLGludCBuYml0cyl7CisgIHN0cnVjdCB2NjE1ICp2cCA9IHA7CisgIGRlY2lzaW9uX3QgKmQgPSAoZGVjaXNpb25fdCAqKXZwLT5kcDsKKworICB3aGlsZShuYml0cy0tKXsKKyAgICBfX20xMjhpIHN5bTB2LHN5bTF2LHN5bTJ2LHN5bTN2LHN5bTR2LHN5bTV2OworICAgIHZvaWQgKnRtcDsKKyAgICBpbnQgaTsKKworICAgIC8qIFNwbGF0IHRoZSAwdGggc3ltYm9sIGFjcm9zcyBzeW0wdiwgdGhlIDFzdCBzeW1ib2wgYWNyb3NzIHN5bTF2LCBldGMgKi8KKyAgICBzeW0wdiA9IF9tbV9zZXQxX2VwaTE2KHN5bXNbMF0pOworICAgIHN5bTF2ID0gX21tX3NldDFfZXBpMTYoc3ltc1sxXSk7CisgICAgc3ltMnYgPSBfbW1fc2V0MV9lcGkxNihzeW1zWzJdKTsKKyAgICBzeW0zdiA9IF9tbV9zZXQxX2VwaTE2KHN5bXNbM10pOworICAgIHN5bTR2ID0gX21tX3NldDFfZXBpMTYoc3ltc1s0XSk7CisgICAgc3ltNXYgPSBfbW1fc2V0MV9lcGkxNihzeW1zWzVdKTsKKyAgICBzeW1zICs9IDY7CisKKyAgICAvKiBTU0UyIGRvZXNuJ3Qgc3VwcG9ydCBzYXR1cmF0ZWQgYWRkcyBvbiB1bnNpZ25lZCBzaG9ydHMsIHNvIHdlIGhhdmUgdG8gdXNlIHNpZ25lZCBzaG9ydHMgKi8KKyAgICBmb3IoaT0wO2k8MTAyNDtpKyspeworICAgICAgX19tMTI4aSBkZWNpc2lvbjAsZGVjaXNpb24xLG1ldHJpYyxtX21ldHJpYyxtMCxtMSxtMixtMyxzdXJ2aXZvcjAsc3Vydml2b3IxOworCisgICAgICAvKiBGb3JtIGJyYW5jaCBtZXRyaWNzCisgICAgICAgKiBCZWNhdXNlIEJyYW5jaHRhYiB0YWtlcyBvbiB2YWx1ZXMgMCBhbmQgMjU1LCBhbmQgdGhlIHZhbHVlcyBvZiBzeW0/diBhcmUgb2Zmc2V0IGJpbmFyeSBpbiB0aGUgcmFuZ2UgMC0yNTUsCisgICAgICAgKiB0aGUgWE9SIG9wZXJhdGlvbnMgY29uc3RpdHV0ZSBjb25kaXRpb25hbCBuZWdhdGlvbi4KKyAgICAgICAqIG1ldHJpYyBhbmQgbV9tZXRyaWMgKC1tZXRyaWMpIGFyZSBpbiB0aGUgcmFuZ2UgMC0xNTMwCisgICAgICAgKi8KKyAgICAgIG0wID0gX21tX2FkZF9lcGkxNihfbW1feG9yX3NpMTI4KEJyYW5jaHRhYjYxNVswXS52W2ldLHN5bTB2KSxfbW1feG9yX3NpMTI4KEJyYW5jaHRhYjYxNVsxXS52W2ldLHN5bTF2KSk7CisgICAgICBtMSA9IF9tbV9hZGRfZXBpMTYoX21tX3hvcl9zaTEyOChCcmFuY2h0YWI2MTVbMl0udltpXSxzeW0ydiksX21tX3hvcl9zaTEyOChCcmFuY2h0YWI2MTVbM10udltpXSxzeW0zdikpOworICAgICAgbTIgPSBfbW1fYWRkX2VwaTE2KF9tbV94b3Jfc2kxMjgoQnJhbmNodGFiNjE1WzRdLnZbaV0sc3ltNHYpLF9tbV94b3Jfc2kxMjgoQnJhbmNodGFiNjE1WzVdLnZbaV0sc3ltNXYpKTsKKyAgICAgIG1ldHJpYyA9IF9tbV9hZGRfZXBpMTYobTAsX21tX2FkZF9lcGkxNihtMSxtMikpOworICAgICAgbV9tZXRyaWMgPSBfbW1fc3ViX2VwaTE2KF9tbV9zZXQxX2VwaTE2KDE1MzApLG1ldHJpYyk7CisgICAgCisgICAgICAvKiBBZGQgYnJhbmNoIG1ldHJpY3MgdG8gcGF0aCBtZXRyaWNzICovCisgICAgICBtMCA9IF9tbV9hZGRzX2VwaTE2KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtZXRyaWMpOworICAgICAgbTMgPSBfbW1fYWRkc19lcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMTAyNCtpXSxtZXRyaWMpOworICAgICAgbTEgPSBfbW1fYWRkc19lcGkxNih2cC0+b2xkX21ldHJpY3MtPnZbMTAyNCtpXSxtX21ldHJpYyk7CisgICAgICBtMiA9IF9tbV9hZGRzX2VwaTE2KHZwLT5vbGRfbWV0cmljcy0+dltpXSxtX21ldHJpYyk7CisgICAgCisgICAgICAvKiBDb21wYXJlIGFuZCBzZWxlY3QgKi8KKyAgICAgIHN1cnZpdm9yMCA9IF9tbV9taW5fZXBpMTYobTAsbTEpOworICAgICAgc3Vydml2b3IxID0gX21tX21pbl9lcGkxNihtMixtMyk7CisgICAgICBkZWNpc2lvbjAgPSBfbW1fY21wZXFfZXBpMTYoc3Vydml2b3IwLG0xKTsKKyAgICAgIGRlY2lzaW9uMSA9IF9tbV9jbXBlcV9lcGkxNihzdXJ2aXZvcjEsbTMpOworIAorICAgICAgLyogUGFjayBlYWNoIHNldCBvZiBkZWNpc2lvbnMgaW50byA4IDgtYml0IGJ5dGVzLCB0aGVuIGludGVybGVhdmUgdGhlbSBhbmQgY29tcHJlc3MgaW50byAxNiBiaXRzICovCisgICAgICBkLT5zW2ldID0gX21tX21vdmVtYXNrX2VwaTgoX21tX3VucGFja2xvX2VwaTgoX21tX3BhY2tzX2VwaTE2KGRlY2lzaW9uMCxfbW1fc2V0emVyb19zaTEyOCgpKSxfbW1fcGFja3NfZXBpMTYoZGVjaXNpb24xLF9tbV9zZXR6ZXJvX3NpMTI4KCkpKSk7CisKKyAgICAgIC8qIFN0b3JlIHN1cnZpdmluZyBtZXRyaWNzICovCisgICAgICB2cC0+bmV3X21ldHJpY3MtPnZbMippXSA9IF9tbV91bnBhY2tsb19lcGkxNihzdXJ2aXZvcjAsc3Vydml2b3IxKTsKKyAgICAgIHZwLT5uZXdfbWV0cmljcy0+dlsyKmkrMV0gPSBfbW1fdW5wYWNraGlfZXBpMTYoc3Vydml2b3IwLHN1cnZpdm9yMSk7CisgICAgfQorICAgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIHJlbm9ybWFsaXplCisgICAgICogTWF4IG1ldHJpYyBzcHJlYWQgZm9yIHRoaXMgY29kZSB3aXRoIDAtOTAgYnJhbmNoIG1ldHJpY3MgaXMgNDA1CisgICAgICovCisgICAgaWYodnAtPm5ld19tZXRyaWNzLT5zWzBdID49IFNIUlRfTUFYLTEyNzUwKXsKKyAgICAgIGludCBpLGFkanVzdDsKKyAgICAgIF9fbTEyOGkgYWRqdXN0djsKKyAgICAgIHVuaW9uIHsgX19tMTI4aSB2OyBzaWduZWQgc2hvcnQgd1s4XTsgfSB0OworICAgICAgCisgICAgICAvKiBGaW5kIHNtYWxsZXN0IG1ldHJpYyBhbmQgc2V0IGFkanVzdHYgdG8gYnJpbmcgaXQgZG93biB0byBTSFJUX01JTiAqLworICAgICAgYWRqdXN0diA9IHZwLT5uZXdfbWV0cmljcy0+dlswXTsKKyAgICAgIGZvcihpPTE7aTwyMDQ4O2krKykKKwlhZGp1c3R2ID0gX21tX21pbl9lcGkxNihhZGp1c3R2LHZwLT5uZXdfbWV0cmljcy0+dltpXSk7CisKKyAgICAgIGFkanVzdHYgPSBfbW1fbWluX2VwaTE2KGFkanVzdHYsX21tX3NybGlfc2kxMjgoYWRqdXN0diw4KSk7CisgICAgICBhZGp1c3R2ID0gX21tX21pbl9lcGkxNihhZGp1c3R2LF9tbV9zcmxpX3NpMTI4KGFkanVzdHYsNCkpOworICAgICAgYWRqdXN0diA9IF9tbV9taW5fZXBpMTYoYWRqdXN0dixfbW1fc3JsaV9zaTEyOChhZGp1c3R2LDIpKTsKKyAgICAgIHQudiA9IGFkanVzdHY7CisgICAgICBhZGp1c3QgPSB0LndbMF0gLSBTSFJUX01JTjsKKyAgICAgIGFkanVzdHYgPSBfbW1fc2V0MV9lcGkxNihhZGp1c3QpOworCisgICAgICAvKiBXZSBjYW5ub3QgdXNlIGEgc2F0dXJhdGVkIHN1YnRyYWN0LCBiZWNhdXNlIHdlIG9mdGVuIGhhdmUgdG8gYWRqdXN0IGJ5IG1vcmUgdGhhbiBTSFJUX01BWAorICAgICAgICogVGhpcyBpcyBva2F5IHNpbmNlIGl0IGNhbid0IG92ZXJmbG93IGFueXdheQorICAgICAgICovCisgICAgICBmb3IoaT0wO2k8MjA0ODtpKyspCisJdnAtPm5ld19tZXRyaWNzLT52W2ldID0gX21tX3N1Yl9lcGkxNih2cC0+bmV3X21ldHJpY3MtPnZbaV0sYWRqdXN0dik7CisgICAgfQorICAgIGQrKzsKKyAgICAvKiBTd2FwIHBvaW50ZXJzIHRvIG9sZCBhbmQgbmV3IG1ldHJpY3MgKi8KKyAgICB0bXAgPSB2cC0+b2xkX21ldHJpY3M7CisgICAgdnAtPm9sZF9tZXRyaWNzID0gdnAtPm5ld19tZXRyaWNzOworICAgIHZwLT5uZXdfbWV0cmljcyA9IHRtcDsKKyAgfQorICB2cC0+ZHAgPSBkOworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9mZWMvdnRlc3QyNy5jIGIvZmVjL3Z0ZXN0MjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU2NDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3Z0ZXN0MjcuYwpAQCAtMCwwICsxLDE4NCBAQAorLyogVGVzdCB2aXRlcmJpIGRlY29kZXIgc3BlZWRzICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSAiZmVjLmgiCisKKyNpZiBIQVZFX0dFVE9QVF9MT05HCitzdHJ1Y3Qgb3B0aW9uIE9wdGlvbnNbXSA9IHsKKyAgeyJmcmFtZS1sZW5ndGgiLDEsTlVMTCwnbCd9LAorICB7ImZyYW1lLWNvdW50IiwxLE5VTEwsJ24nfSwKKyAgeyJlYm4wIiwxLE5VTEwsJ2UnfSwKKyAgeyJnYWluIiwxLE5VTEwsJ2cnfSwKKyAgeyJ2ZXJib3NlIiwwLE5VTEwsJ3YnfSwKKyAgeyJmb3JjZS1hbHRpdmVjIiwwLE5VTEwsJ2EnfSwKKyAgeyJmb3JjZS1wb3J0IiwwLE5VTEwsJ3AnfSwKKyAgeyJmb3JjZS1tbXgiLDAsTlVMTCwnbSd9LAorICB7ImZvcmNlLXNzZSIsMCxOVUxMLCdzJ30sCisgIHsiZm9yY2Utc3NlMiIsMCxOVUxMLCd0J30sCisgIHtOVUxMfSwKK307CisjZW5kaWYKKworI2RlZmluZSBSQVRFICgxLi8yLikKKyNkZWZpbmUgTUFYQllURVMgMTAwMDAKKworZG91YmxlIEdhaW4gPSAzMi4wOworaW50IFZlcmJvc2UgPSAwOworCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10peworICBpbnQgaSxkLHRyOworICBpbnQgc3I9MCx0cmlhbHMgPSAxMDAwMCxlcnJjbnQsZnJhbWViaXRzPTIwNDg7CisgIGxvbmcgbG9uZyBpbnQgdG90X2VycnM9MDsKKyAgdW5zaWduZWQgY2hhciBiaXRzW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciBkYXRhW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciB4b3JkYXRhW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciBzeW1ib2xzWzgqMiooTUFYQllURVMrNildOworICB2b2lkICp2cDsKKyAgZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKyAgc3RydWN0IHJ1c2FnZSBzdGFydCxmaW5pc2g7CisgIGRvdWJsZSBleHRpbWU7CisgIGRvdWJsZSBnYWluLGVzbjAsZWJuMDsKKyAgdGltZV90IHQ7CisgIGludCBiYWRmcmFtZXM9MDsKKworICB0aW1lKCZ0KTsKKyAgc3JhbmRvbSh0KTsKKyAgZWJuMCA9IC0xMDA7CisjaWYgSEFWRV9HRVRPUFRfTE9ORworICB3aGlsZSgoZCA9IGdldG9wdF9sb25nKGFyZ2MsYXJndiwibDpuOnRlOmc6dmFwbXN0IixPcHRpb25zLE5VTEwpKSAhPSBFT0YpeworI2Vsc2UKKyAgd2hpbGUoKGQgPSBnZXRvcHQoYXJnYyxhcmd2LCJsOm46dGU6Zzp2YXBtc3QiKSkgIT0gRU9GKXsKKyNlbmRpZgorICAgIHN3aXRjaChkKXsKKyAgICBjYXNlICdhJzoKKyAgICAgIENwdV9tb2RlID0gQUxUSVZFQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgQ3B1X21vZGUgPSBQT1JUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICBDcHVfbW9kZSA9IE1NWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgQ3B1X21vZGUgPSBTU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgIENwdV9tb2RlID0gU1NFMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgZnJhbWViaXRzID0gYXRvaShvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICB0cmlhbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoKKyAgICAgIGVibjAgPSBhdG9mKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgIEdhaW4gPSBhdG9mKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICAgIFZlcmJvc2UrKzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZihmcmFtZWJpdHMgPiA4Kk1BWEJZVEVTKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRnJhbWUgbGltaXRlZCB0byAlZCBiaXRzXG4iLE1BWEJZVEVTKjgpOworICAgIGZyYW1lYml0cyA9IE1BWEJZVEVTKjg7CisgIH0KKyAgaWYoKHZwID0gY3JlYXRlX3ZpdGVyYmkyNyhmcmFtZWJpdHMpKSA9PSBOVUxMKXsKKyAgICBwcmludGYoImNyZWF0ZV92aXRlcmJpMjcgZmFpbGVkXG4iKTsKKyAgICBleGl0KDEpOworICB9CisgIGlmKGVibjAgIT0gLTEwMCl7CisgICAgZXNuMCA9IGVibjAgKyAxMCpsb2cxMCgoZG91YmxlKVJBVEUpOyAvKiBFcy9ObyBpbiBkQiAqLworICAgIC8qIENvbXB1dGUgbm9pc2Ugdm9sdGFnZS4gVGhlIDAuNSBmYWN0b3IgYWNjb3VudHMgZm9yIEJQU0sgc2VlaW5nCisgICAgICogb25seSBoYWxmIHRoZSBub2lzZSBwb3dlciwgYW5kIHRoZSBzcXJ0KCkgY29udmVydHMgcG93ZXIgdG8KKyAgICAgKiB2b2x0YWdlLgorICAgICAqLworICAgIGdhaW4gPSAxLi9zcXJ0KDAuNS9wb3coMTAuLGVzbjAvMTAuKSk7CisgICAgCisgICAgcHJpbnRmKCJuZnJhbWVzID0gJWQgZnJhbWVzaXplID0gJWQgZWJuMCA9ICUuMmYgZEIgZ2FpbiA9ICVnXG4iLHRyaWFscyxmcmFtZWJpdHMsZWJuMCxHYWluKTsKKyAgICAKKyAgICBmb3IodHI9MDt0cjx0cmlhbHM7dHIrKyl7CisgICAgICAvKiBFbmNvZGUgYSBmcmFtZSBvZiByYW5kb20gZGF0YSAqLworICAgICAgZm9yKGk9MDtpPGZyYW1lYml0cys2O2krKyl7CisJaW50IGJpdCA9IChpIDwgZnJhbWViaXRzKSA/IChyYW5kb20oKSAmIDEpIDogMDsKKwkKKwlzciA9IChzciA8PCAxKSB8IGJpdDsKKwliaXRzW2kvOF0gPSBzciAmIDB4ZmY7CisJc3ltYm9sc1syKmkrMF0gPSBhZGRub2lzZShwYXJpdHkoc3IgJiBWMjdQT0xZQSksZ2FpbixHYWluLDEyNy41LDI1NSk7CisJc3ltYm9sc1syKmkrMV0gPSBhZGRub2lzZShwYXJpdHkoc3IgJiBWMjdQT0xZQiksZ2FpbixHYWluLDEyNy41LDI1NSk7CisgICAgICB9CisgICAgICAvKiBEZWNvZGUgaXQgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlciAqLworICAgICAgLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgKi8KKyAgICAgIGluaXRfdml0ZXJiaTI3KHZwLDApOworICAgICAgCisgICAgICAvKiBEZWNvZGUgYmxvY2sgKi8KKyAgICAgIHVwZGF0ZV92aXRlcmJpMjdfYmxrKHZwLHN5bWJvbHMsZnJhbWViaXRzKzYpOworICAgICAgCisgICAgICAvKiBEbyBWaXRlcmJpIGNoYWluYmFjayAqLworICAgICAgY2hhaW5iYWNrX3ZpdGVyYmkyNyh2cCxkYXRhLGZyYW1lYml0cywwKTsKKyAgICAgIGVycmNudCA9IDA7CisgICAgICBmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwlpbnQgZSA9IEJpdGNudFt4b3JkYXRhW2ldID0gZGF0YVtpXSBeIGJpdHNbaV1dOworCWVycmNudCArPSBlOworCXRvdF9lcnJzICs9IGU7CisgICAgICB9CisgICAgICBpZihlcnJjbnQgIT0gMCkKKwliYWRmcmFtZXMrKzsKKyAgICAgIGlmKFZlcmJvc2UgPiAxICYmIGVycmNudCAhPSAwKXsKKwlwcmludGYoImZyYW1lICVkLCAlZCBlcnJvcnM6ICIsdHIsZXJyY250KTsKKwlmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwkgIHByaW50ZigiJTAyeCIseG9yZGF0YVtpXSk7CisJfQorCXByaW50ZigiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKFZlcmJvc2UpCisJcHJpbnRmKCJCRVIgJWxsZC8lbGxkICglMTAuM2cpIEZFUiAlZC8lZCAoJTEwLjNnKVxyIiwKKwkgICAgICAgdG90X2VycnMsKGxvbmcgbG9uZylmcmFtZWJpdHMqKHRyKzEpLHRvdF9lcnJzLygoZG91YmxlKWZyYW1lYml0cyoodHIrMSkpLAorCSAgICAgICBiYWRmcmFtZXMsdHIrMSwoZG91YmxlKWJhZGZyYW1lcy8odHIrMSkpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICAgIGlmKFZlcmJvc2UgPiAxKQorICAgICAgcHJpbnRmKCJuZnJhbWVzID0gJWQgZnJhbWVzaXplID0gJWQgZWJuMCA9ICUuMmYgZEIgZ2FpbiA9ICVnXG4iLHRyaWFscyxmcmFtZWJpdHMsZWJuMCxHYWluKTsKKyAgICBlbHNlIGlmKFZlcmJvc2UgPT0gMCkKKyAgICAgIHByaW50ZigiQkVSICVsbGQvJWxsZCAoJS4zZykgRkVSICVkLyVkICglLjNnKVxuIiwKKwkgICAgIHRvdF9lcnJzLChsb25nIGxvbmcpZnJhbWViaXRzKnRyaWFscyx0b3RfZXJycy8oKGRvdWJsZSlmcmFtZWJpdHMqdHJpYWxzKSwKKwkgICAgIGJhZGZyYW1lcyx0cisxLChkb3VibGUpYmFkZnJhbWVzLyh0cisxKSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJcbiIpOworCisgIH0gZWxzZSB7CisgICAgLyogRG8gdGltZSB0cmlhbHMgKi8KKyAgICBtZW1zZXQoc3ltYm9scywxMjcsc2l6ZW9mKHN5bWJvbHMpKTsKKyAgICBwcmludGYoIlN0YXJ0aW5nIHRpbWUgdHJpYWxzXG4iKTsKKyAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJnN0YXJ0KTsKKyAgICBmb3IodHI9MDt0ciA8IHRyaWFsczt0cisrKXsKKyAgICAgIC8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyICovCisgICAgICBpbml0X3ZpdGVyYmkyNyh2cCwwKTsKKyAgICAgIAorICAgICAgLyogRGVjb2RlIGJsb2NrICovCisgICAgICB1cGRhdGVfdml0ZXJiaTI3X2Jsayh2cCxzeW1ib2xzLGZyYW1lYml0cyk7CisgICAgICAKKyAgICAgIC8qIERvIFZpdGVyYmkgY2hhaW5iYWNrICovCisgICAgICBjaGFpbmJhY2tfdml0ZXJiaTI3KHZwLGRhdGEsZnJhbWViaXRzLDApOworICAgIH0KKyAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJmZpbmlzaCk7CisgICAgZXh0aW1lID0gZmluaXNoLnJ1X3V0aW1lLnR2X3NlYyAtIHN0YXJ0LnJ1X3V0aW1lLnR2X3NlYyArIDFlLTYqKGZpbmlzaC5ydV91dGltZS50dl91c2VjIC0gc3RhcnQucnVfdXRpbWUudHZfdXNlYyk7CisgICAgcHJpbnRmKCJFeGVjdXRpb24gdGltZSBmb3IgJWQgJWQtYml0IGZyYW1lczogJS4yZiBzZWNcbiIsdHJpYWxzLAorCSAgIGZyYW1lYml0cyxleHRpbWUpOworICAgIHByaW50ZigiZGVjb2RlciBzcGVlZDogJWcgYml0cy9zXG4iLHRyaWFscypmcmFtZWJpdHMvZXh0aW1lKTsKKyAgfQorICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZmVjL3Z0ZXN0MjkuYyBiL2ZlYy92dGVzdDI5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MWI1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92dGVzdDI5LmMKQEAgLTAsMCArMSwxODUgQEAKKy8qIFRlc3Qgdml0ZXJiaSBkZWNvZGVyIHNwZWVkcyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImZlYy5oIgorCisjaWYgSEFWRV9HRVRPUFRfTE9ORworc3RydWN0IG9wdGlvbiBPcHRpb25zW10gPSB7CisgIHsiZnJhbWUtbGVuZ3RoIiwxLE5VTEwsJ2wnfSwKKyAgeyJmcmFtZS1jb3VudCIsMSxOVUxMLCduJ30sCisgIHsiZWJuMCIsMSxOVUxMLCdlJ30sCisgIHsiZ2FpbiIsMSxOVUxMLCdnJ30sCisgIHsidmVyYm9zZSIsMCxOVUxMLCd2J30sCisgIHsiZm9yY2UtYWx0aXZlYyIsMCxOVUxMLCdhJ30sCisgIHsiZm9yY2UtcG9ydCIsMCxOVUxMLCdwJ30sCisgIHsiZm9yY2UtbW14IiwwLE5VTEwsJ20nfSwKKyAgeyJmb3JjZS1zc2UiLDAsTlVMTCwncyd9LAorICB7ImZvcmNlLXNzZTIiLDAsTlVMTCwndCd9LAorICB7TlVMTH0sCit9OworI2VuZGlmCisKKyNkZWZpbmUgUkFURSAoMS4vMi4pCisjZGVmaW5lIE1BWEJZVEVTIDEwMDAwCisKK2RvdWJsZSBHYWluID0gMzIuMDsKK2ludCBWZXJib3NlID0gMDsKKworaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKXsKKyAgaW50IGksZCx0cjsKKyAgaW50IHNyPTAsdHJpYWxzID0gMTAwMDAsZXJyY250LGZyYW1lYml0cz0yMDQ4OworICBsb25nIGxvbmcgdG90X2VycnM9MDsKKyAgdW5zaWduZWQgY2hhciBiaXRzW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciBkYXRhW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciB4b3JkYXRhW01BWEJZVEVTXTsKKyAgdW5zaWduZWQgY2hhciBzeW1ib2xzWzgqMiooTUFYQllURVMrOCldOworICB2b2lkICp2cDsKKyAgZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKyAgc3RydWN0IHJ1c2FnZSBzdGFydCxmaW5pc2g7CisgIGRvdWJsZSBleHRpbWU7CisgIGRvdWJsZSBnYWluLGVzbjAsZWJuMDsKKyAgdGltZV90IHQ7CisgIGludCBiYWRmcmFtZXM9MDsKKworICB0aW1lKCZ0KTsKKyAgc3JhbmRvbSh0KTsKKyAgZWJuMCA9IC0xMDA7CisjaWYgSEFWRV9HRVRPUFRfTE9ORworICB3aGlsZSgoZCA9IGdldG9wdF9sb25nKGFyZ2MsYXJndiwibDpuOnRlOmc6dmFwbXN0IixPcHRpb25zLE5VTEwpKSAhPSBFT0YpeworI2Vsc2UKKyAgd2hpbGUoKGQgPSBnZXRvcHQoYXJnYyxhcmd2LCJsOm46dGU6Zzp2YXBtc3QiKSkgIT0gRU9GKXsKKyNlbmRpZgorICAgIHN3aXRjaChkKXsKKyAgICBjYXNlICdhJzoKKyAgICAgIENwdV9tb2RlID0gQUxUSVZFQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgQ3B1X21vZGUgPSBQT1JUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICBDcHVfbW9kZSA9IE1NWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgQ3B1X21vZGUgPSBTU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgIENwdV9tb2RlID0gU1NFMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgZnJhbWViaXRzID0gYXRvaShvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICB0cmlhbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoKKyAgICAgIGVibjAgPSBhdG9mKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgIEdhaW4gPSBhdG9mKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICAgIFZlcmJvc2UrKzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZihmcmFtZWJpdHMgPiA4Kk1BWEJZVEVTKXsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRnJhbWUgbGltaXRlZCB0byAlZCBiaXRzXG4iLE1BWEJZVEVTKjgpOworICAgIGZyYW1lYml0cyA9IE1BWEJZVEVTKjg7CisgIH0KKyAgaWYoKHZwID0gY3JlYXRlX3ZpdGVyYmkyOShmcmFtZWJpdHMpKSA9PSBOVUxMKXsKKyAgICBwcmludGYoImNyZWF0ZV92aXRlcmJpMjkgZmFpbGVkXG4iKTsKKyAgICBleGl0KDEpOworICB9CisgIGlmKGVibjAgIT0gLTEwMCl7CisgICAgZXNuMCA9IGVibjAgKyAxMCpsb2cxMCgoZG91YmxlKVJBVEUpOyAvKiBFcy9ObyBpbiBkQiAqLworICAgIC8qIENvbXB1dGUgbm9pc2Ugdm9sdGFnZS4gVGhlIDAuNSBmYWN0b3IgYWNjb3VudHMgZm9yIEJQU0sgc2VlaW5nCisgICAgICogb25seSBoYWxmIHRoZSBub2lzZSBwb3dlciwgYW5kIHRoZSBzcXJ0KCkgY29udmVydHMgcG93ZXIgdG8KKyAgICAgKiB2b2x0YWdlLgorICAgICAqLworICAgIGdhaW4gPSAxLi9zcXJ0KDAuNS9wb3coMTAuLGVzbjAvMTAuKSk7CisgICAgCisgICAgcHJpbnRmKCJuZnJhbWVzID0gJWQgZnJhbWVzaXplID0gJWQgZWJuMCA9ICUuMmYgZEIgZ2FpbiA9ICVnXG4iLHRyaWFscyxmcmFtZWJpdHMsZWJuMCxHYWluKTsKKyAgICAKKyAgICBmb3IodHI9MDt0cjx0cmlhbHM7dHIrKyl7CisgICAgICAvKiBFbmNvZGUgYSBmcmFtZSBvZiByYW5kb20gZGF0YSAqLworICAgICAgZm9yKGk9MDtpPGZyYW1lYml0cys4O2krKyl7CisJaW50IGJpdCA9IChpIDwgZnJhbWViaXRzKSA/IChyYW5kb20oKSAmIDEpIDogMDsKKwkKKwlzciA9IChzciA8PCAxKSB8IGJpdDsKKwliaXRzW2kvOF0gPSBzciAmIDB4ZmY7CisJc3ltYm9sc1syKmkrMF0gPSBhZGRub2lzZShwYXJpdHkoc3IgJiBWMjlQT0xZQSksZ2FpbixHYWluLDEyNy41LDI1NSk7CisJc3ltYm9sc1syKmkrMV0gPSBhZGRub2lzZShwYXJpdHkoc3IgJiBWMjlQT0xZQiksZ2FpbixHYWluLDEyNy41LDI1NSk7CisgICAgICB9CisgICAgICAvKiBEZWNvZGUgaXQgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IGFuc3dlciAqLworICAgICAgLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgKi8KKyAgICAgIGluaXRfdml0ZXJiaTI5KHZwLDApOworICAgICAgCisgICAgICAvKiBEZWNvZGUgYmxvY2sgKi8KKyAgICAgIHVwZGF0ZV92aXRlcmJpMjlfYmxrKHZwLHN5bWJvbHMsZnJhbWViaXRzKzgpOworICAgICAgCisgICAgICAvKiBEbyBWaXRlcmJpIGNoYWluYmFjayAqLworICAgICAgY2hhaW5iYWNrX3ZpdGVyYmkyOSh2cCxkYXRhLGZyYW1lYml0cywwKTsKKyAgICAgIGVycmNudCA9IDA7CisgICAgICBmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwlpbnQgZSA9IEJpdGNudFt4b3JkYXRhW2ldID0gZGF0YVtpXSBeIGJpdHNbaV1dOworCWVycmNudCArPSBlOworCXRvdF9lcnJzICs9IGU7CisgICAgICB9CisgICAgICBpZihlcnJjbnQgIT0gMCkKKwliYWRmcmFtZXMrKzsKKyAgICAgIGlmKFZlcmJvc2UgPiAxICYmIGVycmNudCAhPSAwKXsKKwlwcmludGYoImZyYW1lICVkLCAlZCBlcnJvcnM6ICIsdHIsZXJyY250KTsKKwlmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwkgIHByaW50ZigiJTAyeCIseG9yZGF0YVtpXSk7CisJfQorCXByaW50ZigiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKFZlcmJvc2UpCisJcHJpbnRmKCJCRVIgJWxsZC8lbGxkICglMTAuM2cpIEZFUiAlZC8lZCAoJTEwLjNnKVxyIiwKKwkgICAgICAgdG90X2VycnMsKGxvbmcgbG9uZylmcmFtZWJpdHMqKHRyKzEpLHRvdF9lcnJzLygoZG91YmxlKWZyYW1lYml0cyoodHIrMSkpLAorCSAgICAgICBiYWRmcmFtZXMsdHIrMSwoZG91YmxlKWJhZGZyYW1lcy8odHIrMSkpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICAgIGlmKFZlcmJvc2UgPiAxKQorICAgICAgcHJpbnRmKCJuZnJhbWVzID0gJWQgZnJhbWVzaXplID0gJWQgZWJuMCA9ICUuMmYgZEIgZ2FpbiA9ICVnXG4iLHRyaWFscyxmcmFtZWJpdHMsZWJuMCxHYWluKTsKKyAgICBlbHNlIGlmKFZlcmJvc2UgPT0gMCkKKyAgICAgIHByaW50ZigiQkVSICVsbGQvJWxsZCAoJS4zZykgRkVSICVkLyVkICglLjNnKVxuIiwKKwkgICAgIHRvdF9lcnJzLChsb25nIGxvbmcpZnJhbWViaXRzKnRyaWFscyx0b3RfZXJycy8oKGRvdWJsZSlmcmFtZWJpdHMqdHJpYWxzKSwKKwkgICAgIGJhZGZyYW1lcyx0cisxLChkb3VibGUpYmFkZnJhbWVzLyh0cisxKSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJcbiIpOworICB9IGVsc2UgeworICAgIC8qIERvIHRpbWUgdHJpYWxzICovCisgICAgbWVtc2V0KHN5bWJvbHMsMTI3LHNpemVvZihzeW1ib2xzKSk7CisgICAgcHJpbnRmKCJTdGFydGluZyB0aW1lIHRyaWFsc1xuIik7CisgICAgZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCZzdGFydCk7CisgICAgZm9yKHRyPTA7dHIgPCB0cmlhbHM7dHIrKyl7CisgICAgICAvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciAqLworICAgICAgaW5pdF92aXRlcmJpMjkodnAsMCk7CisgICAgICAKKyAgICAgIC8qIERlY29kZSBibG9jayAqLworICAgICAgdXBkYXRlX3ZpdGVyYmkyOV9ibGsodnAsc3ltYm9scyxmcmFtZWJpdHMpOworICAgICAgCisgICAgICAvKiBEbyBWaXRlcmJpIGNoYWluYmFjayAqLworICAgICAgY2hhaW5iYWNrX3ZpdGVyYmkyOSh2cCxkYXRhLGZyYW1lYml0cywwKTsKKyAgICB9CisgICAgZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCZmaW5pc2gpOworICAgIGV4dGltZSA9IGZpbmlzaC5ydV91dGltZS50dl9zZWMgLSBzdGFydC5ydV91dGltZS50dl9zZWMgKyAxZS02KihmaW5pc2gucnVfdXRpbWUudHZfdXNlYyAtIHN0YXJ0LnJ1X3V0aW1lLnR2X3VzZWMpOworICAgIHByaW50ZigiRXhlY3V0aW9uIHRpbWUgZm9yICVkICVkLWJpdCBmcmFtZXM6ICUuMmYgc2VjXG4iLHRyaWFscywKKwkgICBmcmFtZWJpdHMsZXh0aW1lKTsKKyAgICBwcmludGYoImRlY29kZXIgc3BlZWQ6ICVnIGJpdHMvc1xuIix0cmlhbHMqZnJhbWViaXRzL2V4dGltZSk7CisgIH0KKyAgZXhpdCgwKTsKK30KKworCmRpZmYgLS1naXQgYS9mZWMvdnRlc3QzOS5jIGIvZmVjL3Z0ZXN0MzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjcyM2IyCi0tLSAvZGV2L251bGwKKysrIGIvZmVjL3Z0ZXN0MzkuYwpAQCAtMCwwICsxLDE4NiBAQAorLyogVGVzdCB2aXRlcmJpIGRlY29kZXIgc3BlZWRzICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaWZkZWYgSEFWRV9HRVRPUFRfSAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSAiZmVjLmgiCisKKyNpZiBIQVZFX0dFVE9QVF9MT05HCitzdHJ1Y3Qgb3B0aW9uIE9wdGlvbnNbXSA9IHsKKyAgeyJmcmFtZS1sZW5ndGgiLDEsTlVMTCwnbCd9LAorICB7ImZyYW1lLWNvdW50IiwxLE5VTEwsJ24nfSwKKyAgeyJlYm4wIiwxLE5VTEwsJ2UnfSwKKyAgeyJnYWluIiwxLE5VTEwsJ2cnfSwKKyAgeyJ2ZXJib3NlIiwwLE5VTEwsJ3YnfSwKKyAgeyJmb3JjZS1hbHRpdmVjIiwwLE5VTEwsJ2EnfSwKKyAgeyJmb3JjZS1wb3J0IiwwLE5VTEwsJ3AnfSwKKyAgeyJmb3JjZS1tbXgiLDAsTlVMTCwnbSd9LAorICB7ImZvcmNlLXNzZSIsMCxOVUxMLCdzJ30sCisgIHsiZm9yY2Utc3NlMiIsMCxOVUxMLCd0J30sCisgIHtOVUxMfSwKK307CisjZW5kaWYKKworI2RlZmluZSBSQVRFICgxLi8zLikKKyNkZWZpbmUgTUFYQllURVMgMTAwMDAKKworZG91YmxlIEdhaW4gPSAzMi4wOworaW50IFZlcmJvc2UgPSAwOworCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10peworICBpbnQgaSxkLHRyOworICBpbnQgc3I9MCx0cmlhbHMgPSAxMDAwMCxlcnJjbnQsZnJhbWViaXRzPTIwNDg7CisgIGxvbmcgbG9uZyB0b3RfZXJycz0wOworICB1bnNpZ25lZCBjaGFyIGJpdHNbTUFYQllURVNdOworICB1bnNpZ25lZCBjaGFyIGRhdGFbTUFYQllURVNdOworICB1bnNpZ25lZCBjaGFyIHhvcmRhdGFbTUFYQllURVNdOworICB1bnNpZ25lZCBjaGFyIHN5bWJvbHNbOCozKihNQVhCWVRFUys4KV07CisgIHZvaWQgKnZwOworICBleHRlcm4gY2hhciAqb3B0YXJnOworICBzdHJ1Y3QgcnVzYWdlIHN0YXJ0LGZpbmlzaDsKKyAgZG91YmxlIGV4dGltZTsKKyAgZG91YmxlIGdhaW4sZXNuMCxlYm4wOworICB0aW1lX3QgdDsKKyAgaW50IGJhZGZyYW1lcz0wOworCisgIHRpbWUoJnQpOworICBzcmFuZG9tKHQpOworICBlYm4wID0gLTEwMDsKKyNpZiBIQVZFX0dFVE9QVF9MT05HCisgIHdoaWxlKChkID0gZ2V0b3B0X2xvbmcoYXJnYyxhcmd2LCJsOm46dGU6Zzp2YXBtc3QiLE9wdGlvbnMsTlVMTCkpICE9IEVPRil7CisjZWxzZQorICB3aGlsZSgoZCA9IGdldG9wdChhcmdjLGFyZ3YsImw6bjp0ZTpnOnZhcG1zdCIpKSAhPSBFT0YpeworI2VuZGlmCisgICAgc3dpdGNoKGQpeworICAgIGNhc2UgJ2EnOgorICAgICAgQ3B1X21vZGUgPSBBTFRJVkVDOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgICBDcHVfbW9kZSA9IFBPUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIENwdV9tb2RlID0gTU1YOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBDcHVfbW9kZSA9IFNTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgQ3B1X21vZGUgPSBTU0UyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBmcmFtZWJpdHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICduJzoKKyAgICAgIHRyaWFscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgorICAgICAgZWJuMCA9IGF0b2Yob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgR2FpbiA9IGF0b2Yob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3YnOgorICAgICAgVmVyYm9zZSsrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKGZyYW1lYml0cyA+IDgqTUFYQllURVMpeworICAgIGZwcmludGYoc3RkZXJyLCJGcmFtZSBsaW1pdGVkIHRvICVkIGJpdHNcbiIsTUFYQllURVMqOCk7CisgICAgZnJhbWViaXRzID0gTUFYQllURVMqODsKKyAgfQorICBpZigodnAgPSBjcmVhdGVfdml0ZXJiaTM5KGZyYW1lYml0cykpID09IE5VTEwpeworICAgIHByaW50ZigiY3JlYXRlX3ZpdGVyYmkzOSBmYWlsZWRcbiIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgaWYoZWJuMCAhPSAtMTAwKXsKKyAgICBlc24wID0gZWJuMCArIDEwKmxvZzEwKChkb3VibGUpUkFURSk7IC8qIEVzL05vIGluIGRCICovCisgICAgLyogQ29tcHV0ZSBub2lzZSB2b2x0YWdlLiBUaGUgMC41IGZhY3RvciBhY2NvdW50cyBmb3IgQlBTSyBzZWVpbmcKKyAgICAgKiBvbmx5IGhhbGYgdGhlIG5vaXNlIHBvd2VyLCBhbmQgdGhlIHNxcnQoKSBjb252ZXJ0cyBwb3dlciB0bworICAgICAqIHZvbHRhZ2UuCisgICAgICovCisgICAgZ2FpbiA9IDEuL3NxcnQoMC41L3BvdygxMC4sZXNuMC8xMC4pKTsKKyAgICAKKyAgICBwcmludGYoIm5mcmFtZXMgPSAlZCBmcmFtZXNpemUgPSAlZCBlYm4wID0gJS4yZiBkQiBnYWluID0gJWdcbiIsdHJpYWxzLGZyYW1lYml0cyxlYm4wLEdhaW4pOworICAgIAorICAgIGZvcih0cj0wO3RyPHRyaWFsczt0cisrKXsKKyAgICAgIC8qIEVuY29kZSBhIGZyYW1lIG9mIHJhbmRvbSBkYXRhICovCisgICAgICBmb3IoaT0wO2k8ZnJhbWViaXRzKzg7aSsrKXsKKwlpbnQgYml0ID0gKGkgPCBmcmFtZWJpdHMpID8gKHJhbmRvbSgpICYgMSkgOiAwOworCQorCXNyID0gKHNyIDw8IDEpIHwgYml0OworCWJpdHNbaS84XSA9IHNyICYgMHhmZjsKKwlzeW1ib2xzWzMqaSswXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFYzOVBPTFlBKSxnYWluLEdhaW4sMTI3LjUsMjU1KTsKKwlzeW1ib2xzWzMqaSsxXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFYzOVBPTFlCKSxnYWluLEdhaW4sMTI3LjUsMjU1KTsKKwlzeW1ib2xzWzMqaSsyXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFYzOVBPTFlDKSxnYWluLEdhaW4sMTI3LjUsMjU1KTsKKyAgICAgIH0KKyAgICAgIC8qIERlY29kZSBpdCBhbmQgbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyICovCisgICAgICAvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciAqLworICAgICAgaW5pdF92aXRlcmJpMzkodnAsMCk7CisgICAgICAKKyAgICAgIC8qIERlY29kZSBibG9jayAqLworICAgICAgdXBkYXRlX3ZpdGVyYmkzOV9ibGsodnAsc3ltYm9scyxmcmFtZWJpdHMrOCk7CisgICAgICAKKyAgICAgIC8qIERvIFZpdGVyYmkgY2hhaW5iYWNrICovCisgICAgICBjaGFpbmJhY2tfdml0ZXJiaTM5KHZwLGRhdGEsZnJhbWViaXRzLDApOworICAgICAgZXJyY250ID0gMDsKKyAgICAgIGZvcihpPTA7aTxmcmFtZWJpdHMvODtpKyspeworCWludCBlID0gQml0Y250W3hvcmRhdGFbaV0gPSBkYXRhW2ldIF4gYml0c1tpXV07CisJZXJyY250ICs9IGU7CisJdG90X2VycnMgKz0gZTsKKyAgICAgIH0KKyAgICAgIGlmKGVycmNudCAhPSAwKQorCWJhZGZyYW1lcysrOworICAgICAgaWYoVmVyYm9zZSA+IDEgJiYgZXJyY250ICE9IDApeworCXByaW50ZigiZnJhbWUgJWQsICVkIGVycm9yczogIix0cixlcnJjbnQpOworCWZvcihpPTA7aTxmcmFtZWJpdHMvODtpKyspeworCSAgcHJpbnRmKCIlMDJ4Iix4b3JkYXRhW2ldKTsKKwl9CisJcHJpbnRmKCJcbiIpOworICAgICAgfQorICAgICAgaWYoVmVyYm9zZSkKKwlwcmludGYoIkJFUiAlbGxkLyVsbGQgKCUxMC4zZykgRkVSICVkLyVkICglMTAuM2cpXHIiLAorCSAgICAgICB0b3RfZXJycywobG9uZyBsb25nKWZyYW1lYml0cyoodHIrMSksdG90X2VycnMvKChkb3VibGUpZnJhbWViaXRzKih0cisxKSksCisJICAgICAgIGJhZGZyYW1lcyx0cisxLChkb3VibGUpYmFkZnJhbWVzLyh0cisxKSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisgICAgaWYoVmVyYm9zZSA+IDEpCisgICAgICBwcmludGYoIm5mcmFtZXMgPSAlZCBmcmFtZXNpemUgPSAlZCBlYm4wID0gJS4yZiBkQiBnYWluID0gJWdcbiIsdHJpYWxzLGZyYW1lYml0cyxlYm4wLEdhaW4pOworICAgIGVsc2UgaWYoVmVyYm9zZSA9PSAwKQorICAgICAgcHJpbnRmKCJCRVIgJWxsZC8lbGxkICglLjNnKSBGRVIgJWQvJWQgKCUuM2cpXG4iLAorCSAgICAgdG90X2VycnMsKGxvbmcgbG9uZylmcmFtZWJpdHMqdHJpYWxzLHRvdF9lcnJzLygoZG91YmxlKWZyYW1lYml0cyp0cmlhbHMpLAorCSAgICAgYmFkZnJhbWVzLHRyKzEsKGRvdWJsZSliYWRmcmFtZXMvKHRyKzEpKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgLyogRG8gdGltZSB0cmlhbHMgKi8KKyAgICBtZW1zZXQoc3ltYm9scywxMjcsc2l6ZW9mKHN5bWJvbHMpKTsKKyAgICBwcmludGYoIlN0YXJ0aW5nIHRpbWUgdHJpYWxzXG4iKTsKKyAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJnN0YXJ0KTsKKyAgICBmb3IodHI9MDt0ciA8IHRyaWFsczt0cisrKXsKKyAgICAgIC8qIEluaXRpYWxpemUgVml0ZXJiaSBkZWNvZGVyICovCisgICAgICBpbml0X3ZpdGVyYmkzOSh2cCwwKTsKKyAgICAgIAorICAgICAgLyogRGVjb2RlIGJsb2NrICovCisgICAgICB1cGRhdGVfdml0ZXJiaTM5X2Jsayh2cCxzeW1ib2xzLGZyYW1lYml0cyk7CisgICAgICAKKyAgICAgIC8qIERvIFZpdGVyYmkgY2hhaW5iYWNrICovCisgICAgICBjaGFpbmJhY2tfdml0ZXJiaTM5KHZwLGRhdGEsZnJhbWViaXRzLDApOworICAgIH0KKyAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsJmZpbmlzaCk7CisgICAgZXh0aW1lID0gZmluaXNoLnJ1X3V0aW1lLnR2X3NlYyAtIHN0YXJ0LnJ1X3V0aW1lLnR2X3NlYyArIDFlLTYqKGZpbmlzaC5ydV91dGltZS50dl91c2VjIC0gc3RhcnQucnVfdXRpbWUudHZfdXNlYyk7CisgICAgcHJpbnRmKCJFeGVjdXRpb24gdGltZSBmb3IgJWQgJWQtYml0IGZyYW1lczogJS4yZiBzZWNcbiIsdHJpYWxzLAorCSAgIGZyYW1lYml0cyxleHRpbWUpOworICAgIHByaW50ZigiZGVjb2RlciBzcGVlZDogJWcgYml0cy9zXG4iLHRyaWFscypmcmFtZWJpdHMvZXh0aW1lKTsKKyAgfQorICBleGl0KDApOworfQorCisKZGlmZiAtLWdpdCBhL2ZlYy92dGVzdDYxNS5jIGIvZmVjL3Z0ZXN0NjE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkOGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZlYy92dGVzdDYxNS5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiBUZXN0IHZpdGVyYmkgZGVjb2RlciBzcGVlZHMgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpZmRlZiBIQVZFX0dFVE9QVF9ICisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJmZWMuaCIKKworI2lmIEhBVkVfR0VUT1BUX0xPTkcKK3N0cnVjdCBvcHRpb24gT3B0aW9uc1tdID0geworICB7ImZyYW1lLWxlbmd0aCIsMSxOVUxMLCdsJ30sCisgIHsiZnJhbWUtY291bnQiLDEsTlVMTCwnbid9LAorICB7ImVibjAiLDEsTlVMTCwnZSd9LAorICB7ImdhaW4iLDEsTlVMTCwnZyd9LAorICB7InZlcmJvc2UiLDAsTlVMTCwndid9LAorICB7ImZvcmNlLWFsdGl2ZWMiLDAsTlVMTCwnYSd9LAorICB7ImZvcmNlLXBvcnQiLDAsTlVMTCwncCd9LAorICB7ImZvcmNlLW1teCIsMCxOVUxMLCdtJ30sCisgIHsiZm9yY2Utc3NlIiwwLE5VTEwsJ3MnfSwKKyAgeyJmb3JjZS1zc2UyIiwwLE5VTEwsJ3QnfSwKKyAge05VTEx9LAorfTsKKyNlbmRpZgorCisjZGVmaW5lIFJBVEUgKDEuLzYuKQorI2RlZmluZSBNQVhCWVRFUyAxMDAwMAorI2RlZmluZSBPRkZTRVQgKDEyNy41KQorI2RlZmluZSBDTElQIDI1NQorCitkb3VibGUgR2FpbiA9IDI0LjA7CitpbnQgVmVyYm9zZSA9IDA7CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSl7CisgIGludCBpLGQsdHI7CisgIGludCBzcj0wLHRyaWFscyA9IDEwLGVycmNudCxmcmFtZWJpdHM9MjA0ODsKKyAgaW50IHRvdF9lcnJzPTA7CisgIHVuc2lnbmVkIGNoYXIgYml0c1tNQVhCWVRFU107CisgIHVuc2lnbmVkIGNoYXIgZGF0YVtNQVhCWVRFU107CisgIHVuc2lnbmVkIGNoYXIgeG9yZGF0YVtNQVhCWVRFU107CisgIHVuc2lnbmVkIGNoYXIgc3ltYm9sc1s4KjYqKE1BWEJZVEVTKzE0KV07CisgIHZvaWQgKnZwOworICBleHRlcm4gY2hhciAqb3B0YXJnOworICBzdHJ1Y3QgcnVzYWdlIHN0YXJ0LGZpbmlzaDsKKyAgZG91YmxlIGV4dGltZTsKKyAgZG91YmxlIGdhaW4sZXNuMCxlYm4wOworICB0aW1lX3QgdDsKKyAgaW50IGJhZGZyYW1lcz0wOworCisgIHRpbWUoJnQpOworICBzcmFuZG9tKHQpOworICBlYm4wID0gLTEwMDsKKyNpZiBIQVZFX0dFVE9QVF9MT05HCisgIHdoaWxlKChkID0gZ2V0b3B0X2xvbmcoYXJnYyxhcmd2LCJsOm46dGU6Zzp2YXBtc3QiLE9wdGlvbnMsTlVMTCkpICE9IEVPRil7CisjZWxzZQorICB3aGlsZSgoZCA9IGdldG9wdChhcmdjLGFyZ3YsImw6bjp0ZTpnOnZhcG1zdCIpKSAhPSBFT0YpeworI2VuZGlmCisgICAgc3dpdGNoKGQpeworICAgIGNhc2UgJ2EnOgorICAgICAgQ3B1X21vZGUgPSBBTFRJVkVDOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgICBDcHVfbW9kZSA9IFBPUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIENwdV9tb2RlID0gTU1YOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBDcHVfbW9kZSA9IFNTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgQ3B1X21vZGUgPSBTU0UyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBmcmFtZWJpdHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICduJzoKKyAgICAgIHRyaWFscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgorICAgICAgZWJuMCA9IGF0b2Yob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgR2FpbiA9IGF0b2Yob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3YnOgorICAgICAgVmVyYm9zZSsrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKGZyYW1lYml0cyA+IDgqTUFYQllURVMpeworICAgIGZwcmludGYoc3RkZXJyLCJGcmFtZSBsaW1pdGVkIHRvICVkIGJpdHNcbiIsTUFYQllURVMqOCk7CisgICAgZnJhbWViaXRzID0gTUFYQllURVMqODsKKyAgfQorICBpZigodnAgPSBjcmVhdGVfdml0ZXJiaTYxNShmcmFtZWJpdHMpKSA9PSBOVUxMKXsKKyAgICBwcmludGYoImNyZWF0ZV92aXRlcmJpNjE1IGZhaWxlZFxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICBpZihlYm4wICE9IC0xMDApeworICAgIGVzbjAgPSBlYm4wICsgMTAqbG9nMTAoKGRvdWJsZSlSQVRFKTsgLyogRXMvTm8gaW4gZEIgKi8KKyAgICAvKiBDb21wdXRlIG5vaXNlIHZvbHRhZ2UuIFRoZSAwLjUgZmFjdG9yIGFjY291bnRzIGZvciBCUFNLIHNlZWluZworICAgICAqIG9ubHkgaGFsZiB0aGUgbm9pc2UgcG93ZXIsIGFuZCB0aGUgc3FydCgpIGNvbnZlcnRzIHBvd2VyIHRvCisgICAgICogdm9sdGFnZS4KKyAgICAgKi8KKyAgICBnYWluID0gMS4vc3FydCgwLjUvcG93KDEwLixlc24wLzEwLikpOworICAgIAorICAgIHByaW50ZigibmZyYW1lcyA9ICVkIGZyYW1lc2l6ZSA9ICVkIGVibjAgPSAlLjJmIGRCIGdhaW4gPSAlZ1xuIix0cmlhbHMsZnJhbWViaXRzLGVibjAsR2Fpbik7CisgICAgCisgICAgZm9yKHRyPTA7dHI8dHJpYWxzO3RyKyspeworICAgICAgLyogRW5jb2RlIGEgZnJhbWUgb2YgcmFuZG9tIGRhdGEgKi8KKyAgICAgIGZvcihpPTA7aTxmcmFtZWJpdHMrMTQ7aSsrKXsKKwlpbnQgYml0ID0gKGkgPCBmcmFtZWJpdHMpID8gKHJhbmRvbSgpICYgMSkgOiAwOworCQorCXNyID0gKHNyIDw8IDEpIHwgYml0OworCWJpdHNbaS84XSA9IHNyICYgMHhmZjsKKwlzeW1ib2xzWzYqaSswXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZQSksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKwlzeW1ib2xzWzYqaSsxXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZQiksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKwlzeW1ib2xzWzYqaSsyXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZQyksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKwlzeW1ib2xzWzYqaSszXSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZRCksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKwlzeW1ib2xzWzYqaSs0XSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZRSksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKwlzeW1ib2xzWzYqaSs1XSA9IGFkZG5vaXNlKHBhcml0eShzciAmIFY2MTVQT0xZRiksZ2FpbixHYWluLE9GRlNFVCxDTElQKTsKKyAgICAgIH0KKyAgICAgIC8qIERlY29kZSBpdCBhbmQgbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgYW5zd2VyICovCisgICAgICAvKiBJbml0aWFsaXplIFZpdGVyYmkgZGVjb2RlciAqLworICAgICAgaW5pdF92aXRlcmJpNjE1KHZwLDApOworICAgICAgCisgICAgICAvKiBEZWNvZGUgYmxvY2sgKi8KKyAgICAgIHVwZGF0ZV92aXRlcmJpNjE1X2Jsayh2cCxzeW1ib2xzLGZyYW1lYml0cysxNCk7CisgICAgICAKKyAgICAgIC8qIERvIFZpdGVyYmkgY2hhaW5iYWNrICovCisgICAgICBjaGFpbmJhY2tfdml0ZXJiaTYxNSh2cCxkYXRhLGZyYW1lYml0cywwKTsKKyAgICAgIGVycmNudCA9IDA7CisgICAgICBmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwlpbnQgZSA9IEJpdGNudFt4b3JkYXRhW2ldID0gZGF0YVtpXSBeIGJpdHNbaV1dOworCWVycmNudCArPSBlOworCXRvdF9lcnJzICs9IGU7CisgICAgICB9CisgICAgICBpZihlcnJjbnQgIT0gMCkKKwliYWRmcmFtZXMrKzsKKyAgICAgIGlmKFZlcmJvc2UgPiAxICYmIGVycmNudCAhPSAwKXsKKwlwcmludGYoImZyYW1lICVkLCAlZCBlcnJvcnM6ICIsdHIsZXJyY250KTsKKwlmb3IoaT0wO2k8ZnJhbWViaXRzLzg7aSsrKXsKKwkgIHByaW50ZigiJTAyeCIseG9yZGF0YVtpXSk7CisJfQorCXByaW50ZigiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKFZlcmJvc2UpCisJcHJpbnRmKCJCRVIgJWQvJWQgKCUxMC4zZykgRkVSICVkLyVkICglMTAuM2cpXHIiLAorCSAgICAgICB0b3RfZXJycyxmcmFtZWJpdHMqKHRyKzEpLHRvdF9lcnJzLygoZG91YmxlKWZyYW1lYml0cyoodHIrMSkpLAorCSAgICAgICBiYWRmcmFtZXMsKHRyKzEpLChkb3VibGUpYmFkZnJhbWVzLyh0cisxKSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIH0KKworICAgIGlmKFZlcmJvc2UgPiAxKQorICAgICAgcHJpbnRmKCJuZnJhbWVzID0gJWQgZnJhbWVzaXplID0gJWQgZWJuMCA9ICUuMmYgZEIgZ2FpbiA9ICVnXG4iLHRyaWFscyxmcmFtZWJpdHMsZWJuMCxHYWluKTsKKyAgICBlbHNlIGlmKFZlcmJvc2UgPT0gMCkKKwlwcmludGYoIkJFUiAlZC8lZCAoJS4zZykgRkVSICVkLyVkICglLjNnKVxuIiwKKwkgICAgICAgdG90X2VycnMsZnJhbWViaXRzKih0cisxKSx0b3RfZXJycy8oKGRvdWJsZSlmcmFtZWJpdHMqKHRyKzEpKSwKKwkgICAgICAgYmFkZnJhbWVzLCh0cisxKSwoZG91YmxlKWJhZGZyYW1lcy8odHIrMSkpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBEbyB0aW1lIHRyaWFscyAqLworICAgIG1lbXNldChzeW1ib2xzLDEyNyxzaXplb2Yoc3ltYm9scykpOworICAgIHByaW50ZigiU3RhcnRpbmcgdGltZSB0cmlhbHNcbiIpOworICAgIGdldHJ1c2FnZShSVVNBR0VfU0VMRiwmc3RhcnQpOworICAgIGZvcih0cj0wO3RyIDwgdHJpYWxzO3RyKyspeworICAgICAgLyogSW5pdGlhbGl6ZSBWaXRlcmJpIGRlY29kZXIgKi8KKyAgICAgIGluaXRfdml0ZXJiaTYxNSh2cCwwKTsKKworICAgICAgLyogRGVjb2RlIGJsb2NrICovCisgICAgICB1cGRhdGVfdml0ZXJiaTYxNV9ibGsodnAsc3ltYm9scyxmcmFtZWJpdHMrMTQpOworCisgICAgICAvKiBEbyBWaXRlcmJpIGNoYWluYmFjayAqLworICAgICAgY2hhaW5iYWNrX3ZpdGVyYmk2MTUodnAsZGF0YSxmcmFtZWJpdHMsMCk7CisgICAgfQorICAgIGdldHJ1c2FnZShSVVNBR0VfU0VMRiwmZmluaXNoKTsKKyAgICBleHRpbWUgPSBmaW5pc2gucnVfdXRpbWUudHZfc2VjIC0gc3RhcnQucnVfdXRpbWUudHZfc2VjICsgMWUtNiooZmluaXNoLnJ1X3V0aW1lLnR2X3VzZWMgLSBzdGFydC5ydV91dGltZS50dl91c2VjKTsKKyAgICBwcmludGYoIkV4ZWN1dGlvbiB0aW1lIGZvciAlZCAlZC1iaXQgZnJhbWVzOiAlLjJmIHNlY1xuIix0cmlhbHMsCisJICAgZnJhbWViaXRzLGV4dGltZSk7CisgICAgcHJpbnRmKCJkZWNvZGVyIHNwZWVkOiAlZyBiaXRzL3NcbiIsdHJpYWxzKmZyYW1lYml0cy9leHRpbWUpOworICB9CisgIGV4aXQoMCk7Cit9Cg==