LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKioJIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlbmFtZTogZGN0X3R5cGVfaXZfYS5jCioKKiBQdXJwb3NlOiAgRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSwgVHlwZSBJViB1c2VkIGZvciBNTFQKKgoqIFRoZSBiYXNpcyBmdW5jdGlvbnMgYXJlCioKKgkgY29zKFBJKih0KzAuNSkqKGsrMC41KS9ibG9ja19sZW5ndGgpCioKKiBmb3IgdGltZSB0IGFuZCBiYXNpcyBmdW5jdGlvbiBudW1iZXIgay4gIER1ZSB0byB0aGUgc3ltbWV0cnkgb2YgdGhlIGV4cHJlc3Npb24KKiBpbiB0IGFuZCBrLCBpdCBpcyBjbGVhciB0aGF0IHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIHRyYW5zZm9ybXMgYXJlIHRoZSBzYW1lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJjb3VudC5oIgojaW5jbHVkZSAiZGN0NF9hLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFeHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpleHRlcm4gV29yZDE2ICAgICAgIGFuYWxfYmlhc1tEQ1RfTEVOR1RIXTsKZXh0ZXJuIFdvcmQxNiAgICAgICBkY3RfY29yZV9hW0RDVF9MRU5HVEhfRElWXzMyXVtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl8yIFtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl80IFtEQ1RfTEVOR1RIX0RJVl8xNl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl84IFtEQ1RfTEVOR1RIX0RJVl84XTsKZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzE2W0RDVF9MRU5HVEhfRElWXzRdOwpleHRlcm4gY29zX21zaW5fdCAgIGFfY29zX21zaW5fMzJbRENUX0xFTkdUSF9ESVZfMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl82NFtEQ1RfTEVOR1RIXTsKZXh0ZXJuIGNvc19tc2luX3QgICAqYV9jb3NfbXNpbl90YWJsZVtdOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGRjdF90eXBlX2l2X2EKCiBTeW50YXg6ICAgICAgdm9pZCBkY3RfdHlwZV9pdl9hIChpbnB1dCwgb3V0cHV0LCBkY3RfbGVuZ3RoKSAKICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgaW5wdXRbXSwgb3V0cHV0W10sIGRjdF9sZW5ndGg7ICAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSwgVHlwZSBJViB1c2VkIGZvciBNTFQKCiBEZXNpZ24gTm90ZXM6CiAgICAgICAgICAgICAgICAKIFdNT1BTOiAgICAgICAgICB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMS4xNCAgICAgIHwgICAgIDEuMTQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAxLjE0ICAgICAgfCAgICAgMS4xNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAyLjU3ICAgICAgfCAgICAgMi41NyAgICAgICB8ICAgICAyLjU3CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMi41NyAgICAgIHwgICAgIDIuNTcgICAgICAgfCAgICAgMi41NwogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgZGN0X3R5cGVfaXZfYSAoV29yZDE2ICppbnB1dCxXb3JkMTYgKm91dHB1dCxXb3JkMTYgZGN0X2xlbmd0aCkKewogICAgV29yZDE2ICAgYnVmZmVyX2FbTUFYX0RDVF9MRU5HVEhdLCBidWZmZXJfYltNQVhfRENUX0xFTkdUSF0sIGJ1ZmZlcl9jW01BWF9EQ1RfTEVOR1RIXTsKICAgIFdvcmQxNiAgICppbl9wdHIsICppbl9wdHJfbG93LCAqaW5fcHRyX2hpZ2gsICpuZXh0X2luX2Jhc2U7CiAgICBXb3JkMTYgICAqb3V0X3B0cl9sb3csICpvdXRfcHRyX2hpZ2gsICpuZXh0X291dF9iYXNlOwogICAgV29yZDE2ICAgKm91dF9idWZmZXIsICppbl9idWZmZXIsICpidWZmZXJfc3dhcDsKICAgIFdvcmQxNiAgIGluX3ZhbF9sb3csIGluX3ZhbF9oaWdoOwogICAgV29yZDE2ICAgb3V0X3ZhbF9sb3csIG91dF92YWxfaGlnaDsKICAgIFdvcmQxNiAgIGluX2xvd19ldmVuLCBpbl9sb3dfb2RkOwogICAgV29yZDE2ICAgaW5faGlnaF9ldmVuLCBpbl9oaWdoX29kZDsKICAgIFdvcmQxNiAgIG91dF9sb3dfZXZlbiwgb3V0X2xvd19vZGQ7CiAgICBXb3JkMTYgICBvdXRfaGlnaF9ldmVuLCBvdXRfaGlnaF9vZGQ7CiAgICBXb3JkMTYgICAqcGFpcl9wdHI7CiAgICBXb3JkMTYgICBjb3NfZXZlbiwgY29zX29kZCwgbXNpbl9ldmVuLCBtc2luX29kZDsKICAgIFdvcmQxNiAgIG5lZ19jb3Nfb2RkOwogICAgV29yZDE2ICAgbmVnX21zaW5fZXZlbjsKICAgIFdvcmQzMiAgIHN1bTsKICAgIFdvcmQxNiAgIHNldF9zcGFuLCBzZXRfY291bnQsIHNldF9jb3VudF9sb2csIHBhaXJzX2xlZnQsIHNldHNfbGVmdDsKICAgIFdvcmQxNiAgIGksazsKICAgIFdvcmQxNiAgIGluZGV4OwogICAgY29zX21zaW5fdCAgKip0YWJsZV9wdHJfcHRyLCAqY29zX21zaW5fcHRyOwogICAgCiAgICBXb3JkMTYgICB0ZW1wOwogICAgV29yZDMyICAgYWNjYTsKCiAgICBXb3JkMTYgICBkY3RfbGVuZ3RoX2xvZzsKCgogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogRG8gdGhlIHN1bS9kaWZmZXJlbmNlIGJ1dHRlcmZsaWVzLCB0aGUgZmlyc3QgcGFydCBvZiAqLwogICAgLyogY29udmVydGluZyBvbmUgTi1wb2ludCB0cmFuc2Zvcm0gaW50byBOLzIgdHdvLXBvaW50ICAqLwogICAgLyogdHJhbnNmb3Jtcywgd2hlcmUgTiA9IDEgPDwgRENUX0xFTkdUSF9MT0cuID0gNjQvMTI4ICAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgdGVzdCgpOwogICAgaWYgKGRjdF9sZW5ndGg9PURDVF9MRU5HVEgpCiAgICB7CiAgICAgICAgZGN0X2xlbmd0aF9sb2cgPSBEQ1RfTEVOR1RIX0xPRzsKCiAgICAgICAgLyogQWRkIGJpYXMgb2Zmc2V0cyAqLwogICAgICAgIGZvciAoaT0wO2k8ZGN0X2xlbmd0aDtpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnB1dFtpXSA9IGFkZChpbnB1dFtpXSxhbmFsX2JpYXNbaV0pOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgZGN0X2xlbmd0aF9sb2cgPSBNQVhfRENUX0xFTkdUSF9MT0c7CgogICAgaW5kZXggPSAwTDsKICAgIG1vdmUxNigpOwoKICAgIGluX2J1ZmZlciAgPSBpbnB1dDsKICAgIG1vdmUxNigpOwoKICAgIG91dF9idWZmZXIgPSBidWZmZXJfYTsKICAgIG1vdmUxNigpOwoKICAgIHRlbXAgPSBzdWIoZGN0X2xlbmd0aF9sb2csMik7CiAgICBmb3IgKHNldF9jb3VudF9sb2c9MDtzZXRfY291bnRfbG9nPD10ZW1wO3NldF9jb3VudF9sb2crKykKICAgIHsKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgogICAgICAgIC8qICAgIHNldF9zcGFuICAgICAgPSAxIDw8IChEQ1RfTEVOR1RIX0xPRyAtIHNldF9jb3VudF9sb2cpOyAqLwogICAgICAgIHNldF9zcGFuID0gc2hyX25vY2hlY2soZGN0X2xlbmd0aCxzZXRfY291bnRfbG9nKTsKCiAgICAgICAgc2V0X2NvdW50ICAgICA9IHNobF9ub2NoZWNrKDEsc2V0X2NvdW50X2xvZyk7CgogICAgICAgIGluX3B0ciAgICAgICAgPSBpbl9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIG5leHRfb3V0X2Jhc2UgPSBvdXRfYnVmZmVyOwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIHNldHMgb2YgdGhpcyBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiAgICAgICAgZm9yIChzZXRzX2xlZnQ9c2V0X2NvdW50O3NldHNfbGVmdD4wO3NldHNfbGVmdC0tKQogICAgICAgIHsKCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAvKiBTZXQgdXAgb3V0cHV0IHBvaW50ZXJzIGZvciB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCgogICAgICAgICAgICBvdXRfcHRyX2xvdyAgICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgIG5leHRfb3V0X2Jhc2UgID0gbmV4dF9vdXRfYmFzZSArIHNldF9zcGFuOwogICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CgogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgLyogTG9vcCBvdmVyIGFsbCB0aGUgYnV0dGVyZmxpZXMgaW4gdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwoKICAgICAgICAgICAgZG8gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluX3ZhbF9sb3cgICAgICA9ICppbl9wdHIrKzsKICAgICAgICAgICAgICAgIGluX3ZhbF9oaWdoICAgICA9ICppbl9wdHIrKzsKCQkvLyBibHA6IGFkZGl0aW9uIG9mIHR3byAxNmJpdHMgdmFycywgdGhlcmUncyBubyB3YXkKCQkvLyAgICAgIHRoZXknbGwgb3ZlcmZsb3cgYSAzMmJpdCB2YXIKICAgICAgICAgICAgICAgIC8vYWNjYSAgICAgICAgICAgID0gTF9hZGQoaW5fdmFsX2xvdyxpbl92YWxfaGlnaCk7CgkJYWNjYSA9IChpbl92YWxfbG93ICsgaW5fdmFsX2hpZ2gpOwoJCWFjY2EgICAgICAgICAgICA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKICAgICAgICAgICAgICAgIG91dF92YWxfbG93ICAgICA9IGV4dHJhY3RfbChhY2NhKTsKCiAgICAgICAgICAgICAgICBhY2NhICAgICAgICAgICAgPSBMX3N1Yihpbl92YWxfbG93LGluX3ZhbF9oaWdoKTsKICAgICAgICAgICAgICAgIGFjY2EgICAgICAgICAgICA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKICAgICAgICAgICAgICAgIG91dF92YWxfaGlnaCAgICA9IGV4dHJhY3RfbChhY2NhKTsKCiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfdmFsX2xvdzsKICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF92YWxfaGlnaDsKCiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKCiAgICAgICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldHMgb2YgdGhlIGN1cnJlbnQgc2l6ZSAqLwoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogRGVjaWRlIHdoaWNoIGJ1ZmZlcnMgdG8gdXNlIGFzIGlucHV0IGFuZCBvdXRwdXQgbmV4dCB0aW1lLiAqLwogICAgICAgIC8qIEV4Y2VwdCBmb3IgdGhlIGZpcnN0IHRpbWUgKHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgICAgKi8KICAgICAgICAvKiBzdWJyb3V0aW5lIGlucHV0KSB3ZSBqdXN0IGFsdGVybmF0ZSB0aGUgbG9jYWwgYnVmZmVycy4gICAgICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgICBpbl9idWZmZXIgPSBvdXRfYnVmZmVyOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGlmIChvdXRfYnVmZmVyID09IGJ1ZmZlcl9hKQogICAgICAgICAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2I7CiAgICAgICAgZWxzZQogICAgICAgICAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2E7CiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsMSk7CgogICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldCBzaXplcyAqLwoKCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIERvIE4vMiB0d28tcG9pbnQgdHJhbnNmb3JtcywgICAqLwogICAgLyogd2hlcmUgTiA9ICAxIDw8IERDVF9MRU5HVEhfTE9HICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KCiAgICBwYWlyX3B0ciA9IGluX2J1ZmZlcjsKICAgIG1vdmUxNigpOwoKICAgIGJ1ZmZlcl9zd2FwID0gYnVmZmVyX2M7CiAgICBtb3ZlMTYoKTsKCiAgICB0ZW1wID0gc3ViKGRjdF9sZW5ndGhfbG9nLDEpOwogICAgdGVtcCA9IHNobF9ub2NoZWNrKDEsdGVtcCk7CgogICAgZm9yIChwYWlyc19sZWZ0PXRlbXA7IHBhaXJzX2xlZnQgPiAwOyBwYWlyc19sZWZ0LS0pCiAgICB7CiAgICAgICAgZm9yICggaz0wOyBrPENPUkVfU0laRTsgaysrICkKICAgICAgICB7CiNpZiBQSl9IQVNfSU5UNjQKCSAgICAvKiBibHA6IGRhbmdlciBkYW5nZXIhIG5vdCByZWFsbHkgY29tcGF0aWJsZSBidXQgZmFzdGVyICovCgkgICAgcGpfaW50NjRfdCBzdW02ND0wOwogICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoIGk9MDsgaTxDT1JFX1NJWkU7IGkrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN1bTY0ICs9IExfbXVsdChwYWlyX3B0cltpXSwgZGN0X2NvcmVfYVtpXVtrXSk7CiAgICAgICAgICAgIH0KCSAgICBzdW0gPSBMX3NhdHVyYXRlKHN1bTY0KTsKI2Vsc2UKICAgICAgICAgICAgc3VtPTBMOwogICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgZm9yICggaT0wOyBpPENPUkVfU0laRTsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLCBwYWlyX3B0cltpXSxkY3RfY29yZV9hW2ldW2tdKTsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgYnVmZmVyX3N3YXBba10gPSBpdHVfcm91bmQoc3VtKTsKICAgICAgICB9CiAgICAgICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCiAgICAgICAgcGFpcl9wdHIgICArPSBDT1JFX1NJWkU7CiAgICAgICAgYnVmZmVyX3N3YXAgKz0gQ09SRV9TSVpFOwogICAgfQoKICAgIGZvciAoaT0wO2k8ZGN0X2xlbmd0aDtpKyspCiAgICB7CiAgICAgICAgaW5fYnVmZmVyW2ldID0gYnVmZmVyX2NbaV07CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAKICAgIHRhYmxlX3B0cl9wdHIgPSBhX2Nvc19tc2luX3RhYmxlOwoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIFBlcmZvcm0gcm90YXRpb24gYnV0dGVyZmxpZXMgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIHRlbXAgPSBzdWIoZGN0X2xlbmd0aF9sb2csMik7CiAgICBmb3IgKHNldF9jb3VudF9sb2cgPSB0ZW1wOyBzZXRfY291bnRfbG9nID49IDA7ICAgIHNldF9jb3VudF9sb2ctLSkKICAgIHsKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBmb3IgdGhlIGxvb3Agb3ZlciBzZXRzIGF0IHRoZSBjdXJyZW50IHNpemUgKi8KICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiAgICBzZXRfc3BhbiAgICAgID0gMSA8PCAoRENUX0xFTkdUSF9MT0cgLSBzZXRfY291bnRfbG9nKTsgKi8KICAgICAgICBzZXRfc3BhbiA9IHNocl9ub2NoZWNrKGRjdF9sZW5ndGgsc2V0X2NvdW50X2xvZyk7CgogICAgICAgIHNldF9jb3VudCAgICAgPSBzaGxfbm9jaGVjaygxLHNldF9jb3VudF9sb2cpOwogICAgICAgIG5leHRfaW5fYmFzZSAgPSBpbl9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAoc2V0X2NvdW50X2xvZyA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dF9idWZmZXI7CiAgICAgICAgfQoKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBzZXRzIG9mIHRoaXMgc2l6ZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgZm9yIChzZXRzX2xlZnQgPSBzZXRfY291bnQ7IHNldHNfbGVmdCA+IDA7c2V0c19sZWZ0LS0pCiAgICAgICAgewogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgLyogU2V0IHVwIHRoZSBwb2ludGVycyBmb3IgdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICBpbl9wdHJfbG93ICAgICA9IG5leHRfaW5fYmFzZTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIHRlbXAgICAgICAgICAgID0gc2hyX25vY2hlY2soc2V0X3NwYW4sMSk7CgogICAgICAgICAgICAvKiBhZGRyZXNzIGFyaXRobWV0aWMgKi8KICAgICAgICAgICAgaW5fcHRyX2hpZ2ggICAgPSBpbl9wdHJfbG93ICsgdGVtcDsKICAgICAgICAgICAgbmV4dF9pbl9iYXNlICArPSBzZXRfc3BhbjsKICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgIGNvc19tc2luX3B0ciAgID0gKnRhYmxlX3B0cl9wdHI7CgogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZseSBwYWlycyBpbiB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwoKICAgICAgICAgICAgZG8gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLwogICAgICAgICAgICAgICAgaW5fbG93X2V2ZW4gICAgID0gKmluX3B0cl9sb3crKzsKICAgICAgICAgICAgICAgIGluX2xvd19vZGQgICAgICA9ICppbl9wdHJfbG93Kys7CiAgICAgICAgICAgICAgICBpbl9oaWdoX2V2ZW4gICAgPSAqaW5fcHRyX2hpZ2grKzsKICAgICAgICAgICAgICAgIGluX2hpZ2hfb2RkICAgICA9ICppbl9wdHJfaGlnaCsrOwogICAgICAgICAgICAgICAgY29zX2V2ZW4gICAgICAgID0gY29zX21zaW5fcHRyWzBdLmNvc2luZTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgbXNpbl9ldmVuICAgICAgID0gY29zX21zaW5fcHRyWzBdLm1pbnVzX3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGNvc19vZGQgICAgICAgICA9IGNvc19tc2luX3B0clsxXS5jb3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIG1zaW5fb2RkICAgICAgICA9IGNvc19tc2luX3B0clsxXS5taW51c19zaW5lOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBjb3NfbXNpbl9wdHIgICArPSAyOwoKICAgICAgICAgICAgICAgIHN1bSA9IDBMOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxjb3NfZXZlbixpbl9sb3dfZXZlbik7CiAgICAgICAgICAgICAgICBuZWdfbXNpbl9ldmVuID0gbmVnYXRlKG1zaW5fZXZlbik7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG5lZ19tc2luX2V2ZW4saW5faGlnaF9ldmVuKTsKICAgICAgICAgICAgICAgIG91dF9sb3dfZXZlbiA9IGl0dV9yb3VuZChzdW0pOwoKICAgICAgICAgICAgICAgIHN1bSA9IDBMOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxtc2luX2V2ZW4saW5fbG93X2V2ZW4pOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxjb3NfZXZlbixpbl9oaWdoX2V2ZW4pOwogICAgICAgICAgICAgICAgb3V0X2hpZ2hfZXZlbj0gaXR1X3JvdW5kKHN1bSk7CgogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLGNvc19vZGQsaW5fbG93X29kZCk7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG1zaW5fb2RkLGluX2hpZ2hfb2RkKTsKICAgICAgICAgICAgICAgIG91dF9sb3dfb2RkPSBpdHVfcm91bmQoc3VtKTsKCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sbXNpbl9vZGQsaW5fbG93X29kZCk7CiAgICAgICAgICAgICAgICBuZWdfY29zX29kZCA9IG5lZ2F0ZShjb3Nfb2RkKTsKICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sbmVnX2Nvc19vZGQsaW5faGlnaF9vZGQpOwogICAgICAgICAgICAgICAgb3V0X2hpZ2hfb2RkPSBpdHVfcm91bmQoc3VtKTsKCiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfbG93X2V2ZW47CiAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfaGlnaF9ldmVuOwogICAgICAgICAgICAgICAgKm91dF9wdHJfbG93KysgID0gb3V0X2xvd19vZGQ7CiAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfaGlnaF9vZGQ7CiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKCiAgICAgICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldHMgb2YgdGhlIGN1cnJlbnQgc2l6ZSAqLwoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogU3dhcCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZm9yIG5leHQgdGltZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiAgICAgICAgYnVmZmVyX3N3YXAgPSBpbl9idWZmZXI7CiAgICAgICAgaW5fYnVmZmVyICAgPSBvdXRfYnVmZmVyOwogICAgICAgIG91dF9idWZmZXIgID0gYnVmZmVyX3N3YXA7CiAgICAgICAgdGFibGVfcHRyX3B0cisrOwogICAgfQp9Cgo=