LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMTEvMTcvOTkgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KI2lmbmRlZiBVTklUT0hFWF9ICiNkZWZpbmUgVU5JVE9IRVhfSAoKI2luY2x1ZGUgInVuaWNvZGUvdHJhbnNsaXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCgpjbGFzcyBVbmljb2RlRmlsdGVyOwoKLyoqCiAqIEEgdHJhbnNsaXRlcmF0b3IgdGhhdCBjb252ZXJ0cyBmcm9tIFVuaWNvZGUgY2hhcmFjdGVycyB0byAKICogaGV4YWRlY2ltYWwgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzLiAgSXQgb3V0cHV0cyBhCiAqIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25hbGx5IGNvbnZlcnRzIHRoZSBoZXgKICogZGlnaXRzIHRvIHVwcGVyY2FzZS4KICoKICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIHNldCBieSBhIHBhdHRlcm4uICBUaGlzIHBhdHRlcm4KICogZm9sbG93cyB0aGUgc2FtZSBzeW50YXggYXMgPGNvZGU+SGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3I8L2NvZGU+LAogKiBleGNlcHQgaXQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc3BlY2lmaWNhdGlvbnMuICBUaGUgcGF0dGVybiBzZXRzCiAqIHRoZSBwcmVmaXggc3RyaW5nLCBzdWZmaXggc3RyaW5nLCBhbmQgbWluaW11bSBhbmQgbWF4aW11bSBkaWdpdAogKiBjb3VudC4gIFRoZXJlIGFyZSBubyBzZXR0ZXJzIG9yIGdldHRlcnMgZm9yIHRoZXNlIGF0dHJpYnV0ZXM7IHRoZXkKICogYXJlIHNldCBvbmx5IHRocm91Z2ggdGhlIHBhdHRlcm4uCiAqCiAqIDxwPlRoZSBzZXRVcHBlcmNhc2UoKSBhbmQgaXNVcHBlcmNhc2UoKSBtZXRob2RzIGNvbnRyb2wgd2hldGhlciAnYScKICogdGhyb3VnaCAnZicgb3IgJ0EnIHRocm91Z2ggJ0YnIGFyZSBvdXRwdXQgYXMgaGV4IGRpZ2l0cy4gIFRoaXMgaXMKICogbm90IGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgcGF0dGVybjsgb25seSB0aHJvdWdoIHRoZSBtZXRob2RzLiAgVGhlCiAqIGRlZmF1bHQgaXMgdXBwZXJjYXNlLgogKgogKiBAYXV0aG9yIEFsYW4gTGl1CiAqLwpjbGFzcyBVX0kxOE5fQVBJIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yIDogcHVibGljIFRyYW5zbGl0ZXJhdG9yIHsKCnByaXZhdGU6CgogICAgLy8gQ2hhcmFjdGVyIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUgdG8gYXZvaWQgQVNDSUkgZGVwZW5kZW5jeQogICAgZW51bSB7CiAgICAgICAgWkVSTyAgICAgID0gMHgwMDMwLCAvLyAnMCcKICAgICAgICBQT1VORCAgICAgPSAweDAwMjMsIC8vICcjJwogICAgICAgIEJBQ0tTTEFTSCA9IDB4MDA1QyAgLy8gJ1xcJwogICAgfTsKCiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEVYX0RJR0lUU1szMl07CgogICAgLyoqCiAgICAgKiBJRCBmb3IgdGhpcyB0cmFuc2xpdGVyYXRvci4KICAgICAqLwogICAgc3RhdGljIGNvbnN0IGNoYXIqIF9JRDsKCiAgICAvKioKICAgICAqIFRoZSBwYXR0ZXJuIHNldCBieSBhcHBseVBhdHRlcm4oKSBhbmQgcmV0dXJuZWQgYnkgdG9QYXR0ZXJuKCkuCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKCiAgICAvKioKICAgICAqIFRoZSBzdHJpbmcgcHJlY2VkaW5nIHRoZSBoZXggZGlnaXRzLCBwYXJzZWQgZnJvbSB0aGUgcGF0dGVybi4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyBwcmVmaXg7CgogICAgLyoqCiAgICAgKiBUaGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgaGV4IGRpZ2l0cywgcGFyc2VkIGZyb20gdGhlIHBhdHRlcm4uCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgc3VmZml4OwoKICAgIC8qKgogICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGhleCBkaWdpdHMgdG8gb3V0cHV0LCBiZXR3ZWVuIDEgYW5kIDQsCiAgICAgKiBpbmNsdXNpdmUuICBQYXJzZWQgZnJvbSB0aGUgcGF0dGVybi4KICAgICAqLwogICAgaW50OF90IG1pbkRpZ2l0czsKCiAgICAvKioKICAgICAqIElmIFRSVUUsIG91dHB1dCB1cHBlcmNhc2UgaGV4IGRpZ2l0czsgb3RoZXJ3aXNlIG91dHB1dAogICAgICogbG93ZXJjYXNlLiAgU2V0IGJ5IHNldFVwcGVyY2FzZSgpIGFuZCByZXR1cm5lZCBieSBpc1VwcGVyY2FzZSgpLgogICAgICovCiAgICBib29sX3QgdXBwZXJjYXNlOwoKcHVibGljOgoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIHRyYW5zbGl0ZXJhdG9yLgogICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gZm9yIHRoaXMgdHJhbnNsaXRlcmF0b3IuICBTZWUKICAgICAqIGFwcGx5UGF0dGVybigpIGZvciBwYXR0ZXJuIHN5bnRheC4KICAgICAqIEBwYXJhbSB1cHBlcmNhc2UgaWYgdHJ1ZSwgdGhlIGZvdXIgaGV4IGRpZ2l0cyB3aWxsIGJlCiAgICAgKiBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlOyBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGxvd2VyY2FzZS4KICAgICAqIEBwYXJhbSBhZG9wdGVkRmlsdGVyIHRoZSBmaWx0ZXIgZm9yIHRoaXMgdHJhbnNsaXRlcmF0b3IsIG9yCiAgICAgKiBOVUxMIGlmIG5vbmUuICBBZG9wdGVkIGJ5IHRoaXMgdHJhbnNsaXRlcmF0b3IuCiAgICAgKiBAcGFyYW0gc3RhdHVzIEVycm9yIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUKICAgICAqIHRvIHBhcnNlIHBhdHRlcm4uCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgaXNVcHBlcmNhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlRmlsdGVyKiBhZG9wdGVkRmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gdXBwZXJjYXNlIHRyYW5zbGl0ZXJhdG9yIHdpdGggbm8gZmlsdGVyLgogICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gZm9yIHRoaXMgdHJhbnNsaXRlcmF0b3IuICBTZWUKICAgICAqIGFwcGx5UGF0dGVybigpIGZvciBwYXR0ZXJuIHN5bnRheC4KICAgICAqIEBwYXJhbSBzdGF0dXMgRXJyb3IgY29kZSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZQogICAgICogdG8gcGFyc2UgcGF0dGVybi4KICAgICAqLwogICAgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoY29uc3QgVW5pY29kZVN0cmluZyYgcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgdHJhbnNsaXRlcmF0b3Igd2l0aCB0aGUgZGVmYXVsdCBwcmVmaXggIlx1IgogICAgICogdGhhdCBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcihVbmljb2RlRmlsdGVyKiBhZG9wdGVkRmlsdGVyID0gMCk7CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIH5Vbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcigpOwoKICAgIC8qKgogICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoY29uc3QgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIFRyYW5zbGl0ZXJhdG9yIEFQSS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBUcmFuc2xpdGVyYXRvciogY2xvbmUodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHBhdHRlcm4gcmVjb2duaXplZCBieSB0aGlzIHRyYW5zbGl0ZXJhdG9yLiAgVGhlIHBhdHRlcm4KICAgICAqIG11c3QgY29udGFpbiB6ZXJvIG9yIG1vcmUgcHJlZml4IGNoYXJhY3RlcnMsIG9uZSBvciBtb3JlIGRpZ2l0CiAgICAgKiBjaGFyYWN0ZXJzLCBhbmQgemVybyBvciBtb3JlIHN1ZmZpeCBjaGFyYWN0ZXJzLiAgVGhlIGRpZ2l0CiAgICAgKiBjaGFyYWN0ZXJzIGluZGljYXRlcyBvcHRpb25hbCBkaWdpdHMgKCcjJykgZm9sbG93ZWQgYnkgcmVxdWlyZWQKICAgICAqIGRpZ2l0cyAoJzAnKS4gIFRoZSB0b3RhbCBudW1iZXIgb2YgZGlnaXRzIGNhbm5vdCBleGNlZWQgNCwgYW5kCiAgICAgKiBtdXN0IGJlIGF0IGxlYXN0IDEgcmVxdWlyZWQgZGlnaXQuICBVc2UgYSBiYWNrc2xhc2ggKCdcXCcpIHRvCiAgICAgKiBlc2NhcGUgYW55IG9mIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuICBBbiBlbXB0eSBwYXR0ZXJuIGlzIG5vdAogICAgICogYWxsb3dlZC4KICAgICAqCiAgICAgKiA8cD5FeGFtcGxlOiAiVSswMDAwIiBzcGVjaWZpZXMgYSBwcmVmaXggb2YgIlUrIiwgZXhhY3RseSBmb3VyCiAgICAgKiBkaWdpdHMsIGFuZCBubyBzdWZmaXguICAiPCMjIzA+IiBoYXMgYSBwcmVmaXggb2YgIjwiLCBiZXR3ZWVuCiAgICAgKiBvbmUgYW5kIGZvdXIgZGlnaXRzLCBhbmQgYSBzdWZmaXggb2YgIj4iLgogICAgICoKICAgICAqIDxwPjxwcmU+CiAgICAgKiBwYXR0ZXJuIDo9IHByZWZpeC1jaGFyKiBkaWdpdC1zcGVjIHN1ZmZpeC1jaGFyKgogICAgICogZGlnaXQtc3BlYyA6PSAnIycqICcwJysKICAgICAqIHByZWZpeC1jaGFyIDo9IFtec3BlY2lhbC1jaGFyXSB8ICdcXCcgc3BlY2lhbC1jaGFyCiAgICAgKiBzdWZmaXgtY2hhciA6PSBbXnNwZWNpYWwtY2hhcl0gfCAnXFwnIHNwZWNpYWwtY2hhcgogICAgICogc3BlY2lhbC1jaGFyIDo9ICc7JyB8ICcwJyB8ICcjJyB8ICdcXCcKICAgICAqIDwvcHJlPgogICAgICoKICAgICAqIDxwPkxpbWl0YXRpb25zOiBUaGVyZSBpcyBubyB3YXkgdG8gc2V0IHRoZSB1cHBlcmNhc2UgYXR0cmlidXRlCiAgICAgKiBpbiB0aGUgcGF0dGVybi4gIChhcHBseVBhdHRlcm4oKSBkb2VzIG5vdCBhbHRlciB0aGUgdXBwZXJjYXNlCiAgICAgKiBhdHRyaWJ1dGUuKQogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIGFwcGx5UGF0dGVybihjb25zdCBVbmljb2RlU3RyaW5nJiB0aGVQYXR0ZXJuLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoaXMgdHJhbnNsaXRlcmF0b3IncyBwYXR0ZXJuLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBjb25zdCBVbmljb2RlU3RyaW5nJiB0b1BhdHRlcm4odm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2xpdGVyYXRvciBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIGJvb2xfdCBpc1VwcGVyY2FzZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldHMgaWYgdGhpcyB0cmFuc2xpdGVyYXRvciBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0VXBwZXJjYXNlKGJvb2xfdCBvdXRwdXRVcHBlcmNhc2UpOwoKICAgIC8qKgogICAgICogSW1wbGVtZW50cyB7QGxpbmsgVHJhbnNsaXRlcmF0b3IjaGFuZGxlVHJhbnNsaXRlcmF0ZX0uCiAgICAgKiBAZHJhZnQKICAgICAqLwogICAgdmlydHVhbCB2b2lkIGhhbmRsZVRyYW5zbGl0ZXJhdGUoUmVwbGFjZWFibGUmIHRleHQsIFBvc2l0aW9uJiBvZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbF90IGlzSW5jcmVtZW50YWwpIGNvbnN0Owp9OwoKaW5saW5lIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yOjp+VW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoKSB7fQoKI2VuZGlmCg==