LyoKICogQ29weXJpZ2h0IDE5OTUgSm9uIFRvbWJzCiAqIENvcHlyaWdodCAyMDA0IEpvc+kgTWFudWVsIEZlcnJlciBPcnRpegogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2VzLmgiCgpMQU5HVUFHRSBMQU5HX1NQQU5JU0gsIFNVQkxBTkdfTkVVVFJBTAoKU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKewogTUVOVUlURU0gIiZSZXN0YXVyYXIiLCA2MTcyOAogTUVOVUlURU0gIiZNb3ZlciIsIDYxNDU2CiBNRU5VSVRFTSAiJlRhbWHxbyIsIDYxNDQwCiBNRU5VSVRFTSAiTWkmbmltaXphciIsIDYxNDcyCiBNRU5VSVRFTSAiTWEmeGltaXphciIsIDYxNDg4CiBNRU5VSVRFTSBTRVBBUkFUT1IKIE1FTlVJVEVNICImQ2VycmFyXHRBbHQtRjQiLCA2MTUzNgogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAiJkFjZXJjYSBkZSBXaW5lLi4uIiwgNjE3NjEKfQoKRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCnsKCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICImRGVzaGFjZXIiLCBFTV9VTkRPCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkNvJnJ0YXIiLCBXTV9DVVQKCQlNRU5VSVRFTSAiJkNvcGlhciIsIFdNX0NPUFkKCQlNRU5VSVRFTSAiJlBlZ2FyIiwgV01fUEFTVEUKCQlNRU5VSVRFTSAiJkJvcnJhciIsIFdNX0NMRUFSCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlNlbGVjY2lvbmFyICZ0b2RvIiwgRU1fU0VUU0VMCglFTkQKfQoKTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OApTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfTk9JRExFTVNHIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQkVHSU4KICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBTU19OT1BSRUZJWAogICAgICAgIFBVU0hCVVRUT04gIiZBY2VwdGFyIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImQ2FuY2VsYXIiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIkEmYm9ydGFyIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgUFVTSEJVVFRPTiAiJlJlaW50ZW50YXIiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImSWdub3JhciIsIDUsIDIwOCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZT7SIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZObyIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZUcnkgQWdhaW4iLCAxMCwgMzUyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgUFVTSEJVVFRPTiAiJkNvbnRpbnVlIiwgMTEsIDQwMCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIkhlbHAiLCA5LCA0NDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKRU5ECgpNRElfTU9SRVdJTkRPV1MgRElBTE9HIEZJWEVEIElNUFVSRSAyMCwgMjAsIDIzMiwgMTIyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlNlbGVjY2lvbmFyIHZlbnRhbmEiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBNRElfSURDX0xJU1RCT1gsIDUsIDcsIDIyMiwgOTAsIFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIC8qIGRlZmluZWQgaW4gbWRpLmggKi8KICAgIERFRlBVU0hCVVRUT04gICAiQWNlcHRhciIsIElET0ssIDc1LCAxMDAsIDM1LCAxNAogICAgUFVTSEJVVFRPTiAgICAgICJDYW5jZWxhciIsIElEQ0FOQ0VMLCAxMjAsIDEwMCwgMzUsIDE0CkVORAoKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19FUlJPUiAiRXJyb3IiCiAgICBJRFNfTURJX01PUkVXSU5ET1dTICImTeFzIHZlbnRhbmFzLi4uIgp9Cg==