LyoKICogIE5vdGVwYWQgKFRoYWkgUmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDIwMDMgSm9uIEdyaWZmaXRocwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1RIQUksIFNVQkxBTkdfREVGQVVMVAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIuG/6cEiIHsKICBNRU5VSVRFTSAiysPp0qfjy8HoLi4uIiwgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAi4LvUtC4uLlx0Q3RybCtPIiwgICBDTURfT1BFTgogIE1FTlVJVEVNICK60bm316FcdEN0cmwrUyIsICAgICBDTURfU0FWRQogIE1FTlVJVEVNICK60bm316Hgu+e5Li4uIiwgICAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAivtTBvuwiLCAgICAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICK7w9G64bXop8u56dIuLi4iLCAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICK7w9G64bXop+Ckw9fozae+1MG+7C4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIs3NoSIsICAgICAgICAgICAgIENNRF9FWElUCiB9CiBQT1BVUCAi4aHp5KIiIHsKICBNRU5VSVRFTSAi4MPVwqGk17lcdEN0cmwrWiIsICAgICBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICK10bRcdEN0cmwrWCIsICAgICAgQ01EX0NVVAogIE1FTlVJVEVNICK10bTFzaFcdEN0cmwrQyIsICAgICBDTURfQ09QWQogIE1FTlVJVEVNICLH0qdcdEN0cmwrViIsICAgIENNRF9QQVNURQogIE1FTlVJVEVNICLFulx0RGVsIiwgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIuDF182ht9Hpp8vBtFx0Q3RybCtBIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAix9G5t9XoL1x0RjUiLCAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIsvozbrDw7fRtMLSxyIsICBDTURfV1JBUAogIE1FTlVJVEVNICLD2bvhurq00cfN0aHJwy4uLiIsICAgICAgICAgIENNRF9GT05UCiB9CiBQT1BVUCAipNG5y9IiIHsKICBNRU5VSVRFTSAipOm5y9JcdEN0cmwrRiIsICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICKk6bnL0rXozeS7XHRGMyIsICBDTURfU0VBUkNIX05FWFQKIH0KIFBPUFVQICKq6MfC4MvF1c0iIHsKICBNRU5VSVRFTSAi4LnX6c3L0iIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAipOm5y9IuLi4iLCAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIuCh1ejCx6HRuqrox8Lgy8XVzSIsICAgICBDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIsPSwsXQ4M3VwrQuLi4iIHsKICAgTUVOVUlURU0gIuO6zbnYrdK1IiwgQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIuTB6MHVIFdBUlJBTlRZIiwgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICLgodXowseh0bogV2luZS4uLiAiLCBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiSGVsdiIKQ0FQVElPTiAiu8PRuuG16KfLuenSIgp7CkxURVhUICAgICLL0cc6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIDB4MTQxLCAgICAgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkZvb3RlcjoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAios26ocPQtNLJOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAio+nSwjoiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiurk6IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwqLyAgICAweDE0QSwgICAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIqLH0joiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAixejSpzoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCovIDB4MTUwLCAgICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAitaHFpyIsICAgICAgICAgMHgxNTEsICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICLCoeDF1KEiLCAgICAgMHgxNTIsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIqrox8Lgy8XVzSIsICAgICAgIDB4MTUzLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAiJm4iICAgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAiy7np0iAmcyIgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAiMjAgwcEuIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIjIwIMHBLiIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICIyNSDBwS4iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAiMjUgwcEuIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELCAgICAgICAiTm90ZXBhZCIKU1RSSU5HX0VSUk9SLCAgICAgICAgICKkx9LBu9S0IgpTVFJJTkdfV0FSTklORywgICAgICAgIqTt0rXXzbkiClNUUklOR19JTkZPLCAgICAgICAgICAiw9LCxdDgzdXCtCIKClNUUklOR19VTlRJVExFRCwgICAgICAi5MHooe3Sy7m0qtbozSIKClNUUklOR19BTExfRklMRVMsICAgICAgICK32KHhv+nBICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAi4b/pwbXt0sPSICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAi4b/pwSAnJXMnIOPLrejgodS55LsiClNUUklOR19OT1RFWFQsICAgICKk2LPkwejjtOCi1cK5zdDkw1xuocPYs9LFzafjy8HoIgpTVFJJTkdfRE9FU05PVEVYSVNULCAi5MHovrrhv+nBICclcycgt9XotenNp6HSw+C71LRcbqTYs7Xpzaeh0sPKw+nSp+PLwejkweggPyIKU1RSSU5HX05PVFNBVkVELCAgIsHVodLD4LvF1ejCueG7xaeh0brgzaHK0sNcblxuJyVzJ1xuXG6k2LO16c2nodLDutG5t9ahwdG5y8PXzeTB6CA/IgpTVFJJTkdfTk9URk9VTkQsICAi5MHovrqi6c2kx9LBICclcycgt9XotenNp6HSw6TpucvSIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgIqTH0sGo7dLLwbRcbqHD2LPSxc2n48vB6CIKCn0K