LyoKICogU2V0dXBBUEkgc3R1YnMKICoKICogQ29weXJpZ2h0IDIwMDAgSmFtZXMgSGF0aGV3YXkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAic2V0dXBhcGkuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHNldHVwYXBpKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwSXRlcmF0ZUNhYmluZXRBIChTRVRVUEFQSS5AKQogKi8KQk9PTCBXSU5BUEkgU2V0dXBJdGVyYXRlQ2FiaW5ldEEoUENTVFIgQ2FiaW5ldEZpbGUsIERXT1JEIFJlc2VydmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1BfRklMRV9DQUxMQkFDS19BIE1zZ0hhbmRsZXIsIFBWT0lEIENvbnRleHQpCnsKCUZJWE1FKCJub3QgaW1wbGVtZW50ZWQgKHNldHVwYXBpLmRsbCkgXG4iKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwSXRlcmF0ZUNhYmluZXRXIChTRVRVUEFQSS5AKQogKi8KQk9PTCBXSU5BUEkgU2V0dXBJdGVyYXRlQ2FiaW5ldFcoUFdTVFIgQ2FiaW5ldEZpbGUsIERXT1JEIFJlc2VydmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1BfRklMRV9DQUxMQkFDS19XIE1zZ0hhbmRsZXIsIFBWT0lEIENvbnRleHQpCnsKCUZJWE1FKCJub3QgaW1wbGVtZW50ZWQgKHNldHVwYXBpLmRsbCkgXG4iKTsKCXJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUUFdyaXRlUHJvZmlsZVN0cmluZyAoU0VUVVBYLjYyKQogKi8KQk9PTCBXSU5BUEkgVFBXcml0ZVByb2ZpbGVTdHJpbmcxNiggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgTFBDU1RSIHN0cmluZyApCnsKICAgIEZJWE1FKCAiJXMgJXMgJXM6IHN0dWJcbiIsIGRlYnVnc3RyX2Eoc2VjdGlvbiksIGRlYnVnc3RyX2EoZW50cnkpLCBkZWJ1Z3N0cl9hKHN0cmluZykgKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlzdUVycm9yVG9JZHMgIChTRVRVUFguNjEpCiAqLwpEV09SRCBXSU5BUEkgc3VFcnJvclRvSWRzMTYoIFdPUkQgdzEsIFdPUkQgdzIgKQp7CiAgICBGSVhNRSggIiV4ICV4OiBzdHViXG4iLCB3MSwgdzIgKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlPcGVuQ2xhc3NSZWdLZXlFeFcgIChTRVRVUEFQSS5AKQogKgogKiBXSU5BUEkgaW4gZGVzY3JpcHRpb24gbm90IGdpdmVuCiAqLwpIS0VZIFdJTkFQSSBTZXR1cERpT3BlbkNsYXNzUmVnS2V5RXhXKExQR1VJRCBjbGFzcywgRFdPUkQgYWNjZXNzLCBEV09SRCBmbGFncywgTFBDV1NUUiAgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUdldENsYXNzRGVzY3JpcHRpb25FeFcgIChTRVRVUEFQSS5AKQogKi8KQk9PTCBXSU5BUEkgU2V0dXBEaUdldENsYXNzRGVzY3JpcHRpb25FeFcgKEdVSUQqIGNsYXNzLCBMUENXU1RSIGRlc2MsIERXT1JEIHNpemUsIFBEV09SRCByZXF1aXJlZCwgTFBDV1NUUiAgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUNsYXNzTmFtZUZyb21HdWlkRXhXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlDbGFzc05hbWVGcm9tR3VpZEV4VyAoR1VJRCogY2xhc3MsIExQQ1dTVFIgZGVzYywgRFdPUkQgc2l6ZSwgUERXT1JEIHJlcXVpcmVkLCBMUENXU1RSICBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpQnVpbGRDbGFzc0luZm9MaXN0RXhXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlCdWlsZENsYXNzSW5mb0xpc3RFeFcoRFdPUkQgZmxhZ3MsIExQR1VJRCBsaXN0LCBEV09SRCBzaXplLCBQRFdPUkQgcmVxdWlyZWQsICBMUENXU1RSICBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpR2V0RGV2aWNlSW5mb0xpc3REZXRhaWxXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlHZXREZXZpY2VJbmZvTGlzdERldGFpbFcoSERFVklORk8gZGV2aW5mbywgUFNQX0RFVklORk9fREFUQSBkZXZpbmZvX2RhdGEgKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDcmVhdGVEZXZpY2VJbmZvTGlzdEV4VyAgKFNFVFVQQVBJLkApCiAqLwpIREVWSU5GTyBXSU5BUEkgU2V0dXBEaUNyZWF0ZURldmljZUluZm9MaXN0RXhXKExQR1VJRCBjbGFzcywgSFdORCBwYXJlbmQsIExQQ1dTVFIgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJICAoU0VUVVBBUEkuQCkKICoKICogTk8gV0lOQVBJIGluIGRlc2NyaXB0aW9uIGdpdmVuCiAqLwpIREVWSU5GTyBXSU5BUEkgU2V0dXBEaUdldENsYXNzRGV2c0V4VyhMUEdVSUQgY2xhc3MsIExQQ1dTVFIgZmlsdGVyLCBIV05EIHBhcmVudCwgRFdPUkQgZmxhZ3MsIEhERVZJTkZPIGRldmljZXNldCwgTFBDV1NUUiBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpQ2xhc3NHdWlkc0Zyb21OYW1lRXhXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlDbGFzc0d1aWRzRnJvbU5hbWVFeFcoTFBDV1NUUiBjbGFzcywgTFBHVUlEIGxpc3QsIERXT1JEIHNpemUsIFBEV09SRCByZXF1aXJlZCwgIExQQ1dTVFIgIG1hY2hpbmUsIFBWT0lEIHJlc2VydmVkKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNNX0Nvbm5lY3RfTWFjaGluZVcgIChTRVRVUEFQSS5AKQogKi8KRFdPUkQgV0lOQVBJIENNX0Nvbm5lY3RfTWFjaGluZVcoTFBDV1NUUiBuYW1lLCB2b2lkICogbWFjaGluZSkKewojZGVmaW5lICBDUl9TVUNDRVNTICAgICAgIDB4MDAwMDAwMDAKI2RlZmluZSAgQ1JfQUNDRVNTX0RFTklFRCAweDAwMDAwMDMzCiAgRklYTUUoIlxuIik7CiAgcmV0dXJuICBDUl9BQ0NFU1NfREVOSUVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNNX0Rpc2Nvbm5lY3RfTWFjaGluZSAgKFNFVFVQQVBJLkApCiAqLwpEV09SRCBXSU5BUEkgQ01fRGlzY29ubmVjdF9NYWNoaW5lKERXT1JEIGhhbmRsZSkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiAgQ1JfU1VDQ0VTUzsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBDb3B5T0VNSW5mQSAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cENvcHlPRU1JbmZBKExQQ1NUUiBzb3VyY2VpbmZmaWxlLCBMUENTVFIgc291cmNlbWVkaWFsb2MsCgkJCSAgICBEV09SRCBtZWRpYXR5cGUsIERXT1JEIGNvcHlzdHlsZSwgTFBTVFIgZGVzdGluZm5hbWUsCgkJCSAgICBEV09SRCBkZXN0bmFtZXNpemUsIFBEV09SRCByZXF1aXJlZCwKCQkJICAgIExQU1RSIGRlc3RpbmZuYW1lY29tcG9uZW50KQp7CiAgRklYTUUoInN0dWI6IHNvdXJjZSAlcyBsb2NhdGlvbiAlc6AuLi5cbiIsc291cmNlaW5mZmlsZSwgc291cmNlbWVkaWFsb2MpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJbnN0YWxsSGluZlNlY3Rpb24gIChTRVRVUEFQSS5AKQogKi8Kdm9pZCBXSU5BUEkgSW5zdGFsbEhpbmZTZWN0aW9uKEhXTkQgaHduZCwgSElOU1RBTkNFIGhhbmRsZSwgTFBDU1RSIGNtZGxpbmUsIElOVCBzaG93KQp7CiAgICBGSVhNRSgic3R1YiwgaHduZCAlcCwgaGFuZGxlICVwLCBjbWRsaW5lICVzXG4iLCBod25kLCBoYW5kbGUsIGRlYnVnc3RyX2EoY21kbGluZSkpOwp9Cg==