LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgezE5OTYtMjAwMX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFVDT0xfSAojZGVmaW5lIFVDT0xfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgojaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCgojaW5jbHVkZSAidW5pY29kZS91bm9ybS5oIgojaW5jbHVkZSAidW5pY29kZS9wYXJzZWVyci5oIgojaW5jbHVkZSAidW5pY29kZS91bG9jLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VzZXQuaCIKCi8qKgogKiBcZmlsZQogKiBcYnJpZWYgQyBBUEk6IENvbGxhdG9yIAogKgogKiA8aDI+IENvbGxhdG9yIEMgQVBJIDwvaDI+CiAqCiAqIFRoZSBDIEFQSSBmb3IgQ29sbGF0b3IgcGVyZm9ybXMgbG9jYWxlLXNlbnNpdGl2ZQogKiBzdHJpbmcgY29tcGFyaXNvbi4gWW91IHVzZSB0aGlzIHNlcnZpY2UgdG8gYnVpbGQKICogc2VhcmNoaW5nIGFuZCBzb3J0aW5nIHJvdXRpbmVzIGZvciBuYXR1cmFsIGxhbmd1YWdlIHRleHQuCiAqIDxlbT5JbXBvcnRhbnQ6IDwvZW0+VGhlIElDVSBjb2xsYXRpb24gc2VydmljZSBoYXMgYmVlbiByZWltcGxlbWVudGVkIAogKiBpbiBvcmRlciB0byBhY2hpZXZlIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgVUNBIGNvbXBsaWFuY2UuIAogKiBGb3IgZGV0YWlscywgc2VlIHRoZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9pY3VodG1sL2Rlc2lnbi9jb2xsYXRpb24vSUNVX2NvbGxhdGlvbl9kZXNpZ24uaHRtIj4KICogY29sbGF0aW9uIGRlc2lnbiBkb2N1bWVudDwvYT4uCiAqIDxwPgogKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGF0aW9uIHNlcnZpY2Ugc2VlIAogKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlkZS9Db2xsYXRlX0ludHJvLmh0bWwiPnRoZSB1c2VycyBndWlkZTwvYT4uCiAqIDxwPgogKiBDb2xsYXRpb24gc2VydmljZSBwcm92aWRlcyBjb3JyZWN0IHNvcnRpbmcgb3JkZXJzIGZvciBtb3N0IGxvY2FsZXMgc3VwcG9ydGVkIGluIElDVS4gCiAqIElmIHNwZWNpZmljIGRhdGEgZm9yIGEgbG9jYWxlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBvcmRlcnMgZXZlbnR1YWxseSBmYWxscyBiYWNrCiAqIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjEwLyI+VUNBIHNvcnQgb3JkZXI8L2E+LiAKICogPHA+CiAqIFNvcnQgb3JkZXJpbmcgbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcHJvdmlkaW5nIHlvdXIgb3duIHNldCBvZiBydWxlcy4gRm9yIG1vcmUgb24KICogdGhpcyBzdWJqZWN0IHNlZSB0aGUgCiAqIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL0NvbGxhdGVfQ3VzdG9taXphdGlvbi5odG1sIj4KICogQ29sbGF0aW9uIGN1c3RvbWl6YXRpb248L2E+IHNlY3Rpb24gb2YgdGhlIHVzZXJzIGd1aWRlLgogKiA8cD4KICogQHNlZSAgICAgICAgIFVDb2xsYXRpb25SZXN1bHQKICogQHNlZSAgICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZQogKiBAc2VlICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoCiAqIEBzZWUgICAgICAgICBVQ29sbGF0aW9uRWxlbWVudHMKICovCgovKiogQSBjb2xsYXRpb24gZWxlbWVudCBpdGVyYXRvci4KKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiovCnN0cnVjdCBjb2xsSXRlcmF0ZTsKLyoqIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgY29sbGF0aW9uIGVsZW1lbnQgaXRlcmF0b3IgaW5zdGFuY2UgKi8KdHlwZWRlZiBzdHJ1Y3QgY29sbEl0ZXJhdGUgY29sbEl0ZXJhdGU7CgovKiogQSBjb2xsYXRvci4KKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiovCnN0cnVjdCBVQ29sbGF0b3I7Ci8qKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgY29sbGF0b3Igb2JqZWN0IGluc3RhbmNlICovCnR5cGVkZWYgc3RydWN0IFVDb2xsYXRvciBVQ29sbGF0b3I7CgoKLyoqCiAqIFVDT0xfTEVTUyBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGxlc3MgdGhhbiB0YXJnZXQKICogc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIFVDT0xfRVFVQUwgaXMgcmV0dXJuZWQgaWYgc291cmNlIHN0cmluZyBpcyBjb21wYXJlZCB0byBiZSBlcXVhbCB0byB0YXJnZXQKICogc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIFVDT0xfR1JFQVRFUiBpcyByZXR1cm5lZCBpZiBzb3VyY2Ugc3RyaW5nIGlzIGNvbXBhcmVkIHRvIGJlIGdyZWF0ZXIgdGhhbgogKiB0YXJnZXQgc3RyaW5nIGluIHRoZSB1X3N0cmNvbGwoKSBtZXRob2QuCiAqIEBzZWUgdV9zdHJjb2xsKCkKICogPHA+CiAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgYSBjb21wYXJpc29uIHJlc3VsdCAqLwp0eXBlZGVmIGVudW0gewogIC8qKiBzdHJpbmcgYSA9PSBzdHJpbmcgYiAqLwogIFVDT0xfRVFVQUwgICAgPSAwLAogIC8qKiBzdHJpbmcgYSA+IHN0cmluZyBiICovCiAgVUNPTF9HUkVBVEVSICAgID0gMSwKICAvKiogc3RyaW5nIGEgPCBzdHJpbmcgYiAqLwogIFVDT0xfTEVTUyAgICA9IC0xCn0gVUNvbGxhdGlvblJlc3VsdCA7CgoKLyoqIEVudW0gY29udGFpbmluZyBhdHRyaWJ1dGUgdmFsdWVzIGZvciBjb250cm9saW5nIGNvbGxhdGlvbiBiZWhhdmlvci4gKi8KLyogSGVyZSBhcmUgYWxsIHRoZSBhbGxvd2FibGUgdmFsdWVzLiBOb3QgZXZlcnkgYXR0cmlidXRlIGNhbiB0YWtlIGV2ZXJ5IHZhbHVlLiBUaGUgb25seSAqLwovKiB1bml2ZXJzYWwgdmFsdWUgaXMgVUNPTF9ERUZBVUxULCB3aGljaCByZXNldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byB0aGUgcHJlZGVmaW5lZCAgKi8KLyogdmFsdWUgZm9yIHRoYXQgbG9jYWxlICovCnR5cGVkZWYgZW51bSB7CiAgLyoqIGFjY2VwdGVkIGJ5IG1vc3QgYXR0cmlidXRlcyAqLwogIFVDT0xfREVGQVVMVCA9IC0xLAoKICAvKiogUHJpbWFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1BSSU1BUlkgPSAwLAogIC8qKiBTZWNvbmRhcnkgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9TRUNPTkRBUlkgPSAxLAogIC8qKiBUZXJ0aWFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1RFUlRJQVJZID0gMiwKICAvKiogRGVmYXVsdCBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX0RFRkFVTFRfU1RSRU5HVEggPSBVQ09MX1RFUlRJQVJZLAogIFVDT0xfQ0VfU1RSRU5HVEhfTElNSVQsCiAgLyoqIFF1YXRlcm5hcnkgY29sbGF0aW9uIHN0cmVuZ3RoICovCiAgVUNPTF9RVUFURVJOQVJZPTMsCiAgLyoqIElkZW50aWNhbCBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX0lERU5USUNBTD0xNSwKICBVQ09MX1NUUkVOR1RIX0xJTUlULAoKICAvKiogVHVybiB0aGUgZmVhdHVyZSBvZmYgLSB3b3JrcyBmb3IgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAgVUNPTF9DQVNFX0xFVkVMLCBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUllfTU9ERQogICAgICAmIFVDT0xfREVDT01QT1NJVElPTl9NT0RFKi8KICBVQ09MX09GRiA9IDE2LAogIC8qKiBUdXJuIHRoZSBmZWF0dXJlIG9uIC0gd29ya3MgZm9yIFVDT0xfRlJFTkNIX0NPTExBVElPTiwgCiAgICAgIFVDT0xfQ0FTRV9MRVZFTCwgVUNPTF9ISVJBR0FOQV9RVUFURVJOQVJZX01PREUKICAgICAgJiBVQ09MX0RFQ09NUE9TSVRJT05fTU9ERSovCiAgVUNPTF9PTiA9IDE3LAogIAogIC8qKiBWYWxpZCBmb3IgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcuIEFsdGVybmF0ZSBoYW5kbGluZyB3aWxsIGJlIHNoaWZ0ZWQgKi8KICBVQ09MX1NISUZURUQgPSAyMCwKICAvKiogVmFsaWQgZm9yIFVDT0xfQUxURVJOQVRFX0hBTkRMSU5HLiBBbHRlcm5hdGUgaGFuZGxpbmcgd2lsbCBiZSBub24gaWdub3JhYmxlICovCiAgVUNPTF9OT05fSUdOT1JBQkxFID0gMjEsCgogIC8qKiBWYWxpZCBmb3IgVUNPTF9DQVNFX0ZJUlNUIC0gCiAgICAgIGxvd2VyIGNhc2Ugc29ydHMgYmVmb3JlIHVwcGVyIGNhc2UgKi8KICBVQ09MX0xPV0VSX0ZJUlNUID0gMjQsCiAgLyoqIHVwcGVyIGNhc2Ugc29ydHMgYmVmb3JlIGxvd2VyIGNhc2UgKi8KICBVQ09MX1VQUEVSX0ZJUlNUID0gMjUsCgogIFVDT0xfQVRUUklCVVRFX1ZBTFVFX0NPVU5UCgp9IFVDb2xBdHRyaWJ1dGVWYWx1ZTsKCi8qKgogKiBCYXNlIGxldHRlciByZXByZXNlbnRzIGEgcHJpbWFyeSBkaWZmZXJlbmNlLiAgU2V0IGNvbXBhcmlzb24KICogbGV2ZWwgdG8gVUNPTF9QUklNQVJZIHRvIGlnbm9yZSBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5IGRpZmZlcmVuY2VzLgogKiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3Igb2JqZWN0LgogKiBFeGFtcGxlIG9mIHByaW1hcnkgZGlmZmVyZW5jZSwgImFiYyIgJmx0OyAiYWJkIgogKiAKICogRGlhY3JpdGljYWwgZGlmZmVyZW5jZXMgb24gdGhlIHNhbWUgYmFzZSBsZXR0ZXIgcmVwcmVzZW50IGEgc2Vjb25kYXJ5CiAqIGRpZmZlcmVuY2UuICBTZXQgY29tcGFyaXNvbiBsZXZlbCB0byBVQ09MX1NFQ09OREFSWSB0byBpZ25vcmUgdGVydGlhcnkKICogZGlmZmVyZW5jZXMuIFVzZSB0aGlzIHRvIHNldCB0aGUgc3RyZW5ndGggb2YgYSBDb2xsYXRvciBvYmplY3QuCiAqIEV4YW1wbGUgb2Ygc2Vjb25kYXJ5IGRpZmZlcmVuY2UsICLkIiA+PiAiYSIuCiAqCiAqIFVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGNoYXJhY3RlciByZXByZXNlbnRzIGEKICogdGVydGlhcnkgZGlmZmVyZW5jZS4gIFNldCBjb21wYXJpc29uIGxldmVsIHRvIFVDT0xfVEVSVElBUlkgdG8gaW5jbHVkZQogKiBhbGwgY29tcGFyaXNvbiBkaWZmZXJlbmNlcy4gVXNlIHRoaXMgdG8gc2V0IHRoZSBzdHJlbmd0aCBvZiBhIENvbGxhdG9yCiAqIG9iamVjdC4KICogRXhhbXBsZSBvZiB0ZXJ0aWFyeSBkaWZmZXJlbmNlLCAiYWJjIiAmbHQ7Jmx0OyZsdDsgIkFCQyIuCiAqCiAqIFR3byBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkICJpZGVudGljYWwiIHdoZW4gdGhleSBoYXZlIHRoZSBzYW1lCiAqIHVuaWNvZGUgc3BlbGxpbmdzLiAgVUNPTF9JREVOVElDQUwuCiAqIEZvciBleGFtcGxlLCAi5CIgPT0gIuQiLgogKgogKiBVQ29sbGF0aW9uU3RyZW5ndGggaXMgYWxzbyB1c2VkIHRvIGRldGVybWluZSB0aGUgc3RyZW5ndGggb2Ygc29ydCBrZXlzIAogKiBnZW5lcmF0ZWQgZnJvbSBVQ29sbGF0b3Igb2JqZWN0cwogKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG5vdyBmb3VuZCBpbiB0aGUgVUNvbEF0dHJpYnV0ZVZhbHVlIGVudW0uCiAqKi8KdHlwZWRlZiBVQ29sQXR0cmlidXRlVmFsdWUgVUNvbGxhdGlvblN0cmVuZ3RoOwoKLyoqIEF0dHJpYnV0ZXMgdGhhdCBjb2xsYXRpb24gc2VydmljZSB1bmRlcnN0YW5kcy4gQWxsIHRoZSBhdHRyaWJ1dGVzIGNhbiB0YWtlIFVDT0xfREVGQVVMVAogKiB2YWx1ZSwgYXMgd2VsbCBhcyB0aGUgdmFsdWVzIHNwZWNpZmljIHRvIGVhY2ggb25lLiAqLwp0eXBlZGVmIGVudW0gewogICAgIC8qKiBBdHRyaWJ1dGUgZm9yIGRpcmVjdGlvbiBvZiBzZWNvbmRhcnkgd2VpZ2h0cyAtIHVzZWQgaW4gRnJlbmNoLlwgCiAgICAgICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIFVDT0xfT04sIHdoaWNoIHJlc3VsdHMgaW4gc2Vjb25kYXJ5IHdlaWdodHMKICAgICAgKiBiZWluZyBjb25zaWRlcmVkIGJhY2t3YXJkcyBhbmQgVUNPTF9PRkYgd2hpY2ggdHJlYXRzIHNlY29uZGFyeQogICAgICAqIHdlaWdodHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyLiovCiAgICAgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAvKiogQXR0cmlidXRlIGZvciBoYW5kbGluZyB2YXJpYWJsZSBlbGVtZW50cy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX05PTl9JR05PUkFCTEUgKGRlZmF1bHQpCiAgICAgICogd2hpY2ggdHJlYXRzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIG5vbi1pZ25vcmFibGUgCiAgICAgICogcHJpbWFyeSB3ZWlnaHRzIGluIHRoZSBzYW1lIHdheSwKICAgICAgKiBhbmQgVUNPTF9TSElGVEVEIHdoaWNoIGNhdXNlcyBjb2RlcG9pbnRzIHdpdGggcHJpbWFyeSAKICAgICAgKiB3ZWlnaHRzIHRoYXQgYXJlIGVxdWFsIG9yIGJlbG93IHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUKICAgICAgKiB0byBiZSBpZ25vcmVkIG9uIHByaW1hcnkgbGV2ZWwgYW5kIG1vdmVkIHRvIHRoZSBxdWF0ZXJuYXJ5IAogICAgICAqIGxldmVsLiovCiAgICAgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcsIAogICAgIC8qKiBDb250cm9scyB0aGUgb3JkZXJpbmcgb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX09GRiAoZGVmYXVsdCksIHdoaWNoIG9yZGVycwogICAgICAqIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgaW4gYWNjb3JkYW5jZSB0byB0aGVpciB0ZXJ0aWFyeQogICAgICAqIHdlaWdodHMsIFVDT0xfVVBQRVJfRklSU1Qgd2hpY2ggZm9yY2VzIHVwcGVyIGNhc2UgbGV0dGVycyB0byAKICAgICAgKiBzb3J0IGJlZm9yZSBsb3dlciBjYXNlIGxldHRlcnMsIGFuZCBVQ09MX0xPV0VSX0ZJUlNUIHdoaWNoIGRvZXMgCiAgICAgICogdGhlIG9wcG9zaXRlLiAqLwogICAgIFVDT0xfQ0FTRV9GSVJTVCwgCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgYW4gZXh0cmEgY2FzZSBsZXZlbCAocG9zaXRpb25lZCBiZWZvcmUgdGhlIHRoaXJkCiAgICAgICogbGV2ZWwpIGlzIGdlbmVyYXRlZCBvciBub3QuXCBBY2NlcHRhYmxlIHZhbHVlcyBhcmUgVUNPTF9PRkYgKGRlZmF1bHQpLCAKICAgICAgKiB3aGVuIGNhc2UgbGV2ZWwgaXMgbm90IGdlbmVyYXRlZCwgYW5kIFVDT0xfT04gd2hpY2ggY2F1c2VzIHRoZSBjYXNlCiAgICAgICogbGV2ZWwgdG8gYmUgZ2VuZXJhdGVkLlwgQ29udGVudHMgb2YgdGhlIGNhc2UgbGV2ZWwgYXJlIGFmZmVjdGVkIGJ5CiAgICAgICogdGhlIHZhbHVlIG9mIFVDT0xfQ0FTRV9GSVJTVCBhdHRyaWJ1dGUuXCBBIHNpbXBsZSB3YXkgdG8gaWdub3JlIAogICAgICAqIGFjY2VudCBkaWZmZXJlbmNlcyBpbiBhIHN0cmluZyBpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIHRvIFVDT0xfUFJJTUFSWQogICAgICAqIGFuZCBlbmFibGUgY2FzZSBsZXZlbC4gKi8KICAgICBVQ09MX0NBU0VfTEVWRUwsCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIG5vcm1hbGl6YXRpb24gY2hlY2sgYW5kIG5lY2Vzc2FyeSBub3JtYWxpemF0aW9ucwogICAgICAqIGFyZSBwZXJmb3JtZWQuXCBXaGVuIHNldCB0byBVQ09MX09GRiAoZGVmYXVsdCkgbm8gbm9ybWFsaXphdGlvbiBjaGVjawogICAgICAqIGlzIHBlcmZvcm1lZC5cIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgb25seSBpZiB0aGUgCiAgICAgICogaW5wdXQgZGF0YSBpcyBpbiBzby1jYWxsZWQgRkNEIGZvcm0gKHNlZSB1c2VycyBtYW51YWwgZm9yIG1vcmUgaW5mbykuXCAKICAgICAgKiBXaGVuIHNldCB0byBVQ09MX09OLCBhbiBpbmNyZW1lbnRhbCBjaGVjayBpcyBwZXJmb3JtZWQgdG8gc2VlIHdoZXRoZXIgdGhlIGlucHV0IGRhdGEKICAgICAgKiBpcyBpbiB0aGUgRkNEIGZvcm0uXCBJZiB0aGUgZGF0YSBpcyBub3QgaW4gdGhlIEZDRCBmb3JtLCBpbmNyZW1lbnRhbCAKICAgICAgKiBORkQgbm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQuICovCiAgICAgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUsIAogICAgIC8qKiBBbiBhbGlhcyBmb3IgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUgYXR0cmlidXRlICovCiAgICAgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUgPSBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwKICAgICAvKiogVGhlIHN0cmVuZ3RoIGF0dHJpYnV0ZS5cIENhbiBiZSBlaXRoZXIgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICAgICAgKiBVQ09MX1RFUlRJQVJZLCBVQ09MX1FVQVRFUk5BUlkgb3IgVUNPTF9JREVOVElDQUwuXCBUaGUgdXN1YWwgc3RyZW5ndGgKICAgICAgKiBmb3IgbW9zdCBsb2NhbGVzIChleGNlcHQgSmFwYW5lc2UpIGlzIHRlcnRpYXJ5LlwgUXVhdGVybmFyeSBzdHJlbmd0aCAKICAgICAgKiBpcyB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHNoaWZ0ZWQgc2V0dGluZyBmb3IgYWx0ZXJuYXRlIGhhbmRsaW5nCiAgICAgICogYXR0cmlidXRlIGFuZCBmb3IgSklTIHggNDA2MSBjb2xsYXRpb24sIHdoZW4gaXQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaAogICAgICAqIGJldHdlZW4gS2F0YWthbmEgIGFuZCBIaXJhZ2FuYSAodGhpcyBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIHRoZSAKICAgICAgKiBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUlkgbW9kZSB0byBvbi5cIE90aGVyd2lzZSwgcXVhdGVybmFyeSBsZXZlbAogICAgICAqIGlzIGFmZmVjdGVkIG9ubHkgYnkgdGhlIG51bWJlciBvZiBub24gaWdub3JhYmxlIGNvZGUgcG9pbnRzIGluCiAgICAgICogdGhlIHN0cmluZy5cIElkZW50aWNhbCBzdHJlbmd0aCBpcyByYXJlbHkgdXNlZnVsLCBhcyBpdCBhbW91bnRzIAogICAgICAqIHRvIGNvZGVwb2ludHMgb2YgdGhlIE5GRCBmb3JtIG9mIHRoZSBzdHJpbmcuICovCiAgICAgVUNPTF9TVFJFTkdUSCwgIAogICAgIC8qKiB3aGVuIHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgCiAgICAgICogcG9zaXRpb25zIEhpcmFnYW5hIGJlZm9yZSBhbGwgIAogICAgICAqIG5vbi1pZ25vcmFibGVzIG9uIHF1YXRlcm5hcnkgbGV2ZWwKICAgICAgKiBUaGlzIGlzIGEgc25lYWt5IHdheSB0byBwcm9kdWNlIEpJUwogICAgICAqIHNvcnQgb3JkZXIgKi8gICAgIAogICAgIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFLCAKICAgICBVQ09MX0FUVFJJQlVURV9DT1VOVAp9IFVDb2xBdHRyaWJ1dGU7CgovKiogT3B0aW9ucyBmb3IgcmV0cmlldmluZyB0aGUgcnVsZSBzdHJpbmcgKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogUmV0cmlldmUgdGFpbG9yaW5nIG9ubHkgKi8KICBVQ09MX1RBSUxPUklOR19PTkxZLCAKICAvKiogUmV0cmlldmUgVUNBIHJ1bGVzIGFuZCB0YWlsb3JpbmcgKi8KICBVQ09MX0ZVTExfUlVMRVMgCn0gVUNvbFJ1bGVPcHRpb24gOwoKLyoqCiAqIE9wZW4gYSBVQ29sbGF0b3IgZm9yIGNvbXBhcmluZyBzdHJpbmdzLgogKiBUaGUgVUNvbGxhdG9yIHBvaW50ZXIgaXMgdXNlZCBpbiBhbGwgdGhlIGNhbGxzIHRvIHRoZSBDb2xsYXRpb24gCiAqIHNlcnZpY2UuIEFmdGVyIGZpbmlzaGVkLCBjb2xsYXRvciBtdXN0IGJlIGRpc3Bvc2VkIG9mIGJ5IGNhbGxpbmcKICogXFJlZnt1Y29sX2Nsb3NlfS4KICogQHBhcmFtIGxvYyBUaGUgbG9jYWxlIGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVkIGNvbGxhdGlvbiBydWxlcy4gCiAqICAgICAgICAgICAgU3BlY2lhbCB2YWx1ZXMgZm9yIGxvY2FsZXMgY2FuIGJlIHBhc3NlZCBpbiAtIAogKiAgICAgICAgICAgIGlmIE5VTEwgaXMgcGFzc2VkIGZvciB0aGUgbG9jYWxlLCB0aGUgZGVmYXVsdCBsb2NhbGUKICogICAgICAgICAgICBjb2xsYXRpb24gcnVsZXMgd2lsbCBiZSB1c2VkLiBJZiBlbXB0eSBzdHJpbmcgKCIiKSBvcgogKiAgICAgICAgICAgICJyb290IiBhcmUgcGFzc2VkLCBVQ0EgcnVsZXMgd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvciwgb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzZWUgdWNvbF9jbG9zZQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQ29sbGF0b3IqIFVfRVhQT1JUMiAKdWNvbF9vcGVuKGNvbnN0IGNoYXIgKmxvYywgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBQcm9kdWNlIGFuIFVDb2xsYXRvciBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHN1cHBsaWVkLgogKiBUaGUgcnVsZXMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IG9yZGVyaW5nLCBkZWZpbmVkIGluIHRoZQogKiBVQ0EgaW4gYSBwcm9jZXNzIGNhbGxlZCB0YWlsb3JpbmcuIFRoZSByZXN1bHRpbmcgVUNvbGxhdG9yIHBvaW50ZXIKICogY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvbmUgb2J0YWluZWQgYnkgXFJlZnt1Y29sX3N0cmNvbGx9LgogKiBAcGFyYW0gcnVsZXMgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29sbGF0aW9uIHJ1bGVzLiBGb3IgdGhlIHN5bnRheAogKiAgICAgICAgICAgICAgb2YgdGhlIHJ1bGVzIHBsZWFzZSBzZWUgdXNlcnMgZ3VpZGUuCiAqIEBwYXJhbSBydWxlc0xlbmd0aCBUaGUgbGVuZ3RoIG9mIHJ1bGVzLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBub3JtYWxpemF0aW9uTW9kZSBUaGUgbm9ybWFsaXphdGlvbiBtb2RlOiBPbmUgb2YKICogICAgICAgICAgICAgVUNPTF9PRkYgICAgIChleHBlY3QgdGhlIHRleHQgdG8gbm90IG5lZWQgbm9ybWFsaXphdGlvbiksCiAqICAgICAgICAgICAgIFVDT0xfT04gICAgICAobm9ybWFsaXplKSwgb3IKICogICAgICAgICAgICAgVUNPTF9ERUZBVUxUIChzZXQgdGhlIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcykKICogQHBhcmFtIHN0cmVuZ3RoIFRoZSBkZWZhdWx0IGNvbGxhdGlvbiBzdHJlbmd0aDsgb25lIG9mIFVDT0xfUFJJTUFSWSwgVUNPTF9TRUNPTkRBUlksCiAqIFVDT0xfVEVSVElBUlksIFVDT0xfSURFTlRJQ0FMLFVDT0xfREVGQVVMVF9TVFJFTkdUSCAtIGNhbiBiZSBhbHNvIHNldCBpbiB0aGUgcnVsZXMuCiAqIEBwYXJhbSBwYXJzZUVycm9yICBBIHBvaW50ZXIgdG8gVVBhcnNlRXJyb3IgdG8gcmVjaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMKICogICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nLiBUaGlzIGFyZ3VtZW50IGNhbiBjdXJyZW50bHkgYmUgc2V0CiAqICAgICAgICAgICAgICAgICAgICB0byBOVUxMLCBidXQgYXQgdXNlcnMgb3duIHJpc2suIFBsZWFzZSBwcm92aWRlIGEgcmVhbCBzdHJ1Y3R1cmUuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVUNvbGxhdG9yLlwgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCBOVUxMIGJlIHJldHVybmVkIGluIGNhc2UKICogICAgICAgICBvZiBlcnJvciAtIHBsZWFzZSB1c2Ugc3RhdHVzIGFyZ3VtZW50IHRvIGNoZWNrIGZvciBlcnJvcnMuCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9zYWZlQ2xvbmUKICogQHNlZSB1Y29sX2Nsb3NlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xsYXRvciogVV9FWFBPUlQyIAp1Y29sX29wZW5SdWxlcyggY29uc3QgVUNoYXIgICAgICAgICpydWxlcywKICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBydWxlc0xlbmd0aCwKICAgICAgICAgICAgICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBub3JtYWxpemF0aW9uTW9kZSwKICAgICAgICAgICAgICAgIFVDb2xsYXRpb25TdHJlbmd0aCBzdHJlbmd0aCwKICAgICAgICAgICAgICAgIFVQYXJzZUVycm9yICAgICAgICAqcGFyc2VFcnJvciwKICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICAqc3RhdHVzKTsKCi8qKiAKICogQ2xvc2UgYSBVQ29sbGF0b3IuCiAqIE9uY2UgY2xvc2VkLCBhIFVDb2xsYXRvciBzaG91bGQgbm90IGJlIHVzZWQuXCBFdmVyeSBvcGVuIGNvbGxhdG9yIHNob3VsZAogKiBiZSBjbG9zZWQuXCBPdGhlcndpc2UsIGEgbWVtb3J5IGxlYWsgd2lsbCByZXN1bHQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gY2xvc2UuCiAqIEBzZWUgdWNvbF9vcGVuCiAqIEBzZWUgdWNvbF9vcGVuUnVsZXMKICogQHNlZSB1Y29sX3NhZmVDbG9uZQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9jbG9zZShVQ29sbGF0b3IgKmNvbGwpOwoKLyoqCiAqIENvbXBhcmUgdHdvIHN0cmluZ3MuCiAqIFRoZSBzdHJpbmdzIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhlIG9wdGlvbnMgYWxyZWFkeSBzcGVjaWZpZWQuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29tcGFyaXNvbiBydWxlcy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHN0cmluZy4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgc3RyaW5nLgogKiBAcGFyYW0gdGFyZ2V0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGFyZ2V0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIHN0cmluZ3M7IG9uZSBvZiBVQ09MX0VRVUFMLAogKiBVQ09MX0dSRUFURVIsIFVDT0xfTEVTUwogKiBAc2VlIHVjb2xfZ3JlYXRlcgogKiBAc2VlIHVjb2xfZ3JlYXRlck9yRXF1YWwKICogQHNlZSB1Y29sX2VxdWFsCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVDb2xsYXRpb25SZXN1bHQgVV9FWFBPUlQyIAp1Y29sX3N0cmNvbGwoICAgIGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqdGFyZ2V0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gXFJlZnt1Y29sX3N0cmNvbGx9ID09IFVDT0xfR1JFQVRFUgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGdyZWF0ZXIgdGhhbiB0YXJnZXQsIEZBTFNFIG90aGVyd2lzZS4KICogQHNlZSB1Y29sX3N0cmNvbGwKICogQHNlZSB1Y29sX2dyZWF0ZXJPckVxdWFsCiAqIEBzZWUgdWNvbF9lcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZ3JlYXRlcihjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gXFJlZnt1Y29sX3N0cmNvbGx9ICE9IFVDT0xfTEVTUwogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0YXJnZXQsIEZBTFNFIG90aGVyd2lzZS4KICogQHNlZSB1Y29sX3N0cmNvbGwKICogQHNlZSB1Y29sX2dyZWF0ZXIKICogQHNlZSB1Y29sX2VxdWFsCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIFVCb29sIFVfRVhQT1JUMiAKdWNvbF9ncmVhdGVyT3JFcXVhbChjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCk7CgovKioKICogQ29tcGFyZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuCiAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBcUmVme3Vjb2xfc3RyY29sbH0gPT0gVUNPTF9FUVVBTAogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgc291cmNlIGlzIGVxdWFsIHRvIHRhcmdldCwgRkFMU0Ugb3RoZXJ3aXNlCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyCiAqIEBzZWUgdWNvbF9ncmVhdGVyT3JFcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZXF1YWwoY29uc3QgVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqc291cmNlLCBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIEdldCB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBzdHJlbmd0aCBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHJldHVybiBUaGUgY29sbGF0aW9uIHN0cmVuZ3RoOyBvbmUgb2YgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICogVUNPTF9URVJUSUFSWSwgVUNPTF9RVUFURVJOQVJZLCBVQ09MX0lERU5USUNBTAogKiBAc2VlIHVjb2xfc2V0U3RyZW5ndGgKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgVUNvbGxhdGlvblN0cmVuZ3RoIFVfRVhQT1JUMiAKdWNvbF9nZXRTdHJlbmd0aChjb25zdCBVQ29sbGF0b3IgKmNvbGwpOwoKLyoqCiAqIFNldCB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBzdHJlbmd0aCBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBzZXQuCiAqIEBwYXJhbSBzdHJlbmd0aCBUaGUgZGVzaXJlZCBjb2xsYXRpb24gc3RyZW5ndGg7IG9uZSBvZiBVQ09MX1BSSU1BUlksIAogKiBVQ09MX1NFQ09OREFSWSwgVUNPTF9URVJUSUFSWSwgVUNPTF9RVUFURVJOQVJZLCBVQ09MX0lERU5USUNBTCwgVUNPTF9ERUZBVUxUCiAqIEBzZWUgdWNvbF9nZXRTdHJlbmd0aAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXRTdHJlbmd0aChVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgVUNvbGxhdGlvblN0cmVuZ3RoIHN0cmVuZ3RoKTsKCi8qKgogKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBVQ29sbGF0b3IuCiAqIFRoZSBkaXNwbGF5IG5hbWUgaXMgc3VpdGFibGUgZm9yIHByZXNlbnRhdGlvbiB0byBhIHVzZXIuCiAqIEBwYXJhbSBvYmpMb2MgVGhlIGxvY2FsZSBvZiB0aGUgY29sbGF0b3IgaW4gcXVlc3Rpb24uCiAqIEBwYXJhbSBkaXNwTG9jIFRoZSBsb2NhbGUgZm9yIGRpc3BsYXkuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLAogKiB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldERpc3BsYXlOYW1lKCAgICBjb25zdCAgICBjaGFyICAgICAgICAqb2JqTG9jLAogICAgICAgICAgICBjb25zdCAgICBjaGFyICAgICAgICAqZGlzcExvYywKICAgICAgICAgICAgVUNoYXIgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cyk7CgovKioKICogR2V0IGEgbG9jYWxlIGZvciB3aGljaCBjb2xsYXRpb24gcnVsZXMgYXJlIGF2YWlsYWJsZS4KICogQSBVQ29sbGF0b3IgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKICogY29sbGF0aW9uIGZvciB0aGUgbG9jYWxlLgogKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KICogQHJldHVybiBBIGxvY2FsZSBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUsIG9yIDAgaWYgbm9uZS4KICogQHNlZSB1Y29sX2NvdW50QXZhaWxhYmxlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGNvbnN0IGNoYXIqIFVfRVhQT1JUMiAKdWNvbF9nZXRBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7CgovKioKICogRGV0ZXJtaW5lIGhvdyBtYW55IGxvY2FsZXMgaGF2ZSBjb2xsYXRpb24gcnVsZXMgYXZhaWxhYmxlLgogKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGRldGVybWluaW5nIHRoZSBsb29wIGVuZGluZyBjb25kaXRpb24gZm9yCiAqIGNhbGxzIHRvIFxSZWZ7dWNvbF9nZXRBdmFpbGFibGV9LgogKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbG9jYWxlcyBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqIEBzZWUgdWNvbF9nZXRBdmFpbGFibGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfY291bnRBdmFpbGFibGUodm9pZCk7CgovKioKICogR2V0IHRoZSBjb2xsYXRpb24gcnVsZXMgZnJvbSBhIFVDb2xsYXRvci4KICogVGhlIHJ1bGVzIHdpbGwgZm9sbG93IHRoZSBydWxlIHN5bnRheC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHBhcmFtIGxlbmd0aCAKICogQHJldHVybiBUaGUgY29sbGF0aW9uIHJ1bGVzLgogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSBjb25zdCBVQ2hhciogVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzKCAgICBjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICAqbGVuZ3RoKTsKCi8qKgogKiBHZXQgYSBzb3J0IGtleSBmb3IgYSBzdHJpbmcgZnJvbSBhIFVDb2xsYXRvci4KICogU29ydCBrZXlzIG1heSBiZSBjb21wYXJlZCB1c2luZyA8VFQ+c3RyY21wPC9UVD4uCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgY29udGFpbmluZyB0aGUgY29sbGF0aW9uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtLgogKiBAcGFyYW0gc291cmVjTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHJldHVybiBUaGUgc2l6ZSBuZWVkZWQgdG8gZnVsbHkgc3RvcmUgdGhlIHNvcnQga2V5Li4KICogQHNlZSB1Y29sX2tleUhhc2hDb2RlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldFNvcnRLZXkoY29uc3QgICAgVUNvbGxhdG9yICAgICpjb2xsLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqc291cmNlLAogICAgICAgIGludDMyX3QgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICB1aW50OF90ICAgICAgICAqcmVzdWx0LAogICAgICAgIGludDMyX3QgICAgICAgIHJlc3VsdExlbmd0aCk7CgovKiogZW51bSB0aGF0IGlzIHRha2VuIGJ5IHVjb2xfZ2V0Qm91bmQgQVBJICovCi8qIFNlZSBiZWxvdyBmb3IgZXhwbGFuYXRpb24gICAgICAgICAgICAgICAgKi8KLyogZG8gbm90IGNoYW5nZSB0aGUgdmFsdWVzIGFzc2lnbmVkIHRvIHRoZSAqLwovKiBtZW1iZXJzIG9mIHRoaXMgZW51bS4gVW5kZXJseWluZyBjb2RlICAgICovCi8qIGRlcGVuZHMgb24gdGhlbSBoYXZpbmcgdGhlc2UgbnVtYmVycyAgICAgKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogbG93ZXIgYm91bmQgKi8KICBVQ09MX0JPVU5EX0xPV0VSID0gMCwKICAvKiogdXBwZXIgYm91bmQgdGhhdCB3aWxsIG1hdGNoIHN0cmluZ3Mgb2YgZXhhY3Qgc2l6ZSAqLwogIFVDT0xfQk9VTkRfVVBQRVIgPSAxLAogIC8qKiB1cHBlciBib3VuZCB0aGF0IHdpbGwgbWF0Y2ggYWxsIHRoZSBzdHJpbmdzIHRoYXQgaGF2ZSB0aGUgc2FtZSBpbml0aWFsIHN1YnN0cmluZyBhcyB0aGUgZ2l2ZW4gc3RyaW5nICovCiAgVUNPTF9CT1VORF9VUFBFUl9MT05HID0gMiwKICBVQ09MX0JPVU5EX1ZBTFVFX0NPVU5UCn0gVUNvbEJvdW5kTW9kZTsKCi8qKgogKiBQcm9kdWNlIGEgYm91bmQgZm9yIGEgZ2l2ZW4gc29ydGtleSBhbmQgYSBudW1iZXIgb2YgbGV2ZWxzLgogKiBSZXR1cm4gdmFsdWUgaXMgYWx3YXlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCByZWdhcmRsZXNzIG9mIAogKiB3aGV0aGVyIHRoZSByZXN1bHQgYnVmZmVyIHdhcyBiaWcgZW5vdWdoIG9yIGV2ZW4gdmFsaWQuPGJyPgogKiBSZXN1bHRpbmcgYm91bmRzIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSByYW5nZSBvZiBzdHJpbmdzIHRoYXQgYXJlCiAqIGJldHdlZW4gdXBwZXIgYW5kIGxvd2VyIGJvdW5kcy4gRm9yIGV4YW1wbGUsIGlmIGJvdW5kcyBhcmUgcHJvZHVjZWQKICogZm9yIGEgc29ydGtleSBvZiBzdHJpbmcgInNtaXRoIiwgc3RyaW5ncyBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciAKICogYm91bmRzIHdpdGggb25lIGxldmVsIHdvdWxkIGluY2x1ZGUgIlNtaXRoIiwgIlNNSVRIIiwgInNNaVRoIi48YnI+CiAqIFRoZXJlIGFyZSB0d28gdXBwZXIgYm91bmRzIHRoYXQgY2FuIGJlIHByb2R1Y2VkLiBJZiBVQ09MX0JPVU5EX1VQUEVSCiAqIGlzIHByb2R1Y2VkLCBzdHJpbmdzIG1hdGNoZWQgd291bGQgYmUgYXMgYWJvdmUuIEhvd2V2ZXIsIGlmIGJvdW5kCiAqIHByb2R1Y2VkIHVzaW5nIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyBpcyB1c2VkLCB0aGUgYWJvdmUgZXhhbXBsZSB3aWxsCiAqIGFsc28gbWF0Y2ggIlNtaXRoc29uaWFuIiBhbmQgc2ltaWxhci48YnI+CiAqIEZvciBtb3JlIG9uIHVzYWdlLCBzZWUgZXhhbXBsZSBpbiBjaW50bHRzdC9jYXBpdHN0LmMgaW4gcHJvY2VkdXJlCiAqIFRlc3RCb3VuZHMuCiAqIFNvcnQga2V5cyBtYXkgYmUgY29tcGFyZWQgdXNpbmcgPFRUPnN0cmNtcDwvVFQ+LgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc29ydGtleS4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLiAKICogICAgICAgICAgICAgICAgICAgICAoSWYgYW4gdW5tb2RpZmllZCBzb3J0a2V5IGlzIHBhc3NlZCwgaXQgaXMgYWx3YXlzIG51bGwgCiAqICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQpLgogKiBAcGFyYW0gYm91bmRUeXBlIFR5cGUgb2YgYm91bmQgcmVxdWlyZWQuIEl0IGNhbiBiZSBVQ09MX0JPVU5EX0xPV0VSLCB3aGljaCAKICogICAgICAgICAgICAgICAgICBwcm9kdWNlcyBhIGxvd2VyIGluY2x1c2l2ZSBib3VuZCwgVUNPTF9CT1VORF9VUFBFUiwgdGhhdCAKICogICAgICAgICAgICAgICAgICBwcm9kdWNlcyB1cHBlciBib3VuZCB0aGF0IG1hdGNoZXMgc3RyaW5ncyBvZiB0aGUgc2FtZSBsZW5ndGggCiAqICAgICAgICAgICAgICAgICAgb3IgVUNPTF9CT1VORF9VUFBFUl9MT05HIHRoYXQgbWF0Y2hlcyBzdHJpbmdzIHRoYXQgaGF2ZSB0aGUgCiAqICAgICAgICAgICAgICAgICAgc2FtZSBzdGFydGluZyBzdWJzdHJpbmcgYXMgdGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBub09mTGV2ZWxzICBOdW1iZXIgb2YgbGV2ZWxzIHJlcXVpcmVkIGluIHRoZSByZXN1bHRpbmcgYm91bmQgKGZvciBtb3N0IAogKiAgICAgICAgICAgICAgICAgICAgdXNlcywgdGhlIHJlY29tbWVuZGVkIHZhbHVlIGlzIDEpLiBTZWUgdXNlcnMgZ3VpZGUgZm9yIAogKiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb24gb24gbnVtYmVyIG9mIGxldmVscyBhIHNvcnRrZXkgY2FuIGhhdmUuCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlc3VsdGluZyBzb3J0a2V5LgogKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgogKiBAcGFyYW0gc3RhdHVzIFVzZWQgZm9yIHJldHVybmluZyBlcnJvciBjb2RlIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiBJZiB0aGUgCiAqICAgICAgICAgICAgICAgbnVtYmVyIG9mIGxldmVscyByZXF1ZXN0ZWQgaXMgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBsZXZlbHMKICogICAgICAgICAgICAgICBpbiB0aGUgc291cmNlIGtleSwgYSB3YXJuaW5nIChVX1NPUlRfS0VZX1RPT19TSE9SVF9XQVJOSU5HKSBpcyAKICogICAgICAgICAgICAgICBpc3N1ZWQuCiAqIEByZXR1cm4gVGhlIHNpemUgbmVlZGVkIHRvIGZ1bGx5IHN0b3JlIHRoZSBib3VuZC4gCiAqIEBzZWUgdWNvbF9rZXlIYXNoQ29kZQogKiBAZHJhZnQgSUNVIDIuMQogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldEJvdW5kKGNvbnN0IHVpbnQ4X3QgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICBVQ29sQm91bmRNb2RlICAgICAgIGJvdW5kVHlwZSwKICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG5vT2ZMZXZlbHMsCiAgICAgICAgdWludDhfdCAgICAgICAgICAgICAqcmVzdWx0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgIFVFcnJvckNvZGUgICAgICAgICAgKnN0YXR1cyk7CiAgICAgICAgCi8qKgogKiBHZXRzIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhIENvbGxhdG9yLiAKICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHBhcmFtIGluZm8gdGhlIHZlcnNpb24gIyBpbmZvcm1hdGlvbiwgdGhlIHJlc3VsdCB3aWxsIGJlIGZpbGxlZCBpbgogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMgp1Y29sX2dldFZlcnNpb24oY29uc3QgVUNvbGxhdG9yKiBjb2xsLCBVVmVyc2lvbkluZm8gaW5mbyk7CgoKLyoqIAogKiBNZXJnZSB0d28gc29ydCBrZXlzLiBUaGUgbGV2ZWxzIGFyZSBtZXJnZWQgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNvdW50ZXJwYXJ0cwogKiAocHJpbWFyaWVzIHdpdGggcHJpbWFyaWVzLCBzZWNvbmRhcmllcyB3aXRoIHNlY29uZGFyaWVzIGV0Yy4pLiBCZXR3ZWVuIHRoZSB2YWx1ZXMKICogZnJvbSB0aGUgc2FtZSBsZXZlbCBhIHNlcGFyYXRvciBpcyBpbnNlcnRlZC4KICogZXhhbXBsZSAodW5jb21wcmVzc2VkKTogCiAqIDE5MUIxRCAwMSAwNTA1MDUgMDEgOTEwNTA1IDAwIGFuZCAxRjIxMjMgMDEgMDUwNTA1IDAxIDkxMDUwNSAwMAogKiB3aWxsIGJlIG1lcmdlZCBhcyAKICogMTkxQjFEIDAyIDFGMjEyMzAxIDA1MDUwNSAwMiAwNTA1MDUgMDEgOTEwNTA1IDAyIDkxMDUwNSAwMAogKiBUaGlzIGFsbG93cyBmb3IgY29uY2F0ZW5hdGluZyBvZiBmaXJzdCBhbmQgbGFzdCBuYW1lcyBmb3Igc29ydGluZywgYW1vbmcgb3RoZXIgdGhpbmdzLgogKiBJZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgogKiBAcGFyYW0gc3JjMSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzb3J0a2V5CiAqIEBwYXJhbSBzcmMxTGVuZ3RoIGxlbmd0aCBvZiB0aGUgZmlyc3Qgc29ydGtleQogKiBAcGFyYW0gc3JjMiBwb2ludGVyIHRvIHRoZSBzZWNvbmQgc29ydGtleQogKiBAcGFyYW0gc3JjMkxlbmd0aCBsZW5ndGggb2YgdGhlIHNlY29uZCBzb3J0a2V5CiAqIEBwYXJhbSBkZXN0IGJ1ZmZlciB0byBob2xkIHRoZSByZXN1bHQKICogQHBhcmFtIGRlc3RDYXBhY2l0eSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICogQHJldHVybiBzaXplIG9mIHRoZSByZXN1bHQuIElmIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCBzaXplIGlzIGFsd2F5cwogKiAgICAgICAgIHNyYzFMZW5ndGgrc3JjMkxlbmd0aC0xCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX21lcmdlU29ydGtleXMoY29uc3QgdWludDhfdCAqc3JjMSwgaW50MzJfdCBzcmMxTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50MzJfdCBzcmMyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdCwgaW50MzJfdCBkZXN0Q2FwYWNpdHkpOwoKLyoqCiAqIFVuaXZlcnNhbCBhdHRyaWJ1dGUgc2V0dGVyCiAqIEBwYXJhbSBjb2xsIGNvbGxhdG9yIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIGNoYW5nZWQKICogQHBhcmFtIGF0dHIgYXR0cmlidXRlIHR5cGUgCiAqIEBwYXJhbSB2YWx1ZSBhdHRyaWJ1dGUgdmFsdWUKICogQHBhcmFtIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2VudCBvbiBzbW9vdGhseSBvciB0aGVyZSB3ZXJlIGVycm9ycwogKiBAc2VlIFVDb2xBdHRyaWJ1dGUKICogQHNlZSBVQ29sQXR0cmlidXRlVmFsdWUKICogQHNlZSB1Y29sX2dldEF0dHJpYnV0ZQogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9zZXRBdHRyaWJ1dGUoVUNvbGxhdG9yICpjb2xsLCBVQ29sQXR0cmlidXRlIGF0dHIsIFVDb2xBdHRyaWJ1dGVWYWx1ZSB2YWx1ZSwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBVbml2ZXJzYWwgYXR0cmlidXRlIGdldHRlcgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBjaGFuZ2VkCiAqIEBwYXJhbSBhdHRyIGF0dHJpYnV0ZSB0eXBlCiAqIEByZXR1cm4gYXR0cmlidXRlIHZhbHVlCiAqIEBwYXJhbSBzdGF0dXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdlbnQgb24gc21vb3RobHkgb3IgdGhlcmUgd2VyZSBlcnJvcnMKICogQHNlZSBVQ29sQXR0cmlidXRlCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZVZhbHVlCiAqIEBzZWUgdWNvbF9zZXRBdHRyaWJ1dGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgVUNvbEF0dHJpYnV0ZVZhbHVlICBVX0VYUE9SVDIgCnVjb2xfZ2V0QXR0cmlidXRlKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIFZhcmlhYmxlIHRvcAogKiBpcyBhIHR3byBieXRlIHByaW1hcnkgdmFsdWUgd2hpY2ggY2F1c2VzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIHByaW1hcnkgdmFsdWVzIHRoYXQKICogYXJlIGxlc3Mgb3IgZXF1YWwgdGhhbiB0aGUgdmFyaWFibGUgdG9wIHRvIGJlIHNoaWZ0ZWQgd2hlbiBhbHRlcm5hdGUgaGFuZGxpbmcgaXMgc2V0CiAqIHRvIFVDT0xfU0hJRlRFRC4KICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgb2YgYSBzdHJpbmcgc3VwcGxpZWQuIAogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCB2YXJpYWJsZSB0b3AgbmVlZHMgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gdmFyVG9wIG9uZSBvciBtb3JlIChpZiBjb250cmFjdGlvbikgVUNoYXJzIHRvIHdoaWNoIHRoZSB2YXJpYWJsZSB0b3Agc2hvdWxkIGJlIHNldAogKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2YXJpYWJsZSB0b3Agc3RyaW5nLiBJZiAtMSBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIHplcm8gdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlLiBJZiBlcnJvciBjb2RlIGlzIHNldCwgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuIAogKiAgICAgICAgICAgICAgIEVycm9ycyBzZXQgYnkgdGhpcyBmdW5jdGlvbiBhcmU6IDxicj4KICogICAgVV9DRV9OT1RfRk9VTkRfRVJST1IgaWYgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgd2FzIHBhc3NlZCBhbmQgdGhlcmUgaXMgbm8gc3VjaCAKICogICAgYSBjb250cmFjdGlvbjxicj4KICogICAgVV9QUklNQVJZX1RPT19MT05HX0VSUk9SIGlmIHRoZSBwcmltYXJ5IGZvciB0aGUgdmFyaWFibGUgdG9wIGhhcyBtb3JlIHRoYW4gdHdvIGJ5dGVzCiAqIEByZXR1cm4gYSAzMiBiaXQgdmFsdWUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvcCBpbiB1cHBlciAxNiBiaXRzLiAKICogICAgICAgICBMb3dlciAxNiBiaXRzIGFyZSB1bmRlZmluZWQKICogQHNlZSB1Y29sX2dldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgdWludDMyX3QgVV9FWFBPUlQyIAp1Y29sX3NldFZhcmlhYmxlVG9wKFVDb2xsYXRvciAqY29sbCwgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgKnZhclRvcCwgaW50MzJfdCBsZW4sIAogICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKiogCiAqIEdldHMgdGhlIHZhcmlhYmxlIHRvcCB2YWx1ZSBvZiBhIENvbGxhdG9yLiAKICogTG93ZXIgMTYgYml0cyBhcmUgdW5kZWZpbmVkIGFuZCBzaG91bGQgYmUgaWdub3JlZC4KICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggdmFyaWFibGUgdG9wIG5lZWRzIHRvIGJlIHJldHJpZXZlZAogKiBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUgKG5vdCBjaGFuZ2VkIGJ5IGZ1bmN0aW9uKS4gSWYgZXJyb3IgY29kZSBpcyBzZXQsIAogKiAgICAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgogKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUgb2YgYSBDb2xsYXRvci4KICogQHNlZSB1Y29sX3NldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgdWludDMyX3QgVV9FWFBPUlQyIHVjb2xfZ2V0VmFyaWFibGVUb3AoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIAogKiBTZXRzIHRoZSB2YXJpYWJsZSB0b3AgdG8gYSBjb2xsYXRpb24gZWxlbWVudCB2YWx1ZSBzdXBwbGllZC4gVmFyaWFibGUgdG9wIGlzIAogKiBzZXQgdG8gdGhlIHVwcGVyIDE2IGJpdHMuIAogKiBMb3dlciAxNiBiaXRzIGFyZSBpZ25vcmVkLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCB2YXJpYWJsZSB0b3AgbmVlZHMgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gdmFyVG9wIENFIHZhbHVlLCBhcyByZXR1cm5lZCBieSB1Y29sX3NldFZhcmlhYmxlVG9wIG9yIHVjb2wpZ2V0VmFyaWFibGVUb3AKICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIChub3QgY2hhbmdlZCBieSBmdW5jdGlvbikKICogQHNlZSB1Y29sX2dldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9zZXRWYXJpYWJsZVRvcAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AoVUNvbGxhdG9yICpjb2xsLCBjb25zdCB1aW50MzJfdCB2YXJUb3AsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24uIFRoZSByZXN1bHQgaXMgYSBjbG9uZSBvZiBhIGdpdmVuIGNvbGxhdG9yLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB0byBiZSBjbG9uZWQKICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbmV3IGNsb25lLiAKICogSWYgTlVMTCBuZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLiAKICogIElmIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoLCBuZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLgogKiAgQ2xpZW50cyBjYW4gdXNlIHRoZSBVX0NPTF9TQUZFQ0xPTkVfQlVGRkVSU0laRS4gCiAqICBUaGlzIHdpbGwgcHJvYmFibHkgYmUgZW5vdWdoIHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9ucy4KICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UuIAogKiAgSWYgKnBCdWZmZXJTaXplID09IDAsIGEgc3VmZmljaWVudCBzaXplIGZvciB1c2UgaW4gY2xvbmluZyB3aWxsIAogKiAgYmUgcmV0dXJuZWQgKCdwcmUtZmxpZ2h0aW5nJykKICogIElmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNhZmUgY2xvbmUsIAogKiAgbmV3IG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4KICogQHBhcmFtIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2VudCBvbiBzbW9vdGhseSBvciB0aGVyZSB3ZXJlIGVycm9ycwogKiAgICBBbiBpbmZvcm1hdGlvbmFsIHN0YXR1cyB2YWx1ZSwgVV9TQUZFQ0xPTkVfQUxMT0NBVEVEX0VSUk9SLCBpcyB1c2VkIGlmIGFueQogKiBhbGxvY2F0aW9ucyB3ZXJlIG5lY2Vzc2FyeS4KICogQHJldHVybiBwb2ludGVyIHRvIHRoZSBuZXcgY2xvbmUKICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfY2xvc2UKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCnVjb2xfc2FmZUNsb25lKGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpzdGFja0J1ZmZlciwKICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICpwQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOwoKLyoqIGRlZmF1bHQgbWVtb3J5IHNpemUgZm9yIHRoZSBuZXcgY2xvbmUuIEl0IG5lZWRzIHRvIGJlIHRoaXMgbGFyZ2UgZm9yIG9zLzQwMCBsYXJnZSBwb2ludGVycyAqLwojZGVmaW5lIFVfQ09MX1NBRkVDTE9ORV9CVUZGRVJTSVpFIDUxMgoKLyoqCiAqIFJldHVybnMgY3VycmVudCBydWxlcy4gRGVsdGEgZGVmaW5lcyB3aGV0aGVyIGZ1bGwgcnVsZXMgYXJlIHJldHVybmVkIG9yIGp1c3QgdGhlIHRhaWxvcmluZy4gCiAqIFJldHVybnMgbnVtYmVyIG9mIFVDaGFycyBuZWVkZWQgdG8gc3RvcmUgcnVsZXMuIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmZlckxlbiBpcyBub3QgZW5vdWdoIAogKiB0byBzdG9yZSBydWxlcywgd2lsbCBzdG9yZSB1cCB0byBhdmFpbGFibGUgc3BhY2UuCiAqIEBwYXJhbSBjb2xsIGNvbGxhdG9yIHRvIGdldCB0aGUgcnVsZXMgZnJvbQogKiBAcGFyYW0gZGVsdGEgb25lIG9mIFVDT0xfVEFJTE9SSU5HX09OTFksIFVDT0xfRlVMTF9SVUxFUy4gCiAqIEBwYXJhbSBidWZmZXIgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIE5VTEwsIHlvdSdsbCBnZXQgbm8gcnVsZXMuCiAqIEBwYXJhbSBidWZmZXJMZW4gbGVuZ2h0IG9mIGJ1ZmZlciB0byBzdG9yZSBydWxlcyBpbi4gSWYgbGVzcyB0aGVuIG5lZWRlZCB5b3UnbGwgZ2V0IG9ubHkgdGhlIHBhcnQgdGhhdCBmaXRzIGluLgogKiBAcmV0dXJuIGN1cnJlbnQgcnVsZXMKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfZ2V0UnVsZXNFeChjb25zdCBVQ29sbGF0b3IgKmNvbGwsIFVDb2xSdWxlT3B0aW9uIGRlbHRhLCBVQ2hhciAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZlckxlbik7CgovKioKICogZ2V0cyB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGNvbGxhdG9yLiBJZiB0aGUgY29sbGF0b3IKICogaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIHJ1bGVzLCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucwogKiBOVUxMLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGZvciB3aGljaCB0aGUgbG9jYWxlIGlzIG5lZWRlZAogKiBAcGFyYW0gdHlwZSBZb3UgY2FuIGNob29zZSBiZXR3ZWVuIHJlcXVlc3RlZCwgdmFsaWQgYW5kIGFjdHVhbAogKiAgICAgICAgICAgICBsb2NhbGUuIEZvciBkZXNjcmlwdGlvbiBzZWUgdGhlIGRlZmluaXRpb24gb2YKICogICAgICAgICAgICAgVUxvY0RhdGFMb2NhbGVUeXBlIGluIHVsb2MuaAogKiBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgogKiBAcmV0dXJuIHJlYWwgbG9jYWxlIG5hbWUgZnJvbSB3aGljaCB0aGUgY29sbGF0aW9uIGRhdGEgY29tZXMuIAogKiAgICAgICAgIElmIHRoZSBjb2xsYXRvciB3YXMgaW5zdGFudGlhdGVkIGZyb20gcnVsZXMsIHJldHVybnMKICogICAgICAgICBOVUxMLgogKiBAZHJhZnQgSUNVIDIuMQogKi8KVV9DQVBJIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIKdWNvbF9nZXRMb2NhbGUoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVTG9jRGF0YUxvY2FsZVR5cGUgdHlwZSwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCgovKioKICogR2V0IGFuIFVuaWNvZGUgc2V0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBjaGFyYWN0ZXJzIGFuZCBzZXF1ZW5jZXMgdGFpbG9yZWQgaW4gCiAqIHRoaXMgY29sbGF0b3IuIFRoZSByZXN1bHQgbXVzdCBiZSBkaXNwb3NlZCBvZiBieSB1c2luZyB1c2V0X2Nsb3NlLgogKiBAcGFyYW0gY29sbCAgICAgICAgVGhlIFVDb2xsYXRvciBmb3Igd2hpY2ggd2Ugd2FudCB0byBnZXQgdGFpbG9yZWQgY2hhcnMKICogQHBhcmFtIHN0YXR1cyAgICAgIGVycm9yIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgogKiBAcmV0dXJuIGEgcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIFVTZXQuIE11c3QgYmUgYmUgZGlzcG9zZWQgYnkgdXNpbmcgdXNldF9jbG9zZQogKiBAc2VlIHVjb2xfb3BlblJ1bGVzCiAqIEBzZWUgdXNldF9jbG9zZQogKiBAZHJhZnQgSUNVIDIuNAogKi8KVV9DQVBJIFVTZXQgKiBVX0VYUE9SVDIKdWNvbF9nZXRUYWlsb3JlZFNldChjb25zdCBVQ29sbGF0b3IgKmNvbGwsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgojaWZkZWYgVV9VU0VfREVQUkVDQVRFRF9VQ09MX0FQSQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXByZWNhdGVkIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVGhpcyBpcyB0aGUgQyBBUEkgd3JhcHBlciBmb3IgQ29sbGF0aW9uSXRlcmF0b3IgdGhhdCBnb3QgYm9vdGVkIG91dCBmcm9tIGhlcmUsIGluY2x1ZGluZyBqdXN0IGZvciAqLwovKiBpbmNsdWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLyogQGRlcHJlY2F0ZWQgcmVtb3ZlIGFmdGVyIG5vdi0yMDAyICovCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCgovKioKICogT3BlbiBhIFVDb2xsYXRvciB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbi4KICogVGhpcyBpcyB0aGUgc2FtZSBhcyB1Y29sX29wZW4oKSBleGNlcHQgdGhhdCB1Y29sX2dldFZlcnNpb24oKSBvZgogKiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZlcnNpb24KICogcGFyYW1ldGVyLgogKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgdG8gb3BlbiB0aGUgc2FtZSBjb2xsYXRvciBmb3IgYSBnaXZlbgogKiBsb2NhbGUgZXZlbiB3aGVuIElDVSBpcyB1cGRhdGVkLgogKiBUaGUgc2FtZSBsb2NhbGUgYW5kIHZlcnNpb24gZ3VhcmFudGVlcyB0aGUgc2FtZSBzb3J0IGtleXMgYW5kCiAqIGNvbXBhcmlzb24gcmVzdWx0cy4KICoKICogQHBhcmFtIGxvYyBUaGUgbG9jYWxlIElEIGZvciB3aGljaCB0byBvcGVuIGEgY29sbGF0b3IuCiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSByZXF1ZXN0ZWQgY29sbGF0b3IgdmVyc2lvbi4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYSBVRXJyb3JDb2RlLAogKiAgICAgICAgICAgICAgIG11c3Qgbm90IGluZGljYXRlIGEgZmFpbHVyZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVDb2xsYXRvciwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAogKiAgICAgICAgIG9yIGEgY29sbGF0b3Igd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS4KICoKICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX2dldFZlcnNpb24KICogQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBieSBub3YtMjAwMi4gVXNlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgbXVsdGlwbGUgdmVyc2lvbnMgb2YgSUNVCiAqLwpVX0NBUEkgVUNvbGxhdG9yICogVV9FWFBPUlQyCnVjb2xfb3BlblZlcnNpb24oY29uc3QgY2hhciAqbG9jLAogICAgICAgICAgICAgICAgIFVWZXJzaW9uSW5mbyB2ZXJzaW9uLAogICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogR2V0IHRoZSBub3JtYWxpemF0aW9uIG1vZGUgdXNlZCBpbiBhIFVDb2xsYXRvci4KICogVGhlIG5vcm1hbGl6YXRpb24gbW9kZSBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHJldHVybiBUaGUgbm9ybWFsaXphdGlvbiBtb2RlLCBVTk9STV9OT05FIG9yIFVOT1JNX05GRC4KICogQHNlZSB1Y29sX3NldE5vcm1hbGl6YXRpb24KICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBhZnRlciAyMDAyLXNlcC0zMDsgdXNlIHVjb2xfZ2V0QXR0cmlidXRlKCkuCiAqLwpVX0NBUEkgVU5vcm1hbGl6YXRpb25Nb2RlIFVfRVhQT1JUMiAKdWNvbF9nZXROb3JtYWxpemF0aW9uKGNvbnN0IFVDb2xsYXRvciogY29sbCk7CgovKioKICogU2V0IHRoZSBub3JtYWxpemF0aW9uIG1vZGUgdXNlZCBpbiBhIFVDb2xsYXRvci4KICogVGhlIG5vcm1hbGl6YXRpb24gbW9kZSBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBzZXQuCiAqIEBwYXJhbSBtb2RlIFRoZSBkZXNpcmVkIG5vcm1hbGl6YXRpb24gbW9kZTogT25lIG9mCiAqICAgICAgICAgICAgIFVOT1JNX05PTkUgKGV4cGVjdCB0aGUgdGV4dCB0byBub3QgbmVlZCBub3JtYWxpemF0aW9uKSwKICogICAgICAgICAgICAgVU5PUk1fTkZEIChub3JtYWxpemUpCiAqIEBzZWUgdWNvbF9nZXROb3JtYWxpemF0aW9uCiAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgYWZ0ZXIgMjAwMi1zZXAtMzA7IHVzZSB1Y29sX3NldEF0dHJpYnV0ZSgpLgogKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIAp1Y29sX3NldE5vcm1hbGl6YXRpb24oICBVQ29sbGF0b3IgICAgICAgICpjb2xsLAogICAgICAgICAgICBVTm9ybWFsaXphdGlvbk1vZGUgICAgbW9kZSk7CgovKioKICpAZGVwcmVjYXRlZCBSZW1vdmUgYWZ0ZXIgQXVnIDIwMDIKICovCiNpZiAoKFVfSUNVX1ZFUlNJT05fTUFKT1JfTlVNICE9IDIpIHx8IChVX0lDVV9WRVJTSU9OX01JTk9SX05VTSAhPSAyKSkKIyAgIGVycm9yICJJQ1UgdmVyc2lvbiBoYXMgY2hhbmdlZC4gUGxlYXNlIHJlZGVmaW5lIHRoZSBtYWNyb3MgdW5kZXIgVV9VU0VfREVQUkVDQVRFRF9GT1JNQVRfQVBJIHByZS1wcm9jZXNzb3IgZGVmaW5pdGlvbiIKI2Vsc2UgCiMgICBkZWZpbmUgdWNvbF9vcGVuUnVsZXNfMl8yKHJ1bGVzLHJ1bGVzTGVuZ3RoLG5vcm1hbGl6YXRpb25Nb2RlLHN0cmVuZ3RoLHN0YXR1cykgdWNvbF9vcGVuUnVsZXMocnVsZXMscnVsZXNMZW5ndGgsKFVDb2xBdHRyaWJ1dGVWYWx1ZSlub3JtYWxpemF0aW9uTW9kZSxzdHJlbmd0aCxOVUxMLHN0YXR1cykKI2VuZGlmCgojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OICovCgojZW5kaWYK