LyoKICogYWdlbnRfcmVnaXN0cnkuYwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgYWdlbnRfcmVnaXN0cnkgUmVnaXN0cnkgb2YgTUlCIHN1YnRyZWVzLCBtb2R1bGVzLCBzZXNzaW9ucywgZXRjCiAqICAgICBNYWludGFpbiBhIHJlZ2lzdHJ5IG9mIE1JQiBzdWJ0cmVlcywgdG9nZXRoZXIgd2l0aCByZWxhdGVkIGluZm9ybWF0aW9uCiAqICAgICByZWdhcmRpbmcgTUlCIG1vZHVsZXMsIHNlc3Npb25zLCBldGMKICogICBAaW5ncm91cCBhZ2VudAogKgogKiBAewogKi8KCiNkZWZpbmUgSU5fU05NUF9WQVJTX0MKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hc3NlcnQuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF9jYWxsYmFja3MuaD4KCiNpbmNsdWRlICJzbm1wZC5oIgojaW5jbHVkZSAibWliZ3JvdXAvc3RydWN0LmgiCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9vbGRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9udWxsLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC90YWJsZS5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdGFibGVfaXRlcmF0b3IuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X3JlZ2lzdHJ5Lmg+CgojaWZkZWYgVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRQojaW5jbHVkZSAiYWdlbnR4L3N1YmFnZW50LmgiCiNpbmNsdWRlICJhZ2VudHgvY2xpZW50LmgiCiNlbmRpZgoKLyoqIEBkZWZncm91cCBhZ2VudF9sb29rdXBfY2FjaGUgTG9va3VwIGNhY2hlLCBzdG9yaW5nIHRoZSByZWdpc3RlcmVkIE9JRHMuCiAqICAgICBNYWludGFpbiB0aGUgY2FjaGUgdXNlZCBmb3IgbG9jYXRpbmcgc3ViLXRyZWVzIGFuZCBPSURzLgogKiAgIEBpbmdyb3VwIGFnZW50X3JlZ2lzdHJ5CiAqCiAqIEB7CiAqLwoKLyoqICBMb29rdXAgY2FjaGUgLSBkZWZhdWx0IHNpemUuKi8KI2RlZmluZSBTVUJUUkVFX0RFRkFVTFRfQ0FDSEVfU0laRSA4Ci8qKiAgTG9va3VwIGNhY2hlIC0gbWF4IGFjY2VwdGFibGUgc2l6ZS4qLwojZGVmaW5lIFNVQlRSRUVfTUFYX0NBQ0hFX1NJWkUgICAgIDMyCmludCBsb29rdXBfY2FjaGVfc2l6ZSA9IDA7IC8qZW5hYmxlZCBsYXRlciBhZnRlciByZWdpc3RyYXRpb25zIGFyZSBsb2FkZWQgKi8KCnR5cGVkZWYgc3RydWN0IGxvb2t1cF9jYWNoZV9zIHsKICAgbmV0c25tcF9zdWJ0cmVlICpuZXh0OwogICBuZXRzbm1wX3N1YnRyZWUgKnByZXZpb3VzOwp9IGxvb2t1cF9jYWNoZTsKCnR5cGVkZWYgc3RydWN0IGxvb2t1cF9jYWNoZV9jb250ZXh0X3MgewogICBjaGFyICpjb250ZXh0OwogICBzdHJ1Y3QgbG9va3VwX2NhY2hlX2NvbnRleHRfcyAqbmV4dDsKICAgaW50IHRoZWNhY2hlY291bnQ7CiAgIGludCBjdXJyZW50cG9zOwogICBsb29rdXBfY2FjaGUgY2FjaGVbU1VCVFJFRV9NQVhfQ0FDSEVfU0laRV07Cn0gbG9va3VwX2NhY2hlX2NvbnRleHQ7CgpzdGF0aWMgbG9va3VwX2NhY2hlX2NvbnRleHQgKnRoZWNvbnRleHRjYWNoZSA9IE5VTEw7CgovKiogU2V0IHRoZSBsb29rdXAgY2FjaGUgc2l6ZSBmb3Igb3B0aW1pemVkIGFnZW50IHJlZ2lzdHJhdGlvbiBwZXJmb3JtYW5jZS4KICogTm90ZSB0aGF0IGl0IGlzIG9ubHkgdXNlZCBieSBtYXN0ZXIgYWdlbnQgLSBzdWItYWdlbnQgZG9lc24ndCBuZWVkIHRoZSBjYWNoZS4KICogVGhlIHJvdWdoIGd1aWRlIGlzIHRoYXQgdGhlIGNhY2hlIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBtYXhpbXVtCiAqIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbWFuYWdlcnMgeW91IGV4cGVjdCB0byB0YWxrIHRvIHRoZSBhZ2VudCAoTSkgdGltZXMgODAlCiAqIChvciBzbywgaGUgc2F5cyByYW5kb21seSkgdGhlIGF2ZXJhZ2UgbnVtYmVyIChOKSBvZiB2YXJiaW5kcyB5b3UKICogZXhwZWN0IHRvIHJlY2VpdmUgaW4gYSBnaXZlbiByZXF1ZXN0IGZvciBhIG1hbmFnZXIuICBpZSwgTSB0aW1lcyBOLgogKiBCaWdnZXIgZG9lcyBOT1QgbmVjZXNzYXJpbHkgbWVhbiBiZXR0ZXIuICBDZXJ0YWlubHkgMTYgc2hvdWxkIGJlIGFuCiAqIHVwcGVyIGxpbWl0LiAgMzIgaXMgdGhlIGhhcmQgY29kZWQgbGltaXQuCiAqCiAqIEBwYXJhbSBuZXdzaXplIHNldCB0byB0aGUgbWF4aW11bSBzaXplIG9mIGEgY2FjaGUgZm9yIGEgZ2l2ZW4KICogY29udGV4dC4gIFNldCB0byAwIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBjYWNoaW5nLCBvciB0byAtMSB0byBzZXQKICogdG8gdGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSAoOCksIG9yIHRvIGEgbnVtYmVyIG9mIHlvdXIgY2hvc2luZy4gIFRoZQogKi8Kdm9pZApuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShpbnQgbmV3c2l6ZSkgewogICAgaWYgKG5ld3NpemUgPCAwKQogICAgICAgIGxvb2t1cF9jYWNoZV9zaXplID0gU1VCVFJFRV9ERUZBVUxUX0NBQ0hFX1NJWkU7CiAgICBlbHNlIGlmIChuZXdzaXplIDwgU1VCVFJFRV9NQVhfQ0FDSEVfU0laRSkKICAgICAgICBsb29rdXBfY2FjaGVfc2l6ZSA9IG5ld3NpemU7CiAgICBlbHNlCiAgICAgICAgbG9va3VwX2NhY2hlX3NpemUgPSBTVUJUUkVFX01BWF9DQUNIRV9TSVpFOwp9CgovKiogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb29rdXAgY2FjaGUgc2l6ZQogKiAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIG1hc3RlciBhZ2VudCBvbmx5IC0gc3ViLWFnZW50IGRvZXNuJ3QgbmVlZCB0aGUgY2FjaGUuCiAqCiAqICBAcmV0dXJuIHRoZSBjdXJyZW50IGxvb2t1cCBjYWNoZSBzaXplCiAqLwppbnQKbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUodm9pZCkgewogICAgcmV0dXJuIGxvb2t1cF9jYWNoZV9zaXplOwp9CgovKiogUmV0dXJucyBsb29rdXAgY2FjaGUgZW50cnkgZm9yIHRoZSBjb250ZXh0IG9mIGdpdmVuIG5hbWUuCiAqCiAqICBAcGFyYW0gY29udGV4dCBOYW1lIG9mIHRoZSBjb250ZXh0LiBOYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlLgogKgogKiAgQHJldHVybiB0aGUgbG9va3VwIGNhY2hlIGNvbnRleHQKICovCk5FVFNOTVBfU1RBVElDX0lOTElORSBsb29rdXBfY2FjaGVfY29udGV4dCAqCmdldF9jb250ZXh0X2xvb2t1cF9jYWNoZShjb25zdCBjaGFyICpjb250ZXh0KSB7CiAgICBsb29rdXBfY2FjaGVfY29udGV4dCAqcHRyOwogICAgaWYgKCFjb250ZXh0KQogICAgICAgIGNvbnRleHQgPSAiIjsKCiAgICBmb3IocHRyID0gdGhlY29udGV4dGNhY2hlOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGlmIChzdHJjbXAocHRyLT5jb250ZXh0LCBjb250ZXh0KSA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmICghcHRyKSB7CiAgICAgICAgaWYgKG5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHQpKSB7CiAgICAgICAgICAgIHB0ciA9IFNOTVBfTUFMTE9DX1RZUEVERUYobG9va3VwX2NhY2hlX2NvbnRleHQpOwogICAgICAgICAgICBwdHItPm5leHQgPSB0aGVjb250ZXh0Y2FjaGU7CiAgICAgICAgICAgIHB0ci0+Y29udGV4dCA9IHN0cmR1cChjb250ZXh0KTsKICAgICAgICAgICAgdGhlY29udGV4dGNhY2hlID0gcHRyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBwdHI7Cn0KCi8qKiBBZGRzIGFuIGVudHJ5IHRvIHRoZSBMb29rdXAgQ2FjaGUgdW5kZXIgc3BlY2lmaWVkIGNvbnRleHQgbmFtZS4KICoKICogIEBwYXJhbSBjb250ZXh0ICBOYW1lIG9mIHRoZSBjb250ZXh0LiBOYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlLgogKgogKiAgQHBhcmFtIG5leHQgICAgIE5leHQgc3VidHJlZSBpdGVtLgogKgogKiAgQHBhcmFtIHByZXZpb3VzIFByZXZpb3VzIHN1YnRyZWUgaXRlbS4KICovCk5FVFNOTVBfU1RBVElDX0lOTElORSB2b2lkCmxvb2t1cF9jYWNoZV9hZGQoY29uc3QgY2hhciAqY29udGV4dCwKICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWUgKm5leHQsIG5ldHNubXBfc3VidHJlZSAqcHJldmlvdXMpIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpjcHRyOwoKICAgIGlmICgoY3B0ciA9IGdldF9jb250ZXh0X2xvb2t1cF9jYWNoZShjb250ZXh0KSkgPT0gTlVMTCkKICAgICAgICByZXR1cm47CgogICAgaWYgKGNwdHItPnRoZWNhY2hlY291bnQgPCBsb29rdXBfY2FjaGVfc2l6ZSkKICAgICAgICBjcHRyLT50aGVjYWNoZWNvdW50Kys7CgogICAgY3B0ci0+Y2FjaGVbY3B0ci0+Y3VycmVudHBvc10ubmV4dCA9IG5leHQ7CiAgICBjcHRyLT5jYWNoZVtjcHRyLT5jdXJyZW50cG9zXS5wcmV2aW91cyA9IHByZXZpb3VzOwoKICAgIGlmICgrK2NwdHItPmN1cnJlbnRwb3MgPj0gbG9va3VwX2NhY2hlX3NpemUpCiAgICAgICAgY3B0ci0+Y3VycmVudHBvcyA9IDA7Cn0KCi8qKiBAcHJpdmF0ZQogKiAgUmVwbGFjZXMgbmV4dCBhbmQgcHJldmlvdXMgcG9pbnRlciBpbiBnaXZlbiBMb29rdXAgQ2FjaGUuCiAqCiAqICBAcGFyYW0gcHRyICAgICAgTG9va3VwIENhY2hlIHBvaW50ZXIuCiAqCiAqICBAcGFyYW0gbmV4dCAgICAgTmV4dCBzdWJ0cmVlIGl0ZW0uCiAqCiAqICBAcGFyYW0gcHJldmlvdXMgUHJldmlvdXMgc3VidHJlZSBpdGVtLgogKi8KTkVUU05NUF9TVEFUSUNfSU5MSU5FIHZvaWQKbG9va3VwX2NhY2hlX3JlcGxhY2UobG9va3VwX2NhY2hlICpwdHIsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZSAqbmV4dCwgbmV0c25tcF9zdWJ0cmVlICpwcmV2aW91cykgewoKICAgIHB0ci0+bmV4dCA9IG5leHQ7CiAgICBwdHItPnByZXZpb3VzID0gcHJldmlvdXM7Cn0KCi8qKiBGaW5kcyBhbiBlbnRyeSBpbiB0aGUgTG9va3VwIENhY2hlLgogKgogKiAgQHBhcmFtIGNvbnRleHQgIENhc2Ugc2Vuc2l0aXZlIG5hbWUgb2YgdGhlIGNvbnRleHQuCiAqCiAqICBAcGFyYW0gbmFtZSAgICAgVGhlIE9JRCB3ZSdyZSBzZWFyY2hpbmcgZm9yLgogKgogKiAgQHBhcmFtIG5hbWVfbGVuIE51bWJlciBvZiBzdWItaWRzIChzaW5nbGUgaW50ZWdlcnMpIGluIHRoZSBPSUQuCiAqCiAqICBAcGFyYW0gcmV0Y21wICAgVmFsdWUgc2V0IHRvIHNubXBfb2lkX2NvbXBhcmUoKSBjYWxsIHJlc3VsdC4KICogICAgICAgICAgICAgICAgICBUaGUgdmFsdWUsIGlmIHNldCwgaXMgYWx3YXlzIG5vbm5lZ2F0aXZlLgogKgogKiAgQHJldHVybiBnaXZlcyBMb29rdXAgQ2FjaGUgZW50cnksIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKgogKiAgQHNlZSBzbm1wX29pZF9jb21wYXJlKCkKICovCk5FVFNOTVBfU1RBVElDX0lOTElORSBsb29rdXBfY2FjaGUgKgpsb29rdXBfY2FjaGVfZmluZChjb25zdCBjaGFyICpjb250ZXh0LCBvaWQgKm5hbWUsIHNpemVfdCBuYW1lX2xlbiwKICAgICAgICAgICAgICAgICAgaW50ICpyZXRjbXApIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpjcHRyOwogICAgbG9va3VwX2NhY2hlICpyZXQgPSBOVUxMOwogICAgaW50IGNtcDsKICAgIGludCBpOwoKICAgIGlmICgoY3B0ciA9IGdldF9jb250ZXh0X2xvb2t1cF9jYWNoZShjb250ZXh0KSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBmb3IoaSA9IDA7IGkgPCBjcHRyLT50aGVjYWNoZWNvdW50ICYmIGkgPCBsb29rdXBfY2FjaGVfc2l6ZTsgaSsrKSB7CiAgICAgICAgaWYgKGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9hKQogICAgICAgICAgICBjbXAgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsIG5hbWVfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdHItPmNhY2hlW2ldLnByZXZpb3VzLT5zdGFydF9sZW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY21wID0gMTsKICAgICAgICBpZiAoY21wID49IDApIHsKICAgICAgICAgICAgKnJldGNtcCA9IGNtcDsKICAgICAgICAgICAgcmV0ID0gJihjcHRyLT5jYWNoZVtpXSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqIEBwcml2YXRlCiAqICBDbGVhcnMgY2FjaGUgY291bnQgYW5kIHBvc2l0aW9uIGluIExvb2t1cCBDYWNoZS4KICovCk5FVFNOTVBfU1RBVElDX0lOTElORSB2b2lkCmludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnN0IGNoYXIgKmNvbnRleHQpIHsKICAgIGxvb2t1cF9jYWNoZV9jb250ZXh0ICpjcHRyOwogICAgaWYgKChjcHRyID0gZ2V0X2NvbnRleHRfbG9va3VwX2NhY2hlKGNvbnRleHQpKSAhPSBOVUxMKSB7CiAgICAgICAgY3B0ci0+dGhlY2FjaGVjb3VudCA9IDA7CiAgICAgICAgY3B0ci0+Y3VycmVudHBvcyA9IDA7CiAgICB9Cn0KCnZvaWQKY2xlYXJfbG9va3VwX2NhY2hlKHZvaWQpIHsKCiAgICBsb29rdXBfY2FjaGVfY29udGV4dCAqcHRyID0gTlVMTCwgKm5leHQgPSBOVUxMOwoKICAgIHB0ciA9IHRoZWNvbnRleHRjYWNoZTsKICAgIHdoaWxlIChwdHIpIHsKCW5leHQgPSBwdHItPm5leHQ7CglTTk1QX0ZSRUUocHRyLT5jb250ZXh0KTsKCVNOTVBfRlJFRShwdHIpOwoJcHRyID0gbmV4dDsKICAgIH0KICAgIHRoZWNvbnRleHRjYWNoZSA9IE5VTEw7IC8qICEhISAqLwp9CgovKiogIEB9ICovCi8qIEVuZCBvZiBMb29rdXAgY2FjaGUgY29kZSAqLwoKLyoqIEBkZWZncm91cCBhZ2VudF9jb250ZXh0X2NhY2hlIENvbnRleHQgY2FjaGUsIHN0b3JpbmcgdGhlIE9JRHMgdW5kZXIgdGhlaXIgY29udGV4dHMuCiAqICAgICBNYWludGFpbiB0aGUgY2FjaGUgdXNlZCBmb3IgbG9jYXRpbmcgc3ViLXRyZWVzIHJlZ2lzdGVyZWQgdW5kZXIgZGlmZmVyZW50IGNvbnRleHRzLgogKiAgIEBpbmdyb3VwIGFnZW50X3JlZ2lzdHJ5CiAqCiAqIEB7CiAqLwpzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKmNvbnRleHRfc3VidHJlZXMgPSBOVUxMOwoKLyoqIFJldHVybnMgdGhlIHRvcCBlbGVtZW50IG9mIGNvbnRleHQgc3VidHJlZXMgY2FjaGUuCiAqICBVc2UgaXQgaWYgeW91IHdpc2ggdG8gc3dlZXAgdGhyb3VnaCB0aGUgY2FjaGUgZWxlbWVudHMuCiAqICBOb3RlIHRoYXQgdGhlIHJldHVybiBtYXkgYmUgTlVMTCAoY2FjaGUgbWF5IGJlIGVtcHR5KS4KICoKICogIEByZXR1cm4gcG9pbnRlciB0byB0b3Btb3N0IGNvbnRleHQgc3VidHJlZSBjYWNoZSBlbGVtZW50LgogKi8Kc3VidHJlZV9jb250ZXh0X2NhY2hlICoKZ2V0X3RvcF9jb250ZXh0X2NhY2hlKHZvaWQpCnsKICAgIHJldHVybiBjb250ZXh0X3N1YnRyZWVzOwp9CgovKiogRmluZHMgdGhlIGZpcnN0IHN1YnRyZWUgcmVnaXN0ZXJlZCB1bmRlciBnaXZlbiBjb250ZXh0LgogKgogKiAgQHBhcmFtIGNvbnRleHRfbmFtZSBUZXh0IG5hbWUgb2YgdGhlIGNvbnRleHQgd2UncmUgc2VhcmNoaW5nIGZvci4KICoKICogIEByZXR1cm4gcG9pbnRlciB0byB0aGUgZmlyc3Qgc3VidHJlZSBlbGVtZW50LCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CgogICAgaWYgKCFjb250ZXh0X25hbWUpIHsKICAgICAgICBjb250ZXh0X25hbWUgPSAiIjsKICAgIH0KCiAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJsb29raW5nIGZvciBzdWJ0cmVlIGZvciBjb250ZXh0OiBcIiVzXCJcbiIsIAoJCWNvbnRleHRfbmFtZSkpOwogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHB0ci0+Y29udGV4dF9uYW1lICE9IE5VTEwgJiYgCgkgICAgc3RyY21wKHB0ci0+Y29udGV4dF9uYW1lLCBjb250ZXh0X25hbWUpID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInN1YnRyZWUiLCAiZm91bmQgb25lIGZvcjogXCIlc1wiXG4iLCBjb250ZXh0X25hbWUpKTsKICAgICAgICAgICAgcmV0dXJuIHB0ci0+Zmlyc3Rfc3VidHJlZTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJkaWRuJ3QgZmluZCBhIHN1YnRyZWUgZm9yIGNvbnRleHQ6IFwiJXNcIlxuIiwgCgkJY29udGV4dF9uYW1lKSk7CiAgICByZXR1cm4gTlVMTDsKfQoKLyoqIEFkZHMgdGhlIHN1YnRyZWUgdG8gQ29udGV4dCBDYWNoZSB1bmRlciBnaXZlbiBjb250ZXh0IG5hbWUuCiAqCiAqICBAcGFyYW0gY29udGV4dF9uYW1lIFRleHQgbmFtZSBvZiB0aGUgY29udGV4dCB3ZSdyZSBhZGRpbmcuCiAqCiAqICBAcGFyYW0gbmV3X3RyZWUgVGhlIHN1YnRyZWUgdG8gYmUgYWRkZWQuCiAqCiAqICBAcmV0dXJuIGNvcHkgb2YgdGhlIG5ld190cmVlIHBvaW50ZXIsIG9yIE5VTEwgaWYgY2Fubm90IGFkZC4KICovCm5ldHNubXBfc3VidHJlZSAqCmFkZF9zdWJ0cmVlKG5ldHNubXBfc3VidHJlZSAqbmV3X3RyZWUsIGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHIgPSBTTk1QX01BTExPQ19UWVBFREVGKHN1YnRyZWVfY29udGV4dF9jYWNoZSk7CiAgICAKICAgIGlmICghY29udGV4dF9uYW1lKSB7CiAgICAgICAgY29udGV4dF9uYW1lID0gIiI7CiAgICB9CgogICAgaWYgKCFwdHIpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIAogICAgREVCVUdNU0dUTCgoInN1YnRyZWUiLCAiYWRkaW5nIHN1YnRyZWUgZm9yIGNvbnRleHQ6IFwiJXNcIlxuIiwJCgkJY29udGV4dF9uYW1lKSk7CgogICAgcHRyLT5uZXh0ID0gY29udGV4dF9zdWJ0cmVlczsKICAgIHB0ci0+Zmlyc3Rfc3VidHJlZSA9IG5ld190cmVlOwogICAgcHRyLT5jb250ZXh0X25hbWUgPSBzdHJkdXAoY29udGV4dF9uYW1lKTsKICAgIGNvbnRleHRfc3VidHJlZXMgPSBwdHI7CgogICAgcmV0dXJuIHB0ci0+Zmlyc3Rfc3VidHJlZTsKfQoKdm9pZApuZXRzbm1wX3JlbW92ZV9zdWJ0cmVlKG5ldHNubXBfc3VidHJlZSAqdHJlZSkKewogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CgogICAgaWYgKCF0cmVlLT5wcmV2KSB7CiAgICAgICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKICAgICAgICAgICAgaWYgKHB0ci0+Zmlyc3Rfc3VidHJlZSA9PSB0cmVlKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbmV0c25tcF9hc3NlcnQocHRyKTsKICAgICAgICBpZiAocHRyKQogICAgICAgICAgICBwdHItPmZpcnN0X3N1YnRyZWUgPSB0cmVlLT5uZXh0OwogICAgfSBlbHNlCiAgICAgICAgdHJlZS0+cHJldi0+bmV4dCA9IHRyZWUtPm5leHQ7CgogICAgaWYgKHRyZWUtPm5leHQpCiAgICAgICAgdHJlZS0+bmV4dC0+cHJldiA9IHRyZWUtPnByZXY7Cn0KCi8qKiBSZXBsYWNlcyBmaXJzdCBzdWJ0cmVlIHJlZ2lzdGVyZWQgdW5kZXIgZ2l2ZW4gY29udGV4dCBuYW1lLgogKiAgT3ZlcndyaXRlcyBhIHN1YnRyZWUgcG9pbnRlciBpbiBDb250ZXh0IENhY2hlIGZvciB0aGUgY29udGV4dCBuYW1lLgogKiAgVGhlIHByZXZpb3VzIHN1YnRyZWUgcG9pbnRlciBpcyBsb3N0LiBJZiB0aGVyZSdzIG5vIHN1YnRyZWUKICogIHVuZGVyIHRoZSBzdXBwbGllZCBuYW1lLCB0aGVuIGEgbmV3IGNhY2hlIGl0ZW0gaXMgY3JlYXRlZC4KICoKICogIEBwYXJhbSBuZXdfdHJlZSAgICAgVGhlIG5ldyBzdWJ0cmVlIHRvIGJlIHNldC4KICoKICogIEBwYXJhbSBjb250ZXh0X25hbWUgVGV4dCBuYW1lIG9mIHRoZSBjb250ZXh0IHdlJ3JlIHJlcGxhY2luZy4KICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgY2FzZSBzZW5zaXRpdmUuCiAqCiAqIEByZXR1cm4gY29weSBvZiB0aGUgbmV3X3RyZWUgcG9pbnRlciwgb3IgTlVMTCBvbiBlcnJvci4KICovCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9yZXBsYWNlX2ZpcnN0KG5ldHNubXBfc3VidHJlZSAqbmV3X3RyZWUsIAoJCQkgICAgICBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwogICAgaWYgKCFjb250ZXh0X25hbWUpIHsKICAgICAgICBjb250ZXh0X25hbWUgPSAiIjsKICAgIH0KICAgIGZvciAocHRyID0gY29udGV4dF9zdWJ0cmVlczsgcHRyICE9IE5VTEw7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGlmIChwdHItPmNvbnRleHRfbmFtZSAhPSBOVUxMICYmCgkgICAgc3RyY21wKHB0ci0+Y29udGV4dF9uYW1lLCBjb250ZXh0X25hbWUpID09IDApIHsKICAgICAgICAgICAgcHRyLT5maXJzdF9zdWJ0cmVlID0gbmV3X3RyZWU7CiAgICAgICAgICAgIHJldHVybiBwdHItPmZpcnN0X3N1YnRyZWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFkZF9zdWJ0cmVlKG5ld190cmVlLCBjb250ZXh0X25hbWUpOwp9CgoKdm9pZCBjbGVhcl9zdWJ0cmVlIChuZXRzbm1wX3N1YnRyZWUgKnN1Yik7CgovKiogQ29tcGxldGVseSBjbGVhcnMgYm90aCB0aGUgQ29udGV4dCBjYWNoZSBhbmQgdGhlIExvb2t1cCBjYWNoZS4KICovCnZvaWQKY2xlYXJfY29udGV4dCh2b2lkKSB7CgogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHIgPSBOVUxMLCAqbmV4dCA9IE5VTEw7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnQsICp1OwoKICAgIERFQlVHTVNHVEwoKCJhZ2VudF9yZWdpc3RyeSIsICJjbGVhciBjb250ZXh0XG4iKSk7CgogICAgcHRyID0gZ2V0X3RvcF9jb250ZXh0X2NhY2hlKCk7IAogICAgd2hpbGUgKHB0cikgewoJbmV4dCA9IHB0ci0+bmV4dDsKCglmb3IgKHQgPSBwdHItPmZpcnN0X3N1YnRyZWU7IHQ7IHQgPSB1KSB7CiAgICAgICAgICAgIHUgPSB0LT5uZXh0OwoJICAgIGNsZWFyX3N1YnRyZWUodCk7Cgl9CgogICAgICAgIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciosIHB0ci0+Y29udGV4dF9uYW1lKSk7CiAgICAgICAgU05NUF9GUkVFKHB0cik7CgoJcHRyID0gbmV4dDsKICAgIH0KICAgIGNvbnRleHRfc3VidHJlZXMgPSBOVUxMOyAvKiAhISEgKi8KICAgIGNsZWFyX2xvb2t1cF9jYWNoZSgpOwp9CgovKiogIEB9ICovCi8qIEVuZCBvZiBDb250ZXh0IGNhY2hlIGNvZGUgKi8KCi8qKiBAZGVmZ3JvdXAgYWdlbnRfbWliX3N1YnRyZWUgTWFpbnRhaW5pbmcgTUlCIHN1YnRyZWVzLgogKiAgICAgTWFpbnRhaW5pbmcgTUlCIG5vZGVzIGFuZCBzdWJ0cmVlcy4KICogICBAaW5ncm91cCBhZ2VudF9yZWdpc3RyeQogKgogKiBAewogKi8KCnN0YXRpYyB2b2lkIHJlZ2lzdGVyX21pYl9kZXRhY2hfbm9kZShuZXRzbm1wX3N1YnRyZWUgKnMpOwoKLyoqIEZyZWVzIHNpbmdsZSBzdWJ0cmVlIGl0ZW0uCiAqICBEZWFsbG9jYXRlZCBtZW1vcnkgZm9yIGdpdmVuIG5ldHNubXBfc3VidHJlZSBpdGVtLCBpbmNsdWRpbmcKICogIEhhbmRsZSBSZWdpc3RyYXRpb24gc3RydWN0dXJlIHN0b3JlZCBpbnNpZGUgdGhpcyBpdGVtLgogKiAgQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgcG9pbnRlciBpcyBpbnZhbGlkCiAqICBhbmQgc2hvdWxkIGJlIHNldCB0byBOVUxMLgogKgogKiAgQHBhcmFtIGEgVGhlIHN1YnRyZWUgaXRlbSB0byBkaXNwb3NlLgogKi8Kdm9pZApuZXRzbm1wX3N1YnRyZWVfZnJlZShuZXRzbm1wX3N1YnRyZWUgKmEpCnsKICBpZiAoYSAhPSBOVUxMKSB7CiAgICBpZiAoYS0+dmFyaWFibGVzICE9IE5VTEwgJiYgbmV0c25tcF9vaWRfZXF1YWxzKGEtPm5hbWVfYSwgYS0+bmFtZWxlbiwgCgkJCQkJICAgICBhLT5zdGFydF9hLCBhLT5zdGFydF9sZW4pID09IDApIHsKICAgICAgU05NUF9GUkVFKGEtPnZhcmlhYmxlcyk7CiAgICB9CiAgICBTTk1QX0ZSRUUoYS0+bmFtZV9hKTsKICAgIGEtPm5hbWVsZW4gPSAwOwogICAgU05NUF9GUkVFKGEtPnN0YXJ0X2EpOwogICAgYS0+c3RhcnRfbGVuID0gMDsKICAgIFNOTVBfRlJFRShhLT5lbmRfYSk7CiAgICBhLT5lbmRfbGVuID0gMDsKICAgIFNOTVBfRlJFRShhLT5sYWJlbF9hKTsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShhLT5yZWdpbmZvKTsKICAgIGEtPnJlZ2luZm8gPSBOVUxMOwogICAgU05NUF9GUkVFKGEpOwogIH0KfQoKLyoqIENyZWF0ZXMgZGVlcCBjb3B5IG9mIGEgc3VidHJlZSBpdGVtLgogKiAgRHVwbGljYXRlcyBhbGwgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIHN0cnVjdHVyZSwgaW5jbHVkaW5nCiAqICBIYW5kbGUgUmVnaXN0cmF0aW9uIHN0cnVjdHVyZSBzdG9yZWQgaW5zaWRlIHRoZSBpdGVtLgogKgogKiAgQHBhcmFtIGEgVGhlIHN1YnRyZWUgaXRlbSB0byBjb3B5LgogKgogKiAgQHJldHVybiBkZWVwIGNvcHkgb2YgdGhlIHN1YnRyZWUgaXRlbSwgb3IgTlVMTCBvbiBlcnJvci4KICovCm5ldHNubXBfc3VidHJlZSAqCm5ldHNubXBfc3VidHJlZV9kZWVwY29weShuZXRzbm1wX3N1YnRyZWUgKmEpCnsKICBuZXRzbm1wX3N1YnRyZWUgKmIgPSAobmV0c25tcF9zdWJ0cmVlICopY2FsbG9jKDEsIHNpemVvZihuZXRzbm1wX3N1YnRyZWUpKTsKCiAgaWYgKGIgIT0gTlVMTCkgewogICAgbWVtY3B5KGIsIGEsIHNpemVvZihuZXRzbm1wX3N1YnRyZWUpKTsKICAgIGItPm5hbWVfYSAgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChhLT5uYW1lX2EsICBhLT5uYW1lbGVuKTsKICAgIGItPnN0YXJ0X2EgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChhLT5zdGFydF9hLCBhLT5zdGFydF9sZW4pOwogICAgYi0+ZW5kX2EgICA9IHNubXBfZHVwbGljYXRlX29iamlkKGEtPmVuZF9hLCAgIGEtPmVuZF9sZW4pOwogICAgYi0+bGFiZWxfYSA9IHN0cmR1cChhLT5sYWJlbF9hKTsKICAgIAogICAgaWYgKGItPm5hbWVfYSA9PSBOVUxMIHx8IGItPnN0YXJ0X2EgPT0gTlVMTCB8fCAKCWItPmVuZF9hICA9PSBOVUxMIHx8IGItPmxhYmVsX2EgPT0gTlVMTCkgewogICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShiKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKGEtPnZhcmlhYmxlcyAhPSBOVUxMKSB7CiAgICAgIGItPnZhcmlhYmxlcyA9IChzdHJ1Y3QgdmFyaWFibGUgKiltYWxsb2MoYS0+dmFyaWFibGVzX2xlbiAqIAoJCQkJCSAgICAgICBhLT52YXJpYWJsZXNfd2lkdGgpOwogICAgICBpZiAoYi0+dmFyaWFibGVzICE9IE5VTEwpIHsKCW1lbWNweShiLT52YXJpYWJsZXMsIGEtPnZhcmlhYmxlcyxhLT52YXJpYWJsZXNfbGVuKmEtPnZhcmlhYmxlc193aWR0aCk7CiAgICAgIH0gZWxzZSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShiKTsKCXJldHVybiBOVUxMOwogICAgICB9CiAgICB9CgogICAgaWYgKGEtPnJlZ2luZm8gIT0gTlVMTCkgewogICAgICBiLT5yZWdpbmZvID0gbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9kdXAoYS0+cmVnaW5mbyk7CiAgICAgIGlmIChiLT5yZWdpbmZvID09IE5VTEwpIHsKCW5ldHNubXBfc3VidHJlZV9mcmVlKGIpOwoJcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGI7Cn0KCi8qKiBAcHJpdmF0ZQogKiAgUmVwbGFjZXMgbmV4dCBzdWJ0cmVlIHBvaW50ZXIgaW4gZ2l2ZW4gc3VidHJlZS4KICovCk5FVFNOTVBfU1RBVElDX0lOTElORSB2b2lkCm5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXRzbm1wX3N1YnRyZWUgKnB0ciwgbmV0c25tcF9zdWJ0cmVlICp0aGVuZXh0KQp7CiAgICBwdHItPm5leHQgPSB0aGVuZXh0OwogICAgaWYgKHRoZW5leHQpCiAgICAgICAgbmV0c25tcF9vaWRfY29tcGFyZV9sbChwdHItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPnN0YXJ0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW5leHQtPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuZXh0LT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbmV4dC0+b2lkX29mZik7Cn0KCi8qKiBAcHJpdmF0ZQogKiAgUmVwbGFjZXMgcHJldmlvdXMgc3VidHJlZSBwb2ludGVyIGluIGdpdmVuIHN1YnRyZWUuCiAqLwpORVRTTk1QX1NUQVRJQ19JTkxJTkUgdm9pZApuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYobmV0c25tcF9zdWJ0cmVlICpwdHIsIG5ldHNubXBfc3VidHJlZSAqdGhlcHJldikKewogICAgcHRyLT5wcmV2ID0gdGhlcHJldjsKICAgIGlmICh0aGVwcmV2KQogICAgICAgIG5ldHNubXBfb2lkX2NvbXBhcmVfbGwodGhlcHJldi0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXByZXYtPnN0YXJ0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+c3RhcnRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ci0+b2lkX29mZik7Cn0KCi8qKiBDb21wYXJlcyBPSURzIG9mIGdpdmVuIHN1YnRyZWVzLgogKgogKiAgQHBhcmFtIGFwLGJwIFBvaW50ZXJzIHRvIHRoZSBzdWJ0cmVlcyB0byBiZSBjb21wYXJlZC4KICoKICogIEByZXR1cm4gT0lEcyBsZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiByZXN1bHQuCiAqCiAqICBAc2VlIHNubXBfb2lkX2NvbXBhcmUoKQogKi8KaW50Cm5ldHNubXBfc3VidHJlZV9jb21wYXJlKGNvbnN0IG5ldHNubXBfc3VidHJlZSAqYXAsIGNvbnN0IG5ldHNubXBfc3VidHJlZSAqYnApCnsKICAgIHJldHVybiBzbm1wX29pZF9jb21wYXJlKGFwLT5uYW1lX2EsIGFwLT5uYW1lbGVuLCBicC0+bmFtZV9hLCBicC0+bmFtZWxlbik7Cn0KCi8qKiBKb2lucyB0aGUgZ2l2ZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IHRyZWUuCiAqICBUcmVlcyBhcmUgam9pbmVkIGFuZCB0aGUgb25lIHN1cHBsaWVkIGFzIHBhcmFtZXRlciBpcyBmcmVlZC4KICoKICogIEBwYXJhbSByb290IFRoZSBzdWJ0cmVlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3VidHJlZS4KICogICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIHBvaW50ZXIgYWZ0ZXIgam9pbmluZyAtIGl0IG1heSBiZSBpbnZhbGlkLgogKi8Kdm9pZApuZXRzbm1wX3N1YnRyZWVfam9pbihuZXRzbm1wX3N1YnRyZWUgKnJvb3QpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqcywgKnRtcCwgKmMsICpkOwoKICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKICAgICAgICBzID0gcm9vdC0+bmV4dDsKICAgICAgICB3aGlsZSAocyAhPSBOVUxMICYmIHJvb3QtPnJlZ2luZm8gPT0gcy0+cmVnaW5mbykgewogICAgICAgICAgICB0bXAgPSBzLT5uZXh0OwogICAgICAgICAgICBERUJVR01TR1RMKCgic3VidHJlZSIsICJyb290IHN0YXJ0ICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcm9vdC0+c3RhcnRfYSwgcm9vdC0+c3RhcnRfbGVuKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgic3VidHJlZSIsICIgKG9yaWdpbmFsIGVuZCAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgic3VidHJlZSIsIHJvb3QtPmVuZF9hLCByb290LT5lbmRfbGVuKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgic3VidHJlZSIsICIpXG4iKSk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzdWJ0cmVlIiwgIiAgSk9JTklORyB0byAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgic3VidHJlZSIsIHMtPnN0YXJ0X2EsIHMtPnN0YXJ0X2xlbikpOwoKCSAgICBTTk1QX0ZSRUUocm9vdC0+ZW5kX2EpOwoJICAgIHJvb3QtPmVuZF9hICAgPSBzLT5lbmRfYTsKICAgICAgICAgICAgcm9vdC0+ZW5kX2xlbiA9IHMtPmVuZF9sZW47CgkgICAgcy0+ZW5kX2EgICAgICA9IE5VTEw7CgogICAgICAgICAgICBmb3IgKGMgPSByb290OyBjICE9IE5VTEw7IGMgPSBjLT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9uZXh0KGMsIHMtPm5leHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoYyA9IHM7IGMgIT0gTlVMTDsgYyA9IGMtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYoYywgcm9vdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIiBzbyBuZXcgZW5kICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJzdWJ0cmVlIiwgcm9vdC0+ZW5kX2EsIHJvb3QtPmVuZF9sZW4pKTsKICAgICAgICAgICAgREVCVUdNU0coKCJzdWJ0cmVlIiwgIlxuIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQcm9iYWJseSBuZWVkIHRvIGZyZWUgY2hpbGRyZW4gdG9vPyAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb3IgKGMgPSBzLT5jaGlsZHJlbjsgYyAhPSBOVUxMOyBjID0gZCkgewogICAgICAgICAgICAgICAgZCA9IGMtPmNoaWxkcmVuOwogICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUocyk7CiAgICAgICAgICAgIHMgPSB0bXA7CiAgICAgICAgfQogICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgfQp9CgoKLyoqIFNwbGl0IHRoZSBzdWJ0cmVlIGludG8gdHdvIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAqICBTdWJ0cmVlcyBvZiB0aGUgZ2l2ZW4gT0lEIGFuZCBzZXBhcmF0ZWQgYW5kIGZvcm1lZCBpbnRvIHRoZQogKiAgcmV0dXJuZWQgc3VidHJlZS4KICoKICogIEBwYXJhbSBjdXJyZW50IFRoZSBlbGVtZW50IGF0IHdoaWNoIHNwbGl0dGluZyBpcyBzdGFydGVkLgogKgogKiAgQHBhcmFtIG5hbWUgVGhlIE9JRCB3ZSdkIGxpa2UgdG8gc3BsaXQuCiAqCiAqICBAcGFyYW0gbmFtZV9sZW4gTGVuZ3RoIG9mIHRoZSBPSUQuCiAqCiAqICBAcmV0dXJuIGhlYWQgb2YgdGhlIG5ldyAoc2Vjb25kKSBzdWJ0cmVlLgogKi8KbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX3NwbGl0KG5ldHNubXBfc3VidHJlZSAqY3VycmVudCwgb2lkIG5hbWVbXSwgaW50IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUgKnZwID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbmV3X3N1YiwgKnB0cjsKICAgIGludCBpID0gMCwgcmMgPSAwLCByYzIgPSAwOwogICAgc2l6ZV90IGNvbW1vbl9sZW4gPSAwOwogICAgY2hhciAqY3A7CiAgICBvaWQgKnRtcF9hLCAqdG1wX2I7CgogICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbmFtZV9sZW4sIGN1cnJlbnQtPmVuZF9hLCBjdXJyZW50LT5lbmRfbGVuKT4wKSB7CgkvKiBTcGxpdCBjb21lcyBhZnRlciB0aGUgZW5kIG9mIHRoaXMgc3VidHJlZSAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG5ld19zdWIgPSBuZXRzbm1wX3N1YnRyZWVfZGVlcGNvcHkoY3VycmVudCk7CiAgICBpZiAobmV3X3N1YiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogIFNldCB1cCB0aGUgcG9pbnQgb2YgZGl2aXNpb24uICAqLwogICAgdG1wX2EgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChuYW1lLCBuYW1lX2xlbik7CiAgICBpZiAodG1wX2EgPT0gTlVMTCkgewoJbmV0c25tcF9zdWJ0cmVlX2ZyZWUobmV3X3N1Yik7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIHRtcF9iID0gc25tcF9kdXBsaWNhdGVfb2JqaWQobmFtZSwgbmFtZV9sZW4pOwogICAgaWYgKHRtcF9iID09IE5VTEwpIHsKCW5ldHNubXBfc3VidHJlZV9mcmVlKG5ld19zdWIpOwoJU05NUF9GUkVFKHRtcF9hKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIFNOTVBfRlJFRShjdXJyZW50LT5lbmRfYSk7CiAgICBjdXJyZW50LT5lbmRfYSA9IHRtcF9hOwogICAgY3VycmVudC0+ZW5kX2xlbiA9IG5hbWVfbGVuOwogICAgaWYgKG5ld19zdWItPnN0YXJ0X2EgIT0gTlVMTCkgewoJU05NUF9GUkVFKG5ld19zdWItPnN0YXJ0X2EpOwogICAgfQogICAgbmV3X3N1Yi0+c3RhcnRfYSA9IHRtcF9iOwogICAgbmV3X3N1Yi0+c3RhcnRfbGVuID0gbmFtZV9sZW47CgogICAgLyogIFNwbGl0IHRoZSB2YXJpYWJsZXMgYmV0d2VlbiB0aGUgdHdvIG5ldyBzdWJ0cmVlcy4gICovCiAgICBpID0gY3VycmVudC0+dmFyaWFibGVzX2xlbjsKICAgIGN1cnJlbnQtPnZhcmlhYmxlc19sZW4gPSAwOwoKICAgIGZvciAodnAgPSBjdXJyZW50LT52YXJpYWJsZXM7IGkgPiAwOyBpLS0pIHsKCS8qICBOb3RlIHRoYXQgdGhlIHZhcmlhYmxlICJuYW1lIiBmaWVsZCBvbWl0cyB0aGUgcHJlZml4IGNvbW1vbiB0byB0aGUKCSAgICB3aG9sZSByZWdpc3RyYXRpb24sIGhlbmNlIHRoZSBzdHJhbmdlIGNvbXBhcmlzb24gaGVyZS4gICovCgoJcmMgPSBzbm1wX29pZF9jb21wYXJlKHZwLT5uYW1lLCB2cC0+bmFtZWxlbiwKCQkJICAgICAgbmFtZSAgICAgKyBjdXJyZW50LT5uYW1lbGVuLCAKCQkJICAgICAgbmFtZV9sZW4gLSBjdXJyZW50LT5uYW1lbGVuKTsKCiAgICAgICAgaWYgKG5hbWVfbGVuIC0gY3VycmVudC0+bmFtZWxlbiA+IHZwLT5uYW1lbGVuKSB7CiAgICAgICAgICAgIGNvbW1vbl9sZW4gPSB2cC0+bmFtZWxlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21tb25fbGVuID0gbmFtZV9sZW4gLSBjdXJyZW50LT5uYW1lbGVuOwogICAgICAgIH0KCiAgICAgICAgcmMyID0gc25tcF9vaWRfY29tcGFyZSh2cC0+bmFtZSwgY29tbW9uX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyBjdXJyZW50LT5uYW1lbGVuLCBjb21tb25fbGVuKTsKCiAgICAgICAgaWYgKHJjID49IDApIHsKICAgICAgICAgICAgYnJlYWs7ICAvKiBBbGwgZm9sbG93aW5nIHZhcmlhYmxlcyBiZWxvbmcgdG8gdGhlIHNlY29uZCBzdWJ0cmVlICovCgl9CgogICAgICAgIGN1cnJlbnQtPnZhcmlhYmxlc19sZW4rKzsKICAgICAgICBpZiAocmMyIDwgMCkgewogICAgICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXNfbGVuLS07CiAgICAgICAgICAgIGNwID0gKGNoYXIgKikgbmV3X3N1Yi0+dmFyaWFibGVzOwogICAgICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXMgPSAoc3RydWN0IHZhcmlhYmxlICopKGNwICsgCgkJCQkJCSAgICAgbmV3X3N1Yi0+dmFyaWFibGVzX3dpZHRoKTsKICAgICAgICB9CiAgICAgICAgdnAgPSAoc3RydWN0IHZhcmlhYmxlICopICgoY2hhciAqKSB2cCArIGN1cnJlbnQtPnZhcmlhYmxlc193aWR0aCk7CiAgICB9CgogICAgLyogRGVsZWdhdGVkIHRyZWVzIHNob3VsZCByZXRhaW4gdGhlaXIgdmFyaWFibGVzIHJlZ2FyZGxlc3MgKi8KICAgIGlmIChjdXJyZW50LT52YXJpYWJsZXNfbGVuID4gMCAmJgogICAgICAgIElTX0RFTEVHQVRFRCgodV9jaGFyKSBjdXJyZW50LT52YXJpYWJsZXNbMF0udHlwZSkpIHsKICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXNfbGVuID0gMTsKICAgICAgICBuZXdfc3ViLT52YXJpYWJsZXMgPSBjdXJyZW50LT52YXJpYWJsZXM7CiAgICB9CgogICAgLyogUHJvcG9nYXRlIHRoaXMgc3BsaXQgZG93biB0aHJvdWdoIGFueSBjaGlsZHJlbiAqLwogICAgaWYgKGN1cnJlbnQtPmNoaWxkcmVuKSB7CiAgICAgICAgbmV3X3N1Yi0+Y2hpbGRyZW4gPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQoY3VycmVudC0+Y2hpbGRyZW4sIAoJCQkJCQkgIG5hbWUsIG5hbWVfbGVuKTsKICAgIH0KCiAgICAvKiBSZXRhaW4gdGhlIGNvcnJlY3QgbGlua2luZyBvZiB0aGUgbGlzdCAqLwogICAgZm9yIChwdHIgPSBjdXJyZW50OyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwdHIsIG5ld19zdWIpOwogICAgfQogICAgZm9yIChwdHIgPSBuZXdfc3ViOyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIGN1cnJlbnQpOwogICAgfQogICAgZm9yIChwdHIgPSBuZXdfc3ViLT5uZXh0OyBwdHIgIT0gTlVMTDsgcHRyPXB0ci0+Y2hpbGRyZW4pIHsKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYocHRyLCBuZXdfc3ViKTsKICAgIH0KCiAgICByZXR1cm4gbmV3X3N1YjsKfQoKLyoqIExvYWRzIHRoZSBzdWJ0cmVlIHVuZGVyIGdpdmVuIGNvbnRleHQgbmFtZS4KICoKICogIEBwYXJhbSBuZXdfc3ViIFRoZSBzdWJ0cmVlIHRvIGJlIGxvYWRlZCBpbnRvIGN1cnJlbnQgc3VidHJlZS4KICoKICogIEBwYXJhbSBjb250ZXh0X25hbWUgVGV4dCBuYW1lIG9mIHRoZSBjb250ZXh0IHdlJ3JlIHNlYXJjaGluZyBmb3IuCiAqCiAqICBAcmV0dXJuIGdpdmVzIE1JQl9SRUdJU1RFUkVEX09LIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogKi8KaW50Cm5ldHNubXBfc3VidHJlZV9sb2FkKG5ldHNubXBfc3VidHJlZSAqbmV3X3N1YiwgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnRyZWUxLCAqdHJlZTIsICpuZXcyOwogICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCAqbmV4dDsKICAgIGludCAgICAgICAgICAgICByZXMsIHJjID0gMDsKCiAgICBpZiAobmV3X3N1YiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RFUkVEX09LOyAgICAgICAvKiBEZWdlbmVyYXRlIGNhc2UgKi8KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHRfbmFtZSkpIHsKICAgICAgICBzdGF0aWMgaW50IGlubG9vcCA9IDA7CiAgICAgICAgaWYgKCFpbmxvb3ApIHsKICAgICAgICAgICAgb2lkIGNjaXR0WzFdICAgICAgICAgICA9IHsgMCB9OwogICAgICAgICAgICBvaWQgaXNvWzFdICAgICAgICAgICAgID0geyAxIH07CiAgICAgICAgICAgIG9pZCBqb2ludF9jY2l0dF9pc29bMV0gPSB7IDIgfTsKICAgICAgICAgICAgaW5sb29wID0gMTsKICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9udWxsX2NvbnRleHQoc25tcF9kdXBsaWNhdGVfb2JqaWQoY2NpdHQsIDEpLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGxfY29udGV4dChzbm1wX2R1cGxpY2F0ZV9vYmppZChpc28sIDEpLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGxfY29udGV4dChzbm1wX2R1cGxpY2F0ZV9vYmppZChqb2ludF9jY2l0dF9pc28sIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBjb250ZXh0X25hbWUpOwogICAgICAgICAgICBpbmxvb3AgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKiAgRmluZCB0aGUgc3VidHJlZSB0aGF0IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgbmV3IHN1YnRyZWUgKGlmCglhbnkpLi4uKi8KCiAgICB0cmVlMSA9IG5ldHNubXBfc3VidHJlZV9maW5kKG5ld19zdWItPnN0YXJ0X2EsIG5ld19zdWItPnN0YXJ0X2xlbiwgCgkJCQkgTlVMTCwgY29udGV4dF9uYW1lKTsKCiAgICAvKiAgLi4uIGFuZCB0aGUgc3VidHJlZSB0aGF0IGZvbGxvd3MgdGhlIG5ldyBvbmUgKE5VTEwgaW1wbGllcyB0aGlzIGlzIHRoZQoJZmluYWwgcmVnaW9uIGNvdmVyZWQpLiAgKi8KCiAgICBpZiAodHJlZTEgPT0gTlVMTCkgewoJdHJlZTIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9uZXh0KG5ld19zdWItPnN0YXJ0X2EsIG5ld19zdWItPnN0YXJ0X2xlbiwKCQkJCQkgIE5VTEwsIGNvbnRleHRfbmFtZSk7CiAgICB9IGVsc2UgewoJdHJlZTIgPSB0cmVlMS0+bmV4dDsKICAgIH0KCiAgICAvKiAgSGFuZGxlIG5ldyBzdWJ0cmVlcyB0aGF0IHN0YXJ0IGluIHZpcmdpbiB0ZXJyaXRvcnkuICAqLwoKICAgIGlmICh0cmVlMSA9PSBOVUxMKSB7CgluZXcyID0gTlVMTDsKCS8qICBJcyB0aGVyZSBhbnkgb3ZlcmxhcCB3aXRoIGxhdGVyIHN1YnRyZWVzPyAgKi8KCWlmICh0cmVlMiAmJiBzbm1wX29pZF9jb21wYXJlKG5ld19zdWItPmVuZF9hLCBuZXdfc3ViLT5lbmRfbGVuLAoJCQkJICAgICAgdHJlZTItPnN0YXJ0X2EsIHRyZWUyLT5zdGFydF9sZW4pID4gMCkgewoJICAgIG5ldzIgPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQobmV3X3N1YiwgCgkJCQkJIHRyZWUyLT5zdGFydF9hLCB0cmVlMi0+c3RhcnRfbGVuKTsKCX0KCgkvKiAgTGluayB0aGUgbmV3IHN1YnRyZWUgKGxlc3MgYW55IG92ZXJsYXBwaW5nIHJlZ2lvbikgd2l0aCB0aGUgbGlzdCBvZgoJICAgIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbnMuICAqLwoKCWlmICh0cmVlMikgewogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYobmV3X3N1YiwgdHJlZTItPnByZXYpOwogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYodHJlZTIsIG5ld19zdWIpOwoJfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2NoYW5nZV9wcmV2KG5ld19zdWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZmluZF9wcmV2KG5ld19zdWItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdWItPnN0YXJ0X2xlbiwgTlVMTCwgY29udGV4dF9uYW1lKSk7CgoJICAgIGlmIChuZXdfc3ViLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQobmV3X3N1Yi0+cHJldiwgbmV3X3N1Yik7CgkgICAgfSBlbHNlIHsKCQluZXRzbm1wX3N1YnRyZWVfcmVwbGFjZV9maXJzdChuZXdfc3ViLCBjb250ZXh0X25hbWUpOwoJICAgIH0KCiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCB0cmVlMik7CgoJICAgIC8qIElmIHRoZXJlIHdhcyBhbnkgb3ZlcmxhcCwgcmVjdXJzZSB0byBtZXJnZSBpbiB0aGUgb3ZlcmxhcHBpbmcKCSAgICAgICByZWdpb24gKGluY2x1ZGluZyBhbnl0aGluZyB0aGF0IG1heSBmb2xsb3cgdGhlIG92ZXJsYXApLiAgKi8KCSAgICBpZiAobmV3MikgewoJCXJldHVybiBuZXRzbm1wX3N1YnRyZWVfbG9hZChuZXcyLCBjb250ZXh0X25hbWUpOwoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgkvKiAgSWYgdGhlIG5ldyBzdWJ0cmVlIHN0YXJ0cyAqd2l0aGluKiBhbiBleGlzdGluZyByZWdpc3RyYXRpb24KCSAgICAocmF0aGVyIHRoYW4gYXQgdGhlIHNhbWUgcG9pbnQgYXMgaXQpLCB0aGVuIHNwbGl0IHRoZSBleGlzdGluZwoJICAgIHN1YnRyZWUgYXQgdGhpcyBwb2ludC4gICovCgoJaWYgKG5ldHNubXBfb2lkX2VxdWFscyhuZXdfc3ViLT5zdGFydF9hLCBuZXdfc3ViLT5zdGFydF9sZW4sIAoJCQkgICAgIHRyZWUxLT5zdGFydF9hLCAgIHRyZWUxLT5zdGFydF9sZW4pICE9IDApIHsKCSAgICB0cmVlMSA9IG5ldHNubXBfc3VidHJlZV9zcGxpdCh0cmVlMSwgbmV3X3N1Yi0+c3RhcnRfYSwgCgkJCQkJICBuZXdfc3ViLT5zdGFydF9sZW4pOwoJfQoKICAgICAgICBpZiAodHJlZTEgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7Cgl9CgoJLyogIE5vdyBjb25zaWRlciB0aGUgZW5kIG9mIHRoaXMgZXhpc3Rpbmcgc3VidHJlZToKCSAgICAKCSAgICBJZiBpdCBtYXRjaGVzIHRoZSBuZXcgc3VidHJlZSBwcmVjaXNlbHksCgkgICAgICAgICAgICBzaW1wbHkgbWVyZ2UgdGhlIG5ldyBvbmUgaW50byB0aGUgbGlzdCBvZiBjaGlsZHJlbgoKCSAgICBJZiBpdCBpbmNsdWRlcyB0aGUgd2hvbGUgb2YgdGhlIG5ldyBzdWJ0cmVlLAoJCSAgICBzcGxpdCBpdCBhdCB0aGUgYXBwcm9wcmlhdGUgcG9pbnQsIGFuZCBtZXJnZSBhZ2FpbgogICAgIAoJICAgIElmIHRoZSBuZXcgc3VidHJlZSBleHRlbmRzIGJleW9uZCB0aGlzIGV4aXN0aW5nIHJlZ2lvbiwKCSAgICAgICAgICAgIHNwbGl0IGl0LCBhbmQgcmVjdXJzZSB0byBtZXJnZSB0aGUgdHdvIHBhcnRzLiAgKi8KCglyYyA9IHNubXBfb2lkX2NvbXBhcmUobmV3X3N1Yi0+ZW5kX2EsIG5ld19zdWItPmVuZF9sZW4sIAoJCQkgICAgICB0cmVlMS0+ZW5kX2EsIHRyZWUxLT5lbmRfbGVuKTsKCiAgICAgICAgc3dpdGNoIChyYykgewoKCWNhc2UgLTE6CgkgICAgLyogIEV4aXN0aW5nIHN1YnRyZWUgY29udGFpbnMgbmV3IG9uZS4gICovCgkgICAgbmV0c25tcF9zdWJ0cmVlX3NwbGl0KHRyZWUxLCBuZXdfc3ViLT5lbmRfYSwgbmV3X3N1Yi0+ZW5kX2xlbik7CgkgICAgLyogRmFsbCBUaHJvdWdoICovCgoJY2FzZSAgMDoKCSAgICAvKiAgVGhlIHR3byB0cmVlcyBtYXRjaCBwcmVjaXNlbHkuICAqLwoKCSAgICAvKiAgTm90ZTogVGhpcyBpcyB0aGUgb25seSBwb2ludCB3aGVyZSB0aGUgb3JpZ2luYWwgcmVnaXN0cmF0aW9uCgkgICAgICAgIE9JRCAoIm5hbWUiKSBpcyB1c2VkLiAgKi8KCgkgICAgcHJldiA9IE5VTEw7CgkgICAgbmV4dCA9IHRyZWUxOwoJCgkgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+bmFtZWxlbiA+IG5ld19zdWItPm5hbWVsZW4pIHsKCQlwcmV2ID0gbmV4dDsKCQluZXh0ID0gbmV4dC0+Y2hpbGRyZW47CgkgICAgfQoKCSAgICB3aGlsZSAobmV4dCAmJiBuZXh0LT5uYW1lbGVuID09IG5ld19zdWItPm5hbWVsZW4gJiYKCQkgICBuZXh0LT5wcmlvcml0eSA8IG5ld19zdWItPnByaW9yaXR5ICkgewoJCXByZXYgPSBuZXh0OwoJCW5leHQgPSBuZXh0LT5jaGlsZHJlbjsKCSAgICB9CgkKCSAgICBpZiAobmV4dCAmJiAobmV4dC0+bmFtZWxlbiAgPT0gbmV3X3N1Yi0+bmFtZWxlbikgJiYKCQkobmV4dC0+cHJpb3JpdHkgPT0gbmV3X3N1Yi0+cHJpb3JpdHkpKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3X3N1Yi0+bmFtZWxlbiAhPSAxKSB7ICAgIC8qIGlnbm9yZSByb290IE9JRCBkdXBzICovCiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMDsKICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqYnVmID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N1Yi0+c3RhcnRfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdWItPnN0YXJ0X2xlbik7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHJlZ2lzdHJhdGlvbjogTUlCIG1vZHVsZXMgJXMgYW5kICVzIChvaWQgJXMlcykuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtPmxhYmVsX2EsIG5ld19zdWItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID8gYnVmIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93ID8gIiBbVFJVTkNBVEVEXSIgOiAiIik7CiAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICAgICAgfQoJCXJldHVybiBNSUJfRFVQTElDQVRFX1JFR0lTVFJBVElPTjsKCSAgICB9CgoJICAgIGlmIChwcmV2KSB7CgkJcHJldi0+Y2hpbGRyZW4gICAgPSBuZXdfc3ViOwoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBwcmV2LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBwcmV2LT5uZXh0KTsKCSAgICB9IGVsc2UgewoJCW5ld19zdWItPmNoaWxkcmVuID0gbmV4dDsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXdfc3ViLCBuZXh0LT5wcmV2KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChuZXdfc3ViLCBuZXh0LT5uZXh0KTsKCQoJCWZvciAobmV4dCA9IG5ld19zdWItPm5leHQ7IG5leHQgIT0gTlVMTDtuZXh0ID0gbmV4dC0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihuZXh0LCBuZXdfc3ViKTsKCQl9CgoJCWZvciAocHJldiA9IG5ld19zdWItPnByZXY7IHByZXYgIT0gTlVMTDtwcmV2ID0gcHJldi0+Y2hpbGRyZW4pewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfbmV4dChwcmV2LCBuZXdfc3ViKTsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgIDE6CgkgICAgLyogIE5ldyBzdWJ0cmVlIGNvbnRhaW5zIHRoZSBleGlzdGluZyBvbmUuICAqLwoJICAgIG5ldzIgPSBuZXRzbm1wX3N1YnRyZWVfc3BsaXQobmV3X3N1YiwgdHJlZTEtPmVuZF9hLHRyZWUxLT5lbmRfbGVuKTsKCSAgICByZXMgPSBuZXRzbm1wX3N1YnRyZWVfbG9hZChuZXdfc3ViLCBjb250ZXh0X25hbWUpOwoJICAgIGlmIChyZXMgIT0gTUlCX1JFR0lTVEVSRURfT0spIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfcmVtb3ZlX3N1YnRyZWUobmV3Mik7CgkJbmV0c25tcF9zdWJ0cmVlX2ZyZWUobmV3Mik7CgkJcmV0dXJuIHJlczsKCSAgICB9CgkgICAgcmV0dXJuIG5ldHNubXBfc3VidHJlZV9sb2FkKG5ldzIsIGNvbnRleHRfbmFtZSk7Cgl9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqIEZyZWUgdGhlIGdpdmVuIHN1YnRyZWUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCiAqCiAqICBAcGFyYW0gc3ViIFN1YnRyZWUgYnJhbmNoIHRvIGJlIGNsZWFyZWQgYW5kIGZyZWVkLgogKiAgICAgICAgICAgICBBZnRlciB0aGUgY2FsbCwgdGhpcyBwb2ludGVyIGlzIGludmFsaWQKICogICAgICAgICAgICAgYW5kIHNob3VsZCBiZSBzZXQgdG8gTlVMTC4KICovCnZvaWQKY2xlYXJfc3VidHJlZSAobmV0c25tcF9zdWJ0cmVlICpzdWIpIHsKCiAgICBuZXRzbm1wX3N1YnRyZWUgKmM7CiAgICAKICAgIGlmIChzdWIgPT0gTlVMTCkKCXJldHVybjsKCiAgICBmb3IoYyA9IHN1YjsgYzspIHsKICAgICAgICBzdWIgPSBjOwogICAgICAgIGMgPSBjLT5jaGlsZHJlbjsKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShzdWIpOwogICAgfQoKfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihvaWQgKm5hbWUsIHNpemVfdCBsZW4sIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZSwKCQkJICBjb25zdCBjaGFyICpjb250ZXh0X25hbWUpCnsKICAgIGxvb2t1cF9jYWNoZSAqbG9va3VwX2NhY2hlID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHIgPSBOVUxMLCAqcHJldmlvdXMgPSBOVUxMOwogICAgaW50IGNtcCA9IDE7CiAgICBzaXplX3QgbGxfb2ZmID0gMDsKCiAgICBpZiAoc3VidHJlZSkgewogICAgICAgIG15cHRyID0gc3VidHJlZTsKICAgIH0gZWxzZSB7CgkvKiBsb29rIHRocm91Z2ggZXZlcnl0aGluZyAqLwogICAgICAgIGlmIChsb29rdXBfY2FjaGVfc2l6ZSkgewogICAgICAgICAgICBsb29rdXBfY2FjaGUgPSBsb29rdXBfY2FjaGVfZmluZChjb250ZXh0X25hbWUsIG5hbWUsIGxlbiwgJmNtcCk7CiAgICAgICAgICAgIGlmIChsb29rdXBfY2FjaGUpIHsKICAgICAgICAgICAgICAgIG15cHRyID0gbG9va3VwX2NhY2hlLT5uZXh0OwogICAgICAgICAgICAgICAgcHJldmlvdXMgPSBsb29rdXBfY2FjaGUtPnByZXZpb3VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghbXlwdHIpCiAgICAgICAgICAgICAgICBteXB0ciA9IG5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHRfbmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0X25hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogdGhpcyBvcHRpbWl6YXRpb24gY2F1c2VzIGEgc2VnZmF1bHQgb24gc2YgY2YgYWxwaGEtbGludXgxLgogICAgICogaWZkZWYgb3V0IHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgd2h5IGFuZCBmaXhlcyBpdC4geHh4LXJrcyAyMDA1MTExNwogICAgICovCiNpZm5kZWYgX19hbHBoYQojZGVmaW5lIFdURVNUX09QVElNSVpBVElPTiAxCiNlbmRpZgojaWZkZWYgV1RFU1RfT1BUSU1JWkFUSU9OCiAgICBERUJVR01TR1RMKCgid3Rlc3QiLCJvaWQgaW46ICIpKTsKICAgIERFQlVHTVNHT0lEKCgid3Rlc3QiLCBuYW1lLCBsZW4pKTsKICAgIERFQlVHTVNHKCgid3Rlc3QiLCJcbiIpKTsKI2VuZGlmCiAgICBmb3IgKDsgbXlwdHIgIT0gTlVMTDsgcHJldmlvdXMgPSBteXB0ciwgbXlwdHIgPSBteXB0ci0+bmV4dCkgewojaWZkZWYgV1RFU1RfT1BUSU1JWkFUSU9OCiAgICAgICAgLyogQ29tcGFyZSB0aGUgaW5jb21pbmcgb2lkIHdpdGggdGhlIGxpbmtlZCBsaXN0LiAgSWYgd2UgaGF2ZQogICAgICAgICAgIHJlc3VsdHMgb2YgcHJldmlvdXMgY29tcGFyZXMsIGl0cyBmYXN0ZXIgdG8gbWFrZSBzdXJlIHRoZQogICAgICAgICAgIGxlbmd0aCB3ZSBkaWZmZXJlZCBpbiB0aGUgbGFzdCBjaGVjayBpcyBncmVhdGVyIHRoYW4gdGhlCiAgICAgICAgICAgbGVuZ3RoIGJldHdlZW4gdGhpcyBwb2ludGVyIGFuZCB0aGUgbGFzdCB0aGVuIHdlIGRvbid0IG5lZWQKICAgICAgICAgICB0byBhY3R1YWxseSBwZXJmb3JtIGEgY29tcGFyaXNvbiAqLwogICAgICAgIERFQlVHTVNHVEwoKCJ3dGVzdCIsIm9pZCBjbXA6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInd0ZXN0IiwgbXlwdHItPnN0YXJ0X2EsIG15cHRyLT5zdGFydF9sZW4pKTsKICAgICAgICBERUJVR01TRygoInd0ZXN0IiwiICAtLS0gb2ZmID0gJWx1LCBpbiBvZmYgPSAlbHUgdGVzdCA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylteXB0ci0+b2lkX29mZiwgKHVuc2lnbmVkIGxvbmcpbGxfb2ZmLAogICAgICAgICAgICAgICAgICAhKGxsX29mZiAmJiBteXB0ci0+b2lkX29mZiAmJgogICAgICAgICAgICAgICAgICAgIG15cHRyLT5vaWRfb2ZmID4gbGxfb2ZmKSkpOwogICAgICAgIGlmICghKGxsX29mZiAmJiBteXB0ci0+b2lkX29mZiAmJiBteXB0ci0+b2lkX29mZiA+IGxsX29mZikgJiYKICAgICAgICAgICAgbmV0c25tcF9vaWRfY29tcGFyZV9sbChuYW1lLCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnN0YXJ0X2EsIG15cHRyLT5zdGFydF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxsX29mZikgPCAwKSB7CiNlbHNlCiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmFtZSwgbGVuLCBteXB0ci0+c3RhcnRfYSwgbXlwdHItPnN0YXJ0X2xlbikgPCAwKSB7CiNlbmRpZgogICAgICAgICAgICBpZiAobG9va3VwX2NhY2hlX3NpemUgJiYgcHJldmlvdXMgJiYgY21wKSB7CiAgICAgICAgICAgICAgICBpZiAobG9va3VwX2NhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9va3VwX2NhY2hlX3JlcGxhY2UobG9va3VwX2NhY2hlLCBteXB0ciwgcHJldmlvdXMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb29rdXBfY2FjaGVfYWRkKGNvbnRleHRfbmFtZSwgbXlwdHIsIHByZXZpb3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHByZXZpb3VzOwp9CgpuZXRzbm1wX3N1YnRyZWUgKgpuZXRzbm1wX3N1YnRyZWVfZmluZF9uZXh0KG9pZCAqbmFtZSwgc2l6ZV90IGxlbiwKCQkJICBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWUsIGNvbnN0IGNoYXIgKmNvbnRleHRfbmFtZSkKewogICAgbmV0c25tcF9zdWJ0cmVlICpteXB0ciA9IE5VTEw7CgogICAgbXlwdHIgPSBuZXRzbm1wX3N1YnRyZWVfZmluZF9wcmV2KG5hbWUsIGxlbiwgc3VidHJlZSwgY29udGV4dF9uYW1lKTsKCiAgICBpZiAobXlwdHIgIT0gTlVMTCkgewogICAgICAgIG15cHRyID0gbXlwdHItPm5leHQ7CiAgICAgICAgd2hpbGUgKG15cHRyICE9IE5VTEwgJiYgKG15cHRyLT52YXJpYWJsZXMgPT0gTlVMTCB8fCAKCQkJCSBteXB0ci0+dmFyaWFibGVzX2xlbiA9PSAwKSkgewogICAgICAgICAgICBteXB0ciA9IG15cHRyLT5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbXlwdHI7CiAgICB9IGVsc2UgaWYgKHN1YnRyZWUgIT0gTlVMTCAmJiBzbm1wX29pZF9jb21wYXJlKG5hbWUsIGxlbiwgCgkJCQkgICBzdWJ0cmVlLT5zdGFydF9hLCBzdWJ0cmVlLT5zdGFydF9sZW4pIDwgMCkgewogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQoKbmV0c25tcF9zdWJ0cmVlICoKbmV0c25tcF9zdWJ0cmVlX2ZpbmQob2lkICpuYW1lLCBzaXplX3QgbGVuLCBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWUsIAoJCSAgICAgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyOwoKICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuYW1lLCBsZW4sIHN1YnRyZWUsIGNvbnRleHRfbmFtZSk7CiAgICBpZiAobXlwdHIgJiYgbXlwdHItPmVuZF9hICYmCiAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCBsZW4sIG15cHRyLT5lbmRfYSwgbXlwdHItPmVuZF9sZW4pPDApIHsKICAgICAgICByZXR1cm4gbXlwdHI7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCi8qKiAgQH0gKi8KLyogRW5kIG9mIFN1YnRyZWVzIG1haW50YWluaW5nIGNvZGUgKi8KCi8qKiBAZGVmZ3JvdXAgYWdlbnRfbWliX3JlZ2lzdGVyaW5nIFJlZ2lzdGVyaW5nIGFuZCB1bnJlZ2lzdGVyaW5nIE1JQiBzdWJ0cmVlcy4KICogICAgIEFkZGluZyBhbmQgcmVtb3ZpbmcgTUlCIG5vZGVzIHRvIHRoZSBkYXRhYmFzZSB1bmRlciB0aGVpciBjb250ZXh0cy4KICogICBAaW5ncm91cCBhZ2VudF9yZWdpc3RyeQogKgogKiBAewogKi8KCgovKiogUmVnaXN0ZXJzIGEgTUlCIGhhbmRsZXIuCiAqCiAqICBAcGFyYW0gbW9kdWxlTmFtZQogKiAgQHBhcmFtIHZhcgogKiAgQHBhcmFtIHZhcnNpemUKICogIEBwYXJhbSBudW12YXJzCiAqICBAcGFyYW0gIG1pYmxvYwogKiAgQHBhcmFtIG1pYmxvY2xlbgogKiAgQHBhcmFtIHByaW9yaXR5CiAqICBAcGFyYW0gcmFuZ2Vfc3ViaWQKICogIEBwYXJhbSByYW5nZV91Ym91bmQKICogIEBwYXJhbSAgc3MKICogIEBwYXJhbSBjb250ZXh0CiAqICBAcGFyYW0gdGltZW91dAogKiAgQHBhcmFtIGZsYWdzCiAqICBAcGFyYW0gcmVnaW5mbyBSZWdpc3RyYXRpb24gaGFuZGxlciBzdHJ1Y3R1cmUuCiAqICAgICAgICAgICAgICAgICBJbiBhIGNhc2Ugb2YgZmFpbHVyZSwgaXQgd2lsbCBiZSBmcmVlZC4KICogIEBwYXJhbSBwZXJmb3JtX2NhbGxiYWNrCiAqCiAqICBAcmV0dXJuIGdpdmVzIE1JQl9SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqCiAqICBAc2VlIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcigpCiAqICBAc2VlIHJlZ2lzdGVyX2FnZW50eF9saXN0KCkKICogIEBzZWUgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9mcmVlKCkKICovCmludApuZXRzbm1wX3JlZ2lzdGVyX21pYihjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaWJsb2NsZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLAogICAgICAgICAgICAgICAgICAgICBvaWQgcmFuZ2VfdWJvdW5kLAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmZvcm1fY2FsbGJhY2spCnsKICAgIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZSwgKnN1YjI7CiAgICBpbnQgICAgICAgICAgICAgcmVzLCBpOwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcmVnX3Bhcm1zOwogICAgaW50IG9sZF9sb29rdXBfY2FjaGVfdmFsID0gbmV0c25tcF9nZXRfbG9va3VwX2NhY2hlX3NpemUoKTsKCiAgICBpZiAobW9kdWxlTmFtZSA9PSBOVUxMIHx8CiAgICAgICAgbWlibG9jICAgICA9PSBOVUxMKSB7CiAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiA/Pz8gKi8KICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUocmVnaW5mbyk7CiAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgfQogICAgc3VidHJlZSA9IChuZXRzbm1wX3N1YnRyZWUgKiljYWxsb2MoMSwgc2l6ZW9mKG5ldHNubXBfc3VidHJlZSkpOwogICAgaWYgKHN1YnRyZWUgPT0gTlVMTCkgewogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZnJlZShyZWdpbmZvKTsKICAgICAgICByZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJyZWdpc3RlcmluZyBcIiVzXCIgYXQgIiwgbW9kdWxlTmFtZSkpOwogICAgREVCVUdNU0dPSURSQU5HRSgoInJlZ2lzdGVyX21pYiIsIG1pYmxvYywgbWlibG9jbGVuLCByYW5nZV9zdWJpZCwKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3Vib3VuZCkpOwogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiIHdpdGggY29udGV4dCBcIiVzXCJcbiIsCiAgICAgICAgICAgICAgU05NUF9TVFJPUk5VTEwoY29udGV4dCkpKTsKCiAgICAvKgogICAgICogdmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBjb250ZXh0IGlzIGVxdWFsIHRvIHRoZSBjb250ZXh0CiAgICAgKiBpbiB0aGUgcmVnaW5mby4KICAgICAqICh3aGljaCBiZWdzIHRoZSBxdWVzdGlvbiwgd2h5IGRvIHdlIGhhdmUgYm90aD8gSXQgYXBwZWFycyB0aGF0IHRoZQogICAgICogIHJlZ2luZm8gaXRlbSBkaWRuJ3QgYXBwZWFyIHRpbCA1LjIpCiAgICAgKi8KICAgIGlmKCAoKE5VTEwgPT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSB8fAogICAgICAgICgoTlVMTCAhPSBjb250ZXh0KSAmJiAoTlVMTCA9PSByZWdpbmZvLT5jb250ZXh0TmFtZSkpIHx8CiAgICAgICAgKCAoKE5VTEwgIT0gY29udGV4dCkgJiYgKE5VTEwgIT0gcmVnaW5mby0+Y29udGV4dE5hbWUpKSAmJgogICAgICAgICAgKDAgIT0gc3RyY21wKGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKSkpICkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCJjb250ZXh0IHBhc3NlZCBkdXJpbmcgcmVnaXN0cmF0aW9uIGRvZXMgbm90ICIKICAgICAgICAgICAgICAgICAiZXF1YWwgdGhlIHJlZ2luZm8gY29udGV4dE5hbWUhICgnJXMnICE9ICclcycpXG4iLAogICAgICAgICAgICAgICAgIGNvbnRleHQsIHJlZ2luZm8tPmNvbnRleHROYW1lKTsKICAgICAgICBuZXRzbm1wX2Fzc2VydCghInJlZ2lzdGVyIGNvbnRleHQgPT0gcmVnaW5mby0+Y29udGV4dE5hbWUiKTsgLyogYWx3YXlzIGZhbHNlICovCiAgICB9CgogICAgLyogIENyZWF0ZSB0aGUgbmV3IHN1YnRyZWUgbm9kZSBiZWluZyByZWdpc3RlcmVkLiAgKi8KCiAgICBzdWJ0cmVlLT5yZWdpbmZvID0gcmVnaW5mbzsKICAgIHN1YnRyZWUtPm5hbWVfYSAgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChtaWJsb2MsIG1pYmxvY2xlbik7CiAgICBzdWJ0cmVlLT5zdGFydF9hID0gc25tcF9kdXBsaWNhdGVfb2JqaWQobWlibG9jLCBtaWJsb2NsZW4pOwogICAgc3VidHJlZS0+ZW5kX2EgICA9IHNubXBfZHVwbGljYXRlX29iamlkKG1pYmxvYywgbWlibG9jbGVuKTsKICAgIHN1YnRyZWUtPmxhYmVsX2EgPSBzdHJkdXAobW9kdWxlTmFtZSk7CiAgICBpZiAoc3VidHJlZS0+bmFtZV9hID09IE5VTEwgfHwgc3VidHJlZS0+c3RhcnRfYSA9PSBOVUxMIHx8IAoJc3VidHJlZS0+ZW5kX2EgID09IE5VTEwgfHwgc3VidHJlZS0+bGFiZWxfYSA9PSBOVUxMKSB7CgluZXRzbm1wX3N1YnRyZWVfZnJlZShzdWJ0cmVlKTsgLyogYWxzbyBmcmVlcyByZWdpbmZvICovCglyZXR1cm4gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQ7CiAgICB9CiAgICBzdWJ0cmVlLT5uYW1lbGVuICAgPSAodV9jaGFyKW1pYmxvY2xlbjsKICAgIHN1YnRyZWUtPnN0YXJ0X2xlbiA9ICh1X2NoYXIpbWlibG9jbGVuOwogICAgc3VidHJlZS0+ZW5kX2xlbiAgID0gKHVfY2hhciltaWJsb2NsZW47CiAgICBzdWJ0cmVlLT5lbmRfYVttaWJsb2NsZW4gLSAxXSsrOwoKICAgIGlmICh2YXIgIT0gTlVMTCkgewoJc3VidHJlZS0+dmFyaWFibGVzID0gKHN0cnVjdCB2YXJpYWJsZSAqKW1hbGxvYyh2YXJzaXplKm51bXZhcnMpOwoJaWYgKHN1YnRyZWUtPnZhcmlhYmxlcyA9PSBOVUxMKSB7CgkgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3VidHJlZSk7IC8qIGFsc28gZnJlZXMgcmVnaW5mbyAqLwoJICAgIHJldHVybiBNSUJfUkVHSVNUUkFUSU9OX0ZBSUxFRDsKCX0KCW1lbWNweShzdWJ0cmVlLT52YXJpYWJsZXMsIHZhciwgbnVtdmFycyp2YXJzaXplKTsKCXN1YnRyZWUtPnZhcmlhYmxlc19sZW4gPSBudW12YXJzOwoJc3VidHJlZS0+dmFyaWFibGVzX3dpZHRoID0gdmFyc2l6ZTsKICAgIH0KICAgIHN1YnRyZWUtPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBzdWJ0cmVlLT50aW1lb3V0ID0gdGltZW91dDsKICAgIHN1YnRyZWUtPnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICBzdWJ0cmVlLT5yYW5nZV91Ym91bmQgPSByYW5nZV91Ym91bmQ7CiAgICBzdWJ0cmVlLT5zZXNzaW9uID0gc3M7CiAgICBzdWJ0cmVlLT5mbGFncyA9ICh1X2NoYXIpZmxhZ3M7ICAgIC8qICB1c2VkIHRvIGlkZW50aWZ5IGluc3RhbmNlIG9pZHMgICovCiAgICBzdWJ0cmVlLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgc3VidHJlZS0+Z2xvYmFsX2NhY2hlaWQgPSByZWdpbmZvLT5nbG9iYWxfY2FjaGVpZDsKCiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZSgwKTsKICAgIHJlcyA9IG5ldHNubXBfc3VidHJlZV9sb2FkKHN1YnRyZWUsIGNvbnRleHQpOwoKICAgIC8qICBJZiByZWdpc3RlcmluZyBhIHJhbmdlLCB1c2UgdGhlIGZpcnN0IHN1YnRyZWUgYXMgYSB0ZW1wbGF0ZSBmb3IgdGhlCglyZXN0IG9mIHRoZSByYW5nZS4gICovCgogICAgaWYgKHJlcyA9PSBNSUJfUkVHSVNURVJFRF9PSyAmJiByYW5nZV9zdWJpZCAhPSAwKSB7Cglmb3IgKGkgPSBtaWJsb2NbcmFuZ2Vfc3ViaWQgLSAxXSArIDE7IGkgPD0gKGludClyYW5nZV91Ym91bmQ7IGkrKykgewoJICAgIHN1YjIgPSBuZXRzbm1wX3N1YnRyZWVfZGVlcGNvcHkoc3VidHJlZSk7CgoJICAgIGlmIChzdWIyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X2xvb2t1cF9jYWNoZV9zaXplKG9sZF9sb29rdXBfY2FjaGVfdmFsKTsKICAgICAgICAgICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1JQl9SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWIyLT5uYW1lX2FbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwogICAgICAgICAgICBzdWIyLT5zdGFydF9hW3JhbmdlX3N1YmlkIC0gMV0gPSBpOwogICAgICAgICAgICBzdWIyLT5lbmRfYVtyYW5nZV9zdWJpZCAtIDFdICAgPSBpOyAgICAgLyogWFhYIC0gPz8/PyAqLwogICAgICAgICAgICBpZiAocmFuZ2Vfc3ViaWQgPT0gKGludCltaWJsb2NsZW4pIHsKICAgICAgICAgICAgICAgICsrc3ViMi0+ZW5kX2FbcmFuZ2Vfc3ViaWQgLSAxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWIyLT5mbGFncyB8PSBTVUJUUkVFX0FUVEFDSEVEOwogICAgICAgICAgICBzdWIyLT5nbG9iYWxfY2FjaGVpZCA9IHJlZ2luZm8tPmdsb2JhbF9jYWNoZWlkOwogICAgICAgICAgICAvKiBGUlEgVGhpcyBpcyBlc3NlbnRpYWwgZm9yIHJlcXVlc3RzIHRvIHN1Y2NlZWQhICovCiAgICAgICAgICAgIHN1YjItPnJlZ2luZm8tPnJvb3RvaWRbcmFuZ2Vfc3ViaWQgLSAxXSAgPSBpOwoKICAgICAgICAgICAgcmVzID0gbmV0c25tcF9zdWJ0cmVlX2xvYWQoc3ViMiwgY29udGV4dCk7CiAgICAgICAgICAgIGlmIChyZXMgIT0gTUlCX1JFR0lTVEVSRURfT0spIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobWlibG9jLCBtaWJsb2NsZW4sIHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIG5ldHNubXBfcmVtb3ZlX3N1YnRyZWUoc3ViMik7CgkJbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3ViMik7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX2xvb2t1cF9jYWNoZShjb250ZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHJlcyA9PSBNSUJfRFVQTElDQVRFX1JFR0lTVFJBVElPTiB8fAogICAgICAgICAgICAgICByZXMgPT0gTUlCX1JFR0lTVFJBVElPTl9GQUlMRUQpIHsKICAgICAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZShvbGRfbG9va3VwX2NhY2hlX3ZhbCk7CiAgICAgICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUoc3VidHJlZSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICAvKgogICAgICogbWFyayB0aGUgTUlCIGFzIGRldGFjaGVkLCBpZiB0aGVyZSdzIG5vIG1hc3RlciBhZ2VudCBwcmVzZW50IGFzIG9mIG5vdyAKICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUpICE9IE1BU1RFUl9BR0VOVCkgewogICAgICAgIGV4dGVybiBzdHJ1Y3Qgc25tcF9zZXNzaW9uICptYWluX3Nlc3Npb247CiAgICAgICAgaWYgKG1haW5fc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJlZ2lzdGVyX21pYl9kZXRhY2hfbm9kZShzdWJ0cmVlKTsKCX0KICAgIH0KCiAgICBpZiAocmVzID09IE1JQl9SRUdJU1RFUkVEX09LICYmIHBlcmZvcm1fY2FsbGJhY2spIHsKICAgICAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CiAgICAgICAgcmVnX3Bhcm1zLm5hbWUgPSBtaWJsb2M7CiAgICAgICAgcmVnX3Bhcm1zLm5hbWVsZW4gPSBtaWJsb2NsZW47CiAgICAgICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gcmFuZ2Vfc3ViaWQ7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHJhbmdlX3Vib3VuZDsKICAgICAgICByZWdfcGFybXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgcmVnX3Bhcm1zLmZsYWdzID0gKHVfY2hhcikgZmxhZ3M7CiAgICAgICAgcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gY29udGV4dDsKICAgICAgICByZWdfcGFybXMuc2Vzc2lvbiA9IHNzOwogICAgICAgIHJlZ19wYXJtcy5yZWdpbmZvID0gcmVnaW5mbzsKICAgICAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX1JFR0lTVEVSX09JRCwgJnJlZ19wYXJtcyk7CiAgICB9CgogICAgbmV0c25tcF9zZXRfbG9va3VwX2NhY2hlX3NpemUob2xkX2xvb2t1cF9jYWNoZV92YWwpOwogICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICByZXR1cm4gcmVzOwp9CgovKiogQHByaXZhdGUKICogIFJlYXR0YWNoIGEgcGFydGljdWxhciBub2RlLiAgCiAqLwpzdGF0aWMgdm9pZApyZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZShuZXRzbm1wX3N1YnRyZWUgKnMpCnsKICAgIGlmICgocyAhPSBOVUxMKSAmJiAocy0+bmFtZWxlbiA+IDEpICYmICEocy0+ZmxhZ3MgJiBTVUJUUkVFX0FUVEFDSEVEKSkgewogICAgICAgIHN0cnVjdCByZWdpc3Rlcl9wYXJhbWV0ZXJzIHJlZ19wYXJtczsKICAgICAgICAvKgogICAgICAgICAqIG9ubHkgZG8gcmVnaXN0cmF0aW9ucyB0aGF0IGFyZSBub3QgdGhlIHRvcCBsZXZlbCBub2RlcyAKICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoJnJlZ19wYXJtcywgMHgwLCBzaXplb2YocmVnX3Bhcm1zKSk7CgogICAgICAgIC8qCiAgICAgICAgICogWFhYOiBkbyB0aGlzIGJldHRlciAKICAgICAgICAgKi8KICAgICAgICByZWdfcGFybXMubmFtZSA9IHMtPm5hbWVfYTsKICAgICAgICByZWdfcGFybXMubmFtZWxlbiA9IHMtPm5hbWVsZW47CiAgICAgICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcy0+cHJpb3JpdHk7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3N1YmlkID0gcy0+cmFuZ2Vfc3ViaWQ7CiAgICAgICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHMtPnJhbmdlX3Vib3VuZDsKICAgICAgICByZWdfcGFybXMudGltZW91dCA9IHMtPnRpbWVvdXQ7CiAgICAgICAgcmVnX3Bhcm1zLmZsYWdzID0gcy0+ZmxhZ3M7CiAgICAgICAgcmVnX3Bhcm1zLnNlc3Npb24gPSBzLT5zZXNzaW9uOwogICAgICAgIHJlZ19wYXJtcy5yZWdpbmZvID0gcy0+cmVnaW5mbzsKICAgICAgICAvKiBYWFg6IG1pc3NpbmcgaW4gc3VidHJlZTogcmVnX3Bhcm1zLmNvbnRleHROYW1lID0gcy0+Y29udGV4dDsgKi8KICAgICAgICBpZiAoKE5VTEwgIT0gcy0+cmVnaW5mbykgJiYgKE5VTEwgIT0gcy0+cmVnaW5mby0+Y29udGV4dE5hbWUpKQogICAgICAgICAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBzLT5yZWdpbmZvLT5jb250ZXh0TmFtZTsKICAgICAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19SRUdJU1RFUl9PSUQsICZyZWdfcGFybXMpOwogICAgICAgIHMtPmZsYWdzIHw9IFNVQlRSRUVfQVRUQUNIRUQ7CiAgICB9Cn0KCi8qKiBDYWxsIGNhbGxiYWNrcyB0byByZWF0dGFjaCBhbGwgb3VyIG5vZGVzLiAgCiAqLwp2b2lkCnJlZ2lzdGVyX21pYl9yZWF0dGFjaCh2b2lkKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnMsICp0OwogICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CgogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGZvciAocyA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewogICAgICAgICAgICByZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZShzKTsKICAgICAgICAgICAgZm9yICh0ID0gcy0+Y2hpbGRyZW47IHQgIT0gTlVMTDsgdCA9IHQtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICByZWdpc3Rlcl9taWJfcmVhdHRhY2hfbm9kZSh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyoqIEBwcml2YXRlCiAqICBNYXJrIGEgbm9kZSBhcyBkZXRhY2hlZC4KICoKICogIEBwYXJhbSBzIFRoZSBub3RlIHRvIGJlIG1hcmtlZAogKi8Kc3RhdGljIHZvaWQKcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKG5ldHNubXBfc3VidHJlZSAqcykKewogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIHMtPmZsYWdzID0gcy0+ZmxhZ3MgJiB+U1VCVFJFRV9BVFRBQ0hFRDsKICAgIH0KfQoKLyoqIE1hcmsgYWxsIG91ciByZWdpc3RlcmVkIE9JRHMgYXMgZGV0YWNoZWQuCiAqICBUaGlzIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCBmb3Igc3ViYWdlbnQgcHJvdG9jb2xzLCB3aGVuCiAqICBhIGNvbm5lY3Rpb24gaXMgbG9zdCBvciB0aGUgc3ViYWdlbnQgaXMgYmVpbmcgc2h1dCBkb3duLiAgCiAqLwp2b2lkCnJlZ2lzdGVyX21pYl9kZXRhY2godm9pZCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpzLCAqdDsKICAgIHN1YnRyZWVfY29udGV4dF9jYWNoZSAqcHRyOwogICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGZvciAocyA9IHB0ci0+Zmlyc3Rfc3VidHJlZTsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewogICAgICAgICAgICByZWdpc3Rlcl9taWJfZGV0YWNoX25vZGUocyk7CiAgICAgICAgICAgIGZvciAodCA9IHMtPmNoaWxkcmVuOyB0ICE9IE5VTEw7IHQgPSB0LT5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgcmVnaXN0ZXJfbWliX2RldGFjaF9ub2RlKHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKiogUmVnaXN0ZXIgYSBuZXcgbW9kdWxlIGludG8gdGhlIE1JQiBkYXRhYmFzZSwgd2l0aCBhbGwgcG9zc2libGUgY3VzdG9tIG9wdGlvbnMKICoKICogIEBwYXJhbSAgbW9kdWxlTmFtZSBUZXh0IG5hbWUgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gbmFtZSB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZQogKiAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgYWdlbnQuCiAqCiAqICBAcGFyYW0gIHZhciAgICAgICAgQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG1vZHVsZS4KICoKICogIEBwYXJhbSAgdmFyc2l6ZSAgICBTaXplIG9mIGEgc2luZ2xlIHZhcmlhYmxlIGluIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBpcyBub3JtYWxseSBlcXVhbCB0byBzaXplb2Yoc3RydWN0IHZhcmlhYmxlKSwKICogICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2lzaCB0byB1c2Ugc2hvcnRlciAob3IgbG9uZ2VyKSBPSURzLCB0aGVuIHdlCiAqICAgICAgICAgICAgICAgICAgICAgY291bGQgdXNlIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUuCiAqCiAqICBAcGFyYW0gIG51bXZhcnMgICAgTnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgaG93IG1hbnkgdmFyaWFibGVzIHRoZSBmdW5jdGlvbiB3aWxsIHRyeSB0byByZWdpc3Rlci4KICoKICogIEBwYXJhbSAgbWlibG9jICAgICBCYXNlIE9JRCBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIEFsbCBPSURzIGluIHZhciBhcnJheSBzaG91bGQgYmUgc3ViLW9pZHMgb2YgdGhlIGJhc2UgT0lELgogKgogKiAgQHBhcmFtICBtaWJsb2NsZW4gIExlbmd0aCBvZiB0aGUgYmFzZSBPSUQuCiAqICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVnZXJzIG1ha2luZyB1cCB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIHByaW9yaXR5ICAgUmVnaXN0cmF0aW9uIHByaW9yaXR5LgogKiAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudAogKiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvciBvdmVybGFwcGluZyByZWdpb25zLgogKiAgICAgICAgICAgICAgICAgICAgIFByaW1hcmlseSB1c2VkIHdpdGggQWdlbnRYIHN1YmFnZW50IHJlZ2lzdHJhdGlvbnMuCiAqCiAqICBAcGFyYW0gcmFuZ2Vfc3ViaWQgSWYgbm9uLXplcm8sIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgcmFuZ2UKICogICAgICAgICAgICAgICAgICAgICBvZiBPSURzLCB3aXRoIHRoaXMgcGFyYW1ldGVyIGlkZW50aWZ5aW5nIHRoZSByZWxldmFudAogKiAgICAgICAgICAgICAgICAgICAgIHN1YmlkZW50aWZpZXIgLSBzZWUgUkZDIDI3NDEgZm9yIGRldGFpbHMuCiAqICAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHVzZWQgdG8gcmVnaXN0ZXIgYSBzaW5nbGUgcm93IG9mIGEgdGFibGUuCiAqICAgICAgICAgICAgICAgICAgICAgSWYgemVybywgdGhlbiByZWdpc3RlciB0aGUgbW9kdWxlIGFnYWluc3QgdGhlIGZ1bGwgT0lEIHN1YnRyZWUuCiAqCiAqICBAcGFyYW0gcmFuZ2VfdWJvdW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlIGJlaW5nIHJlZ2lzdGVyZWQgKHNlZSBSRkMgMjc0MSkKICogICAgICAgICAgICAgICAgICAgICBJZiByYW5nZV9zdWJpZCBpcyB6ZXJvLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAqCiAqICBAcGFyYW0gc3MgCiAqICBAcGFyYW0gY29udGV4dCAKICogIEBwYXJhbSB0aW1lb3V0IAogKiAgQHBhcmFtIGZsYWdzIAogKgogKiAgQHJldHVybiBnaXZlcyBTTk1QRVJSX1NVQ0NFU1Mgb3IgU05NUEVSUl8qIGVycm9yIGNvZGUuCiAqCiAqICBAc2VlIHJlZ2lzdGVyX21pYigpCiAqICBAc2VlIHJlZ2lzdGVyX21pYl9wcmlvcml0eSgpCiAqICBAc2VlIHJlZ2lzdGVyX21pYl9yYW5nZSgpCiAqICBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICovCmludApyZWdpc3Rlcl9taWJfY29udGV4dChjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcnNpemUsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaWJsb2NsZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLAogICAgICAgICAgICAgICAgICAgICBvaWQgcmFuZ2VfdWJvdW5kLAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCwgaW50IHRpbWVvdXQsIGludCBmbGFncykKewogICAgcmV0dXJuIG5ldHNubXBfcmVnaXN0ZXJfb2xkX2FwaShtb2R1bGVOYW1lLCB2YXIsIHZhcnNpemUsIG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pYmxvYywgbWlibG9jbGVuLCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfc3ViaWQsIHJhbmdlX3Vib3VuZCwgc3MsIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIGZsYWdzKTsKfQoKLyoqIFJlZ2lzdGVyIGEgbmV3IG1vZHVsZSBpbnRvIHRoZSBNSUIgZGF0YWJhc2UsIGFzIGJlaW5nIHJlc3BvbnNpYmxlCiAqICAgZm9yIGEgcmFuZ2Ugb2YgT0lEcyAodHlwaWNhbGx5IGEgc2luZ2xlIHJvdyBvZiBhIHRhYmxlKS4KICoKICogIEBwYXJhbSAgbW9kdWxlTmFtZSBUZXh0IG5hbWUgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gbmFtZSB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZQogKiAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgYWdlbnQuCiAqCiAqICBAcGFyYW0gIHZhciAgICAgICAgQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG1vZHVsZS4KICoKICogIEBwYXJhbSAgdmFyc2l6ZSAgICBTaXplIG9mIGEgc2luZ2xlIHZhcmlhYmxlIGluIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBpcyBub3JtYWxseSBlcXVhbCB0byBzaXplb2Yoc3RydWN0IHZhcmlhYmxlKSwKICogICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2lzaCB0byB1c2Ugc2hvcnRlciAob3IgbG9uZ2VyKSBPSURzLCB0aGVuIHdlCiAqICAgICAgICAgICAgICAgICAgICAgY291bGQgdXNlIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUuCiAqCiAqICBAcGFyYW0gIG51bXZhcnMgICAgTnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgaG93IG1hbnkgdmFyaWFibGVzIHRoZSBmdW5jdGlvbiB3aWxsIHRyeSB0byByZWdpc3Rlci4KICoKICogIEBwYXJhbSAgbWlibG9jICAgICBCYXNlIE9JRCBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIEFsbCBPSURzIGluIHZhciBhcnJheSBzaG91bGQgYmUgc3ViLW9pZHMgb2YgdGhlIGJhc2UgT0lELgogKgogKiAgQHBhcmFtICBtaWJsb2NsZW4gIExlbmd0aCBvZiB0aGUgYmFzZSBPSUQuCiAqICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVnZXJzIG1ha2luZyB1cCB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIHByaW9yaXR5ICAgUmVnaXN0cmF0aW9uIHByaW9yaXR5LgogKiAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudAogKiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvciBvdmVybGFwcGluZyByZWdpb25zLgogKiAgICAgICAgICAgICAgICAgICAgIFByaW1hcmlseSB1c2VkIHdpdGggQWdlbnRYIHN1YmFnZW50IHJlZ2lzdHJhdGlvbnMuCiAqCiAqICBAcGFyYW0gcmFuZ2Vfc3ViaWQgSWYgbm9uLXplcm8sIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgcmFuZ2UKICogICAgICAgICAgICAgICAgICAgICBvZiBPSURzLCB3aXRoIHRoaXMgcGFyYW1ldGVyIGlkZW50aWZ5aW5nIHRoZSByZWxldmFudAogKiAgICAgICAgICAgICAgICAgICAgIHN1YmlkZW50aWZpZXIgLSBzZWUgUkZDIDI3NDEgZm9yIGRldGFpbHMuCiAqICAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHVzZWQgdG8gcmVnaXN0ZXIgYSBzaW5nbGUgcm93IG9mIGEgdGFibGUuCiAqICAgICAgICAgICAgICAgICAgICAgSWYgemVybywgdGhlbiByZWdpc3RlciB0aGUgbW9kdWxlIGFnYWluc3QgdGhlIGZ1bGwgT0lEIHN1YnRyZWUuCiAqCiAqICBAcGFyYW0gcmFuZ2VfdWJvdW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlIGJlaW5nIHJlZ2lzdGVyZWQgKHNlZSBSRkMgMjc0MSkKICogICAgICAgICAgICAgICAgICAgICBJZiByYW5nZV9zdWJpZCBpcyB6ZXJvLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAqCiAqICBAcGFyYW0gc3MgCiAqCiAqICBAcmV0dXJuIGdpdmVzIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSXyogZXJyb3IgY29kZS4KICoKICogIEBzZWUgcmVnaXN0ZXJfbWliKCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX3ByaW9yaXR5KCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX2NvbnRleHQoKQogKiAgQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqLwppbnQKcmVnaXN0ZXJfbWliX3JhbmdlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJzaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgbWlibG9jbGVuLAogICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLCBvaWQgcmFuZ2VfdWJvdW5kLCBuZXRzbm1wX3Nlc3Npb24gKiBzcykKewogICAgcmV0dXJuIHJlZ2lzdGVyX21pYl9jb250ZXh0KG1vZHVsZU5hbWUsIHZhciwgdmFyc2l6ZSwgbnVtdmFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWJsb2MsIG1pYmxvY2xlbiwgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfc3ViaWQsIHJhbmdlX3Vib3VuZCwgc3MsICIiLCAtMSwgMCk7Cn0KCi8qKiBSZWdpc3RlciBhIG5ldyBtb2R1bGUgaW50byB0aGUgTUlCIGRhdGFiYXNlLCB3aXRoIGEgbm9uLWRlZmF1bHQgcHJpb3JpdHkKICoKICogIEBwYXJhbSAgbW9kdWxlTmFtZSBUZXh0IG5hbWUgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgZ2l2ZW4gbmFtZSB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZQogKiAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgYWdlbnQuCiAqCiAqICBAcGFyYW0gIHZhciAgICAgICAgQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIG1vZHVsZS4KICoKICogIEBwYXJhbSAgdmFyc2l6ZSAgICBTaXplIG9mIGEgc2luZ2xlIHZhcmlhYmxlIGluIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBpcyBub3JtYWxseSBlcXVhbCB0byBzaXplb2Yoc3RydWN0IHZhcmlhYmxlKSwKICogICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2lzaCB0byB1c2Ugc2hvcnRlciAob3IgbG9uZ2VyKSBPSURzLCB0aGVuIHdlCiAqICAgICAgICAgICAgICAgICAgICAgY291bGQgdXNlIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUuCiAqCiAqICBAcGFyYW0gIG51bXZhcnMgICAgTnVtYmVyIG9mIHZhcmlhYmxlcyBpbiB0aGUgdmFyIGFycmF5LgogKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgaG93IG1hbnkgdmFyaWFibGVzIHRoZSBmdW5jdGlvbiB3aWxsIHRyeSB0byByZWdpc3Rlci4KICoKICogIEBwYXJhbSAgbWlibG9jICAgICBCYXNlIE9JRCBvZiB0aGUgbW9kdWxlLgogKiAgICAgICAgICAgICAgICAgICAgIEFsbCBPSURzIGluIHZhciBhcnJheSBzaG91bGQgYmUgc3ViLW9pZHMgb2YgdGhlIGJhc2UgT0lELgogKgogKiAgQHBhcmFtICBtaWJsb2NsZW4gIExlbmd0aCBvZiB0aGUgYmFzZSBPSUQuCiAqICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVnZXJzIG1ha2luZyB1cCB0aGUgYmFzZSBPSUQuCiAqCiAqICBAcGFyYW0gIHByaW9yaXR5ICAgUmVnaXN0cmF0aW9uIHByaW9yaXR5LgogKiAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudAogKiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvciBvdmVybGFwcGluZyByZWdpb25zLgogKiAgICAgICAgICAgICAgICAgICAgIFByaW1hcmlseSB1c2VkIHdpdGggQWdlbnRYIHN1YmFnZW50IHJlZ2lzdHJhdGlvbnMuCiAqCiAqICBAcmV0dXJuIGdpdmVzIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSXyogZXJyb3IgY29kZS4KICoKICogIEBzZWUgcmVnaXN0ZXJfbWliKCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX3JhbmdlKCkKICogIEBzZWUgcmVnaXN0ZXJfbWliX2NvbnRleHQoKQogKiAgQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqLwppbnQKcmVnaXN0ZXJfbWliX3ByaW9yaXR5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFibGUgKnZhciwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJzaXplLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBtaWJsb2MsIHNpemVfdCBtaWJsb2NsZW4sIGludCBwcmlvcml0eSkKewogICAgcmV0dXJuIHJlZ2lzdGVyX21pYl9yYW5nZShtb2R1bGVOYW1lLCB2YXIsIHZhcnNpemUsIG51bXZhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pYmxvYywgbWlibG9jbGVuLCBwcmlvcml0eSwgMCwgMCwgTlVMTCk7Cn0KCi8qKiBSZWdpc3RlciBhIG5ldyBtb2R1bGUgaW50byB0aGUgTUlCIGRhdGFiYXNlLCB1c2luZyBkZWZhdWx0IHByaW9yaXR5IGFuZCBjb250ZXh0CiAqCiAqICBAcGFyYW0gIG1vZHVsZU5hbWUgVGV4dCBuYW1lIG9mIHRoZSBtb2R1bGUuCiAqICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2R1bGUKICogICAgICAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIGFnZW50LgogKgogKiAgQHBhcmFtICB2YXIgICAgICAgIEFycmF5IG9mIHZhcmlhYmxlcyB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBtb2R1bGUuCiAqCiAqICBAcGFyYW0gIHZhcnNpemUgICAgU2l6ZSBvZiBhIHNpbmdsZSB2YXJpYWJsZSBpbiB2YXIgYXJyYXkuCiAqICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgaXMgbm9ybWFsbHkgZXF1YWwgdG8gc2l6ZW9mKHN0cnVjdCB2YXJpYWJsZSksCiAqICAgICAgICAgICAgICAgICAgICAgYnV0IGlmIHdlIHdpc2ggdG8gdXNlIHNob3J0ZXIgKG9yIGxvbmdlcikgT0lEcywgdGhlbiB3ZQogKiAgICAgICAgICAgICAgICAgICAgIGNvdWxkIHVzZSBkaWZmZXJlbnQgdmFyaWFudCBvZiB0aGUgdmFyaWFibGUgc3RydWN0dXJlLgogKgogKiAgQHBhcmFtICBudW12YXJzICAgIE51bWJlciBvZiB2YXJpYWJsZXMgaW4gdGhlIHZhciBhcnJheS4KICogICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGhvdyBtYW55IHZhcmlhYmxlcyB0aGUgZnVuY3Rpb24gd2lsbCB0cnkgdG8gcmVnaXN0ZXIuCiAqCiAqICBAcGFyYW0gIG1pYmxvYyAgICAgQmFzZSBPSUQgb2YgdGhlIG1vZHVsZS4KICogICAgICAgICAgICAgICAgICAgICBBbGwgT0lEcyBpbiB2YXIgYXJyYXkgc2hvdWxkIGJlIHN1Yi1vaWRzIG9mIHRoZSBiYXNlIE9JRC4KICoKICogIEBwYXJhbSAgbWlibG9jbGVuICBMZW5ndGggb2YgdGhlIGJhc2UgT0lELgogKiAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpbnRlZ2VycyBtYWtpbmcgdXAgdGhlIGJhc2UgT0lELgogKgogKiAgQHJldHVybiBnaXZlcyBTTk1QRVJSX1NVQ0NFU1Mgb3IgU05NUEVSUl8qIGVycm9yIGNvZGUuCiAqCiAqICBAc2VlIHJlZ2lzdGVyX21pYl9wcmlvcml0eSgpCiAqICBAc2VlIHJlZ2lzdGVyX21pYl9yYW5nZSgpCiAqICBAc2VlIHJlZ2lzdGVyX21pYl9jb250ZXh0KCkKICogIEBzZWUgdW5yZWdpc3Rlcl9taWIoKQogKi8KaW50CnJlZ2lzdGVyX21pYihjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgc3RydWN0IHZhcmlhYmxlICp2YXIsCiAgICAgICAgICAgICBzaXplX3QgdmFyc2l6ZSwKICAgICAgICAgICAgIHNpemVfdCBudW12YXJzLCBvaWQgKiBtaWJsb2MsIHNpemVfdCBtaWJsb2NsZW4pCnsKICAgIHJldHVybiByZWdpc3Rlcl9taWJfcHJpb3JpdHkobW9kdWxlTmFtZSwgdmFyLCB2YXJzaXplLCBudW12YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWJsb2MsIG1pYmxvY2xlbiwgREVGQVVMVF9NSUJfUFJJT1JJVFkpOwp9CgovKiogQHByaXZhdGUKICogIFVubG9hZHMgYSBzdWJ0cmVlIGZyb20gTUlCIHRyZWUuCiAqCiAqICBAcGFyYW0gIHN1YiAgICAgVGhlIHN1Yi10cmVlIHdoaWNoIGlzIGJlaW5nIHJlbW92ZWQuCiAqCiAqICBAcGFyYW0gIHByZXYgICAgUHJldmlvdXMgZW50cnksIGJlZm9yZSB0aGUgdW5sb2FkZWQgb25lLgogKgogKiAgQHBhcmFtICBjb250ZXh0IE5hbWUgb2YgdGhlIGNvbnRleHQgd2hpY2ggaXMgYmVpbmcgcmVtb3ZlZC4KICoKICogIEBzZWUgdW5yZWdpc3Rlcl9taWJfY29udGV4dCgpCiAqLwp2b2lkCm5ldHNubXBfc3VidHJlZV91bmxvYWQobmV0c25tcF9zdWJ0cmVlICpzdWIsIG5ldHNubXBfc3VidHJlZSAqcHJldiwgY29uc3QgY2hhciAqY29udGV4dCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpwdHI7CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bmxvYWQoIikpOwogICAgaWYgKHN1YiAhPSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dPSUQoKCJyZWdpc3Rlcl9taWIiLCBzdWItPnN0YXJ0X2EsIHN1Yi0+c3RhcnRfbGVuKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIltOSUxdIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIiwgIikpOwogICAgaWYgKHByZXYgIT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHT0lEKCgicmVnaXN0ZXJfbWliIiwgcHJldi0+c3RhcnRfYSwgcHJldi0+c3RhcnRfbGVuKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIltOSUxdIikpOwogICAgfQogICAgREVCVUdNU0coKCJyZWdpc3Rlcl9taWIiLCAiKVxuIikpOwoKICAgIGlmIChwcmV2ICE9IE5VTEwpIHsgICAgICAgICAvKiBub24tbGVhZGluZyBlbnRyaWVzIGFyZSBlYXN5ICovCiAgICAgICAgcHJldi0+Y2hpbGRyZW4gPSBzdWItPmNoaWxkcmVuOwogICAgICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8qCiAgICAgKiBvdGhlcndpc2UsIHdlIG5lZWQgdG8gYW1lbmQgb3VyIG5laWdoYm91cnMgYXMgd2VsbCAKICAgICAqLwoKICAgIGlmIChzdWItPmNoaWxkcmVuID09IE5VTEwpIHsgICAgICAgIC8qIGp1c3QgcmVtb3ZlIHRoaXMgbm9kZSBjb21wbGV0ZWx5ICovCiAgICAgICAgZm9yIChwdHIgPSBzdWItPnByZXY7IHB0cjsgcHRyID0gcHRyLT5jaGlsZHJlbikgewogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQocHRyLCBzdWItPm5leHQpOwogICAgICAgIH0KICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+bmV4dDsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9jaGFuZ2VfcHJldihwdHIsIHN1Yi0+cHJldik7CiAgICAgICAgfQoKCWlmIChzdWItPnByZXYgPT0gTlVMTCkgewoJICAgIG5ldHNubXBfc3VidHJlZV9yZXBsYWNlX2ZpcnN0KHN1Yi0+bmV4dCwgY29udGV4dCk7Cgl9CgogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+cHJldjsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKQogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX25leHQocHRyLCBzdWItPmNoaWxkcmVuKTsKICAgICAgICBmb3IgKHB0ciA9IHN1Yi0+bmV4dDsgcHRyOyBwdHIgPSBwdHItPmNoaWxkcmVuKQogICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfY2hhbmdlX3ByZXYocHRyLCBzdWItPmNoaWxkcmVuKTsKCglpZiAoc3ViLT5wcmV2ID09IE5VTEwpIHsKCSAgICBuZXRzbm1wX3N1YnRyZWVfcmVwbGFjZV9maXJzdChzdWItPmNoaWxkcmVuLCBjb250ZXh0KTsKCX0KICAgIH0KICAgIGludmFsaWRhdGVfbG9va3VwX2NhY2hlKGNvbnRleHQpOwp9CgovKioKICogVW5yZWdpc3RlcnMgYSBtb2R1bGUgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgZ2l2ZW4gT0lEIChvciByYW5nZSkgaW4gYSBzcGVjaWZpZWQgY29udGV4dC4gCiAqIFR5cGljYWxseSB1c2VkIHdoZW4gYSBtb2R1bGUgaGFzIG11bHRpcGxlIGNvbnRleHRzIGRlZmluZWQuCiAqIFRoZSBwYXJhbWV0ZXJzIHByaW9yaXR5LCByYW5nZV9zdWJpZCwgcmFuZ2VfdWJvdW5kIGFuZCBjb250ZXh0CiAqIHNob3VsZCBtYXRjaCB0aG9zZSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBtb2R1bGUgb3JpZ2luYWxseS4KICoKICogQHBhcmFtIG5hbWUgIHRoZSBzcGVjaWZpYyBPSUQgdG8gdW5yZWdpc3RlciBpZiBpdCBjb25hdGlucyB0aGUgYXNzb2NpYXRlZAogKiAgICAgICAgICAgICAgY29udGV4dC4KICoKICogQHBhcmFtIGxlbiAgIHRoZSBsZW5ndGggb2YgdGhlIE9JRCwgdXNlICBPSURfTEVOR1RIIG1hY3JvLgogKgogKiBAcGFyYW0gcHJpb3JpdHkgIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAyNTUsIHVzZWQgdG8gYWNoaWV2ZSBhIGRlc2lyZWQKICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHdoZW4gZGlmZmVyZW50IHNlc3Npb25zIHJlZ2lzdGVyIGlkZW50aWNhbCBvcgogKiAgICAgICAgICAgICAgICAgIG92ZXJsYXBwaW5nIHJlZ2lvbnMuICBTdWJhZ2VudHMgd2l0aCBubyBwYXJ0aWN1bGFyCiAqICAgICAgICAgICAgICAgICAga25vd2xlZGdlIG9mIHByaW9yaXR5IHNob3VsZCByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0CiAqICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgMTI3LgogKgogKiBAcGFyYW0gcmFuZ2Vfc3ViaWQgIHBlcm1pdHMgc3BlY2lmeWluZyBhIHJhbmdlIGluIHBsYWNlIG9mIG9uZSBvZiBhIHN1YnRyZWUKICogICAgICAgICAgICAgICAgICAgICBzdWItaWRlbnRpZmllcnMuICBXaGVuIHRoaXMgdmFsdWUgaXMgemVybywgbm8gcmFuZ2UgaXMKICogICAgICAgICAgICAgICAgICAgICBiZWluZyBzcGVjaWZpZWQuCiAqCiAqIEBwYXJhbSByYW5nZV91Ym91bmQgIHRoZSB1cHBlciBib3VuZCBvZiBhIHN1Yi1pZGVudGlmaWVyJ3MgcmFuZ2UuCiAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcHJlc2VudCBvbmx5IGlmIHJhbmdlX3N1YmlkIGlzIG5vdCAwLgogKgogKiBAcGFyYW0gY29udGV4dCAgYSBjb250ZXh0IG5hbWUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCiAqCiAqIEByZXR1cm4gZ2l2ZXMgTUlCX1VOUkVHSVNURVJFRF9PSyBvciBNSUJfKiBlcnJvciBjb2RlLgogKiAKICogQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfcHJpb3JpdHkoKQogKiBAc2VlIHVucmVnaXN0ZXJfbWliX3JhbmdlKCkKICovCmludAp1bnJlZ2lzdGVyX21pYl9jb250ZXh0KG9pZCAqIG5hbWUsIHNpemVfdCBsZW4sIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFuZ2Vfc3ViaWQsIG9pZCByYW5nZV91Ym91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpsaXN0LCAqbXlwdHIgPSBOVUxMOwogICAgbmV0c25tcF9zdWJ0cmVlICpwcmV2LCAqY2hpbGQsICpuZXh0OyAvKiBsb29wIHRocm91Z2ggY2hpbGRyZW4gKi8KICAgIHN0cnVjdCByZWdpc3Rlcl9wYXJhbWV0ZXJzIHJlZ19wYXJtczsKICAgIGludCBvbGRfbG9va3VwX2NhY2hlX3ZhbCA9IG5ldHNubXBfZ2V0X2xvb2t1cF9jYWNoZV9zaXplKCk7CiAgICBpbnQgdW5yZWdpc3RlcmluZyA9IDE7CiAgICBpbnQgb3JpZ19zdWJpZF92YWwgPSAtMTsKCiAgICBuZXRzbm1wX3NldF9sb29rdXBfY2FjaGVfc2l6ZSgwKTsKCiAgICBpZiAoKHJhbmdlX3N1YmlkID4gMCkgJiYgICgoc2l6ZV90KXJhbmdlX3N1YmlkIDw9IGxlbikpCiAgICAgICAgb3JpZ19zdWJpZF92YWwgPSBuYW1lW3JhbmdlX3N1YmlkLTFdOwoKICAgIHdoaWxlKHVucmVnaXN0ZXJpbmcpewogICAgICAgIERFQlVHTVNHVEwoKCJyZWdpc3Rlcl9taWIiLCAidW5yZWdpc3RlcmluZyAiKSk7CiAgICAgICAgREVCVUdNU0dPSURSQU5HRSgoInJlZ2lzdGVyX21pYiIsIG5hbWUsIGxlbiwgcmFuZ2Vfc3ViaWQsIHJhbmdlX3Vib3VuZCkpOwogICAgICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIlxuIikpOwoKICAgICAgICBsaXN0ID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmQobmFtZSwgbGVuLCBuZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKICAgICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBNSUJfTk9fU1VDSF9SRUdJU1RSQVRJT047CiAgICAgICAgfQoKICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7CiAgICAgICAgICAgIHByZXYgPSBjaGlsZCwgY2hpbGQgPSBjaGlsZC0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfb2lkX2VxdWFscyhjaGlsZC0+bmFtZV9hLCBjaGlsZC0+bmFtZWxlbiwgbmFtZSwgbGVuKSA9PSAwICYmCiAgICAgICAgICAgICAgICBjaGlsZC0+cHJpb3JpdHkgPT0gcHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogZm91bmQgaXQgKi8KICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjaGlsZCA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBNSUJfTk9fU1VDSF9SRUdJU1RSQVRJT047CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICBteXB0ciA9IGNoaWxkOyAgICAgICAgICAgICAgLyogcmVtZW1iZXIgdGhpcyBmb3IgbGF0ZXIgKi8KCiAgICAgICAgLyoKICAgICAgICAqICBOb3cgaGFuZGxlIGFueSBvY2N1cmFuY2VzIGluIHRoZSBmb2xsb3dpbmcgc3VidHJlZXMsCiAgICAgICAgKiAgICAgIGFzIGEgcmVzdWx0IG9mIHNwbGl0dGluZyB0aGlzIHJhbmdlLiAgRHVlIHRvIHRoZQogICAgICAgICogICAgICBuYXR1cmUgb2YgdGhlIHdheSBzdWNoIHNwbGl0cyB3b3JrLCB0aGUgZmlyc3QKICAgICAgICAqICAgICAgc3VidHJlZSAnc2xpY2UnIHRoYXQgZG9lc24ndCByZWZlciB0byB0aGUgZ2l2ZW4KICAgICAgICAqICAgICAgbmFtZSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvcmlnaW5hbCByZWdpb24uCiAgICAgICAgKgogICAgICAgICogIFRoaXMgc2hvdWxkIGFsc28gc2VydmUgdG8gcmVnaXN0ZXIgcmFuZ2VzLgogICAgICAgICovCgogICAgICAgIGZvciAobGlzdCA9IG15cHRyLT5uZXh0OyBsaXN0ICE9IE5VTEw7IGxpc3QgPSBuZXh0KSB7CiAgICAgICAgICAgIG5leHQgPSBsaXN0LT5uZXh0OyAvKiBsaXN0IGdldHMgZnJlZWQgc29tZXRpbWVzOyBjYWNoZSBuZXh0ICovCiAgICAgICAgICAgIGZvciAoY2hpbGQgPSBsaXN0LCBwcmV2ID0gTlVMTDsgY2hpbGQgIT0gTlVMTDsKICAgICAgICAgICAgICAgIHByZXYgPSBjaGlsZCwgY2hpbGQgPSBjaGlsZC0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGlmICgobmV0c25tcF9vaWRfZXF1YWxzKGNoaWxkLT5uYW1lX2EsIGNoaWxkLT5uYW1lbGVuLAogICAgICAgICAgICAgICAgICAgIG5hbWUsIGxlbikgPT0gMCkgJiYKICAgICAgICAgICAgKGNoaWxkLT5wcmlvcml0eSA9PSBwcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfdW5sb2FkKGNoaWxkLCBwcmV2LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoaWxkID09IE5VTEwpICAgICAgLyogRGlkbid0IGZpbmQgdGhlIGdpdmVuIG5hbWUgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLyogTWF5YmUgd2UgYXJlIGluIGEgcmFuZ2UuLi4gKi8KICAgICAgICBpZiAob3JpZ19zdWJpZF92YWwgIT0gLTEpewogICAgICAgICAgICBpZiAoKytuYW1lW3JhbmdlX3N1YmlkLTFdID49IG9yaWdfc3ViaWRfdmFsK3JhbmdlX3Vib3VuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJpbmc9MDsKICAgICAgICAgICAgICAgIG5hbWVbcmFuZ2Vfc3ViaWQtMV0gPSBvcmlnX3N1YmlkX3ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHVucmVnaXN0ZXJpbmc9MDsKICAgICAgICB9CiAgICB9CgogICAgbWVtc2V0KCZyZWdfcGFybXMsIDB4MCwgc2l6ZW9mKHJlZ19wYXJtcykpOwogICAgcmVnX3Bhcm1zLm5hbWUgPSBuYW1lOwogICAgcmVnX3Bhcm1zLm5hbWVsZW4gPSBsZW47CiAgICByZWdfcGFybXMucHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIHJlZ19wYXJtcy5yYW5nZV9zdWJpZCA9IHJhbmdlX3N1YmlkOwogICAgcmVnX3Bhcm1zLnJhbmdlX3Vib3VuZCA9IHJhbmdlX3Vib3VuZDsKICAgIHJlZ19wYXJtcy5mbGFncyA9IDB4MDA7ICAgICAvKiAgdGhpcyBpcyBva2F5IEkgdGhpbmsgICovCiAgICByZWdfcGFybXMuY29udGV4dE5hbWUgPSBjb250ZXh0OwogICAgc25tcF9jYWxsX2NhbGxiYWNrcyhTTk1QX0NBTExCQUNLX0FQUExJQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19VTlJFR0lTVEVSX09JRCwgJnJlZ19wYXJtcyk7CgogICAgbmV0c25tcF9zdWJ0cmVlX2ZyZWUobXlwdHIpOwogICAgbmV0c25tcF9zZXRfbG9va3VwX2NhY2hlX3NpemUob2xkX2xvb2t1cF9jYWNoZV92YWwpOwogICAgaW52YWxpZGF0ZV9sb29rdXBfY2FjaGUoY29udGV4dCk7CiAgICByZXR1cm4gTUlCX1VOUkVHSVNURVJFRF9PSzsKfQoKaW50Cm5ldHNubXBfdW5yZWdpc3Rlcl9taWJfdGFibGVfcm93KG9pZCAqIG5hbWUsIHNpemVfdCBsZW4sIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhcl9zdWJpZCwgb2lkIHJhbmdlX3Vib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCkKewogICAgbmV0c25tcF9zdWJ0cmVlICpsaXN0LCAqbXlwdHIsICpmdXR1cmVwdHI7CiAgICBuZXRzbm1wX3N1YnRyZWUgKnByZXYsICpjaGlsZDsgICAgICAgLyogbG9vcCB0aHJvdWdoIGNoaWxkcmVuICovCiAgICBzdHJ1Y3QgcmVnaXN0ZXJfcGFyYW1ldGVycyByZWdfcGFybXM7CiAgICBvaWQgICAgICAgICAgICAgcmFuZ2VfbGJvdW5kID0gbmFtZVt2YXJfc3ViaWQgLSAxXTsKCiAgICBERUJVR01TR1RMKCgicmVnaXN0ZXJfbWliIiwgInVucmVnaXN0ZXJpbmcgIikpOwogICAgREVCVUdNU0dPSURSQU5HRSgoInJlZ2lzdGVyX21pYiIsIG5hbWUsIGxlbiwgdmFyX3N1YmlkLCByYW5nZV91Ym91bmQpKTsKICAgIERFQlVHTVNHKCgicmVnaXN0ZXJfbWliIiwgIlxuIikpOwoKICAgIGZvciAoOyBuYW1lW3Zhcl9zdWJpZCAtIDFdIDw9IHJhbmdlX3Vib3VuZDsgbmFtZVt2YXJfc3ViaWQgLSAxXSsrKSB7CiAgICAgICAgbGlzdCA9IG5ldHNubXBfc3VidHJlZV9maW5kKG5hbWUsIGxlbiwgCgkJCQluZXRzbm1wX3N1YnRyZWVfZmluZF9maXJzdChjb250ZXh0KSwgY29udGV4dCk7CgogICAgICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGNoaWxkID0gbGlzdCwgcHJldiA9IE5VTEw7IGNoaWxkICE9IE5VTEw7CiAgICAgICAgICAgICBwcmV2ID0gY2hpbGQsIGNoaWxkID0gY2hpbGQtPmNoaWxkcmVuKSB7CgogICAgICAgICAgICBpZiAobmV0c25tcF9vaWRfZXF1YWxzKGNoaWxkLT5uYW1lX2EsIGNoaWxkLT5uYW1lbGVuLCAKCQkJCSBuYW1lLCBsZW4pID09IDAgJiYgCgkJKGNoaWxkLT5wcmlvcml0eSA9PSBwcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBmb3VuZCBpdCAqLwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoY2hpbGQgPT0gTlVMTCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIG5ldHNubXBfc3VidHJlZV91bmxvYWQoY2hpbGQsIHByZXYsIGNvbnRleHQpOwogICAgICAgIG15cHRyID0gY2hpbGQ7ICAgICAgICAgIC8qIHJlbWVtYmVyIHRoaXMgZm9yIGxhdGVyICovCgogICAgICAgIGZvciAobGlzdCA9IG15cHRyLT5uZXh0OyBsaXN0ICE9IE5VTEw7IGxpc3QgPSBmdXR1cmVwdHIpIHsKICAgICAgICAgICAgLyogcmVtZW1iZXIgdGhlIG5leHQgc3BvdCBpbiB0aGUgbGlzdCBpbiBjYXNlIHdlIGZyZWUgdGhpcyBub2RlICovCiAgICAgICAgICAgIGZ1dHVyZXB0ciA9IGxpc3QtPm5leHQ7CgogICAgICAgICAgICAvKiBjaGVjayBlYWNoIGNoaWxkICovCiAgICAgICAgICAgIGZvciAoY2hpbGQgPSBsaXN0LCBwcmV2ID0gTlVMTDsgY2hpbGQgIT0gTlVMTDsKICAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQsIGNoaWxkID0gY2hpbGQtPmNoaWxkcmVuKSB7CgogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfb2lkX2VxdWFscyhjaGlsZC0+bmFtZV9hLCBjaGlsZC0+bmFtZWxlbiwgCgkJCQkgICAgICBuYW1lLCBsZW4pID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAoY2hpbGQtPnByaW9yaXR5ID09IHByaW9yaXR5KSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV91bmxvYWQoY2hpbGQsIHByZXYsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc3VidHJlZV9mcmVlKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogWFhYOiB3amg6IG5vdCBzdXJlIHdoeSB3ZSdyZSBiYWlsaW5nIGhlcmUgKi8KICAgICAgICAgICAgaWYgKGNoaWxkID09IE5VTEwpIHsgICAgICAgIC8qIERpZG4ndCBmaW5kIHRoZSBnaXZlbiBuYW1lICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShteXB0cik7CiAgICB9CgogICAgbmFtZVt2YXJfc3ViaWQgLSAxXSA9IHJhbmdlX2xib3VuZDsKICAgIG1lbXNldCgmcmVnX3Bhcm1zLCAweDAsIHNpemVvZihyZWdfcGFybXMpKTsKICAgIHJlZ19wYXJtcy5uYW1lID0gbmFtZTsKICAgIHJlZ19wYXJtcy5uYW1lbGVuID0gbGVuOwogICAgcmVnX3Bhcm1zLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICByZWdfcGFybXMucmFuZ2Vfc3ViaWQgPSB2YXJfc3ViaWQ7CiAgICByZWdfcGFybXMucmFuZ2VfdWJvdW5kID0gcmFuZ2VfdWJvdW5kOwogICAgcmVnX3Bhcm1zLmZsYWdzID0gMHgwMDsgICAgIC8qICB0aGlzIGlzIG9rYXkgSSB0aGluayAgKi8KICAgIHJlZ19wYXJtcy5jb250ZXh0TmFtZSA9IGNvbnRleHQ7CiAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX1VOUkVHSVNURVJfT0lELCAmcmVnX3Bhcm1zKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIFVucmVnaXN0ZXJzIGEgbW9kdWxlIHJlZ2lzdGVyZWQgYWdhaW5zdCBhIGdpdmVuIE9JRCAob3IgcmFuZ2UpIGluIHRoZSBkZWZhdWx0IGNvbnRleHQuIAogKiBUeXBpY2FsbHkgdXNlZCB3aGVuIGEgbW9kdWxlIGhhcyBtdWx0aXBsZSBjb250ZXh0cyBkZWZpbmVkLgogKiBUaGUgcGFyYW1ldGVycyBwcmlvcml0eSwgcmFuZ2Vfc3ViaWQsIGFuZCByYW5nZV91Ym91bmQgc2hvdWxkCiAqIG1hdGNoIHRob3NlIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIG1vZHVsZSBvcmlnaW5hbGx5LgogKgogKiBAcGFyYW0gbmFtZSAgdGhlIHNwZWNpZmljIE9JRCB0byB1bnJlZ2lzdGVyIGlmIGl0IGNvbmF0aW5zIHRoZSBhc3NvY2lhdGVkCiAqICAgICAgICAgICAgICBjb250ZXh0LgogKgogKiBAcGFyYW0gbGVuICAgdGhlIGxlbmd0aCBvZiB0aGUgT0lELCB1c2UgIE9JRF9MRU5HVEggbWFjcm8uCiAqCiAqIEBwYXJhbSBwcmlvcml0eSAgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDI1NSwgdXNlZCB0byBhY2hpZXZlIGEgZGVzaXJlZAogKiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2hlbiBkaWZmZXJlbnQgc2Vzc2lvbnMgcmVnaXN0ZXIgaWRlbnRpY2FsIG9yCiAqICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmcgcmVnaW9ucy4gIFN1YmFnZW50cyB3aXRoIG5vIHBhcnRpY3VsYXIKICogICAgICAgICAgICAgICAgICBrbm93bGVkZ2Ugb2YgcHJpb3JpdHkgc2hvdWxkIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQKICogICAgICAgICAgICAgICAgICB2YWx1ZSBvZiAxMjcuCiAqCiAqIEBwYXJhbSByYW5nZV9zdWJpZCAgcGVybWl0cyBzcGVjaWZ5aW5nIGEgcmFuZ2UgaW4gcGxhY2Ugb2Ygb25lIG9mIGEgc3VidHJlZQogKiAgICAgICAgICAgICAgICAgICAgIHN1Yi1pZGVudGlmaWVycy4gIFdoZW4gdGhpcyB2YWx1ZSBpcyB6ZXJvLCBubyByYW5nZSBpcwogKiAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNwZWNpZmllZC4KICoKICogQHBhcmFtIHJhbmdlX3Vib3VuZCAgdGhlIHVwcGVyIGJvdW5kIG9mIGEgc3ViLWlkZW50aWZpZXIncyByYW5nZS4KICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBwcmVzZW50IG9ubHkgaWYgcmFuZ2Vfc3ViaWQgaXMgbm90IDAuCiAqCiAqIEByZXR1cm4gZ2l2ZXMgTUlCX1VOUkVHSVNURVJFRF9PSyBvciBNSUJfKiBlcnJvciBjb2RlLgogKiAKICogQHNlZSB1bnJlZ2lzdGVyX21pYigpCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfcHJpb3JpdHkoKQogKiBAc2VlIHVucmVnaXN0ZXJfbWliX2NvbnRleHQoKQogKi8KaW50CnVucmVnaXN0ZXJfbWliX3JhbmdlKG9pZCAqIG5hbWUsIHNpemVfdCBsZW4sIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlX3N1YmlkLCBvaWQgcmFuZ2VfdWJvdW5kKQp7CiAgICByZXR1cm4gdW5yZWdpc3Rlcl9taWJfY29udGV4dChuYW1lLCBsZW4sIHByaW9yaXR5LCByYW5nZV9zdWJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3Vib3VuZCwgIiIpOwp9CgovKioKICogVW5yZWdpc3RlcnMgYSBtb2R1bGUgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgZ2l2ZW4gT0lEIGF0IHRoZSBzcGVjaWZpZWQgcHJpb3JpdHkuCiAqIFRoZSBwcmlvcml0eSBwYXJhbWV0ZXIgc2hvdWxkIG1hdGNoIHRoYXQgdXNlZCB0byByZWdpc3RlciB0aGUgbW9kdWxlIG9yaWdpbmFsbHkuCiAqCiAqIEBwYXJhbSBuYW1lICB0aGUgc3BlY2lmaWMgT0lEIHRvIHVucmVnaXN0ZXIgaWYgaXQgY29uYXRpbnMgdGhlIGFzc29jaWF0ZWQKICogICAgICAgICAgICAgIGNvbnRleHQuCiAqCiAqIEBwYXJhbSBsZW4gICB0aGUgbGVuZ3RoIG9mIHRoZSBPSUQsIHVzZSAgT0lEX0xFTkdUSCBtYWNyby4KICoKICogQHBhcmFtIHByaW9yaXR5ICBhIHZhbHVlIGJldHdlZW4gMSBhbmQgMjU1LCB1c2VkIHRvIGFjaGlldmUgYSBkZXNpcmVkCiAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB3aGVuIGRpZmZlcmVudCBzZXNzaW9ucyByZWdpc3RlciBpZGVudGljYWwgb3IKICogICAgICAgICAgICAgICAgICBvdmVybGFwcGluZyByZWdpb25zLiAgU3ViYWdlbnRzIHdpdGggbm8gcGFydGljdWxhcgogKiAgICAgICAgICAgICAgICAgIGtub3dsZWRnZSBvZiBwcmlvcml0eSBzaG91bGQgcmVnaXN0ZXIgd2l0aCB0aGUgZGVmYXVsdAogKiAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIDEyNy4KICoKICogQHJldHVybiBnaXZlcyBNSUJfVU5SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqIAogKiBAc2VlIHVucmVnaXN0ZXJfbWliKCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9yYW5nZSgpCiAqIEBzZWUgdW5yZWdpc3Rlcl9taWJfY29udGV4dCgpCiAqLwppbnQKdW5yZWdpc3Rlcl9taWJfcHJpb3JpdHkob2lkICogbmFtZSwgc2l6ZV90IGxlbiwgaW50IHByaW9yaXR5KQp7CiAgICByZXR1cm4gdW5yZWdpc3Rlcl9taWJfcmFuZ2UobmFtZSwgbGVuLCBwcmlvcml0eSwgMCwgMCk7Cn0KCi8qKgogKiBVbnJlZ2lzdGVycyBhIG1vZHVsZSByZWdpc3RlcmVkIGFnYWluc3QgYSBnaXZlbiBPSUQgYXQgdGhlIGRlZmF1bHQgcHJpb3JpdHkuCiAqCiAqIEBwYXJhbSBuYW1lICB0aGUgc3BlY2lmaWMgT0lEIHRvIHVucmVnaXN0ZXIgaWYgaXQgY29uYXRpbnMgdGhlIGFzc29jaWF0ZWQKICogICAgICAgICAgICAgIGNvbnRleHQuCiAqCiAqIEBwYXJhbSBsZW4gICB0aGUgbGVuZ3RoIG9mIHRoZSBPSUQsIHVzZSAgT0lEX0xFTkdUSCBtYWNyby4KICoKICogQHJldHVybiBnaXZlcyBNSUJfVU5SRUdJU1RFUkVEX09LIG9yIE1JQl8qIGVycm9yIGNvZGUuCiAqIAogKiBAc2VlIHVucmVnaXN0ZXJfbWliX3ByaW9yaXR5KCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9jb250ZXh0KCkKICogQHNlZSB1bnJlZ2lzdGVyX21pYl9yYW5nZSgpCiAqIEBzZWUgdW5yZWdpc3Rlcl9hZ2VudHhfbGlzdCgpCiAqLwppbnQKdW5yZWdpc3Rlcl9taWIob2lkICogbmFtZSwgc2l6ZV90IGxlbikKewogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX3ByaW9yaXR5KG5hbWUsIGxlbiwgREVGQVVMVF9NSUJfUFJJT1JJVFkpOwp9CgovKiogVW5yZWdpc3RlcnMgc3VidHJlZSBvZiBPSURzIGJvdW5kZWQgdG8gZ2l2ZW4gc2Vzc2lvbi4KICoKICogIEBwYXJhbSBzcyBTZXNzaW9uIHdoaWNoIE9JRHMgd2lsbCBiZSByZW1vdmVkIGZyb20gdHJlZS4KICoKICogIEBzZWUgdW5yZWdpc3Rlcl9taWIoKQogKiAgQHNlZSB1bnJlZ2lzdGVyX2FnZW50eF9saXN0KCkKICovCnZvaWQKdW5yZWdpc3Rlcl9taWJzX2J5X3Nlc3Npb24obmV0c25tcF9zZXNzaW9uICogc3MpCnsKICAgIG5ldHNubXBfc3VidHJlZSAqbGlzdCwgKmxpc3QyOwogICAgbmV0c25tcF9zdWJ0cmVlICpjaGlsZCwgKnByZXYsICpuZXh0X2NoaWxkOwogICAgc3RydWN0IHJlZ2lzdGVyX3BhcmFtZXRlcnMgcnA7CiAgICBzdWJ0cmVlX2NvbnRleHRfY2FjaGUgKmNvbnRleHRwdHI7CgogICAgREVCVUdNU0dUTCgoInJlZ2lzdGVyX21pYiIsICJ1bnJlZ2lzdGVyX21pYnNfYnlfc2Vzc2lvbiglcCkgY3R4dCBcIiVzXCJcbiIsCgkJc3MsIChzcyAmJiBzcy0+Y29udGV4dE5hbWUpID8gc3MtPmNvbnRleHROYW1lIDogIltOSUxdIikpOwoKICAgIGZvciAoY29udGV4dHB0ciA9IGdldF90b3BfY29udGV4dF9jYWNoZSgpOyBjb250ZXh0cHRyICE9IE5VTEw7CiAgICAgICAgIGNvbnRleHRwdHIgPSBjb250ZXh0cHRyLT5uZXh0KSB7CiAgICAgICAgZm9yIChsaXN0ID0gY29udGV4dHB0ci0+Zmlyc3Rfc3VidHJlZTsgbGlzdCAhPSBOVUxMOyBsaXN0ID0gbGlzdDIpIHsKICAgICAgICAgICAgbGlzdDIgPSBsaXN0LT5uZXh0OwoKICAgICAgICAgICAgZm9yIChjaGlsZCA9IGxpc3QsIHByZXYgPSBOVUxMOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IG5leHRfY2hpbGQpewogICAgICAgICAgICAgICAgbmV4dF9jaGlsZCA9IGNoaWxkLT5jaGlsZHJlbjsKCiAgICAgICAgICAgICAgICBpZiAoKCghc3MgfHwgc3MtPmZsYWdzICYgU05NUF9GTEFHU19TVUJTRVNTSU9OKSAmJgoJCSAgICAgY2hpbGQtPnNlc3Npb24gPT0gc3MpIHx8CiAgICAgICAgICAgICAgICAgICAgKCEoIXNzIHx8IHNzLT5mbGFncyAmIFNOTVBfRkxBR1NfU1VCU0VTU0lPTikgJiYgY2hpbGQtPnNlc3Npb24gJiYKICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPnNlc3Npb24tPnN1YnNlc3Npb24gPT0gc3MpKSB7CgogICAgICAgICAgICAgICAgICAgIG1lbXNldCgmcnAsMHgwLHNpemVvZihycCkpOwogICAgICAgICAgICAgICAgICAgIHJwLm5hbWUgPSBjaGlsZC0+bmFtZV9hOwoJCSAgICBjaGlsZC0+bmFtZV9hID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBycC5uYW1lbGVuID0gY2hpbGQtPm5hbWVsZW47CiAgICAgICAgICAgICAgICAgICAgcnAucHJpb3JpdHkgPSBjaGlsZC0+cHJpb3JpdHk7CiAgICAgICAgICAgICAgICAgICAgcnAucmFuZ2Vfc3ViaWQgPSBjaGlsZC0+cmFuZ2Vfc3ViaWQ7CiAgICAgICAgICAgICAgICAgICAgcnAucmFuZ2VfdWJvdW5kID0gY2hpbGQtPnJhbmdlX3Vib3VuZDsKICAgICAgICAgICAgICAgICAgICBycC50aW1lb3V0ID0gY2hpbGQtPnRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgcnAuZmxhZ3MgPSBjaGlsZC0+ZmxhZ3M7CiAgICAgICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IGNoaWxkLT5yZWdpbmZvKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCAhPSBjaGlsZC0+cmVnaW5mby0+Y29udGV4dE5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICBycC5jb250ZXh0TmFtZSA9IGNoaWxkLT5yZWdpbmZvLT5jb250ZXh0TmFtZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5yZWdpbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogRG9uJ3QgbGV0J3MgZnJlZSB0aGUgc2Vzc2lvbiBwb2ludGVyIGp1c3QgeWV0ISAgCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC0+cmVnaW5mby0+aGFuZGxlci0+bXl2b2lkID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9mcmVlKGNoaWxkLT5yZWdpbmZvKTsKCQkJY2hpbGQtPnJlZ2luZm8gPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zdWJ0cmVlX3VubG9hZChjaGlsZCwgcHJldiwgY29udGV4dHB0ci0+Y29udGV4dF9uYW1lKTsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3N1YnRyZWVfZnJlZShjaGlsZCk7CgogICAgICAgICAgICAgICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX1VOUkVHSVNURVJfT0lELCAmcnApOwoJCSAgICBTTk1QX0ZSRUUocnAubmFtZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByZXYgPSBjaGlsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXRzbm1wX3N1YnRyZWVfam9pbihjb250ZXh0cHRyLT5maXJzdF9zdWJ0cmVlKTsKICAgIH0KfQoKLyoqIERldGVybWluZXMgaWYgZ2l2ZW4gUERVIGlzIGFsbG93ZWQgdG8gc2VlIChvciB1cGRhdGUpIGEgZ2l2ZW4gT0lELgogKgogKiBAcGFyYW0gbmFtZSAgICBUaGUgT0lEIHRvIGNoZWNrIGFjY2VzcyBmb3IuCiAqICAgICAgICAgICAgICAgIE9uIHJldHVybiwgdGhpcyBwYXJhbWV0ZXIgaG9sZHMgdGhlIE9JRCBhY3R1YWxseSBtYXRjaGVkCiAqCiAqIEBwYXJhbSBuYW1lbGVuIE51bWJlciBvZiBzdWItaWRlbnRpZmllcnMgaW4gdGhlIE9JRC4KICogICAgICAgICAgICAgICAgT24gcmV0dXJuLCB0aGlzIHBhcmFtZXRlciBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIE9JRAogKgogKiBAcGFyYW0gcGR1ICAgICBQRFUgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIE9JRC4KICoKICogQHBhcmFtIHR5cGUgICAgQU5TLjEgdHlwZSBvZiB0aGUgdmFsdWUgYXQgZ2l2ZW4gT0lELgogKiAgICAgICAgICAgICAgICAoVXNlZCBmb3IgY2F0Y2hpbmcgU05NUHYxIHJlcXVlc3RzIGZvciBTTUl2Mi1vbmx5IG9iamVjdHMpCiAqCiAqIEByZXR1cm4gZ2l2ZXMgVkFDTV9TVUNDRVNTIGlmIHRoZSBPSUQgaXMgaW4gdGhlIFBEVSwgb3RoZXJ3aXNlIGVycm9yIGNvZGUuCiAqLwppbnQKaW5fYV92aWV3KG9pZCAqbmFtZSwgc2l6ZV90ICpuYW1lbGVuLCBuZXRzbm1wX3BkdSAqcGR1LCBpbnQgdHlwZSkKewogICAgc3RydWN0IHZpZXdfcGFyYW1ldGVycyB2aWV3X3Bhcm1zOwoKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXKSB7CgkvKiBFbmFibGUgYnlwYXNzaW5nIG9mIHZpZXctYmFzZWQgYWNjZXNzIGNvbnRyb2wgKi8KICAgICAgICByZXR1cm4gVkFDTV9TVUNDRVNTOwogICAgfQoKICAgIC8qCiAgICAgKiBjaGVjayBmb3IgdjEgYW5kIGNvdW50ZXI2NHMsIHNpbmNlIHNubXB2MSBkb2Vzbid0IHN1cHBvcnQgaXQgCiAgICAgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYxCiAgICBpZiAocGR1LT52ZXJzaW9uID09IFNOTVBfVkVSU0lPTl8xICYmIHR5cGUgPT0gQVNOX0NPVU5URVI2NCkgewogICAgICAgIHJldHVybiBWQUNNX05PVElOVklFVzsKICAgIH0KI2VuZGlmCgogICAgdmlld19wYXJtcy5wZHUgPSBwZHU7CiAgICB2aWV3X3Bhcm1zLm5hbWUgPSBuYW1lOwogICAgaWYgKG5hbWVsZW4gIT0gTlVMTCkgewogICAgICAgIHZpZXdfcGFybXMubmFtZWxlbiA9ICpuYW1lbGVuOwogICAgfSBlbHNlIHsKICAgICAgICB2aWV3X3Bhcm1zLm5hbWVsZW4gPSAwOwogICAgfQogICAgdmlld19wYXJtcy5lcnJvcmNvZGUgPSAwOwogICAgdmlld19wYXJtcy5jaGVja19zdWJ0cmVlID0gMDsKCiAgICBzd2l0Y2ggKHBkdS0+dmVyc2lvbikgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGNhc2UgU05NUF9WRVJTSU9OXzE6CiNlbmRpZgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8yYzoKI2VuZGlmCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8zOgogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDSywgJnZpZXdfcGFybXMpOwogICAgICAgIHJldHVybiB2aWV3X3Bhcm1zLmVycm9yY29kZTsKICAgIH0KICAgIHJldHVybiBWQUNNX05PU0VDTkFNRTsKfQoKLyoqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIFBEVSByZXF1ZXN0IGNvdWxkIHBvdGVudGlhbGx5IHN1Y2NlZWQuCiAqICAoUHJlbGltaW5hcnksIE9JRC1pbmRlcGVuZGVudCB2YWxpZGF0aW9uKQogKgogKiBAcGFyYW0gcGR1ICAgICBQRFUgcmVxdWVzdGluZyBhY2Nlc3MKICoKICogQHJldHVybiBnaXZlcyBWQUNNX1NVQ0NFU1MgICBpZiB0aGUgZW50aXJlIE1JQiB0cmVlIGlzIGFjY2Vzc2libGUKICogICAgICAgICAgICAgICBWQUNNX05PVElOVklFVyBpZiB0aGUgZW50aXJlIE1JQiB0cmVlIGlzIGluYWNjZXNzaWJsZQogKiAgICAgICAgICAgICAgIFZBQ01fU1VCVFJFRV9VTktOT1dOIGlmIHNvbWUgcG9ydGlvbnMgYXJlIGFjY2Vzc2libGUKICogICAgICAgICAgICAgICBvdGhlciBjb2RlcyBtYXkgcmV0dXJuZWQgb24gZXJyb3IKICovCmludApjaGVja19hY2Nlc3MobmV0c25tcF9wZHUgKnBkdSkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAtIHBkdSBiZWluZyBjaGVja2VkICovCiAgICBzdHJ1Y3Qgdmlld19wYXJhbWV0ZXJzIHZpZXdfcGFybXM7CiAgICB2aWV3X3Bhcm1zLnBkdSA9IHBkdTsKICAgIHZpZXdfcGFybXMubmFtZSA9IE5VTEw7CiAgICB2aWV3X3Bhcm1zLm5hbWVsZW4gPSAwOwogICAgdmlld19wYXJtcy5lcnJvcmNvZGUgPSAwOwogICAgdmlld19wYXJtcy5jaGVja19zdWJ0cmVlID0gMDsKCiAgICBpZiAocGR1LT5mbGFncyAmIFVDRF9NU0dfRkxBR19BTFdBWVNfSU5fVklFVykgewoJLyogRW5hYmxlIGJ5cGFzc2luZyBvZiB2aWV3LWJhc2VkIGFjY2VzcyBjb250cm9sICovCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgc3dpdGNoIChwZHUtPnZlcnNpb24pIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYxCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8xOgojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfU05NUFYyQwogICAgY2FzZSBTTk1QX1ZFUlNJT05fMmM6CiNlbmRpZgogICAgY2FzZSBTTk1QX1ZFUlNJT05fMzoKICAgICAgICBzbm1wX2NhbGxfY2FsbGJhY2tzKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QRF9DQUxMQkFDS19BQ01fQ0hFQ0tfSU5JVElBTCwgJnZpZXdfcGFybXMpOwogICAgICAgIHJldHVybiB2aWV3X3Bhcm1zLmVycm9yY29kZTsKICAgIH0KICAgIHJldHVybiAxOwp9CgovKiogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gUERVIHJlcXVlc3QgY291bGQgcG90ZW50aWFsbHkgYWNjZXNzCiAqICAgdGhlIHNwZWNpZmllZCBNSUIgc3VidHJlZQogKgogKiBAcGFyYW0gcGR1ICAgICBQRFUgcmVxdWVzdGluZyBhY2Nlc3MKICoKICogQHBhcmFtIG5hbWUgICAgVGhlIE9JRCB0byBjaGVjayBhY2Nlc3MgZm9yLgogKgogKiBAcGFyYW0gbmFtZWxlbiBOdW1iZXIgb2Ygc3ViLWlkZW50aWZpZXJzIGluIHRoZSBPSUQuCiAqCiAqIEByZXR1cm4gZ2l2ZXMgVkFDTV9TVUNDRVNTICAgaWYgdGhlIGVudGlyZSBNSUIgdHJlZSBpcyBhY2Nlc3NpYmxlCiAqICAgICAgICAgICAgICAgVkFDTV9OT1RJTlZJRVcgaWYgdGhlIGVudGlyZSBNSUIgdHJlZSBpcyBpbmFjY2Vzc2libGUKICogICAgICAgICAgICAgICBWQUNNX1NVQlRSRUVfVU5LTk9XTiBpZiBzb21lIHBvcnRpb25zIGFyZSBhY2Nlc3NpYmxlCiAqICAgICAgICAgICAgICAgb3RoZXIgY29kZXMgbWF5IHJldHVybmVkIG9uIGVycm9yCiAqLwppbnQKbmV0c25tcF9hY21fY2hlY2tfc3VidHJlZShuZXRzbm1wX3BkdSAqcGR1LCBvaWQgKm5hbWUsIHNpemVfdCBuYW1lbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOIC0gcGR1IGJlaW5nIGNoZWNrZWQgKi8KICAgIHN0cnVjdCB2aWV3X3BhcmFtZXRlcnMgdmlld19wYXJtczsKICAgIHZpZXdfcGFybXMucGR1ID0gcGR1OwogICAgdmlld19wYXJtcy5uYW1lID0gbmFtZTsKICAgIHZpZXdfcGFybXMubmFtZWxlbiA9IG5hbWVsZW47CiAgICB2aWV3X3Bhcm1zLmVycm9yY29kZSA9IDA7CiAgICB2aWV3X3Bhcm1zLmNoZWNrX3N1YnRyZWUgPSAxOwoKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXKSB7CgkvKiBFbmFibGUgYnlwYXNzaW5nIG9mIHZpZXctYmFzZWQgYWNjZXNzIGNvbnRyb2wgKi8KICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBzd2l0Y2ggKHBkdS0+dmVyc2lvbikgewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjEKICAgIGNhc2UgU05NUF9WRVJTSU9OXzE6CiNlbmRpZgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8yYzoKI2VuZGlmCiAgICBjYXNlIFNOTVBfVkVSU0lPTl8zOgogICAgICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDS19TVUJUUkVFLCAmdmlld19wYXJtcyk7CiAgICAgICAgcmV0dXJuIHZpZXdfcGFybXMuZXJyb3Jjb2RlOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgpuZXRzbm1wX3Nlc3Npb24gKgpnZXRfc2Vzc2lvbl9mb3Jfb2lkKG9pZCAqbmFtZSwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqY29udGV4dF9uYW1lKQp7CiAgICBuZXRzbm1wX3N1YnRyZWUgKm15cHRyOwoKICAgIG15cHRyID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmRfcHJldihuYW1lLCBsZW4sIAoJCQkJICAgICAgbmV0c25tcF9zdWJ0cmVlX2ZpbmRfZmlyc3QoY29udGV4dF9uYW1lKSwKCQkJCSAgICAgIGNvbnRleHRfbmFtZSk7CgogICAgd2hpbGUgKG15cHRyICYmIG15cHRyLT52YXJpYWJsZXMgPT0gTlVMTCkgewogICAgICAgIG15cHRyID0gbXlwdHItPm5leHQ7CiAgICB9CgogICAgaWYgKG15cHRyID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG15cHRyLT5zZXNzaW9uOwogICAgfQp9Cgp2b2lkCnNldHVwX3RyZWUodm9pZCkKewogICAgb2lkIGNjaXR0WzFdICAgICAgICAgICA9IHsgMCB9OwogICAgb2lkIGlzb1sxXSAgICAgICAgICAgICA9IHsgMSB9OwogICAgb2lkIGpvaW50X2NjaXR0X2lzb1sxXSA9IHsgMiB9OwoKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIGludCByb2xlID0gIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFKTsKCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgCgkJCSAgIE1BU1RFUl9BR0VOVCk7CiNlbmRpZgoKICAgIC8qIAogICAgICogd2UgbmVlZCB0byBoYXZlIHRoZSBvaWQncyBpbiB0aGUgaGVhcCwgdGhhdCB3ZSBjYW4gKmZyZWUqIGl0IGZvciBldmVyeSBjYXNlLCAKICAgICAqIHRoYXRzIHRoZSBwdXJwb3NlIG9mIHRoZSBkdXBsaWNhdGVfb2JqaWQncwogICAgICovCiAgICBuZXRzbm1wX3JlZ2lzdGVyX251bGwoc25tcF9kdXBsaWNhdGVfb2JqaWQoY2NpdHQsIDEpLCAxKTsKICAgIG5ldHNubXBfcmVnaXN0ZXJfbnVsbChzbm1wX2R1cGxpY2F0ZV9vYmppZChpc28sIDEpLCAxKTsKICAgIG5ldHNubXBfcmVnaXN0ZXJfbnVsbChzbm1wX2R1cGxpY2F0ZV9vYmppZChqb2ludF9jY2l0dF9pc28sIDEpLCAxKTsKCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgCgkJCSAgIHJvbGUpOwojZW5kaWYKfQoKaW50IApyZW1vdmVfdHJlZV9lbnRyeSAob2lkICpuYW1lLCBzaXplX3QgbGVuKSB7CgogICAgbmV0c25tcF9zdWJ0cmVlICpzdWIgPSBOVUxMOwoKICAgIGlmICgoc3ViID0gbmV0c25tcF9zdWJ0cmVlX2ZpbmQobmFtZSwgbGVuLCBOVUxMLCAiIikpID09IE5VTEwpIHsKCXJldHVybiBNSUJfTk9fU1VDSF9SRUdJU1RSQVRJT047CiAgICB9CgogICAgcmV0dXJuIHVucmVnaXN0ZXJfbWliX2NvbnRleHQobmFtZSwgbGVuLCBzdWItPnByaW9yaXR5LAoJCQkJICBzdWItPnJhbmdlX3N1YmlkLCBzdWItPnJhbmdlX3Vib3VuZCwgIiIpOwoKfQoKCnZvaWQKc2h1dGRvd25fdHJlZSh2b2lkKSB7CiAgICBvaWQgY2NpdHRbMV0gICAgICAgICAgID0geyAwIH07CiAgICBvaWQgaXNvWzFdICAgICAgICAgICAgID0geyAxIH07CiAgICBvaWQgam9pbnRfY2NpdHRfaXNvWzFdID0geyAyIH07CgogICAgREVCVUdNU0dUTCgoImFnZW50X3JlZ2lzdHJ5IiwgInNodXQgZG93biB0cmVlXG4iKSk7CgogICAgcmVtb3ZlX3RyZWVfZW50cnkoam9pbnRfY2NpdHRfaXNvLCAxKTsKICAgIHJlbW92ZV90cmVlX2VudHJ5KGlzbywgMSk7CiAgICByZW1vdmVfdHJlZV9lbnRyeShjY2l0dCwgMSk7Cgp9CgpleHRlcm4gdm9pZCAgICAgZHVtcF9pZHhfcmVnaXN0cnkodm9pZCk7CnZvaWQKZHVtcF9yZWdpc3RyeSh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUgKnZwID0gTlVMTDsKICAgIG5ldHNubXBfc3VidHJlZSAqbXlwdHIsICpteXB0cjI7CiAgICB1X2NoYXIgKnMgPSBOVUxMLCAqZSA9IE5VTEwsICp2ID0gTlVMTDsKICAgIHNpemVfdCBzbCA9IDI1NiwgZWwgPSAyNTYsIHZsID0gMjU2LCBzbF9vID0gMCwgZWxfbyA9IDAsIHZsX28gPSAwOwogICAgaW50IGkgPSAwOwoKICAgIGlmICgocyA9ICh1X2NoYXIgKikgY2FsbG9jKHNsLCAxKSkgIT0gTlVMTCAmJgogICAgICAgIChlID0gKHVfY2hhciAqKSBjYWxsb2Moc2wsIDEpKSAhPSBOVUxMICYmCiAgICAgICAgKHYgPSAodV9jaGFyICopIGNhbGxvYyhzbCwgMSkpICE9IE5VTEwpIHsKCiAgICAgICAgc3VidHJlZV9jb250ZXh0X2NhY2hlICpwdHI7CiAgICAgICAgZm9yIChwdHIgPSBjb250ZXh0X3N1YnRyZWVzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgICAgICBwcmludGYoIlN1YnRyZWVzIGZvciBDb250ZXh0OiAlc1xuIiwgcHRyLT5jb250ZXh0X25hbWUpOwogICAgICAgICAgICBmb3IgKG15cHRyID0gcHRyLT5maXJzdF9zdWJ0cmVlOyBteXB0ciAhPSBOVUxMOwogICAgICAgICAgICAgICAgIG15cHRyID0gbXlwdHItPm5leHQpIHsKICAgICAgICAgICAgICAgIHNsX28gPSBlbF9vID0gdmxfbyA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZCgmcywgJnNsLCAmc2xfbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnN0YXJ0X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyLT5zdGFydF9sZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX29iamlkKCZlLCAmZWwsICZlbF9vLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0ci0+ZW5kX2EsCgkJCQkJICBteXB0ci0+ZW5kX2xlbikpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobXlwdHItPnZhcmlhYmxlcykgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAoICVzIC0gJXMgKSBbIiwgbXlwdHItPmZsYWdzLCBzLCBlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCB2cCA9IG15cHRyLT52YXJpYWJsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgbXlwdHItPnZhcmlhYmxlc19sZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2bF9vID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZ2LCAmdmwsICZ2bF9vLCAxLCB2cC0+bmFtZSwgdnAtPm5hbWVsZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzLCAiLCB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSAoc3RydWN0IHZhcmlhYmxlICopICgoY2hhciAqKSB2cCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHItPnZhcmlhYmxlc193aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXVxuIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAgICVzIC0gJXMgIFxuIiwgbXlwdHItPmZsYWdzLCBzLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobXlwdHIyID0gbXlwdHI7IG15cHRyMiAhPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICBteXB0cjIgPSBteXB0cjItPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG15cHRyMi0+bGFiZWxfYSAmJiBteXB0cjItPmxhYmVsX2FbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChteXB0cjItPmxhYmVsX2EsICJvbGRfYXBpIikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZhcmlhYmxlICp2cCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCB2YXJpYWJsZSopbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyLT5teXZvaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vYmppZCgmcywgJnNsLCAmc2xfbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT5uYW1lLCB2cC0+bmFtZWxlbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHQlc1slc10gJXAgdmFyICVzXG4iLCBteXB0cjItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA6ICJuby1uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXB0cjItPnJlZ2luZm8sIHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdCVzICVzICVwXG4iLCBteXB0cjItPmxhYmVsX2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlwdHIyLT5yZWdpbmZvLT5oYW5kbGVyTmFtZSA6ICJuby1oYW5kbGVyLW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cHRyMi0+cmVnaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKHMgIT0gTlVMTCkgewogICAgICAgIFNOTVBfRlJFRShzKTsKICAgIH0KICAgIGlmIChlICE9IE5VTEwpIHsKICAgICAgICBTTk1QX0ZSRUUoZSk7CiAgICB9CiAgICBpZiAodiAhPSBOVUxMKSB7CiAgICAgICAgU05NUF9GUkVFKHYpOwogICAgfQoKICAgIGR1bXBfaWR4X3JlZ2lzdHJ5KCk7Cn0KCi8qKiAgQH0gKi8KLyogRW5kIG9mIE1JQiByZWdpc3RyYXRpb24gY29kZSAqLwoKCi8qKiBAZGVmZ3JvdXAgYWdlbnRfc2lnbmFscyBQT1NJWCBzaWduYWxzIHN1cHBvcnQgZm9yIGFnZW50cy4KICogICAgIFJlZ2lzdGVyaW5nIGFuZCB1bnJlZ2lzdGVyaW5nIHNpZ25hbCBoYW5kbGVycy4KICogICBAaW5ncm91cCBhZ2VudF9yZWdpc3RyeQogKgogKiBAewogKi8KCmludCAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW05VTV9FWFRFUk5BTF9TSUdTXTsKdm9pZCAgICAgICAgICAgICgqZXh0ZXJuYWxfc2lnbmFsX2hhbmRsZXJbTlVNX0VYVEVSTkFMX1NJR1NdKSAoaW50KTsKCiNpZm5kZWYgV0lOMzIKCi8qCiAqIFRPRE86IGFkZCBhZ2VudF9TSUdYWFhfaGFuZGxlciBmdW5jdGlvbnMgYW5kIGBjYXNlIFNJR1hYWDogLi4uJyBsaW5lcwogKiAgICAgICBiZWxvdyBmb3IgZXZlcnkgc2luZ2xlIHRoYXQgbWlnaHQgYmUgaGFuZGxlZCBieSByZWdpc3Rlcl9zaWduYWwoKS4KICovCgpSRVRTSUdUWVBFCmFnZW50X1NJR0NITERfaGFuZGxlcihpbnQgc2lnKQp7CiAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW1NJR0NITERdKys7CiNpZm5kZWYgSEFWRV9TSUdBQ1RJT04KICAgIC8qCiAgICAgKiBzaWduYWwoKSBzdWNrcy4gSXQgKm1pZ2h0KiBoYXZlIFN5c1Ygc2VtYW50aWNzLCB3aGljaCBtZWFucyB0aGF0CiAgICAgKiAqIGEgc2lnbmFsIGhhbmRsZXIgaXMgcmVzZXQgb25jZSBpdCBnZXRzIGNhbGxlZC4gRW5zdXJlIHRoYXQgaXQKICAgICAqICogcmVtYWlucyBhY3RpdmUuCiAgICAgKi8KICAgIHNpZ25hbChTSUdDSExELCBhZ2VudF9TSUdDSExEX2hhbmRsZXIpOwojZW5kaWYKfQoKLyoqIFJlZ2lzdGVycyBhIFBPU0lYIFNpZ25hbCBoYW5kbGVyLgogKiAgSW1wbGVtZW50cyB0aGUgc2lnbmFsIHJlZ2lzdGVyaW5nIHByb2Nlc3MgZm9yIFBPU0lYIGFuZCBub24tUE9TSVgKICogIHN5c3RlbXMuIEFsc28sIHVuaWZpZXMgdGhlIHdheSBzaWduYWxzIHdvcmsuCiAqICBOb3RlIHRoYXQgdGhlIHNpZ25hbCBoYW5kbGVyIHNob3VsZCByZWdpc3RlciBpdHNlbGYgYWdhaW4gd2l0aAogKiAgc2lnbmFsKCkgY2FsbCBiZWZvcmUgZW5kIG9mIGV4ZWN1dGlvbiB0byBwcmV2ZW50IHBvc3NpYmxlIHByb2JsZW1zLgogKgogKiAgQHBhcmFtIHNpZyBQT1NJWCBTaWduYWwgSUQgbnVtYmVyLCBhcyBkZWZpbmVkIGluIHNpZ25hbC5oLgogKgogKiAgQHBhcmFtIGZ1bmMgTmV3IHNpZ25hbCBoYW5kbGVyIGZ1bmN0aW9uLgogKgogKiAgQHJldHVybiB2YWx1ZSBpcyBTSUdfUkVHSVNURVJFRF9PSyBmb3Igc3VjY2VzcyBhbmQKICogICAgICAgIFNJR19SRUdJU1RSQVRJT05fRkFJTEVEIGlmIHRoZSByZWdpc3RyYXRpb24gY2FuJ3QKICogICAgICAgIGJlIGhhbmRsZWQuCiAqLwppbnQKcmVnaXN0ZXJfc2lnbmFsKGludCBzaWcsIHZvaWQgKCpmdW5jKSAoaW50KSkKewoKICAgIHN3aXRjaCAoc2lnKSB7CiNpZiBkZWZpbmVkKFNJR0NITEQpCiAgICBjYXNlIFNJR0NITEQ6CiNpZmRlZiBIQVZFX1NJR0FDVElPTgogICAgICAgIHsKICAgICAgICAgICAgc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gYWN0OwogICAgICAgICAgICBhY3Quc2FfaGFuZGxlciA9IGFnZW50X1NJR0NITERfaGFuZGxlcjsKICAgICAgICAgICAgc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKICAgICAgICAgICAgYWN0LnNhX2ZsYWdzID0gMDsKICAgICAgICAgICAgc2lnYWN0aW9uKFNJR0NITEQsICZhY3QsIE5VTEwpOwogICAgICAgIH0KI2Vsc2UKICAgICAgICBzaWduYWwoU0lHQ0hMRCwgYWdlbnRfU0lHQ0hMRF9oYW5kbGVyKTsKI2VuZGlmCiAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgICBzbm1wX2xvZyhMT0dfQ1JJVCwKICAgICAgICAgICAgICAgICAicmVnaXN0ZXJfc2lnbmFsOiBzaWduYWwgJWQgY2Fubm90IGJlIGhhbmRsZWRcbiIsIHNpZyk7CiAgICAgICAgcmV0dXJuIFNJR19SRUdJU1RSQVRJT05fRkFJTEVEOwogICAgfQoKICAgIGV4dGVybmFsX3NpZ25hbF9oYW5kbGVyW3NpZ10gPSBmdW5jOwogICAgZXh0ZXJuYWxfc2lnbmFsX3NjaGVkdWxlZFtzaWddID0gMDsKCiAgICBERUJVR01TR1RMKCgicmVnaXN0ZXJfc2lnbmFsIiwgInJlZ2lzdGVyZWQgc2lnbmFsICVkXG4iLCBzaWcpKTsKICAgIHJldHVybiBTSUdfUkVHSVNURVJFRF9PSzsKfQoKLyoqIFVucmVnaXN0ZXJzIGEgUE9TSVggU2lnbmFsIGhhbmRsZXIuCiAqCiAqICBAcGFyYW0gc2lnIFBPU0lYIFNpZ25hbCBJRCBudW1iZXIsIGFzIGRlZmluZWQgaW4gc2lnbmFsLmguCiAqCiAqICBAcmV0dXJuIHZhbHVlIGlzIFNJR19VTlJFR0lTVEVSRURfT0sgZm9yIHN1Y2Nlc3MsIG9yIGVycm9yIGNvZGUuCiAqLwppbnQKdW5yZWdpc3Rlcl9zaWduYWwoaW50IHNpZykKewogICAgc2lnbmFsKHNpZywgU0lHX0RGTCk7CiAgICBERUJVR01TR1RMKCgidW5yZWdpc3Rlcl9zaWduYWwiLCAidW5yZWdpc3RlcmVkIHNpZ25hbCAlZFxuIiwgc2lnKSk7CiAgICByZXR1cm4gU0lHX1VOUkVHSVNURVJFRF9PSzsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhV0lOMzIgKi8KCi8qKiAgQH0gKi8KLyogRW5kIG9mIHNpZ25hbHMgc3VwcG9ydCBjb2RlICovCgovKiogIEB9ICovCgo=