LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgSEVYVE9VTklfSAojZGVmaW5lIEhFWFRPVU5JX0gKCiNpbmNsdWRlICJ1bmljb2RlL3RyYW5zbGl0LmgiCgovKioKICogQSB0cmFuc2xpdGVyYXRvciB0aGF0IGNvbnZlcnRzIGZyb20gaGV4YWRlY2ltYWwgVW5pY29kZQogKiBlc2NhcGUgc2VxdWVuY2VzIHRvIHRoZSBjaGFyYWN0ZXJzIHRoZXkgcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsICJVKzAwNDAiCiAqIGFuZCAnXHUwMDQwJy4gIEl0IHJlY29nbml6ZXMgdGhlCiAqIHByZWZpeGVzICJVKyIsICJ1KyIsICImIzkyO1UiLCBhbmQgIiYjOTI7dSIuICBIZXggdmFsdWVzIG1heSBiZQogKiB1cHBlci0gb3IgbG93ZXJjYXNlLgogKgogKiA8cD5Db3B5cmlnaHQgJmNvcHk7IElCTSBDb3Jwb3JhdGlvbiAxOTk5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogQGF1dGhvciBBbGFuIExpdQogKiBAdmVyc2lvbiAkUkNTZmlsZTogaGV4dG91bmkuaCx2ICQgJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwMC8wMS8xOSAxOTowMjoxMCAkCiAqLwpjbGFzcyBVX0kxOE5fQVBJIEhleFRvVW5pY29kZVRyYW5zbGl0ZXJhdG9yIDogcHVibGljIFRyYW5zbGl0ZXJhdG9yIHsKCiAgICAvKioKICAgICAqIElEIGZvciB0aGlzIHRyYW5zbGl0ZXJhdG9yLgogICAgICovCiAgICBzdGF0aWMgY29uc3QgY2hhciogX0lEOwoKcHVibGljOgoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIHRyYW5zbGl0ZXJhdG9yLgogICAgICovCiAgICBIZXhUb1VuaWNvZGVUcmFuc2xpdGVyYXRvcihVbmljb2RlRmlsdGVyKiBhZG9wdGVkRmlsdGVyID0gMCk7CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgICB2aXJ0dWFsIH5IZXhUb1VuaWNvZGVUcmFuc2xpdGVyYXRvcigpOwoKICAgIC8qKgogICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAqLwogICAgSGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3IoY29uc3QgSGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgKi8KICAgIEhleFRvVW5pY29kZVRyYW5zbGl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIFRyYW5zbGl0ZXJhdG9yIEFQSS4KICAgICAqLwogICAgVHJhbnNsaXRlcmF0b3IqIGNsb25lKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogSW1wbGVtZW50cyB7QGxpbmsgVHJhbnNsaXRlcmF0b3IjaGFuZGxlVHJhbnNsaXRlcmF0ZX0uCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVUcmFuc2xpdGVyYXRlKFJlcGxhY2VhYmxlJiB0ZXh0LCBQb3NpdGlvbiYgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbF90IGlzSW5jcmVtZW50YWwpIGNvbnN0Owp9OwoKaW5saW5lIEhleFRvVW5pY29kZVRyYW5zbGl0ZXJhdG9yOjp+SGV4VG9Vbmljb2RlVHJhbnNsaXRlcmF0b3IoKSB7fQoKI2VuZGlmCg==