LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWZkZWYgSEFWRV9SRUdFWF9ICgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWZkZWYgV0lOMzIKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSAic3RydWN0LmgiCiNpbmNsdWRlICJ1dGlsX2Z1bmNzLmgiCiNpbmNsdWRlICJsb2dtYXRjaC5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy5oIgoKI2RlZmluZSBNQVhMT0dNQVRDSCAgIDUwCgpzdHJ1Y3QgbG9nbWF0Y2hzdGF0IGxvZ21hdGNoVGFibGVbTUFYTE9HTUFUQ0hdOwppbnQgICAgICAgICAgICAgbG9nbWF0Y2hDb3VudDsKCnZvaWQKaW5pdF9sb2dtYXRjaCh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUyIGxvZ21hdGNoX2luZm9bXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5GTywgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfbG9nbWF0Y2hfdGFibGUsIDB9CiAgICB9OwoKICAgIHN0cnVjdCB2YXJpYWJsZTIgbG9nbWF0Y2hfdGFibGVbXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5ERVgsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MX19LAogICAgICAgIHtMT0dNQVRDSF9OQU1FLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7Mn19LAogICAgICAgIHtMT0dNQVRDSF9GSUxFTkFNRSwgQVNOX09DVEVUX1NUUiwgUk9OTFksIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwKICAgICAgICAgezN9fSwKICAgICAgICB7TE9HTUFUQ0hfUkVHRVgsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs0fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENUUiwgQVNOX0NPVU5URVIsIFJPTkxZLCB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsCiAgICAgICAgIHs1fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENOVCwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsCiAgICAgICAgIHs2fX0sCiAgICAgICAge0xPR01BVENIX0NVUlJFTlRDVFIsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLAogICAgICAgICB7N319LAogICAgICAgIHtMT0dNQVRDSF9DVVJSRU5UQ05ULCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwKICAgICAgICAgezh9fSwKICAgICAgICB7TE9HTUFUQ0hfQ09VTlRFUiwgQVNOX0NPVU5URVIsIFJPTkxZLCB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs5fX0sCiAgICAgICAge0xPR01BVENIX0NPVU5ULCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwfX0sCiAgICAgICAge0xPR01BVENIX0ZSRVEsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTF9fSwKICAgICAgICB7TE9HTUFUQ0hfRVJST1IsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTAwfX0sCiAgICAgICAge0xPR01BVENIX01TRywgQVNOX09DVEVUX1NUUiwgUk9OTFksIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwMX19CiAgICB9OwoKICAgIC8qCiAgICAgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICAgICAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGggCiAgICAgKi8KICAgIG9pZCAgICAgICAgICAgICBsb2dtYXRjaF9pbmZvX29pZFtdID0geyBORVRTTk1QX1VDREFWSVNfTUlCLCAxNiwgMSB9OwogICAgb2lkICAgICAgICAgICAgIGxvZ21hdGNoX3ZhcmlhYmxlc19vaWRbXSA9IHsgTkVUU05NUF9VQ0RBVklTX01JQiwgMTYsIDIsIDEgfTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidWNkLXNubXAvbG9nbWF0Y2giLCBsb2dtYXRjaF9pbmZvLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfaW5mb19vaWQpOwogICAgUkVHSVNURVJfTUlCKCJ1Y2Qtc25tcC9sb2dtYXRjaCIsIGxvZ21hdGNoX3RhYmxlLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfdmFyaWFibGVzX29pZCk7CgogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoImxvZ21hdGNoIiwgbG9nbWF0Y2hfcGFyc2VfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfZnJlZV9jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nbWF0Y2ggbmFtZSBwYXRoIGN5Y2xldGltZSByZWdleCIpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogISEhLS0tISEhIFBVQkxJQyAhISEgLS0tICEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGxvZ21hdGNoX2ZyZWVfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWliIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkCmxvZ21hdGNoX2ZyZWVfY29uZmlnKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKiB0aGUgb25seSBtZW1vcnkgd2UgaGF2ZSBhbGxvY2F0ZWQgICAgCiAgICAgKiBpcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSByZWdjb21wICAgCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgbG9nbWF0Y2hDb3VudDsgaSsrKSB7CgogICAgICAgIHJlZ2ZyZWUoJihsb2dtYXRjaFRhYmxlW2ldLnJlZ2V4QnVmZmVyKSk7CiAgICB9CiAgICBsb2dtYXRjaENvdW50ID0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogISEhLS0tISEhIFBVQkxJQyAhISEgLS0tICEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGxvZ21hdGNoX3BhcnNlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogcGFyc2Ugb25lIGxpbmUgZnJvbSBzbm1wZC5jb25mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkCmxvZ21hdGNoX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY3B0cikKewoKICAgIGNoYXIgc3BhY2VfbmFtZTsKICAgIGNoYXIgc3BhY2VfcGF0aDsKCiAgICBpZiAobG9nbWF0Y2hDb3VudCA8IE1BWExPR01BVENIKSB7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPSAzMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnRoaXNJbmRleCA9IGxvZ21hdGNoQ291bnQ7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKiBiZSBjYXJlZnVsIHRoaXMgY291bnRlciBuZWVkcyB0byBiZSAgCiAgICAgICAgICogcmVzZXQgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UgICAgICAgICAKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICovCgogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZ2xvYmFsTWF0Y2hDb3VudGVyID0gMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmN1cnJlbnRNYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ubWF0Y2hDb3VudGVyID0gMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnZpcmdpbiA9IFRSVUU7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gMDsKCgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIGJlIGNhcmVmdWw6IHRoZSBmbGFnIDI1NSBtdXN0IGZpdCB0byAKICAgICAgICAgKiB0aGUgc2l6ZSBvZiByZWdFeCBhcyBkZWZpbmRlZCBpbiAgICAgCiAgICAgICAgICogbG9nbWF0Y2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgc3NjYW5mKGNwdHIsICIlMjU1cyVjJTI1NXMlYyAlZCAlMjU1Y1xuIiwKICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5uYW1lLAoJICAgICAgICZzcGFjZV9uYW1lLAogICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZpbGVuYW1lLAoJICAgICAgICZzcGFjZV9wYXRoLAogICAgICAgICAgICAgICAmKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZnJlcXVlbmN5KSwKICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdFeCk7CgoJLyoKCSAqIExvZyBhbiBlcnJvciB0aGVuIHJldHVybiBpZiBhbnkgb2YgdGhlIHN0cmluZ3Mgc2Nhbm5lZCBpbiB3ZXJlCgkgKiBsYXJnZXIgdGhlbiB0aGV5IHNob3VsZCBoYXZlIGJlZW4uCgkgKi8KCWlmIChzcGFjZV9uYW1lICE9ICcgJykgewoJCXNubXBfbG9nKExPR19FUlIsICJsb2dtYXRjaF9wYXJzZV9jb25maWc6IHRoZSBuYW1lIHNjYW5uZWQgIiBcCgkJICJpbiBmcm9tIGxpbmUgJXMgaXMgdG9vIGxhcmdlLiBsb2dtYXRjaENvdW50ID0gJWRcbiIsCgkJIGNwdHIsIGxvZ21hdGNoQ291bnQpOwoJCXJldHVybjsKCX0gZWxzZSBpZiAoc3BhY2VfcGF0aCAhPSAnICcpIHsKCQlzbm1wX2xvZyhMT0dfRVJSLCAibG9nbWF0Y2hfcGFyc2VfY29uZmlnOiB0aGUgZmlsZSBuYW1lICIgXAoJCSAic2Nhbm5lZCBpbiBmcm9tIGxpbmUgJXMgaXMgdG9vIGxhcmdlLiBsb2dtYXRjaENvdW50ID0gJWRcbiIsCgkJICAgIGNwdHIsIGxvZ21hdGNoQ291bnQpOwoJCXJldHVybjsKCX0KCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICoganVzdCB0byBiZSBzYWZlICJOVUxMIiB0aGUgZW5kIG9mICAgIAogICAgICAgICAqIHRoZSBhcmFyeSByZWdFeCBhcyBzc2NhbmYgd29uJ3QgZG8gICAKICAgICAgICAgKiBpdCB3aXRoIHRoZSAlYyBtb2RpZmllciAgICAgICAgICAgICAgCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqLwoKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnJlZ0V4WzI1NV0gPSAnXDAnOwoKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICogbm93IGNvbXBpbGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5teVJlZ2V4RXJyb3IgPQogICAgICAgICAgICByZWdjb21wKCYobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdleEJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdFeCwKICAgICAgICAgICAgICAgICAgICBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOwoKICAgICAgICBpZiAobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPiAwKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTk1QQWxhcm1DYWxsYmFjayAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxvZ21hdGNoX1NjaGVkdWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0pCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbG9nbWF0Y2hDb3VudCsrOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogISEhLS0tISEhIFBVQkxJQyAhISEgLS0tICEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIHVwZGF0ZUxvZ21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmFjayBieSBzbm1wZCBhbGFybXMgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKdm9pZAp1cGRhdGVMb2dtYXRjaChpbnQgaWluZGV4KQp7CgogICAgaW50ICAgICAgICAgICAgIG1hdGNoUmVzdWx0Q29kZTsKICAgIGNoYXIgICAgICAgICAgICBpbmJ1ZlsxMDI0XTsKICAgIGNoYXIgICAgICAgICAgICBwZXJmaWxlbmFtZVsxMDI0XTsKICAgIEZJTEUgICAgICAgICAgICpwZXJmaWxlOwogICAgdW5zaWduZWQgbG9uZyAgIHBvcywgY2NvdW50ZXIsIGNvdW50ZXI7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwogICAgaW50ICAgICAgICAgICAgIHRvb2JpZzsKICAgIGludCAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gRkFMU0U7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2I7CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIHdlIGNhbiBuZXZlciBiZSBzdXJlIGlmIHRoaXMgaXMgdGhlICAKICAgICAqIGxhc3QgdGltZSB3ZSBhcmUgYmVpbmcgY2FsbGVkIGhlcmUsICAKICAgICAqIHNvIHdlIGFsd2F5cyB1cGRhdGUgYSBwZXJzaXN0ZW50ICAgICAKICAgICAqIGRhdGEgZmlsZSB3aXRoIG91ciBjdXJyZW50IGZpbGUgICAgICAKICAgICAqIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIHNucHJpbnRmKHBlcmZpbGVuYW1lLCBzaXplb2YocGVyZmlsZW5hbWUpLCAiJXMvc25tcGRfbG9nbWF0Y2hfJXMucG9zIiwKCWdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubmFtZSk7CgogICAgaWYgKGxvZ21hdGNoVGFibGVbaWluZGV4XS52aXJnaW4pIHsKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICogdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgYmVpbmcgIAogICAgICAgICAqIGNhbGxlZDsgbGV0J3MgdHJ5IHRvIGZpbmQgYW4gb2xkICAgICAKICAgICAgICAgKiBmaWxlIHBvc2l0aW9uIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQgCiAgICAgICAgICogZGF0YSBmaWxlIGFuZCByZXN0b3JlIGl0ICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKChwZXJmaWxlID0gZm9wZW4ocGVyZmlsZW5hbWUsICJyIikpKSB7CgoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVudCBkYXRhIGZpbGUgZXhpc3RzIHNvICAgCiAgICAgICAgICAgICAqIGxldCdzIHJlYWQgaXQgb3V0ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgKi8KCgogICAgICAgICAgICBwb3MgPSBjb3VudGVyID0gY2NvdW50ZXIgPSAwOwoKICAgICAgICAgICAgaWYgKGZzY2FuZihwZXJmaWxlLCAiJWx1ICVsdSAlbHUiLCAmcG9zLCAmY2NvdW50ZXIsICZjb3VudGVyKSkgewoKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICogdGhlIGRhdGEgY291bGQgYmUgcmVhZDsgbm93IGxldCdzICAgIAogICAgICAgICAgICAgICAgICogdHJ5IHRvIG9wZW4gdGhlICBsb2dmaWxlIHRvIGJlICAgICAgIAogICAgICAgICAgICAgICAgICogc2Nhbm5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgaWYgKChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSA9CiAgICAgICAgICAgICAgICAgICAgZm9wZW4obG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lLCAiciIpKSkgewoKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICogdGhlIGxvZyBmaWxlIGNvdWxkIGJlIG9wZW5lZDsgbm93ICAgIAogICAgICAgICAgICAgICAgICAgICAqIGxldCdzIHRyeSB0byBzZXQgdGhlIHBvaW50ZXIgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGlmICghZnNlZWsKICAgICAgICAgICAgICAgICAgICAgICAgKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlLCBwb3MsIFNFRUtfU0VUKSkgewoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBvaW50ZXIgY291bGQgYmUgc2V0IC0gdGhpcyBpcyAgIAogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbW9zdCB0aGF0IHdlIGNhbiBkbzogaWYgdGhlICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBmaWxlICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZSB3ZSBtdXN0IGFzc3VtZSB0aGF0IHRoZSBwb2ludGVyIAogICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGlsbCBwb2ludHMgdG8gd2hlcmUgaXQgcmVhZCB0aGUgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGUgbGFzdCB0aW1lOyBsZXQncyByZXN0b3JlIHRoZSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50TWF0Y2hDb3VudGVyID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjb3VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uZ2xvYmFsTWF0Y2hDb3VudGVyID0gY291bnRlcjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZjbG9zZShsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZjbG9zZShwZXJmaWxlKTsKICAgICAgICB9CgogICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS52aXJnaW4gPSBGQUxTRTsKICAgIH0KCgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIG5vdyB0aGUgcG9pbnRlciBhbmQgdGhlIGNvdW50ZXIgYXJlICAKICAgICAqIHNldCBlaXRoZXIgemVybyBvciByZXNldCB0byBvbGQgICAgICAKICAgICAqIHZhbHVlOyBub3cgbGV0J3MgdHJ5IHRvIHJlYWQgc29tZSAgICAKICAgICAqIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIGlmIChzdGF0KGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSwgJnNiKSA9PSAwKSB7CgogICAgICAgIGlmIChsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiA+IHNiLnN0X3NpemUpIHsKICAgICAgICAgICAgdG9vYmlnID0gVFJVRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b29iaWcgPSBGQUxTRTsKICAgICAgICB9CgogICAgICAgIGlmICgobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUgPQogICAgICAgICAgICBmb3Blbihsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWUsICJyIikpKSB7CgogICAgICAgICAgICByZXN1bHQgPQogICAgICAgICAgICAgICAgZnNlZWsobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiwgU0VFS19TRVQpOwoKICAgICAgICAgICAgaWYgKHJlc3VsdCB8fCB0b29iaWcgfHwgKGVycm5vID09IEVJTlZBTCkKICAgICAgICAgICAgICAgIHx8IGZlb2YobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpKSB7CgoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgKiB3aGVuIHdlIGFyZSBoZXJlIHRoYXQgbWVhbnMgd2UgICAgICAgCiAgICAgICAgICAgICAgICAgKiBjb3VsZCd0IHNldCB0aGUgZmlsZSBwb3NpdGlvbiBtYXliZSAgCiAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZSB3YXMgcm90YXRlZDsgbGV0J3MgcmVzZXQgICAgCiAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZXBvaW50ZXIsIGJ1dCBub3QgdGhlIGNvdW50ZXIgCiAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgKi8KCgogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSAwOwogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgZnNlZWsobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUsIDAsIFNFRUtfU0VUKTsKICAgICAgICAgICAgICAgIGFueUNoYW5nZXMgPSBUUlVFOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoZmdldHMKICAgICAgICAgICAgICAgICAgIChpbmJ1Ziwgc2l6ZW9mKGluYnVmKSwgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpKSB7CgogICAgICAgICAgICAgICAgbWF0Y2hSZXN1bHRDb2RlID0KICAgICAgICAgICAgICAgICAgICByZWdleGVjKCYobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLnJlZ2V4QnVmZmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYnVmLCAwLCBOVUxMLCBSRUdfTk9URU9MKTsKCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hSZXN1bHRDb2RlID09IDApIHsKICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uZ2xvYmFsTWF0Y2hDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubWF0Y2hDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0KICAgICAgICAgICAgICAgIGZ0ZWxsKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlKTsKICAgICAgICAgICAgZmNsb3NlKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKiBhdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzYWZlIHRoYXQgICAgCiAgICAgKiBvdXIgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzICAgICAgICAgCiAgICAgKiBzdHJhaWdodGVuZWQgb3V0IG8uay4gLSB3ZSBuZXZlciAgICAgCiAgICAgKiBrbm93IGlmIHRoaXMgaXMgdGhlIGxhc3QgdGltZSB3ZSBhcmUgCiAgICAgKiBiZWluZyBjYWxsZWQgc28gc2F2ZSB0aGUgcG9zaXRpb24gICAgCiAgICAgKiBpbiBhIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKi8KCiAgICBpZiAoYW55Q2hhbmdlcyAmJiAocGVyZmlsZSA9IGZvcGVuKHBlcmZpbGVuYW1lLCAidyIpKSkgewoKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICogby5rLiBsZXRzIHdyaXRlIG91dCBvdXIgdmFyaWFibGUgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgZnByaW50ZihwZXJmaWxlLCAiJWx1ICVsdSAlbHVcbiIsCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiwKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50TWF0Y2hDb3VudGVyLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmdsb2JhbE1hdGNoQ291bnRlcik7CgogICAgICAgIGZjbG9zZShwZXJmaWxlKTsKICAgIH0KCn0KCgp2b2lkCnVwZGF0ZUxvZ21hdGNoX1NjaGVkdWxlZCh1bnNpZ25lZCBpbnQgcmVnaXN0cmF0aW9uTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvZ21hdGNoc3RhdCAqbG9nbWF0Y2h0YWJsZSkKewoKICAgIHVwZGF0ZUxvZ21hdGNoKGxvZ21hdGNodGFibGUtPnRoaXNJbmRleCk7Cn0KCgoKCi8qCiAqIE9JRCBmdW5jdGlvbnMgCiAqLwoKdV9jaGFyICAgICAgICAgKgp2YXJfbG9nbWF0Y2hfdGFibGUoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0YXRpYyBjaGFyICAgICBtZXNzYWdlWzEwMjRdOwogICAgaW50ICAgICAgICAgICAgIGlpbmRleDsKICAgIHN0cnVjdCBsb2dtYXRjaHN0YXQgKmxvZ21hdGNoOwoKICAgIGlmICh2cC0+bWFnaWMgPT0gTE9HTUFUQ0hfSU5GTykgewogICAgICAgIGlmIChoZWFkZXJfZ2VuZXJpYyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKQogICAgICAgICAgICA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgICAgICh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kLAogICAgICAgICAgICAgbG9nbWF0Y2hDb3VudCkpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CgogICAgICAgIGlpbmRleCA9IG5hbWVbKmxlbmd0aCAtIDFdIC0gMTsKICAgICAgICBsb2dtYXRjaCA9ICZsb2dtYXRjaFRhYmxlW2lpbmRleF07CgogICAgICAgIGlmIChsb2dtYXRjaC0+bXlSZWdleEVycm9yID09IDApCiAgICAgICAgICAgIHVwZGF0ZUxvZ21hdGNoKGlpbmRleCk7CiAgICB9CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTE9HTUFUQ0hfSU5GTzoKICAgICAgICBsb25nX3JldCA9IE1BWExPR01BVENIOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9JTkRFWDoKICAgICAgICBsb25nX3JldCA9IGlpbmRleCArIDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX05BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obG9nbWF0Y2gtPm5hbWUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGxvZ21hdGNoLT5uYW1lOwoKICAgIGNhc2UgTE9HTUFUQ0hfRklMRU5BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obG9nbWF0Y2gtPmZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBsb2dtYXRjaC0+ZmlsZW5hbWU7CgogICAgY2FzZSBMT0dNQVRDSF9SRUdFWDoKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihsb2dtYXRjaC0+cmVnRXgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGxvZ21hdGNoLT5yZWdFeDsKCiAgICBjYXNlIExPR01BVENIX0dMT0JBTENUUjoKICAgIGNhc2UgTE9HTUFUQ0hfR0xPQkFMQ05UOgogICAgICAgIGxvbmdfcmV0ID0gKGxvZ21hdGNoLT5nbG9iYWxNYXRjaENvdW50ZXIpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9DVVJSRU5UQ1RSOgogICAgY2FzZSBMT0dNQVRDSF9DVVJSRU5UQ05UOgogICAgICAgIGxvbmdfcmV0ID0gKGxvZ21hdGNoLT5jdXJyZW50TWF0Y2hDb3VudGVyKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfQ09VTlRFUjoKICAgIGNhc2UgTE9HTUFUQ0hfQ09VTlQ6CiAgICAgICAgbG9uZ19yZXQgPSAobG9nbWF0Y2gtPm1hdGNoQ291bnRlcik7CiAgICAgICAgbG9nbWF0Y2gtPm1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0ZSRVE6CiAgICAgICAgbG9uZ19yZXQgPSBsb2dtYXRjaC0+ZnJlcXVlbmN5OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9FUlJPUjoKICAgICAgICBpZiAobG9nbWF0Y2gtPmZyZXF1ZW5jeSA+PSAwICYmIGxvZ21hdGNoLT5teVJlZ2V4RXJyb3IgPT0gMCkKICAgICAgICAgICAgbG9uZ19yZXQgPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXQgPSAxOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfTVNHOgoKICAgICAgICByZWdlcnJvcihsb2dtYXRjaC0+bXlSZWdleEVycm9yLCAmKGxvZ21hdGNoLT5yZWdleEJ1ZmZlciksIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lc3NhZ2UpKTsKCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obWVzc2FnZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbWVzc2FnZTsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfbG9nbWF0Y2hfdGFibGVcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAvKiBIQVZFX1JFR0VYICovCg==