LyoKICogRGlyZWN0M0Qgc3RhdGUgbWFuYWdlbWVudAogKgogKiBDb3B5cmlnaHQgMjAwMiBMaW9uZWwgVWxtZXIKICogQ29weXJpZ2h0IDIwMDItMjAwNSBKYXNvbiBFZG1lYWRlcwogKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJhcGhhZWwgSnVucXVlaXJhCiAqIENvcHlyaWdodCAyMDA0IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKiBDb3B5cmlnaHQgMjAwNiBIZW5yaSBWZXJiZWV0CiAqIENvcHlyaWdodCAyMDA2LTIwMDcgU3RlZmFuIET2c2luZ2VyIGZvciBDb2RlV2VhdmVycwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9GTE9BVF9ICiMgaW5jbHVkZSA8ZmxvYXQuaD4KI2VuZGlmCiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGQzZF9zaGFkZXIpOwoKI2RlZmluZSBHTElORk9fTE9DQVRJT04gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+YWRhcHRlci0+Z2xfaW5mbwoKc3RhdGljIHZvaWQgc3RhdGVfbm9nbChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFVzZWQgZm9yIHN0YXRlcyB3aGljaCBhcmUgbm90IG1hcHBlZCB0byBhIGdsIHN0YXRlIGFzLWlzLCBidXQgdXNlZCBzb21laG93IGRpZmZlcmVudCwKICAgICAqIGUuZyBhcyBhIHBhcmFtZXRlciBmb3IgZHJhd2luZywgb3Igd2hpY2ggYXJlIHVuaW1wbGVtZW50ZWQgaW4gd2luZG93cyBkM2QKICAgICAqLwogICAgaWYoU1RBVEVfSVNfUkVOREVSKHN0YXRlKSkgewogICAgICAgIFdJTkVEM0RSRU5ERVJTVEFURVRZUEUgUmVuZGVyU3RhdGUgPSBzdGF0ZSAtIFNUQVRFX1JFTkRFUigwKTsKICAgICAgICBUUkFDRSgiKCVzLCVkKSBubyBkaXJlY3QgbWFwcGluZyB0byBnbFxuIiwgZGVidWdfZDNkcmVuZGVyc3RhdGUoUmVuZGVyU3RhdGUpLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtSZW5kZXJTdGF0ZV0pOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBTaG91bGRuJ3QgaGF2ZSBhbiB1bmtub3duIHR5cGUgaGVyZSAqLwogICAgICAgIEZJWE1FKCIlZCBubyBkaXJlY3QgbWFwcGluZyB0byBnbCBvZiBzdGF0ZSB3aXRoIHVua25vd24gdHlwZVxuIiwgc3RhdGUpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV91bmRlZmluZWQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBQcmludCBhIFdBUk4sIHRoaXMgYWxsb3dzIHRoZSBzdGF0ZWJsb2NrIGNvZGUgdG8gbG9vcCBvdmVyIGFsbCBzdGF0ZXMgdG8gZ2VuZXJhdGUgYSBkaXNwbGF5CiAgICAgKiBsaXN0IHdpdGhvdXQgY2F1c2luZyBjb25mdXNpbmcgdGVybWluYWwgb3V0cHV0LiBEZWxpYmVyYXRlbHkgbm8gc3BlY2lhbCBkZWJ1ZyBuYW1lIGhlcmUKICAgICAqIGJlY2F1c2UgaXRzIHVuZGVmaW5lZC4KICAgICAqLwogICAgV0FSTigidW5kZWZpbmVkIHN0YXRlICVkXG4iLCBzdGF0ZSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2ZpbGxtb2RlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgV0lORUQzREZJTExNT0RFIFZhbHVlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZJTExNT0RFXTsKCiAgICBzd2l0Y2goVmFsdWUpIHsKICAgICAgICBjYXNlIFdJTkVEM0RGSUxMX1BPSU5UOgogICAgICAgICAgICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9QT0lOVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9QT0lOVCkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNERklMTF9XSVJFRlJBTUU6CiAgICAgICAgICAgIGdsUG9seWdvbk1vZGUoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0xJTkUpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSywgR0xfTElORSkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNERklMTF9TT0xJRDoKICAgICAgICAgICAgZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSywgR0xfRklMTCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9GSUxMKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIFdJTkVEM0RSU19GSUxMTU9ERSB2YWx1ZSAlZFxuIiwgVmFsdWUpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9saWdodGluZyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIEJPT0wgdHJhbnNmb3JtZWQ7CgogICAgLyogTGlnaHRpbmcgaXMgbm90IGVuYWJsZWQgaWYgdHJhbnNmb3JtZWQgdmVydGljZXMgYXJlIGRyYXduCiAgICAgKiBidXQgbGlnaHRpbmcgZG9lcyBub3QgYWZmZWN0IHRoZSBzdHJlYW0gc291cmNlcywgc28gaXQgaXMgbm90IGdyb3VwZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgKiBUaGlzIHN0YXRlIHJlYWRzIHRoZSBkZWNvZGVkIHZlcnRleCBkZWNsLCBzbyBpZiBpdCBpcyBkaXJ0eSBkb24ndCBkbyBhbnl0aGluZy4gVGhlCiAgICAgKiB2ZXJ0ZXggZGVjbGFyYXRpb24gYXBwcGx5aW5nIGZ1bmN0aW9uIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIHVwZGF0aW5nCiAgICAgKi8KCiAgICBpZihpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyYW5zZm9ybWVkID0gKChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnBvc2l0aW9uLmxwRGF0YSAhPSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5wb3NpdGlvbi5WQk8gIT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnBvc2l0aW9uX3RyYW5zZm9ybWVkKSA/IFRSVUUgOiBGQUxTRTsKCiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0xJR0hUSU5HXSAmJiAhdHJhbnNmb3JtZWQpIHsKICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0xJR0hUSU5HIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9MSUdIVElORyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV96ZW5hYmxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyogTm8geiB0ZXN0IHdpdGhvdXQgZGVwdGggc3RlbmNpbCBidWZmZXJzICovCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdGVuY2lsQnVmZmVyVGFyZ2V0ID09IE5VTEwpIHsKICAgICAgICBUUkFDRSgiTm8gWiBidWZmZXIgLSBkaXNhYmxpbmcgZGVwdGggdGVzdFxuIik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOyAvKiBUaGlzIGFsc28gZGlzYWJsZXMgeiB3cml0aW5nIGluIGdsICovCiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9ERVBUSF9URVNUIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN3aXRjaCAoKFdJTkVEM0RaQlVGRkVSVFlQRSkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1pFTkFCTEVdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEWkJfRkFMU0U6CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9ERVBUSF9URVNUIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFpCX1RSVUU6CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfREVQVEhfVEVTVCIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RaQl9VU0VXOgogICAgICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0RFUFRIX1RFU1QiKTsKICAgICAgICAgICAgRklYTUUoIlcgYnVmZmVyIGlzIG5vdCB3ZWxsIGhhbmRsZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIEQzRFpCVUZGRVJUWVBFIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfWkVOQUJMRV0pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9jdWxsbW9kZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIGdsRnJvbnRGYWNlKCkgaXMgc2V0IGluIGNvbnRleHQuYyBhdCBjb250ZXh0IGluaXQgYW5kIG9uIGFuIG9mZnNjcmVlbiAvIG9uc2NyZWVuIHJlbmRlcmluZwogICAgICogc3dpdGNoCiAgICAgKi8KICAgIHN3aXRjaCAoKFdJTkVEM0RDVUxMKSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ1VMTE1PREVdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQ1VMTF9OT05FOgogICAgICAgICAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9DVUxMX0ZBQ0UiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQ1VMTF9DVzoKICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0NVTExfRkFDRSIpOwogICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQ3VsbEZhY2UoR0xfRlJPTlQpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRENVTExfQ0NXOgogICAgICAgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfQ1VMTF9GQUNFIik7CiAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEN1bGxGYWNlKEdMX0JBQ0spIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQvVW5oYW5kbGVkIFdJTkVEM0RDVUxMIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ1VMTE1PREVdKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc2hhZGVtb2RlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgc3dpdGNoICgoV0lORUQzRFNIQURFTU9ERSkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NIQURFTU9ERV0pIHsKICAgICAgICBjYXNlIFdJTkVEM0RTSEFERV9GTEFUOgogICAgICAgICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFNoYWRlTW9kZWwoR0xfRkxBVCkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEU0hBREVfR09VUkFVRDoKICAgICAgICAgICAgZ2xTaGFkZU1vZGVsKEdMX1NNT09USCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFNoYWRlTW9kZWwoR0xfU01PT1RIKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RTSEFERV9QSE9ORzoKICAgICAgICAgICAgRklYTUUoIldJTkVEM0RTSEFERV9QSE9ORyBpc24ndCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkL1VuaGFuZGxlZCBXSU5FRDNEU0hBREVNT0RFIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0hBREVNT0RFXSk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2RpdGhlcmVuYWJsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRElUSEVSRU5BQkxFXSkgewogICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0RJVEhFUiIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0RJVEhFUiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV96d3JpdGVuYWJsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFRPRE86IFRlc3QgaWYgaW4gZDNkIHogd3JpdGluZyBpcyBlbmFibGVkIGV2ZW4gaWYgWkVOQUJMRSBpcyBvZmYuIElmIHllcywKICAgICAqIHRoaXMgaGFzIHRvIGJlIG1lcmdlZCB3aXRoIFpFTkFCTEUgYW5kIFpGVU5DCiAgICAgKi8KICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfWldSSVRFRU5BQkxFXSkgewogICAgICAgIGdsRGVwdGhNYXNrKDEpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERlcHRoTWFzaygxKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERlcHRoTWFzaygwKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEZXB0aE1hc2soMCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfemZ1bmMoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpbnQgZ2xQYXJtID0gQ29tcGFyZUZ1bmMoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1pGVU5DXSk7CgogICAgaWYoZ2xQYXJtKSB7CiAgICAgICAgaWYoZ2xQYXJtID09IEdMX0VRVUFMIHx8IGdsUGFybSA9PSBHTF9OT1RFUVVBTCkgewogICAgICAgICAgICBzdGF0aWMgQk9PTCBvbmNlID0gRkFMU0U7CiAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBpc3N1ZXMgd2l0aCB0aGlzOiBGaXJzdCwgb3VyIGluYWJpbGl0eSB0bwogICAgICAgICAgICAgKiBzZWxlY3QgYSBwcm9wZXIgWiBkZXB0aCwgbW9zdCBvZiB0aGUgdGltZSB3ZSdyZSBzdHVjayB3aXRoCiAgICAgICAgICAgICAqIEQyNFM4LCBldmVuIGlmIHRoZSBhcHAgc2VsZWN0cyBEMzIgb3IgRDE2LiBUaGVyZSBzZWVtIHRvIGJlCiAgICAgICAgICAgICAqIHNvbWUgb3RoZXIgcHJlY2lzaW9uIHByb2JsZW1zIHdoaWNoIGhhdmUgdG8gYmUgZGVidWdnZWQgdG8KICAgICAgICAgICAgICogbWFrZSBOT1RFUVVBTCBhbmQgRVFVQUwgd29yayBwcm9wZXJseQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoIW9uY2UpIHsKICAgICAgICAgICAgICAgIG9uY2UgPSBUUlVFOwogICAgICAgICAgICAgICAgRklYTUUoIkQzRENNUF9OT1RFUVVBTCBhbmQgRDNEQ01QX0VRVUFMIGRvIG5vdCB3b3JrIGNvcnJlY3RseSB5ZXRcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBnbERlcHRoRnVuYyhnbFBhcm0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERlcHRoRnVuYyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9hbWJpZW50KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZmxvYXQgY29sWzRdOwogICAgRDNEQ09MT1JUT0dMRkxPQVQ0KHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTUJJRU5UXSwgY29sKTsKCiAgICBUUkFDRSgiU2V0dGluZyBhbWJpZW50IHRvICglZiwlZiwlZiwlZilcbiIsIGNvbFswXSwgY29sWzFdLCBjb2xbMl0sIGNvbFszXSk7CiAgICBnbExpZ2h0TW9kZWxmdihHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBjb2wpOwogICAgY2hlY2tHTGNhbGwoImdsTGlnaHRNb2RlbCBmb3IgTU9ERUxfQU1CSUVOVCIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ibGVuZChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGludCBzcmNCbGVuZCA9IEdMX1pFUk87CiAgICBpbnQgZHN0QmxlbmQgPSBHTF9aRVJPOwogICAgY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpydEZvcm1hdDsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnRhcmdldCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl90YXJnZXRzWzBdOwoKICAgIC8qIEdMX0xJTkVfU01PT1RIIG5lZWRzIEdMX0JMRU5EIHRvIHdvcmssIGFjY29yZGluZyB0byB0aGUgcmVkIGJvb2ssIGFuZCBzcGVjaWFsIGJsZW5kaW5nIHBhcmFtcyAqLwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFXSAgICAgIHx8CiAgICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0VER0VBTlRJQUxJQVNdICAgICAgICAgfHwKICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFXSkgewogICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfQkxFTkQiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0JMRU5EIik7CiAgICAgICAgLyogTm90aGluZyBtb3JlIHRvIGRvIC0gZ2V0IG91dCAqLwogICAgICAgIHJldHVybjsKICAgIH07CgogICAgc3dpdGNoIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfREVTVEJMRU5EXSkgewogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1pFUk8gICAgICAgICAgICAgICA6IGRzdEJsZW5kID0gR0xfWkVSTzsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX09ORSAgICAgICAgICAgICAgICA6IGRzdEJsZW5kID0gR0xfT05FOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQ09MT1IgICAgICAgICAgIDogZHN0QmxlbmQgPSBHTF9TUkNfQ09MT1I7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZTUkNDT0xPUiAgICAgICAgOiBkc3RCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNBTFBIQSAgICAgICAgICAgOiBkc3RCbGVuZCA9IEdMX1NSQ19BTFBIQTsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVlNSQ0FMUEhBICAgICAgICA6IGRzdEJsZW5kID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0RFU1RDT0xPUiAgICAgICAgICA6IGRzdEJsZW5kID0gR0xfRFNUX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WREVTVENPTE9SICAgICAgIDogZHN0QmxlbmQgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOyAgYnJlYWs7CgogICAgICAgIC8qIFRvIGNvbXBlbnNhdGUgdGhlIGxhY2sgb2YgZm9ybWF0IHN3aXRjaGluZyB3aXRoIGJhY2tidWZmZXIgb2Zmc2NyZWVuIHJlbmRlcmluZywKICAgICAgICAgKiBhbmQgd2l0aCBvbnNjcmVlbiByZW5kZXJpbmcsIHdlIG1vZGlmeSB0aGUgYWxwaGEgdGVzdCBwYXJhbWV0ZXJzIGZvciAoSU5WKURFU1RBTFBIQQogICAgICAgICAqIGlmIHRoZSByZW5kZXIgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBhbHBoYSBibGVuZGluZy4gQSBub25leGlzdGVudCBhbHBoYSBjaGFubmVsCiAgICAgICAgICogcmV0dXJucyAxLjAsIHNvIEQzREJMRU5EX0RFU1RBTFBIQSBpcyBHTF9PTkUsIGFuZCBEM0RCTEVORF9JTlZERVNUQUxQSEEgaXMgR0xfWkVSTwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0RFU1RBTFBIQSAgICAgICAgICA6CiAgICAgICAgICAgIHJ0Rm9ybWF0ID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KHRhcmdldC0+cmVzb3VyY2UuZm9ybWF0LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgZHN0QmxlbmQgPSBydEZvcm1hdC0+YWxwaGFNYXNrID8gR0xfRFNUX0FMUEhBIDogR0xfT05FOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZERVNUQUxQSEEgICAgICAgOgogICAgICAgICAgICBydEZvcm1hdCA9IGdldEZvcm1hdERlc2NFbnRyeSh0YXJnZXQtPnJlc291cmNlLmZvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIGRzdEJsZW5kID0gcnRGb3JtYXQtPmFscGhhTWFzayA/IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgOiBHTF9aRVJPOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQUxQSEFTQVQgICAgICAgIDoKICAgICAgICAgICAgZHN0QmxlbmQgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CiAgICAgICAgICAgIFdBUk4oIkFwcGxpY2F0aW9uIHVzZXMgU1JDQUxQSEFTQVQgYXMgZGVzdCBibGVuZCBmYWN0b3IsIGV4cGVjdCBwcm9ibGVtc1xuIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKiBXSU5FRDNEQkxFTkRfQk9USFNSQ0FMUEhBIGFuZCBXSU5FRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBIGFyZSBsZWdhY3kgc291cmNlIGJsZW5kaW5nCiAgICAgICAgICogdmFsdWVzIHdoaWNoIGFyZSBzdGlsbCB2YWxpZCB1cCB0byBkM2Q5LiBUaGV5IHNob3VsZCBub3Qgb2NjdXIgYXMgZGVzdCBibGVuZCB2YWx1ZXMKICAgICAgICAgKi8KICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CT1RIU1JDQUxQSEEgICAgICAgOiBkc3RCbGVuZCA9IEdMX1NSQ19BTFBIQTsKICAgICAgICAgICAgc3JjQmxlbmQgPSBHTF9TUkNfQUxQSEE7CiAgICAgICAgICAgIEZJWE1FKCJXSU5FRDNEUlNfREVTVEJMRU5EID0gV0lORUQzREJMRU5EX0JPVEhTUkNBTFBIQSwgd2hhdCB0byBkbz9cbiIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBICAgIDogZHN0QmxlbmQgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOwogICAgICAgICAgICBzcmNCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgICAgIEZJWE1FKCJXSU5FRDNEUlNfREVTVEJMRU5EID0gV0lORUQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQSwgd2hhdCB0byBkbz9cbiIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfQkxFTkRGQUNUT1IgICAgICAgIDogZHN0QmxlbmQgPSBHTF9DT05TVEFOVF9DT0xPUjsgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZCTEVOREZBQ1RPUiAgICAgOiBkc3RCbGVuZCA9IEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUjsgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgZHN0IGJsZW5kIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfREVTVEJMRU5EXSk7CiAgICB9CgogICAgc3dpdGNoIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1JDQkxFTkRdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfWkVSTyAgICAgICAgICAgICAgIDogc3JjQmxlbmQgPSBHTF9aRVJPOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfT05FICAgICAgICAgICAgICAgIDogc3JjQmxlbmQgPSBHTF9PTkU7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNDT0xPUiAgICAgICAgICAgOiBzcmNCbGVuZCA9IEdMX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVlNSQ0NPTE9SICAgICAgICA6IHNyY0JsZW5kID0gR0xfT05FX01JTlVTX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1NSQ0FMUEhBICAgICAgICAgICA6IHNyY0JsZW5kID0gR0xfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WU1JDQUxQSEEgICAgICAgIDogc3JjQmxlbmQgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfREVTVENPTE9SICAgICAgICAgIDogc3JjQmxlbmQgPSBHTF9EU1RfQ09MT1I7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZERVNUQ09MT1IgICAgICAgOiBzcmNCbGVuZCA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNBTFBIQVNBVCAgICAgICAgOiBzcmNCbGVuZCA9IEdMX1NSQ19BTFBIQV9TQVRVUkFURTsgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9ERVNUQUxQSEEgICAgICAgICAgOgogICAgICAgICAgICBydEZvcm1hdCA9IGdldEZvcm1hdERlc2NFbnRyeSh0YXJnZXQtPnJlc291cmNlLmZvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIHNyY0JsZW5kID0gcnRGb3JtYXQtPmFscGhhTWFzayA/IEdMX0RTVF9BTFBIQSA6IEdMX09ORTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WREVTVEFMUEhBICAgICAgIDoKICAgICAgICAgICAgcnRGb3JtYXQgPSBnZXRGb3JtYXREZXNjRW50cnkodGFyZ2V0LT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBzcmNCbGVuZCA9IHJ0Rm9ybWF0LT5hbHBoYU1hc2sgPyBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBIDogR0xfWkVSTzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0JPVEhTUkNBTFBIQSAgICAgICA6IHNyY0JsZW5kID0gR0xfU1JDX0FMUEhBOwogICAgICAgICAgICBkc3RCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEgICAgOiBzcmNCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgICAgIGRzdEJsZW5kID0gR0xfU1JDX0FMUEhBOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfQkxFTkRGQUNUT1IgICAgICAgIDogc3JjQmxlbmQgPSBHTF9DT05TVEFOVF9DT0xPUjsgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZCTEVOREZBQ1RPUiAgICAgOiBzcmNCbGVuZCA9IEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUjsgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgc3JjIGJsZW5kIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1JDQkxFTkRdKTsKICAgIH0KCgogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0VER0VBTlRJQUxJQVNdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFXSkgewogICAgICAgIGdsRW5hYmxlKEdMX0xJTkVfU01PT1RIKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfTElORV9TTU9PVEgpIik7CiAgICAgICAgaWYoc3JjQmxlbmQgIT0gR0xfU1JDX0FMUEhBKSB7CiAgICAgICAgICAgIFdBUk4oIldJTkVEM0RSU19FREdFQU5USUFMSUFTIGVuYWJsZWQsIGJ1dCB1bmV4cGVjdGVkIHNyYyBibGVuZGluZyBwYXJhbVxuIik7CiAgICAgICAgfQogICAgICAgIGlmKGRzdEJsZW5kICE9IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgJiYgZHN0QmxlbmQgIT0gR0xfT05FKSB7CiAgICAgICAgICAgIFdBUk4oIldJTkVEM0RSU19FREdFQU5USUFMSUFTIGVuYWJsZWQsIGJ1dCB1bmV4cGVjdGVkIGRzdCBibGVuZGluZyBwYXJhbVxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfTElORV9TTU9PVEgpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfTElORV9TTU9PVEgpIik7CiAgICB9CgogICAgVFJBQ0UoImdsQmxlbmRGdW5jIHNyYz0leCwgZHN0PSV4XG4iLCBzcmNCbGVuZCwgZHN0QmxlbmQpOwogICAgZ2xCbGVuZEZ1bmMoc3JjQmxlbmQsIGRzdEJsZW5kKTsKICAgIGNoZWNrR0xjYWxsKCJnbEJsZW5kRnVuYyIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ibGVuZGZhY3RvcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGZsb2F0IGNvbFs0XTsKCiAgICBUUkFDRSgiU2V0dGluZyBCbGVuZEZhY3RvciB0byAlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ERkFDVE9SXSk7CiAgICBEM0RDT0xPUlRPR0xGTE9BVDQoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ERkFDVE9SXSwgY29sKTsKICAgIEdMX0VYVENBTEwoZ2xCbGVuZENvbG9yRVhUIChjb2xbMF0sY29sWzFdLGNvbFsyXSxjb2xbM10pKTsKICAgIGNoZWNrR0xjYWxsKCJnbEJsZW5kQ29sb3IiKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfYWxwaGEoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpbnQgZ2xQYXJtID0gMDsKICAgIGZsb2F0IHJlZjsKICAgIEJPT0wgZW5hYmxlX2NrZXkgPSBGQUxTRTsKCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsICpzdXJmOwoKICAgIC8qIEZpbmQgb3V0IGlmIHRoZSB0ZXh0dXJlIG9uIHRoZSBmaXJzdCBzdGFnZSBoYXMgYSBja2V5IHNldAogICAgICogVGhlIGFscGhhIHN0YXRlIGZ1bmMgcmVhZHMgdGhlIHRleHR1cmUgc2V0dGluZ3MsIGV2ZW4gdGhvdWdoIGFscGhhIGFuZCB0ZXh0dXJlIGFyZSBub3QgZ3JvdXBlZAogICAgICogdG9nZXRoZXIuIFRoaXMgaXMgdG8gYXZvaWQgbWFraW5nIGEgaHVnZSBhbHBoYSt0ZXh0dXJlK3RleHR1cmUgc3RhZ2UrY2tleSBibG9jayBkdWUgdG8gdGhlIGhhcmRseQogICAgICogdXNlZCBXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEUgc3RhdGUod2hpY2ggaXMgZDNkIDw9IDMgb25seSkuIFRoZSB0ZXh0dXJlIGZ1bmN0aW9uIHdpbGwgY2FsbCBhbHBoYQogICAgICogaW4gY2FzZSBpdCBmaW5kcyBzb21lIHRleHR1cmUrY29sb3JrZXllbmFibGUgY29tYmluYXRpb24gd2hpY2ggbmVlZHMgZXh0cmEgY2FyZS4KICAgICAqLwogICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZXNbMF0gJiYgKAogICAgICAgc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbMF0gPT0gR0xfVEVYVFVSRV8yRCB8fAogICAgICAgc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbMF0gPT0gR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSkgewogICAgICAgIHN1cmYgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSAoKElXaW5lRDNEVGV4dHVyZUltcGwgKilzdGF0ZWJsb2NrLT50ZXh0dXJlc1swXSktPnN1cmZhY2VzWzBdOwoKICAgICAgICBpZihzdXJmLT5DS2V5RmxhZ3MgJiBXSU5FRERTRF9DS1NSQ0JMVCkgewogICAgICAgICAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmZtdCA9IGdldEZvcm1hdERlc2NFbnRyeShzdXJmLT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAvKiBUaGUgc3VyZmFjZSBjb252ZXJzaW9uIGRvZXMgbm90IGRvIGNvbG9yIGtleWluZyBjb252ZXJzaW9uIGZvciBzdXJmYWNlcyB0aGF0IGhhdmUgYW4gYWxwaGEKICAgICAgICAgICAgICogY2hhbm5lbCBvbiB0aGVpciBvd24uIExpa2V3aXNlLCB0aGUgYWxwaGEgdGVzdCBzaG91bGRuJ3QgYmUgc2V0IHVwIGZvciBjb2xvciBrZXlpbmcgaWYgdGhlCiAgICAgICAgICAgICAqIHN1cmZhY2UgaGFzIGFscGhhIGJpdHMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKGZtdC0+YWxwaGFNYXNrID09IDB4MDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIGVuYWJsZV9ja2V5ID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZihlbmFibGVfY2tleSB8fCBjb250ZXh0LT5sYXN0X3dhc19ja2V5KSB7CiAgICAgICAgU3RhdGVUYWJsZVtTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19BTFBIQU9QKV0uYXBwbHkoU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQogICAgY29udGV4dC0+bGFzdF93YXNfY2tleSA9IGVuYWJsZV9ja2V5OwoKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFXSB8fAogICAgICAgIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIGVuYWJsZV9ja2V5KSkgewogICAgICAgIGdsRW5hYmxlKEdMX0FMUEhBX1RFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZSBHTF9BTFBIQV9URVNUIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0FMUEhBX1RFU1QiKTsKICAgICAgICAvKiBBbHBoYSB0ZXN0IGlzIGRpc2FibGVkLCBkb24ndCBib3RoZXIgc2V0dGluZyB0aGUgcGFyYW1zIC0gaXQgd2lsbCBoYXBwZW4gb24gdGhlIG5leHQKICAgICAgICAgKiBlbmFibGUgY2FsbAogICAgICAgICAqLwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIGVuYWJsZV9ja2V5KSB7CiAgICAgICAgZ2xQYXJtID0gR0xfTk9URVFVQUw7CiAgICAgICAgcmVmID0gMC4wOwogICAgfSBlbHNlIHsKICAgICAgICByZWYgPSAoKGZsb2F0KSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFSRUZdKSAvIDI1NS4wZjsKICAgICAgICBnbFBhcm0gPSBDb21wYXJlRnVuYyhzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFGVU5DXSk7CiAgICB9CiAgICBpZihnbFBhcm0pIHsKICAgICAgICBnbEFscGhhRnVuYyhnbFBhcm0sIHJlZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQWxwaGFGdW5jIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2NsaXBwaW5nKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgZW5hYmxlICA9IDB4RkZGRkZGRkY7CiAgICBEV09SRCBkaXNhYmxlID0gMHgwMDAwMDAwMDsKCiAgICBpZiAodXNlX3ZzKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UpKSB7CiAgICAgICAgLyogVGhlIHNwZWMgc2F5cyB0aGF0IG9wZW5nbCBjbGlwcGluZyBwbGFuZXMgYXJlIGRpc2FibGVkIHdoZW4gdXNpbmcgc2hhZGVycy4gRGlyZWN0M0QgcGxhbmVzIGFyZW4ndCwKICAgICAgICAgKiBzbyB0aGF0IGlzIGFuIGlzc3VlLiBUaGUgTWFjT1MgQVRJIGRyaXZlciBrZWVwcyBjbGlwcGluZyBwbGFuZXMgYWN0aXZhdGVkIHdpdGggc2hhZGVycyBpbiBzb21lCiAgICAgICAgICogY29udGl0aW9ucyBJIGdvdCBzaWNrIG9mIHRyYWNraW5nIGRvd24uIFRoZSBzaGFkZXIgc3RhdGUgaGFuZGxlciBkaXNhYmxlcyBhbGwgY2xpcCBwbGFuZXMgYmVjYXVzZQogICAgICAgICAqIG9mIHRoYXQgLSBkb24ndCBkbyBhbnl0aGluZyBoZXJlIGFuZCBrZWVwIHRoZW0gZGlzYWJsZWQKICAgICAgICAgKi8KICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFXSkgewogICAgICAgICAgICBzdGF0aWMgQk9PTCB3YXJuZWQgPSBGQUxTRTsKICAgICAgICAgICAgaWYoIXdhcm5lZCkgewogICAgICAgICAgICAgICAgRklYTUUoIkNsaXBwaW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCB2ZXJ0ZXggc2hhZGVyc1xuIik7CiAgICAgICAgICAgICAgICB3YXJuZWQgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBUT0RPOiBLZWVwIHRyYWNrIG9mIHByZXZpb3VzbHkgZW5hYmxlZCBjbGlwcGxhbmVzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlc2V0dGluZwogICAgICogb2YgYWxyZWFkeSBzZXQgdmFsdWVzCiAgICAgKi8KCiAgICAvKiBJZiBlbmFibGluZyAvIGRpc2FibGluZyBhbGwKICAgICAqIFRPRE86IElzIHRoaXMgY29ycmVjdD8gRG9lc24ndCBEM0RSU19DTElQUElORyBkaXNhYmxlIGNsaXBwaW5nIG9uIHRoZSB2aWV3cG9ydCBmcnVzdHJ1bT8KICAgICAqLwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DTElQUElOR10pIHsKICAgICAgICBlbmFibGUgID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRV07CiAgICAgICAgZGlzYWJsZSA9IH5zdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFXTsKICAgICAgICBpZihHTF9TVVBQT1JUKE5WX0RFUFRIX0NMQU1QKSkgewogICAgICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfQ0xBTVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX0RFUFRIX0NMQU1QX05WKSIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZGlzYWJsZSA9IDB4ZmZmZmZmZmY7CiAgICAgICAgZW5hYmxlICA9IDB4MDA7CiAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9ERVBUSF9DTEFNUCkpIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfQ0xBTVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfREVQVEhfQ0xBTVBfTlYpIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbmFibGUgJiBXSU5FRDNEQ0xJUFBMQU5FMCkgIHsgZ2xFbmFibGUoR0xfQ0xJUF9QTEFORTApOyAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKGNsaXAgcGxhbmUgMCkiKTsgfQogICAgaWYgKGVuYWJsZSAmIFdJTkVEM0RDTElQUExBTkUxKSAgeyBnbEVuYWJsZShHTF9DTElQX1BMQU5FMSk7ICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoY2xpcCBwbGFuZSAxKSIpOyB9CiAgICBpZiAoZW5hYmxlICYgV0lORUQzRENMSVBQTEFORTIpICB7IGdsRW5hYmxlKEdMX0NMSVBfUExBTkUyKTsgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShjbGlwIHBsYW5lIDIpIik7IH0KICAgIGlmIChlbmFibGUgJiBXSU5FRDNEQ0xJUFBMQU5FMykgIHsgZ2xFbmFibGUoR0xfQ0xJUF9QTEFORTMpOyAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKGNsaXAgcGxhbmUgMykiKTsgfQogICAgaWYgKGVuYWJsZSAmIFdJTkVEM0RDTElQUExBTkU0KSAgeyBnbEVuYWJsZShHTF9DTElQX1BMQU5FNCk7ICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoY2xpcCBwbGFuZSA0KSIpOyB9CiAgICBpZiAoZW5hYmxlICYgV0lORUQzRENMSVBQTEFORTUpICB7IGdsRW5hYmxlKEdMX0NMSVBfUExBTkU1KTsgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShjbGlwIHBsYW5lIDUpIik7IH0KCiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUwKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAwKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUxKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMSk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAxKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUyKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMik7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAyKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUzKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMyk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAzKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkU0KSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FNCk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSA0KSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkU1KSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FNSk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSA1KSIpOyB9CgogICAgLyoqIHVwZGF0ZSBjbGlwcGluZyBzdGF0dXMgKi8KICAgIGlmIChlbmFibGUpIHsKICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwX3N0YXR1cy5DbGlwVW5pb24gPSAwOwogICAgICAgIHN0YXRlYmxvY2stPmNsaXBfc3RhdHVzLkNsaXBJbnRlcnNlY3Rpb24gPSAweEZGRkZGRkZGOwogICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwX3N0YXR1cy5DbGlwVW5pb24gPSAwOwogICAgICAgIHN0YXRlYmxvY2stPmNsaXBfc3RhdHVzLkNsaXBJbnRlcnNlY3Rpb24gPSAwOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ibGVuZG9wKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaW50IGdsUGFybSA9IEdMX0ZVTkNfQUREOwoKICAgIGlmKCFHTF9TVVBQT1JUKEVYVF9CTEVORF9NSU5NQVgpKSB7CiAgICAgICAgV0FSTigiVW5zdXBwb3J0ZWQgaW4gbG9jYWwgT3BlbkdMIGltcGxlbWVudGF0aW9uOiBnbEJsZW5kRXF1YXRpb25cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzd2l0Y2ggKChXSU5FRDNEQkxFTkRPUCkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9BREQgICAgICAgICAgICAgIDogZ2xQYXJtID0gR0xfRlVOQ19BREQ7ICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORE9QX1NVQlRSQUNUICAgICAgICAgOiBnbFBhcm0gPSBHTF9GVU5DX1NVQlRSQUNUOyAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5ET1BfUkVWU1VCVFJBQ1QgICAgICA6IGdsUGFybSA9IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVDsgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9NSU4gICAgICAgICAgICAgIDogZ2xQYXJtID0gR0xfTUlOOyAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORE9QX01BWCAgICAgICAgICAgICAgOiBnbFBhcm0gPSBHTF9NQVg7ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQvVW5oYW5kbGVkIEQzREJMRU5ET1AgdmFsdWUgJWRcbiIsIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19CTEVORE9QXSk7CiAgICB9CgogICAgVFJBQ0UoImdsQmxlbmRFcXVhdGlvbigleClcbiIsIGdsUGFybSk7CiAgICBHTF9FWFRDQUxMKGdsQmxlbmRFcXVhdGlvbkVYVChnbFBhcm0pKTsKICAgIGNoZWNrR0xjYWxsKCJnbEJsZW5kRXF1YXRpb24iKTsKfQoKc3RhdGljIHZvaWQKc3RhdGVfc3BlY3VsYXJlbmFibGUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBPcmlnaW5hbGx5IHRoaXMgdXNlZCBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IpCiAgICAgKiBhbmQgKEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsR0xfU0lOR0xFX0NPTE9SKSB0byBzd2FwIGJldHdlZW4gZW5hYmxlZC9kaXNhYmxlZAogICAgICogc3BlY3VsYXIgY29sb3IuIFRoaXMgaXMgd3Jvbmc6CiAgICAgKiBTZXBhcmF0ZSBzcGVjdWxhciBjb2xvciBtZWFucyB0aGUgc3BlY3VsYXIgY29sb3VyIGlzIG1haW50YWluZWQgc2VwYXJhdGVseSwgd2hlcmVhcwogICAgICogc2luZ2xlIGNvbG9yIG1lYW5zIGl0IGlzIG1lcmdlZCBpbi4gSG93ZXZlciBpbiBib3RoIGNhc2VzIHRoZXkgYXJlIGJlaW5nIHVzZWQgdG8KICAgICAqIHNvbWUgZXh0ZW50LgogICAgICogVG8gZGlzYWJsZSBzcGVjdWxhciBjb2xvciwgc2V0IGl0IGV4cGxpY2l0bHkgdG8gYmxhY2sgYW5kIHR1cm4gb2ZmIEdMX0NPTE9SX1NVTV9FWFQKICAgICAqIE5PVEU6IElmIG5vdCBzdXBwb3J0ZWQgZG9uJ3QgZ2l2ZSBGSVhNRXMgdGhlIGltcGFjdCBpcyByZWFsbHkgbWluaW1hbCBhbmQgdmVyeSBmZXcgcGVvcGxlIGFyZQogICAgICogcnVubmluZyAxLjQgeWV0IQogICAgICoKICAgICAqCiAgICAgKiBJZiByZWdpc3RlciBjb21iaW5lcnMgYXJlIGVuYWJsZWQsIGVuYWJsaW5nIC8gZGlzYWJsaW5nIEdMX0NPTE9SX1NVTSBoYXMgbm8gZWZmZWN0LgogICAgICogSW5zdGVhZCwgd2UgbmVlZCB0byBzZXR1cCB0aGUgRmluYWxDb21iaW5lciBwcm9wZXJseS4KICAgICAqCiAgICAgKiBUaGUgZGVmYXVsdCBzZXR1cCBmb3IgdGhlIEZpbmFsQ29tYmluZXIgaXM6CiAgICAgKgogICAgICogPHZhcmlhYmxlPiAgICAgICA8aW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFwcGluZz4gICAgICAgICAgICAgICA8dXNhZ2U+CiAgICAgKiBHTF9WQVJJQUJMRV9BX05WIEdMX0ZPRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0lERU5USVRZX05WIEdMX0FMUEhBCiAgICAgKiBHTF9WQVJJQUJMRV9CX05WIEdMX1NQQVJFMF9QTFVTX1NFQ09OREFSWV9DT0xPUl9OViAgIEdMX1VOU0lHTkVEX0lERU5USVRZX05WIEdMX1JHQgogICAgICogR0xfVkFSSUFCTEVfQ19OViBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9JREVOVElUWV9OViBHTF9SR0IKICAgICAqIEdMX1ZBUklBQkxFX0RfTlYgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfSURFTlRJVFlfTlYgR0xfUkdCCiAgICAgKiBHTF9WQVJJQUJMRV9FX05WIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0lERU5USVRZX05WIEdMX1JHQgogICAgICogR0xfVkFSSUFCTEVfRl9OViBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9JREVOVElUWV9OViBHTF9SR0IKICAgICAqIEdMX1ZBUklBQkxFX0dfTlYgR0xfU1BBUkUwX05WICAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfSURFTlRJVFlfTlYgR0xfQUxQSEEKICAgICAqCiAgICAgKiBUaGF0J3MgcHJldHR5IG11Y2ggZmluZSBhcyBpdCBpcywgZXhjZXB0IGZvciB2YXJpYWJsZSBCLCB3aGljaCBuZWVkcyB0byB0YWtlCiAgICAgKiBlaXRoZXIgR0xfU1BBUkUwX1BMVVNfU0VDT05EQVJZX0NPTE9SX05WIG9yIEdMX1NQQVJFMF9OViwgZGVwZW5kaW5nIG9uCiAgICAgKiB3aGV0aGVyIFdJTkVEM0RSU19TUEVDVUxBUkVOQUJMRSBpcyBlbmFibGVkIG9yIG5vdC4KICAgICAqLwoKICAgIFRSQUNFKCJTZXR0aW5nIHNwZWN1bGFyIGVuYWJsZSBzdGF0ZSBhbmQgbWF0ZXJpYWxzXG4iKTsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEVdKSB7CiAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgKGZsb2F0KikgJnN0YXRlYmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CgogICAgICAgIGlmKHN0YXRlYmxvY2stPm1hdGVyaWFsLlBvd2VyID4gMTI4LjApIHsKICAgICAgICAgICAgLyogZ2xNYXRlcmlhbGYgbWFuIHBhZ2Ugc2F5cyB0aGF0IHRoZSBtYXRlcmlhbCBzYXlzIHRoYXQgR0xfU0hJTklORVNTIG11c3QgYmUgYmV0d2VlbiAwLjAKICAgICAgICAgICAgICogYW5kIDEyOC4wLCBhbHRob3VnaCBpbiBkM2QgbmVpdGhlciAtMSBub3IgMTI5IHByb2R1Y2UgYW4gZXJyb3IuIEZvciB2YWx1ZXMgPiAxMjggY2xhbXAKICAgICAgICAgICAgICogdGhlbSwgc2luY2UgMTI4IHJlc3VsdHMgaW4gYSBoYXJkbHkgdmlzaWJsZSBzcGVjdWxhciBoaWdobGlnaHQsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvCiAgICAgICAgICAgICAqIHRvIGNsYW1wIHRvIDEyOAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgV0FSTigiTWF0ZXJpYWwgcG93ZXIgPiAxMjhcbiIpOwogICAgICAgICAgICBnbE1hdGVyaWFsZihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCAxMjguMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgc3RhdGVibG9jay0+bWF0ZXJpYWwuUG93ZXIpOwogICAgICAgIH0KICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGYoR0xfU0hJTklORVNTIik7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKEVYVF9TRUNPTkRBUllfQ09MT1IpKSB7CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NPTE9SX1NVTV9FWFQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFKCJTcGVjdWxhciBjb2xvcnMgY2Fubm90IGJlIGVuYWJsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIG9wZW5nbFxuIik7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9DT0xPUl9TVU0pIik7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEZpbmFsQ29tYmluZXJJbnB1dE5WKEdMX1ZBUklBQkxFX0JfTlYsIEdMX1NQQVJFMF9QTFVTX1NFQ09OREFSWV9DT0xPUl9OViwgR0xfVU5TSUdORURfSURFTlRJVFlfTlYsIEdMX1JHQikpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGaW5hbENvbWJpbmVySW5wdXROVigpIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbG9hdCBibGFja1s0XSA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKCiAgICAgICAgLyogZm9yIHRoZSBjYXNlIG9mIGVuYWJsZWQgbGlnaHRpbmc6ICovCiAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgJmJsYWNrWzBdKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CgogICAgICAgIC8qIGZvciB0aGUgY2FzZSBvZiBkaXNhYmxlZCBsaWdodGluZzogKi8KICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgICAgICBnbERpc2FibGUoR0xfQ09MT1JfU1VNX0VYVCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVFJBQ0UoIlNwZWN1bGFyIGNvbG9ycyBjYW5ub3QgYmUgZGlzYWJsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIG9wZW5nbFxuIik7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfQ09MT1JfU1VNKSIpOwoKICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xGaW5hbENvbWJpbmVySW5wdXROVihHTF9WQVJJQUJMRV9CX05WLCBHTF9TUEFSRTBfTlYsIEdMX1VOU0lHTkVEX0lERU5USVRZX05WLCBHTF9SR0IpKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRmluYWxDb21iaW5lcklucHV0TlYoKSIpOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRSgiKCVwKSA6IERpZmZ1c2UgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRGlmZnVzZS5yLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5EaWZmdXNlLmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5EaWZmdXNlLmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkRpZmZ1c2UuYSk7CiAgICBUUkFDRSgiKCVwKSA6IEFtYmllbnQgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuQW1iaWVudC5yLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5BbWJpZW50LmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5BbWJpZW50LmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkFtYmllbnQuYSk7CiAgICBUUkFDRSgiKCVwKSA6IFNwZWN1bGFyICglZiwlZiwlZiwlZilcbiIsIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIHN0YXRlYmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyLnIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyLmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhci5iLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhci5hKTsKICAgIFRSQUNFKCIoJXApIDogRW1pc3NpdmUgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUuciwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUuZywKICAgICAgICAgIHN0YXRlYmxvY2stPm1hdGVyaWFsLkVtaXNzaXZlLmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkVtaXNzaXZlLmEpOwoKICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVCwgKGZsb2F0KikgJnN0YXRlYmxvY2stPm1hdGVyaWFsLkFtYmllbnQpOwogICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdihHTF9BTUJJRU5UKSIpOwogICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCAoZmxvYXQqKSAmc3RhdGVibG9jay0+bWF0ZXJpYWwuRGlmZnVzZSk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2KEdMX0RJRkZVU0UpIik7CiAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0VNSVNTSU9OLCAoZmxvYXQqKSAmc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUpOwogICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdihHTF9FTUlTU0lPTikiKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfdGV4ZmFjdG9yKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5zaWduZWQgaW50IGk7CgogICAgLyogTm90ZSB0aGUgdGV4dHVyZSBjb2xvciBhcHBsaWVzIHRvIGFsbCB0ZXh0dXJlcyB3aGVyZWFzCiAgICAgKiBHTF9URVhUVVJFX0VOVl9DT0xPUiBhcHBsaWVzIHRvIGFjdGl2ZSBvbmx5CiAgICAgKi8KICAgIGZsb2F0IGNvbFs0XTsKICAgIEQzRENPTE9SVE9HTEZMT0FUNChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfVEVYVFVSRUZBQ1RPUl0sIGNvbCk7CgogICAgaWYgKCFHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICAvKiBBbmQgbm93IHRoZSBkZWZhdWx0IHRleHR1cmUgY29sb3IgYXMgd2VsbCAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFModGV4dHVyZV9zdGFnZXMpOyBpKyspIHsKICAgICAgICAgICAgLyogTm90ZSB0aGUgV0lORUQzRFJTIHZhbHVlIGFwcGxpZXMgdG8gYWxsIHRleHR1cmVzLCBidXQgR0wgaGFzIG9uZQogICAgICAgICAgICAgKiBwZXIgdGV4dHVyZSwgc28gYXBwbHkgaXQgbm93IHJlYWR5IHRvIGJlIHVzZWQhCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGk+MCkgewogICAgICAgICAgICAgICAgRklYTUUoIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnbFRleEVudmZ2KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9DT0xPUiwgJmNvbFswXSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmZ2KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9DT0xPUiwgY29sb3IpOyIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyUGFyYW1ldGVyZnZOVihHTF9DT05TVEFOVF9DT0xPUjBfTlYsICZjb2xbMF0pKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKcmVuZGVyc3RhdGVfc3RlbmNpbF90d29zaWRlZChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBHTGludCBmYWNlLCBHTGludCBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrLCBHTGludCBzdGVuY2lsRmFpbCwgR0xpbnQgZGVwdGhGYWlsLCBHTGludCBzdGVuY2lsUGFzcyApIHsKI2lmIDAgLyogRG9uJ3QgdXNlIE9wZW5HTCAyLjAgY2FsbHMgZm9yIG5vdyAqLwogICAgICAgICAgICBpZihHTF9FWFRDQUxMKGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSkgJiYgR0xfRVhUQ0FMTChnbFN0ZW5jaWxPcFNlcGFyYXRlKSkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVuYywgcmVmLCBtYXNrKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xTdGVuY2lsRnVuY1NlcGFyYXRlKC4uLikiKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcykpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wU2VwYXJhdGUoLi4uKSIpOwogICAgICAgIH0KICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgIGlmKEdMX1NVUFBPUlQoRVhUX1NURU5DSUxfVFdPX1NJREUpKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUX1RXT19TSURFX0VYVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQpIik7CiAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKGZhY2UpKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVTdGVuY2lsRmFjZUVYVCguLi4pIik7CiAgICAgICAgZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxGdW5jKC4uLikiKTsKICAgICAgICBnbFN0ZW5jaWxPcChzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wKC4uLikiKTsKICAgIH0gZWxzZSBpZihHTF9TVVBQT1JUKEFUSV9TRVBBUkFURV9TVEVOQ0lMKSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xTdGVuY2lsRnVuY1NlcGFyYXRlQVRJKGZhY2UsIGZ1bmMsIHJlZiwgbWFzaykpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxGdW5jU2VwYXJhdGVBVEkoLi4uKSIpOwogICAgICAgIEdMX0VYVENBTEwoZ2xTdGVuY2lsT3BTZXBhcmF0ZUFUSShmYWNlLCBzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcykpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJKC4uLikiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgRVJSKCJTZXBhcmF0ZSAodHdvIHNpZGVkKSBzdGVuY2lsIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB2ZXJzaW9uIG9mIG9wZW5nbC4gQ2FwcyB3ZXJlbid0IGhvbm9yZWQ/XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKc3RhdGVfc3RlbmNpbChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIG9uZXNpZGVkX2VuYWJsZSA9IEZBTFNFOwogICAgRFdPUkQgdHdvc2lkZWRfZW5hYmxlID0gRkFMU0U7CiAgICBHTGludCBmdW5jID0gR0xfQUxXQVlTOwogICAgR0xpbnQgZnVuY19jY3cgPSBHTF9BTFdBWVM7CiAgICBHTGludCByZWYgPSAwOwogICAgR0x1aW50IG1hc2sgPSAwOwogICAgR0xpbnQgc3RlbmNpbEZhaWwgPSBHTF9LRUVQOwogICAgR0xpbnQgZGVwdGhGYWlsID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxQYXNzID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxGYWlsX2NjdyA9IEdMX0tFRVA7CiAgICBHTGludCBkZXB0aEZhaWxfY2N3ID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxQYXNzX2NjdyA9IEdMX0tFRVA7CgogICAgLyogTm8gc3RlbmNpbCB0ZXN0IHdpdGhvdXQgYSBzdGVuY2lsIGJ1ZmZlciAqLwogICAgaWYoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RlbmNpbEJ1ZmZlclRhcmdldCA9PSBOVUxMKSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9TVEVOQ0lMX1RFU1QiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgb25lc2lkZWRfZW5hYmxlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NURU5DSUxFTkFCTEVdOwogICAgdHdvc2lkZWRfZW5hYmxlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREVdOwogICAgaWYoICEoIGZ1bmMgPSBDb21wYXJlRnVuYyhzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTEZVTkNdKSApICkKICAgICAgICBmdW5jID0gR0xfQUxXQVlTOwogICAgaWYoICEoIGZ1bmNfY2N3ID0gQ29tcGFyZUZ1bmMoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NDV19TVEVOQ0lMRlVOQ10pICkgKQogICAgICAgIGZ1bmNfY2N3ID0gR0xfQUxXQVlTOwogICAgcmVmID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NURU5DSUxSRUZdOwogICAgbWFzayA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVEVOQ0lMTUFTS107CiAgICBzdGVuY2lsRmFpbCA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTEZBSUxdKTsKICAgIGRlcHRoRmFpbCA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTFpGQUlMXSk7CiAgICBzdGVuY2lsUGFzcyA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTFBBU1NdKTsKICAgIHN0ZW5jaWxGYWlsX2NjdyA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0NXX1NURU5DSUxGQUlMXSk7CiAgICBkZXB0aEZhaWxfY2N3ID0gU3RlbmNpbE9wKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DQ1dfU1RFTkNJTFpGQUlMXSk7CiAgICBzdGVuY2lsUGFzc19jY3cgPSBTdGVuY2lsT3Aoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NDV19TVEVOQ0lMUEFTU10pOwoKICAgIFRSQUNFKCIob25lc2lkZWQgJWQsIHR3b3NpZGVkICVkLCByZWYgJXgsIG1hc2sgJXgsICIKICAgICAgICAgICJHTF9GUk9OVDogZnVuYzogJXgsIGZhaWwgJXgsIHpmYWlsICV4LCB6cGFzcyAleCAiCiAgICAgICAgICAiR0xfQkFDSzogZnVuYzogJXgsIGZhaWwgJXgsIHpmYWlsICV4LCB6cGFzcyAleCApXG4iLAogICAgb25lc2lkZWRfZW5hYmxlLCB0d29zaWRlZF9lbmFibGUsIHJlZiwgbWFzaywKICAgIGZ1bmMsIHN0ZW5jaWxGYWlsLCBkZXB0aEZhaWwsIHN0ZW5jaWxQYXNzLAogICAgZnVuY19jY3csIHN0ZW5jaWxGYWlsX2NjdywgZGVwdGhGYWlsX2Njdywgc3RlbmNpbFBhc3NfY2N3KTsKCiAgICBpZiAodHdvc2lkZWRfZW5hYmxlICYmIG9uZXNpZGVkX2VuYWJsZSkgewogICAgICAgIGdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX1NURU5DSUxfVEVTVCIpOwoKICAgICAgICAvKiBBcHBseSBiYWNrIGZpcnN0LCB0aGVuIGZyb250LiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQsCiAgICAgICAgICogd2hpY2ggaGFzIGFuIGVmZmVjdCBvbiB0aGUgY29kZSBiZWxvdyB0b28uIElmIHdlIGFwcGx5IHRoZSBmcm9udCBmYWNlCiAgICAgICAgICogYWZ0ZXJ3YXJkcywgd2UgYXJlIHN1cmUgdGhhdCB0aGUgYWN0aXZlIHN0ZW5jaWwgZmFjZSBpcyBzZXQgdG8gZnJvbnQsCiAgICAgICAgICogYW5kIG90aGVyIHN0ZW5jaWwgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCB1c2UgdHdvIHNpZGVkIHN0ZW5jaWwgZG8gbm90IGhhdmUKICAgICAgICAgKiB0byBzZXQgaXQgYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlcnN0YXRlX3N0ZW5jaWxfdHdvc2lkZWQoc3RhdGVibG9jaywgR0xfQkFDSywgZnVuY19jY3csIHJlZiwgbWFzaywgc3RlbmNpbEZhaWxfY2N3LCBkZXB0aEZhaWxfY2N3LCBzdGVuY2lsUGFzc19jY3cpOwogICAgICAgIHJlbmRlcnN0YXRlX3N0ZW5jaWxfdHdvc2lkZWQoc3RhdGVibG9jaywgR0xfRlJPTlQsIGZ1bmMsIHJlZiwgbWFzaywgc3RlbmNpbEZhaWwsIGRlcHRoRmFpbCwgc3RlbmNpbFBhc3MpOwogICAgfSBlbHNlIGlmKG9uZXNpZGVkX2VuYWJsZSkgewogICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX1NURU5DSUxfVFdPX1NJREUpKSB7CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1RfVFdPX1NJREVfRVhUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1RfVFdPX1NJREVfRVhUKSIpOwogICAgICAgIH0KCiAgICAgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfU1RFTkNJTF9URVNUIik7CiAgICAgICAgZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxGdW5jKC4uLikiKTsKICAgICAgICBnbFN0ZW5jaWxPcChzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wKC4uLikiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9TVEVOQ0lMX1RFU1QiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc3RlbmNpbHdyaXRlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgbWFzazsKCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdGVuY2lsQnVmZmVyVGFyZ2V0KSB7CiAgICAgICAgbWFzayA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVEVOQ0lMV1JJVEVNQVNLXTsKICAgIH0gZWxzZSB7CiAgICAgICAgbWFzayA9IDA7CiAgICB9CgogICAgaWYoR0xfU1VQUE9SVChFWFRfU1RFTkNJTF9UV09fU0lERSkpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQoR0xfQkFDSykpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKEdMX0JBQ0spIik7CiAgICAgICAgZ2xTdGVuY2lsTWFzayhtYXNrKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xTdGVuY2lsTWFzayIpOwogICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVTdGVuY2lsRmFjZUVYVChHTF9GUk9OVCkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKEdMX0ZST05UKSIpOwogICAgICAgIGdsU3RlbmNpbE1hc2sobWFzayk7CiAgICB9IGVsc2UgewogICAgICAgIGdsU3RlbmNpbE1hc2sobWFzayk7CiAgICB9CiAgICBjaGVja0dMY2FsbCgiZ2xTdGVuY2lsTWFzayIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9mb2coRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBUT0RPOiBQdXQgdGhpcyBpbnRvIHRoZSB2ZXJ0ZXggdHlwZSBibG9jayBvbmNlIHRoYXQgaXMgaW4gdGhlIHN0YXRlIHRhYmxlICovCiAgICBCT09MIGZvZ2VuYWJsZSA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dFTkFCTEVdOwogICAgQk9PTCBpc19wczMgPSB1c2VfcHMoc3RhdGVibG9jay0+d2luZUQzRERldmljZSkKICAgICAgICAgICAgICAgICAgJiYgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+YmFzZVNoYWRlci5oZXhfdmVyc2lvbiA+PSBXSU5FRDNEUFNfVkVSU0lPTigzLDApOwogICAgZmxvYXQgZm9nc3RhcnQsIGZvZ2VuZDsKCiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKCiAgICBpZiAoIWZvZ2VuYWJsZSkgewogICAgICAgIC8qIE5vIGZvZz8gRGlzYWJsZSBpdCwgYW5kIHdlJ3JlIGRvbmUgOi0pICovCiAgICAgICAgZ2xEaXNhYmxlKEdMX0ZPRyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9GT0ciKTsKICAgICAgICBpZiggdXNlX3BzKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UpCiAgICAgICAgICAgICAgICAmJiAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpLT5iYXNlU2hhZGVyLmhleF92ZXJzaW9uIDwgV0lORUQzRFBTX1ZFUlNJT04oMywwKSApIHsKICAgICAgICAgICAgLyogZGlzYWJsZSBmb2cgaW4gdGhlIHBpeGVsIHNoYWRlcgogICAgICAgICAgICAgKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICAgICAqIC0xLyhlLXMpIGFuZCBlLyhlLXMpIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsIDAuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19TVEFSVCwgZm9nc3RhcnQiKTsKICAgICAgICAgICAgZ2xGb2dmKEdMX0ZPR19FTkQsIDEuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19FTkQsIGZvZ2VuZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CgogICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dTVEFSVF07CiAgICBmb2dzdGFydCA9IHRtcHZhbHVlLmY7CiAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR0VORF07CiAgICBmb2dlbmQgPSB0bXB2YWx1ZS5mOwoKICAgIC8qIEZvZyBSdWxlczoKICAgICAqCiAgICAgKiBXaXRoIGZpeGVkIGZ1bmN0aW9uIHZlcnRleCBwcm9jZXNzaW5nLCBEaXJlY3QzRCBrbm93cyAyIGRpZmZlcmVudCBmb2cgaW5wdXQgc291cmNlcy4KICAgICAqIEl0IGNhbiB1c2UgdGhlIFogdmFsdWUgb2YgdGhlIHZlcnRleCwgb3IgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgc3BlY3VsYXIgY29sb3IuCiAgICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIGZvZyB2ZXJ0ZXgsIGZvZyB0YWJsZSBhbmQgdGhlIHZlcnRleCBkZWNsYXJhdGlvbi4gSWYgdGhlIFogdmFsdWUKICAgICAqIGlzIHVzZWQsIGZvZ3N0YXJ0LCBmb2dlbmQgYW5kIHRoZSBlcXVhdGlvbiB0eXBlIGFyZSB1c2VkLCBvdGhlcndpc2UgbGluZWFyIGZvZyB3aXRoCiAgICAgKiBzdGFydCA9IDI1NSwgZW5kID0gMCBpcyB1c2VkLiBPYnZpb3VzbHkgdGhlIG1zZG4gaXMgbm90IHZlcnkgY2xlYXIgb24gdGhhdC4KICAgICAqCiAgICAgKiBGT0dUQUJMRU1PREUgIT0gTk9ORToKICAgICAqICBUaGUgWiB2YWx1ZSBpcyB1c2VkLCB3aXRoIHRoZSBlcXVhdGlvbiBzcGVjaWZpZWQsIG5vIG1hdHRlciB3aGF0IHZlcnRleCB0eXBlLgogICAgICoKICAgICAqIEZPR1RBQkxFTU9ERSA9PSBOT05FLCBGT0dWRVJURVhNT0RFICE9IE5PTkUsIHVudHJhbnNmb3JtZWQ6CiAgICAgKiAgUGVyIHZlcnRleCBmb2cgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGZvZyBlcXVhdGlvbiBhbmQgdGhlIHBhcmFtZXRlcnMKICAgICAqCiAgICAgKiBGT0dUQUJMRU1PREUgPT0gTk9ORSwgRk9HVkVSVEVYTU9ERSAhPSBOT05FLCB0cmFuc2Zvcm1lZCwgT1IKICAgICAqIEZPR1RBQkxFTU9ERSA9PSBOT05FLCBGT0dWRVJURVhNT0RFID09IE5PTkUsIHVudHJhbnNmb3JtZWQ6CiAgICAgKiAgTGluZWFyIGZvZyB3aXRoIHN0YXJ0ID0gMjU1LjAsIGVuZCA9IDAuMCwgaW5wdXQgY29tZXMgZnJvbSB0aGUgc3BlY3VsYXIgY29sb3IKICAgICAqCiAgICAgKgogICAgICogUnVsZXMgZm9yIHZlcnRleCBmb2cgd2l0aCBzaGFkZXJzOgogICAgICoKICAgICAqIFdoZW4gbWl4aW5nIGZpeGVkIGZ1bmN0aW9uIGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGUgcHJvZ3JhbW1hYmxlIHBpcGVsaW5lLCBEM0QgZXhwZWN0cwogICAgICogdGhlIGZvZyBjb21wdXRhdGlvbiB0byBoYXBwZW4gZHVyaW5nIHRyYW5zZm9ybWF0aW9uIHdoaWxlIG9wZW5HTCBleHBlY3RzIGl0IHRvIGhhcHBlbgogICAgICogZHVyaW5nIHJhc3Rlcml6YXRpb24uIEFsc28sIHByaW9yIHRvIHBpeGVsIHNoYWRlciAzLjAgRDNEIGhhbmRsZXMgZm9nIGJsZW5kaW5nIGFmdGVyCiAgICAgKiB0aGUgcGl4ZWwgc2hhZGVyIHdoaWxlIG9wZW5HTCBhbHdheXMgZXhwZWN0cyB0aGUgcGl4ZWwgc2hhZGVyIHRvIGhhbmRsZSB0aGUgYmxlbmRpbmcuCiAgICAgKiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIFdpbmVEM0QgZG9lczoKICAgICAqIDEpIGltcGxlbWVudCBhIGxpbmVhciBmb2cgZXF1YXRpb24gYW5kIGZvZyBibGVuZGluZyBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHByZSAzLjAgcGl4ZWwKICAgICAqIHNoYWRlciwKICAgICAqIGFuZCAyKSBkaXNhYmxlcyB0aGUgZm9nIGNvbXB1dGF0aW9uIChpbiBlaXRoZXIgdGhlIGZpeGVkIGZ1bmN0aW9uIG9yIHByb2dyYW1tYWJsZQogICAgICogcmFzdGVyaXplcikgaWYgdXNpbmcgYSB2ZXJ0ZXggcHJvZ3JhbS4KICAgICAqCiAgICAgKgogICAgICogSWYgYSBmb2d0YWJsZW1vZGUgYW5kIGEgZm9ndmVydGV4bW9kZSBhcmUgc3BlY2lmaWVkLCB0YWJsZSBmb2cgaXMgYXBwbGllZCAod2l0aCBvcgogICAgICogd2l0aG91dCBzaGFkZXJzKS4KICAgICAqLwoKICAgIGlmKCBpc19wczMgKSB7CiAgICAgICAgaWYoICF1c2VfdnMoc3RhdGVibG9jay0+d2luZUQzRERldmljZSkKICAgICAgICAgICAgICAgICYmIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdID09IFdJTkVEM0RGT0dfTk9ORSApIHsKICAgICAgICAgICAgRklYTUUoIkltcGxlbWVudCB2ZXJ0ZXggZm9nIGZvciBwaXhlbCBzaGFkZXIgPj0gMy4wIGFuZCBmaXhlZCBmdW5jdGlvbiBwaXBlbGluZVxuIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1c2VfdnMoc3RhdGVibG9jay0+d2luZUQzRERldmljZSkKICAgICAgICAgICAgJiYgKChJV2luZUQzRFZlcnRleFNoYWRlckltcGwgKilzdGF0ZWJsb2NrLT52ZXJ0ZXhTaGFkZXIpLT5iYXNlU2hhZGVyLnJlZ19tYXBzLmZvZykgewogICAgICAgIGlmKCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVEFCTEVNT0RFXSAhPSBXSU5FRDNERk9HX05PTkUgKSB7CiAgICAgICAgICAgIGlmKCFpc19wczMpIEZJWE1FKCJJbXBsZW1lbnQgdGFibGUgZm9nIGZvciBmb2dneSB2ZXJ0ZXggc2hhZGVyXG4iKTsKICAgICAgICAgICAgLyogRGlzYWJsZSBmb2cgKi8KICAgICAgICAgICAgZm9nZW5hYmxlID0gRkFMU0U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogU2V0IGZvZyBjb21wdXRhdGlvbiBpbiB0aGUgcmFzdGVyaXplciB0byBwYXNzIHRocm91Z2ggdGhlIHZhbHVlIChqdXN0IGJsZW5kIGl0KSAqLwogICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUikiKTsKICAgICAgICAgICAgZm9nc3RhcnQgPSAxLjA7CiAgICAgICAgICAgIGZvZ2VuZCA9IDAuMDsKICAgICAgICB9CgogICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX0ZPR19DT09SRCkgJiYgY29udGV4dC0+Zm9nX2Nvb3JkKSB7CiAgICAgICAgICAgIGdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCIpOwogICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyID0gVFJVRTsKICAgIH0KICAgIGVsc2UgaWYoIHVzZV9wcyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKSApIHsKICAgICAgICAvKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICogLTEvKGUtcykgYW5kIGUvKGUtcykgcmVzcGVjdGl2ZWx5IHRvIHNpbXBsaWZ5IGZvZyBjb21wdXRhdGlvbiBpbiB0aGUgc2hhZGVyLgogICAgICAgICAqLwogICAgICAgIFdJTkVEM0RGT0dNT0RFIG1vZGU7CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyID0gRkFMU0U7CgogICAgICAgIC8qIElmIGJvdGggZm9nbW9kZXMgYXJlIHNldCB1c2UgdGhlIHRhYmxlIGZvZyBtb2RlICovCiAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1RBQkxFTU9ERV0gPT0gV0lORUQzREZPR19OT05FKQogICAgICAgICAgICBtb2RlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1ZFUlRFWE1PREVdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbW9kZSA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdOwoKICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDI6CiAgICAgICAgICAgICAgICBpZighaXNfcHMzKSBGSVhNRSgiSW1wbGVtZW50IG5vbiBsaW5lYXIgZm9nIGZvciBwaXhlbCBzaGFkZXIgPCAzLjBcbiIpOwogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBmb2cgKi8KICAgICAgICAgICAgICAgIGZvZ2VuYWJsZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfTElORUFSOgogICAgICAgICAgICAgICAgZm9nc3RhcnQgPSAtMS4wZi8oZm9nZW5kLWZvZ3N0YXJ0KTsKICAgICAgICAgICAgICAgIGZvZ2VuZCAqPSAtZm9nc3RhcnQ7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19OT05FOgogICAgICAgICAgICAgICAgaWYoIWlzX3BzMykgRklYTUUoIkltcGxlbWVudCBzb2Z0d2FyZSB2ZXJ0ZXggZm9nIGZvciBwaXhlbCBzaGFkZXIgPCAzLjBcbiIpOwogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBmb2cgKi8KICAgICAgICAgICAgICAgIGZvZ2VuYWJsZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IEZJWE1FKCJVbmV4cGVjdGVkIFdJTkVEM0RSU19GT0dWRVJURVhNT0RFICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERV0pOwogICAgICAgIH0KCiAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUIik7CiAgICAgICAgICAgIGNvbnRleHQtPmZvZ19jb29yZCA9IEZBTFNFOwogICAgICAgIH0KICAgIH0KICAgIC8qIERYIDcgc2RrOiAiSWYgYm90aCByZW5kZXIgc3RhdGVzKHZlcnRleCBhbmQgdGFibGUgZm9nKSBhcmUgc2V0IHRvIHZhbGlkIG1vZGVzLAogICAgICogdGhlIHN5c3RlbSB3aWxsIGFwcGx5IG9ubHkgcGl4ZWwoPXRhYmxlKSBmb2cgZWZmZWN0cy4iCiAgICAgKi8KICAgIGVsc2UgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1RBQkxFTU9ERV0gPT0gV0lORUQzREZPR19OT05FKSB7CiAgICAgICAgZ2xIaW50KEdMX0ZPR19ISU5ULCBHTF9GQVNURVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xIaW50KEdMX0ZPR19ISU5ULCBHTF9GQVNURVNUKSIpOwogICAgICAgIGNvbnRleHQtPmxhc3Rfd2FzX2ZvZ2d5X3NoYWRlciA9IEZBTFNFOwoKICAgICAgICBzd2l0Y2ggKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dWRVJURVhNT0RFXSkgewogICAgICAgICAgICAvKiBJZiBwcm9jZXNzZWQgdmVydGljZXMgYXJlIHVzZWQsIGZhbGwgdGhyb3VnaCB0byB0aGUgTk9ORSBjYXNlICovCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19FWFA6ICB7CiAgICAgICAgICAgICAgICBpZighY29udGV4dC0+bGFzdF93YXNfcmh3KSB7CiAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUCIpOwogICAgICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX0ZPR19DT09SRCkgJiYgY29udGV4dC0+Zm9nX2Nvb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDI6IHsKICAgICAgICAgICAgICAgIGlmKCFjb250ZXh0LT5sYXN0X3dhc19yaHcpIHsKICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUDIpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUDIiKTsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEVYVF9GT0dfQ09PUkQpICYmIGNvbnRleHQtPmZvZ19jb29yZCkgewogICAgICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Zm9nX2Nvb3JkID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19MSU5FQVI6IHsKICAgICAgICAgICAgICAgIGlmKCFjb250ZXh0LT5sYXN0X3dhc19yaHcpIHsKICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUik7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSIik7CiAgICAgICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmZvZ19jb29yZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfTk9ORTogewogICAgICAgICAgICAgICAgLyogQm90aCBhcmUgbm9uZT8gQWNjb3JkaW5nIHRvIG1zZG4gdGhlIGFscGhhIGNoYW5uZWwgb2YgdGhlIHNwZWN1bGFyCiAgICAgICAgICAgICAgICAgKiBjb2xvciBjb250YWlucyBhIGZvZyBmYWN0b3IuIFNldCBpdCBpbiBkcmF3U3RyaWRlZFNsb3cuCiAgICAgICAgICAgICAgICAgKiBTYW1lIGhhcHBlbnMgd2l0aCBWZXJ0ZXhmb2cgb24gdHJhbnNmb3JtZWQgdmVydGljZXMKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSkgewogICAgICAgICAgICAgICAgICAgIGlmKGNvbnRleHQtPmZvZ19jb29yZCA9PSBGQUxTRSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRk9HX0NPT1JESU5BVEVfRVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GT0dfQ09PUkRJTkFURV9FWFQpXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Zm9nX2Nvb3JkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9MSU5FQVIpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUikiKTsKICAgICAgICAgICAgICAgICAgICBmb2dzdGFydCA9IDB4ZmY7CiAgICAgICAgICAgICAgICAgICAgZm9nZW5kID0gMHgwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIEdMIGZvZywgaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUgaW4gZHJhd1N0cmlkZWRTbG93ICovCiAgICAgICAgICAgICAgICAgICAgZm9nZW5hYmxlID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OiBGSVhNRSgiVW5leHBlY3RlZCBXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERSAlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1ZFUlRFWE1PREVdKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGdsSGludChHTF9GT0dfSElOVCwgR0xfTklDRVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xIaW50KEdMX0ZPR19ISU5ULCBHTF9OSUNFU1QpIik7CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyID0gRkFMU0U7CgogICAgICAgIHN3aXRjaCAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1RBQkxFTU9ERV0pIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDoKICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfTU9ERSwgR0xfRVhQKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUCIpOwogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCIpOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmZvZ19jb29yZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfRVhQMjoKICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfTU9ERSwgR0xfRVhQMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFAyIik7CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEVYVF9GT0dfQ09PUkQpICYmIGNvbnRleHQtPmZvZ19jb29yZCkgewogICAgICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUIik7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Zm9nX2Nvb3JkID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19MSU5FQVI6CiAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9MSU5FQVIiKTsKICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX0ZPR19DT09SRCkgJiYgY29udGV4dC0+Zm9nX2Nvb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQiKTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX05PTkU6ICAgLyogV29uJ3QgaGFwcGVuICovCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBGSVhNRSgiVW5leHBlY3RlZCBXSU5FRDNEUlNfRk9HVEFCTEVNT0RFICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVEFCTEVNT0RFXSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmKGZvZ2VuYWJsZSkgewogICAgICAgIGdsRW5hYmxlKEdMX0ZPRyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0ZPRyIpOwoKICAgICAgICBpZihmb2dzdGFydCAhPSBmb2dlbmQpCiAgICAgICAgewogICAgICAgICAgICBnbEZvZ2Z2KEdMX0ZPR19TVEFSVCwgJmZvZ3N0YXJ0KTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9nZihHTF9GT0dfU1RBUlQsIGZvZ3N0YXJ0Iik7CiAgICAgICAgICAgIFRSQUNFKCJGb2cgU3RhcnQgPT0gJWZcbiIsIGZvZ3N0YXJ0KTsKCiAgICAgICAgICAgIGdsRm9nZnYoR0xfRk9HX0VORCwgJmZvZ2VuZCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2YoR0xfRk9HX0VORCwgZm9nZW5kIik7CiAgICAgICAgICAgIFRSQUNFKCJGb2cgRW5kID09ICVmXG4iLCBmb2dlbmQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBnbEZvZ2YoR0xfRk9HX1NUQVJULCAtMS4wIC8gMC4wKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9nZihHTF9GT0dfU1RBUlQsIGZvZ3N0YXJ0Iik7CiAgICAgICAgICAgIFRSQUNFKCJGb2cgU3RhcnQgPT0gJWZcbiIsIGZvZ3N0YXJ0KTsKCiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfRU5ELCAwLjApOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19FTkQsIGZvZ2VuZCIpOwogICAgICAgICAgICBUUkFDRSgiRm9nIEVuZCA9PSAlZlxuIiwgZm9nZW5kKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9GT0cpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfRk9HIik7CiAgICAgICAgaWYoIHVzZV9wcyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKSApIHsKICAgICAgICAgICAgLyogZGlzYWJsZSBmb2cgaW4gdGhlIHBpeGVsIHNoYWRlcgogICAgICAgICAgICAgKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICAgICAqIC0xLyhlLXMpIGFuZCBlLyhlLXMpIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsIDAuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19TVEFSVCwgZm9nc3RhcnQiKTsKICAgICAgICAgICAgZ2xGb2dmKEdMX0ZPR19FTkQsIDEuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19FTkQsIGZvZ2VuZCIpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcmFuZ2Vmb2coRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUkFOR0VGT0dFTkFCTEVdKSB7CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoTlZfRk9HX0RJU1RBTkNFKSkgewogICAgICAgICAgICBnbEZvZ2koR0xfRk9HX0RJU1RBTkNFX01PREVfTlYsIEdMX0VZRV9SQURJQUxfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19ESVNUQU5DRV9NT0RFX05WLCBHTF9FWUVfUkFESUFMX05WKSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFdBUk4oIlJhbmdlIGZvZyBlbmFibGVkLCBidXQgbm90IHN1cHBvcnRlZCBieSB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvblxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9GT0dfRElTVEFOQ0UpKSB7CiAgICAgICAgICAgIGdsRm9naShHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViwgR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViwgR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WKSIpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfZm9nY29sb3IoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBmbG9hdCBjb2xbNF07CiAgICBEM0RDT0xPUlRPR0xGTE9BVDQoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR0NPTE9SXSwgY29sKTsKICAgIGdsRm9nZnYoR0xfRk9HX0NPTE9SLCAmY29sWzBdKTsKICAgIGNoZWNrR0xjYWxsKCJnbEZvZyBHTF9GT0dfQ09MT1IiKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfZm9nZGVuc2l0eShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHRtcHZhbHVlOwogICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dERU5TSVRZXTsKICAgIGdsRm9nZnYoR0xfRk9HX0RFTlNJVFksICZ0bXB2YWx1ZS5mKTsKICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2YoR0xfRk9HX0RFTlNJVFksIChmbG9hdCkgVmFsdWUpIik7Cn0KCi8qIFRPRE86IE1lcmdlIHdpdGggcHJpbWl0aXZlIHR5cGUgKyBpbml0X21hdGVyaWFscygpISEgKi8Kc3RhdGljIHZvaWQgc3RhdGVfY29sb3JtYXQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBJV2luZUQzRERldmljZUltcGwgKmRldmljZSA9IChJV2luZUQzRERldmljZUltcGwgKilzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlOwogICAgR0xlbnVtIFBhcm0gPSAwOwogICAgV2luZURpcmVjdDNEU3RyaWRlZERhdGEgKmRpZmZ1c2UgPSAmZGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLmRpZmZ1c2U7CiAgICBCT09MIGlzRGlmZnVzZVN1cHBsaWVkOwoKICAgIC8qIERlcGVuZHMgb24gdGhlIGRlY29kZWQgdmVydGV4IGRlY2xhcmF0aW9uIHRvIHJlYWQgdGhlIGV4aXN0ZW5jZSBvZiBkaWZmdXNlIGRhdGEuCiAgICAgKiBUaGUgdmVydGV4IGRlY2xhcmF0aW9uIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBmaXhlZCBmdW5jdGlvbiBwaXBlbGluZSBpcyB1c2VkLgogICAgICovCgogICAgaWYoaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZERUNMKSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpc0RpZmZ1c2VTdXBwbGllZCA9IGRpZmZ1c2UtPmxwRGF0YSB8fCBkaWZmdXNlLT5WQk87CgogICAgY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHMgPSAwOwogICAgaWYgKGlzRGlmZnVzZVN1cHBsaWVkICYmIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUlZFUlRFWF0pIHsKICAgICAgICBUUkFDRSgiZGlmZiAlZCwgYW1iICVkLCBlbWlzICVkLCBzcGVjICVkXG4iLAogICAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0VdLAogICAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0VdLAogICAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFXSwKICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRV0pOwoKICAgICAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRV0gPT0gV0lORUQzRE1DU19DT0xPUjEpIHsKICAgICAgICAgICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgICAgICBQYXJtID0gR0xfQU1CSUVOVF9BTkRfRElGRlVTRTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFBhcm0gPSBHTF9ESUZGVVNFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+dW50cmFja2VkX21hdGVyaWFsc1tjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFsc10gPSBHTF9FTUlTU0lPTjsKICAgICAgICAgICAgICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LT51bnRyYWNrZWRfbWF0ZXJpYWxzW2NvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzXSA9IEdMX1NQRUNVTEFSOwogICAgICAgICAgICAgICAgY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRV0gPT0gV0lORUQzRE1DU19DT0xPUjEpIHsKICAgICAgICAgICAgUGFybSA9IEdMX0FNQklFTlQ7CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+dW50cmFja2VkX21hdGVyaWFsc1tjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFsc10gPSBHTF9FTUlTU0lPTjsKICAgICAgICAgICAgICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LT51bnRyYWNrZWRfbWF0ZXJpYWxzW2NvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzXSA9IEdMX1NQRUNVTEFSOwogICAgICAgICAgICAgICAgY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgIFBhcm0gPSBHTF9FTUlTU0lPTjsKICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LT51bnRyYWNrZWRfbWF0ZXJpYWxzW2NvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzXSA9IEdMX1NQRUNVTEFSOwogICAgICAgICAgICAgICAgY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgIFBhcm0gPSBHTF9TUEVDVUxBUjsKICAgICAgICB9CiAgICB9CgogICAgLyogTm90aGluZyBjaGFuZ2VkLCByZXR1cm4uICovCiAgICBpZiAoUGFybSA9PSBjb250ZXh0LT50cmFja2luZ19wYXJtKSByZXR1cm47CgogICAgaWYoIVBhcm0pIHsKICAgICAgICBnbERpc2FibGUoR0xfQ09MT1JfTUFURVJJQUwpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfQ09MT1JfTUFURVJJQUwiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xDb2xvck1hdGVyaWFsKEdMX0ZST05UX0FORF9CQUNLLCBQYXJtKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xDb2xvck1hdGVyaWFsKEdMX0ZST05UX0FORF9CQUNLLCBQYXJtKSIpOwogICAgICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfQ09MT1JfTUFURVJJQUwpIik7CiAgICB9CgogICAgLyogQXBwYXJlbnRseSBjYWxscyB0byBnbE1hdGVyaWFsZnYgYXJlIGlnbm9yZWQgZm9yIHByb3BlcnRpZXMgd2UncmUKICAgICAqIHRyYWNraW5nIHdpdGggZ2xDb2xvck1hdGVyaWFsLCBzbyBhcHBseSB0aG9zZSBoZXJlLiAqLwogICAgc3dpdGNoIChjb250ZXh0LT50cmFja2luZ19wYXJtKSB7CiAgICAgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgogICAgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlQsIChmbG9hdCopJmRldmljZS0+dXBkYXRlU3RhdGVCbG9jay0+bWF0ZXJpYWwuQW1iaWVudCk7CiAgICAgICAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgKGZsb2F0KikmZGV2aWNlLT51cGRhdGVTdGF0ZUJsb2NrLT5tYXRlcmlhbC5EaWZmdXNlKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdiIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBHTF9ESUZGVVNFOgogICAgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIChmbG9hdCopJmRldmljZS0+dXBkYXRlU3RhdGVCbG9jay0+bWF0ZXJpYWwuRGlmZnVzZSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZnYiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCAoZmxvYXQqKSZkZXZpY2UtPnVwZGF0ZVN0YXRlQmxvY2stPm1hdGVyaWFsLkFtYmllbnQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEdMX0VNSVNTSU9OOgogICAgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0VNSVNTSU9OLCAoZmxvYXQqKSZkZXZpY2UtPnVwZGF0ZVN0YXRlQmxvY2stPm1hdGVyaWFsLkVtaXNzaXZlKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdiIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKICAgICAgICAgICAgLyogT25seSBjaGFuZ2UgbWF0ZXJpYWwgY29sb3IgaWYgc3BlY3VsYXIgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIGl0IGlzIHNldCB0byBibGFjayAqLwogICAgICAgICAgICBpZiAoZGV2aWNlLT5zdGF0ZUJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEVdKSB7CiAgICAgICAgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSLCAoZmxvYXQqKSZkZXZpY2UtPnVwZGF0ZVN0YXRlQmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZnYiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZsb2F0IGJsYWNrWzRdID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwogICAgICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgJmJsYWNrWzBdKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZnYiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBjb250ZXh0LT50cmFja2luZ19wYXJtID0gUGFybTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfbGluZXBhdHRlcm4oRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgICAgICAgICAgICAgICAgIGQ7CiAgICAgICAgV0lORUQzRExJTkVQQVRURVJOICAgIGxwOwogICAgfSB0bXBwYXR0ZXJuOwogICAgdG1wcGF0dGVybi5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0xJTkVQQVRURVJOXTsKCiAgICBUUkFDRSgiTGluZSBwYXR0ZXJuOiByZXBlYXQgJWQgYml0cyAleFxuIiwgdG1wcGF0dGVybi5scC53UmVwZWF0RmFjdG9yLCB0bXBwYXR0ZXJuLmxwLndMaW5lUGF0dGVybik7CgogICAgaWYgKHRtcHBhdHRlcm4ubHAud1JlcGVhdEZhY3RvcikgewogICAgICAgIGdsTGluZVN0aXBwbGUodG1wcGF0dGVybi5scC53UmVwZWF0RmFjdG9yLCB0bXBwYXR0ZXJuLmxwLndMaW5lUGF0dGVybik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGluZVN0aXBwbGUocmVwZWF0LCBsaW5lcGF0dGVybikiKTsKICAgICAgICBnbEVuYWJsZShHTF9MSU5FX1NUSVBQTEUpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9MSU5FX1NUSVBQTEUpOyIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfTElORV9TVElQUExFKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX0xJTkVfU1RJUFBMRSk7Iik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3piaWFzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19aQklBU10pIHsKICAgICAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1pCSUFTXTsKICAgICAgICBUUkFDRSgiWkJpYXMgdmFsdWUgJWZcbiIsIHRtcHZhbHVlLmYpOwogICAgICAgIGdsUG9seWdvbk9mZnNldCgwLCAtdG1wdmFsdWUuZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUG9seWdvbk9mZnNldCgwLCAtVmFsdWUpIik7CiAgICAgICAgZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOyIpOwogICAgICAgIGdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9MSU5FKTsiKTsKICAgICAgICBnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9QT0lOVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UKTsiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7Iik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfTElORSk7Iik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UKTsiKTsKICAgIH0KfQoKCnN0YXRpYyB2b2lkIHN0YXRlX25vcm1hbGl6ZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKGlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WREVDTCkpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAvKiBXaXRob3V0IHZlcnRleCBub3JtYWxzLCB3ZSBzZXQgdGhlIGN1cnJlbnQgbm9ybWFsIHRvIDAvMC8wIHRvIHJlbW92ZSB0aGUgZGlmZnVzZSBmYWN0b3IKICAgICAqIGZyb20gdGhlIG9wZW5nbCBsaWdodGluZyBlcXVhdGlvbiwgYXMgZDNkIGRvZXMuIE5vcm1hbGl6YXRpb24gb2YgMC8wLzAgY2FuIGxlYWQgdG8gYSBkaXZpc2lvbgogICAgICogYnkgemVybyBhbmQgaXMgbm90IHByb3Blcmx5IGRlZmluZWQgaW4gb3BlbmdsLCBzbyBhdm9pZCBpdAogICAgICovCiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX05PUk1BTElaRU5PUk1BTFNdICYmICgKICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLm5vcm1hbC5scERhdGEgfHwKICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLm5vcm1hbC5WQk8pKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX05PUk1BTElaRSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9OT1JNQUxJWkUpOyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9wc2l6ZW1pbihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHRtcHZhbHVlOwoKICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTSVpFX01JTl07CiAgICBpZihHTF9TVVBQT1JUKEFSQl9QT0lOVF9QQVJBTUVURVJTKSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xQb2ludFBhcmFtZXRlcmZBUkIpKEdMX1BPSU5UX1NJWkVfTUlOX0FSQiwgdG1wdmFsdWUuZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUG9pbnRQYXJhbWV0ZXJmQVJCKC4uLiIpOwogICAgfQogICAgZWxzZSBpZihHTF9TVVBQT1JUKEVYVF9QT0lOVF9QQVJBTUVURVJTKSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xQb2ludFBhcmFtZXRlcmZFWFQpKEdMX1BPSU5UX1NJWkVfTUlOX0VYVCwgdG1wdmFsdWUuZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUG9pbnRQYXJhbWV0ZXJmRVhUKC4uLik7Iik7CiAgICB9IGVsc2UgaWYodG1wdmFsdWUuZiAhPSAxLjApIHsKICAgICAgICBGSVhNRSgiV0lORUQzRFJTX1BPSU5UU0laRV9NSU4gbm90IHN1cHBvcnRlZCBvbiB0aGlzIG9wZW5nbCwgdmFsdWUgaXMgJWZcbiIsIHRtcHZhbHVlLmYpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9wc2l6ZW1heChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHRtcHZhbHVlOwoKICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTSVpFX01BWF07CiAgICBpZihHTF9TVVBQT1JUKEFSQl9QT0lOVF9QQVJBTUVURVJTKSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xQb2ludFBhcmFtZXRlcmZBUkIpKEdMX1BPSU5UX1NJWkVfTUFYX0FSQiwgdG1wdmFsdWUuZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUG9pbnRQYXJhbWV0ZXJmQVJCKC4uLiIpOwogICAgfQogICAgZWxzZSBpZihHTF9TVVBQT1JUKEVYVF9QT0lOVF9QQVJBTUVURVJTKSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xQb2ludFBhcmFtZXRlcmZFWFQpKEdMX1BPSU5UX1NJWkVfTUFYX0VYVCwgdG1wdmFsdWUuZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUG9pbnRQYXJhbWV0ZXJmRVhUKC4uLik7Iik7CiAgICB9IGVsc2UgaWYodG1wdmFsdWUuZiAhPSA2NC4wKSB7CiAgICAgICAgRklYTUUoIldJTkVEM0RSU19QT0lOVFNJWkVfTUFYIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBvcGVuZ2wsIHZhbHVlIGlzICVmXG4iLCB0bXB2YWx1ZS5mKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcHNjYWxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyogVE9ETzogR3JvdXAgdGhpcyB3aXRoIHRoZSB2aWV3cG9ydCAqLwogICAgLyoKICAgICAqIFBPSU5UU0NBTEVFTkFCTEUgY29udHJvbHMgaG93IHBvaW50IHNpemUgdmFsdWUgaXMgdHJlYXRlZC4gSWYgc2V0IHRvCiAgICAgKiB0cnVlLCB0aGUgcG9pbnQgc2l6ZSBpcyBzY2FsZWQgd2l0aCByZXNwZWN0IHRvIGhlaWdodCBvZiB2aWV3cG9ydC4KICAgICAqIFdoZW4gc2V0IHRvIGZhbHNlIHBvaW50IHNpemUgaXMgaW4gcGl4ZWxzLgogICAgICoKICAgICAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9kaXJlY3R4OV9jL3BvaW50X3Nwcml0ZXMuYXNwCiAgICAgKi8KCiAgICAvKiBEZWZhdWx0IHZhbHVlcyAqLwogICAgR0xmbG9hdCBhdHRbM10gPSB7MS4wZiwgMC4wZiwgMC4wZn07CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSBwb2ludFNpemUsIEEsIEIsIEM7CgogICAgcG9pbnRTaXplLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTSVpFXTsKICAgIEEuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QT0lOVFNDQUxFX0FdOwogICAgQi5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU0NBTEVfQl07CiAgICBDLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTQ0FMRV9DXTsKCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRV0pIHsKICAgICAgICBHTGZsb2F0IHNjYWxlRmFjdG9yOwogICAgICAgIGZsb2F0IGggPSBzdGF0ZWJsb2NrLT52aWV3cG9ydC5IZWlnaHQ7CgogICAgICAgIGlmKHBvaW50U2l6ZS5mIDwgR0xfTElNSVRTKHBvaW50c2l6ZW1pbikpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTWluaW11bSB2YWxpZCBwb2ludCBzaXplIGZvciBPcGVuR0wgaXMgZHJpdmVyIHNwZWNpZmljLiBGb3IgRGlyZWN0M0QgaXQgaXMKICAgICAgICAgICAgICogMC4wZi4gVGhpcyBtZWFucyB0aGF0IE9wZW5HTCB3aWxsIGNsYW1wIHJlYWxseSBzbWFsbCBwb2ludCBzaXplcyB0byB0aGUKICAgICAgICAgICAgICogZHJpdmVyIG1pbmltdW0uIFRvIGNvcnJlY3QgZm9yIHRoaXMgd2UgbmVlZCB0byBtdWx0aXBseSBieSB0aGUgc2NhbGUgZmFjdG9yIHdoZW4gc2l6ZXMKICAgICAgICAgICAgICogYXJlIGxlc3MgdGhhbiAxLjBmLiBzY2FsZV9mYWN0b3IgPSAgMS4wZiAvIHBvaW50X3NpemUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzY2FsZUZhY3RvciA9IHBvaW50U2l6ZS5mIC8gR0xfTElNSVRTKHBvaW50c2l6ZW1pbik7CiAgICAgICAgICAgIC8qIENsYW1wIHRoZSBwb2ludCBzaXplLCBkb24ndCByZWx5IG9uIHRoZSBkcml2ZXIgdG8gZG8gaXQuIE1hY09TIHNheXMgbWluIHBvaW50IHNpemUKICAgICAgICAgICAgICogaXMgMS4wLCBidXQgdGhlbiBhY2NlcHRzIHBvaW50cyBiZWxvdyB0aGF0IGFuZCBkcmF3cyB0b28gc21hbGwgcG9pbnRzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwb2ludFNpemUuZiA9IEdMX0xJTUlUUyhwb2ludHNpemVtaW4pOwogICAgICAgIH0gZWxzZSBpZihwb2ludFNpemUuZiA+IEdMX0xJTUlUUyhwb2ludHNpemUpKSB7CiAgICAgICAgICAgIC8qIGdsIGFscmVhZHkgc2NhbGVzIHRoZSBpbnB1dCB0byBnbFBvaW50U2l6ZSwKICAgICAgICAgICAgICogZDNkIHNjYWxlcyB0aGUgcmVzdWx0IGFmdGVyIHRoZSBwb2ludCBzaXplIHNjYWxlLgogICAgICAgICAgICAgKiBJZiB0aGUgcG9pbnQgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGUgbWF4IHNpemUsIHVzZSB0aGUKICAgICAgICAgICAgICogc2NhbGluZyB0byBzY2FsZSBpdCBiaWdnZXIsIGFuZCBzZXQgdGhlIGdsIHBvaW50IHNpemUgdG8gbWF4CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzY2FsZUZhY3RvciA9IHBvaW50U2l6ZS5mIC8gR0xfTElNSVRTKHBvaW50c2l6ZSk7CiAgICAgICAgICAgIFRSQUNFKCJzY2FsZTogJWZcbiIsIHNjYWxlRmFjdG9yKTsKICAgICAgICAgICAgcG9pbnRTaXplLmYgPSBHTF9MSU1JVFMocG9pbnRzaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzY2FsZUZhY3RvciA9IDEuMGY7CiAgICAgICAgfQogICAgICAgIHNjYWxlRmFjdG9yID0gcG93KGggKiBzY2FsZUZhY3RvciwgMik7CgogICAgICAgIGF0dFswXSA9IEEuZiAvIHNjYWxlRmFjdG9yOwogICAgICAgIGF0dFsxXSA9IEIuZiAvIHNjYWxlRmFjdG9yOwogICAgICAgIGF0dFsyXSA9IEMuZiAvIHNjYWxlRmFjdG9yOwogICAgfQoKICAgIGlmKEdMX1NVUFBPUlQoQVJCX1BPSU5UX1BBUkFNRVRFUlMpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBvaW50UGFyYW1ldGVyZnZBUkIpKEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgYXR0KTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFBhcmFtZXRlcmZ2QVJCKEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgLi4uIik7CiAgICB9CiAgICBlbHNlIGlmKEdMX1NVUFBPUlQoRVhUX1BPSU5UX1BBUkFNRVRFUlMpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBvaW50UGFyYW1ldGVyZnZFWFQpKEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCwgYXR0KTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFBhcmFtZXRlcmZ2RVhUKEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCwgLi4uIik7CiAgICB9IGVsc2UgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEVdKSB7CiAgICAgICAgV0FSTigiUE9JTlRfUEFSQU1FVEVSUyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiBvcGVuZ2xcbiIpOwogICAgfQoKICAgIGdsUG9pbnRTaXplKHBvaW50U2l6ZS5mKTsKICAgIGNoZWNrR0xjYWxsKCJnbFBvaW50U2l6ZSguLi4pOyIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9jb2xvcndyaXRlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgVmFsdWUgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRV07CgogICAgVFJBQ0UoIkNvbG9yIG1hc2s6IHIoJWQpIGcoJWQpIGIoJWQpIGEoJWQpXG4iLAogICAgICAgIFZhbHVlICYgV0lORUQzRENPTE9SV1JJVEVFTkFCTEVfUkVEICAgPyAxIDogMCwKICAgICAgICBWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX0dSRUVOID8gMSA6IDAsCiAgICAgICAgVmFsdWUgJiBXSU5FRDNEQ09MT1JXUklURUVOQUJMRV9CTFVFICA/IDEgOiAwLAogICAgICAgIFZhbHVlICYgV0lORUQzRENPTE9SV1JJVEVFTkFCTEVfQUxQSEEgPyAxIDogMCk7CiAgICBnbENvbG9yTWFzayhWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX1JFRCAgID8gR0xfVFJVRSA6IEdMX0ZBTFNFLAogICAgICAgICAgICAgICAgVmFsdWUgJiBXSU5FRDNEQ09MT1JXUklURUVOQUJMRV9HUkVFTiA/IEdMX1RSVUUgOiBHTF9GQUxTRSwKICAgICAgICAgICAgICAgIFZhbHVlICYgV0lORUQzRENPTE9SV1JJVEVFTkFCTEVfQkxVRSAgPyBHTF9UUlVFIDogR0xfRkFMU0UsCiAgICAgICAgICAgICAgICBWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX0FMUEhBID8gR0xfVFJVRSA6IEdMX0ZBTFNFKTsKICAgIGNoZWNrR0xjYWxsKCJnbENvbG9yTWFzayguLi4pIik7CgogICAgLyogZGVwZW5kcyBvbiBXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRS4gKi8KICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMV0gIT0gMHgwMDAwMDAwRiB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUyXSAhPSAweDAwMDAwMDBGIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTNdICE9IDB4MDAwMDAwMEYgKSB7CiAgICAgICAgRVJSKCIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUxLzIvMywlZCwlZCwlZCkgbm90IHlldCBpbXBsZW1lbnRlZC4gTWlzc2luZyBvZiBjYXAgRDNEUE1JU0NDQVBTX0lOREVQRU5ERU5UV1JJVEVNQVNLUyB3YXNuJ3QgaG9ub3JlZD9cbiIsCiAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMV0sCiAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMl0sCiAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFM10pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9sb2NhbHZpZXdlcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19MT0NBTFZJRVdFUl0pIHsKICAgICAgICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgMSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRNb2RlbGkoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCAxKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgMCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRNb2RlbGkoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCAwKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9sYXN0cGl4ZWwoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTEFTVFBJWEVMXSkgewogICAgICAgIFRSQUNFKCJMYXN0IFBpeGVsIERyYXdpbmcgRW5hYmxlZFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIHN0YXRpYyBCT09MIGZpcnN0ID0gVFJVRTsKICAgICAgICBpZihmaXJzdCkgewogICAgICAgICAgICBGSVhNRSgiTGFzdCBQaXhlbCBEcmF3aW5nIERpc2FibGVkLCBub3QgaGFuZGxlZCB5ZXRcbiIpOwogICAgICAgICAgICBmaXJzdCA9IEZBTFNFOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFKCJMYXN0IFBpeGVsIERyYXdpbmcgRGlzYWJsZWQsIG5vdCBoYW5kbGVkIHlldFxuIik7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9wb2ludHNwcml0ZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFRPRE86IE5WX1BPSU5UX1NQUklURSAqLwogICAgaWYgKCFHTF9TVVBQT1JUKEFSQl9QT0lOVF9TUFJJVEUpKSB7CiAgICAgICAgVFJBQ0UoIlBvaW50IHNwcml0ZXMgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEVdKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX0FSQik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9BUkIpXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9BUkIpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX0FSQilcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV93cmFwKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyoqCiAgICAgaHR0cDovL3d3dy5jb3NjLmJyb2NrdS5jYS9PZmZlcmluZ3MvM1A5OC9jb3Vyc2UvbGVjdHVyZXMvdGV4dHVyZS8KICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2FyY2hpdmUvZGVmYXVsdC5hc3A/dXJsPS9hcmNoaXZlL2VuLXVzL2RpcmVjdHg5X2MvZGlyZWN0eC9ncmFwaGljcy9wcm9ncmFtbWluZ2d1aWRlL0ZpeGVkRnVuY3Rpb24vVGV4dHVyZXMvdGV4dHVyZXdyYXBwaW5nLmFzcAogICAgIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL3Byb2dyYW1taW5nL2ZlYXR1cmVzL3JlbmRlcmVyZGxsMy9wYWdlMi5hc3AKICAgICBEZXNjdXNzaW9uIHRoYXQgd2F5cyB0byB0dXJuIG9uIFdSQVBpbmcgdG8gc29sdmUgYW4gb3BlbmdsIGNvbnZlcnNpb24gcHJvYmxlbS4KICAgICBodHRwOi8vd3d3LmZsaXBjb2RlLm9yZy9jZ2ktYmluL2ZjbXNnLmNnaT90aHJlYWRfc2hvdz0xMDI0OAoKICAgICBzbyBmYXIgYXMgSSBjYW4gdGVsbCwgd3JhcHBpbmcgYW5kIHRleHR1cmUtY29vcmRpbmF0ZSBnZW5lcmF0ZSBnbyBoYW5kIGluIGhhbmQsCiAgICAgKi8KICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQM10gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQN10gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQOF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQOV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMTBdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUDExXSB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1dSQVAxMl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMTNdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUDE0XSB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1dSQVAxNV0gKSB7CiAgICAgICAgRklYTUUoIihXSU5FRDNEUlNfV1JBUDApIFRleHR1cmUgd3JhcGluZyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX211bHRpc2FtcGxlYWEoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZiggR0xfU1VQUE9SVChBUkJfTVVMVElTQU1QTEUpICkgewogICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBU10pIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX01VTFRJU0FNUExFX0FSQikiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbERpc2FibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9NVUxUSVNBTVBMRV9BUkIpIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVNdKSB7CiAgICAgICAgICAgIFdBUk4oIk11bHRpc2FtcGxlIGFudGlhbGlhc2luZyBub3Qgc3VwcG9ydGVkIGJ5IGdsXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3NjaXNzb3IoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0NJU1NPUlRFU1RFTkFCTEVdKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfZGVwdGhiaWFzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVNdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfREVQVEhCSUFTXSkgewogICAgICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0xPUEVTQ0FMRURFUFRIQklBU107CiAgICAgICAgZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpIik7CiAgICAgICAgZ2xQb2x5Z29uT2Zmc2V0KHRtcHZhbHVlLmYsICooKGZsb2F0Kikmc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0RFUFRIQklBU10pKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2x5Z29uT2Zmc2V0KC4uLikiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcGVyc3BlY3RpdmUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1RFWFRVUkVQRVJTUEVDVElWRV0pIHsKICAgICAgICBnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9OSUNFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9OSUNFU1QpIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsSGludChHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMX0ZBU1RFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9GQVNURVNUKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9zdGlwcGxlZGFscGhhKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVElQUExFREFMUEhBXSkKICAgICAgICBGSVhNRSgiIFN0aXBwbGVkIEFscGhhIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2FudGlhbGlhcyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5USUFMSUFTXSkKICAgICAgICBGSVhNRSgiIEFudGlhbGlhcyBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9tdWx0aXNhbXBtYXNrKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19NVUxUSVNBTVBMRU1BU0tdICE9IDB4RkZGRkZGRkYpCiAgICAgICAgRklYTUUoIihXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLXSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BhdGNoZWRnZXN0eWxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QQVRDSEVER0VTVFlMRV0gIT0gV0lORUQzRFBBVENIRURHRV9ESVNDUkVURSkKICAgICAgICBGSVhNRSgiKFdJTkVEM0RSU19QQVRDSEVER0VTVFlMRSwlZCkgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BBVENIRURHRVNUWUxFXSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BhdGNoc2VnbWVudHMoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKICAgIHRtcHZhbHVlLmYgPSAxLjBmOwoKICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUEFUQ0hTRUdNRU5UU10gIT0gdG1wdmFsdWUuZCkKICAgIHsKICAgICAgICBzdGF0aWMgQk9PTCBkaXNwbGF5ZWQgPSBGQUxTRTsKCiAgICAgICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QQVRDSFNFR01FTlRTXTsKICAgICAgICBpZighZGlzcGxheWVkKQogICAgICAgICAgICBGSVhNRSgiKFdJTkVEM0RSU19QQVRDSFNFR01FTlRTLCVmKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCB0bXB2YWx1ZS5mKTsKCiAgICAgICAgZGlzcGxheWVkID0gVFJVRTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcG9zaXRpb25kZWdyZWUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBUUkFDRSgiU3R1YlxuIik7CiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFXSAhPSBXSU5FRDNEREVHUkVFX0NVQklDKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9TSVRJT05ERUdSRUVdKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfbm9ybWFsZGVncmVlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19OT1JNQUxERUdSRUVdICE9IFdJTkVEM0RERUdSRUVfTElORUFSKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX05PUk1BTERFR1JFRSwlZCkgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX05PUk1BTERFR1JFRV0pOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV90ZXNzZWxsYXRpb24oRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBUUkFDRSgiU3R1YlxuIik7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU5BQkxFQURBUFRJVkVURVNTRUxMQVRJT05dKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU5BQkxFQURBUFRJVkVURVNTRUxMQVRJT05dKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfc2VwYXJhdGVibGVuZChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEVdKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSwlZCkgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRV0pOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV93cmFwdShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQVV0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19XUkFQVSBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfd3JhcHYoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUFZdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfV1JBUFYgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX21vbm9lbmFibGUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTU9OT0VOQUJMRV0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19NT05PRU5BQkxFIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9yb3AyKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1JPUDJdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfUk9QMiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcGxhbmVtYXNrKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BMQU5FTUFTS10pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19QTEFORU1BU0sgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3N1YnBpeGVsKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NVQlBJWEVMXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1NVQlBJWEVMIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9zdWJwaXhlbHgoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1VCUElYRUxYXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1NVQlBJWEVMWCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc3RpcHBsZWVuYWJsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVElQUExFRU5BQkxFXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1NUSVBQTEVFTkFCTEUgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2JvcmRlcmNvbG9yKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JPUkRFUkNPTE9SXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX0JPUkRFUkNPTE9SIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9taXBtYXBsb2RiaWFzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX01JUE1BUExPREJJQVNdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfTUlQTUFQTE9EQklBUyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfYW5pc290cm9weShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTklTT1RST1BZXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX0FOSVNPVFJPUFkgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2ZsdXNoYmF0Y2goRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRkxVU0hCQVRDSF0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19GTFVTSEJBVENIIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV90cmFuc2x1Y2VudHNpKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1RSQU5TTFVDRU5UU09SVElOREVQRU5ERU5UXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1RSQU5TTFVDRU5UU09SVElOREVQRU5ERU5UIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9leHRlbnRzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0VYVEVOVFNdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfRVhURU5UUyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfY2tleWJsZW5kKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SS0VZQkxFTkRFTkFCTEVdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfQ09MT1JLRVlCTEVOREVOQUJMRSBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKLyogQWN0aXZhdGVzIHRoZSB0ZXh0dXJlIGRpbWVuc2lvbiBhY2NvcmRpbmcgdG8gdGhlIGJvdW5kIEQzRCB0ZXh0dXJlLgogKiBEb2VzIG5vdCBjYXJlIGZvciB0aGUgY29sb3JvcCBvciBjb3JyZWN0IGdsIHRleHR1cmUgdW5pdCh3aGVuIHVzaW5nIG52cmMpCiAqIFJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYWN0aXZhdGUgdGhlIGNvcnJlY3QgdW5pdCBiZWZvcmUKICovCnN0YXRpYyB2b2lkIGFjdGl2YXRlX2RpbWVuc2lvbnMoRFdPUkQgc3RhZ2UsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBCT09MIGJ1bXBtYXAgPSBGQUxTRTsKCiAgICBpZihzdGFnZSA+IDAgJiYgKHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZSAtIDFdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHx8CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZSAtIDFdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQKSkgewogICAgICAgIGJ1bXBtYXAgPSBUUlVFOwogICAgICAgIGNvbnRleHQtPnRleFNoYWRlckJ1bXBNYXAgfD0gKDEgPDwgc3RhZ2UpOwogICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0LT50ZXhTaGFkZXJCdW1wTWFwICY9IH4oMSA8PCBzdGFnZSk7CiAgICB9CgogICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZXNbc3RhZ2VdKSB7CiAgICAgICAgc3dpdGNoKHN0YXRlYmxvY2stPnRleHR1cmVEaW1lbnNpb25zW3N0YWdlXSkgewogICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIGJ1bXBtYXAgPyBHTF9PRkZTRVRfVEVYVFVSRV8yRF9OViA6IEdMX1RFWFRVUkVfMkQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIC4uLikiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX1JFQ1RBTkdMRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQjoKICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIyKSkgewogICAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX1NIQURFUl9OViwgR0xfU0hBREVSX09QRVJBVElPTl9OViwgYnVtcG1hcCA/IEdMX09GRlNFVF9URVhUVVJFXzJEX05WIDogR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCAuLi4pIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpIik7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzNEOgogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFXzNEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX1JFQ1RBTkdMRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzJEKSIpOwogICAgICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9BUkI6CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQikiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8yRCkiKTsKICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfUkVDVEFOR0xFKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9OT05FKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4RW52aShHTF9URVhUVVJFX1NIQURFUl9OViwgR0xfU0hBREVSX09QRVJBVElPTl9OViwgR0xfTk9ORSkiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpIik7CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzNEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9SRUNUQU5HTEUpKSB7CiAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEJpbmRpbmcgdGV4dHVyZXMgaXMgZG9uZSBieSBzYW1wbGVycy4gQSBkdW1teSB0ZXh0dXJlIHdpbGwgYmUgYm91bmQgKi8KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRleF9jb2xvcm9wKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgc3RhZ2UgPSAoc3RhdGUgLSBTVEFURV9URVhUVVJFU1RBR0UoMCwgMCkpIC8gV0lORUQzRF9ISUdIRVNUX1RFWFRVUkVfU1RBVEU7CiAgICBEV09SRCBtYXBwZWRfc3RhZ2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3N0YWdlXTsKICAgIEJPT0wgdGV4X3VzZWQgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5maXhlZF9mdW5jdGlvbl91c2FnZV9tYXBbc3RhZ2VdOwoKICAgIFRSQUNFKCJTZXR0aW5nIGNvbG9yIG9wIGZvciBzdGFnZSAlZFxuIiwgc3RhZ2UpOwoKICAgIGlmIChzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciAmJiBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wc19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmCiAgICAgICAgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+YmFzZVNoYWRlci5mdW5jdGlvbikgewogICAgICAgIC8qIFVzaW5nIGEgcGl4ZWwgc2hhZGVyPyBEb24ndCBjYXJlIGZvciBhbnl0aGluZyBoZXJlLCB0aGUgc2hhZGVyIGFwcGx5aW5nIGRvZXMgaXQgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHN0YWdlICE9IG1hcHBlZF9zdGFnZSkgV0FSTigiVXNpbmcgbm9uIDE6MSBtYXBwaW5nOiAlZCAtPiAlZCFcbiIsIHN0YWdlLCBtYXBwZWRfc3RhZ2UpOwoKICAgIGlmIChtYXBwZWRfc3RhZ2UgIT0gLTEpIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICBpZiAodGV4X3VzZWQgJiYgbWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyh0ZXh0dXJlcykpIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJBdHRlbXB0IHRvIGVuYWJsZSB1bnN1cHBvcnRlZCBzdGFnZSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgfSBlbHNlIGlmIChzdGFnZSA+IDApIHsKICAgICAgICAgICAgV0FSTigiUHJvZ3JhbSB1c2luZyBtdWx0aXBsZSBjb25jdXJyZW50IHRleHR1cmVzIHdoaWNoIHRoaXMgb3BlbmdsIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoTlZfUkVHSVNURVJfQ09NQklORVJTKSkgewogICAgICAgIGlmKHN0YXRlYmxvY2stPmxvd2VzdF9kaXNhYmxlZF9zdGFnZSA+IDApIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfUkVHSVNURVJfQ09NQklORVJTX05WKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyUGFyYW1ldGVyaU5WKEdMX05VTV9HRU5FUkFMX0NPTUJJTkVSU19OViwgc3RhdGVibG9jay0+bG93ZXN0X2Rpc2FibGVkX3N0YWdlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1JFR0lTVEVSX0NPTUJJTkVSU19OVik7CiAgICAgICAgfQogICAgfQogICAgaWYoc3RhZ2UgPj0gc3RhdGVibG9jay0+bG93ZXN0X2Rpc2FibGVkX3N0YWdlKSB7CiAgICAgICAgVFJBQ0UoIlN0YWdlIGRpc2FibGVkXG4iKTsKICAgICAgICBpZiAobWFwcGVkX3N0YWdlICE9IC0xKSB7CiAgICAgICAgICAgIC8qIERpc2FibGUgZXZlcnl0aGluZyBoZXJlICovCiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzJEKSIpOwogICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9DVUJFX01BUCkpIHsKICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0NVQkVfTUFQX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfUkVDVEFOR0xFKSkgewogICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQikiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikgJiYgbWFwcGVkX3N0YWdlIDwgR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9OT05FKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBbGwgZG9uZSAqLwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBUaGUgc2FtcGxlciB3aWxsIGFsc28gYWN0aXZhdGUgdGhlIGNvcnJlY3QgdGV4dHVyZSBkaW1lbnNpb25zLCBzbyBubyBuZWVkIHRvIGRvIGl0IGhlcmUKICAgICAqIGlmIHRoZSBzYW1wbGVyIGZvciB0aGlzIHN0YWdlIGlzIGRpcnR5CiAgICAgKi8KICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfU0FNUExFUihzdGFnZSkpKSB7CiAgICAgICAgaWYgKHRleF91c2VkKSBhY3RpdmF0ZV9kaW1lbnNpb25zKHN0YWdlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KCiAgICAvKiBTZXQgdGhlIHRleHR1cmUgY29tYmluZXJzICovCiAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgc2V0X3RleF9vcF9udnJjKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIEZBTFNFLCBzdGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19DT0xPUk9QXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19DT0xPUkFSRzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JBUkcwXSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9zdGFnZSk7CgogICAgICAgIC8qIEluIHJlZ2lzdGVyIGNvbWJpbmVycyBidW1wIG1hcHBpbmcgaXMgZG9uZSBpbiB0aGUgc3RhZ2UgQUZURVIgdGhlIG9uZSB0aGF0IGhhcyB0aGUgYnVtcCBtYXAgb3BlcmF0aW9uIHNldCwKICAgICAgICAgKiB0aHVzIHRoZSB0ZXh0dXJlIHNoYWRlciBtYXkgaGF2ZSB0byBiZSB1cGRhdGVkCiAgICAgICAgICovCiAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgICAgIEJPT0wgdXNlc0J1bXAgPSAoc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9ST1BdID09IFdJTkVEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19DT0xPUk9QXSA9PSBXSU5FRDNEVE9QX0JVTVBFTlZNQVApID8gVFJVRSA6IEZBTFNFOwogICAgICAgICAgICBCT09MIHVzZWRCdW1wID0gKGNvbnRleHQtPnRleFNoYWRlckJ1bXBNYXAgJiAxIDw8IChzdGFnZSArIDEpKSA/IFRSVUUgOiBGQUxTRTsKICAgICAgICAgICAgaWYodXNlc0J1bXAgIT0gdXNlZEJ1bXApIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSArIDEpKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVRleHR1cmVBUkIiKTsKICAgICAgICAgICAgICAgIGFjdGl2YXRlX2RpbWVuc2lvbnMoc3RhZ2UgKyAxLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzZXRfdGV4X29wKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIEZBTFNFLCBzdGFnZSwKICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JPUF0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMV0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMl0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMF0pOwogICAgfQp9CgpzdGF0aWMgdm9pZCB0ZXhfYWxwaGFvcChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwogICAgRFdPUkQgbWFwcGVkX3N0YWdlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dGV4VW5pdE1hcFtzdGFnZV07CiAgICBCT09MIHRleF91c2VkID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+Zml4ZWRfZnVuY3Rpb25fdXNhZ2VfbWFwW3N0YWdlXTsKICAgIERXT1JEIG9wLCBhcmcxLCBhcmcyLCBhcmcwOwoKICAgIFRSQUNFKCJTZXR0aW5nIGFscGhhIG9wIGZvciBzdGFnZSAlZFxuIiwgc3RhZ2UpOwogICAgLyogRG8gbm90IGNhcmUgZm9yIGVuYWJsZWQgLyBkaXNhYmxlZCBzdGFnZXMsIGp1c3QgYXNzaWduIHRoZSBzZXR0aWducy4gY29sb3JvcCBkaXNhYmxlcyAvIGVuYWJsZXMgcmVxdWlyZWQgc3R1ZmYgKi8KICAgIGlmIChtYXBwZWRfc3RhZ2UgIT0gLTEpIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICBpZiAodGV4X3VzZWQgJiYgbWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyh0ZXh0dXJlcykpIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJBdHRlbXB0IHRvIGVuYWJsZSB1bnN1cHBvcnRlZCBzdGFnZSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgfSBlbHNlIGlmIChzdGFnZSA+IDApIHsKICAgICAgICAgICAgLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSAqLwogICAgICAgICAgICBXQVJOKCJQcm9ncmFtIHVzaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgdGV4dHVyZXMgd2hpY2ggdGhpcyBvcGVuZ2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBvcCA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19BTFBIQU9QXTsKICAgIGFyZzEgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcxXTsKICAgIGFyZzIgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcyXTsKICAgIGFyZzAgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcwXTsKCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIHN0YWdlID09IDAgJiYKICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVzWzBdICYmCiAgICAgICAoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbMF0gPT0gR0xfVEVYVFVSRV8yRCB8fCBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1swXSA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpKSB7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlSW1wbCAqc3VyZiA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopICgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1swXSktPnN1cmZhY2VzWzBdOwoKICAgICAgICBpZihzdXJmLT5DS2V5RmxhZ3MgJiBXSU5FRERTRF9DS1NSQ0JMVCAmJgogICAgICAgICAgIGdldEZvcm1hdERlc2NFbnRyeShzdXJmLT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpLT5hbHBoYU1hc2sgPT0gMHgwMDAwMDAwMCkgewoKICAgICAgICAgICAgLyogQ29sb3Iga2V5aW5nIG5lZWRzIHRvIHBhc3MgYWxwaGEgdmFsdWVzIGZyb20gdGhlIHRleHR1cmUgdGhyb3VnaCB0byBoYXZlIHRoZSBhbHBoYSB0ZXN0IHdvcmsgcHJvcGVybHkuCiAgICAgICAgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kIGFwcGxpY2F0aW9ucyBjYW4gc3RpbGwgdXNlIHRleHR1cmUgY29tYmluZXJzIGFwcGFyZW50bHkuIFRoaXMgY29kZSB0YWtlcyBjYXJlIHRoYXQgYXBwcwogICAgICAgICAgICAgKiBjYW5ub3QgcmVtb3ZlIHRoZSB0ZXh0dXJlJ3MgYWxwaGEgY2hhbm5lbCBlbnRpcmVseS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlIGZpeHVwIGlzIHJlcXVpcmVkIGZvciBQcmluY2Ugb2YgUGVyc2lhIDNEKHByaXNvbiBiYXJzKSwgd2hpbGUgTW90byByYWNlciAyIHJlcXVpcmVzIEQzRFRPUF9NT0RVTEFURSB0byB3b3JrCiAgICAgICAgICAgICAqIG9uIGNvbG9yIGtleWVkIHN1cmZhY2VzLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBXaGF0IHRvIGRvIHdpdGggbXVsdGl0ZXh0dXJpbmc/IFNvIGZhciBubyBhcHAgaGFzIGJlZW4gZm91bmQgdGhhdCB1c2VzIGNvbG9yIGtleWluZyB3aXRoIG11bHRpdGV4dHVyaW5nCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZihvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIG9wID0gV0lORUQzRFRPUF9TRUxFQ1RBUkcxOwogICAgICAgICAgICBpZihvcCA9PSBXSU5FRDNEVE9QX1NFTEVDVEFSRzEpIGFyZzEgPSBXSU5FRDNEVEFfVEVYVFVSRTsKICAgICAgICAgICAgZWxzZSBpZihvcCA9PSBXSU5FRDNEVE9QX1NFTEVDVEFSRzIpIGFyZzIgPSBXSU5FRDNEVEFfVEVYVFVSRTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0UoIlNldHRpbmcgYWxwaGEgb3AgZm9yIHN0YWdlICVkXG4iLCBzdGFnZSk7CiAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgc2V0X3RleF9vcF9udnJjKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIFRSVUUsIHN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgb3AsIGFyZzEsIGFyZzIsIGFyZzAsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfc3RhZ2UpOwogICAgfSBlbHNlIHsKICAgICAgICBzZXRfdGV4X29wKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIFRSVUUsIHN0YWdlLAogICAgICAgICAgICAgICAgICAgIG9wLCBhcmcxLCBhcmcyLCBhcmcwKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgdHJhbnNmb3JtX3RleHR1cmUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCB0ZXhVbml0ID0gc3RhdGUgLSBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwKTsKICAgIERXT1JEIG1hcHBlZF9zdGFnZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnRleFVuaXRNYXBbdGV4VW5pdF07CiAgICBCT09MIGdlbmVyYXRlZDsKCiAgICAvKiBJZ25vcmUgdGhpcyB3aGVuIGEgdmVydGV4IHNoYWRlciBpcyB1c2VkLCBvciBpZiB0aGUgc3RyZWFtcyBhcmVuJ3Qgc29ydGVkIG91dCB5ZXQgKi8KICAgIGlmKHVzZV92cyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKSB8fAogICAgICAgaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZERUNMKSkgewogICAgICAgIFRSQUNFKCJVc2luZyBhIHZlcnRleCBzaGFkZXIsIG9yIHN0cmVhbSBzb3VyY2VzIG5vdCBzb3J0ZWQgb3V0IHlldCwgc2tpcHBpbmdcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAobWFwcGVkX3N0YWdlID09IC0xKSByZXR1cm47CgogICAgaWYgKEdMX1NVUFBPUlQoQVJCX01VTFRJVEVYVFVSRSkpIHsKICAgICAgICBpZihtYXBwZWRfc3RhZ2UgPj0gR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVRleHR1cmVBUkIiKTsKICAgIH0gZWxzZSBpZiAobWFwcGVkX3N0YWdlID4gMCkgewogICAgICAgIC8qIFdlIGNhbid0IGRvIGFueXRoaW5nIGhlcmUgKi8KICAgICAgICBXQVJOKCJQcm9ncmFtIHVzaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgdGV4dHVyZXMgd2hpY2ggdGhpcyBvcGVuZ2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBnZW5lcmF0ZWQgPSAoc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3RleFVuaXRdW1dJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWF0gJiAweEZGRkYwMDAwKSAhPSBXSU5FRDNEVFNTX1RDSV9QQVNTVEhSVTsKCiAgICBzZXRfdGV4dHVyZV9tYXRyaXgoKGZsb2F0ICopJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1RFWFRVUkUwICsgdGV4VW5pdF0udS5tWzBdWzBdLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbdGV4VW5pdF1bV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1NdLAogICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxhc3Rfd2FzX3JodywKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy50ZXhDb29yZHNbdGV4VW5pdF0uZHdTdHJpZGUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy50ZXhDb29yZHNbdGV4VW5pdF0uZHdUeXBlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFQ0xUWVBFX1VOVVNFRCk7CgogICAgLyogVGhlIHNhbXBsZXIgYXBwbHlpbmcgZnVuY3Rpb24gY2FsbHMgdXMgaWYgdGhpcyBjaGFuZ2VzICovCiAgICBpZihjb250ZXh0LT5sYXN0V2FzUG93MlRleHR1cmVbdGV4VW5pdF0gJiYgc3RhdGVibG9jay0+dGV4dHVyZXNbdGV4VW5pdF0pIHsKICAgICAgICBpZihnZW5lcmF0ZWQpIHsKICAgICAgICAgICAgRklYTUUoIk5vbi1wb3dlcjIgdGV4dHVyZSBiZWluZyB1c2VkIHdpdGggZ2VuZXJhdGVkIHRleHR1cmUgY29vcmRzXG4iKTsKICAgICAgICB9CiAgICAgICAgVFJBQ0UoIk5vbiBwb3dlciB0d28gbWF0cml4IG11bHRpcGx5IGZpeHVwXG4iKTsKICAgICAgICBnbE11bHRNYXRyaXhmKCgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1t0ZXhVbml0XSktPmJhc2VUZXh0dXJlLnBvdzJNYXRyaXgpOwogICAgfQp9CgpzdGF0aWMgdm9pZCB1bmxvYWRUZXhDb29yZHMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaykgewogICAgaW50IHRleHR1cmVfaWR4OwoKICAgIGZvciAodGV4dHVyZV9pZHggPSAwOyB0ZXh0dXJlX2lkeCA8IEdMX0xJTUlUUyh0ZXh0dXJlX3N0YWdlcyk7ICsrdGV4dHVyZV9pZHgpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyB0ZXh0dXJlX2lkeCkpOwogICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBsb2FkVGV4Q29vcmRzKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhICpzZCwgR0xpbnQgKmN1clZCTykgewogICAgVUlOVCAqb2Zmc2V0ID0gc3RhdGVibG9jay0+c3RyZWFtT2Zmc2V0OwogICAgdW5zaWduZWQgaW50IG1hcHBlZF9zdGFnZSA9IDA7CiAgICB1bnNpZ25lZCBpbnQgdGV4dHVyZU5vID0gMDsKCiAgICAvKiBUaGUgY29kZSBiZWxvdyB1c2VzIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSBhbmQgZ2xNdWx0aVRleENvb3JkKiB3aGljaCBhcmUgYWxsIHBhcnQgb2YgdGhlIEdMX0FSQl9tdWx0aXRleHR1cmUgZXh0ZW5zaW9uLiAqLwogICAgLyogQWJvcnQgaWYgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uLiAqLwogICAgaWYgKCFHTF9TVVBQT1JUKEFSQl9NVUxUSVRFWFRVUkUpKSB7CiAgICAgICAgRklYTUUoIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKHRleHR1cmVObyA9IDA7IHRleHR1cmVObyA8IEdMX0xJTUlUUyh0ZXh0dXJlX3N0YWdlcyk7ICsrdGV4dHVyZU5vKSB7CiAgICAgICAgaW50IGNvb3JkSWR4ID0gc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3RleHR1cmVOb11bV0lORUQzRFRTU19URVhDT09SRElOREVYXTsKCiAgICAgICAgbWFwcGVkX3N0YWdlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dGV4VW5pdE1hcFt0ZXh0dXJlTm9dOwogICAgICAgIGlmIChtYXBwZWRfc3RhZ2UgPT0gLTEpIGNvbnRpbnVlOwoKICAgICAgICBpZiAoY29vcmRJZHggPCBNQVhfVEVYVFVSRVMgJiYgKHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5scERhdGEgfHwgc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLlZCTykpIHsKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgdXAgdGV4dHVyZSAldSwgaWR4ICVkLCBjb3JkaW5keCAldSwgZGF0YSAlcFxuIiwKICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlTm8sIG1hcHBlZF9zdGFnZSwgY29vcmRJZHgsIHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5scERhdGEpOwoKICAgICAgICAgICAgaWYgKCpjdXJWQk8gIT0gc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLlZCTykgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfQVJSQVlfQlVGRkVSX0FSQiwgc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLlZCTykpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQmluZEJ1ZmZlckFSQiIpOwogICAgICAgICAgICAgICAgKmN1clZCTyA9IHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5WQk87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDbGllbnRBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xDbGllbnRBY3RpdmVUZXh0dXJlQVJCIik7CgogICAgICAgICAgICAvKiBUaGUgY29vcmRzIHRvIHN1cHBseSBkZXBlbmQgY29tcGxldGVseSBvbiB0aGUgZnZmIC8gdmVydGV4IHNoYWRlciAqLwogICAgICAgICAgICBnbFRleENvb3JkUG9pbnRlcigKICAgICAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5kd1R5cGUpLAogICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX0dMVFlQRShzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uZHdTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uZHdTdHJpZGUgKyBvZmZzZXRbc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLnN0cmVhbU5vXSk7CiAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbE11bHRpVGV4Q29vcmQ0ZkFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UsIDAsIDAsIDAsIDEpKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgLyogVGhlIG51bWJlciBvZiB0aGUgbWFwcGVkIHN0YWdlcyBpbmNyZWFzZXMgbW9ub3RvbmljYWxseSwgc28gaXQncyBmaW5lIHRvIHVzZSB0aGUgbGFzdCB1c2VkIG9uZSAqLwogICAgICAgIGZvciAodGV4dHVyZU5vID0gbWFwcGVkX3N0YWdlICsgMTsgdGV4dHVyZU5vIDwgR0xfTElNSVRTKHRleHR1cmVzKTsgKyt0ZXh0dXJlTm8pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbE11bHRpVGV4Q29vcmQ0ZkFSQihHTF9URVhUVVJFMF9BUkIgKyB0ZXh0dXJlTm8sIDAsIDAsIDAsIDEpKTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRleF9jb29yZGluZGV4KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgc3RhZ2UgPSAoc3RhdGUgLSBTVEFURV9URVhUVVJFU1RBR0UoMCwgMCkpIC8gV0lORUQzRF9ISUdIRVNUX1RFWFRVUkVfU1RBVEU7CiAgICBEV09SRCBtYXBwZWRfc3RhZ2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3N0YWdlXTsKCiAgICBpZiAobWFwcGVkX3N0YWdlID09IC0xKSB7CiAgICAgICAgVFJBQ0UoIk5vIHRleHR1cmUgdW5pdCBtYXBwZWQgdG8gc3RhZ2UgJWQuIFNraXBwaW5nIHRleHR1cmUgY29vcmRpbmF0ZXMuXG4iLCBzdGFnZSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChHTF9TVVBQT1JUKEFSQl9NVUxUSVRFWFRVUkUpKSB7CiAgICAgICAgaWYobWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyhmcmFnbWVudF9zYW1wbGVycykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UpKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICB9IGVsc2UgaWYgKHN0YWdlID4gMCkgewogICAgICAgIC8qIFdlIGNhbid0IGRvIGFueXRoaW5nIGhlcmUgKi8KICAgICAgICBXQVJOKCJQcm9ncmFtIHVzaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgdGV4dHVyZXMgd2hpY2ggdGhpcyBvcGVuZ2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogVmFsdWVzIDAtNyBhcmUgaW5kZXhlcyBpbnRvIHRoZSBGVkYgdGV4IGNvb3JkcyAtIFNlZSBjb21tZW50cyBpbiBEcmF3UHJpbWl0aXZlCiAgICAgKgogICAgICogRklYTUU6IEZyb20gTVNETjogVGhlIFdJTkVEM0RUU1NfVENJXyogZmxhZ3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gSWYgeW91IGluY2x1ZGUKICAgICAqIG9uZSBmbGFnLCB5b3UgY2FuIHN0aWxsIHNwZWNpZnkgYW4gaW5kZXggdmFsdWUsIHdoaWNoIHRoZSBzeXN0ZW0gdXNlcyB0bwogICAgICogZGV0ZXJtaW5lIHRoZSB0ZXh0dXJlIHdyYXBwaW5nIG1vZGUuCiAgICAgKiBlZy4gU2V0VGV4dHVyZVN0YWdlU3RhdGUoIDAsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCwgV0lORUQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTiB8IDEgKTsKICAgICAqIG1lYW5zIHVzZSB0aGUgdmVydGV4IHBvc2l0aW9uIChjYW1lcmEtc3BhY2UpIGFzIHRoZSBpbnB1dCB0ZXh0dXJlIGNvb3JkaW5hdGVzCiAgICAgKiBmb3IgdGhpcyB0ZXh0dXJlIHN0YWdlLCBhbmQgdGhlIHdyYXAgbW9kZSBzZXQgaW4gdGhlIFdJTkVEM0RSU19XUkFQMSByZW5kZXIKICAgICAqIHN0YXRlLiBXZSBkbyBub3QgKHlldCkgc3VwcG9ydCB0aGUgV0lORUQzRFJFTkRFUlNUQVRFX1dSQVB4IHZhbHVlcywgbm9yIHRpZSB0aGVtIHVwCiAgICAgKiB0byB0aGUgVEVYQ09PUkRJTkRFWCB2YWx1ZQogICAgICovCgogICAgLyoKICAgICAqIEJlIGNhcmVmdWwgdGhlIHZhbHVlIG9mIHRoZSBtYXNrIDB4RjAwMDAgY29tZSBmcm9tIGQzZDh0eXBlcy5oIGluZm9zCiAgICAgKi8KICAgIHN3aXRjaCAoc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX1RFWENPT1JESU5ERVhdICYgMHhGRkZGMDAwMCkgewogICAgY2FzZSBXSU5FRDNEVFNTX1RDSV9QQVNTVEhSVToKICAgICAgICAvKlVzZSB0aGUgc3BlY2lmaWVkIHRleHR1cmUgY29vcmRpbmF0ZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgdmVydGV4IGZvcm1hdC4gVGhpcyB2YWx1ZSByZXNvbHZlcyB0byB6ZXJvLiovCiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1MpOwogICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9UKTsKICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1EpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUyxULFIsUSkiKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFdJTkVEM0RUU1NfVENJX0NBTUVSQVNQQUNFUE9TSVRJT046CiAgICAgICAgLyogQ2FtZXJhU3BhY2VQb3NpdGlvbiBtZWFucyB1c2UgdGhlIHZlcnRleCBwb3NpdGlvbiwgdHJhbnNmb3JtZWQgdG8gY2FtZXJhIHNwYWNlLAogICAgICAgICAqIGFzIHRoZSBpbnB1dCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZvciB0aGlzIHN0YWdlJ3MgdGV4dHVyZSB0cmFuc2Zvcm1hdGlvbi4gVGhpcwogICAgICAgICAqIGVxdWF0ZXMgcm91Z2hseSB0byBFWUVfTElORUFSCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICBmbG9hdCBzX3BsYW5lW10gPSB7IDEuMCwgMC4wLCAwLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCB0X3BsYW5lW10gPSB7IDAuMCwgMS4wLCAwLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCByX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAxLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCBxX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAwLjAsIDEuMCB9OwogICAgICAgICAgICBUUkFDRSgiV0lORUQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTiAtIFNldCBleWUgcGxhbmVcbiIpOwoKICAgICAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOwogICAgICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1MsIEdMX0VZRV9QTEFORSwgc19wbGFuZSk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfVCwgR0xfRVlFX1BMQU5FLCB0X3BsYW5lKTsKICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9SLCBHTF9FWUVfUExBTkUsIHJfcGxhbmUpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1EsIEdMX0VZRV9QTEFORSwgcV9wbGFuZSk7CiAgICAgICAgICAgIGdsUG9wTWF0cml4KCk7CgogICAgICAgICAgICBUUkFDRSgiV0lORUQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTiAtIFNldCBHTF9URVhUVVJFX0dFTl94IGFuZCBHTF94LCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSXG4iKTsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9TKTsiKTsKICAgICAgICAgICAgZ2xUZXhHZW5pKEdMX1MsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX0VZRV9MSU5FQVIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1MsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX0VZRV9MSU5FQVIpIik7CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fVCk7Iik7CiAgICAgICAgICAgIGdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1IpOyIpOwogICAgICAgICAgICBnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfRVlFX0xJTkVBUik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfRVlFX0xJTkVBUikiKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRU5PUk1BTDoKICAgICAgICB7CiAgICAgICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX1RFWEdFTl9SRUZMRUNUSU9OKSkgewogICAgICAgICAgICAgICAgZmxvYXQgc19wbGFuZVtdID0geyAxLjAsIDAuMCwgMC4wLCAwLjAgfTsKICAgICAgICAgICAgICAgIGZsb2F0IHRfcGxhbmVbXSA9IHsgMC4wLCAxLjAsIDAuMCwgMC4wIH07CiAgICAgICAgICAgICAgICBmbG9hdCByX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAxLjAsIDAuMCB9OwogICAgICAgICAgICAgICAgZmxvYXQgcV9wbGFuZVtdID0geyAwLjAsIDAuMCwgMC4wLCAxLjAgfTsKICAgICAgICAgICAgICAgIFRSQUNFKCJXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRU5PUk1BTCAtIFNldCBleWUgcGxhbmVcbiIpOwoKICAgICAgICAgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwogICAgICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CiAgICAgICAgICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9TLCBHTF9FWUVfUExBTkUsIHNfcGxhbmUpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9ULCBHTF9FWUVfUExBTkUsIHRfcGxhbmUpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9SLCBHTF9FWUVfUExBTkUsIHJfcGxhbmUpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9RLCBHTF9FWUVfUExBTkUsIHFfcGxhbmUpOwogICAgICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKCiAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9TKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9TKTsiKTsKICAgICAgICAgICAgICAgIGdsVGV4R2VuaShHTF9TLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9OT1JNQUxfTUFQX05WKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEdlbmkoR0xfUywgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfTk9STUFMX01BUF9OVikiKTsKICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpOyIpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5pKEdMX1QsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX05PUk1BTF9NQVBfTlYpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9OT1JNQUxfTUFQX05WKSIpOwogICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUik7Iik7CiAgICAgICAgICAgICAgICBnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfTk9STUFMX01BUF9OVik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1IsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX05PUk1BTF9NQVBfTlYpIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVJFRkxFQ1RJT05WRUNUT1I6CiAgICAgICAgewogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9URVhHRU5fUkVGTEVDVElPTikpIHsKICAgICAgICAgICAgZmxvYXQgc19wbGFuZVtdID0geyAxLjAsIDAuMCwgMC4wLCAwLjAgfTsKICAgICAgICAgICAgZmxvYXQgdF9wbGFuZVtdID0geyAwLjAsIDEuMCwgMC4wLCAwLjAgfTsKICAgICAgICAgICAgZmxvYXQgcl9wbGFuZVtdID0geyAwLjAsIDAuMCwgMS4wLCAwLjAgfTsKICAgICAgICAgICAgZmxvYXQgcV9wbGFuZVtdID0geyAwLjAsIDAuMCwgMC4wLCAxLjAgfTsKICAgICAgICAgICAgVFJBQ0UoIldJTkVEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUiAtIFNldCBleWUgcGxhbmVcbiIpOwoKICAgICAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOwogICAgICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1MsIEdMX0VZRV9QTEFORSwgc19wbGFuZSk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfVCwgR0xfRVlFX1BMQU5FLCB0X3BsYW5lKTsKICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9SLCBHTF9FWUVfUExBTkUsIHJfcGxhbmUpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1EsIEdMX0VZRV9QTEFORSwgcV9wbGFuZSk7CiAgICAgICAgICAgIGdsUG9wTWF0cml4KCk7CgogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9TKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1MpOyIpOwogICAgICAgICAgICBnbFRleEdlbmkoR0xfUywgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfUkVGTEVDVElPTl9NQVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1MsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX1JFRkxFQ1RJT05fTUFQX05WKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9UKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpOyIpOwogICAgICAgICAgICBnbFRleEdlbmkoR0xfVCwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfUkVGTEVDVElPTl9NQVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1QsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX1JFRkxFQ1RJT05fTUFQX05WKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1IpOyIpOwogICAgICAgICAgICBnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfUkVGTEVDVElPTl9NQVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1IsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX1JFRkxFQ1RJT05fTUFQX05WKSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIC8qIFVuaGFuZGxlZCB0eXBlczogKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgLyogVG9kbzogKi8KICAgICAgICAvKiA/IGRpc2FibGUgR0xfVEVYVFVSRV9HRU5fbiA/ICovCiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1MpOwogICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9UKTsKICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1EpOwogICAgICAgIEZJWE1FKCJVbmhhbmRsZWQgV0lORUQzRFRTU19URVhDT09SRElOREVYICV4XG4iLCBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWF0pOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIFVwZGF0ZSB0aGUgdGV4dHVyZSBtYXRyaXggKi8KICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCArIHN0YWdlKSkpIHsKICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZShTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwICsgc3RhZ2UpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KCiAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZERUNMKSAmJiBjb250ZXh0LT5uYW1lZEFycmF5c0xvYWRlZCkgewogICAgICAgIC8qIFJlbG9hZCB0aGUgYXJyYXlzIGlmIHdlIGFyZSB1c2luZyBmaXhlZCBmdW5jdGlvbiBhcnJheXMgdG8gcmVmbGVjdCB0aGUgc2VsZWN0ZWQgY29vcmQgaW5wdXQKICAgICAgICAgKiBzb3VyY2UuIENhbGwgbG9hZFRleENvb3JkcyBkaXJlY3RseSBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwYXJzZSB0aGUgdmVydGV4IGRlY2xhcmF0aW9uCiAgICAgICAgICogYW5kIGRvIGFsbCB0aGUgdGhpbmdzIGxpbmtlZCB0byBpdAogICAgICAgICAqIFRPRE86IFRpZHkgdGhhdCB1cCB0byByZWxvYWQgb25seSB0aGUgYXJyYXlzIG9mIHRoZSBjaGFuZ2VkIHVuaXQKICAgICAgICAgKi8KICAgICAgICBHTGludCBjdXJWQk8gPSBHTF9TVVBQT1JUKEFSQl9WRVJURVhfQlVGRkVSX09CSkVDVCkgPyAtMSA6IDA7CgogICAgICAgIHVubG9hZFRleENvb3JkcyhzdGF0ZWJsb2NrKTsKICAgICAgICBsb2FkVGV4Q29vcmRzKHN0YXRlYmxvY2ssICZzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMsICZjdXJWQk8pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzaGFkZXJjb25zdGFudChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZTsKCiAgICAvKiBWZXJ0ZXggYW5kIHBpeGVsIHNoYWRlciBzdGF0ZXMgd2lsbCBjYWxsIGEgc2hhZGVyIHVwbG9hZCwgZG9uJ3QgZG8gYW55dGhpbmcgYXMgbG9uZyBvbmUgb2YgdGhlbQogICAgICogaGFzIGFuIHVwZGF0ZSBwZW5kaW5nCiAgICAgKi8KICAgIGlmKGlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WREVDTCkgfHwKICAgICAgIGlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9QSVhFTFNIQURFUikpIHsKICAgICAgIHJldHVybjsKICAgIH0KCiAgICBkZXZpY2UtPnNoYWRlcl9iYWNrZW5kLT5zaGFkZXJfbG9hZF9jb25zdGFudHMoKElXaW5lRDNERGV2aWNlICopIGRldmljZSwgdXNlX3BzKGRldmljZSksIHVzZV92cyhkZXZpY2UpKTsKfQoKc3RhdGljIHZvaWQgdGV4X2J1bXBlbnZsc2NhbGUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCBzdGFnZSA9IChzdGF0ZSAtIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCAwKSkgLyBXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURTsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHRtcHZhbHVlOwoKICAgIGlmKHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyICYmIHN0YWdlICE9IDAgJiYKICAgICAgICgoSVdpbmVEM0RQaXhlbFNoYWRlckltcGwgKikgc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpLT5iYXNlU2hhZGVyLnJlZ19tYXBzLmx1bWluYW5jZXBhcmFtcyA9PSBzdGFnZSkgewogICAgICAgIC8qIFRoZSBwaXhlbCBzaGFkZXIgaGFzIHRvIGtub3cgdGhlIGx1bWluYW5jZSBzY2FsZS4gRG8gYSBjb25zdGFudHMgdXBkYXRlIGlmIGl0CiAgICAgICAgICogaXNuJ3Qgc2NoZWR1bGVkIGFueXdheQogICAgICAgICAqLwogICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCkgJiYKICAgICAgICAgICAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9QSVhFTFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFXTsKICAgIGlmKHRtcHZhbHVlLmYgIT0gMC4wKSB7CiAgICAgICAgRklYTUUoIldJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRleF9idW1wZW52bG9mZnNldChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYoc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIgJiYgc3RhZ2UgIT0gMCAmJgogICAgICAgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKSBzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciktPmJhc2VTaGFkZXIucmVnX21hcHMubHVtaW5hbmNlcGFyYW1zID09IHN0YWdlKSB7CiAgICAgICAgLyogVGhlIHBpeGVsIHNoYWRlciBoYXMgdG8ga25vdyB0aGUgbHVtaW5hbmNlIG9mZnNldC4gRG8gYSBjb25zdGFudHMgdXBkYXRlIGlmIGl0CiAgICAgICAgICogaXNuJ3Qgc2NoZWR1bGVkIGFueXdheQogICAgICAgICAqLwogICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCkgJiYKICAgICAgICAgICAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9QSVhFTFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVF07CiAgICBpZih0bXB2YWx1ZS5mICE9IDAuMCkgewogICAgICAgIEZJWE1FKCJXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgdGV4X3Jlc3VsdGFyZyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwoKICAgIGlmKHN0YWdlID49IEdMX0xJTUlUUyh0ZXh0dXJlX3N0YWdlcykpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX1JFU1VMVEFSR10gIT0gV0lORUQzRFRBX0NVUlJFTlQpIHsKICAgICAgICBGSVhNRSgiV0lORUQzRFRTU19SRVNVTFRBUkcgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzYW1wbGVyKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgc2FtcGxlciA9IHN0YXRlIC0gU1RBVEVfU0FNUExFUigwKTsKICAgIERXT1JEIG1hcHBlZF9zdGFnZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnRleFVuaXRNYXBbc2FtcGxlcl07CiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgZjsKICAgICAgICBEV09SRCBkOwogICAgfSB0bXB2YWx1ZTsKCiAgICBUUkFDRSgiU2FtcGxlcjogJWRcbiIsIHNhbXBsZXIpOwogICAgLyogRW5hYmxpbmcgYW5kIGRpc2FibGluZyB0ZXh0dXJlIGRpbWVuc2lvbnMgaXMgZG9uZSBieSB0ZXh0dXJlIHN0YWdlIHN0YXRlIC8gcGl4ZWwgc2hhZGVyIHNldHVwLCB0aGlzIGZ1bmN0aW9uCiAgICAgKiBvbmx5IGhhcyB0byBiaW5kIHRleHR1cmVzIGFuZCBzZXQgdGhlIHBlciB0ZXh0dXJlIHN0YXRlcwogICAgICovCgogICAgaWYgKG1hcHBlZF9zdGFnZSA9PSAtMSkgewogICAgICAgIFRSQUNFKCJObyBzYW1wbGVyIG1hcHBlZCB0byBzdGFnZSAlZC4gUmV0dXJuaW5nLlxuIiwgc2FtcGxlcik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChHTF9TVVBQT1JUKEFSQl9NVUxUSVRFWFRVUkUpKSB7CiAgICAgICAgaWYgKG1hcHBlZF9zdGFnZSA+PSBHTF9MSU1JVFMoY29tYmluZWRfc2FtcGxlcnMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgbWFwcGVkX3N0YWdlKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgfSBlbHNlIGlmIChzYW1wbGVyID4gMCkgewogICAgICAgIC8qIFdlIGNhbid0IGRvIGFueXRoaW5nIGhlcmUgKi8KICAgICAgICBXQVJOKCJQcm9ncmFtIHVzaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgdGV4dHVyZXMgd2hpY2ggdGhpcyBvcGVuZ2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZXNbc2FtcGxlcl0pIHsKICAgICAgICBCT09MIHRleElzUG93MiA9IEZBTFNFOwoKICAgICAgICAvKiBUaGUgZml4ZWQgZnVuY3Rpb24gbnAyIHRleHR1cmUgZW11bGF0aW9uIHVzZXMgdGhlIHRleHR1cmUgbWF0cml4IHRvIGZpeCB1cCB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgKiBJV2luZUQzREJhc2VUZXh0dXJlOjpBcHBseVN0YXRlQ2hhbmdlcyBtdWx0aXBsaWVzIHRoZSBzZXQgbWF0cml4IHdpdGggYSBmaXh1cCBtYXRyaXguIEJlZm9yZSB0aGUKICAgICAgICAgKiBzY2FsaW5nIGlzIHJlYXBwbGllZCBvciByZW1vdmVkLCB0aGUgdGV4dHVyZSBtYXRyaXggaGFzIHRvIGJlIHJlYXBwbGllZAogICAgICAgICAqLwogICAgICAgIGlmKCFHTF9TVVBQT1JUKEFSQl9URVhUVVJFX05PTl9QT1dFUl9PRl9UV08pICYmIHNhbXBsZXIgPCBNQVhfVEVYVFVSRVMpIHsKICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbc2FtcGxlcl0gPT0gR0xfVEVYVFVSRV8yRCB8fAogICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1tzYW1wbGVyXSA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpIHsKICAgICAgICAgICAgICAgIGlmKCgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSktPmJhc2VUZXh0dXJlLnBvdzJNYXRyaXhbMF0gIT0gMS4wIHx8CiAgICAgICAgICAgICAgICAgICAoKElXaW5lRDNEVGV4dHVyZUltcGwgKikgc3RhdGVibG9jay0+dGV4dHVyZXNbc2FtcGxlcl0pLT5iYXNlVGV4dHVyZS5wb3cyTWF0cml4WzVdICE9IDEuMCApIHsKICAgICAgICAgICAgICAgICAgICB0ZXhJc1BvdzIgPSBUUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbc2FtcGxlcl0gPT0gR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpIHsKICAgICAgICAgICAgICAgIGlmKCgoSVdpbmVEM0RDdWJlVGV4dHVyZUltcGwgKikgc3RhdGVibG9jay0+dGV4dHVyZXNbc2FtcGxlcl0pLT5iYXNlVGV4dHVyZS5wb3cyTWF0cml4WzBdICE9IDEuMCkgewogICAgICAgICAgICAgICAgICAgIHRleElzUG93MiA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHRleElzUG93MiB8fCBjb250ZXh0LT5sYXN0V2FzUG93MlRleHR1cmVbc2FtcGxlcl0pIHsKICAgICAgICAgICAgICAgIGNvbnRleHQtPmxhc3RXYXNQb3cyVGV4dHVyZVtzYW1wbGVyXSA9IHRleElzUG93MjsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTAgKyBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3NhbXBsZXJdKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIElXaW5lRDNEQmFzZVRleHR1cmVfUHJlTG9hZCgoSVdpbmVEM0RCYXNlVGV4dHVyZSAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSk7CiAgICAgICAgSVdpbmVEM0RCYXNlVGV4dHVyZV9BcHBseVN0YXRlQ2hhbmdlcyhzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSwgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3NhbXBsZXJdLCBzdGF0ZWJsb2NrLT5zYW1wbGVyU3RhdGVbc2FtcGxlcl0pOwoKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9MT0RfQklBUykpIHsKICAgICAgICAgICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtXSU5FRDNEU0FNUF9NSVBNQVBMT0RCSUFTXTsKICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRklMVEVSX0NPTlRST0xfRVhULAogICAgICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQsCiAgICAgICAgICAgICAgICAgICAgICB0bXB2YWx1ZS5mKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4RW52aSBHTF9URVhUVVJFX0xPRF9CSUFTX0VYVCAuLi4iKTsKICAgICAgICB9CgogICAgICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wc19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmIHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyICYmCiAgICAgICAgICAgICgoSVdpbmVEM0RQaXhlbFNoYWRlckltcGwgKilzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciktPmJhc2VTaGFkZXIuZnVuY3Rpb24pIHsKICAgICAgICAgICAgLyogVXNpbmcgYSBwaXhlbCBzaGFkZXI/IFZlcmlmeSB0aGUgc2FtcGxlciB0eXBlcyAqLwoKICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHRleHR1cmUgZGltZW5zaW9ucyBhcmUgZW5hYmxlZC4gSSBkb24ndCBoYXZlIHRvIGRpc2FibGUgdGhlIG90aGVyCiAgICAgICAgICAgICAqIGRpbWVuc2lvbnMgYmVjYXVzZSB0aGUgc2hhZGVyIGtub3dzIGZyb20gd2hpY2ggdGV4dHVyZSB0eXBlIHRvIHNhbXBsZSBmcm9tLiBGb3IgdGhlIHNha2Ugb2YKICAgICAgICAgICAgICogZGVidWdnaW5nIGFsbCBkaW1lbnNpb25zIGNvdWxkIGJlIGVuYWJsZWQgYW5kIGEgdGV4dHVyZSB3aXRoIHNvbWUgdWdseSBwaW5rIGJvdW5kIHRvIHRoZSB1bnVzZWQKICAgICAgICAgICAgICogZGltZW5zaW9ucy4gVGhpcyBzaG91bGQgbWFrZSB3cm9uZyBzYW1wbGluZyBzb3VyY2VzIHZpc2libGUgOi0pCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbEVuYWJsZShzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1tzYW1wbGVyXSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1tzYW1wbGVyXSkiKTsKICAgICAgICB9IGVsc2UgaWYoc2FtcGxlciA8IHN0YXRlYmxvY2stPmxvd2VzdF9kaXNhYmxlZF9zdGFnZSkgewogICAgICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RFWFRVUkVTVEFHRShzYW1wbGVyLCBXSU5FRDNEVFNTX0NPTE9ST1ApKSkgewogICAgICAgICAgICAgICAgYWN0aXZhdGVfZGltZW5zaW9ucyhzYW1wbGVyLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFXSAmJiBzYW1wbGVyID09IDApIHsKICAgICAgICAgICAgICAgIC8qIElmIGNvbG9yIGtleWluZyBpcyBlbmFibGVkIHVwZGF0ZSB0aGUgYWxwaGEgdGVzdCwgaXQgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlCiAgICAgICAgICAgICAgICAgKiBvZiBhIGNvbG9yIGtleSBpbiBzdGFnZSAwCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHN0YXRlX2FscGhhKFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYobWFwcGVkX3N0YWdlIDwgR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgIGlmKHNhbXBsZXIgPCBzdGF0ZWJsb2NrLT5sb3dlc3RfZGlzYWJsZWRfc3RhZ2UpIHsKICAgICAgICAgICAgLyogVE9ETzogV2hhdCBzaG91bGQgSSBkbyB3aXRoIHBpeGVsIHNoYWRlcnMgaGVyZSA/Pz8gKi8KICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9URVhUVVJFU1RBR0Uoc2FtcGxlciwgV0lORUQzRFRTU19DT0xPUk9QKSkpIHsKICAgICAgICAgICAgICAgIGFjdGl2YXRlX2RpbWVuc2lvbnMoc2FtcGxlciwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IC8qIE90aGVyd2lzZSB0ZXhfY29sb3JvcCBkaXNhYmxlcyB0aGUgc3RhZ2UgKi8KICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmR1bW15VGV4dHVyZU5hbWVbc2FtcGxlcl0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmR1bW15VGV4dHVyZU5hbWVbc2FtcGxlcl0pIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHBpeGVsc2hhZGVyKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgSVdpbmVEM0REZXZpY2VJbXBsICpkZXZpY2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlOwogICAgQk9PTCB1c2VfcHNoYWRlciA9IHVzZV9wcyhkZXZpY2UpOwogICAgQk9PTCB1c2VfdnNoYWRlciA9IHVzZV92cyhkZXZpY2UpOwogICAgQk9PTCB1cGRhdGVfZm9nID0gRkFMU0U7CiAgICBpbnQgaTsKCiAgICBpZiAodXNlX3BzaGFkZXIpIHsKICAgICAgICBpZighY29udGV4dC0+bGFzdF93YXNfcHNoYWRlcikgewogICAgICAgICAgICAvKiBGb3JtZXIgZHJhdyB3aXRob3V0IGEgcGl4ZWwgc2hhZGVyLCBzb21lIHNhbXBsZXJzCiAgICAgICAgICAgICAqIG1heSBiZSBkaXNhYmxlZCBiZWNhdXNlIG9mIFdJTkVEM0RUU1NfQ09MT1JPUCA9IFdJTkVEM0RUT1BfRElTQUJMRQogICAgICAgICAgICAgKiBtYWtlIHN1cmUgdG8gZW5hYmxlIHRoZW0KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcihpPTA7IGkgPCBNQVhfRlJBR01FTlRfU0FNUExFUlM7IGkrKykgewogICAgICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9TQU1QTEVSKGkpKSkgewogICAgICAgICAgICAgICAgICAgIHNhbXBsZXIoU1RBVEVfU0FNUExFUihpKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXBkYXRlX2ZvZyA9IFRSVUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiBPdGhlcndpc2UgYWxsIHNhbXBsZXJzIHdlcmUgYWN0aXZhdGVkIGJ5IHRoZSBjb2RlIGFib3ZlIGluIGVhcmxpZXIgZHJhd3MsIG9yIGJ5IHNhbXBsZXIoKQogICAgICAgICAgICAqIGlmIGEgZGlmZmVyZW50IHRleHR1cmUgd2FzIGJvdW5kLiBJIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuCiAgICAgICAgICAgICovCiAgICAgICAgfQoKICAgICAgICAvKiBDb21waWxlIGFuZCBiaW5kIHRoZSBzaGFkZXIgKi8KICAgICAgICBJV2luZUQzRFBpeGVsU2hhZGVyX0NvbXBpbGVTaGFkZXIoc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBEaXNhYmxlZCB0aGUgcGl4ZWwgc2hhZGVyIC0gY29sb3Igb3BzIHdlcmVuJ3QgYXBwbGllZAogICAgICAgICAqIHdoaWxlIGl0IHdhcyBlbmFibGVkLCBzbyByZS1hcHBseSB0aGVtLgogICAgICAgICAqLwogICAgICAgIGZvcihpPTA7IGkgPCBNQVhfVEVYVFVSRVM7IGkrKykgewogICAgICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RFWFRVUkVTVEFHRShpLCBXSU5FRDNEVFNTX0NPTE9ST1ApKSkgewogICAgICAgICAgICAgICAgdGV4X2NvbG9yb3AoU1RBVEVfVEVYVFVSRVNUQUdFKGksIFdJTkVEM0RUU1NfQ09MT1JPUCksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGNvbnRleHQtPmxhc3Rfd2FzX3BzaGFkZXIpCiAgICAgICAgICAgIHVwZGF0ZV9mb2cgPSBUUlVFOwogICAgfQoKICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU3RhdGVUYWJsZVtTVEFURV9WU0hBREVSXS5yZXByZXNlbnRhdGl2ZSkpIHsKICAgICAgICBkZXZpY2UtPnNoYWRlcl9iYWNrZW5kLT5zaGFkZXJfc2VsZWN0KChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIHVzZV9wc2hhZGVyLCB1c2VfdnNoYWRlcik7CgogICAgICAgIGlmICghaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZFUlRFWFNIQURFUkNPTlNUQU5UKSAmJiAodXNlX3ZzaGFkZXIgfHwgdXNlX3BzaGFkZXIpKSB7CiAgICAgICAgICAgIHNoYWRlcmNvbnN0YW50KFNUQVRFX1ZFUlRFWFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgaWYodXBkYXRlX2ZvZykKICAgICAgICBzdGF0ZV9mb2coc3RhdGUsIHN0YXRlYmxvY2ssIGNvbnRleHQpOwoKICAgIGNvbnRleHQtPmxhc3Rfd2FzX3BzaGFkZXIgPSB1c2VfcHNoYWRlcjsKfQoKc3RhdGljIHZvaWQgdGV4X2J1bXBlbnZtYXQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCBzdGFnZSA9IChzdGF0ZSAtIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCAwKSkgLyBXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURTsKCiAgICBpZihzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciAmJiBzdGFnZSAhPSAwICYmCiAgICAgICAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopIHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+bmVlZHNidW1wbWF0ID09IHN0YWdlKSB7CiAgICAgICAgLyogVGhlIHBpeGVsIHNoYWRlciBoYXMgdG8ga25vdyB0aGUgYnVtcCBlbnYgbWF0cml4LiBEbyBhIGNvbnN0YW50cyB1cGRhdGUgaWYgaXQgaXNuJ3Qgc2NoZWR1bGVkCiAgICAgICAgICogYW55d2F5CiAgICAgICAgICovCiAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9QSVhFTFNIQURFUkNPTlNUQU5UKSAmJgogICAgICAgICAgICFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVIpKSB7CiAgICAgICAgICAgIHNoYWRlcmNvbnN0YW50KFNUQVRFX1BJWEVMU0hBREVSQ09OU1RBTlQsIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZihHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkpIHsKICAgICAgICBpZihzdGFnZSA+PSBHTF9MSU1JVFModGV4dHVyZV9zdGFnZXMpKSB7CiAgICAgICAgICAgIFdBUk4oIkJ1bXAgZW52IG1hdHJpeCBvZiB1bnN1cHBvcnRlZCBzdGFnZSBzZXRcbiIpOwogICAgICAgIH0gZWxzZSBpZihHTF9TVVBQT1JUKEFSQl9NVUxUSVRFWFRVUkUpKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIHN0YWdlKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBzdGFnZSkpIik7CiAgICAgICAgfQogICAgICAgIEdMX0VYVENBTEwoZ2xUZXhCdW1wUGFyYW1ldGVyZnZBVEkoR0xfQlVNUF9ST1RfTUFUUklYX0FUSSwKICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSAmKHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTUFUMDBdKSkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSIpOwogICAgfQogICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgLyogRGlyZWN0M0Qgc2V0cyB0aGUgbWF0cml4IGluIHRoZSBzdGFnZSByZWFkaW5nIHRoZSBwZXJ0dXJiYXRpb24gbWFwLiBUaGUgcmVzdWx0IGlzIHVzZWQgdG8KICAgICAgICAgKiBvZmZzZXQgdGhlIGRlc3RpbmF0aW9uIHN0YWdlKGFsd2F5cyBzdGFnZSArIDEgaW4gZDNkKS4gSW4gR0xfTlZfdGV4dHVyZV9zaGFkZXIsIHRoZSBidW1wCiAgICAgICAgICogbWFwIG9mZnNldGluZyBpcyBkb25lIGluIHRoZSBzdGFnZSByZWFkaW5nIHRoZSBidW1wIG1hcHBlZCB0ZXh0dXJlLCBhbmQgdGhlIHBlcnR1cmJhdGlvbgogICAgICAgICAqIG1hcCBpcyByZWFkIGZyb20gYSBzcGVjaWZpZWQgc291cmNlIHN0YWdlKGFsd2F5cyBzdGFnZSAtIDEgZm9yIGQzZCkuIFRodXMgc2V0IHRoZSBtYXRyaXgKICAgICAgICAgKiBmb3Igc3RhZ2UgKyAxLiBLZWVwIHRoZSBudnJjIHRleCB1bml0IG1hcHBpbmcgaW4gbWluZCB0b28KICAgICAgICAgKi8KICAgICAgICBEV09SRCBtYXBwZWRfc3RhZ2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3N0YWdlICsgMV07CgogICAgICAgIGlmKG1hcHBlZF9zdGFnZSA8IEdMX0xJTUlUUyh0ZXh0dXJlcykpIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgbWFwcGVkX3N0YWdlKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UpKSIpOwoKICAgICAgICAgICAgZ2xUZXhFbnZmdihHTF9URVhUVVJFX1NIQURFUl9OViwgR0xfT0ZGU0VUX1RFWFRVUkVfTUFUUklYX05WLAogICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopICYoc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMF0pKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4RW52ZnYoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX09GRlNFVF9URVhUVVJFX01BVFJJWF9OViwgbWF0KVxuIik7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fd29ybGQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0cmFuc2Zvcm1fdmlldyBiZWxvdyBpZiB0aGUgdmlldyBtYXRyaXggd2FzIGNoYW5nZWQgdG9vCiAgICAgKgogICAgICogRGVsaWJlcmF0ZWx5IG5vIGNoZWNrIGlmIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24gaXMgZGlydHkgYmVjYXVzZSB0aGUgdmRlY2wgc3RhdGUKICAgICAqIGRvZXMgbm90IGFsd2F5cyB1cGRhdGUgdGhlIHdvcmxkIG1hdHJpeCwgb25seSBvbiBhIHN3aXRjaCBiZXR3ZWVuIHRyYW5zZm9ybWVkCiAgICAgKiBhbmQgdW50cmFubnNmb3JtZWQgZHJhd3MuIEl0ICptYXkqIGhhcHBlbiB0aGF0IHRoZSB3b3JsZCBtYXRyaXggaXMgc2V0IDIgdGltZXMgZHVyaW5nIG9uZQogICAgICogZHJhdywgYnV0IHRoYXQgc2hvdWxkIGJlIHJhdGhlciByYXJlIGFuZCBjaGVhcGVyIGluIHRvdGFsLgogICAgICovCiAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKICAgIGNoZWNrR0xjYWxsKCJnbE1hdHJpeE1vZGUiKTsKCiAgICBpZihjb250ZXh0LT5sYXN0X3dhc19yaHcpIHsKICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSgpIik7CiAgICB9IGVsc2UgewogICAgICAgIC8qIEluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB2aWV3IG1hdHJpeCBpcyB0aGUgaWRlbnRpdHkgbWF0cml4ICovCiAgICAgICAgaWYgKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnZpZXdfaWRlbnQpIHsKICAgICAgICAgICAgZ2xMb2FkTWF0cml4ZigoZmxvYXQgKikgJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1dPUkxETUFUUklYKDApXS51Lm1bMF1bMF0pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMb2FkTWF0cml4ZiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsTG9hZE1hdHJpeGYoKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMb2FkTWF0cml4ZiIpOwogICAgICAgICAgICBnbE11bHRNYXRyaXhmKChmbG9hdCAqKSAmc3RhdGVibG9jay0+dHJhbnNmb3Jtc1tXSU5FRDNEVFNfV09STERNQVRSSVgoMCldLnUubVswXVswXSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE11bHRNYXRyaXhmIik7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBjbGlwcGxhbmUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBVSU5UIGluZGV4ID0gc3RhdGUgLSBTVEFURV9DTElQUExBTkUoMCk7CgogICAgaWYoaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVklFVykpIHx8IGluZGV4ID49IEdMX0xJTUlUUyhjbGlwcGxhbmVzKSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBDbGlwIFBsYW5lIHNldHRpbmdzIGFyZSBhZmZlY3RlZCBieSB0aGUgbW9kZWwgdmlldyBpbiBPcGVuR0wsIHRoZSBWaWV3IHRyYW5zZm9ybSBpbiBkaXJlY3QzZCAqLwogICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICBnbFB1c2hNYXRyaXgoKTsKICAgIGdsTG9hZE1hdHJpeGYoKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwoKICAgIFRSQUNFKCJDbGlwcGxhbmUgWyVmLCVmLCVmLCVmXVxuIiwKICAgICAgICAgIHN0YXRlYmxvY2stPmNsaXBwbGFuZVtpbmRleF1bMF0sCiAgICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwcGxhbmVbaW5kZXhdWzFdLAogICAgICAgICAgc3RhdGVibG9jay0+Y2xpcHBsYW5lW2luZGV4XVsyXSwKICAgICAgICAgIHN0YXRlYmxvY2stPmNsaXBwbGFuZVtpbmRleF1bM10pOwogICAgZ2xDbGlwUGxhbmUoR0xfQ0xJUF9QTEFORTAgKyBpbmRleCwgc3RhdGVibG9jay0+Y2xpcHBsYW5lW2luZGV4XSk7CiAgICBjaGVja0dMY2FsbCgiZ2xDbGlwUGxhbmUiKTsKCiAgICBnbFBvcE1hdHJpeCgpOwp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fd29ybGRleChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFVJTlQgbWF0cml4ID0gc3RhdGUgLSBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKTsKICAgIEdMZW51bSBnbE1hdDsKICAgIFRSQUNFKCJTZXR0aW5nIHdvcmxkIG1hdHJpeCAlZFxuIiwgbWF0cml4KTsKCiAgICBpZihtYXRyaXggPj0gR0xfTElNSVRTKGJsZW5kcykpIHsKICAgICAgICBXQVJOKCJVbnN1cHBvcnRlZCBibGVuZCBtYXRyaXggc2V0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYoaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVklFVykpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEdMX01PREVMVklFVzBfQVJCOiAgMHgxNzAwCiAgICAgKiBHTF9NT0RFTFZJRVcxX0FSQjogIDB4MHg4NTBhCiAgICAgKiBHTF9NT0RFTFZJRVcyX0FSQjogIDB4ODcyMgogICAgICogR0xfTU9ERUxWSUVXM19BUkI6ICAweDg3MjMKICAgICAqIGV0YwogICAgICogR0xfTU9ERUxWSUVXMzFfQVJCOiAweDg3M0YKICAgICAqLwogICAgaWYobWF0cml4ID09IDEpIGdsTWF0ID0gR0xfTU9ERUxWSUVXMV9BUkI7CiAgICBlbHNlIGdsTWF0ID0gR0xfTU9ERUxWSUVXMl9BUkIgLSAyICsgbWF0cml4OwoKICAgIGdsTWF0cml4TW9kZShnbE1hdCk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlKGdsTWF0KSIpOwoKICAgIC8qIFdvcmxkIG1hdHJpeCAwIGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgdmlldyBtYXRyaXggYmVjYXVzZSBkM2QgdXNlcyAzIG1hdHJpY2VzIHdoaWxlIGdsIHVzZXMgb25seSAyLiBUbyBhdm9pZAogICAgICogd2VpZ2h0aW5nIHRoZSB2aWV3IG1hdHJpeCBpbmNvcnJlY3RseSBpdCBoYXMgdG8gYmUgbXVsdGlwbGllZCBpbnRvIGV2ZXJ5IGdsIG1vZGVsdmlldyBtYXRyaXgKICAgICAqLwogICAgaWYoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dmlld19pZGVudCkgewogICAgICAgIGdsTG9hZE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1dPUkxETUFUUklYKG1hdHJpeCldLnUubVswXVswXSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTG9hZE1hdHJpeGYiKQogICAgfSBlbHNlIHsKICAgICAgICBnbExvYWRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRNYXRyaXhmIikKICAgICAgICBnbE11bHRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19XT1JMRE1BVFJJWChtYXRyaXgpXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbE11bHRNYXRyaXhmIikKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfdmVydGV4YmxlbmQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBXSU5FRDNEVkVSVEVYQkxFTkRGTEFHUyB2YWwgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfVkVSVEVYQkxFTkRdOwoKICAgIHN3aXRjaCh2YWwpIHsKICAgICAgICBjYXNlIFdJTkVEM0RWQkZfMVdFSUdIVFM6CiAgICAgICAgY2FzZSBXSU5FRDNEVkJGXzJXRUlHSFRTOgogICAgICAgIGNhc2UgV0lORUQzRFZCRl8zV0VJR0hUUzoKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JMRU5EKSkgewogICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfVkVSVEVYX0JMRU5EX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVkVSVEVYX0JMRU5EX0FSQikiKTsKCiAgICAgICAgICAgICAgICAvKiBEM0QgYWRkcyBvbmUgbW9yZSBtYXRyaXggd2hpY2ggaGFzIHdlaWdodCAoMSAtIHN1bSh3ZWlnaHRzKSkuIFRoaXMgaXMgZW5hYmxlZCBhdCBjb250ZXh0CiAgICAgICAgICAgICAgICAgKiBjcmVhdGlvbiB3aXRoIGVuYWJsaW5nIEdMX1dFSUdIVF9TVU1fVU5JVFlfQVJCLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QmxlbmRBUkIoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1ZFUlRFWEJMRU5EXSArIDEpKTsKCiAgICAgICAgICAgICAgICBpZighc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dmVydGV4QmxlbmRVc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgR0xfTElNSVRTKGJsZW5kcyk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoaSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dvcmxkZXgoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWChpKSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnZlcnRleEJsZW5kVXNlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0aWMgQk9PTCBvbmNlID0gRkFMU0U7CiAgICAgICAgICAgICAgICBpZighb25jZSkgewogICAgICAgICAgICAgICAgICAgIG9uY2UgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IEltcGxlbWVudCB2ZXJ0ZXggYmxlbmRpbmcgaW4gZHJhd1N0cmlkZWRTbG93ICovCiAgICAgICAgICAgICAgICAgICAgRklYTUUoIlZlcnRleCBibGVuZGluZyBlbmFibGVkLCBidXQgbm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFZCRl9ESVNBQkxFOgogICAgICAgIGNhc2UgV0lORUQzRFZCRl8wV0VJR0hUUzogLyogZm9yIEluZGV4ZWQgdmVydGV4IGJsZW5kaW5nIC0gbm90IHN1cHBvcnRlZCAqLwogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9WRVJURVhfQkxFTkQpKSB7CiAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVkVSVEVYX0JMRU5EX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1ZFUlRFWF9CTEVORF9BUkIpIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRSgiVmVydGV4IGJsZW5kaW5nIGRpc2FibGVkXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVkJGX1RXRUVOSU5HOgogICAgICAgICAgICAvKiBKdXN0IHNldCB0aGUgdmVydGV4IHdlaWdodCBmb3Igd2VpZ2h0IDAsIGVuYWJsZSB2ZXJ0ZXggYmxlbmRpbmcgYW5kIGhvcGUgdGhlIGFwcCBkb2Vzbid0IGhhdmUKICAgICAgICAgICAgICogdmVydGV4IHdlaWdodHMgaW4gdGhlIHZlcnRpY2VzPwogICAgICAgICAgICAgKiBGb3Igbm93IHdlIGRvbid0IHJlcG9ydCB0aGF0IGFzIHN1cHBvcnRlZCwgc28gYSB3YXJuIHNob3VsZCBzdWZmaWNlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBXQVJOKCJUd2VlbmluZyBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fdmlldyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuc2lnbmVkIGludCBrOwoKICAgIC8qIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgVmlldyBtYXRyaXgsIHJlc2V0IHRoZSBsaWdodCBhbmQgY2xpcHBpbmcgcGxhbmVzIHRvIHRoZSBuZXcgdmlldwogICAgICogTk9URTogV2UgaGF2ZSB0byByZXNldCB0aGUgcG9zaXRpb25zIGV2ZW4gaWYgdGhlIGxpZ2h0L3BsYW5lIGlzIG5vdCBjdXJyZW50bHkKICAgICAqICAgICAgIGVuYWJsZWQsIHNpbmNlIHRoZSBjYWxsIHRvIGVuYWJsZSBpdCB3aWxsIG5vdCByZXNldCB0aGUgcG9zaXRpb24uCiAgICAgKiBOT1RFMjogQXBwYXJlbnRseSB0ZXh0dXJlIHRyYW5zZm9ybXMgZG8gTk9UIG5lZWQgcmVhcHBseWluZwogICAgICovCgogICAgUExJR0hUSU5GT0VMICpsaWdodCA9IE5VTEw7CgogICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVykiKTsKICAgIGdsTG9hZE1hdHJpeGYoKGZsb2F0ICopKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwogICAgY2hlY2tHTGNhbGwoImdsTG9hZE1hdHJpeGYoLi4uKSIpOwoKICAgIC8qIFJlc2V0IGxpZ2h0cy4gVE9ETzogQ2FsbCBsaWdodCBhcHBseSBmdW5jICovCiAgICBmb3IoayA9IDA7IGsgPCBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5tYXhDb25jdXJyZW50TGlnaHRzOyBrKyspIHsKICAgICAgICBsaWdodCA9IHN0YXRlYmxvY2stPmFjdGl2ZUxpZ2h0c1trXTsKICAgICAgICBpZighbGlnaHQpIGNvbnRpbnVlOwogICAgICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBsaWdodC0+Z2xJbmRleCwgR0xfUE9TSVRJT04sIGxpZ2h0LT5saWdodFBvc24pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYgcG9zbiIpOwogICAgICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBsaWdodC0+Z2xJbmRleCwgR0xfU1BPVF9ESVJFQ1RJT04sIGxpZ2h0LT5saWdodERpcm4pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYgZGlybiIpOwogICAgfQoKICAgIC8qIFJlc2V0IENsaXBwaW5nIFBsYW5lcyAgKi8KICAgIGZvciAoayA9IDA7IGsgPCBHTF9MSU1JVFMoY2xpcHBsYW5lcyk7IGsrKykgewogICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfQ0xJUFBMQU5FKGspKSkgewogICAgICAgICAgICBjbGlwcGxhbmUoU1RBVEVfQ0xJUFBMQU5FKGspLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgaWYoY29udGV4dC0+bGFzdF93YXNfcmh3KSB7CiAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xMb2FkSWRlbnRpdHkoKSIpOwogICAgICAgIC8qIE5vIG5lZWQgdG8gdXBkYXRlIHRoZSB3b3JsZCBtYXRyaXgsIHRoZSBpZGVudGl0eSBpcyBmaW5lICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIENhbGwgdGhlIHdvcmxkIG1hdHJpeCBzdGF0ZSwgdGhpcyB3aWxsIGFwcGx5IHRoZSBjb21iaW5lZCBXT1JMRCArIFZJRVcgbWF0cml4CiAgICAgKiBObyBuZWVkIHRvIGRvIGl0IGhlcmUgaWYgdGhlIHN0YXRlIGlzIHNjaGVkdWxlZCBmb3IgdXBkYXRlLgogICAgICovCiAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMCkpKSkgewogICAgICAgIHRyYW5zZm9ybV93b3JsZChTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICB9CgogICAgLyogQXZvaWQgbG9vcGluZyBvdmVyIGEgbnVtYmVyIG9mIG1hdHJpY2VzIGlmIHRoZSBhcHAgbmV2ZXIgdXNlZCB0aGUgZnVuY3Rpb25hbGl0eSAqLwogICAgaWYoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dmVydGV4QmxlbmRVc2VkKSB7CiAgICAgICAgZm9yKGsgPSAxOyBrIDwgR0xfTElNSVRTKGJsZW5kcyk7IGsrKykgewogICAgICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoaykpKSkgewogICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dvcmxkZXgoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWChrKSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgY29uc3QgR0xmbG9hdCBpbnZ5bWF0WzE2XSA9IHsKICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAwLjBmLCAtMS4wZiwgMC4wZiwgMC4wZiwKICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCiAgICAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmfTsKCnN0YXRpYyB2b2lkIHRyYW5zZm9ybV9wcm9qZWN0aW9uKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwogICAgY2hlY2tHTGNhbGwoImdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKSIpOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSIpOwoKICAgIGlmKGNvbnRleHQtPmxhc3Rfd2FzX3JodykgewogICAgICAgIGRvdWJsZSBYLCBZLCBoZWlnaHQsIHdpZHRoLCBtaW5aLCBtYXhaOwoKICAgICAgICBYICAgICAgPSBzdGF0ZWJsb2NrLT52aWV3cG9ydC5YOwogICAgICAgIFkgICAgICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0Llk7CiAgICAgICAgaGVpZ2h0ID0gc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0OwogICAgICAgIHdpZHRoICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0LldpZHRoOwogICAgICAgIG1pblogICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0Lk1pblo7CiAgICAgICAgbWF4WiAgID0gc3RhdGVibG9jay0+dmlld3BvcnQuTWF4WjsKCiAgICAgICAgaWYoIXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnVudHJhbnNmb3JtZWQpIHsKICAgICAgICAgICAgLyogVHJhbnNmb3JtZWQgdmVydGljZXMgYXJlIHN1cHBvc2VkIHRvIGJ5cGFzcyB0aGUgd2hvbGUgdHJhbnNmb3JtIHBpcGVsaW5lIGluY2x1ZGluZwogICAgICAgICAgICAgKiBmcnVzdHVtIGNsaXBwaW5nLiBUaGlzIGNhbid0IGJlIGRvbmUgaW4gb3BlbmdsLCBzbyB0aGlzIGNvZGUgYWRqdXN0cyB0aGUgWiByYW5nZSB0bwogICAgICAgICAgICAgKiBzdXBwcmVzcyBkZXB0aCBjbGlwcGluZy4gVGhpcyBjYW4gYmUgZG9uZSBiZWNhdXNlIGl0IGlzIGFuIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBhbmQKICAgICAgICAgICAgICogdGhlIFogY29vcmRpbmF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHNpemUgb2YgdGhlIHByaW1pdGl2ZXMuIEhhbGYgTGlmZSAxIGFuZCBQcmluY2Ugb2YKICAgICAgICAgICAgICogUGVyc2lhIDNEIG5lZWQgdGhpcy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogTm90ZSB0aGF0IHVzaW5nIG1pblogYW5kIG1heFogaGVyZSBkb2Vzbid0IGVudGlyZWx5IGZpeCB0aGUgcHJvYmxlbSwgc2luY2UgdmlldyBmcnVzdHVtCiAgICAgICAgICAgICAqIGNsaXBwaW5nIGlzIHN0aWxsIGVuYWJsZWQsIGJ1dCBpdCBzZWVtcyB0byBmaXggaXQgZm9yIGFsbCBhcHBzIHRlc3RlZCBzbyBmYXIuIEEgbWlub3IKICAgICAgICAgICAgICogcHJvYmxlbSBjYW4gYmUgd2l0bmVzc2VkIGluIGhhbGYtbGlmZSAxIGVuZ2luZSBiYXNlZCBnYW1lcywgdGhlIHdlYXBvbiBpcyBjbGlwcGVkIGNsb3NlCiAgICAgICAgICAgICAqIHRvIHRoZSB2aWV3ZXIuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEFsc28gbm90ZSB0aGF0IHRoaXMgYnJlYWtzIHogY29tcGFyaXNvbiBhZ2FpbnN0IHogdmFsdWVzIGZpbGxlZCBpbiB3aXRoIGNsZWFyLAogICAgICAgICAgICAgKiBidXQgbm8gYXBwIGRlcGVuZGluZyBvbiB0aGF0IGFuZCBkaXNhYmxlZCBjbGlwcGluZyBoYXMgYmVlbiBmb3VuZCB5ZXQuIENvbXBhcmluZwogICAgICAgICAgICAgKiBwcmltaXRpdmVzIGFnYWluc3QgdGhlbXNlbHZlcyB3b3Jrcywgc28gdGhlIFogYnVmZmVyIGlzIHN0aWxsIGludGFjdCBmb3Igbm9ybWFsIGhpZGRlbgogICAgICAgICAgICAgKiBzdXJmYWNlIHJlbW92YWwuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFdlIGNvdWxkIGRpc2FibGUgY2xpcHBpbmcgZW50aXJlbHkgYnkgc2V0dGluZyB0aGUgbmVhciB0byBpbmZpbml0eSBhbmQgZmFyIHRvIC1pbmZpbml0eSwKICAgICAgICAgICAgICogYnV0IHRoaXMgd291bGQgYnJlYWsgWiBidWZmZXIgb3BlcmF0aW9uLiBSYWlzaW5nIHRoZSByYW5nZSB0byBzb21ldGhpbmcgbGVzcyB0aGFuCiAgICAgICAgICAgICAqIGluZmluaXR5IHdvdWxkIGhlbHAgYSBiaXQgYXQgdGhlIGNvc3Qgb2YgWiBwcmVjaXNpb24sIGJ1dCBpdCB3b3VsZG4ndCBlbGltaW5hdGUgdGhlCiAgICAgICAgICAgICAqIHByb2JsZW0gZWl0aGVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgVFJBQ0UoIkNhbGxpbmcgZ2xPcnRobyB3aXRoICVmLCAlZiwgJWYsICVmXG4iLCB3aWR0aCwgaGVpZ2h0LCAtbWluWiwgLW1heFopOwogICAgICAgICAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBnbE9ydGhvKFgsIFggKyB3aWR0aCwgLVksIC1ZIC0gaGVpZ2h0LCAtbWluWiwgLW1heFopOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2xPcnRobyhYLCBYICsgd2lkdGgsIFkgKyBoZWlnaHQsIFksIC1taW5aLCAtbWF4Wik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBJZiB0aGUgYXBwIG1peGVzIHRyYW5zZm9ybWVkIGFuZCB1bnRyYW5zZm9ybWVkIHByaW1pdGl2ZXMgd2UgY2FuJ3QgdXNlIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgKiB0cmljayBhYm92ZSBiZWNhdXNlIHRoaXMgd291bGQgbWVzcyB1cCB0cmFuc2Zvcm1lZCBhbmQgdW50cmFuc2Zvcm1lZCBaIG9yZGVyLiBQYXNzIHRoZSB6IHBvc2l0aW9uCiAgICAgICAgICAgICAqIHVubW9kaWZpZWQgdG8gb3BlbmdsLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB0aGUgYXBwIGRlcGVuZHMgb24gbWl4ZWQgdHlwZXMgYW5kIGRpc2FibGVkIGNsaXBwaW5nIHdlJ3JlIG91dCBvZiBsdWNrIHdpdGhvdXQgYSBwaXBlbGluZQogICAgICAgICAgICAgKiByZXBsYWNlbWVudCBzaGFkZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBUUkFDRSgiQ2FsbGluZyBnbE9ydGhvIHdpdGggJWYsICVmLCAlZiwgJWZcbiIsIHdpZHRoLCBoZWlnaHQsIDEuMCwgLTEuMCk7CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl9vZmZzY3JlZW4pIHsKICAgICAgICAgICAgICAgIGdsT3J0aG8oWCwgWCArIHdpZHRoLCAtWSwgLVkgLSBoZWlnaHQsIDAuMCwgLTEuMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnbE9ydGhvKFgsIFggKyB3aWR0aCwgWSArIGhlaWdodCwgWSwgMC4wLCAtMS4wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaGVja0dMY2FsbCgiZ2xPcnRobyIpOwoKICAgICAgICAvKiBXaW5kb3cgQ29vcmQgMCBpcyB0aGUgbWlkZGxlIG9mIHRoZSBmaXJzdCBwaXhlbCwgc28gdHJhbnNsYXRlIGJ5IDEvMiBwaXhlbHMgKi8KICAgICAgICBnbFRyYW5zbGF0ZWYoMC41LCAwLjUsIDApOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFRyYW5zbGF0ZWYoMC41LCAwLjUsIDApIik7CiAgICAgICAgLyogRDNEIHRleHR1cmUgY29vcmRpbmF0ZXMgYXJlIGZsaXBwZWQgY29tcGFyZWQgdG8gT3BlbkdMIG9uZXMsIHNvCiAgICAgICAgICogcmVuZGVyIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24gd2hlbiByZW5kZXJpbmcgb2Zmc2NyZWVuLiAqLwogICAgICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgICAgIGdsTXVsdE1hdHJpeGYoaW52eW1hdCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE11bHRNYXRyaXhmKGludnltYXQpIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUaGUgcnVsZSBpcyB0aGF0IHRoZSB3aW5kb3cgY29vcmRpbmF0ZSAwIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcGl4ZWwsIGJ1dCB0aGUgY2VudGVyIG9mIHRoZSBmaXJzdCBwaXhlbC4KICAgICAgICAgICAgQXMgYSBjb25zZXF1ZW5jZSBpZiB5b3Ugd2FudCB0byBjb3JyZWN0bHkgZHJhdyBvbmUgbGluZSBleGFjdGx5IGZyb20KICAgICAgICAgICAgdGhlIGxlZnQgdG8gdGhlIHJpZ2h0IGVuZCBvZiB0aGUgdmlld3BvcnQgKHdpdGggYWxsIG1hdHJpY2VzIHNldCB0bwogICAgICAgICAgICBiZSBpZGVudGl0eSksIHRoZSB4IGNvb3JkcyBvZiBib3RoIGVuZHMgb2YgdGhlIGxpbmUgd291bGQgYmUgbm90CiAgICAgICAgICAgIC0xIGFuZCAxIHJlc3BlY3RpdmVseSBidXQgKC0xLTEvdmlld3BvcnRfd2lkaCkgYW5kICgxLTEvdmlld3BvcnRfd2lkdGgpCiAgICAgICAgICAgIGluc3RlYWQuCgogICAgICAgICAgICAxLjAgLyBXaWR0aCBpcyB1c2VkIGJlY2F1c2UgdGhlIGNvb3JkIHJhbmdlIGdvZXMgZnJvbSAtMS4wIHRvIDEuMCwgdGhlbiB3ZQogICAgICAgICAgICBkaXZpZGUgYnkgdGhlIFdpZHRoL0hlaWdodCwgc28gd2UgbmVlZCB0aGUgaGFsZiByYW5nZSgxLjApIHRvIHRyYW5zbGF0ZSBieQogICAgICAgICAgICBoYWxmIGEgcGl4ZWwuCgogICAgICAgICAgICBUaGUgb3RoZXIgZnVuIGlzIHRoYXQgZDNkJ3Mgb3V0cHV0IHogcmFuZ2UgYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIFswOzFdLAogICAgICAgICAgICBidXQgb3BlbmdsJ3MgaXMgWy0xOzFdLiBTaW5jZSB0aGUgeiBidWZmZXIgaXMgaW4gcmFuZ2UgWzA7MV0gZm9yIGJvdGgsIGdsCiAgICAgICAgICAgIHNjYWxlcyBbLTE7MV0gdG8gWzA7MV0uIFRoaXMgd291bGQgbWVhbiB0aGF0IHdlIGVuZCB1cCBpbiBbMC41OzFdIGFuZCBsb29zZSBhIGxvdAogICAgICAgICAgICBvZiBaIGJ1ZmZlciBwcmVjaXNpb24gYW5kIHRoZSBjbGVhciB2YWx1ZXMgZG8gbm90IG1hdGNoIGluIHRoZSB6IHRlc3QuIFRodXMgc2NhbGUKICAgICAgICAgICAgWzA7MV0gdG8gWy0xOzFdLCBzbyB3aGVuIGdsIHVuZG9lcyB0aGF0IHdlIHV0aWxpemUgdGhlIGZ1bGwgeiByYW5nZQogICAgICAgICAqLwogICAgICAgIGdsVHJhbnNsYXRlZigxLjAgLyBzdGF0ZWJsb2NrLT52aWV3cG9ydC5XaWR0aCwgLTEuMC8gc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0LCAtMS4wKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xUcmFuc2xhdGVmICgxLjAgLyB3aWR0aCwgLTEuMCAvIGhlaWdodCwgLTEuMCkiKTsKICAgICAgICBnbFNjYWxlZigxLjAsIDEuMCwgMi4wKTsKCiAgICAgICAgLyogRDNEIHRleHR1cmUgY29vcmRpbmF0ZXMgYXJlIGZsaXBwZWQgY29tcGFyZWQgdG8gT3BlbkdMIG9uZXMsIHNvCiAgICAgICAgICAgICogcmVuZGVyIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24gd2hlbiByZW5kZXJpbmcgb2Zmc2NyZWVuLiAqLwogICAgICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgICAgIGdsTXVsdE1hdHJpeGYoaW52eW1hdCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE11bHRNYXRyaXhmKGludnltYXQpIik7CiAgICAgICAgfQogICAgICAgIGdsTXVsdE1hdHJpeGYoKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19QUk9KRUNUSU9OXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRNYXRyaXhmIik7CiAgICB9Cn0KCi8qIFRoaXMgc2hvdWxkIG1hdGNoIGFueSBhcnJheXMgbG9hZGVkIGluIGxvYWRWZXJ0ZXhEYXRhLgogKiBzdGF0ZWJsb2NrIGltcGwgaXMgcmVxdWlyZWQgZm9yIEdMX1NVUFBPUlQKICogVE9ETzogT25seSBsb2FkIC8gdW5sb2FkIGFycmF5cyBpZiB3ZSBoYXZlIHRvLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIHVubG9hZFZlcnRleERhdGEoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaykgewogICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CiAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CiAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9FWFQpOwogICAgfQogICAgaWYgKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CTEVORCkpIHsKICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9XRUlHSFRfQVJSQVlfQVJCKTsKICAgIH0gZWxzZSBpZiAoR0xfU1VQUE9SVChFWFRfVkVSVEVYX1dFSUdIVElORykpIHsKICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCk7CiAgICB9CiAgICB1bmxvYWRUZXhDb29yZHMoc3RhdGVibG9jayk7Cn0KCi8qIFRoaXMgc2hvdWxkIG1hdGNoIGFueSBhcnJheXMgbG9hZGVkIGluIGxvYWROdW1iZXJlZEFycmF5cwogKiBUT0RPOiBPbmx5IGxvYWQgLyB1bmxvYWQgYXJyYXlzIGlmIHdlIGhhdmUgdG8uCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2FkTnVtYmVyZWRBcnJheXMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaykgewogICAgLyogZGlzYWJsZSBhbnkgYXR0cmlicyAodGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBHTFNMIGFuZCBBUkIgbW9kZXMpICovCiAgICBHTGludCBtYXhBdHRyaWJzOwogICAgaW50IGk7CgogICAgLyogTGVhdmUgYWxsIHRoZSBhdHRyaWJzIGRpc2FibGVkICovCiAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfQVRUUklCU19BUkIsICZtYXhBdHRyaWJzKTsKICAgIC8qIE1FU0EgZG9lcyBub3Qgc3VwcG9ydCBpdCByaWdodCBub3QgKi8KICAgIGlmIChnbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IpCiAgICAgICAgbWF4QXR0cmlicyA9IDE2OwogICAgZm9yIChpID0gMDsgaSA8IG1heEF0dHJpYnM7ICsraSkgewogICAgICAgIEdMX0VYVENBTEwoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIoaSkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQihyZWcpOyIpOwogICAgfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQgbG9hZE51bWJlcmVkQXJyYXlzKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhICpzdHJpZGVkKSB7CiAgICBHTGludCBjdXJWQk8gPSBHTF9TVVBQT1JUKEFSQl9WRVJURVhfQlVGRkVSX09CSkVDVCkgPyAtMSA6IDA7CiAgICBpbnQgaTsKICAgIFVJTlQgKm9mZnNldCA9IHN0YXRlYmxvY2stPnN0cmVhbU9mZnNldDsKCiAgICAvKiBEZWZhdWx0IHRvIG5vIGluc3RhbmNpbmcgKi8KICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmluc3RhbmNlZERyYXcgPSBGQUxTRTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVFJJQlM7IGkrKykgewoKICAgICAgICBpZiAoIXN0cmlkZWQtPnUuaW5wdXRbaV0ubHBEYXRhICYmICFzdHJpZGVkLT51LmlucHV0W2ldLlZCTykKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIERvIG5vdCBsb2FkIGluc3RhbmNlIGRhdGEuIEl0IHdpbGwgYmUgc3BlY2lmaWVkIHVzaW5nIGdsVGV4Q29vcmQgYnkgZHJhd3ByaW0gKi8KICAgICAgICBpZihzdGF0ZWJsb2NrLT5zdHJlYW1GbGFnc1tzdHJpZGVkLT51LmlucHV0W2ldLnN0cmVhbU5vXSAmIFdJTkVEM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIoaSkpOwogICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5pbnN0YW5jZWREcmF3ID0gVFJVRTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBUUkFDRV8oZDNkX3NoYWRlcikoIkxvYWRpbmcgYXJyYXkgJXUgW1ZCTz0ldV1cbiIsIGksIHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKTsKCiAgICAgICAgaWYoc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1N0cmlkZSkgewogICAgICAgICAgICBpZihjdXJWQk8gIT0gc3RyaWRlZC0+dS5pbnB1dFtpXS5WQk8pIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgICAgICBjdXJWQk8gPSBzdHJpZGVkLT51LmlucHV0W2ldLlZCTzsKICAgICAgICAgICAgfQogICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliUG9pbnRlckFSQihpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfU0laRShzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1R5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfTk9STUFMSVpFRChzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVkLT51LmlucHV0W2ldLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlZC0+dS5pbnB1dFtpXS5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1N0cmlkZSArIG9mZnNldFtzdHJpZGVkLT51LmlucHV0W2ldLnN0cmVhbU5vXSkgKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCKGkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBTdHJpZGUgPSAwIG1lYW5zIGFsd2F5cyB0aGUgc2FtZSB2YWx1ZXMuIGdsVmVydGV4QXR0cmliUG9pbnRlckFSQiBkb2Vzbid0IGRvIHRoYXQuIEluc3RlYWQgZGlzYWJsZSB0aGUgcG9pbnRlciBhbmQKICAgICAgICAgICAgICogc2V0IHVwIHRoZSBhdHRyaWJ1dGUgc3RhdGljYWxseS4gQnV0IHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgc3lzdGVtIG1lbW9yeSBhZGRyZXNzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgQllURSAqcHRyID0gc3RyaWRlZC0+dS5pbnB1dFtpXS5scERhdGEgKyBvZmZzZXRbc3RyaWRlZC0+dS5pbnB1dFtpXS5zdHJlYW1Ob107CiAgICAgICAgICAgIGlmKHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKSB7CiAgICAgICAgICAgICAgICBJV2luZUQzRFZlcnRleEJ1ZmZlckltcGwgKnZiID0gKElXaW5lRDNEVmVydGV4QnVmZmVySW1wbCAqKSBzdGF0ZWJsb2NrLT5zdHJlYW1Tb3VyY2Vbc3RyaWRlZC0+dS5pbnB1dFtpXS5zdHJlYW1Ob107CiAgICAgICAgICAgICAgICBwdHIgKz0gKGxvbmcpIHZiLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQihpKSk7CgogICAgICAgICAgICBzd2l0Y2goc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1R5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMToKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliMWZ2QVJCKGksIChmbG9hdCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMjoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliMmZ2QVJCKGksIChmbG9hdCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMzoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliM2Z2QVJCKGksIChmbG9hdCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUNDoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNGZ2QVJCKGksIChmbG9hdCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9VQllURTQ6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjROdWJ2QVJCKGksIHB0cikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfVUJZVEU0TjoKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0QzRENPTE9SOgogICAgICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWI0TnVidkFSQihpLCBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9TSE9SVDI6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjRzdkFSQihpLCAoR0xzaG9ydCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1NIT1JUNDoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNHN2QVJCKGksIChHTHNob3J0ICopIHB0cikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1NIT1JUMk46CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0xzaG9ydCBzWzRdID0geygoc2hvcnQgKikgcHRyKVswXSwgKChzaG9ydCAqKSBwdHIpWzFdLCAwLCAxfTsKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNE5zdkFSQihpLCBzKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9VU0hPUlQyTjoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHTHVzaG9ydCBzWzRdID0geygodW5zaWduZWQgc2hvcnQgKikgcHRyKVswXSwgKCh1bnNpZ25lZCBzaG9ydCAqKSBwdHIpWzFdLCAwLCAxfTsKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNE51c3ZBUkIoaSwgcykpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfU0hPUlQ0TjoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNE5zdkFSQihpLCAoR0xzaG9ydCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1VTSE9SVDROOgogICAgICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWI0TnVzdkFSQihpLCAoR0x1c2hvcnQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfVURFQzM6CiAgICAgICAgICAgICAgICAgICAgRklYTUUoIlVuc3VyZSBhYm91dCBXSU5FRDNEREVDTFRZUEVfVURFQzNcbiIpOwogICAgICAgICAgICAgICAgICAgIC8qZ2xWZXJ0ZXhBdHRyaWIzdXN2QVJCKGksIChHTHVzaG9ydCAqKSBwdHIpOyBEb2VzIG5vdCBleGlzdCAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfREVDM046CiAgICAgICAgICAgICAgICAgICAgRklYTUUoIlVuc3VyZSBhYm91dCBXSU5FRDNEREVDTFRZUEVfREVDM05cbiIpOwogICAgICAgICAgICAgICAgICAgIC8qZ2xWZXJ0ZXhBdHRyaWIzTnVzdkFSQihpLCAoR0x1c2hvcnQgKikgcHRyKTsgRG9lcyBub3QgZXhpc3QgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzI6CiAgICAgICAgICAgICAgICAgICAgLyogQXJlIHRob3NlIDE2IGJpdCBmbG9hdHMuIEMgZG9lc24ndCBoYXZlIGEgMTYgYml0IGZsb2F0IHR5cGUuIEkgY291bGQgcmVhZCB0aGUgc2luZ2xlIGJpdHMgYW5kIGNhbGN1bGF0ZSBhIDQKICAgICAgICAgICAgICAgICAgICAgKiBieXRlIGZsb2F0IGFjY29yZGluZyB0byB0aGUgSUVFRSBzdGFuZGFyZAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJVbnN1cHBvcnRlZCBXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yXG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNDoKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNFxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfVU5VU0VEOgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVuZXhwZWN0ZWQgZGVjbGFyYXRpb24gaW4gc3RyaWRlIDAgYXR0cmlidXRlc1xuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKiBVc2VkIGZyb20gMiBkaWZmZXJlbnQgZnVuY3Rpb25zLCBhbmQgdG9vIGJpZyB0byBqdXN0aWZ5IG1ha2luZyBpdCBpbmxpbmVkICovCnN0YXRpYyB2b2lkIGxvYWRWZXJ0ZXhEYXRhKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhICpzZCkgewogICAgVUlOVCAqb2Zmc2V0ID0gc3RhdGVibG9jay0+c3RyZWFtT2Zmc2V0OwogICAgR0xpbnQgY3VyVkJPID0gR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JVRkZFUl9PQkpFQ1QpID8gLTEgOiAwOwoKICAgIFRSQUNFKCJVc2luZyBmYXN0IHZlcnRleCBhcnJheSBjb2RlXG4iKTsKCiAgICAvKiBUaGlzIGlzIGZpeGVkIGZ1bmN0aW9uIHBpcGVsaW5lIG9ubHksIGFuZCB0aGUgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgZG9lc24ndCBkbyBpbnN0YW5jaW5nICovCiAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5pbnN0YW5jZWREcmF3ID0gRkFMU0U7CgogICAgLyogQmxlbmQgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICBpZiggKHNkLT51LnMuYmxlbmRXZWlnaHRzLmxwRGF0YSkgfHwgKHNkLT51LnMuYmxlbmRXZWlnaHRzLlZCTykgfHwKICAgICAgICAoc2QtPnUucy5ibGVuZE1hdHJpeEluZGljZXMubHBEYXRhKSB8fCAoc2QtPnUucy5ibGVuZE1hdHJpeEluZGljZXMuVkJPKSApIHsKCiAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CTEVORCkpIHsKICAgICAgICAgICAgVFJBQ0UoIkJsZW5kICVkICVwICVkXG4iLCBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUsIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMuYmxlbmRXZWlnaHRzLnN0cmVhbU5vXSk7CgogICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1dFSUdIVF9BUlJBWV9BUkIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9XRUlHSFRfQVJSQVlfQVJCKSIpOwoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEJsZW5kQVJCKFdJTkVEM0RfQVRSX1NJWkUoc2QtPnUucy5ibGVuZFdlaWdodHMuZHdUeXBlKSArIDEpKTsKCiAgICAgICAgICAgIFZUUkFDRSgoImdsV2VpZ2h0UG9pbnRlckFSQiglZCwgR0xfRkxPQVQsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSkgLAogICAgICAgICAgICAgICAgc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUgKyBvZmZzZXRbc2QtPnUucy5ibGVuZFdlaWdodHMuc3RyZWFtTm9dKSk7CgogICAgICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5ibGVuZFdlaWdodHMuVkJPKSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9BUlJBWV9CVUZGRVJfQVJCLCBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5WQk8pKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEJpbmRCdWZmZXJBUkIiKTsKICAgICAgICAgICAgICAgIGN1clZCTyA9IHNkLT51LnMuYmxlbmRXZWlnaHRzLlZCTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFdlaWdodFBvaW50ZXJBUkIpKAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfU0laRShzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1R5cGUpLAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMuYmxlbmRXZWlnaHRzLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLmJsZW5kV2VpZ2h0cy5zdHJlYW1Ob10pOwoKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsV2VpZ2h0UG9pbnRlckFSQiIpOwoKICAgICAgICAgICAgaWYoKHNkLT51LnMuYmxlbmRNYXRyaXhJbmRpY2VzLmxwRGF0YSkgfHwgKHNkLT51LnMuYmxlbmRNYXRyaXhJbmRpY2VzLlZCTykpewogICAgICAgICAgICAgICAgc3RhdGljIEJPT0wgc2hvd2ZpeG1lID0gVFJVRTsKICAgICAgICAgICAgICAgIGlmKHNob3dmaXhtZSl7CiAgICAgICAgICAgICAgICAgICAgRklYTUUoImJsZW5kTWF0cml4SW5kaWNlcyBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICBzaG93Zml4bWUgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoR0xfU1VQUE9SVChFWFRfVkVSVEVYX1dFSUdIVElORykpIHsKICAgICAgICAgICAgLyogRklYTUUoIlRPRE9cbiIpOyovCiNpZiAwCgogICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVCkoCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5ibGVuZFdlaWdodHMuZHdUeXBlKSwKICAgICAgICAgICAgICAgIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgc2QtPnUucy5ibGVuZFdlaWdodHMubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVChudW1CbGVuZHMsIC4uLikiKTsKICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfRVhUKSIpOwojZW5kaWYKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogVE9ETzogc3VwcG9ydCBibGVuZHMgaW4gZHJhd1N0cmlkZWRTbG93CiAgICAgICAgICAgICAqIE5vIG5lZWQgdG8gd3JpdGUgYSBGSVhNRSBoZXJlLCB0aGlzIGlzIGRvbmUgYWZ0ZXIgdGhlIGdlbmVyYWwgdmVydGV4IGRlY2wgZGVjb2RpbmcKICAgICAgICAgICAgICovCiAgICAgICAgICAgIFdBUk4oInVuc3VwcG9ydGVkIGJsZW5kaW5nIGluIG9wZW5HbFxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JMRU5EKSkgewogICAgICAgICAgICBzdGF0aWMgY29uc3QgR0xieXRlIG9uZSA9IDE7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xXZWlnaHRidkFSQigxLCAmb25lKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFdlaWdodGl2QVJCKEdMX0xJTUlUUyhibGVuZHMpLCB3ZWlnaHRzKSIpOwogICAgICAgIH0KICAgIH0KCiNpZiAwIC8qIEZPRyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoc2QtPnUucy5mb2cubHBEYXRhIHx8IHNkLT51LnMuZm9nLlZCTykgewogICAgICAgIC8qIFRPRE86IGZvZyovCiAgICBpZiAoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSB7CiAgICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0ZPR19DT09SRElOQVRFX0VYVCk7CiAgICAgICAgICAgIChHTF9FWFRDQUxMKShGb2dDb29yZFBvaW50ZXJFWFQpKAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuZm9nLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmZvZy5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMuZm9nLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLmZvZy5kd1N0cmlkZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogZG9uJ3QgYm90aGVyIGZhbGxpbmcgYmFjayB0byAnc2xvdycgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBzb2Z0d2FyZSBGT0cgeWV0LiAqLwogICAgICAgICAgICAvKiBGSVhNRTogZml4bWUgb25jZSAqLwogICAgICAgICAgICBUUkFDRSgiSGFyZHdhcmUgc3VwcG9ydCBmb3IgRk9HIGlzIG5vdCBhdmFpYWJsZSwgRk9HIGRpc2FibGVkLlxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUFJUKEVYVF9GT1JfQ09PUkQpIHsKICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBmb2cgaXMgZGlzYWJsZWQgKi8KICAgICAgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0ZPR19DT09SRElOQVRFX0VYVCk7CiAgICAgICAgfQogICAgfQojZW5kaWYKCiNpZiAwIC8qIHRhbmdlbnRzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChzZC0+dS5zLnRhbmdlbnQubHBEYXRhIHx8IHNkLT51LnMudGFuZ2VudC5WQk8gfHwKICAgICAgICBzZC0+dS5zLmJpbm9ybWFsLmxwRGF0YSB8fCBzZC0+dS5zLmJpbm9ybWFsLlZCTykgewogICAgICAgIC8qIFRPRE86IHRhbmdlbnRzKi8KICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfQ09PUkRJTkFURV9GUkFNRSkgewogICAgICAgICAgICBpZiAoc2QtPnUucy50YW5nZW50LmxwRGF0YSB8fCBzZC0+dS5zLnRhbmdlbnQuVkJPKSB7CiAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9UQU5HRU5UX0FSUkFZX0VYVCk7CiAgICAgICAgICAgICAgICAoR0xfRVhUQ0FMTCkoVGFuZ2VudFBvaW50ZXJFWFQpKAogICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX0dMVFlQRShzZC0+dS5zLnRhbmdlbnQuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnRhbmdlbnQuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgc2QtPnUucy50YW5nZW50LmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLnRhbmdlbnQuZHdTdHJpZGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9UQU5HRU5UX0FSUkFZX0VYVCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNkLT51LnMuYmlub3JtYWwubHBEYXRhIHx8IHNkLT51LnMuYmlub3JtYWwuVkJPKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfQklOT1JNQUxfQVJSQVlfRVhUKTsKICAgICAgICAgICAgICAgICAgICAoR0xfRVhUQ0FMTCkoQmlub3JtYWxQb2ludGVyRVhUKSgKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuYmlub3JtYWwuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5iaW5vcm1hbC5kd1N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5iaW5vcm1hbC5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5iaW5vcm1hbC5kd1N0cmlkZSk7CiAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfQklOT1JNQUxfQVJSQVlfRVhUKTsKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBkb24ndCBib3RoZXIgZmFsbGluZyBiYWNrIHRvICdzbG93JyBhcyB3ZSBkb24ndCBzdXBwb3J0IHNvZnR3YXJlIHRhbmdlbnRzIGFuZCBiaW5vcm1hbHMgeWV0IC4gKi8KICAgICAgICAgICAgLyogRklYTUU6IGZpeG1lIG9uY2UgKi8KICAgICAgICAgICAgVFJBQ0UoIkhhcmR3YXJlIHN1cHBvcnQgZm9yIHRhbmdlbnRzIGFuZCBiaW5vcm1hbHMgaXMgbm90IGF2YWlhYmxlLCB0YW5nZW50cyBhbmQgYmlub3JtYWxzIGRpc2FibGVkLlxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfQ09PUkRJTkFURV9GUkFNRSkgewogICAgICAgICAgICAgLyogbWFrZSBzdXJlIGZvZyBpcyBkaXNhYmxlZCAqLwogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RBTkdFTlRfQVJSQVlfRVhUKTsKICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CSU5PUk1BTF9BUlJBWV9FWFQpOwogICAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgLyogUG9pbnQgU2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChzZC0+dS5zLnBTaXplLmxwRGF0YSB8fCBzZC0+dS5zLnBTaXplLlZCTykgewoKICAgICAgICAvKiBubyBzdWNoIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIGZpeGVkIGZ1bmN0aW9uIEdMIHBpcGVsaW5lICovCiAgICAgICAgVFJBQ0UoIkNhbm5vdCBjaGFuZ2UgcHRTaXplIGhlcmUgaW4gb3BlbkdsXG4iKTsKICAgICAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBpbiB1c2luZyBzaGFkZXJzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSAqLwoKICAgIH0KCiAgICAvKiBWZXJ0ZXggUG9pbnRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKHNkLT51LnMucG9zaXRpb24ubHBEYXRhICE9IE5VTEwgfHwgc2QtPnUucy5wb3NpdGlvbi5WQk8gIT0gMCkgewogICAgICAgIC8qIE5vdGUgZHdUeXBlID09IGZsb2F0MyBvciBmbG9hdDQgPT0gMiBvciAzICovCiAgICAgICAgVlRSQUNFKCgiZ2xWZXJ0ZXhQb2ludGVyKCVkLCBHTF9GTE9BVCwgJWQsICVwKVxuIiwKICAgICAgICAgICAgICAgIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnBvc2l0aW9uLmR3VHlwZSArIDEsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnBvc2l0aW9uLmxwRGF0YSkpOwoKICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5wb3NpdGlvbi5WQk8pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfQVJSQVlfQlVGRkVSX0FSQiwgc2QtPnUucy5wb3NpdGlvbi5WQk8pKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQmluZEJ1ZmZlckFSQiIpOwogICAgICAgICAgICBjdXJWQk8gPSBzZC0+dS5zLnBvc2l0aW9uLlZCTzsKICAgICAgICB9CgogICAgICAgIC8qIG1pbihXSU5FRDNEX0FUUl9TSVpFKHBvc2l0aW9uKSwzKSB0byBEaXNhYmxlIFJIVyBtb2RlIGFzICd3JyBjb29yZAogICAgICAgICAgIGhhbmRsaW5nIGZvciByaHcgbW9kZSBzaG91bGQgbm90IGltcGFjdCBzY3JlZW4gcG9zaXRpb24gd2hlcmVhcyBpbiBHTCBpdCBkb2VzLgogICAgICAgICAgIFRoaXMgbWF5ICByZXN1bHQgaW4gdmVyeSBzbGlnaHRseSBkaXN0b3JlZCB0ZXh0dXJlcyBpbiByaHcgbW9kZSwgYnV0CiAgICAgICAgICAgYSB2ZXJ5IG1pbmltYWwgZGlmZmVyZW50LiBUaGVyZSdzIGFsd2F5cyB0aGUgb3RoZXIgb3B0aW9uIG9mCiAgICAgICAgICAgZml4aW5nIHRoZSB2aWV3IG1hdHJpeCB0byBwcmV2ZW50IHcgZnJvbSBoYXZpbmcgYW55IGVmZmVjdAoKICAgICAgICAgICBUaGlzIG9ubHkgYXBwbGllcyB0byB1c2VyIHBvaW50ZXIgc291cmNlcywgaW4gVkJPcyB0aGUgdmVydGljZXMgYXJlIGZpeGVkIHVwCiAgICAgICAgICovCiAgICAgICAgaWYoc2QtPnUucy5wb3NpdGlvbi5WQk8gPT0gMCkgewogICAgICAgICAgICBnbFZlcnRleFBvaW50ZXIoMyAvKiBtaW4oV0lORUQzRF9BVFJfU0laRShzZC0+dS5zLnBvc2l0aW9uLmR3VHlwZSksMykgKi8sCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5wb3NpdGlvbi5kd1R5cGUpLAogICAgICAgICAgICAgICAgc2QtPnUucy5wb3NpdGlvbi5kd1N0cmlkZSwgc2QtPnUucy5wb3NpdGlvbi5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5wb3NpdGlvbi5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLnBvc2l0aW9uLnN0cmVhbU5vXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfU0laRShzZC0+dS5zLnBvc2l0aW9uLmR3VHlwZSksCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5wb3NpdGlvbi5kd1R5cGUpLAogICAgICAgICAgICAgICAgc2QtPnUucy5wb3NpdGlvbi5kd1N0cmlkZSwgc2QtPnUucy5wb3NpdGlvbi5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5wb3NpdGlvbi5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLnBvc2l0aW9uLnN0cmVhbU5vXSk7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbFZlcnRleFBvaW50ZXIoLi4uKSIpOwogICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpIik7CiAgICB9CgogICAgLyogTm9ybWFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChzZC0+dS5zLm5vcm1hbC5scERhdGEgfHwgc2QtPnUucy5ub3JtYWwuVkJPKSB7CiAgICAgICAgLyogTm90ZSBkd1R5cGUgPT0gZmxvYXQzIG9yIGZsb2F0NCA9PSAyIG9yIDMgKi8KICAgICAgICBWVFJBQ0UoKCJnbE5vcm1hbFBvaW50ZXIoR0xfRkxPQVQsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBzZC0+dS5zLm5vcm1hbC5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMubm9ybWFsLmxwRGF0YSkpOwogICAgICAgIGlmKGN1clZCTyAhPSBzZC0+dS5zLm5vcm1hbC5WQk8pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfQVJSQVlfQlVGRkVSX0FSQiwgc2QtPnUucy5ub3JtYWwuVkJPKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEJpbmRCdWZmZXJBUkIiKTsKICAgICAgICAgICAgY3VyVkJPID0gc2QtPnUucy5ub3JtYWwuVkJPOwogICAgICAgIH0KICAgICAgICBnbE5vcm1hbFBvaW50ZXIoCiAgICAgICAgICAgIFdJTkVEM0RfQVRSX0dMVFlQRShzZC0+dS5zLm5vcm1hbC5kd1R5cGUpLAogICAgICAgICAgICBzZC0+dS5zLm5vcm1hbC5kd1N0cmlkZSwKICAgICAgICAgICAgc2QtPnUucy5ub3JtYWwubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMubm9ybWFsLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMubm9ybWFsLnN0cmVhbU5vXSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTm9ybWFsUG9pbnRlciguLi4pIik7CiAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSkiKTsKCiAgICB9IGVsc2UgewogICAgICAgIGdsTm9ybWFsM2YoMCwgMCwgMCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTm9ybWFsM2YoMCwgMCwgMCkiKTsKICAgIH0KCiAgICAvKiBEaWZmdXNlIENvbG91ciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvKiAgV0FSTklORzogRGF0YSBoZXJlIE1VU1QgYmUgaW4gUkdCQSBmb3JtYXQsIHNvIGNhbm5vdCAgICAgICovCiAgICAvKiAgICAgZ28gZGlyZWN0bHkgaW50byBmYXN0IG1vZGUgZnJvbSBhcHAgcGdtLCBiZWNhdXNlICAgICAgICovCiAgICAvKiAgICAgZGlyZWN0eCByZXF1aXJlcyBkYXRhIGluIEJHUkEgZm9ybWF0LiAgICAgICAgICAgICAgICAgICovCiAgICAvKiBjdXJyZW50bHkgZml4dXBWZXJ0aWNlcyBzd2l6ZWxzIHRoZSBmb3JtYXQsIGJ1dCB0aGlzIGlzbid0ICovCiAgICAvKiB2ZXJ5IHByYWN0aWNhbCB3aGVuIHVzaW5nIFZCT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiBOT1RFOiBVbmxlc3Mgd2Ugd3JpdGUgYSB2ZXJ0ZXggc2hhZGVyIHRvIHN3aXplbCB0aGUgY29sb3VyICovCiAgICAvKiAsIG9yIHRoZSB1c2VyIGRvZXNuJ3QgY2FyZSBhbmQgd2FudHMgdGhlIHNwZWVkIGFkdmFudGFnZSAgICovCgogICAgaWYgKHNkLT51LnMuZGlmZnVzZS5scERhdGEgfHwgc2QtPnUucy5kaWZmdXNlLlZCTykgewogICAgICAgIC8qIE5vdGUgZHdUeXBlID09IGZsb2F0MyBvciBmbG9hdDQgPT0gMiBvciAzICovCiAgICAgICAgVlRSQUNFKCgiZ2xDb2xvclBvaW50ZXIoNCwgR0xfVU5TSUdORURfQllURSwgJWQsICVwKVxuIiwKICAgICAgICAgICAgICAgIHNkLT51LnMuZGlmZnVzZS5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMuZGlmZnVzZS5scERhdGEpKTsKCiAgICAgICAgaWYoY3VyVkJPICE9IHNkLT51LnMuZGlmZnVzZS5WQk8pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfQVJSQVlfQlVGRkVSX0FSQiwgc2QtPnUucy5kaWZmdXNlLlZCTykpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgIGN1clZCTyA9IHNkLT51LnMuZGlmZnVzZS5WQk87CiAgICAgICAgfQogICAgICAgIGdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5kaWZmdXNlLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgIHNkLT51LnMuZGlmZnVzZS5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5kaWZmdXNlLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMuZGlmZnVzZS5zdHJlYW1Ob10pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAuLi4pIik7CiAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpIik7CgogICAgfSBlbHNlIHsKICAgICAgICBnbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQ29sb3I0ZigxLCAxLCAxLCAxKSIpOwogICAgfQoKICAgIC8qIFNwZWN1bGFyIENvbG91ciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKHNkLT51LnMuc3BlY3VsYXIubHBEYXRhIHx8IHNkLT51LnMuc3BlY3VsYXIuVkJPKSB7CiAgICAgICAgVFJBQ0UoInNldHRpbmcgc3BlY3VsYXIgY29sb3VyXG4iKTsKICAgICAgICAvKiBOb3RlIGR3VHlwZSA9PSBmbG9hdDMgb3IgZmxvYXQ0ID09IDIgb3IgMyAqLwogICAgICAgIFZUUkFDRSgoImdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnNwZWN1bGFyLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgc2QtPnUucy5zcGVjdWxhci5scERhdGEpKTsKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5zcGVjdWxhci5WQk8pIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHNkLT51LnMuc3BlY3VsYXIuVkJPKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgICAgICBjdXJWQk8gPSBzZC0+dS5zLnNwZWN1bGFyLlZCTzsKICAgICAgICAgICAgfQogICAgICAgICAgICBHTF9FWFRDQUxMKGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUKSg0LCBHTF9VTlNJR05FRF9CWVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnNwZWN1bGFyLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnNwZWN1bGFyLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLnNwZWN1bGFyLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMuc3BlY3VsYXIuc3RyZWFtTm9dKTsKICAgICAgICAgICAgdmNoZWNrR0xjYWxsKCJnbFNlY29uZGFyeUNvbG9yUG9pbnRlckVYVCg0LCBHTF9VTlNJR05FRF9CWVRFLCAuLi4pIik7CiAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0VYVCk7CiAgICAgICAgICAgIHZjaGVja0dMY2FsbCgiZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfRVhUKSIpOwogICAgICAgIH0gZWxzZSB7CgogICAgICAgIC8qIE1pc3Npbmcgc3BlY3VsYXIgY29sb3IgaXMgbm90IGNyaXRpY2FsLCBubyB3YXJuaW5ncyAqLwogICAgICAgIFZUUkFDRSgoIlNwZWN1bGFyIGNvbG91ciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgR0wgaW1wbGVtZW50YXRpb25cbiIpKTsKICAgICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsU2Vjb25kYXJ5Q29sb3IzZkVYVCkoMCwgMCwgMCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFNlY29uZGFyeUNvbG9yM2ZFWFQoMCwgMCwgMCkiKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgLyogTWlzc2luZyBzcGVjdWxhciBjb2xvciBpcyBub3QgY3JpdGljYWwsIG5vIHdhcm5pbmdzICovCiAgICAgICAgICAgIFZUUkFDRSgoIlNwZWN1bGFyIGNvbG91ciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgR0wgaW1wbGVtZW50YXRpb25cbiIpKTsKICAgICAgICB9CiAgICB9CgogICAgLyogVGV4dHVyZSBjb29yZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBsb2FkVGV4Q29vcmRzKHN0YXRlYmxvY2ssIHNkLCAmY3VyVkJPKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGRyYXdQcmltaXRpdmVUcmFjZURhdGFMb2NhdGlvbnMoCiAgICBXaW5lRGlyZWN0M0RWZXJ0ZXhTdHJpZGVkRGF0YSAqZGF0YUxvY2F0aW9ucykgewoKICAgIC8qIER1bXAgb3V0IHdoYXQgcGFydHMgd2UgaGF2ZSBzdXBwbGllZCAqLwogICAgVFJBQ0UoIlN0cmlkZWQgRGF0YTpcbiIpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHBvc2l0aW9uKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBibGVuZFdlaWdodHMpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIGJsZW5kTWF0cml4SW5kaWNlcyk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgbm9ybWFsKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBwU2l6ZSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgZGlmZnVzZSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgc3BlY3VsYXIpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1swXSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGV4Q29vcmRzWzFdKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXhDb29yZHNbMl0pOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1szXSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGV4Q29vcmRzWzRdKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXhDb29yZHNbNV0pOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1s2XSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGV4Q29vcmRzWzddKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBwb3NpdGlvbjIpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIG5vcm1hbDIpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRhbmdlbnQpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIGJpbm9ybWFsKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXNzRmFjdG9yKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBmb2cpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIGRlcHRoKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBzYW1wbGUpOwoKICAgIHJldHVybjsKfQoKLyogSGVscGVyIGZvciB2ZXJ0ZXhkZWNsYXJhdGlvbigpICovCnN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVTdHJlYW1zKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIEJPT0wgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24sIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBJV2luZUQzRERldmljZUltcGwgKmRldmljZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2U7CiAgICBCT09MIGZpeHVwID0gRkFMU0U7CiAgICBXaW5lRGlyZWN0M0RWZXJ0ZXhTdHJpZGVkRGF0YSAqZGF0YUxvY2F0aW9ucyA9ICZkZXZpY2UtPnN0cmlkZWRfc3RyZWFtczsKCiAgICBpZihkZXZpY2UtPnVwX3N0cmlkZWQpIHsKICAgICAgICAvKiBOb3RlOiB0aGlzIGlzIGEgZGRyYXcgZml4ZWQtZnVuY3Rpb24gY29kZSBwYXRoICovCiAgICAgICAgVFJBQ0UoIj09PT09PT09PT09PT09PT0gU3RyaWRlZCBJbnB1dCA9PT09PT09PT09PT09PT09PT09XG4iKTsKICAgICAgICBtZW1jcHkoZGF0YUxvY2F0aW9ucywgZGV2aWNlLT51cF9zdHJpZGVkLCBzaXplb2YoKmRhdGFMb2NhdGlvbnMpKTsKCiAgICAgICAgaWYoVFJBQ0VfT04oZDNkKSkgewogICAgICAgICAgICBkcmF3UHJpbWl0aXZlVHJhY2VEYXRhTG9jYXRpb25zKGRhdGFMb2NhdGlvbnMpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogTm90ZTogVGhpcyBpcyBhIGZpeGVkIGZ1bmN0aW9uIG9yIHNoYWRlciBjb2RlcGF0aC4KICAgICAgICAgKiBUaGlzIG1lYW5zIGl0IG11c3QgaGFuZGxlIGJvdGggdHlwZXMgb2Ygc3RyaWRlZCBkYXRhLgogICAgICAgICAqIFNoYWRlcnMgbXVzdCBnbyB0aHJvdWdoIGhlcmUgdG8gemVybyB0aGUgc3RyaWRlZCBkYXRhLCBldmVuIGlmIHRoZXkKICAgICAgICAgKiBkb24ndCBzZXQgYW55IGRlY2xhcmF0aW9uIGF0IGFsbAogICAgICAgICAqLwogICAgICAgIFRSQUNFKCI9PT09PT09PT09PT09PT09IFZlcnRleCBEZWNsYXJhdGlvbiAgPT09PT09PT09PT09PT09PT09PVxuIik7CiAgICAgICAgbWVtc2V0KGRhdGFMb2NhdGlvbnMsIDAsIHNpemVvZigqZGF0YUxvY2F0aW9ucykpOwogICAgICAgIHByaW1pdGl2ZURlY2xhcmF0aW9uQ29udmVydFRvU3RyaWRlZERhdGEoKElXaW5lRDNERGV2aWNlICopIGRldmljZSwKICAgICAgICAgICAgICAgIHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uLCBkYXRhTG9jYXRpb25zLCAmZml4dXApOwogICAgfQoKICAgIGlmIChkYXRhTG9jYXRpb25zLT51LnMucG9zaXRpb25fdHJhbnNmb3JtZWQpIHsKICAgICAgICB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiA9IEZBTFNFOwogICAgfQoKICAgIC8qIFVubG9hZCB0aGUgb2xkIGFycmF5cyBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IG9uZXMgdG8gZ2V0IG9sZCBqdW5rIG91dCAqLwogICAgaWYoY29udGV4dC0+bnVtYmVyZWRBcnJheXNMb2FkZWQpIHsKICAgICAgICB1bmxvYWROdW1iZXJlZEFycmF5cyhzdGF0ZWJsb2NrKTsKICAgICAgICBjb250ZXh0LT5udW1iZXJlZEFycmF5c0xvYWRlZCA9IEZBTFNFOwogICAgfQogICAgaWYoY29udGV4dC0+bmFtZWRBcnJheXNMb2FkZWQpIHsKICAgICAgICB1bmxvYWRWZXJ0ZXhEYXRhKHN0YXRlYmxvY2spOwogICAgICAgIGNvbnRleHQtPm5hbWVkQXJyYXlzTG9hZGVkID0gRkFMU0U7CiAgICB9CgogICAgaWYodXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pIHsKICAgICAgICBUUkFDRSgiTG9hZGluZyBudW1iZXJlZCBhcnJheXNcbiIpOwogICAgICAgIGxvYWROdW1iZXJlZEFycmF5cyhzdGF0ZWJsb2NrLCBkYXRhTG9jYXRpb25zKTsKICAgICAgICBkZXZpY2UtPnVzZURyYXdTdHJpZGVkU2xvdyA9IEZBTFNFOwogICAgICAgIGNvbnRleHQtPm51bWJlcmVkQXJyYXlzTG9hZGVkID0gVFJVRTsKICAgIH0gZWxzZSBpZiAoZml4dXAgfHwKICAgICAgICAgICAgICAgKGRhdGFMb2NhdGlvbnMtPnUucy5wU2l6ZS5scERhdGEgPT0gTlVMTCAmJgogICAgICAgICAgICAgICAgZGF0YUxvY2F0aW9ucy0+dS5zLmRpZmZ1c2UubHBEYXRhID09IE5VTEwgJiYKICAgICAgICAgICAgICAgIGRhdGFMb2NhdGlvbnMtPnUucy5zcGVjdWxhci5scERhdGEgPT0gTlVMTCkpIHsKICAgICAgICAvKiBMb2FkIHRoZSB2ZXJ0ZXggZGF0YSB1c2luZyBuYW1lZCBhcnJheXMgKi8KICAgICAgICBUUkFDRSgiTG9hZGluZyB2ZXJ0ZXggZGF0YVxuIik7CiAgICAgICAgbG9hZFZlcnRleERhdGEoc3RhdGVibG9jaywgZGF0YUxvY2F0aW9ucyk7CiAgICAgICAgZGV2aWNlLT51c2VEcmF3U3RyaWRlZFNsb3cgPSBGQUxTRTsKICAgICAgICBjb250ZXh0LT5uYW1lZEFycmF5c0xvYWRlZCA9IFRSVUU7CiAgICB9IGVsc2UgewogICAgICAgIFRSQUNFKCJOb3QgbG9hZGluZyB2ZXJ0ZXggZGF0YVxuIik7CiAgICAgICAgZGV2aWNlLT51c2VEcmF3U3RyaWRlZFNsb3cgPSBUUlVFOwogICAgfQoKLyogR2VuZXJhdGUgc29tZSBmaXhtZSdzIGlmIHVuc3VwcG9ydGVkIGZ1bmN0aW9uYWxpdHkgaXMgYmVpbmcgdXNlZCAqLwojZGVmaW5lIEJVRkZFUl9PUl9EQVRBKF9hdHRyaWJ1dGUpIGRhdGFMb2NhdGlvbnMtPnUucy5fYXR0cmlidXRlLmxwRGF0YQogICAgLyogVE9ETzogRWl0aGVyIHN1cHBvcnQgbWlzc2luZyBmdW5jdGlvbmFsaXR5IGluIGZpeHVwVmVydGljZXMgb3IgYnkgY3JlYXRpbmcgYSBzaGFkZXIgdG8gcmVwbGFjZSB0aGUgcGlwZWxpbmUuICovCiAgICBpZiAoIXVzZVZlcnRleFNoYWRlckZ1bmN0aW9uICYmIChCVUZGRVJfT1JfREFUQShwb3NpdGlvbjIpIHx8IEJVRkZFUl9PUl9EQVRBKG5vcm1hbDIpKSkgewogICAgICAgIEZJWE1FKCJUd2VlbmluZyBpcyBvbmx5IHZhbGlkIHdpdGggdmVydGV4IHNoYWRlcnNcbiIpOwogICAgfQogICAgaWYgKCF1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiAmJiAoQlVGRkVSX09SX0RBVEEodGFuZ2VudCkgfHwgQlVGRkVSX09SX0RBVEEoYmlub3JtYWwpKSkgewogICAgICAgIEZJWE1FKCJUYW5nZW50IGFuZCBiaW5vcm1hbCBidW1wIG1hcHBpbmcgaXMgb25seSB2YWxpZCB3aXRoIHZlcnRleCBzaGFkZXJzXG4iKTsKICAgIH0KICAgIGlmICghdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gJiYgKEJVRkZFUl9PUl9EQVRBKHRlc3NGYWN0b3IpIHx8IEJVRkZFUl9PUl9EQVRBKGZvZykgfHwgQlVGRkVSX09SX0RBVEEoZGVwdGgpIHx8IEJVRkZFUl9PUl9EQVRBKHNhbXBsZSkpKSB7CiAgICAgICAgRklYTUUoIkV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG9ubHkgdmFsaWQgd2l0aCB2ZXJ0ZXggc2hhZGVyc1xuIik7CiAgICB9CiN1bmRlZiBCVUZGRVJfT1JfREFUQQp9CgpzdGF0aWMgdm9pZCB2ZXJ0ZXhkZWNsYXJhdGlvbihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIEJPT0wgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gPSBGQUxTRSwgdXBkYXRlRm9nID0gRkFMU0U7CiAgICBCT09MIHVzZVBpeGVsU2hhZGVyRnVuY3Rpb24gPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wc19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmIHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyCiAgICAgICAgICAgICYmICgoSVdpbmVEM0RQaXhlbFNoYWRlckltcGwgKilzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciktPmJhc2VTaGFkZXIuZnVuY3Rpb247CiAgICBCT09MIHRyYW5zZm9ybWVkOwogICAgLyogU29tZSBzdHVmZiBpcyBpbiB0aGUgZGV2aWNlIHVudGlsIHdlIGhhdmUgcGVyIGNvbnRleHQgdHJhY2tpbmcgKi8KICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZTsKICAgIEJPT0wgd2Fzcmh3ID0gY29udGV4dC0+bGFzdF93YXNfcmh3OwoKICAgIC8qIFNoYWRlcnMgY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nIEFSQl9QUk9HUkFNLCBHTFNMLCBvciBzb2Z0d2FyZSAtCiAgICAgKiBoZXJlIHNpbXBseSBjaGVjayB3aGV0aGVyIGEgc2hhZGVyIHdhcyBzZXQsIG9yIHRoZSB1c2VyIGRpc2FibGVkIHNoYWRlcnMKICAgICAqLwogICAgaWYgKGRldmljZS0+dnNfc2VsZWN0ZWRfbW9kZSAhPSBTSEFERVJfTk9ORSAmJiBzdGF0ZWJsb2NrLT52ZXJ0ZXhTaGFkZXIgJiYKICAgICAgICgoSVdpbmVEM0RWZXJ0ZXhTaGFkZXJJbXBsICopc3RhdGVibG9jay0+dmVydGV4U2hhZGVyKS0+YmFzZVNoYWRlci5mdW5jdGlvbiAhPSBOVUxMKSB7CiAgICAgICAgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gPSBUUlVFOwoKICAgICAgICBpZigoKElXaW5lRDNEVmVydGV4U2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnZlcnRleFNoYWRlciktPmJhc2VTaGFkZXIucmVnX21hcHMuZm9nICE9IGNvbnRleHQtPmxhc3Rfd2FzX2ZvZ2d5X3NoYWRlcikgewogICAgICAgICAgICB1cGRhdGVGb2cgPSBUUlVFOwogICAgICAgIH0KICAgIH0gZWxzZSBpZihjb250ZXh0LT5sYXN0X3dhc19mb2dneV9zaGFkZXIpIHsKICAgICAgICB1cGRhdGVGb2cgPSBUUlVFOwogICAgfQoKICAgIGhhbmRsZVN0cmVhbXMoc3RhdGVibG9jaywgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24sIGNvbnRleHQpOwoKICAgIHRyYW5zZm9ybWVkID0gZGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnBvc2l0aW9uX3RyYW5zZm9ybWVkOwogICAgaWYgKHRyYW5zZm9ybWVkKSB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiA9IEZBTFNFOwoKICAgIGlmKHRyYW5zZm9ybWVkICE9IGNvbnRleHQtPmxhc3Rfd2FzX3JodyAmJiAhdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pIHsKICAgICAgICB1cGRhdGVGb2cgPSBUUlVFOwogICAgfQoKICAgIC8qIFJlYXBwbHkgbGlnaHRpbmcgaWYgaXQgaXMgbm90IHNjaGVkdWxlZCBmb3IgcmVhcHBsaWNhdGlvbiBhbHJlYWR5ICovCiAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTElHSFRJTkcpKSkgewogICAgICAgIHN0YXRlX2xpZ2h0aW5nKFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTElHSFRJTkcpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KCiAgICBpZiAodHJhbnNmb3JtZWQpIHsKICAgICAgICBjb250ZXh0LT5sYXN0X3dhc19yaHcgPSBUUlVFOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyogVW50cmFuc2Zvcm1lZCwgc28gcmVsaWVzIG9uIHRoZSB2aWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpY2VzICovCiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfcmh3ID0gRkFMU0U7CiAgICAgICAgLyogVGhpcyB0dXJucyBvZmYgdGhlIFogc2NhbGUgdHJpY2sgdG8gJ2Rpc2FibGUnIHZpZXdwb3J0IGZydXN0dW0gY2xpcHBpbmcgaW4gcmh3IG1vZGUqLwogICAgICAgIGRldmljZS0+dW50cmFuc2Zvcm1lZCA9IFRSVUU7CgogICAgICAgIC8qIFRvZG8gZm9yIHN3IHNoYWRlcnM6IFZlcnRleCBTaGFkZXIgb3V0cHV0IGlzIGFscmVhZHkgdHJhbnNmb3JtZWQsIHNvIHNldCB1cCBpZGVudGl0eSBtYXRyaWNlcwogICAgICAgICAqIE5vdCBuZWVkZWQgYXMgbG9uZyBhcyBvbmx5IGh3IHNoYWRlcnMgYXJlIHN1cHBvcnRlZAogICAgICAgICAqLwoKICAgICAgICAvKiBUaGlzIHNldHMgdGhlIHNoYWRlciBvdXRwdXQgcG9zaXRpb24gY29ycmVjdGlvbiBjb25zdGFudHMuCiAgICAgICAgICogVE9ETzogTW92ZSB0byB0aGUgdmlld3BvcnQgc3RhdGUKICAgICAgICAgKi8KICAgICAgICBpZiAodXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pIHsKICAgICAgICAgICAgZGV2aWNlLT5wb3NGaXh1cFsxXSA9IGRldmljZS0+cmVuZGVyX29mZnNjcmVlbiA/IC0xLjAgOiAxLjA7CiAgICAgICAgICAgIGRldmljZS0+cG9zRml4dXBbM10gPSAtZGV2aWNlLT5wb3NGaXh1cFsxXSAvIHN0YXRlYmxvY2stPnZpZXdwb3J0LkhlaWdodDsKICAgICAgICB9CiAgICB9CgogICAgLyogRG9uJ3QgaGF2ZSB0byBhcHBseSB0aGUgbWF0cmljZXMgd2hlbiB2ZXJ0ZXggc2hhZGVycyBhcmUgdXNlZC4gV2hlbiB2c2hhZGVycyBhcmUgdHVybmVkCiAgICAgKiBvZmYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhbnl3YXkgdG8gbWFrZSBzdXJlIHRoZXkncmUgcHJvcGVybHkgc2V0CiAgICAgKi8KICAgIGlmKCF1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbikgewogICAgICAgIC8qIFRPRE86IE1vdmUgdGhpcyBtYWlubHkgdG8gdGhlIHZpZXdwb3J0IHN0YXRlIGFuZCBvbmx5IGFwcGx5IHdoZW4gdGhlIHZwIGhhcyBjaGFuZ2VkCiAgICAgICAgICogb3IgdHJhbnNmb3JtZWQgLyB1bnRyYW5zZm9ybWVkIHdhcyBzd2l0Y2hlZAogICAgICAgICAqLwogICAgICAgaWYod2Fzcmh3ICE9IGNvbnRleHQtPmxhc3Rfd2FzX3JodyAmJgogICAgICAgICAgIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pKSAmJgogICAgICAgICAgIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WSUVXUE9SVCkpIHsKICAgICAgICAgICAgdHJhbnNmb3JtX3Byb2plY3Rpb24oU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19QUk9KRUNUSU9OKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8qIFdvcmxkIG1hdHJpeCBuZWVkcyByZWFwcGxpY2F0aW9uIGhlcmUgb25seSBpZiB3ZSdyZSBzd2l0Y2hpbmcgYmV0d2VlbiByaHcgYW5kIG5vbi1yaHcKICAgICAgICAgKiBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSB2ZXJ0ZXggc2hhZGVyIGlzIHVzZWQsIHRoZSB3b3JsZCBtYXRyaXggY2hhbmdlZCBhbmQgdGhlbiB2ZXJ0ZXggc2hhZGVyIHVuYm91bmQKICAgICAgICAgKiB0aGlzIGNoZWNrIHdpbGwgZmFpbCBhbmQgdGhlIG1hdHJpeCBub3QgYXBwbGllZCBhZ2Fpbi4gVGhpcyBpcyBPSyBiZWNhdXNlIGEgc2ltcGxlCiAgICAgICAgICogd29ybGQgbWF0cml4IGNoYW5nZSByZWFwcGxpZXMgdGhlIG1hdHJpeCAtIFRoZXNlIGNoZWNrcyBoZXJlIGFyZSBvbmx5IHRvIHNhdGlzZnkgdGhlCiAgICAgICAgICogbmVlZHMgb2YgdGhlIHZlcnRleCBkZWNsYXJhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIFdvcmxkIGFuZCB2aWV3IG1hdHJpeCBnbyBpbnRvIHRoZSBzYW1lIGdsIG1hdHJpeCwgc28gb25seSBhcHBseSB0aGVtIHdoZW4gbmVpdGhlciBpcwogICAgICAgICAqIGRpcnR5CiAgICAgICAgICovCiAgICAgICAgaWYodHJhbnNmb3JtZWQgIT0gd2Fzcmh3ICYmCiAgICAgICAgICAgIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKSkgJiYKICAgICAgICAgICAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVklFVykpKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybV93b3JsZChTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpKSkgewogICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdChTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZihjb250ZXh0LT5sYXN0X3dhc192c2hhZGVyICYmICFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DTElQUExBTkVFTkFCTEUpKSkgewogICAgICAgICAgICBzdGF0ZV9jbGlwcGluZyhTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTk9STUFMSVpFTk9STUFMUykpKSB7CiAgICAgICAgICAgIHN0YXRlX25vcm1hbGl6ZShTVEFURV9SRU5ERVIoV0lORUQzRFJTX05PUk1BTElaRU5PUk1BTFMpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qIFdlIGNvbXBpbGUgdGhlIHNoYWRlciBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgdmVydGV4IGRlY2xhcmF0aW9uCiAgICAgICAgICogaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZG8gYW55IHN3aXp6bGluZyBmb3IgRDNEQ09MT1IKICAgICAgICAgKiByZWdpc3RlcnMuIElmIHRoZSBzaGFkZXIgaXMgYWxyZWFkeSBjb21waWxlZCB0aGlzIGNhbGwgd2lsbCBkbyBub3RoaW5nLiAqLwogICAgICAgIElXaW5lRDNEVmVydGV4U2hhZGVyX0NvbXBpbGVTaGFkZXIoc3RhdGVibG9jay0+dmVydGV4U2hhZGVyKTsKCiAgICAgICAgaWYoIWNvbnRleHQtPmxhc3Rfd2FzX3ZzaGFkZXIpIHsKICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgIHN0YXRpYyBCT09MIHdhcm5lZCA9IEZBTFNFOwogICAgICAgICAgICAvKiBEaXNhYmxlIGFsbCBjbGlwIHBsYW5lcyB0byBnZXQgZGVmaW5lZCByZXN1bHRzIG9uIGFsbCBkcml2ZXJzLiBTZWUgY29tbWVudCBpbiB0aGUKICAgICAgICAgICAgICogc3RhdGVfY2xpcHBpbmcgc3RhdGUgaGFuZGxlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgR0xfTElNSVRTKGNsaXBwbGFuZXMpOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCArIGkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCArIGkpIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCF3YXJuZWQgJiYgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRV0pIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJDbGlwcGluZyBub3Qgc3VwcG9ydGVkIHdpdGggdmVydGV4IHNoYWRlcnNcbiIpOwogICAgICAgICAgICAgICAgd2FybmVkID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih3YXNyaHcpIHsKICAgICAgICAgICAgICAgIC8qIEFwcGx5IHRoZSB0cmFuc2Zvcm0gbWF0cmljZXMgd2hlbiBzd2l0Y2hpbmcgZnJvbSByaHcgZHJhd2luZyB0byB2ZXJ0ZXggc2hhZGVycy4gVmVydGV4CiAgICAgICAgICAgICAgICAgKiBzaGFkZXJzIHRoZW1zZWx2ZXMgZG8gbm90IG5lZWQgaXQsIGJ1dCB0aGUgbWF0cmljZXMgYXJlIG5vdCByZWFwcGxpZWQgYXV0b21hdGljYWxseSB3aGVuCiAgICAgICAgICAgICAgICAgKiBzd2l0Y2hpbmcgYmFjayBmcm9tIHZlcnRleCBzaGFkZXJzIHRvIGZpeGVkIGZ1bmN0aW9uIHByb2Nlc3NpbmcuIFNvIG1ha2Ugc3VyZSB3ZSBsZWF2ZSB0aGUKICAgICAgICAgICAgICAgICAqIGZpeGVkIGZ1bmN0aW9uIHZlcnRleCBwcm9jZXNzaW5nIHN0YXRlcyBiYWNrIGluIGEgc2FuZSBzdGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNoYWRlcnMKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pKSkgewogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9wcm9qZWN0aW9uKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfUFJPSkVDVElPTiksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKSkpIHsKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fd29ybGQoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIFZlcnRleCBhbmQgcGl4ZWwgc2hhZGVycyBhcmUgYXBwbGllZCB0b2dldGhlciBmb3Igbm93LCBzbyBsZXQgdGhlIGxhc3QgZGlydHkgc3RhdGUgZG8gdGhlCiAgICAgKiBhcHBsaWNhdGlvbgogICAgICovCiAgICBpZiAoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9QSVhFTFNIQURFUikpIHsKICAgICAgICBkZXZpY2UtPnNoYWRlcl9iYWNrZW5kLT5zaGFkZXJfc2VsZWN0KChJV2luZUQzRERldmljZSAqKWRldmljZSwgdXNlUGl4ZWxTaGFkZXJGdW5jdGlvbiwgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pOwoKICAgICAgICBpZiAoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCkgJiYgKHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uIHx8IHVzZVBpeGVsU2hhZGVyRnVuY3Rpb24pKSB7CiAgICAgICAgICAgIHNoYWRlcmNvbnN0YW50KFNUQVRFX1ZFUlRFWFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgY29udGV4dC0+bGFzdF93YXNfdnNoYWRlciA9IHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uOwoKICAgIGlmKHVwZGF0ZUZvZykgewogICAgICAgIHN0YXRlX2ZvZyhTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQogICAgaWYoIXVzZVZlcnRleFNoYWRlckZ1bmN0aW9uKSB7CiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVTOyBpKyspIHsKICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwICsgaSkpKSB7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZShTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwICsgaSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB2aWV3cG9ydChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFVJTlQgd2lkdGgsIGhlaWdodDsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnRhcmdldDsKCiAgICBnbERlcHRoUmFuZ2Uoc3RhdGVibG9jay0+dmlld3BvcnQuTWluWiwgc3RhdGVibG9jay0+dmlld3BvcnQuTWF4Wik7CiAgICBjaGVja0dMY2FsbCgiZ2xEZXB0aFJhbmdlIik7CiAgICAvKiBOb3RlOiBHTCByZXF1aXJlcyBsb3dlciBsZWZ0LCBEaXJlY3RYIHN1cHBsaWVzIHVwcGVyIGxlZnQuIFRoaXMgaXMgcmV2ZXJzZWQgd2hlbiB1c2luZyBvZmZzY3JlZW4gcmVuZGVyaW5nCiAgICAgKi8KICAgIGlmKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl9vZmZzY3JlZW4pIHsKICAgICAgICBnbFZpZXdwb3J0KHN0YXRlYmxvY2stPnZpZXdwb3J0LlgsCiAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT52aWV3cG9ydC5ZLAogICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dmlld3BvcnQuV2lkdGgsIHN0YXRlYmxvY2stPnZpZXdwb3J0LkhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICAgIHRhcmdldCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl90YXJnZXRzWzBdOwogICAgICAgIHRhcmdldC0+Z2V0X2RyYXdhYmxlX3NpemUodGFyZ2V0LCAmd2lkdGgsICZoZWlnaHQpOwoKICAgICAgICBnbFZpZXdwb3J0KHN0YXRlYmxvY2stPnZpZXdwb3J0LlgsCiAgICAgICAgICAgICAgICAgICAoaGVpZ2h0IC0gKHN0YXRlYmxvY2stPnZpZXdwb3J0LlkgKyBzdGF0ZWJsb2NrLT52aWV3cG9ydC5IZWlnaHQpKSwKICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnZpZXdwb3J0LldpZHRoLCBzdGF0ZWJsb2NrLT52aWV3cG9ydC5IZWlnaHQpOwogICAgfQoKICAgIGNoZWNrR0xjYWxsKCJnbFZpZXdwb3J0Iik7CgogICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+cG9zRml4dXBbMl0gPSAxLjAgLyBzdGF0ZWJsb2NrLT52aWV3cG9ydC5XaWR0aDsKICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnBvc0ZpeHVwWzNdID0gLXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnBvc0ZpeHVwWzFdIC8gc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0OwogICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pKSkgewogICAgICAgIHRyYW5zZm9ybV9wcm9qZWN0aW9uKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfUFJPSkVDVElPTiksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQogICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpKSkgewogICAgICAgIHN0YXRlX3BzY2FsZShTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KfQoKc3RhdGljIHZvaWQgbGlnaHQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBVSU5UIEluZGV4ID0gc3RhdGUgLSBTVEFURV9BQ1RJVkVMSUdIVCgwKTsKICAgIFBMSUdIVElORk9FTCAqbGlnaHRJbmZvID0gc3RhdGVibG9jay0+YWN0aXZlTGlnaHRzW0luZGV4XTsKCiAgICBpZighbGlnaHRJbmZvKSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUMCArIEluZGV4KTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX0xJR0hUMCArIEluZGV4KSIpOwogICAgfSBlbHNlIHsKICAgICAgICBmbG9hdCBxdWFkX2F0dDsKICAgICAgICBmbG9hdCBjb2xSR0JBW10gPSB7MC4wLCAwLjAsIDAuMCwgMC4wfTsKCiAgICAgICAgLyogTGlnaHQgc2V0dGluZ3MgYXJlIGFmZmVjdGVkIGJ5IHRoZSBtb2RlbCB2aWV3IGluIE9wZW5HTCwgdGhlIFZpZXcgdHJhbnNmb3JtIGluIGRpcmVjdDNkKi8KICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKICAgICAgICBnbFB1c2hNYXRyaXgoKTsKICAgICAgICBnbExvYWRNYXRyaXhmKChmbG9hdCAqKSZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwoKICAgICAgICAvKiBEaWZmdXNlOiAqLwogICAgICAgIGNvbFJHQkFbMF0gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuRGlmZnVzZS5yOwogICAgICAgIGNvbFJHQkFbMV0gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuRGlmZnVzZS5nOwogICAgICAgIGNvbFJHQkFbMl0gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuRGlmZnVzZS5iOwogICAgICAgIGNvbFJHQkFbM10gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuRGlmZnVzZS5hOwogICAgICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBJbmRleCwgR0xfRElGRlVTRSwgY29sUkdCQSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiIpOwoKICAgICAgICAvKiBTcGVjdWxhciAqLwogICAgICAgIGNvbFJHQkFbMF0gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuU3BlY3VsYXIucjsKICAgICAgICBjb2xSR0JBWzFdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlNwZWN1bGFyLmc7CiAgICAgICAgY29sUkdCQVsyXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5TcGVjdWxhci5iOwogICAgICAgIGNvbFJHQkFbM10gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuU3BlY3VsYXIuYTsKICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQRUNVTEFSLCBjb2xSR0JBKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGZ2Iik7CgogICAgICAgIC8qIEFtYmllbnQgKi8KICAgICAgICBjb2xSR0JBWzBdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkFtYmllbnQucjsKICAgICAgICBjb2xSR0JBWzFdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkFtYmllbnQuZzsKICAgICAgICBjb2xSR0JBWzJdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkFtYmllbnQuYjsKICAgICAgICBjb2xSR0JBWzNdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkFtYmllbnQuYTsKICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX0FNQklFTlQsIGNvbFJHQkEpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYiKTsKCiAgICAgICAgaWYgKChsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuUmFuZ2UgKmxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5SYW5nZSkgPj0gRkxUX01JTikgewogICAgICAgICAgICBxdWFkX2F0dCA9IDEuNC8obGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlJhbmdlICpsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuUmFuZ2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHF1YWRfYXR0ID0gMDsgLyogIDAgb3IgIE1BWD8gICgwIHNlZW1zIHRvIGJlIG9rKSAqLwogICAgICAgIH0KCiAgICAgICAgLyogRG8gbm90IGFzc2lnbiBhdHRlbnVhdGlvbiB2YWx1ZXMgZm9yIGxpZ2h0cyB0aGF0IGRvIG5vdCB1c2UgdGhlbS4gRDNEIGFwcHMgYXJlIGZyZWUgdG8gcGFzcyBhbnkganVuaywKICAgICAgICAgKiBidXQgZ2wgZHJpdmVycyB1c2UgdGhlbSBhbmQgbWF5IGNyYXNoIGR1ZSB0byBiYWQgQXR0ZW51YXRpb24gdmFsdWVzLiBOZWVkIGZvciBTcGVlZCBtb3N0IHdhbnRlZCBzZXRzCiAgICAgICAgICogQXR0ZW51YXRpb24wIHRvIE5hTiBhbmQgY3Jhc2hlcyBpbiB0aGUgZ2wgbGliCiAgICAgICAgICovCgogICAgICAgIHN3aXRjaCAobGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlR5cGUpIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNETElHSFRfUE9JTlQ6CiAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiAqLwogICAgICAgICAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9QT1NJVElPTiwgJmxpZ2h0SW5mby0+bGlnaHRQb3NuWzBdKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYiKTsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9TUE9UX0NVVE9GRiwgbGlnaHRJbmZvLT5jdXRvZmYpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICAvKiBBdHRlbnVhdGlvbiAtIEFyZSB0aGVzZSByaWdodD8gZ3Vlc3NpbmcuLi4gKi8KICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiwgIGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BdHRlbnVhdGlvbjApOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfTElORUFSX0FUVEVOVUFUSU9OLCAgICBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuQXR0ZW51YXRpb24xKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgaWYgKHF1YWRfYXR0IDwgbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMikgcXVhZF9hdHQgPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuQXR0ZW51YXRpb24yOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiwgcXVhZF9hdHQpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICAvKiBGSVhNRTogUmFuZ2UgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNETElHSFRfU1BPVDoKICAgICAgICAgICAgICAgIC8qIFBvc2l0aW9uICovCiAgICAgICAgICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1BPU0lUSU9OLCAmbGlnaHRJbmZvLT5saWdodFBvc25bMF0pOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiIpOwogICAgICAgICAgICAgICAgLyogRGlyZWN0aW9uICovCiAgICAgICAgICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQT1RfRElSRUNUSU9OLCAmbGlnaHRJbmZvLT5saWdodERpcm5bMF0pOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQT1RfRVhQT05FTlQsIGxpZ2h0SW5mby0+ZXhwb25lbnQpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfU1BPVF9DVVRPRkYsIGxpZ2h0SW5mby0+Y3V0b2ZmKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgLyogQXR0ZW51YXRpb24gLSBBcmUgdGhlc2UgcmlnaHQ/IGd1ZXNzaW5nLi4uICovCiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sICBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuQXR0ZW51YXRpb24wKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX0xJTkVBUl9BVFRFTlVBVElPTiwgICAgbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIGlmIChxdWFkX2F0dCA8IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BdHRlbnVhdGlvbjIpIHF1YWRfYXR0ID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMjsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04sIHF1YWRfYXR0KTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgLyogRklYTUU6IFJhbmdlICovCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRExJR0hUX0RJUkVDVElPTkFMOgogICAgICAgICAgICAgICAgLyogRGlyZWN0aW9uICovCiAgICAgICAgICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1BPU0lUSU9OLCAmbGlnaHRJbmZvLT5saWdodFBvc25bMF0pOyAvKiBOb3RlIGdsIHVzZXMgdyBwb3NpdGlvbiBvZiAwIGZvciBkaXJlY3Rpb24hICovCiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGZ2Iik7CiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfU1BPVF9DVVRPRkYsIGxpZ2h0SW5mby0+Y3V0b2ZmKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQT1RfRVhQT05FTlQsIDAuMGYpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIGxpZ2h0IHR5cGUgJWRcbiIsIGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5UeXBlKTsKICAgICAgICB9CgogICAgICAgIC8qIFJlc3RvcmUgdGhlIG1vZGVsdmlldyBtYXRyaXggKi8KICAgICAgICBnbFBvcE1hdHJpeCgpOwoKICAgICAgICBnbEVuYWJsZShHTF9MSUdIVDAgKyBJbmRleCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX0xJR0hUMCArIEluZGV4KSIpOwogICAgfQoKICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgc2Npc3NvcnJlY3QoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBSRUNUICpwUmVjdCA9ICZzdGF0ZWJsb2NrLT5zY2lzc29yUmVjdDsKICAgIFVJTlQgaGVpZ2h0OwogICAgVUlOVCB3aWR0aDsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnRhcmdldCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl90YXJnZXRzWzBdOwoKICAgIHRhcmdldC0+Z2V0X2RyYXdhYmxlX3NpemUodGFyZ2V0LCAmd2lkdGgsICZoZWlnaHQpOwogICAgLyogV2FybmluZzogZ2xTY2lzc29yIHVzZXMgd2luZG93IGNvb3JkaW5hdGVzLCBub3Qgdmlld3BvcnQgY29vcmRpbmF0ZXMsIHNvIG91ciB2aWV3cG9ydCBjb3JyZWN0aW9uIGRvZXMgbm90IGFwcGx5CiAgICAgKiBXYXJuaW5nMjogRXZlbiBpbiB3aW5kb3dlZCBtb2RlIHRoZSBjb29yZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3csIG5vdCB0aGUgc2NyZWVuCiAgICAgKi8KICAgIFRSQUNFKCIoJXApIFNldHRpbmcgbmV3IFNjaXNzb3IgUmVjdCB0byAlZDolZC0lZDolZFxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgcFJlY3QtPmxlZnQsIHBSZWN0LT5ib3R0b20gLSBoZWlnaHQsCiAgICAgICAgICBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApOwoKICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgZ2xTY2lzc29yKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApOwogICAgfSBlbHNlIHsKICAgICAgICBnbFNjaXNzb3IocFJlY3QtPmxlZnQsIGhlaWdodCAtIHBSZWN0LT5ib3R0b20sIHBSZWN0LT5yaWdodCAtIHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tIC0gcFJlY3QtPnRvcCk7CiAgICB9CiAgICBjaGVja0dMY2FsbCgiZ2xTY2lzc29yIik7Cn0KCnN0YXRpYyB2b2lkIGluZGV4YnVmZmVyKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JVRkZFUl9PQkpFQ1QpKSB7CiAgICAgICAgaWYoc3RhdGVibG9jay0+c3RyZWFtSXNVUCB8fCBzdGF0ZWJsb2NrLT5wSW5kZXhEYXRhID09IE5VTEwgKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiwgMCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsICppYiA9IChJV2luZUQzREluZGV4QnVmZmVySW1wbCAqKSBzdGF0ZWJsb2NrLT5wSW5kZXhEYXRhOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsIGliLT52Ym8pKTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGZyb250ZmFjZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl9vZmZzY3JlZW4pIHsKICAgICAgICBnbEZyb250RmFjZShHTF9DQ1cpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEZyb250RmFjZShHTF9DQ1cpIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRnJvbnRGYWNlKEdMX0NXKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xGcm9udEZhY2UoR0xfQ1cpIik7CiAgICB9Cn0KCmNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5IFN0YXRlVGFibGVbXSA9CnsKICAgICAgLyogU3RhdGUgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5IGZ1bmN0aW9uICovCiAgICB7IC8qIDAsICBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDEsICBXSU5FRDNEUlNfVEVYVFVSRUhBTkRMRSAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogSGFuZGxlZCBpbiBkZHJhdyAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDIsICBXSU5FRDNEUlNfQU5USUFMSUFTICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQU5USUFMSUFTKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9hbnRpYWxpYXMgICAgIH0sCiAgICB7IC8qIDMsICBXSU5FRDNEUlNfVEVYVFVSRUFERFJFU1MgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogSGFuZGxlZCBpbiBkZHJhdyAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDQsICBXSU5FRDNEUlNfVEVYVFVSRVBFUlNQRUNUSVZFICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfVEVYVFVSRVBFUlNQRUNUSVZFKSwgICAgICAgICBzdGF0ZV9wZXJzcGVjdGl2ZSAgIH0sCiAgICB7IC8qIDUsICBXSU5FRDNEUlNfV1JBUFUgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUFUpLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwdSAgICAgICAgIH0sCiAgICB7IC8qIDYsICBXSU5FRDNEUlNfV1JBUFYgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUFYpLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwdiAgICAgICAgIH0sCiAgICB7IC8qIDcsICBXSU5FRDNEUlNfWkVOQUJMRSAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfWkVOQUJMRSksICAgICAgICAgICAgICAgICAgICBzdGF0ZV96ZW5hYmxlICAgICAgIH0sCiAgICB7IC8qIDgsICBXSU5FRDNEUlNfRklMTE1PREUgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRklMTE1PREUpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9maWxsbW9kZSAgICAgIH0sCiAgICB7IC8qIDksICBXSU5FRDNEUlNfU0hBREVNT0RFICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU0hBREVNT0RFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9zaGFkZW1vZGUgICAgIH0sCiAgICB7IC8qIDEwLCBXSU5FRDNEUlNfTElORVBBVFRFUk4gICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTElORVBBVFRFUk4pLCAgICAgICAgICAgICAgICBzdGF0ZV9saW5lcGF0dGVybiAgIH0sCiAgICB7IC8qIDExLCBXSU5FRDNEUlNfTU9OT0VOQUJMRSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTU9OT0VOQUJMRSksICAgICAgICAgICAgICAgICBzdGF0ZV9tb25vZW5hYmxlICAgIH0sCiAgICB7IC8qIDEyLCBXSU5FRDNEUlNfUk9QMiAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUk9QMiksICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9yb3AyICAgICAgICAgIH0sCiAgICB7IC8qIDEzLCBXSU5FRDNEUlNfUExBTkVNQVNLICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUExBTkVNQVNLKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9wbGFuZW1hc2sgICAgIH0sCiAgICB7IC8qIDE0LCBXSU5FRDNEUlNfWldSSVRFRU5BQkxFICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfWldSSVRFRU5BQkxFKSwgICAgICAgICAgICAgICBzdGF0ZV96d3JpdGVuYWJsZSAgIH0sCiAgICB7IC8qIDE1LCBXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFKSwgICAgICAgICAgICBzdGF0ZV9hbHBoYSAgICAgICAgIH0sCiAgICB7IC8qIDE2LCBXSU5FRDNEUlNfTEFTVFBJWEVMICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTEFTVFBJWEVMKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9sYXN0cGl4ZWwgICAgIH0sCiAgICB7IC8qIDE3LCBXSU5FRDNEUlNfVEVYVFVSRU1BRyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogSGFuZGxlZCBpbiBkZHJhdyAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDE4LCBXSU5FRDNEUlNfVEVYVFVSRU1JTiAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogSGFuZGxlZCBpbiBkZHJhdyAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDE5LCBXSU5FRDNEUlNfU1JDQkxFTkQgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH0sCiAgICB7IC8qIDIwLCBXSU5FRDNEUlNfREVTVEJMRU5EICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH0sCiAgICB7IC8qIDIxLCBXSU5FRDNEUlNfVEVYVFVSRU1BUEJMRU5EICAgICAgICAgICAgICAqLyAgICAgIDAgLyogSGFuZGxlZCBpbiBkZHJhdyAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDIyLCBXSU5FRDNEUlNfQ1VMTE1PREUgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ1VMTE1PREUpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9jdWxsbW9kZSAgICAgIH0sCiAgICB7IC8qIDIzLCBXSU5FRDNEUlNfWkZVTkMgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfWkZVTkMpLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV96ZnVuYyAgICAgICAgIH0sCiAgICB7IC8qIDI0LCBXSU5FRDNEUlNfQUxQSEFSRUYgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFKSwgICAgICAgICAgICBzdGF0ZV9hbHBoYSAgICAgICAgIH0sCiAgICB7IC8qIDI1LCBXSU5FRDNEUlNfQUxQSEFGVU5DICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFKSwgICAgICAgICAgICBzdGF0ZV9hbHBoYSAgICAgICAgIH0sCiAgICB7IC8qIDI2LCBXSU5FRDNEUlNfRElUSEVSRU5BQkxFICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRElUSEVSRU5BQkxFKSwgICAgICAgICAgICAgICBzdGF0ZV9kaXRoZXJlbmFibGUgIH0sCiAgICB7IC8qIDI3LCBXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH0sCiAgICB7IC8qIDI4LCBXSU5FRDNEUlNfRk9HRU5BQkxFICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HRU5BQkxFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2cgICAgICAgICAgIH0sCiAgICB7IC8qIDI5LCBXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEUgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEUpLCAgICAgICAgICAgICBzdGF0ZV9zcGVjdWxhcmVuYWJsZX0sCiAgICB7IC8qIDMwLCBXSU5FRDNEUlNfWlZJU0lCTEUgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogTm90IHN1cHBvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG1zZG4gKi8sICAgICAgICBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICB7IC8qIDMxLCBXSU5FRDNEUlNfU1VCUElYRUwgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1VCUElYRUwpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9zdWJwaXhlbCAgICAgIH0sCiAgICB7IC8qIDMyLCBXSU5FRDNEUlNfU1VCUElYRUxYICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1VCUElYRUxYKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9zdWJwaXhlbHggICAgIH0sCiAgICB7IC8qIDMzLCBXSU5FRDNEUlNfU1RJUFBMRURBTFBIQSAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RJUFBMRURBTFBIQSksICAgICAgICAgICAgICBzdGF0ZV9zdGlwcGxlZGFscGhhIH0sCiAgICB7IC8qIDM0LCBXSU5FRDNEUlNfRk9HQ09MT1IgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HQ09MT1IpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2djb2xvciAgICAgIH0sCiAgICB7IC8qIDM1LCBXSU5FRDNEUlNfRk9HVEFCTEVNT0RFICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HRU5BQkxFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2cgICAgICAgICAgIH0sCiAgICB7IC8qIDM2LCBXSU5FRDNEUlNfRk9HU1RBUlQgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HRU5BQkxFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2cgICAgICAgICAgIH0sCiAgICB7IC8qIDM3LCBXSU5FRDNEUlNfRk9HRU5EICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HRU5BQkxFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2cgICAgICAgICAgIH0sCiAgICB7IC8qIDM4LCBXSU5FRDNEUlNfRk9HREVOU0lUWSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HREVOU0lUWSksICAgICAgICAgICAgICAgICBzdGF0ZV9mb2dkZW5zaXR5ICAgIH0sCiAgICB7IC8qIDM5LCBXSU5FRDNEUlNfU1RJUFBMRUVOQUJMRSAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RJUFBMRUVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGlwcGxlZW5hYmxlIH0sCiAgICB7IC8qIDQwLCBXSU5FRDNEUlNfRURHRUFOVElBTElBUyAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH0sCiAgICB7IC8qIDQxLCBXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEUgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFKSwgICAgICAgICAgICBzdGF0ZV9hbHBoYSAgICAgICAgIH0sCiAgICB7IC8qIDQyLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDQzLCBXSU5FRDNEUlNfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQk9SREVSQ09MT1IpLCAgICAgICAgICAgICAgICBzdGF0ZV9ib3JkZXJjb2xvciAgIH0sCiAgICB7IC8qIDQ0LCBXSU5FRDNEUlNfVEVYVFVSRUFERFJFU1NVICAgICAgICAgICAgICAqLyAgICAgIDAsIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDQ1LCBXSU5FRDNEUlNfVEVYVFVSRUFERFJFU1NWICAgICAgICAgICAgICAqLyAgICAgIDAsIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDQ2LCBXSU5FRDNEUlNfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTUlQTUFQTE9EQklBUyksICAgICAgICAgICAgICBzdGF0ZV9taXBtYXBsb2RiaWFzIH0sCiAgICB7IC8qIDQ3LCBXSU5FRDNEUlNfWkJJQVMgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfWkJJQVMpLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV96YmlhcyAgICAgICAgIH0sCiAgICB7IC8qIDQ4LCBXSU5FRDNEUlNfUkFOR0VGT0dFTkFCTEUgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUkFOR0VGT0dFTkFCTEUpLCAgICAgICAgICAgICBzdGF0ZV9yYW5nZWZvZyAgICAgIH0sCiAgICB7IC8qIDQ5LCBXSU5FRDNEUlNfQU5JU09UUk9QWSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQU5JU09UUk9QWSksICAgICAgICAgICAgICAgICBzdGF0ZV9hbmlzb3Ryb3B5ICAgIH0sCiAgICB7IC8qIDUwLCBXSU5FRDNEUlNfRkxVU0hCQVRDSCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRkxVU0hCQVRDSCksICAgICAgICAgICAgICAgICBzdGF0ZV9mbHVzaGJhdGNoICAgIH0sCiAgICB7IC8qIDUxLCBXSU5FRDNEUlNfVFJBTlNMVUNFTlRTT1JUSU5ERVBFTkRFTlQgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfVFJBTlNMVUNFTlRTT1JUSU5ERVBFTkRFTlQpLCBzdGF0ZV90cmFuc2x1Y2VudHNpIH0sCiAgICB7IC8qIDUyLCBXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDUzLCBXSU5FRDNEUlNfU1RFTkNJTEZBSUwgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU0LCBXSU5FRDNEUlNfU1RFTkNJTFpGQUlMICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU1LCBXSU5FRDNEUlNfU1RFTkNJTFBBU1MgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU2LCBXSU5FRDNEUlNfU1RFTkNJTEZVTkMgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU3LCBXSU5FRDNEUlNfU1RFTkNJTFJFRiAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU4LCBXSU5FRDNEUlNfU1RFTkNJTE1BU0sgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSksICAgICAgICAgICAgICBzdGF0ZV9zdGVuY2lsICAgICAgIH0sCiAgICB7IC8qIDU5LCBXSU5FRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyksICAgICAgICAgICBzdGF0ZV9zdGVuY2lsd3JpdGUgIH0sCiAgICB7IC8qIDYwLCBXSU5FRDNEUlNfVEVYVFVSRUZBQ1RPUiAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfVEVYVFVSRUZBQ1RPUiksICAgICAgICAgICAgICBzdGF0ZV90ZXhmYWN0b3IgICAgIH0sCiAgICB7IC8qIDYxLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDYyLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDYzLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY0LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wMCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY1LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wMSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBoZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY2LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wMiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY3LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wMyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY4LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDY5LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDcwLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDcxLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDcyLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wOCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDczLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wOSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc0LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc1LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc2LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc3LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc4LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xNCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDc5LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xNSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDgwLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xNiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDgxLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xNyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDgyLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xOCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDgzLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xOSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg0LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yMCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg1LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yMSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg2LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yMiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg3LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yMyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg4LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yNCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDg5LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yNSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDkwLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yNiAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDkxLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yNyAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDkyLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yOCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDkzLCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yOSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk0LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4zMCAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk1LCBXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4zMSAgICAgICAgICAgICAqLyAgICAgIDAgLyogT2Jzb2xldGUsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGRkcmF3ICovLCAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk2LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk3LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk4LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qIDk5LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTAwLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTAxLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTAyLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTAzLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA0LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA1LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA2LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA3LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA4LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTA5LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTEwLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTExLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTEyLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTEzLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE0LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE1LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE2LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE3LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE4LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTE5LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTIwLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTIxLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTIyLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTIzLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTI0LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTI1LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTI2LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTI3LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICAvKiBCaWcgaG9sZSBlbmRzICovCiAgICB7IC8qMTI4LCBXSU5FRDNEUlNfV1JBUDAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTI5LCBXSU5FRDNEUlNfV1JBUDEgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTMwLCBXSU5FRDNEUlNfV1JBUDIgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTMxLCBXSU5FRDNEUlNfV1JBUDMgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTMyLCBXSU5FRDNEUlNfV1JBUDQgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTMzLCBXSU5FRDNEUlNfV1JBUDUgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTM0LCBXSU5FRDNEUlNfV1JBUDYgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTM1LCBXSU5FRDNEUlNfV1JBUDcgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfV1JBUDApLCAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV93cmFwICAgICAgICAgIH0sCiAgICB7IC8qMTM2LCBXSU5FRDNEUlNfQ0xJUFBJTkcgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ0xJUFBJTkcpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9jbGlwcGluZyAgICAgIH0sCiAgICB7IC8qMTM3LCBXSU5FRDNEUlNfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTElHSFRJTkcpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9saWdodGluZyAgICAgIH0sCiAgICB7IC8qMTM4LCBXSU5FRDNEUlNfRVhURU5UUyAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRVhURU5UUyksICAgICAgICAgICAgICAgICAgICBzdGF0ZV9leHRlbnRzICAgICAgIH0sCiAgICB7IC8qMTM5LCBXSU5FRDNEUlNfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQU1CSUVOVCksICAgICAgICAgICAgICAgICAgICBzdGF0ZV9hbWJpZW50ICAgICAgIH0sCiAgICB7IC8qMTQwLCBXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERSAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfRk9HRU5BQkxFKSwgICAgICAgICAgICAgICAgICBzdGF0ZV9mb2cgICAgICAgICAgIH0sCiAgICB7IC8qMTQxLCBXSU5FRDNEUlNfQ09MT1JWRVJURVggICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpLCAgICAgICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdCAgICAgIH0sCiAgICB7IC8qMTQyLCBXSU5FRDNEUlNfTE9DQUxWSUVXRVIgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTE9DQUxWSUVXRVIpLCAgICAgICAgICAgICAgICBzdGF0ZV9sb2NhbHZpZXdlciAgIH0sCiAgICB7IC8qMTQzLCBXSU5FRDNEUlNfTk9STUFMSVpFTk9STUFMUyAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTk9STUFMSVpFTk9STUFMUyksICAgICAgICAgICBzdGF0ZV9ub3JtYWxpemUgICAgIH0sCiAgICB7IC8qMTQ0LCBXSU5FRDNEUlNfQ09MT1JLRVlCTEVOREVOQUJMRSAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JLRVlCTEVOREVOQUJMRSksICAgICAgICBzdGF0ZV9ja2V5YmxlbmQgICAgIH0sCiAgICB7IC8qMTQ1LCBXSU5FRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpLCAgICAgICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdCAgICAgIH0sCiAgICB7IC8qMTQ2LCBXSU5FRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpLCAgICAgICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdCAgICAgIH0sCiAgICB7IC8qMTQ3LCBXSU5FRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpLCAgICAgICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdCAgICAgIH0sCiAgICB7IC8qMTQ4LCBXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JWRVJURVgpLCAgICAgICAgICAgICAgICBzdGF0ZV9jb2xvcm1hdCAgICAgIH0sCiAgICB7IC8qMTQ5LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTUwLCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTUxLCBXSU5FRDNEUlNfVkVSVEVYQkxFTkQgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfVkVSVEVYQkxFTkQpLCAgICAgICAgICAgICAgICBzdGF0ZV92ZXJ0ZXhibGVuZCAgIH0sCiAgICB7IC8qMTUyLCBXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ0xJUFBJTkcpLCAgICAgICAgICAgICAgICAgICBzdGF0ZV9jbGlwcGluZyAgICAgIH0sCiAgICB7IC8qMTUzLCBXSU5FRDNEUlNfU09GVFdBUkVWRVJURVhQUk9DRVNTSU5HICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICB7IC8qMTU0LCBXSU5FRDNEUlNfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9wc2NhbGUgICAgICAgIH0sCiAgICB7IC8qMTU1LCBXSU5FRDNEUlNfUE9JTlRTSVpFX01JTiAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTSVpFX01JTiksICAgICAgICAgICAgICBzdGF0ZV9wc2l6ZW1pbiAgICAgIH0sCiAgICB7IC8qMTU2LCBXSU5FRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUpLCAgICAgICAgICBzdGF0ZV9wb2ludHNwcml0ZSAgIH0sCiAgICB7IC8qMTU3LCBXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9wc2NhbGUgICAgICAgIH0sCiAgICB7IC8qMTU4LCBXSU5FRDNEUlNfUE9JTlRTQ0FMRV9BICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9wc2NhbGUgICAgICAgIH0sCiAgICB7IC8qMTU5LCBXSU5FRDNEUlNfUE9JTlRTQ0FMRV9CICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9wc2NhbGUgICAgICAgIH0sCiAgICB7IC8qMTYwLCBXSU5FRDNEUlNfUE9JTlRTQ0FMRV9DICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9wc2NhbGUgICAgICAgIH0sCiAgICB7IC8qMTYxLCBXSU5FRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMpLCAgICAgICBzdGF0ZV9tdWx0aXNhbXBsZWFhIH0sCiAgICB7IC8qMTYyLCBXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLKSwgICAgICAgICAgICBzdGF0ZV9tdWx0aXNhbXBtYXNrIH0sCiAgICB7IC8qMTYzLCBXSU5FRDNEUlNfUEFUQ0hFREdFU1RZTEUgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUEFUQ0hFREdFU1RZTEUpLCAgICAgICAgICAgICBzdGF0ZV9wYXRjaGVkZ2VzdHlsZX0sCiAgICB7IC8qMTY0LCBXSU5FRDNEUlNfUEFUQ0hTRUdNRU5UUyAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUEFUQ0hTRUdNRU5UUyksICAgICAgICAgICAgICBzdGF0ZV9wYXRjaHNlZ21lbnRzIH0sCiAgICB7IC8qMTY1LCBXSU5FRDNEUlNfREVCVUdNT05JVE9SVE9LRU4gICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfREVCVUdNT05JVE9SVE9LRU4pLCAgICAgICAgICBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICB7IC8qMTY2LCBXSU5FRDNEUlNfUE9JTlRTSVpFX01BWCAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTSVpFX01BWCksICAgICAgICAgICAgICBzdGF0ZV9wc2l6ZW1heCAgICAgIH0sCiAgICB7IC8qMTY3LCBXSU5FRDNEUlNfSU5ERVhFRFZFUlRFWEJMRU5ERU5BQkxFICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICB7IC8qMTY4LCBXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRSksICAgICAgICAgICBzdGF0ZV9jb2xvcndyaXRlICAgIH0sCiAgICB7IC8qMTY5LCBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMTcwLCBXSU5FRDNEUlNfVFdFRU5GQUNUT1IgICAgICAgICAgICAgICAgICAqLyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICB7IC8qMTcxLCBXSU5FRDNEUlNfQkxFTkRPUCAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQkxFTkRPUCksICAgICAgICAgICAgICAgICAgICBzdGF0ZV9ibGVuZG9wICAgICAgIH0sCiAgICB7IC8qMTcyLCBXSU5FRDNEUlNfUE9TSVRJT05ERUdSRUUgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9TSVRJT05ERUdSRUUpLCAgICAgICAgICAgICBzdGF0ZV9wb3NpdGlvbmRlZ3JlZX0sCiAgICB7IC8qMTczLCBXSU5FRDNEUlNfTk9STUFMREVHUkVFICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTk9STUFMREVHUkVFKSwgICAgICAgICAgICAgICBzdGF0ZV9ub3JtYWxkZWdyZWUgIH0sCiAgICAgIC8qMTcyLCBXSU5FRDNEUlNfUE9TSVRJT05PUkRFUiAgICAgICAgICAgICAgICAqLyAgICAgIC8qIFZhbHVlIGFzc2lnbmVkIHRvIDIgc3RhdGUgbmFtZXMgKi8KICAgICAgLyoxNzMsIFdJTkVEM0RSU19OT1JNQUxPUkRFUiAgICAgICAgICAgICAgICAgICovICAgICAgLyogVmFsdWUgYXNzaWduZWQgdG8gMiBzdGF0ZSBuYW1lcyAqLwogICAgeyAvKjE3NCwgV0lORUQzRFJTX1NDSVNTT1JURVNURU5BQkxFICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NDSVNTT1JURVNURU5BQkxFKSwgICAgICAgICAgc3RhdGVfc2Npc3NvciAgICAgICB9LAogICAgeyAvKjE3NSwgV0lORUQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVMgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0RFUFRIQklBUyksICAgICAgICAgICAgICAgICAgc3RhdGVfZGVwdGhiaWFzICAgICB9LAogICAgeyAvKjE3NiwgV0lORUQzRFJTX0FOVElBTElBU0VETElORUVOQUJMRSAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfYmxlbmQgICAgICAgICB9LAogICAgeyAvKjE3NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3OCwgV0lORUQzRFJTX01JTlRFU1NFTExBVElPTkxFVkVMICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE3OSwgV0lORUQzRFJTX01BWFRFU1NFTExBVElPTkxFVkVMICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4MCwgV0lORUQzRFJTX0FEQVBUSVZFVEVTU19YICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4MSwgV0lORUQzRFJTX0FEQVBUSVZFVEVTU19ZICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4MiwgV0lORUQzRFJTX0FEQVBUSVZFVEVTU19aICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4MywgV0lORUQzRFJTX0FEQVBUSVZFVEVTU19XICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4NCwgV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKSwgc3RhdGVfdGVzc2VsbGF0aW9uICB9LAogICAgeyAvKjE4NSwgV0lORUQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREUgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKjE4NiwgV0lORUQzRFJTX0NDV19TVEVOQ0lMRkFJTCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKjE4NywgV0lORUQzRFJTX0NDV19TVEVOQ0lMWkZBSUwgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKjE4OCwgV0lORUQzRFJTX0NDV19TVEVOQ0lMUEFTUyAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKjE4OSwgV0lORUQzRFJTX0NDV19TVEVOQ0lMRlVOQyAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKjE5MCwgV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUxICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfY29sb3J3cml0ZSAgICB9LAogICAgeyAvKjE5MSwgV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUyICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfY29sb3J3cml0ZSAgICB9LAogICAgeyAvKjE5MiwgV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUzICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfY29sb3J3cml0ZSAgICB9LAogICAgeyAvKjE5MywgV0lORUQzRFJTX0JMRU5ERkFDVE9SICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0JMRU5ERkFDVE9SKSwgICAgICAgICAgICAgICAgc3RhdGVfYmxlbmRmYWN0b3IgICB9LAogICAgeyAvKjE5NCwgV0lORUQzRFJTX1NSR0JXUklURUVOQUJMRSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9QSVhFTFNIQURFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzaGFkZXIgICAgICAgICB9LAogICAgeyAvKjE5NSwgV0lORUQzRFJTX0RFUFRIQklBUyAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0RFUFRIQklBUyksICAgICAgICAgICAgICAgICAgc3RhdGVfZGVwdGhiaWFzICAgICB9LAogICAgeyAvKjE5NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5OCwgV0lORUQzRFJTX1dSQVA4ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjE5OSwgV0lORUQzRFJTX1dSQVA5ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwMCwgV0lORUQzRFJTX1dSQVAxMCAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwMSwgV0lORUQzRFJTX1dSQVAxMSAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwMiwgV0lORUQzRFJTX1dSQVAxMiAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwMywgV0lORUQzRFJTX1dSQVAxMyAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwNCwgV0lORUQzRFJTX1dSQVAxNCAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwNSwgV0lORUQzRFJTX1dSQVAxNSAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjIwNiwgV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSksICAgc3RhdGVfc2VwYXJhdGVibGVuZCB9LAogICAgeyAvKjIwNywgV0lORUQzRFJTX1NSQ0JMRU5EQUxQSEEgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSksICAgc3RhdGVfc2VwYXJhdGVibGVuZCB9LAogICAgeyAvKjIwOCwgV0lORUQzRFJTX0RFU1RCTEVOREFMUEhBICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSksICAgc3RhdGVfc2VwYXJhdGVibGVuZCB9LAogICAgeyAvKjIwOSwgV0lORUQzRFJTX0JMRU5ET1BBTFBIQSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NFUEFSQVRFQUxQSEFCTEVOREVOQUJMRSksICAgc3RhdGVfc2VwYXJhdGVibGVuZCB9LAogICAgLyogVGV4dHVyZSBzdGFnZSBzdGF0ZXMgKi8KICAgIHsgLyowLCAwMSwgV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyowLCAwMiwgV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyowLCAwMywgV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyowLCAwNCwgV0lORUQzRFRTU19BTFBIQU9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAwNSwgV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAwNiwgV0lORUQzRFRTU19BTFBIQUFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAwNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyowLCAwOCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyowLCAwOSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyowLCAxMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyowLCAxMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCksICAgIHRleF9jb29yZGluZGV4ICAgICAgfSwKICAgIHsgLyowLCAxMiwgV0lORUQzRFRTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxMywgV0lORUQzRFRTU19BRERSRVNTVSAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxNCwgV0lORUQzRFRTU19BRERSRVNTViAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxNSwgV0lORUQzRFRTU19CT1JERVJDT0xPUiAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxNiwgV0lORUQzRFRTU19NQUdGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxNywgV0lORUQzRFRTU19NSU5GSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxOCwgV0lORUQzRFRTU19NSVBGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAxOSwgV0lORUQzRFRTU19NSVBNQVBMT0RCSUFTICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAyMCwgV0lORUQzRFRTU19NQVhNSVBMRVZFTCAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAyMSwgV0lORUQzRFRTU19NQVhBTklTT1RST1BZICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAyMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSksICAgIHRleF9idW1wZW52bHNjYWxlICAgfSwKICAgIHsgLyowLCAyMywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQpLCAgIHRleF9idW1wZW52bG9mZnNldCAgfSwKICAgIHsgLyowLCAyNCwgV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyowLCAyNSwgV0lORUQzRFRTU19BRERSRVNTVyAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAyNiwgV0lORUQzRFRTU19DT0xPUkFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyowLCAyNywgV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAyOCwgV0lORUQzRFRTU19SRVNVTFRBUkcgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfUkVTVUxUQVJHKSwgICAgICAgIHRleF9yZXN1bHRhcmcgICAgICAgfSwKICAgIHsgLyowLCAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyowLCAzMiwgV0lORUQzRFRTU19DT05TVEFOVCAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiBBcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgRDNEVEFfQ09OU1RBTlQgKi8sIHN0YXRlX25vZ2wgICAgICAgICAgfSwKCiAgICB7IC8qMSwgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMSwgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMSwgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMSwgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMSwgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qMSwgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qMSwgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qMSwgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTEpLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qMSwgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMSwgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICB0ZXhfcmVzdWx0YXJnICAgICAgIH0sCiAgICB7IC8qMSwgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMSwgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCgogICAgeyAvKjIsIDAxLCBXSU5FRDNEVFNTX0NPTE9ST1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjIsIDAyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjIsIDAzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjIsIDA0LCBXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjIsIDA1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjIsIDA2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjIsIDA3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjIsIDA4LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjIsIDA5LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjIsIDEwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjIsIDExLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19URVhDT09SRElOREVYKSwgICAgdGV4X2Nvb3JkaW5kZXggICAgICB9LAogICAgeyAvKjIsIDEyLCBXSU5FRDNEVFNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDEzLCBXSU5FRDNEVFNTX0FERFJFU1NVICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE0LCBXSU5FRDNEVFNTX0FERFJFU1NWICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE1LCBXSU5FRDNEVFNTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE2LCBXSU5FRDNEVFNTX01BR0ZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE3LCBXSU5FRDNEVFNTX01JTkZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE4LCBXSU5FRDNEVFNTX01JUEZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDE5LCBXSU5FRDNEVFNTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDIwLCBXSU5FRDNEVFNTX01BWE1JUExFVkVMICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDIxLCBXSU5FRDNEVFNTX01BWEFOSVNPVFJPUFkgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDIyLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFKSwgICAgdGV4X2J1bXBlbnZsc2NhbGUgICB9LAogICAgeyAvKjIsIDIzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCksICAgdGV4X2J1bXBlbnZsb2Zmc2V0ICB9LAogICAgeyAvKjIsIDI0LCBXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUyKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKjIsIDI1LCBXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDI2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjIsIDI3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjIsIDI4LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19SRVNVTFRBUkcpLCAgICAgICAgdGV4X3Jlc3VsdGFyZyAgICAgICB9LAogICAgeyAvKjIsIDI5LCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDMwLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDMxLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIsIDMyLCBXSU5FRDNEVFNTX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBEM0RUQV9DT05TVEFOVCAqLywgc3RhdGVfbm9nbCAgICAgICAgICB9LAoKICAgIHsgLyozLCAwMSwgV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyozLCAwMiwgV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyozLCAwMywgV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyozLCAwNCwgV0lORUQzRFRTU19BTFBIQU9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyozLCAwNSwgV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyozLCAwNiwgV0lORUQzRFRTU19BTFBIQUFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyozLCAwNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyozLCAwOCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyozLCAwOSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyozLCAxMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyozLCAxMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCksICAgIHRleF9jb29yZGluZGV4ICAgICAgfSwKICAgIHsgLyozLCAxMiwgV0lORUQzRFRTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxMywgV0lORUQzRFRTU19BRERSRVNTVSAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxNCwgV0lORUQzRFRTU19BRERSRVNTViAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxNSwgV0lORUQzRFRTU19CT1JERVJDT0xPUiAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxNiwgV0lORUQzRFRTU19NQUdGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxNywgV0lORUQzRFRTU19NSU5GSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxOCwgV0lORUQzRFRTU19NSVBGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAxOSwgV0lORUQzRFRTU19NSVBNQVBMT0RCSUFTICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAyMCwgV0lORUQzRFRTU19NQVhNSVBMRVZFTCAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAyMSwgV0lORUQzRFRTU19NQVhBTklTT1RST1BZICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAyMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSksICAgIHRleF9idW1wZW52bHNjYWxlICAgfSwKICAgIHsgLyozLCAyMywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQpLCAgIHRleF9idW1wZW52bG9mZnNldCAgfSwKICAgIHsgLyozLCAyNCwgV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMyksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyozLCAyNSwgV0lORUQzRFRTU19BRERSRVNTVyAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAyNiwgV0lORUQzRFRTU19DT0xPUkFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyozLCAyNywgV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyozLCAyOCwgV0lORUQzRFRTU19SRVNVTFRBUkcgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfUkVTVUxUQVJHKSwgICAgICAgIHRleF9yZXN1bHRhcmcgICAgICAgfSwKICAgIHsgLyozLCAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyozLCAzMiwgV0lORUQzRFRTU19DT05TVEFOVCAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiBBcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgRDNEVEFfQ09OU1RBTlQgKi8sIHN0YXRlX25vZ2wgICAgICAgICAgfSwKCiAgICB7IC8qNCwgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNCwgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNCwgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNCwgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNCwgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qNCwgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qNCwgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qNCwgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTQpLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qNCwgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNCwgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICB0ZXhfcmVzdWx0YXJnICAgICAgIH0sCiAgICB7IC8qNCwgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNCwgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCgogICAgeyAvKjUsIDAxLCBXSU5FRDNEVFNTX0NPTE9ST1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjUsIDAyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjUsIDAzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjUsIDA0LCBXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjUsIDA1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjUsIDA2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjUsIDA3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjUsIDA4LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjUsIDA5LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjUsIDEwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjUsIDExLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19URVhDT09SRElOREVYKSwgICAgdGV4X2Nvb3JkaW5kZXggICAgICB9LAogICAgeyAvKjUsIDEyLCBXSU5FRDNEVFNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDEzLCBXSU5FRDNEVFNTX0FERFJFU1NVICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE0LCBXSU5FRDNEVFNTX0FERFJFU1NWICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE1LCBXSU5FRDNEVFNTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE2LCBXSU5FRDNEVFNTX01BR0ZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE3LCBXSU5FRDNEVFNTX01JTkZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE4LCBXSU5FRDNEVFNTX01JUEZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDE5LCBXSU5FRDNEVFNTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDIwLCBXSU5FRDNEVFNTX01BWE1JUExFVkVMICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDIxLCBXSU5FRDNEVFNTX01BWEFOSVNPVFJPUFkgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDIyLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFKSwgICAgdGV4X2J1bXBlbnZsc2NhbGUgICB9LAogICAgeyAvKjUsIDIzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCksICAgdGV4X2J1bXBlbnZsb2Zmc2V0ICB9LAogICAgeyAvKjUsIDI0LCBXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU1KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKjUsIDI1LCBXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDI2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjUsIDI3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjUsIDI4LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19SRVNVTFRBUkcpLCAgICAgICAgdGV4X3Jlc3VsdGFyZyAgICAgICB9LAogICAgeyAvKjUsIDI5LCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDMwLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDMxLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjUsIDMyLCBXSU5FRDNEVFNTX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBEM0RUQV9DT05TVEFOVCAqLywgc3RhdGVfbm9nbCAgICAgICAgICB9LAoKICAgIHsgLyo2LCAwMSwgV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwMiwgV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwMywgV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwNCwgV0lORUQzRFRTU19BTFBIQU9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwNSwgV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwNiwgV0lORUQzRFRTU19BTFBIQUFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo2LCAwNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo2LCAwOCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo2LCAwOSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo2LCAxMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo2LCAxMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCksICAgIHRleF9jb29yZGluZGV4ICAgICAgfSwKICAgIHsgLyo2LCAxMiwgV0lORUQzRFRTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxMywgV0lORUQzRFRTU19BRERSRVNTVSAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxNCwgV0lORUQzRFRTU19BRERSRVNTViAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxNSwgV0lORUQzRFRTU19CT1JERVJDT0xPUiAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxNiwgV0lORUQzRFRTU19NQUdGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxNywgV0lORUQzRFRTU19NSU5GSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxOCwgV0lORUQzRFRTU19NSVBGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAxOSwgV0lORUQzRFRTU19NSVBNQVBMT0RCSUFTICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAyMCwgV0lORUQzRFRTU19NQVhNSVBMRVZFTCAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAyMSwgV0lORUQzRFRTU19NQVhBTklTT1RST1BZICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAyMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSksICAgIHRleF9idW1wZW52bHNjYWxlICAgfSwKICAgIHsgLyo2LCAyMywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQpLCAgIHRleF9idW1wZW52bG9mZnNldCAgfSwKICAgIHsgLyo2LCAyNCwgV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNiksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyo2LCAyNSwgV0lORUQzRFRTU19BRERSRVNTVyAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAyNiwgV0lORUQzRFRTU19DT0xPUkFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo2LCAyNywgV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo2LCAyOCwgV0lORUQzRFRTU19SRVNVTFRBUkcgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfUkVTVUxUQVJHKSwgICAgICAgIHRleF9yZXN1bHRhcmcgICAgICAgfSwKICAgIHsgLyo2LCAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo2LCAzMiwgV0lORUQzRFRTU19DT05TVEFOVCAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiBBcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgRDNEVEFfQ09OU1RBTlQgKi8sIHN0YXRlX25vZ2wgICAgICAgICAgfSwKCiAgICB7IC8qNywgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNywgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNywgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNywgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNywgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qNywgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qNywgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qNywgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTcpLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qNywgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNywgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICB0ZXhfcmVzdWx0YXJnICAgICAgIH0sCiAgICB7IC8qNywgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNywgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCiAgICAvKiBTYW1wbGVyIHN0YXRlcyAqLwogICAgeyAvKiAwLCBTYW1wbGVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiAxLCBTYW1wbGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiAyLCBTYW1wbGVyIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiAzLCBTYW1wbGVyIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA0LCBTYW1wbGVyIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA1LCBTYW1wbGVyIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA2LCBTYW1wbGVyIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA3LCBTYW1wbGVyIDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA4LCBTYW1wbGVyIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKiA5LCBTYW1wbGVyIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjEwLCBTYW1wbGVyIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDEwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjExLCBTYW1wbGVyIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDExKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjEyLCBTYW1wbGVyIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDEyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjEzLCBTYW1wbGVyIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDEzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE0LCBTYW1wbGVyIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE1LCBTYW1wbGVyIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE1KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE2LCBWZXJ0ZXggc2FtcGxlciAwICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE3LCBWZXJ0ZXggc2FtcGxlciAxICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE4LCBWZXJ0ZXggc2FtcGxlciAyICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgeyAvKjE5LCBWZXJ0ZXggc2FtcGxlciAzICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQU1QTEVSKDE5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlciAgICAgICAgICAgICB9LAogICAgLyogUGl4ZWwgc2hhZGVyICovCiAgICB7IC8qICAsIFBpeGVsIFNoYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1BJWEVMU0hBREVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNoYWRlciAgICAgICAgIH0sCiAgICAgIC8qIFRyYW5zZm9ybSBzdGF0ZXMgZm9sbG93ICAgICAgICAgICAgICAgICAgICAqLwogICAgeyAvKiAgMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgMiwgV0lORUQzRFRTX1ZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1ZJRVcpLCAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3ZpZXcgICAgICB9LAogICAgeyAvKiAgMywgV0lORUQzRFRTX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pLCAgICAgICAgICAgICAgdHJhbnNmb3JtX3Byb2plY3Rpb259LAogICAgeyAvKiAgNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAgOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxNiwgV0lORUQzRFRTX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAxNywgV0lORUQzRFRTX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUxKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAxOCwgV0lORUQzRFRTX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUyKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAxOSwgV0lORUQzRFRTX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUzKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAyMCwgV0lORUQzRFRTX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU0KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAyMSwgV0lORUQzRFRTX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU1KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAyMiwgV0lORUQzRFRTX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU2KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKiAyMywgV0lORUQzRFRTX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU3KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgICAvKiBBIGh1Z2UgZ2FwIGJldHdlZW4gVEVYVFVSRTcgYW5kIFdPUkxETUFUUklYKDApIDotKCBCdXQgZW50cmllcyBhcmUgbmVlZGVkIHRvIGNhdGNoIHRoZW4gaWYgYSBicm9rZW4gYXBwIHNldHMgdGhlbSAqLwogICAgeyAvKiAyNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAzOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA1OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEzOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE0OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE2OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE4OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE5OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIwOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIxOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzMiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzMywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzNCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzNSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzNiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzNywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzOCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjIzOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0NiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0NywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0OCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI0OSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1MCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1MSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1MywgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1NCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjI1NSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgICAvKiBFbmQgaHVnZSBnYXAgKi8KICAgIHsgLyoyNTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZCAgICAgfSwKICAgIHsgLyoyNTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxKSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxKSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyKSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyKSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzKSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzKSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5KSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5KSksICAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNjksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyNzksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyOCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyOCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyOSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyOSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyODksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzMykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzNykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzOCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzOCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzOSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgzOSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyoyOTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0OSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg0OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMDksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1OSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg1OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg2OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMjksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3OSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg3OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozMzksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4OSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg4OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNDksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5MykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NikgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NikpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NykgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5NykpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5OCkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5OCkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5OSkgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCg5OSkpLCAgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMDkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNjksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMTkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNzksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMjkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozODksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxMzkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozOTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNDkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MDksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNTkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNjkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MjksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxNzkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0MzksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxODkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NDksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgxOTkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyozNTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMDkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NjksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMTkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0NzksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMjkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0ODksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyMzkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo0OTksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDIsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDYpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDYpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDMsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDcpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDcpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDQsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDgpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDgpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDUsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDkpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNDkpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDYsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTApICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTApKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDcsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTEpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTEpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDgsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTIpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTIpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MDksIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTMpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTMpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MTAsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTQpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTQpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgIHsgLyo1MTEsIFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTUpICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgyNTUpKSwgICAgICAgIHRyYW5zZm9ybV93b3JsZGV4ICAgfSwKICAgICAgLyogVmFyaW91cyBWZXJ0ZXggc3RhdGVzIGZvbGxvdyAqLwogICAgeyAvKiAgICwgU1RBVEVfU1RSRUFNU1JDICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WREVDTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4ZGVjbGFyYXRpb24gICB9LAogICAgeyAvKiAgICwgU1RBVEVfSU5ERVhCVUZGRVIgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9JTkRFWEJVRkZFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhidWZmZXIgICAgICAgICB9LAogICAgeyAvKiAgICwgU1RBVEVfVkRFQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WREVDTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4ZGVjbGFyYXRpb24gICB9LAogICAgeyAvKiAgICwgU1RBVEVfVlNIQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WREVDTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4ZGVjbGFyYXRpb24gICB9LAogICAgeyAvKiAgICwgU1RBVEVfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WSUVXUE9SVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQgICAgICAgICAgICB9LAogICAgeyAvKiAgICwgU1RBVEVfVkVSVEVYU0hBREVSQ09OU1RBTlQgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCwgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyY29uc3RhbnQgICAgICB9LAogICAgeyAvKiAgICwgU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCwgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyY29uc3RhbnQgICAgICB9LAogICAgICAvKiBMaWdodHMgKi8KICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDApICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDEpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDIpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDMpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoMyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDQpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDUpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDYpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0FDVElWRUxJR0hUKDcpICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfQUNUSVZFTElHSFQoNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfSwKCiAgICB7IC8qIFNjaXNzb3IgcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1NDSVNTT1JSRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lzc29ycmVjdCAgICAgICAgIH0sCiAgICAgIC8qIENsaXAgcGxhbmVzICovCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgwKSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxKSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyKSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgzKSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg0KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg1KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg1KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg2KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg3KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg4KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSg5KSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSg5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxMCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxMSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxMikgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxMykgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxMyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxNCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxNSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxNikgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxNykgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxOCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgxOSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgxOSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyMCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyMSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyMikgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyMykgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyMyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyNCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyNSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyNikgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyNykgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyOCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgyOSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgyOSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgzMCkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgzMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCiAgICB7IC8qIFNUQVRFX0NMSVBQTEFORSgzMSkgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0NMSVBQTEFORSgzMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH0sCgogICAgeyAvKiBTVEFURV9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFKSwgICAgICAgICAgICAgc3RhdGVfc3BlY3VsYXJlbmFibGV9LAogICAgeyAvKiBTVEFURV9GUk9OVEZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9GUk9OVEZBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRmYWNlICAgICAgICAgICB9LAp9Owo=