LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCioqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCioqICAgPiBTb2Z0d2FyZSBSZWxlYXNlIDIuMSAoMjAwOC0wNikKKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKioKKiogICCpIDIwMDQgUG9seWNvbSwgSW5jLgoqKgoqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRmlsZW5hbWU6IHJtbHRfY29lZnNfdG9fc2FtcGxlcy5jCioKKiBQdXJwb3NlOiAgQ29udmVydCBSZXZlcnNlZCBNTFQgKE1vZHVsYXRlZCBMYXBwZWQgVHJhbnNmb3JtKSAKKiAgICAgICAgICAgQ29lZmZpY2llbnRzIHRvIFNhbXBsZXMKKgoqICAgICBUaGUgIlJldmVyc2VkIE1MVCIgaXMgYW4gb3ZlcmxhcHBlZCBibG9jayB0cmFuc2Zvcm0gd2hpY2ggdXNlcwoqICAgICBldmVuIHN5bW1ldHJ5ICogb24gdGhlIGxlZnQsIG9kZCBzeW1tZXRyeSBvbiB0aGUgcmlnaHQgYW5kIGEKKiAgICAgVHlwZSBJViBEQ1QgYXMgdGhlIGJsb2NrIHRyYW5zZm9ybS4gICogSXQgaXMgdGh1cyBzaW1pbGFyIHRvIGEKKiAgICAgTUxUIHdoaWNoIHVzZXMgb2RkIHN5bW1ldHJ5IG9uIHRoZSBsZWZ0LCBldmVuIHN5bW1ldHJ5ICogb24gdGhlCiogICAgIHJpZ2h0IGFuZCBhIFR5cGUgSVYgRFNUIGFzIHRoZSBibG9jayB0cmFuc2Zvcm0uICBJbiBmYWN0LCBpdCBpcwoqICAgICBlcXVpdmFsZW50ICogdG8gcmV2ZXJzaW5nIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcywgcGVyZm9ybWluZwoqICAgICBhbiBNTFQgYW5kIHRoZW4gbmVnYXRpbmcgYWxsICogdGhlIGV2ZW4tbnVtYmVyZWQgY29lZmZpY2llbnRzLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgImRlZnMuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAiY291bnQuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICAgcm1sdF9jb2Vmc190b19zYW1wbGVzIAoKIFN5bnRheDogICAgICAgdm9pZCBybWx0X2NvZWZzX3RvX3NhbXBsZXMoV29yZDE2ICpjb2VmcywgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX3NhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm91dF9zYW1wbGVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGRjdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYWdfc2hpZnQpICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgaW5wdXRzOiAgICBXb3JkMTYgKmNvZWZzCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpvbGRfc2FtcGxlcwogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBkY3RfbGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1hZ19zaGlmdAogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBvdXRwdXRzOiAgIFdvcmQxNiAqb3V0X3NhbXBsZXMKICAgICAgICAgICAgICAgCiBEZXNjcmlwdGlvbjogIENvbnZlcnRzIHRoZSBtbHRfY29lZnMgdG8gc2FtcGxlcwoKIERlc2lnbiBOb3RlczoKIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgICAxLjkxICAgICB8ICAgIDEuOTEKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAgMS45MSAgICAgfCAgICAxLjkxCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCgkJCQkKICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdCAgICAgIHwgICAgIDQ4a2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgICAzLjk3ICAgICB8ICAgIDMuOTcgICAgICAgIHwgICAgIDMuOTcgICAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIE1BWCAgfCAgICAgMy45NyAgICAgfCAgICAzLjk3ICAgICAgICB8ICAgICAzLjk3ICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBybWx0X2NvZWZzX3RvX3NhbXBsZXMoV29yZDE2ICpjb2VmcywgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm9sZF9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm91dF9zYW1wbGVzLCAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBkY3RfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWFnX3NoaWZ0KSAgICAgICAgICAgICAKewoKICAgIAogICAgV29yZDE2CWluZGV4LCB2YWxzX2xlZnQ7CiAgICBXb3JkMTYJbmV3X3NhbXBsZXNbTUFYX0RDVF9MRU5HVEhdOwogICAgV29yZDE2CSpuZXdfcHRyLCAqb2xkX3B0cjsKICAgIFdvcmQxNgkqd2luX25ldywgKndpbl9vbGQ7CiAgICBXb3JkMTYJKm91dF9wdHI7CiAgICBXb3JkMTYgIGhhbGZfZGN0X3NpemU7CiAgICBXb3JkMzIgIHN1bTsKCiAgICAKCiAgICBoYWxmX2RjdF9zaXplID0gc2hyX25vY2hlY2soZGN0X2xlbmd0aCwxKTsKICAgIAogICAgLyogUGVyZm9ybSBhIFR5cGUgSVYgKGludmVyc2UpIERDVCBvbiB0aGUgY29lZmZpY2llbnRzICovCiAgICBkY3RfdHlwZV9pdl9zKGNvZWZzLCBuZXdfc2FtcGxlcywgZGN0X2xlbmd0aCk7CiAgICAKICAgIHRlc3QoKTsKICAgIGlmIChtYWdfc2hpZnQgPiAwKSAKICAgIHsKICAgICAgICBmb3IoaW5kZXg9MDtpbmRleDxkY3RfbGVuZ3RoO2luZGV4KyspCiAgICAgICAgewogICAgICAgICAgICBuZXdfc2FtcGxlc1tpbmRleF0gPSBzaHJfbm9jaGVjayhuZXdfc2FtcGxlc1tpbmRleF0sbWFnX3NoaWZ0KTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKG1hZ19zaGlmdCA8IDApIAogICAgICAgIHsKICAgICAgICAgICAgbWFnX3NoaWZ0ID0gbmVnYXRlKG1hZ19zaGlmdCk7CiAgICAgICAgICAgIGZvcihpbmRleD0wO2luZGV4PGRjdF9sZW5ndGg7aW5kZXgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV3X3NhbXBsZXNbaW5kZXhdID0gc2hsX25vY2hlY2sobmV3X3NhbXBsZXNbaW5kZXhdLG1hZ19zaGlmdCk7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgLyogR2V0IHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB3aW5kb3dlZCBzYW1wbGVzICovCiAgICAKICAgIG91dF9wdHIgPSBvdXRfc2FtcGxlczsKICAgIG1vdmUxNigpOwogICAgdGVzdCgpOwogICAgaWYgKGRjdF9sZW5ndGg9PURDVF9MRU5HVEgpCiAgICB7CiAgICAgICAgd2luX25ldyA9IHJtbHRfdG9fc2FtcGxlc193aW5kb3c7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgd2luX29sZCA9IHJtbHRfdG9fc2FtcGxlc193aW5kb3cgKyBkY3RfbGVuZ3RoOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdpbl9uZXcgPSBtYXhfcm1sdF90b19zYW1wbGVzX3dpbmRvdzsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB3aW5fb2xkID0gbWF4X3JtbHRfdG9fc2FtcGxlc193aW5kb3cgKyBkY3RfbGVuZ3RoOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgb2xkX3B0ciA9IG9sZF9zYW1wbGVzOwogICAgbW92ZTE2KCk7CiAgICBuZXdfcHRyID0gbmV3X3NhbXBsZXMgKyBoYWxmX2RjdF9zaXplOwogICAgbW92ZTE2KCk7CiAgICAKICAgIGZvciAodmFsc19sZWZ0ID0gaGFsZl9kY3Rfc2l6ZTsgICAgdmFsc19sZWZ0ID4gMDsgICAgdmFsc19sZWZ0LS0pCiAgICB7CiAgICAgICAgc3VtID0gMEw7CiAgICAgICAgbW92ZTMyKCk7CiAgICAgICAgc3VtID0gTF9tYWMoc3VtLCp3aW5fbmV3KyssICotLW5ld19wdHIpOwogICAgICAgIHN1bSA9IExfbWFjKHN1bSwqLS13aW5fb2xkLCAqb2xkX3B0cisrKTsKICAgICAgICAqb3V0X3B0cisrID0gaXR1X3JvdW5kKExfc2hsX25vY2hlY2soc3VtLDIpKTsKICAgICAgICBtb3ZlMTYoKTsKCiAgICB9CiAgICAKICAgIC8qIEdldCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvd2VkIHNhbXBsZXMgKi8KICAgIAogICAgZm9yICh2YWxzX2xlZnQgPSBoYWxmX2RjdF9zaXplOyAgICB2YWxzX2xlZnQgPiAwOyAgICB2YWxzX2xlZnQtLSkKICAgIHsKICAgICAgICBzdW0gPSAwTDsKICAgICAgICBtb3ZlMzIoKTsKICAgICAgICBzdW0gPSBMX21hYyhzdW0sKndpbl9uZXcrKywgKm5ld19wdHIrKyk7CiAgICAgICAgc3VtID0gTF9tYWMoc3VtLG5lZ2F0ZSgqLS13aW5fb2xkKSwgKi0tb2xkX3B0cik7CiAgICAgICAgKm91dF9wdHIrKyA9IGl0dV9yb3VuZChMX3NobF9ub2NoZWNrKHN1bSwyKSk7CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CiAgICAgICAgCiAgICAvKiBTYXZlIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgbmV3IHNhbXBsZXMgZm9yICAgKi8KICAgIC8qIG5leHQgdGltZSwgd2hlbiB0aGV5IHdpbGwgYmUgdGhlIG9sZCBzYW1wbGVzLiAqLwogICAgCiAgICAvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KICAgIG5ld19wdHIgPSBuZXdfc2FtcGxlcyArIGhhbGZfZGN0X3NpemU7CiAgICBtb3ZlMTYoKTsKICAgIG9sZF9wdHIgPSBvbGRfc2FtcGxlczsKICAgIG1vdmUxNigpOwogICAgZm9yICh2YWxzX2xlZnQgPSBoYWxmX2RjdF9zaXplOyAgICB2YWxzX2xlZnQgPiAwOyAgICB2YWxzX2xlZnQtLSkKICAgIHsKICAgICAgICAqb2xkX3B0cisrID0gKm5ld19wdHIrKzsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KfQo=