LyoKICogQ09NIHByb3h5IGltcGxlbWVudGF0aW9uCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKiAKICogVE9ETzogSGFuZGxlIG5vbi1pMzg2IGFyY2hpdGVjdHVyZXMKICogICAgICAgR2V0IHJpZCBvZiAjaWYgMCdlZCBjb2RlLgogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgojaW5jbHVkZSAicnBjcHJveHkuaCIKCiNpbmNsdWRlICJjcHNmLmgiCiNpbmNsdWRlICJuZHJfbWlzYy5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwob2xlKTsKCnN0cnVjdCBTdHVibGVzc1RodW5rOwoKLyogSSBkb24ndCBrbm93IHdoYXQgTVMncyBzdGQgcHJveHkgc3RydWN0dXJlIGxvb2tzIGxpa2UsCiAgIHNvIHRoaXMgcHJvYmFibHkgZG9lc24ndCBtYXRjaCwgYnV0IHRoYXQgc2hvdWxkbid0IG1hdHRlciAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgSVJwY1Byb3h5QnVmZmVyVnRibCAqbHBWdGJsOwogIExQVk9JRCAqUFZ0Ymw7CiAgRFdPUkQgUmVmQ291bnQ7CiAgY29uc3QgTUlETF9TVFVCTEVTU19QUk9YWV9JTkZPICpzdHVibGVzczsKICBjb25zdCBJSUQqIHBpaWQ7CiAgTFBVTktOT1dOIHBVbmtPdXRlcjsKICBQQ0ludGVyZmFjZU5hbWUgbmFtZTsKICBMUFBTRkFDVE9SWUJVRkZFUiBwUFNGYWN0b3J5OwogIExQUlBDQ0hBTk5FTEJVRkZFUiBwQ2hhbm5lbDsKICBzdHJ1Y3QgU3R1Ymxlc3NUaHVuayAqdGh1bmtzOwp9IFN0ZFByb3h5SW1wbDsKCnN0YXRpYyBJUnBjUHJveHlCdWZmZXJWdGJsIFN0ZFByb3h5X1Z0Ymw7CgojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSBpbXBsKiBjb25zdCBUaGlzPShpbXBsKikoKGNoYXIqKShpZmFjZSkgLSBvZmZzZXRvZihpbXBsLGZpZWxkKSkKCi8qIEhvdyB0aGUgV2luZG93cyBzdHVibGVzcyBwcm94eSB0aHVua3Mgd29yayBpcyBleHBsYWluZWQgYXQKICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2RubXNqOTkvaHRtbC9jb20wMTk5LmFzcCwKICogYnV0IEknbGwgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG1ldGhvZCwgdG8gbWFrZSBsaWZlIGVhc2llciAqLwoKI2lmIGRlZmluZWQoX19pMzg2X18pCgojaW5jbHVkZSAicHNocGFjazEuaCIKCnN0cnVjdCBTdHVibGVzc1RodW5rIHsKICBCWVRFIHB1c2g7CiAgRFdPUkQgaW5kZXg7CiAgQllURSBjYWxsOwogIExPTkcgaGFuZGxlcjsKICBCWVRFIHJldDsKICBXT1JEIGJ5dGVzOwogIEJZVEUgcGFkWzNdOwp9OwoKI2luY2x1ZGUgInBvcHBhY2suaCIKCi8qIGFkanVzdCB0aGUgc3RhY2sgc2l6ZSBzaW5jZSB3ZSBkb24ndCB1c2UgV2luZG93cydzIG1ldGhvZCAqLwojZGVmaW5lIFNUQUNLX0FESlVTVCBzaXplb2YoRFdPUkQpCgojZGVmaW5lIEZJTExfU1RVQkxFU1MoeCxpZHgsc3RrKSBcCiB4LT5wdXNoID0gMHg2ODsgLyogcHVzaGwgW2ltbWVkaWF0ZV0gKi8gXAogeC0+aW5kZXggPSAoaWR4KTsgXAogeC0+Y2FsbCA9IDB4ZTg7IC8qIGNhbGwgW25lYXJdICovIFwKIHgtPmhhbmRsZXIgPSAoY2hhciopT2JqZWN0U3R1Ymxlc3MgLSAoY2hhciopJngtPnJldDsgXAogeC0+cmV0ID0gMHhjMjsgLyogcmV0IFtpbW1lZGlhdGVdICovIFwKIHgtPmJ5dGVzID0gc3RrOyBcCiB4LT5wYWRbMF0gPSAweDhkOyAvKiBsZWFsICglZXNpKSwlZXNpICovIFwKIHgtPnBhZFsxXSA9IDB4NzY7IFwKIHgtPnBhZFsyXSA9IDB4MDA7CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgT2JqZWN0U3R1Ymxlc3MoRFdPUkQgaW5kZXgpCnsKICBjaGFyICphcmdzID0gKGNoYXIqKSgmaW5kZXggKyAyKTsKICBMUFZPSUQgaWZhY2UgPSAqKExQVk9JRCopYXJnczsKCiAgSUNPTV9USElTX01VTFRJKFN0ZFByb3h5SW1wbCxQVnRibCxpZmFjZSk7CgogIFBGT1JNQVRfU1RSSU5HIGZzID0gVGhpcy0+c3R1Ymxlc3MtPlByb2NGb3JtYXRTdHJpbmcgKyBUaGlzLT5zdHVibGVzcy0+Rm9ybWF0U3RyaW5nT2Zmc2V0W2luZGV4XTsKICB1bnNpZ25lZCBieXRlcyA9ICooV09SRCopKGZzKzgpIC0gU1RBQ0tfQURKVVNUOwogIFRSQUNFKCIoJXApLT4oJWxkKShbJWQgYnl0ZXNdKSByZXQ9JTA4bHhcbiIsIGlmYWNlLCBpbmRleCwgYnl0ZXMsICooRFdPUkQqKShhcmdzK2J5dGVzKSk7CgogIHJldHVybiBSUENSVDRfTmRyQ2xpZW50Q2FsbDIoVGhpcy0+c3R1Ymxlc3MtPnBTdHViRGVzYywgZnMsIGFyZ3MpOwp9CgojZWxzZSAgLyogX19pMzg2X18gKi8KCi8qIGNhbid0IGRvIHRoYXQgb24gdGhpcyBhcmNoICovCnN0cnVjdCBTdHVibGVzc1RodW5rIHsgaW50IGR1bW15OyB9OwojZGVmaW5lIEZJTExfU1RVQkxFU1MoeCxpZHgsc3RrKSBcCiBFUlIoInN0dWJsZXNzIHByb3hpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmVcbiIpOwojZGVmaW5lIFNUQUNLX0FESlVTVCAwCgojZW5kaWYgIC8qIF9faTM4Nl9fICovCgpIUkVTVUxUIFdJTkFQSSBTdGRQcm94eV9Db25zdHJ1Y3QoUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVU5LTk9XTiBwVW5rT3V0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSW50ZXJmYWNlTmFtZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSW50ZXJmYWNlUHJveHlWdGJsICp2dGJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSW50ZXJmYWNlU3R1YlZ0YmwgKnN2dGJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBTRkFDVE9SWUJVRkZFUiBwUFNGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ1BST1hZQlVGRkVSICpwcFByb3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgKnBwdk9iaikKewogIFN0ZFByb3h5SW1wbCAqVGhpczsKICBjb25zdCBNSURMX1NUVUJMRVNTX1BST1hZX0lORk8gKnN0dWJsZXNzID0gTlVMTDsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlcCkgJXNcbiIsIHBVbmtPdXRlciwgdnRibCwgcFBTRmFjdG9yeSwgcHBQcm94eSwgcHB2T2JqLCBuYW1lKTsKCiAgLyogSSBjYW4ndCBmaW5kIGFueSBvdGhlciB3YXkgdG8gZGV0ZWN0IHN0dWJsZXNzIHByb3hpZXMgdGhhbiB0aGlzIGhhY2sgKi8KICBpZiAoIUlzRXF1YWxHVUlEKHZ0YmwtPmhlYWRlci5waWlkLCByaWlkKSkgewogICAgc3R1Ymxlc3MgPSAqKGNvbnN0IHZvaWQgKiopdnRibDsKICAgIHZ0YmwgPSAoQ0ludGVyZmFjZVByb3h5VnRibCAqKSgoY29uc3Qgdm9pZCAqKil2dGJsICsgMSk7CiAgICBUUkFDRSgic3R1Ymxlc3M9JXBcbiIsIHN0dWJsZXNzKTsKICB9CgogIFRSQUNFKCJpaWQ9JXNcbiIsIGRlYnVnc3RyX2d1aWQodnRibC0+aGVhZGVyLnBpaWQpKTsKICBUUkFDRSgidnRibD0lcFxuIiwgdnRibC0+VnRibCk7CgogIGlmICghSXNFcXVhbEdVSUQodnRibC0+aGVhZGVyLnBpaWQsIHJpaWQpKSB7CiAgICBFUlIoIklJRCBtaXNtYXRjaCBkdXJpbmcgcHJveHkgY3JlYXRpb25cbiIpOwogICAgcmV0dXJuIFJQQ19FX1VORVhQRUNURUQ7CiAgfQoKICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoU3RkUHJveHlJbXBsKSk7CiAgaWYgKCFUaGlzKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCiAgaWYgKHN0dWJsZXNzKSB7CiAgICB1bnNpZ25lZCBpLCBjb3VudCA9IHN2dGJsLT5oZWFkZXIuRGlzcGF0Y2hUYWJsZUNvdW50OwogICAgLyogTWF5YmUgdGhlIG9yaWdpbmFsIHZ0YmwgaXMganVzdCBtb2RpZmllZCBkaXJlY3RseSB0byBwb2ludCBhdAogICAgICogT2JqZWN0U3R1Ymxlc3NDbGllbnRYWFggdGh1bmtzIGluIHJlYWwgV2luZG93cywgYnV0IEkgZG9uJ3QgbGlrZSBpdAogICAgICovCiAgICBUUkFDRSgic3R1Ymxlc3MgdGh1bmtzOiBjb3VudD0lZFxuIiwgY291bnQpOwogICAgVGhpcy0+dGh1bmtzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2Yoc3RydWN0IFN0dWJsZXNzVGh1bmspKmNvdW50KTsKICAgIFRoaXMtPlBWdGJsID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoTFBWT0lEKSpjb3VudCk7CiAgICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7CiAgICAgIHN0cnVjdCBTdHVibGVzc1RodW5rICp0aHVuayA9ICZUaGlzLT50aHVua3NbaV07CiAgICAgIGlmICh2dGJsLT5WdGJsW2ldID09IChMUFZPSUQpLTEpIHsKICAgICAgICBQRk9STUFUX1NUUklORyBmcyA9IHN0dWJsZXNzLT5Qcm9jRm9ybWF0U3RyaW5nICsgc3R1Ymxlc3MtPkZvcm1hdFN0cmluZ09mZnNldFtpXTsKICAgICAgICB1bnNpZ25lZCBieXRlcyA9ICooV09SRCopKGZzKzgpIC0gU1RBQ0tfQURKVVNUOwogICAgICAgIFRSQUNFKCJtZXRob2QgJWQ6IHN0YWNrc2l6ZT0lZFxuIiwgaSwgYnl0ZXMpOwogICAgICAgIEZJTExfU1RVQkxFU1ModGh1bmssIGksIGJ5dGVzKQogICAgICAgIFRoaXMtPlBWdGJsW2ldID0gdGh1bms7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgbWVtc2V0KHRodW5rLCAwLCBzaXplb2Yoc3RydWN0IFN0dWJsZXNzVGh1bmspKTsKICAgICAgICBUaGlzLT5QVnRibFtpXSA9IHZ0YmwtPlZ0YmxbaV07CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSAKICAgIFRoaXMtPlBWdGJsID0gdnRibC0+VnRibDsKCiAgVGhpcy0+bHBWdGJsID0gJlN0ZFByb3h5X1Z0Ymw7CiAgLyogMSByZWZlcmVuY2UgZm9yIHRoZSBwcm94eSBhbmQgMSBmb3IgdGhlIG9iamVjdCAqLwogIFRoaXMtPlJlZkNvdW50ID0gMjsKICBUaGlzLT5zdHVibGVzcyA9IHN0dWJsZXNzOwogIFRoaXMtPnBpaWQgPSB2dGJsLT5oZWFkZXIucGlpZDsKICBUaGlzLT5wVW5rT3V0ZXIgPSBwVW5rT3V0ZXI7CiAgVGhpcy0+bmFtZSA9IG5hbWU7CiAgVGhpcy0+cFBTRmFjdG9yeSA9IHBQU0ZhY3Rvcnk7CiAgVGhpcy0+cENoYW5uZWwgPSBOVUxMOwogICpwcFByb3h5ID0gKExQUlBDUFJPWFlCVUZGRVIpJlRoaXMtPmxwVnRibDsKICAqcHB2T2JqID0gJlRoaXMtPlBWdGJsOwogIElQU0ZhY3RvcnlCdWZmZXJfQWRkUmVmKHBQU0ZhY3RvcnkpOwoKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIFN0ZFByb3h5X0Rlc3RydWN0KExQUlBDUFJPWFlCVUZGRVIgaWZhY2UpCnsKICBJQ09NX1RISVNfTVVMVEkoU3RkUHJveHlJbXBsLGxwVnRibCxpZmFjZSk7CgogIGlmIChUaGlzLT5wQ2hhbm5lbCkKICAgIElScGNQcm94eUJ1ZmZlcl9EaXNjb25uZWN0KGlmYWNlKTsKCiAgSVBTRmFjdG9yeUJ1ZmZlcl9SZWxlYXNlKFRoaXMtPnBQU0ZhY3RvcnkpOwogIGlmIChUaGlzLT50aHVua3MpIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzLT5QVnRibCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+dGh1bmtzKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgU3RkUHJveHlfUXVlcnlJbnRlcmZhY2UoTFBSUENQUk9YWUJVRkZFUiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCAqb2JqKQp7CiAgSUNPTV9USElTX01VTFRJKFN0ZFByb3h5SW1wbCxscFZ0YmwsaWZhY2UpOwogIFRSQUNFKCIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLG9iaik7CgogIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lVbmtub3duLHJpaWQpIHx8CiAgICAgIElzRXF1YWxHVUlEKFRoaXMtPnBpaWQscmlpZCkpIHsKICAgICpvYmogPSAmVGhpcy0+UFZ0Ymw7CiAgICBUaGlzLT5SZWZDb3VudCsrOwogICAgcmV0dXJuIFNfT0s7CiAgfQoKICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JUnBjUHJveHlCdWZmZXIscmlpZCkpIHsKICAgICpvYmogPSAmVGhpcy0+bHBWdGJsOwogICAgVGhpcy0+UmVmQ291bnQrKzsKICAgIHJldHVybiBTX09LOwogIH0KCiAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgU3RkUHJveHlfQWRkUmVmKExQUlBDUFJPWFlCVUZGRVIgaWZhY2UpCnsKICBJQ09NX1RISVNfTVVMVEkoU3RkUHJveHlJbXBsLGxwVnRibCxpZmFjZSk7CiAgVFJBQ0UoIiglcCktPkFkZFJlZigpXG4iLFRoaXMpOwoKICByZXR1cm4gKysoVGhpcy0+UmVmQ291bnQpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIFN0ZFByb3h5X1JlbGVhc2UoTFBSUENQUk9YWUJVRkZFUiBpZmFjZSkKewogIElDT01fVEhJU19NVUxUSShTdGRQcm94eUltcGwsbHBWdGJsLGlmYWNlKTsKICBUUkFDRSgiKCVwKS0+UmVsZWFzZSgpXG4iLFRoaXMpOwoKICBpZiAoIS0tKFRoaXMtPlJlZkNvdW50KSkgewogICAgU3RkUHJveHlfRGVzdHJ1Y3QoKExQUlBDUFJPWFlCVUZGRVIpJlRoaXMtPmxwVnRibCk7CiAgICByZXR1cm4gMDsKICB9CiAgcmV0dXJuIFRoaXMtPlJlZkNvdW50Owp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgU3RkUHJveHlfQ29ubmVjdChMUFJQQ1BST1hZQlVGRkVSIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDQ0hBTk5FTEJVRkZFUiBwQ2hhbm5lbCkKewogIElDT01fVEhJU19NVUxUSShTdGRQcm94eUltcGwsbHBWdGJsLGlmYWNlKTsKICBUUkFDRSgiKCVwKS0+Q29ubmVjdCglcClcbiIsVGhpcyxwQ2hhbm5lbCk7CgogIFRoaXMtPnBDaGFubmVsID0gcENoYW5uZWw7CiAgSVJwY0NoYW5uZWxCdWZmZXJfQWRkUmVmKHBDaGFubmVsKTsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIFZPSUQgV0lOQVBJIFN0ZFByb3h5X0Rpc2Nvbm5lY3QoTFBSUENQUk9YWUJVRkZFUiBpZmFjZSkKewogIElDT01fVEhJU19NVUxUSShTdGRQcm94eUltcGwsbHBWdGJsLGlmYWNlKTsKICBUUkFDRSgiKCVwKS0+RGlzY29ubmVjdCgpXG4iLFRoaXMpOwoKICBJUnBjQ2hhbm5lbEJ1ZmZlcl9SZWxlYXNlKFRoaXMtPnBDaGFubmVsKTsKICBUaGlzLT5wQ2hhbm5lbCA9IE5VTEw7Cn0KCnN0YXRpYyBJUnBjUHJveHlCdWZmZXJWdGJsIFN0ZFByb3h5X1Z0YmwgPQp7CiAgU3RkUHJveHlfUXVlcnlJbnRlcmZhY2UsCiAgU3RkUHJveHlfQWRkUmVmLAogIFN0ZFByb3h5X1JlbGVhc2UsCiAgU3RkUHJveHlfQ29ubmVjdCwKICBTdGRQcm94eV9EaXNjb25uZWN0Cn07CgpIUkVTVUxUIFdJTkFQSSBTdGRQcm94eV9HZXRDaGFubmVsKExQVk9JRCBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDQ0hBTk5FTEJVRkZFUiAqcHBDaGFubmVsKQp7CiAgSUNPTV9USElTX01VTFRJKFN0ZFByb3h5SW1wbCxQVnRibCxpZmFjZSk7CiAgVFJBQ0UoIiglcCktPkdldENoYW5uZWwoJXApICVzXG4iLFRoaXMscHBDaGFubmVsLFRoaXMtPm5hbWUpOwoKICAqcHBDaGFubmVsID0gVGhpcy0+cENoYW5uZWw7CiAgcmV0dXJuIFNfT0s7Cn0KCkhSRVNVTFQgV0lOQVBJIFN0ZFByb3h5X0dldElJRChMUFZPSUQgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElJRCAqKnBwaWlkKQp7CiAgSUNPTV9USElTX01VTFRJKFN0ZFByb3h5SW1wbCxQVnRibCxpZmFjZSk7CiAgVFJBQ0UoIiglcCktPkdldElJRCglcCkgJXNcbiIsVGhpcyxwcGlpZCxUaGlzLT5uYW1lKTsKCiAgKnBwaWlkID0gVGhpcy0+cGlpZDsKICByZXR1cm4gU19PSzsKfQoKSFJFU1VMVCBXSU5BUEkgSVVua25vd25fUXVlcnlJbnRlcmZhY2VfUHJveHkoTFBVTktOT1dOIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCAqcHB2T2JqKQp7CiAgSUNPTV9USElTX01VTFRJKFN0ZFByb3h5SW1wbCxQVnRibCxpZmFjZSk7CiAgVFJBQ0UoIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKSAlc1xuIixUaGlzLGRlYnVnc3RyX2d1aWQocmlpZCkscHB2T2JqLFRoaXMtPm5hbWUpOwogIHJldHVybiBJVW5rbm93bl9RdWVyeUludGVyZmFjZShUaGlzLT5wVW5rT3V0ZXIscmlpZCxwcHZPYmopOwp9CgpVTE9ORyBXSU5BUEkgSVVua25vd25fQWRkUmVmX1Byb3h5KExQVU5LTk9XTiBpZmFjZSkKewogIElDT01fVEhJU19NVUxUSShTdGRQcm94eUltcGwsUFZ0YmwsaWZhY2UpOwogIFRSQUNFKCIoJXApLT5BZGRSZWYoKSAlc1xuIixUaGlzLFRoaXMtPm5hbWUpOwojaWYgMCAvKiBpbnRlcmZhY2UgcmVmY291bnRpbmcgKi8KICByZXR1cm4gKysoVGhpcy0+UmVmQ291bnQpOwojZWxzZSAvKiBvYmplY3QgcmVmY291bnRpbmcgKi8KICByZXR1cm4gSVVua25vd25fQWRkUmVmKFRoaXMtPnBVbmtPdXRlcik7CiNlbmRpZgp9CgpVTE9ORyBXSU5BUEkgSVVua25vd25fUmVsZWFzZV9Qcm94eShMUFVOS05PV04gaWZhY2UpCnsKICBJQ09NX1RISVNfTVVMVEkoU3RkUHJveHlJbXBsLFBWdGJsLGlmYWNlKTsKICBUUkFDRSgiKCVwKS0+UmVsZWFzZSgpICVzXG4iLFRoaXMsVGhpcy0+bmFtZSk7CiNpZiAwIC8qIGludGVyZmFjZSByZWZjb3VudGluZyAqLwogIGlmICghLS0oVGhpcy0+UmVmQ291bnQpKSB7CiAgICBTdGRQcm94eV9EZXN0cnVjdCgoTFBSUENQUk9YWUJVRkZFUikmVGhpcy0+bHBWdGJsKTsKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gVGhpcy0+UmVmQ291bnQ7CiNlbHNlIC8qIG9iamVjdCByZWZjb3VudGluZyAqLwogIHJldHVybiBJVW5rbm93bl9SZWxlYXNlKFRoaXMtPnBVbmtPdXRlcik7CiNlbmRpZgp9Cg==