LyoKICogSGVscCBWaWV3ZXIgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDggRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgovKiBNZW51ICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKewogUE9QVVAgIiZCZXN0YW5kIiB7CiAgTUVOVUlURU0gIiZPcGVuZW4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJBZiZkcnVra2VuIiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIiZQcmludGVyaW5zdGVsbGluZ2VuLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBZnNsdWl0ZW4iLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZCZXdlcmtlbiIgewogICBNRU5VSVRFTSAiJktvcGnrcmVuLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImQW5ub3RlcmVuLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJkZhdm9yaWV0ZW4iIHsKICAgTUVOVUlURU0gIiZBYW5tYWtlbi4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICImSGVscCIgewogICBNRU5VSVRFTSAiSHVscCAmYmlqIGhlbHAiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJBbHRpamQgJnppY2h0YmFhciIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm8uLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZPdmVyIFdJTkUiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKSUREX0lOREVYIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMDAsIDE5MCBMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiAgICBQVVNIQlVUVE9OICImT0siLCBJRE9LLCA0MCwgMTcwLCA1MCwgMTIKICAgIFBVU0hCVVRUT04gIiZBbm51bGVyZW4iLCBJRENBTkNFTCwgMTIwLCAxNzAsIDUwLCAxMgp9CgovKiBTdHJpbmdzICovClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRFVUQ0gsIFNVQkxBTkdfTkVVVFJBTAp7ClNUSURfV0lORV9IRUxQLCAJIldJTkUgSGVscCIKU1RJRF9XSEVSUk9SLCAJCSJGT1VUIgpTVElEX1dBUk5JTkcsICAJCSJXQUFSU0NIVVdJTkciClNUSURfSU5GTywgIAkJIkluZm9ybWF0aWUiClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk5pZXQgZ2XvbXBsZW1lbnRlZXJkIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJGb3V0IGJpaiBoZXQgbGV6ZW4gdmFuIGhldCBoZWxwYmVzdGFuZCBgJXMnIgpTVElEX0NPTlRFTlRTLCAJCSImSW5ob3VkIgpTVElEX1NFQVJDSCwgCQkiJlpvZWtlbiIKU1RJRF9CQUNLLCAJCSImVGVydWciClNUSURfSElTVE9SWSwgCQkiJkdlc2NoaWVkZW5pcyIKU1RJRF9UT1BJQ1MsCQkiJk9uZGVyd2VycGVuIgpTVElEX0FMTF9GSUxFUywgCSJBbGxlIGJlc3RhbmRlbiAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJIZWxwYmVzdGFuZGVuICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiS2FuICclcycgbmlldCBvcGVuZW4uIFdpbHQgdSB6ZWxmIGRpdCBiZXN0YW5kIHpvZWtlbj8iClNUSURfTk9fUklDSEVESVQJIkNhbm5vdCBmaW5kIGEgcmljaGVkaXQgaW1wbGVtZW50YXRpb24uLi4gQWJvcnRpbmciCn0K