LyoKICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgogICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CiAgICAoYykgUGhpbGlwIEJsdW5kZWxsLCAyMDAxCgogICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKi8KCiNpZm5kZWYgX19GUE9QQ09ERV9IX18KI2RlZmluZSBfX0ZQT1BDT0RFX0hfXwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgoKLyoKQVJNIEZsb2F0aW5nIFBvaW50IEluc3RydWN0aW9uIENsYXNzZXMKfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCnxjIG8gbiBkfDEgMSAwIFB8VXx1fFd8THwgICBSbiAgfHZ8ICBGZCB8MHwwfDB8MXwgIG8gZiBmIHMgZSB0ICB8IENQRFQKfGMgbyBuIGR8MSAxIDAgUHxVfHd8V3xMfCAgIFJuICB8eHwgIEZkIHwwfDB8MXwwfCAgbyBmIGYgcyBlIHQgIHwgQ1BEVCAoY29wcm8gMikKfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCnxjIG8gbiBkfDEgMSAxIDB8YXxifGN8ZHxlfCAgRm4gfGp8ICBGZCB8MHwwfDB8MXxmfGd8aHwwfGl8ICBGbSB8IENQRE8KfGMgbyBuIGR8MSAxIDEgMHxhfGJ8Y3xMfGV8ICBGbiB8ICAgUmQgIHwwfDB8MHwxfGZ8Z3xofDF8aXwgIEZtIHwgQ1BSVAp8YyBvIG4gZHwxIDEgMSAwfGF8YnxjfDF8ZXwgIEZuIHwxfDF8MXwxfDB8MHwwfDF8ZnxnfGh8MXxpfCAgRm0gfCBjb21wYXJpc29ucwp8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCAKCkNQRFQJCWRhdGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zCgkJTERGLCBTVEYsIExGTSAoY29wcm8gMiksIFNGTSAoY29wcm8gMikKCQkKQ1BETwkJZHlhZGljIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zCgkJQURGLCBNVUYsIFNVRiwgUlNGLCBEVkYsIFJERiwKCQlQT1csIFJQVywgUk1GLCBGTUwsIEZEViwgRlJELCBQT0wKCkNQRE8JCW1vbmFkaWMgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKCQlNVkYsIE1ORiwgQUJTLCBSTkQsIFNRVCwgTE9HLCBMR04sIEVYUCwKCQlTSU4sIENPUywgVEFOLCBBU04sIEFDUywgQVROLCBVUkQsIE5STQoJCQpDUFJUCQlqb2ludCBhcml0aG1ldGljL2RhdGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zCgkJRklYIChhcml0aG1ldGljIGZvbGxvd2VkIGJ5IGxvYWQvc3RvcmUpCgkJRkxUIChsb2FkL3N0b3JlIGZvbGxvd2VkIGJ5IGFyaXRobWV0aWMpCgkJQ01GLCBDTkYgQ01GRSwgQ05GRSAoY29tcGFyaXNvbnMpCgkJV0ZTLCBSRlMgKHdyaXRlL3JlYWQgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyKQoJCVdGQywgUkZDICh3cml0ZS9yZWFkIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIpCgpjb25kCQljb25kaXRpb24gY29kZXMKUAkJcHJlL3Bvc3QgaW5kZXggYml0OiAwID0gcG9zdGluZGV4LCAxID0gcHJlaW5kZXgKVQkJdXAvZG93biBiaXQ6IDAgPSBzdGFjayBncm93cyBkb3duLCAxID0gc3RhY2sgZ3Jvd3MgdXAKVwkJd3JpdGUgYmFjayBiaXQ6IDEgPSB1cGRhdGUgYmFzZSByZWdpc3RlciAoUm4pCkwJCWxvYWQvc3RvcmUgYml0OiAwID0gc3RvcmUsIDEgPSBsb2FkClJuCQliYXNlIHJlZ2lzdGVyClJkCQlkZXN0aW5hdGlvbi9zb3VyY2UgcmVnaXN0ZXIJCQpGZAkJZmxvYXRpbmcgcG9pbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIKRm4JCWZsb2F0aW5nIHBvaW50IHNvdXJjZSByZWdpc3RlcgpGbQkJZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyIG9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Cgp1dgkJdHJhbnNmZXIgbGVuZ3RoIChUQUJMRSAxKQp3eAkJcmVnaXN0ZXIgY291bnQgKFRBQkxFIDIpCmFiY2QJCWFyaXRobWV0aWMgb3Bjb2RlIChUQUJMRVMgMyAmIDQpCmVmCQlkZXN0aW5hdGlvbiBzaXplIChyb3VuZGluZyBwcmVjaXNpb24pIChUQUJMRSA1KQpnaAkJcm91bmRpbmcgbW9kZSAoVEFCTEUgNikKagkJZHlhZGljL21vbmFkaWMgYml0OiAwID0gZHlhZGljLCAxID0gbW9uYWRpYwppIAkJY29uc3RhbnQgYml0OiAxID0gY29uc3RhbnQgKFRBQkxFIDYpCiovCgovKgpUQUJMRSAxCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAgUHJlY2lzaW9uICAgICAgICAgICAgICB8IHUgfCB2IHwgRlBTUi5FUCB8IGxlbmd0aCAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCnwgU2luZ2xlICAgICAgICAgICAgICAgICAgfCAwIPwgMCB8ICAgIHggICAgfCAxIHdvcmRzIHwKfCBEb3VibGUgICAgICAgICAgICAgICAgICB8IDEg/CAxIHwgICAgeCAgICB8IDIgd29yZHMgfAp8IEV4dGVuZGVkICAgICAgICAgICAgICAgIHwgMSD8IDEgfCAgICB4ICAgIHwgMyB3b3JkcyB8CnwgUGFja2VkIGRlY2ltYWwgICAgICAgICAgfCAxIPwgMSB8ICAgIDAgICAgfCAzIHdvcmRzIHwKfCBFeHBhbmRlZCBwYWNrZWQgZGVjaW1hbCB8IDEg/CAxIHwgICAgMSAgICB8IDQgd29yZHMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCk5vdGU6IHggPSBkb24ndCBjYXJlCiovCgovKgpUQUJMRSAyCistLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB3IHwgeCB8IE51bWJlciBvZiByZWdpc3RlcnMgdG8gdHJhbnNmZXIgfAorLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgMCD8IDEgfCAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAxIPwgMCB8ICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDEg/CAxIHwgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMCD8IDAgfCAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoqLwoKLyoKVEFCTEUgMzogRHlhZGljIEZsb2F0aW5nIFBvaW50IE9wY29kZXMKKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGEgfCBiIHwgYyB8IGQgfCBNbmVtb25pYyB8IERlc2NyaXB0aW9uICAgICAgICAgICB8IE9wZXJhdGlvbiAgICAgICAgICAgICB8CistLS0rLS0tKy0tLSstLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAwIHwgMCB8IDAgfCAwIHwgQURGICAgICAgfCBBZGQgICAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiArIEZtICAgICAgICAgfAp8IDAgfCAwIHwgMCB8IDEgfCBNVUYgICAgICB8IE11bHRpcGx5ICAgICAgICAgICAgICB8IEZkIDo9IEZuICogRm0gICAgICAgICB8CnwgMCB8IDAgfCAxIHwgMCB8IFNVRiAgICAgIHwgU3VidHJhY3QgICAgICAgICAgICAgIHwgRmQgOj0gRm4gLSBGbSAgICAgICAgIHwKfCAwIHwgMCB8IDEgfCAxIHwgUlNGICAgICAgfCBSZXZlcnNlIHN1YnRyYWN0ICAgICAgfCBGZCA6PSBGbSAtIEZuICAgICAgICAgfAp8IDAgfCAxIHwgMCB8IDAgfCBEVkYgICAgICB8IERpdmlkZSAgICAgICAgICAgICAgICB8IEZkIDo9IEZuIC8gRm0gICAgICAgICB8CnwgMCB8IDEgfCAwIHwgMSB8IFJERiAgICAgIHwgUmV2ZXJzZSBkaXZpZGUgICAgICAgIHwgRmQgOj0gRm0gLyBGbiAgICAgICAgIHwKfCAwIHwgMSB8IDEgfCAwIHwgUE9XICAgICAgfCBQb3dlciAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiBeIEZtICAgICAgICAgfAp8IDAgfCAxIHwgMSB8IDEgfCBSUFcgICAgICB8IFJldmVyc2UgcG93ZXIgICAgICAgICB8IEZkIDo9IEZtIF4gRm4gICAgICAgICB8CnwgMSB8IDAgfCAwIHwgMCB8IFJNRiAgICAgIHwgUmVtYWluZGVyICAgICAgICAgICAgIHwgRmQgOj0gSUVFRSByZW0oRm4vRm0pIHwKfCAxIHwgMCB8IDAgfCAxIHwgRk1MICAgICAgfCBGYXN0IE11bHRpcGx5ICAgICAgICAgfCBGZCA6PSBGbiAqIEZtICAgICAgICAgfAp8IDEgfCAwIHwgMSB8IDAgfCBGRFYgICAgICB8IEZhc3QgRGl2aWRlICAgICAgICAgICB8IEZkIDo9IEZuIC8gRm0gICAgICAgICB8CnwgMSB8IDAgfCAxIHwgMSB8IEZSRCAgICAgIHwgRmFzdCByZXZlcnNlIGRpdmlkZSAgIHwgRmQgOj0gRm0gLyBGbiAgICAgICAgIHwKfCAxIHwgMSB8IDAgfCAwIHwgUE9MICAgICAgfCBQb2xhciBhbmdsZSAoQXJjVGFuMikgfCBGZCA6PSBhcmN0YW4yKEZuLEZtKSAgfAp8IDEgfCAxIHwgMCB8IDEgfCAgICAgICAgICB8IHVuZGVmaW5lZCBpbnN0cnVjdGlvbiB8IHRyYXAgICAgICAgICAgICAgICAgICB8CnwgMSB8IDEgfCAxIHwgMCB8ICAgICAgICAgIHwgdW5kZWZpbmVkIGluc3RydWN0aW9uIHwgdHJhcCAgICAgICAgICAgICAgICAgIHwKfCAxIHwgMSB8IDEgfCAxIHwgICAgICAgICAgfCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gfCB0cmFwICAgICAgICAgICAgICAgICAgfAorLS0tKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCk5vdGU6IFBPVywgUlBXLCBQT0wgYXJlIGRlcHJlY2F0ZWQsIGFuZCBhcmUgYXZhaWxhYmxlIGZvciBiYWNrd2FyZHMKICAgICAgY29tcGF0aWJpbGl0eSBvbmx5LgoqLwoKLyoKVEFCTEUgNDogTW9uYWRpYyBGbG9hdGluZyBQb2ludCBPcGNvZGVzCistLS0rLS0tKy0tLSstLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBhIHwgYiB8IGMgfCBkIHwgTW5lbW9uaWMgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfCBPcGVyYXRpb24gICAgICAgICAgICAgfAorLS0tKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgMCB8IDAgfCAwIHwgMCB8IE1WRiAgICAgIHwgTW92ZSAgICAgICAgICAgICAgICAgIHwgRmQgOj0gRm0gICAgICAgICAgICAgIHwKfCAwIHwgMCB8IDAgfCAxIHwgTU5GICAgICAgfCBNb3ZlIG5lZ2F0ZWQgICAgICAgICAgfCBGZCA6PSAtIEZtICAgICAgICAgICAgfAp8IDAgfCAwIHwgMSB8IDAgfCBBQlMgICAgICB8IEFic29sdXRlIHZhbHVlICAgICAgICB8IEZkIDo9IGFicyhGbSkgICAgICAgICB8CnwgMCB8IDAgfCAxIHwgMSB8IFJORCAgICAgIHwgUm91bmQgdG8gaW50ZWdlciAgICAgIHwgRmQgOj0gaW50KEZtKSAgICAgICAgIHwKfCAwIHwgMSB8IDAgfCAwIHwgU1FUICAgICAgfCBTcXVhcmUgcm9vdCAgICAgICAgICAgfCBGZCA6PSBzcXJ0KEZtKSAgICAgICAgfAp8IDAgfCAxIHwgMCB8IDEgfCBMT0cgICAgICB8IExvZyBiYXNlIDEwICAgICAgICAgICB8IEZkIDo9IGxvZzEwKEZtKSAgICAgICB8CnwgMCB8IDEgfCAxIHwgMCB8IExHTiAgICAgIHwgTG9nIGJhc2UgZSAgICAgICAgICAgIHwgRmQgOj0gbG4oRm0pICAgICAgICAgIHwKfCAwIHwgMSB8IDEgfCAxIHwgRVhQICAgICAgfCBFeHBvbmVudCAgICAgICAgICAgICAgfCBGZCA6PSBlIF4gRm0gICAgICAgICAgfAp8IDEgfCAwIHwgMCB8IDAgfCBTSU4gICAgICB8IFNpbmUgICAgICAgICAgICAgICAgICB8IEZkIDo9IHNpbihGbSkgICAgICAgICB8CnwgMSB8IDAgfCAwIHwgMSB8IENPUyAgICAgIHwgQ29zaW5lICAgICAgICAgICAgICAgIHwgRmQgOj0gY29zKEZtKSAgICAgICAgIHwKfCAxIHwgMCB8IDEgfCAwIHwgVEFOICAgICAgfCBUYW5nZW50ICAgICAgICAgICAgICAgfCBGZCA6PSB0YW4oRm0pICAgICAgICAgfAp8IDEgfCAwIHwgMSB8IDEgfCBBU04gICAgICB8IEFyYyBTaW5lICAgICAgICAgICAgICB8IEZkIDo9IGFyY3NpbihGbSkgICAgICB8CnwgMSB8IDEgfCAwIHwgMCB8IEFDUyAgICAgIHwgQXJjIENvc2luZSAgICAgICAgICAgIHwgRmQgOj0gYXJjY29zKEZtKSAgICAgIHwKfCAxIHwgMSB8IDAgfCAxIHwgQVROICAgICAgfCBBcmMgVGFuZ2VudCAgICAgICAgICAgfCBGZCA6PSBhcmN0YW4oRm0pICAgICAgfAp8IDEgfCAxIHwgMSB8IDAgfCBVUkQgICAgICB8IFVubm9ybWFsaXplZCByb3VuZCAgICB8IEZkIDo9IGludChGbSkgICAgICAgICB8CnwgMSB8IDEgfCAxIHwgMSB8IE5STSAgICAgIHwgTm9ybWFsaXplICAgICAgICAgICAgIHwgRmQgOj0gbm9ybShGbSkgICAgICAgIHwKKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpOb3RlOiBMT0csIExHTiwgRVhQLCBTSU4sIENPUywgVEFOLCBBU04sIEFDUywgQVROIGFyZSBkZXByZWNhdGVkLCBhbmQgYXJlCiAgICAgIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4KKi8KCi8qClRBQkxFIDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCAgUm91bmRpbmcgUHJlY2lzaW9uICAgICB8IGUgfCBmIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCBJRUVFIFNpbmdsZSBwcmVjaXNpb24gICB8IDAg/CAwIHwKfCBJRUVFIERvdWJsZSBwcmVjaXNpb24gICB8IDAg/CAxIHwKfCBJRUVFIEV4dGVuZGVkIHByZWNpc2lvbiB8IDEg/CAwIHwKfCB1bmRlZmluZWQgKHRyYXApICAgICAgICB8IDEg/CAxIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKKi8KCi8qClRBQkxFIDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKwp8ICBSb3VuZGluZyBNb2RlICAgICAgICAgICAgICAgICAgfCBnIHwgaCB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCBSb3VuZCB0byBuZWFyZXN0IChkZWZhdWx0KSAgICAgIHwgMCD8IDAgfAp8IFJvdW5kIHRvd2FyZCBwbHVzIGluZmluaXR5ICAgICAgfCAwIPwgMSB8CnwgUm91bmQgdG93YXJkIG5lZ2F0aXZlIGluZmluaXR5ICB8IDEg/CAwIHwKfCBSb3VuZCB0b3dhcmQgemVybyAgICAgICAgICAgICAgIHwgMSD8IDEgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rCiovCgovKgo9PT0KPT09IERlZmluaXRpb25zIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMKPT09CiovCgovKiBiaXQgbWFza3MgKi8KI2RlZmluZSBCSVRfUFJFSU5ERVgJMHgwMTAwMDAwMAojZGVmaW5lIEJJVF9VUAkJMHgwMDgwMDAwMAojZGVmaW5lIEJJVF9XUklURV9CQUNLCTB4MDAyMDAwMDAKI2RlZmluZSBCSVRfTE9BRAkweDAwMTAwMDAwCgovKiBtYXNrcyBmb3IgbG9hZC9zdG9yZSAqLwojZGVmaW5lIE1BU0tfQ1BEVAkJMHgwYzAwMDAwMAkvKiBkYXRhIHByb2Nlc3Npbmcgb3Bjb2RlICovCiNkZWZpbmUgTUFTS19PRkZTRVQJCTB4MDAwMDAwZmYKI2RlZmluZSBNQVNLX1RSQU5TRkVSX0xFTkdUSAkweDAwNDA4MDAwCiNkZWZpbmUgTUFTS19SRUdJU1RFUl9DT1VOVAlNQVNLX1RSQU5TRkVSX0xFTkdUSAojZGVmaW5lIE1BU0tfQ09QUk9DRVNTT1IJMHgwMDAwMGYwMAoKLyogVGVzdHMgZm9yIHRyYW5zZmVyIGxlbmd0aCAqLwojZGVmaW5lIFRSQU5TRkVSX1NJTkdMRQkJMHgwMDAwMDAwMAojZGVmaW5lIFRSQU5TRkVSX0RPVUJMRQkJMHgwMDAwODAwMAojZGVmaW5lIFRSQU5TRkVSX0VYVEVOREVECTB4MDA0MDAwMDAKI2RlZmluZSBUUkFOU0ZFUl9QQUNLRUQJCU1BU0tfVFJBTlNGRVJfTEVOR1RICgovKiBHZXQgdGhlIGNvcHJvY2Vzc29yIG51bWJlciBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKQkoKG9wY29kZSAmIE1BU0tfQ09QUk9DRVNTT1IpID4+IDgpCgovKiBHZXQgdGhlIG9mZnNldCBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0T2Zmc2V0KG9wY29kZSkJCShvcGNvZGUgJiBNQVNLX09GRlNFVCkKCi8qIFRlc3RzIGZvciBzcGVjaWZpYyBkYXRhIHRyYW5zZmVyIGxvYWQvc3RvcmUgb3Bjb2Rlcy4gKi8KI2RlZmluZSBURVNUX09QQ09ERShvcGNvZGUsbWFzaykJKCgob3Bjb2RlKSAmIChtYXNrKSkgPT0gKG1hc2spKQoKI2RlZmluZSBMT0FEX09QKG9wY29kZSkgICBURVNUX09QQ09ERSgob3Bjb2RlKSxNQVNLX0NQRFQgfCBCSVRfTE9BRCkKI2RlZmluZSBTVE9SRV9PUChvcGNvZGUpICAoKG9wY29kZSAmIChNQVNLX0NQRFQgfCBCSVRfTE9BRCkpID09IE1BU0tfQ1BEVCkKCiNkZWZpbmUgTERGX09QKG9wY29kZSkJKExPQURfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAxKSkKI2RlZmluZSBMRk1fT1Aob3Bjb2RlKQkoTE9BRF9PUChvcGNvZGUpICYmIChnZXRDb3Byb2Nlc3Nvck51bWJlcihvcGNvZGUpID09IDIpKQojZGVmaW5lIFNURl9PUChvcGNvZGUpCShTVE9SRV9PUChvcGNvZGUpICYmIChnZXRDb3Byb2Nlc3Nvck51bWJlcihvcGNvZGUpID09IDEpKQojZGVmaW5lIFNGTV9PUChvcGNvZGUpCShTVE9SRV9PUChvcGNvZGUpICYmIChnZXRDb3Byb2Nlc3Nvck51bWJlcihvcGNvZGUpID09IDIpKQoKI2RlZmluZSBQUkVJTkRFWEVEKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX1BSRUlOREVYKSAhPSAwKQojZGVmaW5lIFBPU1RJTkRFWEVEKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX1BSRUlOREVYKSA9PSAwKQojZGVmaW5lIEJJVF9VUF9TRVQob3Bjb2RlKQkJKChvcGNvZGUgJiBCSVRfVVApICE9IDApCiNkZWZpbmUgQklUX1VQX0NMRUFSKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX0RPV04pID09IDApCiNkZWZpbmUgV1JJVEVfQkFDSyhvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9XUklURV9CQUNLKSAhPSAwKQojZGVmaW5lIExPQUQob3Bjb2RlKQkJCSgob3Bjb2RlICYgQklUX0xPQUQpICE9IDApCiNkZWZpbmUgU1RPUkUob3Bjb2RlKQkJCSgob3Bjb2RlICYgQklUX0xPQUQpID09IDApCgovKgo9PT0KPT09IERlZmluaXRpb25zIGZvciBhcml0aG1ldGljIGluc3RydWN0aW9ucwo9PT0KKi8KLyogYml0IG1hc2tzICovCiNkZWZpbmUgQklUX01PTkFESUMJMHgwMDAwODAwMAojZGVmaW5lIEJJVF9DT05TVEFOVAkweDAwMDAwMDA4CgojZGVmaW5lIENPTlNUQU5UX0ZNKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX0NPTlNUQU5UKSAhPSAwKQojZGVmaW5lIE1PTkFESUNfSU5TVFJVQ1RJT04ob3Bjb2RlKQkoKG9wY29kZSAmIEJJVF9NT05BRElDKSAhPSAwKQoKLyogaW5zdHJ1Y3Rpb24gaWRlbnRpZmljYXRpb24gbWFza3MgKi8KI2RlZmluZSBNQVNLX0NQRE8JCTB4MGUwMDAwMDAJLyogYXJpdGhtZXRpYyBvcGNvZGUgKi8KI2RlZmluZSBNQVNLX0FSSVRITUVUSUNfT1BDT0RFCTB4MDBmMDgwMDAKI2RlZmluZSBNQVNLX0RFU1RJTkFUSU9OX1NJWkUJMHgwMDA4MDA4MAoKLyogZHlhZGljIGFyaXRobWV0aWMgb3Bjb2Rlcy4gKi8KI2RlZmluZSBBREZfQ09ERQkweDAwMDAwMDAwCiNkZWZpbmUgTVVGX0NPREUJMHgwMDEwMDAwMAojZGVmaW5lIFNVRl9DT0RFCTB4MDAyMDAwMDAKI2RlZmluZSBSU0ZfQ09ERQkweDAwMzAwMDAwCiNkZWZpbmUgRFZGX0NPREUJMHgwMDQwMDAwMAojZGVmaW5lIFJERl9DT0RFCTB4MDA1MDAwMDAKI2RlZmluZSBQT1dfQ09ERQkweDAwNjAwMDAwCiNkZWZpbmUgUlBXX0NPREUJMHgwMDcwMDAwMAojZGVmaW5lIFJNRl9DT0RFCTB4MDA4MDAwMDAKI2RlZmluZSBGTUxfQ09ERQkweDAwOTAwMDAwCiNkZWZpbmUgRkRWX0NPREUJMHgwMGEwMDAwMAojZGVmaW5lIEZSRF9DT0RFCTB4MDBiMDAwMDAKI2RlZmluZSBQT0xfQ09ERQkweDAwYzAwMDAwCi8qIDB4MDBkMDAwMDAgaXMgYW4gaW52YWxpZCBkeWFkaWMgYXJpdGhtZXRpYyBvcGNvZGUgKi8KLyogMHgwMGUwMDAwMCBpcyBhbiBpbnZhbGlkIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZSAqLwovKiAweDAwZjAwMDAwIGlzIGFuIGludmFsaWQgZHlhZGljIGFyaXRobWV0aWMgb3Bjb2RlICovCgovKiBtb25hZGljIGFyaXRobWV0aWMgb3Bjb2Rlcy4gKi8KI2RlZmluZSBNVkZfQ09ERQkweDAwMDA4MDAwCiNkZWZpbmUgTU5GX0NPREUJMHgwMDEwODAwMAojZGVmaW5lIEFCU19DT0RFCTB4MDAyMDgwMDAKI2RlZmluZSBSTkRfQ09ERQkweDAwMzA4MDAwCiNkZWZpbmUgU1FUX0NPREUJMHgwMDQwODAwMAojZGVmaW5lIExPR19DT0RFCTB4MDA1MDgwMDAKI2RlZmluZSBMR05fQ09ERQkweDAwNjA4MDAwCiNkZWZpbmUgRVhQX0NPREUJMHgwMDcwODAwMAojZGVmaW5lIFNJTl9DT0RFCTB4MDA4MDgwMDAKI2RlZmluZSBDT1NfQ09ERQkweDAwOTA4MDAwCiNkZWZpbmUgVEFOX0NPREUJMHgwMGEwODAwMAojZGVmaW5lIEFTTl9DT0RFCTB4MDBiMDgwMDAKI2RlZmluZSBBQ1NfQ09ERQkweDAwYzA4MDAwCiNkZWZpbmUgQVROX0NPREUJMHgwMGQwODAwMAojZGVmaW5lIFVSRF9DT0RFCTB4MDBlMDgwMDAKI2RlZmluZSBOUk1fQ09ERQkweDAwZjA4MDAwCgovKgo9PT0KPT09IERlZmluaXRpb25zIGZvciByZWdpc3RlciB0cmFuc2ZlciBhbmQgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMKPT09CiovCgojZGVmaW5lIE1BU0tfQ1BSVAkJMHgwZTAwMDAxMAkvKiByZWdpc3RlciB0cmFuc2ZlciBvcGNvZGUgKi8KI2RlZmluZSBNQVNLX0NQUlRfQ09ERQkJMHgwMGYwMDAwMAojZGVmaW5lIEZMVF9DT0RFCQkweDAwMDAwMDAwCiNkZWZpbmUgRklYX0NPREUJCTB4MDAxMDAwMDAKI2RlZmluZSBXRlNfQ09ERQkJMHgwMDIwMDAwMAojZGVmaW5lIFJGU19DT0RFCQkweDAwMzAwMDAwCiNkZWZpbmUgV0ZDX0NPREUJCTB4MDA0MDAwMDAKI2RlZmluZSBSRkNfQ09ERQkJMHgwMDUwMDAwMAojZGVmaW5lIENNRl9DT0RFCQkweDAwOTAwMDAwCiNkZWZpbmUgQ05GX0NPREUJCTB4MDBiMDAwMDAKI2RlZmluZSBDTUZFX0NPREUJCTB4MDBkMDAwMDAKI2RlZmluZSBDTkZFX0NPREUJCTB4MDBmMDAwMDAKCi8qCj09PQo9PT0gQ29tbW9uIGRlZmluaXRpb25zCj09PQoqLwoKLyogcmVnaXN0ZXIgbWFza3MgKi8KI2RlZmluZSBNQVNLX1JkCQkweDAwMDBmMDAwCiNkZWZpbmUgTUFTS19SbgkJMHgwMDBmMDAwMAojZGVmaW5lIE1BU0tfRmQJCTB4MDAwMDcwMDAKI2RlZmluZSBNQVNLX0ZtCQkweDAwMDAwMDA3CiNkZWZpbmUgTUFTS19GbgkJMHgwMDA3MDAwMAoKLyogY29uZGl0aW9uIGNvZGUgbWFza3MgKi8KI2RlZmluZSBDQ19NQVNLCQkweGYwMDAwMDAwCiNkZWZpbmUgQ0NfTkVHQVRJVkUJMHg4MDAwMDAwMAojZGVmaW5lIENDX1pFUk8JCTB4NDAwMDAwMDAKI2RlZmluZSBDQ19DQVJSWQkweDIwMDAwMDAwCiNkZWZpbmUgQ0NfT1ZFUkZMT1cJMHgxMDAwMDAwMAojZGVmaW5lIENDX0VRCQkweDAwMDAwMDAwCiNkZWZpbmUgQ0NfTkUJCTB4MTAwMDAwMDAKI2RlZmluZSBDQ19DUwkJMHgyMDAwMDAwMAojZGVmaW5lIENDX0hTCQlDQ19DUwojZGVmaW5lIENDX0NDCQkweDMwMDAwMDAwCiNkZWZpbmUgQ0NfTE8JCUNDX0NDCiNkZWZpbmUgQ0NfTUkJCTB4NDAwMDAwMDAKI2RlZmluZSBDQ19QTAkJMHg1MDAwMDAwMAojZGVmaW5lIENDX1ZTCQkweDYwMDAwMDAwCiNkZWZpbmUgQ0NfVkMJCTB4NzAwMDAwMDAKI2RlZmluZSBDQ19ISQkJMHg4MDAwMDAwMAojZGVmaW5lIENDX0xTCQkweDkwMDAwMDAwCiNkZWZpbmUgQ0NfR0UJCTB4YTAwMDAwMDAKI2RlZmluZSBDQ19MVAkJMHhiMDAwMDAwMAojZGVmaW5lIENDX0dUCQkweGMwMDAwMDAwCiNkZWZpbmUgQ0NfTEUJCTB4ZDAwMDAwMDAKI2RlZmluZSBDQ19BTAkJMHhlMDAwMDAwMAojZGVmaW5lIENDX05WCQkweGYwMDAwMDAwCgovKiByb3VuZGluZyBtYXNrcy92YWx1ZXMgKi8KI2RlZmluZSBNQVNLX1JPVU5ESU5HX01PREUJMHgwMDAwMDA2MAojZGVmaW5lIFJPVU5EX1RPX05FQVJFU1QJMHgwMDAwMDAwMAojZGVmaW5lIFJPVU5EX1RPX1BMVVNfSU5GSU5JVFkJMHgwMDAwMDAyMAojZGVmaW5lIFJPVU5EX1RPX01JTlVTX0lORklOSVRZCTB4MDAwMDAwNDAKI2RlZmluZSBST1VORF9UT19aRVJPCQkweDAwMDAwMDYwCgojZGVmaW5lIE1BU0tfUk9VTkRJTkdfUFJFQ0lTSU9OCTB4MDAwODAwODAKI2RlZmluZSBST1VORF9TSU5HTEUJCTB4MDAwMDAwMDAKI2RlZmluZSBST1VORF9ET1VCTEUJCTB4MDAwMDAwODAKI2RlZmluZSBST1VORF9FWFRFTkRFRAkJMHgwMDA4MDAwMAoKLyogR2V0IHRoZSBjb25kaXRpb24gY29kZSBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0Q29uZGl0aW9uKG9wY29kZSkJCShvcGNvZGUgPj4gMjgpCgovKiBHZXQgdGhlIHNvdXJjZSByZWdpc3RlciBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0Um4ob3Bjb2RlKQkJCSgob3Bjb2RlICYgTUFTS19SbikgPj4gMTYpCgovKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGZChvcGNvZGUpCQkJKChvcGNvZGUgJiBNQVNLX0ZkKSA+PiAxMikKCi8qIEdldCB0aGUgZmlyc3Qgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGbihvcGNvZGUpCQkoKG9wY29kZSAmIE1BU0tfRm4pID4+IDE2KQoKLyogR2V0IHRoZSBzZWNvbmQgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGbShvcGNvZGUpCQkob3Bjb2RlICYgTUFTS19GbSkKCi8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldFJkKG9wY29kZSkJCSgob3Bjb2RlICYgTUFTS19SZCkgPj4gMTIpCgovKiBHZXQgdGhlIHJvdW5kaW5nIG1vZGUgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldFJvdW5kaW5nTW9kZShvcGNvZGUpCQkoKG9wY29kZSAmIE1BU0tfUk9VTkRJTkdfTU9ERSkgPj4gNSkKCiNpZmRlZiBDT05GSUdfRlBFX05XRlBFX1hQCnN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfcHVyZV9fIGZsb2F0eDgwIGdldEV4dGVuZGVkQ29uc3RhbnQoY29uc3QgdW5zaWduZWQgaW50IG5JbmRleCkKewoJZXh0ZXJuIGNvbnN0IGZsb2F0eDgwIGZsb2F0eDgwQ29uc3RhbnRbXTsKCXJldHVybiBmbG9hdHg4MENvbnN0YW50W25JbmRleF07Cn0KI2VuZGlmCgpzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX3B1cmVfXyBmbG9hdDY0IGdldERvdWJsZUNvbnN0YW50KGNvbnN0IHVuc2lnbmVkIGludCBuSW5kZXgpCnsKCWV4dGVybiBjb25zdCBmbG9hdDY0IGZsb2F0NjRDb25zdGFudFtdOwoJcmV0dXJuIGZsb2F0NjRDb25zdGFudFtuSW5kZXhdOwp9CgpzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX3B1cmVfXyBmbG9hdDMyIGdldFNpbmdsZUNvbnN0YW50KGNvbnN0IHVuc2lnbmVkIGludCBuSW5kZXgpCnsKCWV4dGVybiBjb25zdCBmbG9hdDMyIGZsb2F0MzJDb25zdGFudFtdOwoJcmV0dXJuIGZsb2F0MzJDb25zdGFudFtuSW5kZXhdOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRUcmFuc2Zlckxlbmd0aChjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQp7Cgl1bnNpZ25lZCBpbnQgblJjOwoKCXN3aXRjaCAob3Bjb2RlICYgTUFTS19UUkFOU0ZFUl9MRU5HVEgpIHsKCWNhc2UgMHgwMDAwMDAwMDoKCQluUmMgPSAxOwoJCWJyZWFrOwkJLyogc2luZ2xlIHByZWNpc2lvbiAqLwoJY2FzZSAweDAwMDA4MDAwOgoJCW5SYyA9IDI7CgkJYnJlYWs7CQkvKiBkb3VibGUgcHJlY2lzaW9uICovCgljYXNlIDB4MDA0MDAwMDA6CgkJblJjID0gMzsKCQlicmVhazsJCS8qIGV4dGVuZGVkIHByZWNpc2lvbiAqLwoJZGVmYXVsdDoKCQluUmMgPSAwOwoJfQoKCXJldHVybiAoblJjKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0UmVnaXN0ZXJDb3VudChjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQp7Cgl1bnNpZ25lZCBpbnQgblJjOwoKCXN3aXRjaCAob3Bjb2RlICYgTUFTS19SRUdJU1RFUl9DT1VOVCkgewoJY2FzZSAweDAwMDAwMDAwOgoJCW5SYyA9IDQ7CgkJYnJlYWs7CgljYXNlIDB4MDAwMDgwMDA6CgkJblJjID0gMTsKCQlicmVhazsKCWNhc2UgMHgwMDQwMDAwMDoKCQluUmMgPSAyOwoJCWJyZWFrOwoJY2FzZSAweDAwNDA4MDAwOgoJCW5SYyA9IDM7CgkJYnJlYWs7CglkZWZhdWx0OgoJCW5SYyA9IDA7Cgl9CgoJcmV0dXJuIChuUmMpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRSb3VuZGluZ1ByZWNpc2lvbihjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQp7Cgl1bnNpZ25lZCBpbnQgblJjOwoKCXN3aXRjaCAob3Bjb2RlICYgTUFTS19ST1VORElOR19QUkVDSVNJT04pIHsKCWNhc2UgMHgwMDAwMDAwMDoKCQluUmMgPSAxOwoJCWJyZWFrOwoJY2FzZSAweDAwMDAwMDgwOgoJCW5SYyA9IDI7CgkJYnJlYWs7CgljYXNlIDB4MDAwODAwMDA6CgkJblJjID0gMzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJblJjID0gMDsKCX0KCglyZXR1cm4gKG5SYyk7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldERlc3RpbmF0aW9uU2l6ZShjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKQp7Cgl1bnNpZ25lZCBpbnQgblJjOwoKCXN3aXRjaCAob3Bjb2RlICYgTUFTS19ERVNUSU5BVElPTl9TSVpFKSB7CgljYXNlIDB4MDAwMDAwMDA6CgkJblJjID0gdHlwZVNpbmdsZTsKCQlicmVhazsKCWNhc2UgMHgwMDAwMDA4MDoKCQluUmMgPSB0eXBlRG91YmxlOwoJCWJyZWFrOwoJY2FzZSAweDAwMDgwMDAwOgoJCW5SYyA9IHR5cGVFeHRlbmRlZDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJblJjID0gdHlwZU5vbmU7Cgl9CgoJcmV0dXJuIChuUmMpOwp9CgojZW5kaWYK