LyoKICogQ29weXJpZ2h0IDIwMDIgV29uLWt5dSBQYXJrIDx3a3BhcmtAa2xkcC5vcmc+CiAqIENvcHlyaWdodCAyMDA1LDIwMDcgWXVuU29uZyBId2FuZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29tY3RsMzIuaCIKCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX0NPTlRFWFRIRUxQIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFCkNBUFRJT04gIiVzILzTvLoiCkZPTlQgOSwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICLIrsDOIiwgICAgIElET0ssNCwxMjIsNTAsMTQsIFdTX1RBQlNUT1AgfCBXU19HUk9VUAogIFBVU0hCVVRUT04gICAgIsPrvNIiLCBJRENBTkNFTCw1OCwxMjIsNTAsMTQKICBQVVNIQlVUVE9OICAgICLA+7/rKCZBKSIsIElEQ19BUFBMWV9CVVRUT04sMTEyLDEyMiw1MCwxNCxXU19ESVNBQkxFRAogIFBVU0hCVVRUT04gICAgIrW1v/K4uyIsICAgSURIRUxQLDE2NiwxMjIsNTAsMTQsV1NfVEFCU1RPUHxXU19HUk9VUAogIENPTlRST0wgICAgICAgIsXHIiwgICAgSURDX1RBQkNPTlRST0wsIlN5c1RhYkNvbnRyb2wzMiIsV1NfQ0xJUFNJQkxJTkdTfFdTX0dST1VQfFdTX1RBQlNUT1B8VENTX01VTFRJTElORSw0LDQsMjEyLDExNApFTkQKCgpJRERfV0laQVJEIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyOTAsIDE1OQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IFdTX1ZJU0lCTEUKQ0FQVElPTiAiuLa5/bvnIgpGT05UIDksICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgUFVTSEJVVFRPTiAgICAiPCDAzMD8KCZCKSIsIElEQ19CQUNLX0JVVFRPTiw3MSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICK02cC9KCZOKSA+IiwgSURDX05FWFRfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICLBvrfhIiwgIElEQ19GSU5JU0hfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICLD67zSIiwgIElEQ0FOQ0VMLDE3OCwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICK1tb/yuLsiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAixcciLCAgICAgSURDX1RBQkNPTlRST0wsIlN5c1RhYkNvbnRyb2wzMiIsV1NfQ0xJUFNJQkxJTkdTIHwgV1NfRElTQUJMRUQsNyw3LDI1OCw1CiAgTFRFWFQJICAgICAgICAiIiwgICAgICAgIElEQ19TVU5LRU5fTElORUhFQURFUiwwLDM1LDI5MCwxLFNTX0xFRlQgfCBTU19TVU5LRU4gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKRU5ECgoKSUREX1RCQ1VTVE9NSVpFIERJQUxPRyBESVNDQVJEQUJMRSAxMCwgMjAsIDM1NywgMTI1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICK1tbG4udkgu+e/68DaIMGkwMciCkZPTlQgOSwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICK03bHiKCZDKSIsICAgICBJRENBTkNFTCwzMDgsNiw0NCwxNAogIFBVU0hCVVRUT04gICAgIrTZvcMoJkUpIiwgICAgIElEQ19SRVNFVF9CVE4sMzA4LDIzLDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAitbW/8ri7KCZIKSIsICAgICAgSURDX0hFTFBfQlROLDMwOCw0MCw0NCwxNAogIFBVU0hCVVRUT04gICAgIsCnt84gwMy1vygmVSkiLCAgIElEQ19NT1ZFVVBfQlROLDMwOCw3NCw0NCwxNAogIFBVU0hCVVRUT04gICAgIr7Gt6G3zsDMtb8oJkQpIiwgSURDX01PVkVETl9CVE4sMzA4LDkxLDQ5LDE0CiAgTFRFWFQgICAgICAgICAisKG0ycfRILn2xrAoJlYpIiwgLTEsNCw1LDg0LDEwCiAgTElTVEJPWCAgICAgICBJRENfQVZBSUxCVE5fTEJPWCw0LDE3LDEyMCwxMDAsIExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gICAgIrT1x8+x4igmQSkgLT4iLCAgICBJRE9LLCAxMzEsIDQyLCA0NCwgMTQKICBQVVNIQlVUVE9OICAgICI8LcH2v+yx4igmUikiLCBJRENfUkVNT1ZFX0JUTiwxMzEsNjIsNDQsMTQKICBMVEVYVCAgICAgICAgICK1tbG4udkgufbGsCgmVCk6IiwgLTEsMTgyLDUsNzgsMTAKICBMSVNUQk9YICAgICAgIElEQ19UT09MQkFSQlROX0xCT1gsIDE4MiwxNywxMjAsMTAwLExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19DTE9TRSAgICAitN2x4iIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURNX1RPREFZICAgICK/wLTDOiIKICAgIElETV9HT1RPREFZICAiv8C0w7fOILChseIiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19TRVBBUkFUT1IgIrrQuK7A2iIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICBIS1lfTk9ORSAivvjAvSIKfQo=