LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTIwMDF9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlIHVub3JtLmgKKgoqIENyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbiAxMjA1MjAwMAoqCiovCiNpZm5kZWYgVU5PUk1fSAojZGVmaW5lIFVOT1JNX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgoKLyoqCiAqIFxmaWxlCiAqIFxicmllZiBDIEFQSTogVW5pY29kZSBOb3JtYWxpemF0aW9uIAogKgogKiA8aDI+ICBVbmljb2RlIG5vcm1hbGl6YXRpb24gQVBJIDwvaDI+CiAqCiAqIDx0dD51X25vcm1hbGl6ZTwvdHQ+IHRyYW5zZm9ybXMgVW5pY29kZSB0ZXh0IGludG8gYW4gZXF1aXZhbGVudCBjb21wb3NlZCBvcgogKiBkZWNvbXBvc2VkIGZvcm0sIGFsbG93aW5nIGZvciBlYXNpZXIgc29ydGluZyBhbmQgc2VhcmNoaW5nIG9mIHRleHQuCiAqIDx0dD51X25vcm1hbGl6ZTwvdHQ+IHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBub3JtYWxpemF0aW9uIGZvcm1zIGRlc2NyaWJlZCBpbgogKiA8YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjE1LyIgdGFyZ2V0PSJ1bmljb2RlIj4KICogVW5pY29kZSBUZWNobmljYWwgUmVwb3J0ICMxNTwvYT4uCiAqIDxwPgogKiBDaGFyYWN0ZXJzIHdpdGggYWNjZW50cyBvciBvdGhlciBhZG9ybm1lbnRzIGNhbiBiZSBlbmNvZGVkIGluCiAqIHNldmVyYWwgZGlmZmVyZW50IHdheXMgaW4gVW5pY29kZS4gIEZvciBleGFtcGxlLCB0YWtlIHRoZSBjaGFyYWN0ZXIgIsEiCiAqIChBLWFjdXRlKS4gICBJbiBVbmljb2RlLCB0aGlzIGNhbiBiZSBlbmNvZGVkIGFzIGEgc2luZ2xlIGNoYXJhY3RlciAodGhlCiAqICJjb21wb3NlZCIgZm9ybSk6CiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICAgMDBDMSAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKICogXGVuZGNvZGUKICogPC9wcmU+CiAqIG9yIGFzIHR3byBzZXBhcmF0ZSBjaGFyYWN0ZXJzICh0aGUgImRlY29tcG9zZWQiIGZvcm0pOgogKiA8cHJlPgogKiBcY29kZQogKiAgICAgIDAwNDEgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQogKiAgICAgIDAzMDEgICAgQ09NQklOSU5HIEFDVVRFIEFDQ0VOVDwvcHJlPgogKiBcZW5kY29kZQogKiA8cD4KICogVG8gYSB1c2VyIG9mIHlvdXIgcHJvZ3JhbSwgaG93ZXZlciwgYm90aCBvZiB0aGVzZSBzZXF1ZW5jZXMgc2hvdWxkIGJlCiAqIHRyZWF0ZWQgYXMgdGhlIHNhbWUgInVzZXItbGV2ZWwiIGNoYXJhY3RlciAiwSIuICBXaGVuIHlvdSBhcmUgc2VhcmNoaW5nIG9yCiAqIGNvbXBhcmluZyB0ZXh0LCB5b3UgbXVzdCBlbnN1cmUgdGhhdCB0aGVzZSB0d28gc2VxdWVuY2VzIGFyZSB0cmVhdGVkIAogKiBlcXVpdmFsZW50bHkuICBJbiBhZGRpdGlvbiwgeW91IG11c3QgaGFuZGxlIGNoYXJhY3RlcnMgd2l0aCBtb3JlIHRoYW4gb25lCiAqIGFjY2VudC4gIFNvbWV0aW1lcyB0aGUgb3JkZXIgb2YgYSBjaGFyYWN0ZXIncyBjb21iaW5pbmcgYWNjZW50cyBpcwogKiBzaWduaWZpY2FudCwgd2hpbGUgaW4gb3RoZXIgY2FzZXMgYWNjZW50IHNlcXVlbmNlcyBpbiBkaWZmZXJlbnQgb3JkZXJzIGFyZQogKiByZWFsbHkgZXF1aXZhbGVudC4KICogPHA+CiAqIFNpbWlsYXJseSwgdGhlIHN0cmluZyAiZmZpIiBjYW4gYmUgZW5jb2RlZCBhcyB0aHJlZSBzZXBhcmF0ZSBsZXR0ZXJzOgogKiA8cHJlPgogKiBcY29kZQogKiAgICAgIDAwNjYgICAgTEFUSU4gU01BTEwgTEVUVEVSIEYKICogICAgICAwMDY2ICAgIExBVElOIFNNQUxMIExFVFRFUiBGCiAqICAgICAgMDA2OSAgICBMQVRJTiBTTUFMTCBMRVRURVIgSQogKiBcZW5kY29kZQogKiA8L3ByZT4KICogb3IgYXMgdGhlIHNpbmdsZSBjaGFyYWN0ZXIKICogPHByZT4KICogXGNvZGUKICogICAgICBGQjAzICAgIExBVElOIFNNQUxMIExJR0FUVVJFIEZGSTwvcHJlPgogKiBcZW5kY29kZQogKiA8cD4KICogVGhlIGZmaSBsaWdhdHVyZSBpcyBub3QgYSBkaXN0aW5jdCBzZW1hbnRpYyBjaGFyYWN0ZXIsIGFuZCBzdHJpY3RseSBzcGVha2luZwogKiBpdCBzaG91bGRuJ3QgYmUgaW4gVW5pY29kZSBhdCBhbGwsIGJ1dCBpdCB3YXMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkKICogd2l0aCBleGlzdGluZyBjaGFyYWN0ZXIgc2V0cyB0aGF0IGFscmVhZHkgcHJvdmlkZWQgaXQuICBUaGUgVW5pY29kZSBzdGFuZGFyZAogKiBpZGVudGlmaWVzIHN1Y2ggY2hhcmFjdGVycyBieSBnaXZpbmcgdGhlbSAiY29tcGF0aWJpbGl0eSIgZGVjb21wb3NpdGlvbnMKICogaW50byB0aGUgY29ycmVzcG9uZGluZyBzZW1hbnRpYyBjaGFyYWN0ZXJzLiAgV2hlbiBzb3J0aW5nIGFuZCBzZWFyY2hpbmcsIHlvdQogKiB3aWxsIG9mdGVuIHdhbnQgdG8gdXNlIHRoZXNlIG1hcHBpbmdzLgogKiA8cD4KICogPHR0PnVfbm9ybWFsaXplPC90dD4gaGVscHMgc29sdmUgdGhlc2UgcHJvYmxlbXMgYnkgdHJhbnNmb3JtaW5nIHRleHQgaW50byB0aGUKICogY2Fub25pY2FsIGNvbXBvc2VkIGFuZCBkZWNvbXBvc2VkIGZvcm1zIGFzIHNob3duIGluIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlLiAgCiAqIEluIGFkZGl0aW9uLCB5b3UgY2FuIGhhdmUgaXQgcGVyZm9ybSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb25zIHNvIHRoYXQgCiAqIHlvdSBjYW4gdHJlYXQgY29tcGF0aWJpbGl0eSBjaGFyYWN0ZXJzIHRoZSBzYW1lIGFzIHRoZWlyIGVxdWl2YWxlbnRzLgogKiBGaW5hbGx5LCA8dHQ+dV9ub3JtYWxpemU8L3R0PiByZWFycmFuZ2VzIGFjY2VudHMgaW50byB0aGUgcHJvcGVyIGNhbm9uaWNhbAogKiBvcmRlciwgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgYWNjZW50IHJlYXJyYW5nZW1lbnQgb24geW91cgogKiBvd24uCiAqIDxwPgogKiA8dHQ+dV9ub3JtYWxpemU8L3R0PiBhZGRzIG9uZSBvcHRpb25hbCBiZWhhdmlvciwge0BsaW5rICNVQ09MX0lHTk9SRV9IQU5HVUx9LAogKiB0aGF0IGRpZmZlcnMgZnJvbQogKiB0aGUgc3RhbmRhcmQgVW5pY29kZSBOb3JtYWxpemF0aW9uIEZvcm1zLiAKICoqLwoKICAvKioKICAgICogVUNPTF9OT19OT1JNQUxJWkFUSU9OIDogQWNjZW50ZWQgY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBkZWNvbXBvc2VkIGZvciBzb3J0aW5nLiAgCiAgICAqIFVDT0xfREVDT01fQ0FOICAgICAgICAgIDogQ2hhcmFjdGVycyB0aGF0IGFyZSBjYW5vbmljYWwgdmFyaWFudHMgYWNjb3JkaW5nIAogICAgKiB0byBVbmljb2RlIDIuMCB3aWxsIGJlIGRlY29tcG9zZWQgZm9yIHNvcnRpbmcuIAogICAgKiBVQ09MX0RFQ09NUF9DT01QQVQgICAgOiBDaGFyYWN0ZXJzIHRoYXQgYXJlIGNvbXBhdGliaWxpdHkgdmFyaWFudHMgd2lsbCBiZQogICAgKiBkZWNvbXBvc2VkIGZvciBzb3J0aW5nLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG5vcm1hbGl6YXRpb24gbW9kZSB1c2VkLgogICAgKiBVQ09MX0RFQ09NUF9DQU5fQ09NUF9DT01QQVQgOiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gCiAgICAqIFVDT0xfREVDT01QX0NPTVBBVF9DT01QX0NBTiA6IENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24KICAgICoKICAgICoqLwoKdHlwZWRlZiBlbnVtIHsKICAvKiogTm8gZGVjb21wb3NpdGlvbi9jb21wb3NpdGlvbiAqLwogIFVDT0xfTk9fTk9STUFMSVpBVElPTiA9IDEsCiAgLyoqIENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ0FOID0gMiwKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ09NUEFUID0gMywKICAvKiogRGVmYXVsdCBub3JtYWxpemF0aW9uICovCiAgVUNPTF9ERUZBVUxUX05PUk1BTElaQVRJT04gPSBVQ09MX0RFQ09NUF9DT01QQVQsIAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVQ09MX0RFQ09NUF9DQU5fQ09NUF9DT01QQVQgPSA0LAogIC8qKiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ09NUEFUX0NPTVBfQ0FOID01LAogIC8qKiBObyBkZWNvbXBvc2l0aW9uL2NvbXBvc2l0aW9uICovCiAgVU5PUk1fTk9ORSA9IDEsIAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GRCA9IDIsCiAgLyoqIENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GS0QgPSAzLAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVTk9STV9ORkMgPSA0LAogIC8qKiBEZWZhdWx0IG5vcm1hbGl6YXRpb24gKi8KICBVTk9STV9ERUZBVUxUID0gVU5PUk1fTkZDLCAKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GS0MgPTUsCgogIFVOT1JNX01PREVfQ09VTlQsCgogIC8qKiBEbyBub3Qgbm9ybWFsaXplIEhhbmd1bCAqLwogIFVDT0xfSUdOT1JFX0hBTkdVTCAgICA9IDE2LAogIFVOT1JNX0lHTk9SRV9IQU5HVUwgICAgPSAxNgp9IFVOb3JtYWxpemF0aW9uTW9kZTsKCi8qKiBQb3NzaWJsZSBub3JtYWxpemF0aW9uIG9wdGlvbnMgKi8KdHlwZWRlZiBVTm9ybWFsaXphdGlvbk1vZGUgVU5vcm1hbGl6YXRpb25PcHRpb247CgovKioKICogTm9ybWFsaXplIGEgc3RyaW5nLgogKiBUaGUgc3RyaW5nIHdpbGwgYmUgbm9ybWFsaXplZCBhY2NvcmRpbmcgdGhlIHRoZSBzcGVjaWZpZWQgbm9ybWFsaXphdGlvbiBtb2RlCiAqIGFuZCBvcHRpb25zLgogKiBAcGFyYW0gc291cmNlIFRoZSBzdHJpbmcgdG8gbm9ybWFsaXplLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBtb2RlIFRoZSBub3JtYWxpemF0aW9uIG1vZGU7IG9uZSBvZiBVQ09MX05PX05PUk1BTElaQVRJT04sIAogKiBVQ09MX0NBTl9ERUNPTVAsIFVDT0xfQ09NUEFUX0RFQ09NUCwgVUNPTF9DQU5fREVDT01QX0NPTVBBVF9DT01QLCAKICogVUNPTF9DT01QQVRfREVDT01QX0NBTl9DT01QLCBVQ09MX0RFRkFVTFRfTk9STUFMSVpBVElPTgogKiBAcGFyYW0gb3B0aW9ucyBUaGUgbm9ybWFsaXphdGlvbiBvcHRpb25zLCBPUmVkIHRvZ2V0aGVyOyBwb3NzaWJsZSB2YWx1ZXMKICogYXJlIFVDT0xfSUdOT1JFX0hBTkdVTAogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwKICogdGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgaW50MzJfdAp1X25vcm1hbGl6ZShjb25zdCBVQ2hhciogICAgICAgICAgIHNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBzb3VyY2VMZW5ndGgsIAogICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZSAgICAgIG1vZGUsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICBvcHRpb25zLAogICAgICAgIFVDaGFyKiAgICAgICAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgVUVycm9yQ29kZSogICAgICAgICAgICAgc3RhdHVzKTsgICAgCgojZW5kaWYK