LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioKKiogIEZpbGUgICAgICAgIDogc3RtMzJfZmxhc2gubGQKKioKKiogIEFic3RyYWN0ICAgIDogTGlua2VyIHNjcmlwdCBmb3IgU1RNMzJGMTAwUkIgRGV2aWNlIHdpdGgKKiogICAgICAgICAgICAgICAgMTI4S0J5dGUgRkxBU0gsIDhLQnl0ZSBSQU0KKioKKiogICAgICAgICAgICAgICAgU2V0IGhlYXAgc2l6ZSwgc3RhY2sgc2l6ZSBhbmQgc3RhY2sgbG9jYXRpb24gYWNjb3JkaW5nCioqICAgICAgICAgICAgICAgIHRvIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4KKioKKiogICAgICAgICAgICAgICAgU2V0IG1lbW9yeSBiYW5rIGFyZWEgYW5kIHNpemUgaWYgZXh0ZXJuYWwgbWVtb3J5IGlzIHVzZWQuCioqCioqICBUYXJnZXQgICAgICA6IFNUTWljcm9lbGVjdHJvbmljcyBTVE0zMgoqKgoqKiAgRW52aXJvbm1lbnQgOiBBdG9sbGljIFRydWVTVFVESU8oUikKKioKKiogIERpc3RyaWJ1dGlvbjogVGhlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgk2FzIGlzLJQgd2l0aG91dCBhbnkgd2FycmFudHkKKiogICAgICAgICAgICAgICAgb2YgYW55IGtpbmQuCioqCioqICAoYylDb3B5cmlnaHQgQXRvbGxpYyBBQi4KKiogIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYW5kIHVzZWQgd2l0aCB0aGUgRnJlZVJUT1MgZXhhbXBsZSBwcm9qZWN0IAoqKiAgZm9yIEF0b2xsaWMgVHJ1ZVNUVURJTyBvbmx5LiAKKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCi8qIEVudHJ5IFBvaW50ICovCkVOVFJZKFJlc2V0X0hhbmRsZXIpCgovKiBIaWdoZXN0IGFkZHJlc3Mgb2YgdGhlIHVzZXIgbW9kZSBzdGFjayAqLwpfZXN0YWNrID0gMHgyMDAwMjAwMDsgICAgLyogZW5kIG9mIDhLIFJBTSAqLwoKLyogR2VuZXJhdGUgYSBsaW5rIGVycm9yIGlmIGhlYXAgYW5kIHN0YWNrIGRvbid0IGZpdCBpbnRvIFJBTSAqLwpfTWluX0hlYXBfU2l6ZSA9IDA7ICAgICAgLyogcmVxdWlyZWQgYW1vdW50IG9mIGhlYXAgICovCl9NaW5fU3RhY2tfU2l6ZSA9IDB4ODA7IC8qIHJlcXVpcmVkIGFtb3VudCBvZiBzdGFjayAqLwoKLyogU3BlY2lmeSB0aGUgbWVtb3J5IGFyZWFzICovCk1FTU9SWQp7CiAgRkxBU0ggKHJ4KSAgICAgIDogT1JJR0lOID0gMHgwODAwMDAwMCwgTEVOR1RIID0gMTI4SwogIFJBTSAoeHJ3KSAgICAgICA6IE9SSUdJTiA9IDB4MjAwMDAwMDAsIExFTkdUSCA9IDhLCiAgTUVNT1JZX0IxIChyeCkgIDogT1JJR0lOID0gMHg2MDAwMDAwMCwgTEVOR1RIID0gMEsKfQoKLyogRGVmaW5lIG91dHB1dCBzZWN0aW9ucyAqLwpTRUNUSU9OUwp7CiAgLyogVGhlIHN0YXJ0dXAgY29kZSBnb2VzIGZpcnN0IGludG8gRkxBU0ggKi8KICAuaXNyX3ZlY3RvciA6CiAgewogICAgLiA9IEFMSUdOKDQpOwogICAgS0VFUCgqKC5pc3JfdmVjdG9yKSkgLyogU3RhcnR1cCBjb2RlICovCiAgICAuID0gQUxJR04oNCk7CiAgfSA+RkxBU0gKCiAgLyogVGhlIHByb2dyYW0gY29kZSBhbmQgb3RoZXIgZGF0YSBnb2VzIGludG8gRkxBU0ggKi8KICAudGV4dCA6CiAgewogICAgLiA9IEFMSUdOKDQpOwogICAgKigudGV4dCkgICAgICAgICAgIC8qIC50ZXh0IHNlY3Rpb25zIChjb2RlKSAqLwogICAgKigudGV4dCopICAgICAgICAgIC8qIC50ZXh0KiBzZWN0aW9ucyAoY29kZSkgKi8KICAgICooLnJvZGF0YSkgICAgICAgICAvKiAucm9kYXRhIHNlY3Rpb25zIChjb25zdGFudHMsIHN0cmluZ3MsIGV0Yy4pICovCiAgICAqKC5yb2RhdGEqKSAgICAgICAgLyogLnJvZGF0YSogc2VjdGlvbnMgKGNvbnN0YW50cywgc3RyaW5ncywgZXRjLikgKi8KICAgICooLmdsdWVfNykgICAgICAgICAvKiBnbHVlIGFybSB0byB0aHVtYiBjb2RlICovCiAgICAqKC5nbHVlXzd0KSAgICAgICAgLyogZ2x1ZSB0aHVtYiB0byBhcm0gY29kZSAqLwoJKiguZWhfZnJhbWUpCgogICAgS0VFUCAoKiguaW5pdCkpCiAgICBLRUVQICgqKC5maW5pKSkKCiAgICAuID0gQUxJR04oNCk7CiAgICBfZXRleHQgPSAuOyAgICAgICAgLyogZGVmaW5lIGEgZ2xvYmFsIHN5bWJvbHMgYXQgZW5kIG9mIGNvZGUgKi8KICB9ID5GTEFTSAoKCiAgIC5BUk0uZXh0YWIgICA6IHsgKiguQVJNLmV4dGFiKiAuZ251LmxpbmtvbmNlLmFybWV4dGFiLiopIH0gPkZMQVNICiAgICAuQVJNIDogewogICAgX19leGlkeF9zdGFydCA9IC47CiAgICAgICooLkFSTS5leGlkeCopCiAgICAgIF9fZXhpZHhfZW5kID0gLjsKICAgIH0gPkZMQVNICgogIC5wcmVpbml0X2FycmF5ICAgICA6CiAgewogICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOwogICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSopKQogICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKICB9ID5GTEFTSAogIC5pbml0X2FycmF5IDoKICB7CiAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CiAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQogICAgS0VFUCAoKiguaW5pdF9hcnJheSopKQogICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKICB9ID5GTEFTSAogIC5maW5pX2FycmF5IDoKICB7CiAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CiAgICBLRUVQICgqKC5maW5pX2FycmF5KikpCiAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQogICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKICB9ID5GTEFTSAoKICAvKiB1c2VkIGJ5IHRoZSBzdGFydHVwIHRvIGluaXRpYWxpemUgZGF0YSAqLwogIF9zaWRhdGEgPSBMT0FEQUREUiguZGF0YSk7CgogIC8qIEluaXRpYWxpemVkIGRhdGEgc2VjdGlvbnMgZ29lcyBpbnRvIFJBTSwgbG9hZCBMTUEgY29weSBhZnRlciBjb2RlICovCiAgLmRhdGEgOiBBVCAoIF9zaWRhdGEgKQogIHsKICAgIC4gPSBBTElHTig0KTsKICAgIF9zZGF0YSA9IC47ICAgICAgICAvKiBjcmVhdGUgYSBnbG9iYWwgc3ltYm9sIGF0IGRhdGEgc3RhcnQgKi8KICAgICooLmRhdGEpICAgICAgICAgICAvKiAuZGF0YSBzZWN0aW9ucyAqLwogICAgKiguZGF0YSopICAgICAgICAgIC8qIC5kYXRhKiBzZWN0aW9ucyAqLwoKICAgIC4gPSBBTElHTig0KTsKICAgIF9lZGF0YSA9IC47ICAgICAgICAvKiBkZWZpbmUgYSBnbG9iYWwgc3ltYm9sIGF0IGRhdGEgZW5kICovCiAgfSA+UkFNCgogIC8qIFVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uICovCiAgLiA9IEFMSUdOKDQpOwogIC5ic3MgOgogIHsKICAgIC8qIFRoaXMgaXMgdXNlZCBieSB0aGUgc3RhcnR1cCBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZSAuYnNzIHNlY2lvbiAqLwogICAgX3Nic3MgPSAuOyAgICAgICAgIC8qIGRlZmluZSBhIGdsb2JhbCBzeW1ib2wgYXQgYnNzIHN0YXJ0ICovCiAgICBfX2Jzc19zdGFydF9fID0gX3Nic3M7CiAgICAqKC5ic3MpCiAgICAqKC5ic3MqKQogICAgKihDT01NT04pCgogICAgLiA9IEFMSUdOKDQpOwogICAgX2Vic3MgPSAuOyAgICAgICAgIC8qIGRlZmluZSBhIGdsb2JhbCBzeW1ib2wgYXQgYnNzIGVuZCAqLwogICAgX19ic3NfZW5kX18gPSBfZWJzczsKICB9ID5SQU0KCiAgUFJPVklERSAoIGVuZCA9IF9lYnNzICk7CiAgUFJPVklERSAoIF9lbmQgPSBfZWJzcyApOwoKICAvKiBVc2VyX2hlYXBfc3RhY2sgc2VjdGlvbiwgdXNlZCB0byBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBSQU0gbGVmdCAqLwogIC5fdXNlcl9oZWFwX3N0YWNrIDoKICB7CiAgICAuID0gQUxJR04oNCk7CiAgICAuID0gLiArIF9NaW5fSGVhcF9TaXplOwogICAgLiA9IC4gKyBfTWluX1N0YWNrX1NpemU7CiAgICAuID0gQUxJR04oNCk7CiAgfSA+UkFNCgogIC8qIE1FTU9SWV9iYW5rMSBzZWN0aW9uLCBjb2RlIG11c3QgYmUgbG9jYXRlZCBoZXJlIGV4cGxpY2l0bHkgICAgICAgICAgICAqLwogIC8qIEV4YW1wbGU6IGV4dGVybiBpbnQgZm9vKHZvaWQpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLm1iMXRleHQiKSkpOyAqLwogIC5tZW1vcnlfYjFfdGV4dCA6CiAgewogICAgKigubWIxdGV4dCkgICAgICAgIC8qIC5tYjF0ZXh0IHNlY3Rpb25zIChjb2RlKSAqLwogICAgKigubWIxdGV4dCopICAgICAgIC8qIC5tYjF0ZXh0KiBzZWN0aW9ucyAoY29kZSkgICovCiAgICAqKC5tYjFyb2RhdGEpICAgICAgLyogcmVhZC1vbmx5IGRhdGEgKGNvbnN0YW50cykgKi8KICAgICooLm1iMXJvZGF0YSopCiAgfSA+TUVNT1JZX0IxCgogIC8qIFJlbW92ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJpZXMgKi8KICAvRElTQ0FSRC8gOgogIHsKICAgIGxpYmMuYSAoICogKQogICAgbGlibS5hICggKiApCiAgICBsaWJnY2MuYSAoICogKQogIH0KCiAgLkFSTS5hdHRyaWJ1dGVzIDAgOiB7ICooLkFSTS5hdHRyaWJ1dGVzKSB9Cn0K