LyoKICogQ29weXJpZ2h0IDIwMDIgV29uLWt5dSBQYXJrIDx3a3BhcmtAa2xkcC5vcmc+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICJQcm9wZXJ0aWVzIGZvciAiCkZPTlQgOSwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiyK7AziIsICAgICBJRE9LLDQsMTIyLDUwLDE0LCBXU19UQUJTVE9QIHwgV1NfR1JPVVAKICBQVVNIQlVUVE9OICAgICLD67zSIiwgSURDQU5DRUwsNTgsMTIyLDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiwPu/6ygmQSkiLCBJRENfQVBQTFlfQlVUVE9OLDExMiwxMjIsNTAsMTQsV1NfRElTQUJMRUQKICBQVVNIQlVUVE9OICAgICK1tb/yuLsiLCAgIElESEVMUCwxNjYsMTIyLDUwLDE0LFdTX1RBQlNUT1B8V1NfR1JPVVAKICBDT05UUk9MICAgICAgICJUYWIiLCAgICBJRENfVEFCQ09OVFJPTCwiU3lzVGFiQ29udHJvbDMyIixXU19DTElQU0lCTElOR1N8V1NfR1JPVVB8V1NfVEFCU1RPUHxUQ1NfTVVMVElMSU5FLDQsNCwyMTIsMTE0CkVORAoKCklERF9XSVpBUkQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDI5MCwgMTU5ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICJXaXphcmQiCkZPTlQgOSwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiwb634SIsICBJRENfRklOSVNIX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgREVGUFVTSEJVVFRPTiAitNnAvSgmTikgPiIsIElEQ19ORVhUX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiPCDAzMD8KCZCKSIsIElEQ19CQUNLX0JVVFRPTiw3MSwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICLD67zSIiwgIElEQ0FOQ0VMLDE3OCwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICK1tb/yuLsiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgIElEQ19UQUJDT05UUk9MLCJTeXNUYWJDb250cm9sMzIiLFdTX0NMSVBTSUJMSU5HUyB8IFdTX0RJU0FCTEVELDcsNywyNTgsNQogIExURVhUCSAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkVIRUFERVIsMCwzNSwyOTAsMSxTU19MRUZUIHwgU1NfU1VOS0VOIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCkVORAoKCklERF9UQkNVU1RPTUlaRSBESUFMT0cgRElTQ0FSREFCTEUgMTAsIDIwLCAzNTcsIDEyNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiQ3VzdG9taXplIFRvb2xiYXIiCkZPTlQgOSwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAitN2x4igmQykiLCAgICAgSURDQU5DRUwsMzA4LDYsNDQsMTQKICBQVVNIQlVUVE9OICAgICK02b3DKCZlKSIsICAgICBJRENfUkVTRVRfQlROLDMwOCwyMyw0NCwxNAogIFBVU0hCVVRUT04gICAgIrW1v/K4uygmSCkiLCAgICAgIElEQ19IRUxQX0JUTiwzMDgsNDAsNDQsMTQKICBQVVNIQlVUVE9OICAgICJNb3ZlICZVcCIsICAgSURDX01PVkVVUF9CVE4sMzA4LDc0LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiTW92ZSAmRG93biIsIElEQ19NT1ZFRE5fQlROLDMwOCw5MSw0NCwxNAogIExURVhUICAgICAgICAgIkEmdmFpbGFibGUgYnV0dG9uczoiLCAtMSw0LDUsODQsMTAKICBMSVNUQk9YICAgICAgIElEQ19BVkFJTEJUTl9MQk9YLDQsMTcsMTIwLDEwMCwgTEJTX05PVElGWSB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgfCBXU19UQUJTVE9QCiAgUFVTSEJVVFRPTiAgICAiJkFkZCAtPiIsICAgIElET0ssIDEzMSwgNDIsIDQ0LCAxNAogIFBVU0hCVVRUT04gICAgIjwtICZSZW1vdmUiLCBJRENfUkVNT1ZFX0JUTiwxMzEsNjIsNDQsMTQKICBMVEVYVCAgICAgICAgICImVG9vbGJhciBidXR0b25zOiIsIC0xLDE4Miw1LDc4LDEwCiAgTElTVEJPWCAgICAgICBJRENfVE9PTEJBUkJUTl9MQk9YLCAxODIsMTcsMTIwLDEwMCxMQlNfTk9USUZZIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfSFNDUk9MTCB8IFdTX1RBQlNUT1AKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfQ0xPU0UgICAgIrTdseIiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElETV9UT0RBWSAgICAiv8C0wzoiCiAgICBJRE1fR09UT0RBWSAgIkdvIHRvIHRvZGF5Igp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfU0VQQVJBVE9SICJTZXBhcmF0b3IiCn0K