LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTcgSGVucmlrIE9sc2VuCiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiBDb3B5cmlnaHQgMjAwOCBKZW5zIEFsYnJldHNlbjxqZW5zQGFsYnJldHNlbi5kaz4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19EQU5JU0gsIFNVQkxBTkdfREVGQVVMVAp7CiBQT1BVUCAiJkZpbGVyIiB7CiAgTUVOVUlURU0gIsUmYmVuLi4uIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlVkc2tyaXYgZW1uZSIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImSW5kc3RpbCBwcmludGVyIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWZzbHV0IiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImUmVkaWdlciIgewogICBNRU5VSVRFTSAiSyZvcGllci4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkFubeZyay4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIkJvZyZt5nJrZSIgewogICBNRU5VSVRFTSAiJkRlZmluZXIuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkhlbHAgYWx3YXlzIHZpc2libGUiCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIkRlZmF1bHQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlZpc2libGUiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3J5IiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZvbnRzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiU21hbGwiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJMYXJnZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlVzZSBzeXN0ZW0gY29sb3JzIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICImSGrmbHAiIHsKICAgTUVOVUlURU0gIiZCcnVnIGFmIEhq5mxwIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiQWx0aWQgJvh2ZXJzdCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWF0aW9uLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICJPbSAmV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpJRERfSU5ERVggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19EQU5JU0gsIFNVQkxBTkdfREVGQVVMVAp7ClNUSURfV0lORV9IRUxQLCAJIldJTkUgSGrmbHAiClNUSURfV0hFUlJPUiwgCQkiRkVKTCIKU1RJRF9XQVJOSU5HLCAgCQkiQURWQVJTRUwiClNUSURfSU5GTywgIAkJIkluZm9ybWF0aW9uIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJJa2tlIGltcGxlbWVudGVyZXQiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkZlamwgdmVkIGluZGzmc25pbmcgYWYgZmlsZW4gYCVzJyIKU1RJRF9JTkRFWCwgCQkiJkluZGhvbGQiClNUSURfQ09OVEVOVFMsCQkiU3VtbWFyeSIKU1RJRF9CQUNLLCAJCSImVGlsYmFnZSIKU1RJRF9BTExfRklMRVMsIAkiQWxsZSBmaWxlciAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJIauZscGUgZmlsZXIgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJLYW4gaWtrZSBmaW5kZSAnJXMnLiBWaWwgZHUgc2VsdiBmaW5kZSBmaWxlbj8iClNUSURfTk9fUklDSEVESVQJIkthbiBpa2tlIGZpbmRlIGVuICdyaWNoZWRpdCcgaW1wbGVtZW50ZXJpbmcuLi4gQWZicnlkZXIiClNUSURfUFNIX0lOREVYLAkJIkhlbHAgdG9waWNzOiAiCn0K