LyogcHJvY29iamVjdHRyZWUuaAogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCi8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFRoaXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzIG5lY2Vzc2FyeSBmb3IgY3JlYXRpbmcgYSB0cmVlIG9mIHR5cGVzLAogKiAgb2JqZWN0cywgYW5kIHByb3BlcnRpZXMgaW4gL3Byb2MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgojaWZuZGVmIF9fUFJPQ09CSkVDVFRSRUVfSF9fCiNkZWZpbmUgX19QUk9DT0JKRUNUVFJFRV9IX18KCiNpbmNsdWRlICJ1bmlrbG9nLmgiCiNpbmNsdWRlICJ0aW1za21vZC5oIgoKLyogVGhlc2UgYXJlIG9wYXF1ZSBzdHJ1Y3R1cmVzIHRvIHVzZXJzLgogKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgogKi8KdHlwZWRlZiBzdHJ1Y3QgTVlQUk9DT0JKRUNUX1RhZyBNWVBST0NPQkpFQ1Q7CnR5cGVkZWYgc3RydWN0IE1ZUFJPQ1RZUEVfVGFnICAgTVlQUk9DVFlQRTsKCk1ZUFJPQ09CSkVDVCAqdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoTVlQUk9DVFlQRSAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKCQkJCSAgICAgIHZvaWQgKmNvbnRleHQpOwp2b2lkICAgICAgICAgIHZpc29yX3Byb2NfRGVzdHJveU9iamVjdChNWVBST0NPQkpFQ1QgKm9iaik7Ck1ZUFJPQ1RZUEUgICAqdmlzb3JfcHJvY19DcmVhdGVUeXBlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY1Jvb3REaXIsCgkJCQkgICAgY29uc3QgY2hhciAqKm5hbWUsCgkJCQkgICAgY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXMsCgkJCQkgICAgdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLAoJCQkJCQkJICB2b2lkICosIGludCkpOwp2b2lkICAgICAgICAgIHZpc29yX3Byb2NfRGVzdHJveVR5cGUoTVlQUk9DVFlQRSAqdHlwZSk7CgojZW5kaWYK