LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBDT1BZUklHSFQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgIDE5OTYtMTk5OSAgICAgICAgICAgICAgICoKKiAgIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvZ3JhbS1Qcm9wZXJ0eSBvZiBJQk0gLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgICAgICAgICAgICoKKiAgIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIEZpbGUgY29sZWl0ci5oCi8vCi8vIAovLwovLyBDcmVhdGVkIGJ5OiBIZWxlbmEgU2hpaAovLwovLyBNb2RpZmljYXRpb24gSGlzdG9yeToKLy8KLy8gIERhdGUgICAgICAgICBOYW1lICAgICAgICAgIERlc2NyaXB0aW9uCi8vCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gMDgvMDMvOTggICAgICAgIGVybSAgICAgICAgICAgIFN5bmNoZWQgd2l0aCAxLjIgdmVyc2lvbiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IuamF2YQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgQ09MRUlUUl9ICiNkZWZpbmUgQ09MRUlUUl9ICgoKI2luY2x1ZGUgInVuaXN0ci5oIgojaW5jbHVkZSAidGJsY29sbC5oIgojaW5jbHVkZSAiY2hhcml0ZXIuaCIKCgpjbGFzcyBOb3JtYWxpemVyOwpjbGFzcyBWZWN0b3JPZkludDsKY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ7CgovKioKICogVGhlIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBjbGFzcyBpcyB1c2VkIGFzIGFuIGl0ZXJhdG9yIHRvIHdhbGsgdGhyb3VnaAogKiBlYWNoIGNoYXJhY3RlciBvZiBhbiBpbnRlcm5hdGlvbmFsIHN0cmluZy4gVXNlIHRoZSBpdGVyYXRvciB0byByZXR1cm4gdGhlCiAqIG9yZGVyaW5nIHByaW9yaXR5IG9mIHRoZSBwb3NpdGlvbmVkIGNoYXJhY3Rlci4gVGhlIG9yZGVyaW5nIHByaW9yaXR5IG9mCiAqIGEgY2hhcmFjdGVyLCB3aGljaCB3ZSByZWZlciB0byBhcyBhIGtleSwgZGVmaW5lcyBob3cgYSBjaGFyYWN0ZXIgaXMKICogY29sbGF0ZWQgaW4gdGhlIGdpdmVuIGNvbGxhdGlvbiBvYmplY3QuCiAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGluIFNwYW5pc2g6CiAqIDxwcmU+CiAqIC4gICAgICAgImNhIiAtPiB0aGUgZmlyc3Qga2V5IGlzIGtleSgnYycpIGFuZCBzZWNvbmQga2V5IGlzIGtleSgnYScpLgogKiAuICAgICAgICJjaGEiIC0+IHRoZSBmaXJzdCBrZXkgaXMga2V5KCdjaCcpIGFuZCBzZWNvbmQga2V5IGlzIGtleSgnYScpLgogKiA8L3ByZT4KICogQW5kIGluIEdlcm1hbiwKICogPHByZT4KICogLiAgICAgICAi5mIiLT4gdGhlIGZpcnN0IGtleSBpcyBrZXkoJ2EnKSwgdGhlIHNlY29uZCBrZXkgaXMga2V5KCdlJyksIGFuZAogKiAuICAgICAgIHRoZSB0aGlyZCBrZXkgaXMga2V5KCdiJykuCiAqIDwvcHJlPgogKiBUaGUga2V5IG9mIGEgY2hhcmFjdGVyLCBpcyBhbiBpbnRlZ2VyIGNvbXBvc2VkIG9mIHByaW1hcnkgb3JkZXIoc2hvcnQpLAogKiBzZWNvbmRhcnkgb3JkZXIoY2hhciksIGFuZCB0ZXJ0aWFyeSBvcmRlcihjaGFyKS4gIEphdmEgc3RyaWN0bHkgZGVmaW5lcwogKiB0aGUgc2l6ZSBhbmQgc2lnbmVkbmVzcyBvZiBpdHMgcHJpbWl0aXZlIGRhdGEgdHlwZXMuICBUaGVyZWZvcmUsIHRoZSBzdGF0aWMKICogZnVuY3Rpb25zIHByaW1hcnlPcmRlcigpLCBzZWNvbmRhcnlPcmRlcigpLCBhbmQgdGVydGlhcnlPcmRlcigpIHJldHVybiBpbnQzMl90CiAqIHRvIGVuc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGtleSB2YWx1ZS4KICogPHA+RXhhbXBsZSBvZiB0aGUgaXRlcmF0b3IgdXNhZ2U6ICh3aXRob3V0IGVycm9yIGNoZWNraW5nKQogKiA8cHJlPgogKiAuICB2b2lkIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcl9FeGFtcGxlKCkKICogLiAgewogKiAuICAgICAgVW5pY29kZVN0cmluZyBzdHIgPSAiVGhpcyBpcyBhIHRlc3QiOwogKiAuICAgICAgVUVycm9yQ29kZSBzdWNjZXNzID0gWkVST19FUlJPUjsKICogLiAgICAgIFJ1bGVCYXNlZENvbGxhdG9yKiByYmMgPQogKiAuICAgICAgICAgIChSdWxlQmFzZWRDb2xsYXRvciopIFJ1bGVCYXNlZENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZShzdWNjZXNzKTsKICogLiAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciogYyA9CiAqIC4gICAgICAgICAgcmJjLT5jcmVhdGVDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoIHN0ciApOwogKiAuICAgICAgaW50MzJfdCBvcmRlciA9IGMtPm5leHQoc3VjY2Vzcyk7CiAqIC4gICAgICBpbnQzMl90IHByaW1hcnlPcmRlciA9IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJpbWFyeU9yZGVyKCBvcmRlciApOwogKiAuICAgICAgZGVsZXRlIGM7CiAqIC4gICAgICBkZWxldGUgcmJjOwogKiAuICB9CiAqIDwvcHJlPgogKiA8cD4KICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpuZXh0IHJldHVybnMgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgbmV4dAogKiBjaGFyYWN0ZXIgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gbGV2ZWwgb2YgdGhlIGNvbGxhdG9yLiAgQSBjb2xsYXRpb24gb3JkZXIgCiAqIGNvbnNpc3RzIG9mIHByaW1hcnkgb3JkZXIsIHNlY29uZGFyeSBvcmRlciBhbmQgdGVydGlhcnkgb3JkZXIuICBUaGUgZGF0YSAKICogdHlwZSBvZiB0aGUgY29sbGF0aW9uIG9yZGVyIGlzIDxzdHJvbmc+aW50MzJfdDwvc3Ryb25nPi4gIFRoZSBmaXJzdCAxNiBiaXRzIG9mIAogKiBhIGNvbGxhdGlvbiBvcmRlciBpcyBpdHMgcHJpbWFyeSBvcmRlcjsgdGhlIG5leHQgOCBiaXRzIGlzIHRoZSBzZWNvbmRhcnkgCiAqIG9yZGVyIGFuZCB0aGUgbGFzdCA4IGJpdHMgaXMgdGhlIHRlcnRpYXJ5IG9yZGVyLgogKgogKiBAc2VlICAgICAgICAgICAgICAgIENvbGxhdG9yCiAqIEBzZWUgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IKICogQHZlcnNpb24gICAgICAgICAgICAxLjkgMS8zMC85NwogKiBAYXV0aG9yICAgICAgICAgICAgIEhlbGVuYSBTaGloCiAqLwpjbGFzcyBVX0kxOE5fQVBJIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcgp7CnB1YmxpYyA6ICAgICAKICAgIC8qKgogICAgICogTlVMTE9SREVSIGluZGljYXRlcyB0aGUgaXRlcmF0b3IgaGFzIGNvbnN1bWVkIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgKi8KICAgIHN0YXRpYyAgaW50MzJfdCBjb25zdCAgIE5VTExPUkRFUjsKCiAgICAvKiogRGVzdHJ1Y3RvcgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgIm90aGVyIiBpcyB0aGUgc2FtZSBhcyAidGhpcyIKICAgICAqLwogICAgdmlydHVhbCAgICAgYm9vbF90ICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJiBvdGhlcikgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgIm90aGVyIiBpcyBub3QgdGhlIHNhbWUgYXMgInRoaXMiLgogICAgICovCiAgICB2aXJ0dWFsICAgICBib29sX3QgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJlc2V0cyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc2V0KHZvaWQpOwogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIncyBvcmRlcmluZy4gIFJldHVybnMgTlVMTE9SREVSIGlmCiAgICAgKiB0aGUgZW5kIG9mIHN0cmluZyBpcyByZWFjaGVkLgogICAgICovCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbmV4dChVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgIC8qKgogICAgICAqIEdldCB0aGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIHByZXZpb3VzIGNvbGxhdGlvbiBlbGVtZW50IGluIHRoZSBzdHJpbmcuCiAgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCdzIG9yZGVyaW5nLiAgUmV0dXJucyBOVUxMT1JERVIgaWYKICAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHN0cmluZyBpcyByZWFjaGVkLgogICAgICAqLwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBwcmV2aW91cyhVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgICAgKiBAcmV0dXJuIHRoZSBwcmltYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgcHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpOwogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzZWNvbmRhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAgICAgKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgogICAgICogQHJldHVybiB0aGUgc2Vjb25kYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgc2Vjb25kYXJ5T3JkZXIoaW50MzJfdCBvcmRlcik7CiAgICAvKioKICAgICAqIEdldHMgdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICAgICAqIEByZXR1cm4gdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgdGVydGlhcnlPcmRlcihpbnQzMl90IG9yZGVyKTsKICAgIC8qKgogICAgICogIFJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW55IGV4cGFuc2lvbiBzZXF1ZW5jZXMgdGhhdCBlbmQKICAgICAqICB3aXRoIHRoZSBzcGVjaWZpZWQgY29tcGFyaXNvbiBvcmRlci4KICAgICAqICBAcGFyYW0gb3JkZXIgYSBjb2xsYXRpb24gb3JkZXIgcmV0dXJuZWQgYnkgcHJldmlvdXMgb3IgbmV4dC4KICAgICAqICBAcmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyBlbmRpbmcKICAgICAqICAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBvcmRlci4KICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIGdldE1heEV4cGFuc2lvbihpbnQzMl90IG9yZGVyKSBjb25zdDsKCnB1YmxpYzoKICAgIC8qKgogICAgICogIEdldHMgdGhlIGNvbXBhcmlzb24gb3JkZXIgaW4gdGhlIGRlc2lyZWQgc3RyZW5ndGguICBJZ25vcmUgdGhlIG90aGVyCiAgICAgKiAgZGlmZmVyZW5jZXMuCiAgICAgKiAgQHBhcmFtIG9yZGVyIFRoZSBvcmRlciB2YWx1ZQogICAgICovCiAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgc3RyZW5ndGhPcmRlcihpbnQzMl90IG9yZGVyKSBjb25zdDsKICAgIC8qKgogICAgICogU2V0cyB0aGUgc291cmNlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHIgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRleHQoY29uc3QgICBVbmljb2RlU3RyaW5nJiAgc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CiAgICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICogQHBhcmFtIHN0ciB0aGUgc291cmNlIGNoYXJhY3RlciBpdGVyYXRvci4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICovCiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciYgIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgICAgICAgc3RhdHVzKTsKICAgLyoqCiAgICAgKiAgQ2hlY2tzIGlmIGEgY29tcGFyaXNvbiBvcmRlciBpcyBpZ25vcmFibGUuCiAgICAgKiAgQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIuCiAgICAgKiAgQHJldHVybiBUUlVFIGlmIGEgY2hhcmFjdGVyIGlzIGlnbm9yYWJsZSwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICovCiAgICBzdGF0aWMgICAgYm9vbF90ICAgICAgICAgICAgICBpc0lnbm9yYWJsZShpbnQzMl90IG9yZGVyKTsKICAgIC8qKgogICAgICogIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiAgQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFyYWN0ZXIuCiAgICAgKi8KICAgICAgICAgICAgVVRleHRPZmZzZXQgICAgICAgICAgZ2V0T2Zmc2V0KHZvaWQpIGNvbnN0OwogICAgLyoqCiAgICAgKiAgU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIHN0cmluZy4KICAgICAqICBAcGFyYW0gbmV3T2Zmc2V0IHRoZSBuZXcgb2Zmc2V0LgogICAgICogIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICogIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyLgogICAgICovCiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0T2Zmc2V0KFVUZXh0T2Zmc2V0IG5ld09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKcHJvdGVjdGVkOgogICAgLyoqCiAgICAgKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgY29uc3RydWN0b3IuICBUaGlzIHRha2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZAogICAgICogdGhlIGNvbGxhdGlvbiBvYmplY3QuICBUaGUgY3Vyc29yIHdpbGwgd2FsayB0aHJ1IHRoZSBzb3VyY2Ugc3RyaW5nIGJhc2VkCiAgICAgKiBvbiB0aGUgcHJlZGVmaW5lZCBjb2xsYXRpb24gcnVsZXMuICBJZiB0aGUgc291cmNlIHN0cmluZyBpcyBlbXB0eSwKICAgICAqIE5VTExPUkRFUiB3aWxsIGJlIHJldHVybmVkIG9uIHRoZSBjYWxscyB0byBuZXh0KCkuCiAgICAgKiBAcGFyYW0gc291cmNlVGV4dCB0aGUgc291cmNlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdGFydE9mZnNldCB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBjdXJzb3IKICAgICAqIHN0YXJ0cyB0aGUgaXRlcmF0aW5nLgogICAgICogQHBhcmFtIGVuZE9mZnNldCB0aGUgZW5kaW5nIG9mZnNldCBvZiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBjdXJzb3IKICAgICAqIHN0b3BzIHRoZSBpdGVyYXRpbmcuCiAgICAgKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgc291cmNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBSdWxlQmFzZWRDb2xsYXRvciogIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNvbnN0cnVjdG9yLiAgVGhpcyB0YWtlcyB0aGUgc291cmNlIHN0cmluZyBhbmQKICAgICAqIHRoZSBjb2xsYXRpb24gb2JqZWN0LiAgVGhlIGN1cnNvciB3aWxsIHdhbGsgdGhydSB0aGUgc291cmNlIHN0cmluZyBiYXNlZAogICAgICogb24gdGhlIHByZWRlZmluZWQgY29sbGF0aW9uIHJ1bGVzLiAgSWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgZW1wdHksCiAgICAgKiBOVUxMT1JERVIgd2lsbCBiZSByZXR1cm5lZCBvbiB0aGUgY2FsbHMgdG8gbmV4dCgpLgogICAgICogQHBhcmFtIHNvdXJjZVRleHQgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhcnRPZmZzZXQgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhlIHN0cmluZyB3aGVyZSB0aGUgY3Vyc29yCiAgICAgKiBzdGFydHMgdGhlIGl0ZXJhdGluZy4KICAgICAqIEBwYXJhbSBlbmRPZmZzZXQgdGhlIGVuZGluZyBvZmZzZXQgb2YgdGhlIHN0cmluZyB3aGVyZSB0aGUgY3Vyc29yCiAgICAgKiBzdG9wcyB0aGUgaXRlcmF0aW5nLgogICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb2JqZWN0LgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCAgIGNvbnN0ICAgIENoYXJhY3Rlckl0ZXJhdG9yJiAgc291cmNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBSdWxlQmFzZWRDb2xsYXRvciogIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKi8KICAgIGNvbnN0ICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKcHVibGljOgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0ICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBwcml2YXRlcwogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KcHJpdmF0ZToKICAgIC8qKgogICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpOwogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yKiBvcmRlcik7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjb250cmFjdGluZyBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgKiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gY2ggdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBvZiBhIGNvbnRyYWN0aW5nIGNoYXJhY3RlciB0b2tlbgogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNvbnRyYWN0aW5nIGNoYXJhY3RlcidzIG9yZGVyaW5nLiAgUmV0dXJucyBOVUxMT1JERVIKICAgICAqIGlmIHRoZSBlbmQgb2Ygc3RyaW5nIGlzIHJlYWNoZWQuCiAgICAgKi8KICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBuZXh0Q29udHJhY3RDaGFyKCAgIFVDaGFyICAgICBjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICBzdGF0dXMpOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIHByZXZpb3VzIGNvbnRyYWN0aW5nIGNoYXJhY3RlciBpbiB0aGUKICAgICAqIHN0cmluZy4KICAgICAqIEBwYXJhbSBjaCB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIG9mIGEgY29udHJhY3RpbmcgY2hhcmFjdGVyIHRva2VuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGNvbnRyYWN0aW5nIGNoYXJhY3RlcidzIG9yZGVyaW5nLiAgUmV0dXJucyBOVUxMT1JERVIKICAgICAqIGlmIHRoZSBzdGFydCBvZiBzdHJpbmcgaXMgcmVhY2hlZC4KICAgICAqLwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHByZXZDb250cmFjdENoYXIoICAgVUNoYXIgICAgIGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgIHN0YXR1cyk7CgogICAgZnJpZW5kICBjbGFzcyAgIFJ1bGVCYXNlZENvbGxhdG9yOwogICAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICBVTk1BUFBFRENIQVJWQUxVRTsKCiAgICAgICAgICAgIE5vcm1hbGl6ZXIqICAgICAgICAgICAgdGV4dDsgICAgICAgLy8gb3duaW5nIAoKICAgICAgICAgICAgVmVjdG9yT2ZJbnQqICAgICAgICBidWZmZXJBbGlhczsKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzd2FwT3JkZXI7ICAvLyBmb3IgdW5tYXBwZWQgY2hhcmFjdGVycwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGV4cEluZGV4OwogICAgICAgICAgICBVbmljb2RlU3RyaW5nICAgICAgIGtleTsKICAgIGNvbnN0ICAgUnVsZUJhc2VkQ29sbGF0b3IqICBvcmRlckFsaWFzOwp9OwoKCi8qKgogKiBHZXQgdGhlIHByaW1hcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAqIEByZXR1cm4gdGhlIHByaW1hcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAqLwppbmxpbmUgaW50MzJfdApDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByaW1hcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgICBvcmRlciAmPSBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSTUFTSzsKICAgIHJldHVybiAob3JkZXIgPj4gUnVsZUJhc2VkQ29sbGF0b3I6OlBSSU1BUllPUkRFUlNISUZUKTsKfQovKioKICogR2V0IHRoZSBzZWNvbmRhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAqIEByZXR1cm4gdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICovCmlubGluZSBpbnQzMl90CkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6c2Vjb25kYXJ5T3JkZXIoaW50MzJfdCBvcmRlcikKewogICAgb3JkZXIgPSBvcmRlciAmIFJ1bGVCYXNlZENvbGxhdG9yOjpTRUNPTkRBUllPUkRFUk1BU0s7CiAgICByZXR1cm4gKG9yZGVyID4+IFJ1bGVCYXNlZENvbGxhdG9yOjpTRUNPTkRBUllPUkRFUlNISUZUKTsKfQovKioKICogR2V0IHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICogQHJldHVybiB0aGUgdGVydGlhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAqLwppbmxpbmUgaW50MzJfdApDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnRlcnRpYXJ5T3JkZXIoaW50MzJfdCBvcmRlcikKewogICAgcmV0dXJuIChvcmRlciAmPSBSdWxlQmFzZWRDb2xsYXRvcjo6VEVSVElBUllPUkRFUk1BU0spOwp9CgppbmxpbmUgaW50MzJfdApDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OmdldE1heEV4cGFuc2lvbihpbnQzMl90IG9yZGVyKSBjb25zdAp7CiAgICByZXR1cm4gb3JkZXJBbGlhcy0+Z2V0TWF4RXhwYW5zaW9uKG9yZGVyKTsKfQoKaW5saW5lIGJvb2xfdApDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OmlzSWdub3JhYmxlKGludDMyX3Qgb3JkZXIpCnsKICAgIHJldHVybiAocHJpbWFyeU9yZGVyKG9yZGVyKSA9PSAwKTsKfQoKI2VuZGlmCg==