LyoKICogSGVscCBWaWV3ZXIKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKICogUG9ydHVndWVzZSB0cmFuc2xhdGlvbiBieSBHdXN0YXZvIEp1bmlvciBBbHZlcyA8YWx2ZXNAY29ycmVpb25ldC5jb20uYnI+CiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiBDb3B5cmlnaHQgMjAwMyBNYXJjZWxvIER1YXJ0ZQogKiBDb3B5cmlnaHQgMjAwNCBBbelyaWNvIEpvc+kgTWVsbwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgovKiBNZW51ICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJxdWl2byIgewogIE1FTlVJVEVNICImQWJyaXIuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXIgSW1wcmVzc29yYS4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FpJnIiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZFZGl0YXIiIHsKICAgTUVOVUlURU0gIiZDb3BpYXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm90YXIuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICJJbiZkaWNhZG9yIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pci4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICJBaiZ1ZGEiIHsKICAgTUVOVUlURU0gIkFqdWRhICZuYSBhanVkYSIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIlNlbXByZSAmdmlz7XZlbCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWHn9WVzLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImU29icmUgV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWNoZWlybyIgewogIE1FTlVJVEVNICImQWJyaXIuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXIgSW1wcmVzc29yYS4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FpJnIiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZFZGl0YXIiIHsKICAgTUVOVUlURU0gIiZDb3BpYXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm90YXIuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICJJbiZkaWNhZG9yIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pci4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICJBaiZ1ZGEiIHsKICAgTUVOVUlURU0gIkFqdWRhICZuYSBhanVkYSIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIlNlbXByZSAmdmlz7XZlbCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWHn9WVzLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImQWNlcmNhIGRvIFdJTkUiLCBNTklEX0hFTFBfV0lORQojZW5kaWYKIH0KfQoKLyogU3RyaW5ncyAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUSURfV0lORV9IRUxQLCAJIkFqdWRhIFdJTkUiClNUSURfV0hFUlJPUiwgCQkiRVJSTyIKU1RJRF9XQVJOSU5HLCAgCQkiQVZJU08iClNUSURfSU5GTywgIAkJIkluZm9ybWHn428iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk7jbyBpbXBsZW1lbnRhZG8iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkVycm8gZW5jb250cmFkbyBuYSBsZWl0dXJhIGRvIGFycXVpdm8gZGUgYWp1ZGEgJyVzJyIKU1RJRF9DT05URU5UUywgCQkiJkNvbnRl+mRvIgpTVElEX1NFQVJDSCwgCQkiJlByb2N1cmFyIgpTVElEX0JBQ0ssIAkJIiZWb2x0YXIiClNUSURfSElTVE9SWSwgCQkiJkhpc3TzcmljbyIKU1RJRF9UT1BJQ1MsCQkiJlTzcGljb3MiClNUSURfQUxMX0ZJTEVTLCAJIlRvZG9zIG9zIGFycXVpdm9zICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkFycXVpdm9zIGRlIGFqdWRhICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcyAgICJDYW5ub3QgZmluZCAnJXMnLiBEbyB5b3Ugd2FudCB0byBmaW5kIHRoaXMgZmlsZSB5b3Vyc2VsZj8iCn0KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUSURfV0lORV9IRUxQLCAJIkFqdWRhIFdJTkUiClNUSURfV0hFUlJPUiwgCQkiRVJSTyIKU1RJRF9XQVJOSU5HLCAgCQkiQVZJU08iClNUSURfSU5GTywgIAkJIkluZm9ybWHn428iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk7jbyBpbXBsZW1lbnRhZG8iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkVycm8gZW5jb250cmFkbyBuYSBsZWl0dXJhIGRvIGZpY2hlaXJvIGRlIGFqdWRhICclcyciClNUSURfQ09OVEVOVFMsIAkJIiZDb250ZfpkbyIKU1RJRF9TRUFSQ0gsIAkJIiZQcm9jdXJhciIKU1RJRF9CQUNLLCAJCSImVm9sdGFyIgpTVElEX0hJU1RPUlksIAkJIiZIaXN083JpY28iClNUSURfVE9QSUNTLAkJIiZU83BpY29zIgpTVElEX0FMTF9GSUxFUywgCSJUb2RvcyBvcyBmaWNoZWlyb3MgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiRmljaGVpcm9zIGRlIGFqdWRhICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiQ2Fubm90IGZpbmQgJyVzJy4gRG8geW91IHdhbnQgdG8gZmluZCB0aGlzIGZpbGUgeW91cnNlbGY/Igp9Cg==