LyoKICogQklPUyBpbnRlcnJ1cHQgMTBoIGhhbmRsZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAxOTk4IEpvc2VwaCBQcmFuZXZpY2gKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChpbnQpOwoKc3RhdGljIHZvaWQgc2Nyb2xsX3dpbmRvdyhpbnQgZGlyZWN0aW9uLCBjaGFyIGxpbmVzLCBjaGFyIHJvdzEsIAogICBjaGFyIGNvbDEsIGNoYXIgcm93MiwgY2hhciBjb2wyLCBjaGFyIGF0dHJpYnV0ZSk7CgojZGVmaW5lIFNDUk9MTF9VUCAxCiNkZWZpbmUgU0NST0xMX0RPV04gMgoKLyogRklYTUU6IGlzIHJvdyBvciBjb2x1bW4gZmlyc3Q/ICovCnN0YXRpYyB2b2lkIEJJT1NfR2V0Q3Vyc29yUG9zKEJJT1NEQVRBKmRhdGEsdW5zaWduZWQgcGFnZSx1bnNpZ25lZCpYLHVuc2lnbmVkKlkpCnsKICAqWCA9IGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMl07CiAgKlkgPSBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjIrMV07Cn0KCnN0YXRpYyB2b2lkIEJJT1NfU2V0Q3Vyc29yUG9zKEJJT1NEQVRBKmRhdGEsdW5zaWduZWQgcGFnZSx1bnNpZ25lZCBYLHVuc2lnbmVkIFkpCnsKICBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjJdID0gWDsKICBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjIrMV0gPSBZOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgRE9TVk1fSW50MTBIYW5kbGVyIChXUFJPQ1MuMTE2KQogKgogKiBIYW5kbGVyIGZvciBpbnQgMTBoICh2aWRlbykuCiAqIAogKiBOT1RFOgogKiAgICBNb3N0IElOVCAxMCBmdW5jdGlvbnMgZm9yIHRleHQtbW9kZSwgQ0dBLCBFR0EsIGFuZCBWR0EgY2FyZHMKICogICAgYXJlIHByZXNlbnQgaW4gdGhpcyBsaXN0LiAoU1ZHQSBhbmQgWEdBIGFyZSBub3QpIFRoYXQgaXMgbm90CiAqICAgIHRvIHNheSB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHN1cHBvcnRlZCwgYnV0IGlmCiAqICAgIGFueW9uZSBpcyBicmFpbi1kYW1hZ2VkIGVub3VnaCB0byB3YW50IHRvIGVtdWxhdGUgb25lIG9mIHRoZXNlCiAqICAgIGJlYXN0cyB0aGVuIHRoaXMgc2hvdWxkIGdldCB5b3Ugc3RhcnRlZC4gCiAqCiAqIE5PVEU6CiAqICAgIFNldmVyYWwgY29tbW9uIGdyYXBoaWNhbCBleHRlbnNpb25zIHVzZWQgYnkgTWljcm9zb2Z0IGhvb2sKICogICAgb2ZmIG9mIGhlcmUuIEkgaGF2ZSAqbm90KiBhZGRlZCB0aGVtIHRvIHRoaXMgbGlzdCAoeWV0KS4gVGhleQogKiAgICBpbmNsdWRlOgogKgogKiAgICBNU0hFUkMuQ09NIC0gTW9yZSBmdW5jdGlvbmFsaXR5IGZvciBIZXJjdWxlcyBjYXJkcy4KICogICAgRUdBLlNZUyAoYWxzbyBNT1VTRS5DT00pIC0gTW9yZSBmb3IgRUdBIGNhcmRzLgogKiAgICAKICogICAgWWVzLCBNUyBhbHNvIGFkZGVkIHRoaXMgc3VwcG9ydCBpbnRvIHRoZWlyIG1vdXNlIGRyaXZlci4gRG9uJ3QKICogICAgYXNrIG1lLCBJIGRvbid0IHdvcmsgZm9yIHRoZW0uCiAqCiAqIEpvc2VwaCBQcmFuZXZpY2ggLSA5Lzk4IAogKgogKiAgSmVzcyBIYWFzIDIvOTkKICoJQWRkZWQgc3VwcG9ydCBmb3IgVmVzYS4gSXQgaXMgbm90IGNvbXBsZXRlIGJ1dCBpcyBhIHN0YXJ0LiAKICoJTk9URTogSW0gbm90IHN1cmUgaWYgaSBkaWQgYWxsIHRoaXMgcmlnaHQgb3IgaWYgZW55IG9mIGl0IHdvcmtzLgogKglDdXJyZW50bHkgaSBkb250IGhhdmUgYSBwcm9ncmFtIHRoYXQgdXNlcyBWZXNhIHRoYXQgYWN0dWFsbHkgZ2V0cyBmYXIgCiAqCWVub3VnaCB3aXRob3V0IGNyYXNoaW5nIHRvIGRvIHZlc2Egc3R1ZmYuCiAqIAogKiAgICAgIEFkZGVkIGFkZGl0aW9uYWwgdmdhIGdyYXBoaWMgc3VwcG9ydCAtIDMvOTkKICovCgp2b2lkIFdJTkFQSSBET1NWTV9JbnQxMEhhbmRsZXIoIENPTlRFWFQ4NiAqY29udGV4dCApCnsKICAgIEJJT1NEQVRBICpkYXRhID0gRE9TTUVNX0Jpb3NEYXRhKCk7CgogICAgaWYoQUxfcmVnKGNvbnRleHQpID09IDB4NEYpIHsgLyogVkVTQSBmdW5jdGlvbnMgKi8KCXN3aXRjaChBSF9yZWcoY29udGV4dCkpIHsKCgljYXNlIDB4MDA6IC8qIEdFVCBTdXBlclZHQSBJTkZPUk1BVElPTiAqLwoJICAgIEZJWE1FKCJWZXNhIEdldCBTdXBlclZHQSBJbmZvIFNUVUIhXG4iKTsKCSAgICBBTF9yZWcoY29udGV4dCkgPSAweDRmOwoJICAgIEFIX3JlZyhjb250ZXh0KSA9IDB4MDE7IC8qIDB4MDE9ZmFpbGVkIDB4MDA9c3VjY2VzZnVsICovCgkgICAgYnJlYWs7CgljYXNlIDB4MDE6IC8qIEdFVCBTdXBlclZHQSBNT0RFIElORk9STUFUSU9OICovCgkgICAgRklYTUUoIlZFU0EgR0VUIFN1cGVyVkdBIE1vZGUgSW5mb3JtYXRpb24gLSBOb3Qgc3VwcG9ydGVkXG4iKTsKCSAgICBBTF9yZWcoY29udGV4dCkgPSAweDRmOwoJICAgIEFIX3JlZyhjb250ZXh0KSA9IDB4MDE7IC8qIDB4MDAgPSBzdWNjZXNzZnVsIDB4MDEgPSBmYWlsZWQgKi8KCSAgICBicmVhazsKCWNhc2UgMHgwMjogLyogU0VUIFN1cGVyVkdBIFZJREVPIE1PREUgKi8KCSAgICBzd2l0Y2goQlhfcmVnKGNvbnRleHQpKSB7CgkgCS8qIE9FTSBWaWRlbyBNb2RlcyAqLwoJCWNhc2UgMHgwMDogLyogNDB4MjUgKi8KICAgICAgICAgICAgCWNhc2UgMHgwMToKICAgICAgICAgICAgICAgIAlUUkFDRSgiU2V0IFZFU0EgVGV4dCBNb2RlIC0gMHgwJXhcbiIsCiAgICAgICAgICAgICAgICAJICAgQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIAlWR0FfU2V0QWxwaGFNb2RlKDQwLCAyNSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPlZpZGVvQ29sdW1ucyA9IDQwOwogICAgICAgICAgICAgICAgCWJyZWFrOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgCWNhc2UgMHgwMjoKICAgICAgICAgICAgCWNhc2UgMHgwMzoKICAgICAgICAgICAgCWNhc2UgMHgwNzoKICAgICAgICAgICAgCSAgICBUUkFDRSgiU2V0IFZFU0EgVGV4dCBNb2RlIC0gMHgwJXhcbiIsCiAgICAgICAgICAgIAkgICAgICAgQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgCSAgICBWR0FfU2V0QWxwaGFNb2RlKDgwLCAyNSk7CiAgICAgICAgICAgICAgICAgICAgZGF0YS0+VmlkZW9Db2x1bW5zID0gODA7CiAgICAgICAgICAgIAkgICAgYnJlYWs7CgkgICAgICAgIGNhc2UgMHgwRDoKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDMyMHgyMDAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoMzIwLDIwMCw0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkgICAgICAgIGNhc2UgMHgwRToKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHgyMDAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDIwMCw0KTsgCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHgzNTAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDM1MCw0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgY2FzZSAweDEyOgogICAgICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgNjQweDQ4MCAxNi1jb2xvciBtb2RlXG4iKTsKICAgICAgICAgICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsNDgwLDQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweDEzOgogICAgICAgICAgICAJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMzIweDIwMCAyNTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIAkgICAgVkdBX1NldE1vZGUoMzIwLDIwMCw4KTsKICAgICAgICAgICAgCSAgICBicmVhazsKCQkvKiBWQkUgTW9kZXMgKi8KCQljYXNlIDB4MTAwOgoJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHg0MDAgMjU2LWNvbG9yIG1vZGVcbiIpOwoJCSAgICBWR0FfU2V0TW9kZSg2NDAsNDAwLDgpOwoJCSAgICBicmVhazsKCQljYXNlIDB4MTAxOgoJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHg0ODAgMjU2LWNvbG9yIG1vZGVcbiIpOwoJCSAgICBWR0FfU2V0TW9kZSg2NDAsNDgwLDgpOwoJCSAgICBicmVhazsKCQljYXNlIDB4MTAyOgoJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDgwMHg2MDAgMTYtY29sb3IgbW9kZVxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMDM6CgkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgODAweDYwMCAyNTYtY29sb3IgbW9kZVxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsOCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMDQ6CgkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTAyNHg3NjggMTYtY29sb3IgbW9kZVxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDQpOwoJCSAgICBicmVhazsKCQljYXNlIDB4MTA1OgoJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEwMjR4NzY4IDI1Ni1jb2xvciBtb2RlXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMTAyNCw3NjgsOCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMDY6CgkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTI4MHgxMDI0IDE2LWNvbG9yIG1vZGVcbiIpOwoJCSAgICBWR0FfU2V0TW9kZSgxMjgwLDEwMjQsNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMDc6CgkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTI4MHgxMDI0IDI1Ni1jb2xvciBtb2RlXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMTI4MCwxMDI0LDgpOwoJCSAgICBicmVhazsKCQkvKiAxMDhoIC0gMTBDaCBhcmUgdGV4dCBtb2RlcyBhbmQgaW0gbGF6eSBzbyA6cCAqLwoJCS8qIFZCRSB2MS4yKyAqLwoJCWNhc2UgMHgxMEQ6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAzMjB4MjAwIDE1YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMzIwLDIwMCwxNSk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMEU6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAzMjB4MjAwIDE2YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMzIwLDIwMCwxNik7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMEY6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAzMjB4MjAwIDI0YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMzIwLDIwMCwyNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTA6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA2NDB4NDgwIDE1YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCwxNSk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTE6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA2NDB4NDgwIDE2YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCwxNik7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTI6CiAgCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA2NDB4NDgwIDI0YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCwyNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTM6CiAJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDgwMHg2MDAgMTVicHBcbiIpOwoJCSAgICBWR0FfU2V0TW9kZSg4MDAsNjAwLDE1KTsKCQkgICAgYnJlYWs7CgkJY2FzZSAweDExNDoKIAkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgODAweDYwMCAxNmJwcFxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsMTYpOwoJCSAgICBicmVhazsKCQljYXNlIDB4MTE1OgogCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA4MDB4NjAwIDI0YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoODAwLDYwMCwyNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTY6CiAJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEwMjR4NzY4IDE1YnBwXG4iKTsKCQkgICAgVkdBX1NldE1vZGUoMTAyNCw3NjgsMTUpOwoJCSAgICBicmVhazsKCQljYXNlIDB4MTE3OgogCQkgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAxMDI0eDc2OCAxNmJwcFxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDE2KTsKCQkgICAgYnJlYWs7CgkJY2FzZSAweDExODoKIAkJICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTAyNHg3NjggMjRicHBcbiIpOwoJCSAgICBWR0FfU2V0TW9kZSgxMDI0LDc2OCwyNCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMTk6CiAJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEyODB4MTAyNCAxNWJwcFxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDEyODAsMTAyNCwxNSk7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMUE6CiAJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEyODB4MTAyNCAxNmJwcFxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDEyODAsMTAyNCwxNik7CgkJICAgIGJyZWFrOwoJCWNhc2UgMHgxMUI6CiAJCSAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEyODB4MTAyNCAyNGJwcFxuIik7CgkJICAgIFZHQV9TZXRNb2RlKDEyODAsMTAyNCwyNCk7CgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICAgIEZJWE1FKCJWRVNBIFNldCBWaWRlbyBNb2RlICgweCV4KSAtIE5vdCBTdXBwb3J0ZWRcbiIsIEJYX3JlZyhjb250ZXh0KSk7CgkgICAgfQogICAgICAgICAgICBkYXRhLT5WaWRlb01vZGUgPSBCWF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7CgkgICAgQUhfcmVnKGNvbnRleHQpID0gMHgwMDsKCSAgICBicmVhazsJCgljYXNlIDB4MDM6IC8qIFZFU0EgU3VwZXJWR0EgQklPUyAtIEdFVCBDVVJSRU5UIFZJREVPIE1PREUgKi8KCQlBTF9yZWcoY29udGV4dCkgPSAweDRmOwoJCUFIX3JlZyhjb250ZXh0KSA9IDB4MDA7IC8qIHNob3VsZCBwcm9ibHkgY2hlY2sgaWYgYSB2ZXNhIG1vZGUgaGFzIGJlbiBzZXQgKi8KCQlCWF9yZWcoY29udGV4dCkgPSBkYXRhLT5WaWRlb01vZGU7CgkJYnJlYWs7CgljYXNlIDB4MDQ6IC8qIFZFU0EgU3VwZXJWR0EgQklPUyAtIFNBVkUvUkVTVE9SRSBTdXBlclZHQSBWSURFTyBTVEFURSAqLwoJCUVSUigiVkVTQSBTQVZFL1JFU1RPUkUgVmlkZW8gU3RhdGUgLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwoJCS8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCQoJCS8qIG1heWJlIHdlIHNob3VsZCBkbyB0aGlzIGluc3RlYWQgPyAqLwoJCS8qIEFIX3JlZyhjb250ZXh0ID0gMHgwMTsgIG5vdCBpbXBsZW1lbnRlZCBzbyBqdXN0IGZhaWwgKi8KCQlicmVhazsKCWNhc2UgMHgwNTogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gQ1BVIFZJREVPIE1FTU9SWSBDT05UUk9MICovCgkJRVJSKCJWRVNBIENQVSBWSURFTyBNRU1PUlkgQ09OVFJPTFxuIik7CgkJLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8JCgkJLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCgkJLyogQUhfcmVnKGNvbnRleHQgPSAweDAwMTsgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwoJCWJyZWFrOwoJY2FzZSAweDA2OiAvKiBWRVNBIEdFVC9TRVQgTE9HSUNBTCBTQ0FOIExJTkUgTEVOR1RIICovCgkJRVJSKCJWRVNBIEdFVC9TRVQgTE9HSUNBTCBTQ0FOIExJTkUgTEVOR1RIIC0gTm90IEltcGxlbWVudGVkXG4iKTsKCQkvKiBBTF9yZWcoY29udGV4dCkgPSAweDRmOyA9IHN1cHBvcnRlZCBzbyBub3Qgc2V0IHNpbmNlIG5vdCBpbXBsZW1lbnRlZCAqLwkKCQkvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KCQkvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCgkJYnJlYWs7CgljYXNlIDB4MDc6IC8qIEdFVC9TRVQgRElTUExBWSBTVEFSVCAqLwoJCUVSUigiVkVTQSBHRVQvU0VUIERJU1BMQVkgU1RBUlQgLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwoJCS8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCQoJCS8qIG1heWJlIHdlIHNob3VsZCBkbyB0aGlzIGluc3RlYWQgPyAqLwoJCS8qIEFIX3JlZyhjb250ZXh0ID0gMHgwMDE7IG5vdCBpbXBsZW1lbnRlZCBzbyBqdXN0IGZhaWwgKi8KCQlicmVhazsKCWNhc2UgMHgwODogLyogR0VUL1NFVCBEQUMgUEFMRVRURSBDT05UUk9MICovCgkJRVJSKCJWRVNBIEdFVC9TRVQgREFDIFBBTEVUVEUgQ09OVFJPTC0gTm90IEltcGxlbWVudGVkXG4iKTsKCQkvKiBBTF9yZWcoY29udGV4dCkgPSAweDRmOyA9IHN1cHBvcnRlZCBzbyBub3Qgc2V0IHNpbmNlIG5vdCBpbXBsZW1lbnRlZCAqLwkKCQkvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KCQkvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCgkJYnJlYWs7CgljYXNlIDB4MDk6IC8qIFNFVCBQQUxFVFRFIEVOVFJJRVMgKi8KCQlGSVhNRSgiVkVTQSBTZXQgcGFsZXR0ZSBlbnRyaWVzIC0gbm90IGltcGxlbWVudGVkXG4iKTsKCQlicmVhazsKICAgICAgICBjYXNlIDB4ZWY6ICAvKiBnZXQgdmlkZW8gbW9kZSBmb3IgaGVyY3VsZXMtY29tcGF0aWJsZXMgICAqLwogICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHJlYWxseSBzdXBwb3J0IHRoaXMgICovCiAgICAgICAgICAgICAgICAgICAgLyogaXMgdGhlcmU/Li4uLi4uLi4uLi4uLi4uLi4uLi4oQS5DLikgICAgICAgKi8KICAgICAgICAgICAgICAgIFRSQUNFKCJKdXN0IHJlcG9ydCB0aGUgdmlkZW8gbm90IGhlcmN1bGVzIGNvbXBhdGlibGVcbiIpOwogICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHhmZmZmOwogICAgICAgICAgICAgICAgYnJlYWs7IAoJY2FzZSAweGZmOiAvKiBUdXJuIFZFU0EgT04vT0ZGICovCgkJLyogaSBkb250IGtub3cgd2hhdCB0byBkbyAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlGSVhNRSgiVkVTQSBGdW5jdGlvbiAoMHgleCkgLSBOb3QgU3VwcG9ydGVkXG4iLCBBSF9yZWcoY29udGV4dCkpOwoJCWJyZWFrOwkJCgl9CiAgICB9CiAgICBlbHNlIHsKCiAgICBzd2l0Y2goQUhfcmVnKGNvbnRleHQpKSB7CgogICAgY2FzZSAweDAwOiAvKiBTRVQgVklERU8gTU9ERSAqLwogICAgICAgIC8qIFRleHQgTW9kZXM6ICovCiAgICAgICAgLyogKG1vZGUpICh0ZXh0IHJvd3MvY29scykKICAgICAgICAgICAgMHgwMCAtIDQweDI1IAogICAgICAgICAgICAweDAxIC0gNDB4MjUKICAgICAgICAgICAgMHgwMiAtIDgweDI1CiAgICAgICAgICAgIDB4MDMgLSA4MHgyNSBvciA4MHg0MyBvciA4MHg1MCAoYXNzdW1lIDgweDI1KSAKICAgICAgICAgICAgMHgwNyAtIDgweDI1CiAgICAgICAgKi8KCiAgICAgICAgc3dpdGNoIChBTF9yZWcoY29udGV4dCkpIHsKICAgICAgICAgICAgY2FzZSAweDAwOiAvKiA0MHgyNSAqLwogICAgICAgICAgICBjYXNlIDB4MDE6CiAgICAgICAgICAgICAgICBWR0FfRXhpdCgpOwogICAgICAgICAgICAgICAgVFJBQ0UoIlNldCBWaWRlbyBNb2RlIC0gU2V0IHRvIFRleHQgLSAweDAleFxuIiwKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICAgICBWR0FfU2V0QWxwaGFNb2RlKDQwLCAyNSk7CiAgICAgICAgICAgICAgICBkYXRhLT5WaWRlb0NvbHVtbnMgPSA0MDsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAweDAyOgogICAgICAgICAgICBjYXNlIDB4MDM6CiAgICAgICAgICAgIGNhc2UgMHgwNzoKICAgICAgICAgICAgICAgIFZHQV9FeGl0KCk7CiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0IFZpZGVvIE1vZGUgLSBTZXQgdG8gVGV4dCAtIDB4MCV4XG4iLAogICAgICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgICAgIFZHQV9TZXRBbHBoYU1vZGUoODAsIDI1KTsKICAgICAgICAgICAgICAgIGRhdGEtPlZpZGVvQ29sdW1ucyA9IDgwOwogICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgY2FzZSAweDBEOgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkdBIDMyMHgyMDAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICBWR0FfU2V0TW9kZSgzMjAsMjAwLDQpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgY2FzZSAweDBFOgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkdBIDY0MHgyMDAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsMjAwLDQpOyAKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSA2NDB4MzUwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDM1MCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgxMjoKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSA2NDB4NDgwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MTM6CiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWR0EgMzIweDIwMCAyNTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICBWR0FfU2V0TW9kZSgzMjAsMjAwLDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBGSVhNRSgiU2V0IFZpZGVvIE1vZGUgKDB4JXgpIC0gTm90IFN1cHBvcnRlZFxuIiwgCiAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICBkYXRhLT5WaWRlb01vZGUgPSBBTF9yZWcoY29udGV4dCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAxOiAvKiBTRVQgQ1VSU09SIFNIQVBFICovCiAgICAgICAgRklYTUUoIlNldCBDdXJzb3IgU2hhcGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKICAgIAogICAgY2FzZSAweDAyOiAvKiBTRVQgQ1VSU09SIFBPU0lUSU9OICovCiAgICAgICAgLyogQkggPSBQYWdlIE51bWJlciAqLyAvKiBOb3Qgc3VwcG9ydGVkICovCiAgICAgICAgLyogREggPSBSb3cgKi8gLyogMCBpcyBsZWZ0ICovCiAgICAgICAgLyogREwgPSBDb2x1bW4gKi8gLyogMCBpcyB0b3AgKi8KICAgICAgICBCSU9TX1NldEN1cnNvclBvcyhkYXRhLEJIX3JlZyhjb250ZXh0KSxETF9yZWcoY29udGV4dCksREhfcmVnKGNvbnRleHQpKTsKICAgICAgICBpZiAoQkhfcmVnKGNvbnRleHQpKQogICAgICAgIHsKICAgICAgICAgICBGSVhNRSgiU2V0IEN1cnNvciBQb3NpdGlvbjogQ2Fubm90IHNldCB0byBwYWdlICVkXG4iLAogICAgICAgICAgICAgIEJIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgVkdBX1NldEN1cnNvclBvcyhETF9yZWcoY29udGV4dCksIERIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgVFJBQ0UoIlNldCBDdXJzb3IgUG9zaXRpb246ICVkICVkXG4iLCBESF9yZWcoY29udGV4dCksIAogICAgICAgICAgICAgIERMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMzogLyogR0VUIENVUlNPUiBQT1NJVElPTiBBTkQgU0laRSAqLwogICAgICAgIHsKICAgICAgICAgIHVuc2lnbmVkIHJvdywgY29sOwoKICAgICAgICAgIFRSQUNFKCJHZXQgY3Vyc29yIHBvc2l0aW9uIGFuZCBzaXplIChwYWdlICVkKVxuIiwgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9IGRhdGEtPlZpZGVvQ3Vyc29yVHlwZTsKICAgICAgICAgIEJJT1NfR2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLCZjb2wsJnJvdyk7CiAgICAgICAgICBESF9yZWcoY29udGV4dCkgPSByb3c7CiAgICAgICAgICBETF9yZWcoY29udGV4dCkgPSBjb2w7CiAgICAgICAgICBUUkFDRSgiQ3Vyc29yIFBvc2l0aW9uOiAlZCAlZFxuIiwgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDQ6IC8qIFJFQUQgTElHSFQgUEVOIFBPU0lUSU9OICovCiAgICAgICAgRklYTUUoIlJlYWQgTGlnaHQgUGVuIFBvc2l0aW9uIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgQUhfcmVnKGNvbnRleHQpID0gMHgwMDsgLyogTm90IGRvd24gKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDU6IC8qIFNFTEVDVCBBQ1RJVkUgRElTUExBWSBQQUdFICovCiAgICAgICAgRklYTUUoIlNlbGVjdCBBY3RpdmUgRGlzcGxheSBQYWdlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgZGF0YS0+VmlkZW9DdXJQYWdlID0gQUxfcmVnKGNvbnRleHQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNjogLyogU0NST0xMIFVQIFdJTkRPVyAqLwogICAgICAgIC8qIEFMID0gTGluZXMgdG8gc2Nyb2xsICovCiAgICAgICAgLyogQkggPSBBdHRyaWJ1dGUgKi8KICAgICAgICAvKiBDSCxDTCA9IHJvdywgY29sIHVwcGVyLWxlZnQgKi8KICAgICAgICAvKiBESCxETCA9IHJvdywgY29sIGxvd2VyLXJpZ2h0ICovCiAgICAgICAgc2Nyb2xsX3dpbmRvdyhTQ1JPTExfVVAsIEFMX3JlZyhjb250ZXh0KSwgQ0hfcmVnKGNvbnRleHQpLCAKICAgICAgICAgICBDTF9yZWcoY29udGV4dCksIERIX3JlZyhjb250ZXh0KSwgRExfcmVnKGNvbnRleHQpLCAKICAgICAgICAgICBCSF9yZWcoY29udGV4dCkpOwogICAgICAgIFRSQUNFKCJTY3JvbGwgVXAgV2luZG93ICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNzogLyogU0NST0xMIERPV04gV0lORE9XICovCiAgICAgICAgLyogQUwgPSBMaW5lcyB0byBzY3JvbGwgKi8KICAgICAgICAvKiBCSCA9IEF0dHJpYnV0ZSAqLwogICAgICAgIC8qIENILENMID0gcm93LCBjb2wgdXBwZXItbGVmdCAqLwogICAgICAgIC8qIERILERMID0gcm93LCBjb2wgbG93ZXItcmlnaHQgKi8KICAgICAgICBzY3JvbGxfd2luZG93KFNDUk9MTF9ET1dOLCBBTF9yZWcoY29udGV4dCksIENIX3JlZyhjb250ZXh0KSwgCiAgICAgICAgICAgQ0xfcmVnKGNvbnRleHQpLCBESF9yZWcoY29udGV4dCksIERMX3JlZyhjb250ZXh0KSwgCiAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICBUUkFDRSgiU2Nyb2xsIERvd24gV2luZG93ICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwODogLyogUkVBRCBDSEFSQUNURVIgQU5EIEFUVFJJQlVURSBBVCBDVVJTT1IgUE9TSVRJT04gKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmIChCSF9yZWcoY29udGV4dCkpIC8qIFdyaXRlIHRvIGRpZmZlcmVudCBwYWdlICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJSZWFkIGNoYXJhY3RlciBhbmQgYXR0cmlidXRlIGF0IGN1cnNvciBwb3NpdGlvbiAtIgogICAgICAgICAgICAgICAgICAgICAgIiBDYW4ndCByZWFkIGZyb20gbm9uLTAgcGFnZVxuIik7CiAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAnICc7IC8qIFRoYXQgcGFnZSBpcyBibGFuayAqLwogICAgICAgICAgICAgICAgQUhfcmVnKGNvbnRleHQpID0gNzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlJlYWQgQ2hhcmFjdGVyIGFuZCBBdHRyaWJ1dGUgYXQgQ3Vyc29yIFBvc2l0aW9uXG4iKTsKICAgICAgICAgICAgICAgIFZHQV9HZXRDaGFyYWN0ZXJBdEN1cnNvcigmQUxfcmVnKGNvbnRleHQpLCAmQUhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDk6IC8qIFdSSVRFIENIQVJBQ1RFUiBBTkQgQVRUUklCVVRFIEFUIENVUlNPUiBQT1NJVElPTiAqLwogICAgY2FzZSAweDBhOiAvKiBXUklURSBDSEFSQUNURVIgT05MWSBBVCBDVVJTT1IgUE9TSVRJT04gKi8gCiAgICAgICAvKiBBTCA9IENoYXJhY3RlciB0byBkaXNwbGF5LiAqLwogICAgICAgLyogQkggPSBQYWdlIE51bWJlciAqLyAvKiBXZSBjYW4ndCB3cml0ZSB0byBub24tMCBwYWdlcywgeWV0LiAqLwogICAgICAgLyogQkwgPSBBdHRyaWJ1dGUgLyBDb2xvciAqLwogICAgICAgLyogQ1ggPSBUaW1lcyB0byBXcml0ZSBDaGFyICovCiAgICAgICAvKiBOb3RlIGhlcmUgdGhhdCB0aGUgY3Vyc29yIGlzIG5vdCBhZHZhbmNlZC4gKi8KICAgICAgIHsKICAgICAgICAgICB1bnNpZ25lZCByb3csIGNvbDsKCiAgICAgICAgICAgQklPU19HZXRDdXJzb3JQb3MoZGF0YSxCSF9yZWcoY29udGV4dCksJmNvbCwmcm93KTsKICAgICAgICAgICBWR0FfV3JpdGVDaGFycyhjb2wsIHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKEFIX3JlZyhjb250ZXh0KSA9PSAweDA5KSA/IEJMX3JlZyhjb250ZXh0KSA6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA+IDEpCiAgICAgICAgICAgICAgVFJBQ0UoIldyaXRlIENoYXJhY3RlciVzIGF0IEN1cnNvciBQb3NpdGlvbiAoUmVwLiAlZCk6ICVjXG4iLAogICAgICAgICAgICAgICAgICAgIChBSF9yZWcoY29udGV4dCkgPT0gMHgwOSkgPyAiIGFuZCBBdHRyaWJ1dGUiIDogIiIsCiAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBUUkFDRSgiV3JpdGUgQ2hhcmFjdGVyJXMgYXQgQ3Vyc29yIFBvc2l0aW9uOiAlY1xuIiwKICAgICAgICAgICAgICAgICAgICAoQUhfcmVnKGNvbnRleHQpID09IDB4MDkpID8gIiBhbmQgQXR0cmlidXRlIiA6ICIiLAogICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYjogCiAgICAgICAgc3dpdGNoIEJIX3JlZyhjb250ZXh0KSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBTRVQgQkFDS0dST1VORC9CT1JERVIgQ09MT1IgKi8KICAgICAgICAgICAgLyogSW4gdGV4dCBtb2RlcywgdGhpcyBzZXRzIG9ubHkgdGhlIGJvcmRlci4uLiAqLwogICAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIGludGVycnVwdCBsaXN0IGFuZCBvbmUgb2YgbXkgYm9va3MuICovCiAgICAgICAgICAgIC8qIEZ1bm55IHRob3VnaCB0aGF0IEJleW9uZCBab3JrIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgaXQgCiAgICAgICAgICAgICAgIGFsc28gc2V0cyB1cCB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMgZm9yIGNsZWFycwogICAgICAgICAgICAgICBhbmQgc2Nyb2xscy4uLiAqLwogICAgICAgICAgICAvKiBCZWFyIGluIG1pbmQgaGVyZSB0aGF0IHdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSwKICAgICAgICAgICAgICAgYXBwYXJhbnRseSwgdGhlIGZvcmVncm91bmQgb3IgYXR0cmlidXRlIG9mIHRoZSBiYWNrZ3JvdW5kCiAgICAgICAgICAgICAgIHdpdGggdGhpcyBjYWxsLCBzbyB3ZSBzaG91bGQgY2hlY2sgZmlyc3QgdG8gc2VlIHdoYXQgdGhlCiAgICAgICAgICAgICAgIGZvcmVncm91bmQgYWxyZWFkeSBpcy4uLiBGSVhNRSAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IEJhY2tncm91bmQvQm9yZGVyIENvbG9yOiAlZFxuIiwgCiAgICAgICAgICAgICAgIEJMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMTogLyogU0VUIFBBTEVUVEUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBQYWxldHRlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDBiIEJIID0gMHgleCAtIFVua25vd25cbiIsIAogICAgICAgICAgICAgICBCSF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDBjOiAvKiBXUklURSBHUkFQSElDUyBQSVhFTCAqLwogICAgICAgIC8qIE5vdCBpbiBncmFwaGljcyBtb2RlLCBjYW4gaWdub3JlIHcvbyBlcnJvciAqLwogICAgICAgIEZJWE1FKCJXcml0ZSBHcmFwaGljcyBQaXhlbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwogICAgICAgIAogICAgY2FzZSAweDBkOiAvKiBSRUFEIEdSQVBISUNTIFBJWEVMICovCiAgICAgICAgLyogTm90IGluIGdyYXBoaWNzIG1vZGUsIGNhbiBpZ25vcmUgdy9vIGVycm9yICovCiAgICAgICAgRklYTUUoIlJlYWQgR3JhcGhpY3MgUGl4ZWwgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKICAgICAgICAgICAgICAKICAgIGNhc2UgMHgwZTogLyogVEVMRVRZUEUgT1VUUFVUICovCiAgICAgICAgVFJBQ0UoIlRlbGV0eXBlIE91dHB1dFxuIik7CiAgICAgICAgRE9TVk1fUHV0Q2hhcihBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZjogLyogR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCJHZXQgY3VycmVudCB2aWRlbyBtb2RlXG4iKTsKICAgICAgICAvKiBOb3RlOiBUaGlzIHNob3VsZCBub3QgYmUgYSBjb25zdGFudCB2YWx1ZS4gKi8KICAgICAgICBBTF9yZWcoY29udGV4dCkgPSBkYXRhLT5WaWRlb01vZGU7CiAgICAgICAgQUhfcmVnKGNvbnRleHQpID0gZGF0YS0+VmlkZW9Db2x1bW5zOwogICAgICAgIEJIX3JlZyhjb250ZXh0KSA9IDA7IC8qIERpc3BsYXkgcGFnZSAwICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDEwOiAKICAgICAgICBzd2l0Y2ggQUxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBTSU5HTEUgUEFMRVRURSBSRUdJU1RFUiAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFNpbmdsZSBQYWxldHRlIFJlZ2lzdGVyIC0gTm90IHRlc3RlZFxuIik7CgkJLyogQkggaXMgdGhlIHZhbHVlICBCTCBpcyB0aGUgcmVnaXN0ZXIgKi8KCQlWR0FfU2V0Q29sb3IxNigoaW50KUJMX3JlZyhjb250ZXh0KSwoaW50KUJIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMTogLyogU0VUIEJPUkRFUiAoT1ZFUlNDQU4pICovCiAgICAgICAgICAgIC8qIFRleHQgdGVybWluYWxzIGhhdmUgbm8gb3ZlcnNjYW4gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBCb3JkZXIgKE92ZXJzY2FuKSAtIElnbm9yZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6IC8qIFNFVCBBTEwgUEFMRVRURSBSRUdJU1RFUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBhbGwgcGFsZXR0ZSByZWdpc3RlcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKCQkvKiBEWDpFUyBwb2ludHMgdG8gYSAxNyBieXRlIHRhYmxlIG9mIGNvbG9ycyAqLwoJCS8qIE5vIHJldHVybiBkYXRhIGxpc3RlZCAqLwoJCS8qIEknbGwgaGF2ZSB0byB1cGRhdGUgbXkgdGFibGUgYW5kIHRoZSBkZWZhdWx0IHBhbGV0dGUgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAzOiAvKiBUT0dHTEUgSU5URU5TSVRZL0JMSU5LSU5HIEJJVCAqLwogICAgICAgICAgICBGSVhNRSgiVG9nZ2xlIEludGVuc2l0eS9CbGlua2luZyBCaXQgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA3OiAvKiBHRVQgSU5ESVZJRFVBTCBQQUxFVFRFIFJFR0lTVEVSICovCiAgICAgICAgICAgIEZJWE1FKCJHZXQgSW5kaXZpZHVhbCBQYWxldHRlIFJlZ2lzdGVyIC0gTm90IFN1cHBvcnRlZFxuIik7CgkJLyogQkwgaXMgcmVnaXN0ZXIgdG8gcmVhZCBbIDAtMTUgXSBCSCBpcyByZXR1cm4gdmFsdWUgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA4OiAvKiBSRUFEIE9WRVJTQ0FOIChCT1JERVIgQ09MT1IpIFJFR0lTVEVSICovCiAgICAgICAgICAgIEZJWE1FKAogICAgICAgICAgICAgICAiUmVhZCBPdmVyc2NhbiAoQm9yZGVyIENvbG9yKSBSZWdpc3RlciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDk6IC8qIFJFQUQgQUxMIFBBTEVUVEUgUkVHSVNURVJTIEFORCBPVkVSU0NBTiBSRUdJU1RFUiAqLwogICAgICAgICAgICBGSVhNRSgKICAgICAgICAgICAgICAgIlJlYWQgQWxsIFBhbGV0dGUgUmVnaXN0ZXJzIGFuZCBPdmVyc2NhbiBSZWdpc3RlciAiCiAgICAgICAgICAgICAgICIgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEwOiAvKiBTRVQgSU5ESVZJRFVBTCBEQUMgUkVHSVNURVIgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBJbmRpdmlkdWFsIERBQyByZWdpc3RlciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTI6IC8qIFNFVCBCTE9DSyBPRiBEQUMgUkVHSVNURVJTICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgQmxvY2sgb2YgREFDIHJlZ2lzdGVycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTM6IC8qIFNFTEVDVCBWSURFTyBEQUMgQ09MT1IgUEFHRSAqLwogICAgICAgICAgICBGSVhNRSgiU2VsZWN0IHZpZGVvIERBQyBjb2xvciBwYWdlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxNTogLyogUkVBRCBJTkRJVklEVUFMIERBQyBSRUdJU1RFUiAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBpbmRpdmlkdWFsIERBQyByZWdpc3RlciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTc6IC8qIFJFQUQgQkxPQ0sgT0YgREFDIFJFR0lTVEVSUyAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBibG9jayBvZiBEQUMgcmVnaXN0ZXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxODogLyogU0VUIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgUEVMIG1hc2sgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDE5OiAvKiBSRUFEIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJSZWFkIFBFTCBtYXNrIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxYTogLyogR0VUIFZJREVPIERBQyBDT0xPUiBQQUdFIFNUQVRFICovCiAgICAgICAgICAgIEZJWE1FKCJHZXQgdmlkZW8gREFDIGNvbG9yIHBhZ2Ugc3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDFiOiAvKiBQRVJGT1JNIEdSQVktU0NBTEUgU1VNTUlORyAqLwogICAgICAgICAgICBGSVhNRSgiUGVyZm9ybSBHcmF5LXNjYWxlIHN1bW1pbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MTAgQUwgPSAweCV4IC0gVW5rbm93blxuIiwgCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTE6IC8qIFRFWFQgTU9ERSBDSEFSR0VOICovCiAgICAgICAgLyogTm90ZSB0aGF0IHNlY29uZCBzdWJmdW5jdGlvbiBpcyAqYWxtb3N0KiBpZGVudGljYWwuICovCiAgICAgICAgLyogU2VlIElOVEVSUlVQVC5BIGZvciBkZXRhaWxzLiAqLwogICAgICAgIHN3aXRjaCBBTF9yZWcoY29udGV4dCkgewogICAgICAgIGNhc2UgMHgwMDogLyogTE9BRCBVU0VSIFNQRUNJRklFRCBQQVRURVJOUyAqLwogICAgICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgRklYTUUoIkxvYWQgVXNlciBTcGVjaWZpZWQgUGF0dGVybnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBMT0FEIFJPTSBNT05PQ0hST01FIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDExOgogICAgICAgICAgICBGSVhNRSgiTG9hZCBST00gTW9ub2Nocm9tZSBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6IC8qIExPQUQgUk9NIDh4OCBET1VCTEUtRE9UIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDEyOgogICAgICAgICAgICBGSVhNRSgKICAgICAgICAgICAgICAgICJMb2FkIFJPTSA4eDggRG91YmxlIERvdCBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOyAgICAgICAKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAzOiAvKiBTRVQgQkxPQ0sgU1BFQ0lGSUVSICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgQmxvY2sgU3BlY2lmaWVyIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwNDogLyogTE9BRCBST00gOHgxNiBDSEFSQUNURVIgU0VUICovCiAgICAgICAgY2FzZSAweDE0OgogICAgICAgICAgICBGSVhNRSgiTG9hZCBST00gOHgxNiBDaGFyYWN0ZXIgU2V0IC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMDogLyogU0VUIFVTRVIgOHgxNiBHUkFQSElDUyBDSEFSUyAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFVzZXIgOHgxNiBHcmFwaGljcyBDaGFycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjE6IC8qIFNFVCBVU0VSIEdSQVBJQ1MgQ0hBUkFDVEVSUyAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFVzZXIgR3JhcGhpY3MgQ2hhcmFjdGVycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjI6IC8qIFNFVCBST00gOHgxNCBHUkFQSElDUyBDSEFSUyAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFJPTSA4eDE0IEdyYXBoaWNzIENoYXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMzogLyogU0VUIFJPTSA4eDggREJMIERPVCBDSEFSUyAqLwogICAgICAgICAgICBGSVhNRSgKICAgICAgICAgICAgICAgICJTZXQgUk9NIDh4OCBEYmwgRG90IENoYXJzIChHcmFwaGljcykgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI0OiAvKiBMT0FEIDh4MTYgR1JBUEhJQyBDSEFSUyAqLwogICAgICAgICAgICBGSVhNRSgiTG9hZCA4eDE2IEdyYXBoaWMgQ2hhcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMwOiAvKiBHRVQgRk9OVCBJTkZPUk1BVElPTiAqLwogICAgICAgICAgICBGSVhNRSgiR2V0IEZvbnQgSW5mb3JtYXRpb24gLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MTEgQUwgPSAweCV4IC0gVW5rbm93blxuIiwgCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgICAKICAgIGNhc2UgMHgxMjogLyogQUxURVJOQVRFIEZVTkNUSU9OIFNFTEVDVCAqLwogICAgICAgIHN3aXRjaCBCTF9yZWcoY29udGV4dCkgewogICAgICAgIGNhc2UgMHgxMDogLyogR0VUIEVHQSBJTkZPICovCiAgICAgICAgICAgIFRSQUNFKCJFR0EgaW5mbyByZXF1ZXN0ZWRcbiIpOwogICAgICAgICAgICBCSF9yZWcoY29udGV4dCkgPSAweDAwOyAgIC8qIENvbG9yIHNjcmVlbiAqLwogICAgICAgICAgICBCTF9yZWcoY29udGV4dCkgPQogICAgICAgICAgICAgICAgZGF0YS0+TW9kZU9wdGlvbnMgPj4gNTsgLyogRUdBIG1lbW9yeSBzaXplICovCiAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9CiAgICAgICAgICAgICAgICBkYXRhLT5GZWF0dXJlQml0c1N3aXRjaGVzOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjA6IC8qIEFMVEVSTkFURSBQUlRTQyAqLwogICAgICAgICAgICBGSVhNRSgiSW5zdGFsbCBBbHRlcm5hdGUgUHJpbnQgU2NyZWVuIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMDogLyogU0VMRUNUIFZFUlRJQ0FMIFJFU09VTFRJT04gKi8KICAgICAgICAgICAgRklYTUUoIlNlbGVjdCB2ZXJ0aWNhbCByZXNvbHV0aW9uIC0gbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMTogLyogRU5BQkxFL0RJU0FCTEUgREVGQVVMVCBQQUxFVFRFIExPQURJTkcgKi8KICAgICAgICAgICAgRklYTUUoIkRlZmF1bHQgcGFsZXR0ZSBsb2FkaW5nIC0gbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGRhdGEtPlZHQVNldHRpbmdzID0KICAgICAgICAgICAgICAgIChkYXRhLT5WR0FTZXR0aW5ncyAmIDB4ZjcpIHwKICAgICAgICAgICAgICAgICgoQUxfcmVnKGNvbnRleHQpID09IDEpIDw8IDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzI6IC8qIEVOQUJMRS9ESVNBQkxFIFZJREVPIEFERFJFUlNTSU5HICovCiAgICAgICAgICAgIEZJWE1FKCJWaWRlbyBBZGRyZXNzaW5nIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMzogLyogRU5BQkxFL0RJU0FCTEUgR1JBWSBTQ0FMRSBTVU1NSU5HICovCiAgICAgICAgICAgIEZJWE1FKCJHcmF5IFNjYWxlIFN1bW1pbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDM0OiAvKiBFTkFCTEUvRElTQUJMRSBDVVJTT1IgRU1VTEFUSU9OICovCiAgICAgICAgICAgIFRSQUNFKCJTZXQgY3Vyc29yIGVtdWxhdGlvbiB0byAlZFxuIiwgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgZGF0YS0+TW9kZU9wdGlvbnMgPQogICAgICAgICAgICAgICAgKGRhdGEtPk1vZGVPcHRpb25zICYgMHhmZSl8KEFMX3JlZyhjb250ZXh0KSA9PSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDM2OiAvKiBWSURFTyBBRERSRVNTIENPTlRST0wgKi8KICAgICAgICAgICAgRklYTUUoIlZpZGVvIEFkZHJlc3MgQ29udHJvbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiSU5UIDEwIEFIID0gMHgxMSBBTCA9IDB4JXggLSBVbmtub3duXG4iLCAKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMzogLyogV1JJVEUgU1RSSU5HICovCiAgICAgICAgLyogVGhpcyBvbmUgZG9lcyBub3QgaW1wbHkgdGhhdCBzdHJpbmcgYmUgYXQgY3Vyc29yLiAqLwogICAgICAgIEZJWE1FKCJXcml0ZSBTdHJpbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGNhc2UgMHgxYTogCiAgICAgICAgc3dpdGNoIEFMX3JlZyhjb250ZXh0KSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBHRVQgRElTUExBWSBDT01CSU5BVElPTiBDT0RFICovCiAgICAgICAgICAgIFRSQUNFKCJHZXQgRGlzcGxheSBDb21iaW5hdGlvbiBDb2RlXG4iKTsKICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDFhOwogICAgICAgICAgICBCTF9yZWcoY29udGV4dCkgPSAweDA4OyAvKiBWR0Egdy8gY29sb3IgYW5hbG9nIGRpc3BsYXkgKi8KICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpID0gMHgwMDsgLyogTm8gc2Vjb25kYXJ5IGhhcmR3YXJlICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMTogLyogU0VUIERJU1BMQVkgQ09NQklOQVRJT04gQ09ERSAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IERpc3BsYXkgQ29tYmluYXRpb24gQ29kZSAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiSU5UIDEwIEFIID0gMHgxYSBBTCA9IDB4JXggLSBVbmtub3duXG4iLCAKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgYnJlYWs7CgogICAgY2FzZSAweDFiOiAvKiBGVU5DVElPTkFMSVRZL1NUQVRFIElORk9STUFUSU9OICovCiAgICAgICAgRklYTUUoIkdldCBmdW5jdGlvbmFsaXR5L3N0YXRlIGluZm9ybWF0aW9uIC0gcGFydGlhbGx5IGltcGxlbWVudGVkXG4iKTsKICAgICAgICBpZiAoQlhfcmVnKGNvbnRleHQpID09IDB4MCkKICAgICAgICB7CiAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAweDFiOwogICAgICAgICAgaWYgKElTVjg2KGNvbnRleHQpKSAvKiByZWFsICovCiAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzID0gMHhmMDAwOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBjb250ZXh0LT5TZWdFcyA9IERPU01FTV9CaW9zU3lzU2VnOwogICAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMHhlMDAwOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MWM6IC8qIFNBVkUvUkVTVE9SRSBWSURFTyBTVEFURSAqLwogICAgICAgIEZJWE1FKCJTYXZlL1Jlc3RvcmUgVmlkZW8gU3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4NGY6IC8qIEdldCBTdXBlclZHQSBJTkZPUk1BVElPTiAqLwogICAgICAgIHsKICAgICAgICAgIEJZVEUgKnAgPQogICAgICAgICAgICAgICBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgY29udGV4dC0+U2VnRXMsIGNvbnRleHQtPkVkaSk7CiAgICAgICAgICAvKiBCT09MMTYgdmVzYTIwID0gKCooRFdPUkQgKilwID09ICooRFdPUkQgKikiVkJFMiIpOyAqLwogIAogICAgICAgICAgVFJBQ0UoIkdldCBTdXBlclZHQSBpbmZvcm1hdGlvblxuIik7CiAgICAgICAgICBBSF9yZWcoY29udGV4dCkgPSAwOwogICAgICAgICAgKihEV09SRCAqKXAgPSAqKERXT1JEICopIlZFU0EiOwogICAgICAgICAgKihXT1JEICopKHArMHgwNCkgPSAweDAyMDA7IC8qIFZFU0EgMi4wICovCiAgICAgICAgICAqKERXT1JEICopKHArMHgwNikgPSAweDAwMDAwMDAwOyAvKiBwb2ludGVyIHRvIE9FTSBuYW1lICovCiAgICAgICAgICAqKERXT1JEICopKHArMHgwYSkgPSAweGZmZmZmZmZkOyAvKiBjYXBhYmlsaXRpZXMgZmxhZ3MgOi0pICovCiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhlZjogIC8qIGdldCB2aWRlbyBtb2RlIGZvciBoZXJjdWxlcy1jb21wYXRpYmxlcyAgICovCiAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUncyBubyByZWFzb24gdG8gcmVhbGx5IHN1cHBvcnQgdGhpcyAgKi8KICAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGVyZT8uLi4uLi4uLi4uLi4uLi4uLi4uLihBLkMuKSAgICAgICAqLwogICAgICAgICAgICAgICAgVFJBQ0UoIkp1c3QgcmVwb3J0IHRoZSB2aWRlbyBub3QgaGVyY3VsZXMgY29tcGF0aWJsZVxuIik7CiAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgPSAweGZmZmY7CiAgICAgICAgICAgICAgICBicmVhazsgCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIC0gMHgleFxuIiwgQUhfcmVnKGNvbnRleHQpKTsKICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgxMCApOwogICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBzY3JvbGxfd2luZG93KGludCBkaXJlY3Rpb24sIGNoYXIgbGluZXMsIGNoYXIgcm93MSwgCiAgIGNoYXIgY29sMSwgY2hhciByb3cyLCBjaGFyIGNvbDIsIGNoYXIgYXR0cmlidXRlKQp7CiAgIGlmICghbGluZXMpIC8qIEFjdHVhbGx5LCBjbGVhciB0aGUgd2luZG93ICovCiAgIHsKICAgICAgIFZHQV9DbGVhclRleHQocm93MSwgY29sMSwgcm93MiwgY29sMiwgYXR0cmlidXRlKTsKICAgfQogICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gU0NST0xMX1VQKQogICB7CiAgICAgICBWR0FfU2Nyb2xsVXBUZXh0KHJvdzEsIGNvbDEsIHJvdzIsIGNvbDIsIGxpbmVzLCBhdHRyaWJ1dGUpOwogICB9CiAgIGVsc2UKICAgewogICAgICAgVkdBX1Njcm9sbERvd25UZXh0KHJvdzEsIGNvbDEsIHJvdzIsIGNvbDIsIGxpbmVzLCBhdHRyaWJ1dGUpOwogICB9Cn0KICAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIERPU1ZNX1B1dENoYXIKICoKICovCgp2b2lkIFdJTkFQSSBET1NWTV9QdXRDaGFyKEJZVEUgYXNjaWkpCnsKICBCSU9TREFUQSAqZGF0YSA9IERPU01FTV9CaW9zRGF0YSgpOwogIHVuc2lnbmVkICB4cG9zLCB5cG9zOwoKICBUUkFDRSgiY2hhcjogMHglMDJ4XG4iLCBhc2NpaSk7CgogIFZHQV9QdXRDaGFyKGFzY2lpKTsKICBWR0FfR2V0Q3Vyc29yUG9zKCZ4cG9zLCAmeXBvcyk7CiAgQklPU19TZXRDdXJzb3JQb3MoZGF0YSwgMCwgeHBvcywgeXBvcyk7Cn0K