LyoKICogRGFuaXNoIGxhbmd1YWdlIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IChDKSAyMDA4IEplbnMgQWxicmV0c2VuIDxqZW5zQGFsYnJldHNlbi5kaz4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlLmgiCgpMQU5HVUFHRSBMQU5HX0RBTklTSCwgU1VCTEFOR19ERUZBVUxUCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfSFRNTERJU0FCTEVEICAgICJIVE1MIG9wdGVnbmluZyBlciBpIPhqZWJsaWtrZXQgZGVha3RpdmVyZXQuIgogICAgSURTX0hUTUxET0NVTUVOVCAgICAiSFRNTCBkb2t1bWVudCIKICAgIElEU19ET1dOTE9BRElORyAgICAgIkhlbnRlci4uLiIKICAgIElEU19JTlNUQUxMSU5HICAgICAgIkluc3RhbGxlcmVyLi4uIgp9CgpJRF9EV0xfRElBTE9HIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFICAwLCAwLCAyNjAsIDg1ClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJJbnN0YWxsZXJlIFdpbmUgR2Vja28iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgTFRFWFQgIkRldHRlIHByb2dyYW0gcHL4dmVyIGF0IHZpc2UgZW4gSFRNTC1zaWRlLiBXaW5lIGhhciBicnVnIGZvciBHZWNrbyIgXAogICAgIihNb3ppbGxhcyBIVE1MIG1vdG9yKSBmb3IgYXQgdmlzZSBkZW5uZSBzaWRlbi4gVuZsZyBJbnN0YWxsZXIgaHZpcyAiIFwKICAgICJkdSB2aWwgaGF2ZSBhdCBXaW5lIHNrYWwgaGVudGUgb2cgaW5zdGFsbGVyZSBHZWNrbyBhdXRvbWF0aXNrLiIsIElEX0RXTF9TVEFUVVMsIDEwLCAxMCwgMjQwLCAzMCwgU1NfTEVGVAogICAgQ09OVFJPTCAiUHJvZ3Jlc3MiLCBJRF9EV0xfUFJPR1JFU1MsIFBST0dSRVNTX0NMQVNTQSwgV1NfQk9SREVSfFBCU19TTU9PVEgsIDEwLCA0MCwgMjQwLCAxMgogICAgREVGUFVTSEJVVFRPTiAiJkluc3RhbGxlciIsIElEX0RXTF9JTlNUQUxMLCAyMDAsIDYwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiJkFubnVsbGVyIiwgSURDQU5DRUwsIDE0MCwgNjAsIDUwLCAxNSwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0KCklERF9IWVBFUkxJTksgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjUwLCA2NQpTVFlMRSBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJIeXBlcmxpbmsiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgR1JPVVBCT1ggIkluZm9ybWF0aW9uIG9tIEh5cGVybGluaydlbiIsIC0xLCA1LCA1LCAxOTAsIDU1CiAgICBMVEVYVCAiJlR5cGU6IiwgLTEsIDEwLCAyMiwgMjAsIDEwCiAgICBDT01CT0JPWCBJRENfVFlQRSwgMzUsIDIwLCA0NSwgMTAwLCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WU0NST0xMIHwgQ0JTX0RST1BET1dOTElTVCB8IENCU19IQVNTVFJJTkdTCiAgICBMVEVYVCAiJlVSTDoiLCAtMSwgMTAsIDQyLCAyMCwgMTAKICAgIEVESVRURVhUIElEQ19VUkwsIDM1LCA0MCwgMTUwLCAxNCwgRVNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICAgIFBVU0hCVVRUT04gIk9LIiwgSURPSywgMjAwLCAxMCwgNDUsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiAgICBQVVNIQlVUVE9OICJBbm51bGxlciIsIElEQ0FOQ0VMLCAyMDAsIDI4LCA0NSwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAp9Cg==