LyoKICogUnVzc2lhbiBsYW5ndWFnZSByZXNvdXJjZSBmaWxlIGZvciBDcmVkZW50aWFscyBVSQogKgogKiBDb3B5cmlnaHQgMjAwOCBBbmRyZXkgRXNpbiA8YW5kcmV5QGVzaW4ubmFtZT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQKCklERF9DUkVERElBTE9HIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjEzLCAxNDkKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX05PSURMRU1TRyB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiSURTX1RJVExFRk9STUFUIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBDT05UUk9MICAgICAgICAgSURCX0JBTk5FUiwtMSwiU3RhdGljIixTU19CSVRNQVAgfCBTU19DRU5URVJJTUFHRSwwLAogICAgICAgICAgICAgICAgICAgIDAsMjEzLDM3CiAgICBMVEVYVCAgICAgICAgICAgIklEU19NRVNTQUdFRk9STUFUIixJRENfTUVTU0FHRSw4LDQ4LDE5OSw4LE5PVCBXU19HUk9VUAogICAgTFRFWFQgICAgICAgICAgICLP7ibr/Ofu4uDy5ev8OiIsLTEsOCw2Miw3MiwxMixTU19DRU5URVJJTUFHRQogICAgQ09OVFJPTCAgICAgICAgICIiLElEQ19VU0VSTkFNRSwiQ29tYm9Cb3hFeDMyIixDQlNfRFJPUERPV04gfAogICAgICAgICAgICAgICAgICAgIENCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVEFCU1RPUCw4MCw2MiwxMjYsODcKICAgIExURVhUICAgICAgICAgICAiJs/g8O7r/DoiLC0xLDgsODAsNzIsMTIsU1NfQ0VOVEVSSU1BR0UKICAgIEVESVRURVhUICAgICAgICBJRENfUEFTU1dPUkQsODAsODAsMTI2LDEyLEVTX1BBU1NXT1JEIHwgRVNfQVVUT0hTQ1JPTEwKICAgIENPTlRST0wgICAgICAgICAi0e4m9fDg7ejy/CDv4PDu6/wiLElEQ19TQVZFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AsODAsOTgsMTI2LDEyCiAgICBERUZQVVNIQlVUVE9OICAgIs7KIixJRE9LLDk3LDEyOCw1MCwxNAogICAgUFVTSEJVVFRPTiAgICAgICLO8uzl7eAiLElEQ0FOQ0VMLDE1NiwxMjgsNTAsMTQKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfVElUTEVGT1JNQVQgICAgICLP7uTq6/735e3o5SDqICVzIgogICAgSURTX01FU1NBR0VGT1JNQVQgICAiz+7k6uv+9+Xt6OUg6iAlcyIKICAgIElEU19JTkNPUlJFQ1RQQVNTV09SRFRJVExFICAiwvXu5CDt5SDh++sg7/Du6Ofi5eS47SIKICAgIElEU19JTkNPUlJFQ1RQQVNTV09SRCAgICAgICAi0+Hl5Ojy5fH8LCD38u4g6Oz/IO/u6/zn7uLg8uXr/1xu6CDv4PDu6/wg4uXw7fsuIgogICAgSURTX0NBUFNMT0NLT05USVRMRSAiQ2FwcyBMb2NrIOLq6/735e0iCiAgICBJRFNfQ0FQU0xPQ0tPTiAgICAgICLP4PDu6/wg7O7m5fIg4fvy/CDi4uXkuO0g7eXv8ODi6Ov87e4g6Oct5+Ag7eDm4PLu6SDq6+Di6PjoIENhcHMgTG9jay5cblxuzvLq6/736PLlIENhcHMgTG9jayDv5fDl5CDy5ewsIOrg6iDi4u7k6PL8IO/g8O7r/C4iCn0K