LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24uIE1hcmNoLCAyMDEwCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgIlJlZ2lzdGVySW5mb1g4Ni5oIgoKc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvKj4gUmVnaXN0ZXJJbmZvWDg2OjpzUmVnaXN0ZXJHcm91cEluZm9zOwoKc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvKj4mIFJlZ2lzdGVySW5mb1g4Njo6Z2V0UmVnaXN0ZXJHcm91cEluZm8oKSB7CglpZiAoc1JlZ2lzdGVyR3JvdXBJbmZvcy5zaXplKCkgPT0gMCkKCQlzZXR1cFJlZ2lzdGVyR3JvdXBJbmZvKCk7CgkKCXJldHVybiBzUmVnaXN0ZXJHcm91cEluZm9zOwp9CgkKUmVnaXN0ZXJJbmZvKiBSZWdpc3RlckluZm9YODY6OnNldHVwUmVnaXN0ZXIoUHJvcGVydGllcyYgY29tbVByb3BzLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiByb2xlKSB7CglQcm9wZXJ0aWVzIHByb3BzOwoJcHJvcHNbUFJPUF9OQU1FXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKG5hbWUpOwoJaWYgKHJvbGUgIT0gTlVMTCkKCQlwcm9wc1tQUk9QX1JPTEVdID0gbmV3IFByb3BlcnR5VmFsdWUocm9sZSk7CgkKCXJldHVybiBuZXcgUmVnaXN0ZXJJbmZvKGNvbW1Qcm9wcywgcHJvcHMpOwp9CgovKgogKiBTZXQgdXAgc3RhdGljIGluZm8gZm9yIHg4NiBiYXNpYyBwcm9ncmFtIGV4ZWN1dGlvbiByZWdpc3RlcnMKICogd2hpY2ggaW5jbHVkZXMgR1BSLCBTZWdtZW50IFJlZ2lzdGVycyBhbmQgRUZMQUdTICYgRUlQLgogKiBTZWUgIkludGVsriA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXKScyBNYW51YWwiIFZvbCAxLgogKi8KUmVnaXN0ZXJHcm91cEluZm8qIFJlZ2lzdGVySW5mb1g4Njo6c2V0dXBSZWdHcm91cF9CYXNpYygpIHsKCS8vIFByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCByZWdpc3RlcnMgaW4gdGhlIGdyb3VwCgkvLwoJUHJvcGVydGllcyBjb21tb25Qcm9wczsKCgljb21tb25Qcm9wc1tQUk9QX1NJWkVdID0gbmV3IFByb3BlcnR5VmFsdWUoNCk7Cgljb21tb25Qcm9wc1tQUk9QX1JFQURBQkxFXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRydWUpOwoJY29tbW9uUHJvcHNbUFJPUF9XUklURUFCTEVdID0gbmV3IFByb3BlcnR5VmFsdWUodHJ1ZSk7CgkvLyBwYXNzIHZhbHVlIGluIGJpZy1lbmRpYW4gc3RyaW5nLgoJLy8gQ3VycmVudGx5IEVEQyBob3N0IHNpZGUgZG9lcyBub3QgaG9ub3IgdGhpcyB5ZXQsIGluc3RlYWQKCS8vIGl0IGFsd2F5cyBhc3N1bWUgYmlnLWVuZGlhbi4uLi4wMi8yOC8xMAoJY29tbW9uUHJvcHNbUFJPUF9CSUdfRU5ESUFOXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRydWUpOwoJLy8gU2VlIFRDRiBSZWdpc3RlcnNQcm94eS5Db250ZXh0IGZvciBkZWZhdWx0IHZhbHVlcyBvZiBvdGhlciBwcm9wZXJ0aWVzLgoKCXN0ZDo6bGlzdDxSZWdpc3RlckluZm8qPiByZWdzOwoKCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFQVgiLCBOVUxMKSk7CglyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRUNYIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVEWCIsIE5VTEwpKTsKCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFQlgiLCBOVUxMKSk7CglyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRVNQIiwgUk9MRV9TUCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVCUCIsIFJPTEVfRlApKTsKCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFU0kiLCBOVUxMKSk7CglyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRURJIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkdTIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkZTIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVTIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkRTIiwgTlVMTCkpOwoJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVJUCIsIFJPTEVfUEMpKTsKCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJDUyIsIE5VTEwpKTsKCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFRkwiLCBOVUxMKSk7CglyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiU1MiLCBOVUxMKSk7CgoJUHJvcGVydGllcyBncm91cFByb3BzOwoJZ3JvdXBQcm9wc1tQUk9QX05BTUVdID0JbmV3IFByb3BlcnR5VmFsdWUoIkJhc2ljIik7Cglncm91cFByb3BzW1BST1BfREVTQ1JJUFRJT05dID0gbmV3IFByb3BlcnR5VmFsdWUoIkJhc2ljIFByb2dyYW0gRXhlY3V0aW9uIFJlZ2lzdGVycyBvZiB4ODYiKTsKCWdyb3VwUHJvcHNbUFJPUF9ST0xFXSA9CW5ldyBQcm9wZXJ0eVZhbHVlKFJPTEVfQ09SRSk7CgoJcmV0dXJuIG5ldyBSZWdpc3Rlckdyb3VwSW5mbyhncm91cFByb3BzLCByZWdzKTsKfQoKLyoKICogU2V0IHVwIHN0YXRpYyBpbmZvIGFib3V0IGFsbCByZWdpc3RlcnMgYW5kIHJlZ2lzdGVyIGdyb3VwcyBzdXBwb3J0ZWQuCiAqIE5vdGUgdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4KICovCnZvaWQgUmVnaXN0ZXJJbmZvWDg2OjpzZXR1cFJlZ2lzdGVyR3JvdXBJbmZvKCkgewoJc1JlZ2lzdGVyR3JvdXBJbmZvcy5wdXNoX2JhY2soc2V0dXBSZWdHcm91cF9CYXNpYygpKTsKfQo=