LyoKICogV2luZUZpbGUKICogU3BhbmlzaCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDA0IEpvc+kgTWFudWVsIEZlcnJlciBPcnRpegogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1NQQU5JU0gsIFNVQkxBTkdfREVGQVVMVAoKLyogTWVudSAqLwoKSURNX1dJTkVGSUxFIE1FTlUgRklYRUQgSU1QVVJFCnsKCVBPUFVQICImQXJjaGl2byIgIHsKCQlNRU5VSVRFTSAiJkFicmlyXHRFbnRlciIgLAkJCTEwMQoJCU1FTlVJVEVNICJNbyZ2ZXIuLi5cdEY3IiAsIAkJCUlEX0ZJTEVfTU9WRQoJCU1FTlVJVEVNICImQ29waWFyLi4uXHRGOCIgLAkJCTEwNwoJCU1FTlVJVEVNICJFJm4gcG9ydGFwYXBlbGVzLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZFbGltaW5hclx0RGVsIiAsCQkJMTA4CgkJTUVOVUlURU0gIiZSZW5vbWJyYXIuLi4iICwJCQkxMDkKCQlNRU5VSVRFTSAiJlByb3BpZWRhZGVzLi4uXHRBbHQrRW50ZXIiICwgSURfRURJVF9QUk9QRVJUSUVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkMmb21wcmltaXIuLi4iICwJCQkxMTkKCQlNRU5VSVRFTSAiJkRlc2NvbXByaW1pci4uLiIgLAkJCTEyMAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJFJmplY3V0YXIuLi4iICwJCQlJRF9FWEVDVVRFCgkJTUVOVUlURU0gIkkmbXByaW1pci4uLiIgLCAJCQkxMDIKCQlNRU5VSVRFTSAiQXNvYyZpYXIuLi4iICwJCQkxMDMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiQ3JlYXIgZGlyZWMmdG9yaW8uLi4iICwJCTExMQoJCU1FTlVJVEVNICImQnVzY2FyLi4uIiAsCQkJCTEwNAoJCU1FTlVJVEVNICJTZSZsZWNjaW9uYXIgYXJjaGl2b3MuLi4iICwJCTExNgoJCU1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIiZTYWxpclx0QWx0K1giICwgCQkJSURfRklMRV9FWElUCiNlbHNlCgkJTUVOVUlURU0gIiZTYWxpciIsIAkJCQlJRF9GSUxFX0VYSVQKI2VuZGlmCgl9CgoJUE9QVVAgIiZEaXNjbyIgIHsKCQlNRU5VSVRFTSAiJkNvcGlhciBkaXNjby4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICJFJnRpcXVldGFyIGRpc2NvLi4uIiAsCQkyMDIKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkZvcm1hdGVhciBkaXNjby4uLiIgLAkJMjAzCiNpZmRlZiBfV0lOOTUKCQlNRU5VSVRFTSAiJkhhY2VyIGRpc2NvIGRlIHNpc3RlbWEuLi4iLAkJLTEJLypUT0RPKi8KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkMmb25lY3RhciB1bmlkYWQgZGUgcmVkIiAsCQkyNTIKCQlNRU5VSVRFTSAiJkRlc2NvbmVjdGFyIHVuaWRhZCBkZSByZWQiICwJCTI1MwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJDbyZtcGFydGlyIGNvbW8uLi4iICwJCQkyNTQKCQlNRU5VSVRFTSAiJkVsaW1pbmFyIGNvbXBhcnRpZG8uLi4iICwJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImU2VsZWNjaW9uYXIgdW5pZGFkLi4uIiAsCQkyNTEKCX0KCglQT1BVUCAiRGkmcmVjdG9yaW9zIiAgewoJCU1FTlVJVEVNICImU2lndWllbnRlIG5pdmVsXHQrIiAsCQkzMDEKCQlNRU5VSVRFTSAiJkV4cGFuZGlyIOFyYm9sXHQqIiAsCQkJMzAyCgkJTUVOVUlURU0gIkV4cGFuZGlyICZ0b2RvXHRTdHJnKyoiICwJCTMwMwoJCU1FTlVJVEVNICImQ29sYXBzYXIg4XJib2xcdC0iICwJCQkzMDQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJk1hcmNhciBoaWpvcyIgLAkJCTUwNQoJfQoKCVBPUFVQICImVmVyIiAgewoJCU1FTlVJVEVNICLBJnJib2wgeSBkaXJlY3RvcmlvIiAsCQk0MTMKCQlNRU5VSVRFTSAiwXJib2wgJnPzbG8iICwJCQk0MTEKCQlNRU5VSVRFTSAiJkRpcmVjdG9yaW8gc/NsbyIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJEaSZ2aWRpciIgLAkJCQk0MTQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiTm8mbWJyZSIgLAkJCQlJRF9WSUVXX05BTUUKCQlNRU5VSVRFTSAiVCZvZG9zIGxvcyBkZXRhbGxlcyIgLCBJRF9WSUVXX0FMTF9BVFRSSUJVVEVTLCBDSEVDS0VECgkJTUVOVUlURU0gIkRldGFsbGVzICZwYXJjaWFsZXMuLi4iICwgSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk9yZGVuYXIgcG9yICZub21icmUiICwJCTQwNAoJCU1FTlVJVEVNICJPcmRlbmFyIHBvciAmdGlwbyIgLAkJCTQwNQoJCU1FTlVJVEVNICJPcmRlbmFyIHBvciB0JmFtYfFvIiAsIAkJNDA2CgkJTUVOVUlURU0gIk9yZGVuYXIgcG9yICZmZWNoYSIgLCAJCTQwNwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJPcmRlbmFyIHBvciAmLi4uIiAsCQkJNDA5Cgl9CgoJUE9QVVAgIiZPcGNpb25lcyIgIHsKCQlNRU5VSVRFTSAiJkNvbmZpcm1hY2nzbi4uLiIgLAkJCS0xCgkJTUVOVUlURU0gIiZGdWVudGUuLi4iICwJCQkJSURfU0VMRUNUX0ZPTlQKCQlNRU5VSVRFTSAiUGVyc29uYWxpemFyIGJhcnJhICZoZXJyYW1pZW50YXMuLi4iICwgLTEKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkJhcnJhIGRlIGhlcnJhbWllbnRhcyIgLCBJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIkJhcnJhIGRlICZ1bmlkYWRlcyIgLCBJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICJCYXJyYSBkZSAmZXN0YWRvIiAsCUlEX1ZJRVdfU1RBVFVTQkFSLCBDSEVDS0VECiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiJlBhbnRhbGxhIGNvbXBsZXRhXHRDdHJsK1NoaWZ0K1MiICwgSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImTWluaW1pemFyIGFsIGVqZWN1dGFyc2UiICwJCS0xCgkJTUVOVUlURU0gIiZHdWFyZGFyIG9wY2lvbmVzIGFsIHNhbGlyIiAsCQk1MTEKCX0KCgoJUE9QVVAgIiZTZWd1cmlkYWQiICB7CgkJTUVOVUlURU0gIiZBY2Nlc28uLi4iICwJCQkJNjA1CgkJTUVOVUlURU0gIiZMb2dnaW5nLi4uIiAsCQkJNjA2CgkJTUVOVUlURU0gIiZQcm9waWV0YXJpby4uLiIgLAkJCTYwNwoJfQoKCVBPUFVQICImVmVudGFuYSIgIHsKCQlNRU5VSVRFTSAiJk51ZXZhIHZlbnRhbmEiICwJCQlJRF9XSU5ET1dfTkVXCgkJTUVOVUlURU0gIiZDYXNjYWRhXHRDdHJsK0Y1IiAsCQlJRF9XSU5ET1dfQ0FTQ0FERQoJCU1FTlVJVEVNICJNb3NhaWNvICZob3Jpem9udGFsIiAsCUlEX1dJTkRPV19USUxFX0hPUloKCQlNRU5VSVRFTSAiTW9zYWljbyAmdmVydGljYWxcdEN0cmwrRjQiICwJSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIkEmbGluZWFyIGF1dG9t4XRpY2FtZW50ZSIgLAlJRF9XSU5ET1dfQVVUT1NPUlQKI2VuZGlmCgkJTUVOVUlURU0gIkFsaW5lYXIgJnPtbWJvbG9zIiAsCQlJRF9XSU5ET1dfQVJSQU5HRQoJCU1FTlVJVEVNICImQWN0dWFsaXphclx0RjUiICwJCQlJRF9SRUZSRVNICgl9CgoJUE9QVVAgIiY/IiAgewoJCU1FTlVJVEVNICImVGVtYXMgZGUgYXl1ZGFcdEYxIiAsCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZCdXNjYXIgZW4gbGEgYXl1ZGEuLi5cdEYxIiAsCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZVc2FuZG8gbGEgYXl1ZGFcdEYxIiAsCQlJRF9IRUxQX1VTSU5HCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJUE9QVVAgIiZJbmZvcm1hY2nzbi4uLiIgIHsKCQkgIE1FTlVJVEVNICJBY2VyY2EgZGUgJldpbmUuLi4iICwJCUlEX0FCT1VUX1dJTkUKLyoKICoJCSAgTUVOVUlURU0gIiZMaWNlbmNpYS4uLiIJCUlEX0xJQ0VOU0UKICoJCSAgTUVOVUlURU0gIiZTSU4gR0FSQU5UzUEiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJFamVjdXRhciIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglDT05UUk9MIAkJIiIsIDEwMSwgIlN0YXRpYyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAoJQ09OVFJPTCAJCSImQ29tYW5kbzoiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglDT05UUk9MIAkJIkNvbW8gJnPtbWJvbG8iICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkJIkFjZXB0YXIiICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJDYW5jZWxhciIgLCAyLCAxNTgsIDIzLCA0NywgMTQKCVBVU0hCVVRUT04JCSImQXl1ZGEiICwgMjU0LCAxNTgsIDQzLCA0NywgMTQKfQoKSUREX1NFTEVDVF9ERVNUSU5BVElPTiBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJTZWxlY2Npb25lIGRlc3Rpbm8iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJQ09OVFJPTCAJCSIiLCAxMDEsICJTdGF0aWMiLCBTU19TSU1QTEV8U1NfTk9QUkVGSVgsIDMsIDYsIDE2MiwgMTAKCUNPTlRST0wJCQkiJlJ1dGE6IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJREVGUFVTSEJVVFRPTgkJIkFjZXB0YXIiICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJDYW5jZWxhciIgLCAyLCAxNTgsIDIzLCA0NywgMTQKCVBVU0hCVVRUT04JCSImRXhhbWluYXIiICwgMjU0LCAxNTgsIDQzLCA0NywgMTQKfQoKU1RSSU5HVEFCTEUKewoJSURTX0ZPTlRfU0VMX0RMR19OQU1FCSJBcGxpY2FuZG8gY29uZmlndXJhY2nzbiBkZSBmdWVudGUiCglJRFNfRk9OVF9TRUxfRVJST1IJIkVycm9yIGFsIHNlbGVjY2lvbmFyIGxhIG51ZXZhIGZ1ZW50ZS4iCn0KClNUUklOR1RBQkxFCnsKIElEU19XSU5FRklMRSAiV2luZWZpbGUiCiBJRFNfRVJST1IgICJFcnJvciIKIElEU19ST09UX0ZTICAic2YgcmHteiIKIElEU19VTklYRlMgICJ1bml4ZnMiCiBJRFNfREVTS1RPUCAgIkVzY3JpdG9yaW8iCiBJRFNfU0hFTEwgICJTaGVsbCIKIElEU19USVRMRUZNVCAiJXMgLSAlcyIKIElEU19OT19JTVBMICAiQfpuIG5vIGltcGxlbWVudGFkbyIKIElEU19XSU5FICAiV0lORSIKIElEU19XSU5FX0ZJTEUgIldpbmUgRmlsZSIKfQoKU1RSSU5HVEFCTEUKewogSURTX0NPTF9OQU1FICJOb21icmUiCiBJRFNfQ09MX1NJWkUgIlRhbWHxbyIKIElEU19DT0xfQ0RBVEUgIkZlY2hhQyIKIElEU19DT0xfQURBVEUgIkZlY2hhQSIKIElEU19DT0xfTURBVEUgIkZlY2hhTSIKIElEU19DT0xfSURYICAizW5kaWNlL05vZG8taSIKIElEU19DT0xfTElOS1MgIkVubGFjZXMiCiBJRFNfQ09MX0FUVFIgIkF0cmlidXRvcyIKIElEU19DT0xfU0VDICAiU2VndXJpZGFkIgp9Cg==