LyoKICogS29yZWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDggTWlrb2xhaiBaYWxld3NraQogKiBDb3B5cmlnaHQgMjAwOSBZdW5Tb25nIEh3YW5nCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKCklETV9ERUJVR19QT1BVUCBNRU5VCkJFR0lOCiAgICBQT1BVUCAiIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAitfC59rHXKCZEKSIsIElEX0RFQlVHCiAgICBFTkQKRU5ECgpJRERfQ1JBU0hfRExHIERJQUxPR0VYIDEwMCwgMTAwLCAyNzMsIDE3NQpTVFlMRSBEU19TRVRGT05UIHwgRFNfTU9EQUxGUkFNRSB8IERTX0ZJWEVEU1lTIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLHwbfOsde3pSC/obevIgpGT05UIDgsICJUYWhvbWEiCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1NUQVRJQ19CRywwLDAsMjczLDUyLFdTX0JPUkRFUiwwCiAgICBMVEVYVCAgICAgICAgICAgIsDMIMfBt86x17elICVzIMC6IL3JsKLH0SC5rsGmv6Egwfe46cfYvK0gwb634bimIMfKv+S3ziDH1bTPtNkuIFwKICAgICAgICAgICAgICAgICAgICAgIL/suK60wiAgutLG7cC7ILOiw8S15biwILDFv6EgtOvHz7+pIMCvsKjAuyDHpcfUtM+02S4iLAogICAgICAgICAgICAgICAgICAgIElEQ19TVEFUSUNfVFhUMSwyNywxMCwyMjQsMzAKICAgIExURVhUICAgICAgICAgICAix8G3zrHXt6XAxyC5rsGms6ogV2luZMDHILDhx9TAuLfOIMCnx9ggud+7/cfSILz2IMDWvcC0z7TZLiBcCgm0573FwLogvcfH4MfRIMfBt86x17elv6EgtOvHz7+pICBodHRwOi8vYXBwZGIud2luZWhxLm9yZyDAxyDGwcC7IMiuwM4gx9IgvPYgwNa9wLTPtNkuIFwKICAgICAgICAgICAgICAgICAgICAuXG5cblwKICAgICAgICAgICAgICAgICAgICC4uL7gIMDMILmuwaawoSDAqbW1v+y/obyttMIgwbjA58fPwfYgvsqw7SwgvsbB9yC59rHXt84guriw7bXHwfYgvsq+0sC4uOkgXAoJCSAgICAsILTnvcXAuiBodHRwOi8vYnVncy53aW5laHEub3Jnv6Egufax17fOILq4sO3H0iC89iDA1r3AtM+02S4iLElEQ19TVEFUSUNfVFhUMiwyNyw2MCwyMjQsMTAwCiAgICBERUZQVVNIQlVUVE9OICAgIrTdseIiLCBJRE9LLCAyMDUsIDE1MSwgNjAsIDE2LCBXU19UQUJTVE9QCkVORAoKU1RSSU5HVEFCTEUKQkVHSU4KICAgIElEU19BVVRPX0NBUFRJT04gICAgICJXaW5lIMfBt86x17elIMPmtbkiCiAgICBJRFNfSU5WQUxJRF9QQVJBTVMgICAis7u6ziC/obevIC2/w7nZuKPB9iC+ysC6ILjFsLO6r7z2sKEgtem+7r/IIgogICAgSURTX1VOSURFTlRJRklFRCAgICAgIii+y7z2IL74wL0pIgpFTkQK