LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKioJIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlbmFtZTogZGN0X3R5cGVfaXZfYS5jCioKKiBQdXJwb3NlOiAgRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSwgVHlwZSBJViB1c2VkIGZvciBNTFQKKgoqIFRoZSBiYXNpcyBmdW5jdGlvbnMgYXJlCioKKgkgY29zKFBJKih0KzAuNSkqKGsrMC41KS9ibG9ja19sZW5ndGgpCioKKiBmb3IgdGltZSB0IGFuZCBiYXNpcyBmdW5jdGlvbiBudW1iZXIgay4gIER1ZSB0byB0aGUgc3ltbWV0cnkgb2YgdGhlIGV4cHJlc3Npb24KKiBpbiB0IGFuZCBrLCBpdCBpcyBjbGVhciB0aGF0IHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIHRyYW5zZm9ybXMgYXJlIHRoZSBzYW1lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJjb3VudC5oIgojaW5jbHVkZSAiZGN0NF9hLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFeHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpleHRlcm4gV29yZDE2ICAgICAgIGFuYWxfYmlhc1tEQ1RfTEVOR1RIXTsKZXh0ZXJuIFdvcmQxNiAgICAgICBkY3RfY29yZV9hW0RDVF9MRU5HVEhfRElWXzMyXVtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl8yIFtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl80IFtEQ1RfTEVOR1RIX0RJVl8xNl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl84IFtEQ1RfTEVOR1RIX0RJVl84XTsKZXh0ZXJuIGNvc19tc2luX3QgICBhX2Nvc19tc2luXzE2W0RDVF9MRU5HVEhfRElWXzRdOwpleHRlcm4gY29zX21zaW5fdCAgIGFfY29zX21zaW5fMzJbRENUX0xFTkdUSF9ESVZfMl07CmV4dGVybiBjb3NfbXNpbl90ICAgYV9jb3NfbXNpbl82NFtEQ1RfTEVOR1RIXTsKZXh0ZXJuIGNvc19tc2luX3QgICAqYV9jb3NfbXNpbl90YWJsZVtdOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGRjdF90eXBlX2l2X2EKCiBTeW50YXg6ICAgICAgdm9pZCBkY3RfdHlwZV9pdl9hIChpbnB1dCwgb3V0cHV0LCBkY3RfbGVuZ3RoKSAKICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgaW5wdXRbXSwgb3V0cHV0W10sIGRjdF9sZW5ndGg7ICAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSwgVHlwZSBJViB1c2VkIGZvciBNTFQKCiBEZXNpZ24gTm90ZXM6CiAgICAgICAgICAgICAgICAKIFdNT1BTOiAgICAgICAgICB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMS4xNCAgICAgIHwgICAgIDEuMTQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAxLjE0ICAgICAgfCAgICAgMS4xNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAyLjU3ICAgICAgfCAgICAgMi41NyAgICAgICB8ICAgICAyLjU3CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMi41NyAgICAgIHwgICAgIDIuNTcgICAgICAgfCAgICAgMi41NwogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgZGN0X3R5cGVfaXZfYSAoV29yZDE2ICppbnB1dCxXb3JkMTYgKm91dHB1dCxXb3JkMTYgZGN0X2xlbmd0aCkKewogICAgV29yZDE2ICAgYnVmZmVyX2FbTUFYX0RDVF9MRU5HVEhdLCBidWZmZXJfYltNQVhfRENUX0xFTkdUSF0sIGJ1ZmZlcl9jW01BWF9EQ1RfTEVOR1RIXTsKICAgIFdvcmQxNiAgICppbl9wdHIsICppbl9wdHJfbG93LCAqaW5fcHRyX2hpZ2gsICpuZXh0X2luX2Jhc2U7CiAgICBXb3JkMTYgICAqb3V0X3B0cl9sb3csICpvdXRfcHRyX2hpZ2gsICpuZXh0X291dF9iYXNlOwogICAgV29yZDE2ICAgKm91dF9idWZmZXIsICppbl9idWZmZXIsICpidWZmZXJfc3dhcDsKICAgIFdvcmQxNiAgIGluX3ZhbF9sb3csIGluX3ZhbF9oaWdoOwogICAgV29yZDE2ICAgb3V0X3ZhbF9sb3csIG91dF92YWxfaGlnaDsKICAgIFdvcmQxNiAgIGluX2xvd19ldmVuLCBpbl9sb3dfb2RkOwogICAgV29yZDE2ICAgaW5faGlnaF9ldmVuLCBpbl9oaWdoX29kZDsKICAgIFdvcmQxNiAgIG91dF9sb3dfZXZlbiwgb3V0X2xvd19vZGQ7CiAgICBXb3JkMTYgICBvdXRfaGlnaF9ldmVuLCBvdXRfaGlnaF9vZGQ7CiAgICBXb3JkMTYgICAqcGFpcl9wdHI7CiAgICBXb3JkMTYgICBjb3NfZXZlbiwgY29zX29kZCwgbXNpbl9ldmVuLCBtc2luX29kZDsKICAgIFdvcmQxNiAgIG5lZ19jb3Nfb2RkOwogICAgV29yZDE2ICAgbmVnX21zaW5fZXZlbjsKICAgIFdvcmQzMiAgIHN1bTsKICAgIFdvcmQxNiAgIHNldF9zcGFuLCBzZXRfY291bnQsIHNldF9jb3VudF9sb2csIHBhaXJzX2xlZnQsIHNldHNfbGVmdDsKICAgIFdvcmQxNiAgIGksazsKICAgIFdvcmQxNiAgIGluZGV4OwogICAgY29zX21zaW5fdCAgKip0YWJsZV9wdHJfcHRyLCAqY29zX21zaW5fcHRyOwogICAgCiAgICBXb3JkMTYgICB0ZW1wOwogICAgV29yZDMyICAgYWNjYTsKCiAgICBXb3JkMTYgICBkY3RfbGVuZ3RoX2xvZzsKCgogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogRG8gdGhlIHN1bS9kaWZmZXJlbmNlIGJ1dHRlcmZsaWVzLCB0aGUgZmlyc3QgcGFydCBvZiAqLwogICAgLyogY29udmVydGluZyBvbmUgTi1wb2ludCB0cmFuc2Zvcm0gaW50byBOLzIgdHdvLXBvaW50ICAqLwogICAgLyogdHJhbnNmb3Jtcywgd2hlcmUgTiA9IDEgPDwgRENUX0xFTkdUSF9MT0cuID0gNjQvMTI4ICAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgdGVzdCgpOwogICAgaWYgKGRjdF9sZW5ndGg9PURDVF9MRU5HVEgpCiAgICB7CiAgICAgICAgZGN0X2xlbmd0aF9sb2cgPSBEQ1RfTEVOR1RIX0xPRzsKCiAgICAgICAgLyogQWRkIGJpYXMgb2Zmc2V0cyAqLwogICAgICAgIGZvciAoaT0wO2k8ZGN0X2xlbmd0aDtpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnB1dFtpXSA9IGFkZChpbnB1dFtpXSxhbmFsX2JpYXNbaV0pOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgZGN0X2xlbmd0aF9sb2cgPSBNQVhfRENUX0xFTkdUSF9MT0c7CgogICAgaW5kZXggPSAwTDsKICAgIG1vdmUxNigpOwoKICAgIGluX2J1ZmZlciAgPSBpbnB1dDsKICAgIG1vdmUxNigpOwoKICAgIG91dF9idWZmZXIgPSBidWZmZXJfYTsKICAgIG1vdmUxNigpOwoKICAgIHRlbXAgPSBzdWIoZGN0X2xlbmd0aF9sb2csMik7CiAgICBmb3IgKHNldF9jb3VudF9sb2c9MDtzZXRfY291bnRfbG9nPD10ZW1wO3NldF9jb3VudF9sb2crKykKICAgIHsKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgogICAgICAgIC8qICAgIHNldF9zcGFuICAgICAgPSAxIDw8IChEQ1RfTEVOR1RIX0xPRyAtIHNldF9jb3VudF9sb2cpOyAqLwogICAgICAgIHNldF9zcGFuID0gc2hyKGRjdF9sZW5ndGgsc2V0X2NvdW50X2xvZyk7CgogICAgICAgIHNldF9jb3VudCAgICAgPSBzaGwoMSxzZXRfY291bnRfbG9nKTsKCiAgICAgICAgaW5fcHRyICAgICAgICA9IGluX2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dF9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogTG9vcCBvdmVyIGFsbCB0aGUgc2V0cyBvZiB0aGlzIHNpemUgKi8KICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgICBmb3IgKHNldHNfbGVmdD1zZXRfY291bnQ7c2V0c19sZWZ0PjA7c2V0c19sZWZ0LS0pCiAgICAgICAgewoKICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIC8qIFNldCB1cCBvdXRwdXQgcG9pbnRlcnMgZm9yIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KCiAgICAgICAgICAgIG91dF9wdHJfbG93ICAgID0gbmV4dF9vdXRfYmFzZTsKICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSAgPSBuZXh0X291dF9iYXNlICsgc2V0X3NwYW47CiAgICAgICAgICAgIG91dF9wdHJfaGlnaCAgID0gbmV4dF9vdXRfYmFzZTsKCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBidXR0ZXJmbGllcyBpbiB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCgogICAgICAgICAgICBkbyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW5fdmFsX2xvdyAgICAgID0gKmluX3B0cisrOwogICAgICAgICAgICAgICAgaW5fdmFsX2hpZ2ggICAgID0gKmluX3B0cisrOwogICAgICAgICAgICAgICAgYWNjYSAgICAgICAgICAgID0gTF9hZGQoaW5fdmFsX2xvdyxpbl92YWxfaGlnaCk7CiAgICAgICAgICAgICAgICBhY2NhICAgICAgICAgICAgPSBMX3NocihhY2NhLDEpOwogICAgICAgICAgICAgICAgb3V0X3ZhbF9sb3cgICAgID0gZXh0cmFjdF9sKGFjY2EpOwoKICAgICAgICAgICAgICAgIGFjY2EgICAgICAgICAgICA9IExfc3ViKGluX3ZhbF9sb3csaW5fdmFsX2hpZ2gpOwogICAgICAgICAgICAgICAgYWNjYSAgICAgICAgICAgID0gTF9zaHIoYWNjYSwxKTsKICAgICAgICAgICAgICAgIG91dF92YWxfaGlnaCAgICA9IGV4dHJhY3RfbChhY2NhKTsKCiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfdmFsX2xvdzsKICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF92YWxfaGlnaDsKCiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKCiAgICAgICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldHMgb2YgdGhlIGN1cnJlbnQgc2l6ZSAqLwoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogRGVjaWRlIHdoaWNoIGJ1ZmZlcnMgdG8gdXNlIGFzIGlucHV0IGFuZCBvdXRwdXQgbmV4dCB0aW1lLiAqLwogICAgICAgIC8qIEV4Y2VwdCBmb3IgdGhlIGZpcnN0IHRpbWUgKHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgICAgKi8KICAgICAgICAvKiBzdWJyb3V0aW5lIGlucHV0KSB3ZSBqdXN0IGFsdGVybmF0ZSB0aGUgbG9jYWwgYnVmZmVycy4gICAgICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgICBpbl9idWZmZXIgPSBvdXRfYnVmZmVyOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGlmIChvdXRfYnVmZmVyID09IGJ1ZmZlcl9hKQogICAgICAgICAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2I7CiAgICAgICAgZWxzZQogICAgICAgICAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2E7CiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsMSk7CgogICAgfSAvKiBFbmQgb2YgbG9vcCBvdmVyIHNldCBzaXplcyAqLwoKCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIERvIE4vMiB0d28tcG9pbnQgdHJhbnNmb3JtcywgICAqLwogICAgLyogd2hlcmUgTiA9ICAxIDw8IERDVF9MRU5HVEhfTE9HICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KCiAgICBwYWlyX3B0ciA9IGluX2J1ZmZlcjsKICAgIG1vdmUxNigpOwoKICAgIGJ1ZmZlcl9zd2FwID0gYnVmZmVyX2M7CiAgICBtb3ZlMTYoKTsKCiAgICB0ZW1wID0gc3ViKGRjdF9sZW5ndGhfbG9nLDEpOwogICAgdGVtcCA9IHNobCgxLHRlbXApOwoKICAgIGZvciAocGFpcnNfbGVmdD10ZW1wOyBwYWlyc19sZWZ0ID4gMDsgcGFpcnNfbGVmdC0tKQogICAgewogICAgICAgIGZvciAoIGs9MDsgazxDT1JFX1NJWkU7IGsrKyApCiAgICAgICAgewogICAgICAgICAgICBzdW09MEw7CiAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICBmb3IgKCBpPTA7IGk8Q09SRV9TSVpFOyBpKysgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdW0gPSBMX21hYyhzdW0sIHBhaXJfcHRyW2ldLGRjdF9jb3JlX2FbaV1ba10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1ZmZlcl9zd2FwW2tdID0gcm91bmQoc3VtKTsKICAgICAgICB9CiAgICAgICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCiAgICAgICAgcGFpcl9wdHIgICArPSBDT1JFX1NJWkU7CiAgICAgICAgYnVmZmVyX3N3YXAgKz0gQ09SRV9TSVpFOwogICAgfQoKICAgIGZvciAoaT0wO2k8ZGN0X2xlbmd0aDtpKyspCiAgICB7CiAgICAgICAgaW5fYnVmZmVyW2ldID0gYnVmZmVyX2NbaV07CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAKICAgIHRhYmxlX3B0cl9wdHIgPSBhX2Nvc19tc2luX3RhYmxlOwoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIFBlcmZvcm0gcm90YXRpb24gYnV0dGVyZmxpZXMgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIHRlbXAgPSBzdWIoZGN0X2xlbmd0aF9sb2csMik7CiAgICBmb3IgKHNldF9jb3VudF9sb2cgPSB0ZW1wOyBzZXRfY291bnRfbG9nID49IDA7ICAgIHNldF9jb3VudF9sb2ctLSkKICAgIHsKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBmb3IgdGhlIGxvb3Agb3ZlciBzZXRzIGF0IHRoZSBjdXJyZW50IHNpemUgKi8KICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiAgICBzZXRfc3BhbiAgICAgID0gMSA8PCAoRENUX0xFTkdUSF9MT0cgLSBzZXRfY291bnRfbG9nKTsgKi8KICAgICAgICBzZXRfc3BhbiA9IHNocihkY3RfbGVuZ3RoLHNldF9jb3VudF9sb2cpOwoKICAgICAgICBzZXRfY291bnQgICAgID0gc2hsKDEsc2V0X2NvdW50X2xvZyk7CiAgICAgICAgbmV4dF9pbl9iYXNlICA9IGluX2J1ZmZlcjsKICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmIChzZXRfY291bnRfbG9nID09IDApCiAgICAgICAgewogICAgICAgICAgICBuZXh0X291dF9iYXNlID0gb3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBuZXh0X291dF9iYXNlID0gb3V0X2J1ZmZlcjsKICAgICAgICB9CgoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIHNldHMgb2YgdGhpcyBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICBmb3IgKHNldHNfbGVmdCA9IHNldF9jb3VudDsgc2V0c19sZWZ0ID4gMDtzZXRzX2xlZnQtLSkKICAgICAgICB7CiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAvKiBTZXQgdXAgdGhlIHBvaW50ZXJzIGZvciB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIGluX3B0cl9sb3cgICAgID0gbmV4dF9pbl9iYXNlOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgdGVtcCAgICAgICAgICAgPSBzaHIoc2V0X3NwYW4sMSk7CgogICAgICAgICAgICAvKiBhZGRyZXNzIGFyaXRobWV0aWMgKi8KICAgICAgICAgICAgaW5fcHRyX2hpZ2ggICAgPSBpbl9wdHJfbG93ICsgdGVtcDsKICAgICAgICAgICAgbmV4dF9pbl9iYXNlICArPSBzZXRfc3BhbjsKICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgIGNvc19tc2luX3B0ciAgID0gKnRhYmxlX3B0cl9wdHI7CgogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZseSBwYWlycyBpbiB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwoKICAgICAgICAgICAgZG8gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLwogICAgICAgICAgICAgICAgaW5fbG93X2V2ZW4gICAgID0gKmluX3B0cl9sb3crKzsKICAgICAgICAgICAgICAgIGluX2xvd19vZGQgICAgICA9ICppbl9wdHJfbG93Kys7CiAgICAgICAgICAgICAgICBpbl9oaWdoX2V2ZW4gICAgPSAqaW5fcHRyX2hpZ2grKzsKICAgICAgICAgICAgICAgIGluX2hpZ2hfb2RkICAgICA9ICppbl9wdHJfaGlnaCsrOwogICAgICAgICAgICAgICAgY29zX2V2ZW4gICAgICAgID0gY29zX21zaW5fcHRyWzBdLmNvc2luZTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgbXNpbl9ldmVuICAgICAgID0gY29zX21zaW5fcHRyWzBdLm1pbnVzX3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGNvc19vZGQgICAgICAgICA9IGNvc19tc2luX3B0clsxXS5jb3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIG1zaW5fb2RkICAgICAgICA9IGNvc19tc2luX3B0clsxXS5taW51c19zaW5lOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBjb3NfbXNpbl9wdHIgICArPSAyOwoKICAgICAgICAgICAgICAgIHN1bSA9IDBMOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxjb3NfZXZlbixpbl9sb3dfZXZlbik7CiAgICAgICAgICAgICAgICBuZWdfbXNpbl9ldmVuID0gbmVnYXRlKG1zaW5fZXZlbik7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG5lZ19tc2luX2V2ZW4saW5faGlnaF9ldmVuKTsKICAgICAgICAgICAgICAgIG91dF9sb3dfZXZlbiA9IHJvdW5kKHN1bSk7CgogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLG1zaW5fZXZlbixpbl9sb3dfZXZlbik7CiAgICAgICAgICAgICAgICBzdW09TF9tYWMoc3VtLGNvc19ldmVuLGluX2hpZ2hfZXZlbik7CiAgICAgICAgICAgICAgICBvdXRfaGlnaF9ldmVuPSByb3VuZChzdW0pOwoKICAgICAgICAgICAgICAgIHN1bSA9IDBMOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxjb3Nfb2RkLGluX2xvd19vZGQpOwogICAgICAgICAgICAgICAgc3VtPUxfbWFjKHN1bSxtc2luX29kZCxpbl9oaWdoX29kZCk7CiAgICAgICAgICAgICAgICBvdXRfbG93X29kZD0gcm91bmQoc3VtKTsKCiAgICAgICAgICAgICAgICBzdW0gPSAwTDsKICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sbXNpbl9vZGQsaW5fbG93X29kZCk7CiAgICAgICAgICAgICAgICBuZWdfY29zX29kZCA9IG5lZ2F0ZShjb3Nfb2RkKTsKICAgICAgICAgICAgICAgIHN1bT1MX21hYyhzdW0sbmVnX2Nvc19vZGQsaW5faGlnaF9vZGQpOwogICAgICAgICAgICAgICAgb3V0X2hpZ2hfb2RkPSByb3VuZChzdW0pOwoKICAgICAgICAgICAgICAgICpvdXRfcHRyX2xvdysrICA9IG91dF9sb3dfZXZlbjsKICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF9oaWdoX2V2ZW47CiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfbG93X29kZDsKICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF9oaWdoX29kZDsKICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgfSB3aGlsZSAob3V0X3B0cl9sb3cgPCBvdXRfcHRyX2hpZ2gpOwoKICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCgogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBTd2FwIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IgbmV4dCB0aW1lICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgICBidWZmZXJfc3dhcCA9IGluX2J1ZmZlcjsKICAgICAgICBpbl9idWZmZXIgICA9IG91dF9idWZmZXI7CiAgICAgICAgb3V0X2J1ZmZlciAgPSBidWZmZXJfc3dhcDsKICAgICAgICB0YWJsZV9wdHJfcHRyKys7CiAgICB9Cn0KCg==