Ly8gVGhpcyBzbWFsbCBwcm9ncmFtIGRvZXMgc29tZSByYXl0cmFjaW5nLiAgSXQgdGVzdHMgVmFsZ3JpbmQncyBoYW5kbGluZyBvZgovLyBGUCBvcGVyYXRpb25zLiAgSXQgYXBwYXJlbnRseSBkb2VzIGEgbG90IG9mIHRyaWdvbm9tZXRyeSBvcGVyYXRpb25zLgoKLy8gTGljZW5zaW5nOiBUaGlzIHByb2dyYW0gaXMgY2xvc2VseSBiYXNlZCBvbiB0aGUgb25lIG9mIHRoZSBzYW1lIG5hbWUgZnJvbQovLyBodHRwOi8vd3d3LmZvdXJtaWxhYi5jaC8uICBUaGUgZnJvbnQgcGFnZSBvZiB0aGF0IHNpdGUgc2F5czoKLy8KLy8gICAiRXhjZXB0IGZvciBhIGZldyBjbGVhcmx5LW1hcmtlZCBleGNlcHRpb25zLCBhbGwgdGhlIG1hdGVyaWFsIG9uIHRoaXMKLy8gICBzaXRlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBtYXkgYmUgdXNlZCBpbiBhbnkgbWFubmVyIHdpdGhvdXQKLy8gICBwZXJtaXNzaW9uLCByZXN0cmljdGlvbiwgYXR0cmlidXRpb24sIG9yIGNvbXBlbnNhdGlvbi4iCgovKiBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgaW4gdHdvIHdheXMuICBJZiBJTlRSSUcgaXMgdW5kZWZpbmVkLCBzaW4sCiAgIGNvcywgdGFuLCBldGMsIHdpbGwgYmUgdXNlZCBhcyBzdXBwbGllZCBieSA8bWF0aC5oPi4gIElmIGl0IGlzCiAgIGRlZmluZWQsIHRoZW4gdGhlIHByb2dyYW0gY2FsY3VsYXRlcyBhbGwgdGhpcyBzdHVmZiBmcm9tIGZpcnN0CiAgIHByaW5jaXBsZXMgKHNvIHRvIHNwZWFrKSBhbmQgZG9lcyBub3QgdXNlIHRoZSBsaWJjIGZhY2lsaXRpZXMuICBGb3IKICAgYmVuY2htYXJraW5nIHB1cnBvc2VzIGl0IHNlZW1zIGJldHRlciB0byBhdm9pZCB0aGUgbGliYyBzdHVmZiwgc28KICAgdGhhdCB0aGUgaW5uZXIgbG9vcHMgKHNpbiwgc3FydCkgcHJlc2VudCBhIHdvcmtsb2FkIGluZGVwZW5kZW50IG9mCiAgIGxpYmMgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBIZW5jZTogKi8KCiNkZWZpbmUgSU5UUklHIDEKCgovKgoKICAgICAgICBKb2huIFdhbGtlcidzIEZsb2F0aW5nIFBvaW50IEJlbmNobWFyaywgZGVyaXZlZCBmcm9tLi4uCgoJTWFyaW5jaGlwIEludGVyYWN0aXZlIExlbnMgRGVzaWduIFN5c3RlbQoKCQkJCSAgICAgSm9obiBXYWxrZXIgICBEZWNlbWJlciAxOTgwCgoJQnkgSm9obiBXYWxrZXIKCSAgIGh0dHA6Ly93d3cuZm91cm1pbGFiLmNoLwoKCVRoaXMgIHByb2dyYW0gbWF5IGJlIHVzZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgZnJlZWx5IGFzCglsb25nIGFzIHRoZSBvcmlnaW4gaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkLgoKCVRoaXMgIGlzICBhICBjb21wbGV0ZSAgb3B0aWNhbAlkZXNpZ24JcmF5dHJhY2luZyAgYWxnb3JpdGhtLAoJc3RyaXBwZWQgb2YgaXRzIHVzZXIgaW50ZXJmYWNlIGFuZCByZWNhc3QgaW50byBwb3J0YWJsZSBDLiAgSXQKCW5vdCBvbmx5IGRldGVybWluZXMgZXhlY3V0aW9uIHNwZWVkIG9uIGFuICBleHRyZW1lbHkgIGZsb2F0aW5nCglwb2ludAkoaW5jbHVkaW5nICAgdHJpZyAgIGZ1bmN0aW9uKQlpbnRlbnNpdmUgICByZWFsLXdvcmxkCglhcHBsaWNhdGlvbiwgaXQgIGNoZWNrcyAgYWNjdXJhY3kgIG9uICBhbiAgYWxnb3JpdGhtICB0aGF0ICBpcwoJZXhxdWlzaXRlbHkgIHNlbnNpdGl2ZQl0byAgZXJyb3JzLiAgIFRoZSAgcGVyZm9ybWFuY2Ugb2YgdGhpcwoJcHJvZ3JhbSBpcyB0eXBpY2FsbHkgZmFyIG1vcmUgIHNlbnNpdGl2ZSAgdG8gIGNoYW5nZXMgIGluICB0aGUKCWVmZmljaWVuY3kgIG9mCXRoZSAgdHJpZ29ub21ldHJpYyAgbGlicmFyeSAgcm91dGluZXMgdGhhbiB0aGUKCWF2ZXJhZ2UgZmxvYXRpbmcgcG9pbnQgcHJvZ3JhbS4KCglUaGUgYmVuY2htYXJrIG1heSBiZSBjb21waWxlZCBpbiB0d28gIG1vZGVzLiAgIElmICB0aGUJc3ltYm9sCglJTlRSSUcJaXMgIGRlZmluZWQsICBidWlsdC1pbgl0cmlnb25vbWV0cmljICBhbmQgc3F1YXJlIHJvb3QKCXJvdXRpbmVzIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGNhbGN1bGF0aW9ucy4gIFRpbWluZ3MgbWFkZSB3aXRoCiAgICAgICAgSU5UUklHICBkZWZpbmVkICByZWZsZWN0ICB0aGUgIG1hY2hpbmUncyAgYmFzaWMgZmxvYXRpbmcgcG9pbnQKCXBlcmZvcm1hbmNlIGZvciB0aGUgYXJpdGhtZXRpYyBvcGVyYXRvcnMuICBJZiAgSU5UUklHICBpcyAgbm90CglkZWZpbmVkLCAgdGhlICBzeXN0ZW0gIGxpYnJhcnkJPG1hdGguaD4gIGZ1bmN0aW9ucyAgYXJlIHVzZWQuCiAgICAgICAgUmVzdWx0cyB3aXRoIElOVFJJRyBub3QgZGVmaW5lZCByZWZsZWN0IHRoZSAgc3lzdGVtJ3MgIGxpYnJhcnkKCXBlcmZvcm1hbmNlICBhbmQvb3IgIGZsb2F0aW5nICBwb2ludCBoYXJkd2FyZSBzdXBwb3J0IGZvciB0cmlnCglmdW5jdGlvbnMgYW5kIHNxdWFyZSByb290LiAgUmVzdWx0cyB3aXRoIElOVFJJRyBkZWZpbmVkIGFyZSAgYQoJZ29vZCAgZ3VpZGUgIHRvICBnZW5lcmFsICBmbG9hdGluZyAgcG9pbnQgIHBlcmZvcm1hbmNlLCAgd2hpbGUKCXJlc3VsdHMgd2l0aCBJTlRSSUcgdW5kZWZpbmVkIGluZGljYXRlIHRoZSBwZXJmb3JtYW5jZQlvZiAgYW4KCWFwcGxpY2F0aW9uIHdoaWNoIGlzIG1hdGggZnVuY3Rpb24gaW50ZW5zaXZlLgoKCVNwZWNpYWwgIG5vdGUgIHJlZ2FyZGluZyAgZXJyb3JzIGluIGFjY3VyYWN5OiB0aGlzIHByb2dyYW0gaGFzCglnZW5lcmF0ZWQgbnVtYmVycyBpZGVudGljYWwgdG8gdGhlIGxhc3QgZGlnaXQgaXQgIGZvcm1hdHMgIGFuZAoJY2hlY2tzIG9uIHRoZSBmb2xsb3dpbmcgbWFjaGluZXMsIGZsb2F0aW5nIHBvaW50CglhcmNoaXRlY3R1cmVzLCBhbmQgbGFuZ3VhZ2VzOgoKCU1hcmluY2hpcCA5OTAwCSAgUUJBU0lDICAgIElCTSAzNzAgZG91YmxlLXByZWNpc2lvbiAoUkVBTCAqIDgpIGZvcm1hdAoKCUlCTSBQQyAvIFhUIC8gQVQgIExhdHRpY2UgQyBJRUVFIDY0IGJpdCwgODAgYml0IHRlbXBvcmFyaWVzCgkJCSAgSGlnaCBDICAgIHNhbWUsIGluIGxpbmUgODB4ODcgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgIEJBU0lDQSAgICAiRG91YmxlIHByZWNpc2lvbiIKCQkJICBRdWljayBCQVNJQyBJRUVFIGRvdWJsZSBwcmVjaXNpb24sIHNvZnR3YXJlIHJvdXRpbmVzCgoJU3VuIDMJCSAgQwkgICAgSUVFRSA2NCBiaXQsIDgwIGJpdCB0ZW1wb3JhcmllcywKCQkJCSAgICBpbi1saW5lIDY4ODgxIGNvZGUsIGluLWxpbmUgRlBBIGNvZGUuCgogICAgICAgIE1pY3JvVkFYIElJICAgICAgIEMgICAgICAgICBWYXggIkciIGZvcm1hdCBmbG9hdGluZyBwb2ludAoKCU1hY2ludG9zaCBQbHVzCSAgTVBXIEMgICAgIFNBTkUgZmxvYXRpbmcgcG9pbnQsIElFRUUgNjQgYml0IGZvcm1hdAoJCQkJICAgIGltcGxlbWVudGVkIGluIFJPTS4KCglJbmFjY3VyYWNpZXMgIHJlcG9ydGVkCWJ5ICB0aGlzICBwcm9ncmFtIHNob3VsZCBiZSB0YWtlbiBWRVJZCglTRVJJT1VTTFkgSU5ERUVELCBhcyB0aGUgcHJvZ3JhbSBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQJdG8gIGJlCglpbnZhcmlhbnQgIHVuZGVyICBjaGFuZ2VzIGluIGZsb2F0aW5nIHBvaW50IGZvcm1hdCwgYXMgbG9uZyBhcwoJdGhlIGZvcm1hdCBpcyBhIHJlY29nbmlzZWQgZG91YmxlIHByZWNpc2lvbiAgZm9ybWF0LiAgIElmICB5b3UKCWVuY291bnRlciBlcnJvcnMsIHBsZWFzZSByZW1lbWJlciB0aGF0IHRoZXkgYXJlIGp1c3QgYXMgbGlrZWx5Cgl0byAgYmUJaW4gIHRoZSAgZmxvYXRpbmcgIHBvaW50ICBlZGl0aW5nICAgbGlicmFyeSAgIG9yICAgdGhlCgl0cmlnb25vbWV0cmljICBsaWJyYXJpZXMgIGFzICBpbiAgdGhlIGxvdyBsZXZlbCBvcGVyYXRvciBjb2RlLgoKCVRoZSBiZW5jaG1hcmsgYXNzdW1lcyB0aGF0IHJlc3VsdHMgYXJlIGJhc2ljYWxseSByZWxpYWJsZSwgYW5kCglvbmx5IHRlc3RzIHRoZSBsYXN0IHJlc3VsdCBjb21wdXRlZCBhZ2FpbnN0IHRoZSByZWZlcmVuY2UuICBJZgogICAgICAgIHlvdSdyZSBydW5uaW5nIG9uICBhICBzdXNwZWN0ICBzeXN0ZW0gIHlvdSAgY2FuICBjb21waWxlICB0aGlzCglwcm9ncmFtICB3aXRoICBBQ0NVUkFDWSBkZWZpbmVkLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgdmVyc2lvbgoJd2hpY2ggZXhlY3V0ZXMgYXMgYW4gaW5maW5pdGUgbG9vcCwgcGVyZm9ybWluZyB0aGUgIHJheSAgdHJhY2UKCWFuZCBjaGVja2luZyB0aGUgcmVzdWx0cyBvbiBldmVyeSBwYXNzLiAgQWxsIGluY29ycmVjdCByZXN1bHRzCgl3aWxsIGJlIHJlcG9ydGVkLgoKCVJlcHJlc2VudGF0aXZlCXRpbWluZ3MgIGFyZSAgZ2l2ZW4gIGJlbG93LiAgIEFsbCAgaGF2ZSAgIGJlZW4KCW5vcm1hbGlzZWQgYXMgaWYgcnVuIGZvciAxMDAwIGl0ZXJhdGlvbnMuCgogIFRpbWUgaW4gc2Vjb25kcwkJICAgQ29tcHV0ZXIsIENvbXBpbGVyLCBhbmQgbm90ZXMKIE5vcm1hbCAgICAgIElOVFJJRwoKIDM0NjYuMDAgICAgNDAzMS4wMAlDb21tb2RvcmUgMTI4LCAyIE1oeiA4NTEwIHdpdGggc29mdHdhcmUgZmxvYXRpbmcKCQkJcG9pbnQuCUFiYWN1cyBTb2Z0d2FyZS9EYXRhLUJlY2tlciBTdXBlci1DIDEyOCwKCQkJdmVyc2lvbiAzLjAwLCBydW4gaW4gZmFzdCAoMiBNaHopIG1vZGUuICBOb3RlOgoJCQl0aGUgcmVzdWx0cyBnZW5lcmF0ZWQgYnkgdGhpcyBzeXN0ZW0gZGlmZmVyZWQKCQkJZnJvbSB0aGUgcmVmZXJlbmNlIHJlc3VsdHMgaW4gdGhlIDh0aCB0byAxMHRoCgkJCWRlY2ltYWwgcGxhY2UuCgogMzI5MC4wMAkJSUJNIFBDL0FUIDYgTWh6LCBNaWNyb3NvZnQvSUJNIEJBU0lDQSB2ZXJzaW9uIEEzLjAwLgogICAgICAgICAgICAgICAgICAgICAgICBSdW4gd2l0aCB0aGUgIi9kIiBzd2l0Y2gsIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50LgoKIDIxMzEuNTAJCUlCTSBQQy9BVCA2IE1oeiwgTGF0dGljZSBDIHZlcnNpb24gMi4xNCwgc21hbGwgbW9kZWwuCgkJCVRoaXMgdmVyc2lvbiBvZiBMYXR0aWNlIGNvbXBpbGVzIHN1YnJvdXRpbmUKCQkJY2FsbHMgd2hpY2ggZWl0aGVyIGRvIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50CgkJCW9yIHVzZSB0aGUgODB4ODcuICBUaGUgbWFjaGluZSBvbiB3aGljaCBJIHJhbgoJCQl0aGlzIGhhZCBhbiA4MDI4NywgYnV0IHRoZSByZXN1bHRzIHdlcmUgc28gYmFkCgkJCUkgd29uZGVyIGlmIGl0IHdhcyBiZWluZyB1c2VkLgoKIDE1OTguMDAJCU1hY2ludG9zaCBQbHVzLCBNUFcgQywgU0FORSBTb2Z0d2FyZSBmbG9hdGluZyBwb2ludC4KCiAxNTgyLjEzCQlNYXJpbmNoaXAgOTkwMCAyIE1oeiwgUUJBU0lDIGNvbXBpbGVyIHdpdGggc29mdHdhcmUKCQkJZmxvYXRpbmcgcG9pbnQuICBUaGlzIHdhcyBhIFFCQVNJQyB2ZXJzaW9uIG9mIHRoZQoJCQlwcm9ncmFtIHdoaWNoIGNvbnRhaW5lZCB0aGUgaWRlbnRpY2FsIGFsZ29yaXRobS4KCiAgNDA0LjAwCQlJQk0gUEMvQVQgNiBNaHosIE1pY3Jvc29mdCBRdWlja0JBU0lDIHZlcnNpb24gMi4wLgoJCQlTb2Z0d2FyZSBmbG9hdGluZyBwb2ludC4KCiAgMTY1LjE1CQlJQk0gUEMvQVQgNiBNaHosIE1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgc21hbGwKCQkJbW9kZWwuCVRoaXMgd2FzIGNvbXBpbGVkIHRvIGNhbGwgc3Vicm91dGluZXMgZm9yCgkJCWZsb2F0aW5nIHBvaW50LCBhbmQgdGhlIG1hY2hpbmUgY29udGFpbmVkIGFuIDgwMjg3CgkJCXdoaWNoIHdhcyB1c2VkIGJ5IHRoZSBzdWJyb3V0aW5lcy4KCiAgMTQzLjIwCQlNYWNpbnRvc2ggSUksIE1QVyBDLCBTQU5FIGNhbGxzLiAgSSB3YXMgdW5hYmxlIHRvCgkJCWRldGVybWluZSB3aGV0aGVyIFNBTkUgd2FzIHVzaW5nIHRoZSA2ODg4MSBjaGlwIG9yCgkJCW5vdC4KCiAgMTIxLjgwCQlTdW4gMy8xNjAgMTYgTWh6LCBTdW4gQy4gIENvbXBpbGVkIHdpdGggLWZzb2Z0IHN3aXRjaAoJCQl3aGljaCBleGVjdXRlcyBmbG9hdGluZyBwb2ludCBpbiBzb2Z0d2FyZS4KCiAgIDc4Ljc4ICAgICAxMTAuMTEJSUJNIFJUIFBDIChNb2RlbCA2MTUwKS4gIElCTSBBSVggMS4wIEMgY29tcGlsZXIKCQkJd2l0aCAtTyBzd2l0Y2guCgogICA3NS4yICAgICAgMjU0LjAJTWljcm9zb2Z0IFF1aWNrIEMgMS4wLCBpbi1saW5lIDgwODcgaW5zdHJ1Y3Rpb25zLAoJCQljb21waWxlZCB3aXRoIDgwMjg2IG9wdGltaXNhdGlvbiBvbi4gIChTd2l0Y2hlcwoJCQl3ZXJlIC1PbCAtRlBpODctRzIgLUFTKS4gIFNtYWxsIG1lbW9yeSBtb2RlbC4KCiAgIDY5LjUwCQlJQk0gUEMvQVQgNk1oeiwgQm9ybGFuZCBUdXJibyBCQVNJQyAxLjAuICBDb21waWxlZAogICAgICAgICAgICAgICAgICAgICAgICBpbiAiODA4NyByZXF1aXJlZCIgbW9kZSB0byBnZW5lcmF0ZSBpbi1saW5lCgkJCWNvZGUgZm9yIHRoZSBtYXRoIGNvcHJvY2Vzc29yLgoKICAgNjYuOTYJCUlCTSBQQy9BVCA2TWh6LCBNaWNyb3NvZnQgUXVpY2tCQVNJQyA0LjAuICBUaGlzCgkJCXJlbGVhc2Ugb2YgUXVpY2tCQVNJQyBjb21waWxlcyBjb2RlIGZvciB0aGUKCQkJODAyODcgbWF0aCBjb3Byb2Nlc3Nvci4KCiAgIDY2LjM2ICAgICAyMDYuMzUJSUJNIFBDL0FUIDZNaHosIE1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgc21hbGwKCQkJbW9kZWwuCVRoaXMgd2FzIGNvbXBpbGVkIHdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUKCQkJODAyODcgbWF0aCBjb3Byb2Nlc3Nvci4gIFRyaWcgZnVuY3Rpb25zIHN0aWxsIGNhbGwKCQkJbGlicmFyeSByb3V0aW5lcy4KCiAgIDYzLjA3ICAgICAyMjAuNDMJSUJNIFBDL0FULCA2TWh6LCBCb3JsYW5kIFR1cmJvIEMsIGluLWxpbmUgODA4NyBjb2RlLAoJCQlzbWFsbCBtb2RlbCwgd29yZCBhbGlnbm1lbnQsIG5vIHN0YWNrIGNoZWNraW5nLAoJCQk4MDg2IGNvZGUgbW9kZS4KCiAgIDE3LjE4CQlBcG9sbG8gRE4tMzAwMCwgMTIgTWh6IDY4MDIwIHdpdGggNjg4ODEsIGNvbXBpbGVkCgkJCXdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUgNjg4ODEgY29wcm9jZXNzb3IuCgkJCUFjY29yZGluZyB0byBBcG9sbG8sIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIGFyZSBjaG9zZW4KCQkJYXQgcnVudGltZSBiYXNlZCBvbiBjb3Byb2Nlc3NvciBwcmVzZW5jZS4gIFNpbmNlIHRoZQoJCQljb3Byb2Nlc3NvciB3YXMgcHJlc2VudCwgdGhlIGxpYnJhcnkgaXMgc3VwcG9zZWQgdG8KCQkJdXNlIGluLWxpbmUgZmxvYXRpbmcgcG9pbnQgY29kZS4KCiAgIDE1LjU1ICAgICAgMjcuNTYJVkFYc3RhdGlvbiBJSSBHUFguICBDb21waWxlZCBhbmQgZXhlY3V0ZWQgdW5kZXIKCQkJVkFYL1ZNUyBDLgoKICAgMTUuMTQgICAgICAzNy45MwlNYWNpbnRvc2ggSUksIFVuaXggc3lzdGVtIFYuICBHcmVlbiBIaWxscyA2ODAyMAoJCQlVbml4IGNvbXBpbGVyIHdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUgNjg4ODEKCQkJY29wcm9jZXNzb3IgKC1PIC1aSSBzd2l0Y2hlcykuCgogICAxMi42OQkJU3VuIDMvMTYwIDE2IE1oeiwgU3VuIEMuICBDb21waWxlZCB3aXRoIC1mc3dpdGNoLAoJCQl3aGljaCBjYWxscyBhIHN1YnJvdXRpbmUgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0CgkJCWZsb2F0aW5nIHBvaW50IHByb2Nlc3Nvci4gIFRoaXMgd2FzIHVzaW5nIHRoZSA2ODg4MS4KCiAgIDExLjc0ICAgICAgMjYuNzMJQ29tcGFxIERlc2twcm8gMzg2LCAxNiBNaHogODAzODYgd2l0aCAxNiBNaHogODAzODcuCgkJCU1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgY29tcGlsZWQgd2l0aCBpbi1saW5lCgkJCWZvciB0aGUgbWF0aCBjb3Byb2Nlc3NvciAoYnV0IG5vdCBvcHRpbWlzZWQgZm9yIHRoZQoJCQk4MDM4Ni84MDM4NykuICBUcmlnIGZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkKCQkJcm91dGluZXMuCgogICAgOC40MyAgICAgIDMwLjQ5CVN1biAzLzE2MCAxNiBNaHosIFN1biBDLiAgQ29tcGlsZWQgd2l0aCAtZjY4ODgxLAoJCQlnZW5lcmF0aW5nIGluLWxpbmUgTUM2ODg4MSBpbnN0cnVjdGlvbnMuICBUcmlnCgkJCWZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkgcm91dGluZXMuCgogICAgNi4yOSAgICAgIDI1LjE3CVN1biAzLzI2MCAyNSBNaHosIFN1biBDLiAgQ29tcGlsZWQgd2l0aCAtZjY4ODgxLAoJCQlnZW5lcmF0aW5nIGluLWxpbmUgTUM2ODg4MSBpbnN0cnVjdGlvbnMuICBUcmlnCgkJCWZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkgcm91dGluZXMuCgogICAgNC41NwkJU3VuIDMvMjYwIDI1IE1oeiwgU3VuIEZPUlRSQU4gNzcuICBDb21waWxlZCB3aXRoCgkJCS1PIC1mNjg4ODEsIGdlbmVyYXRpbmcgaW4tbGluZSBNQzY4ODgxIGluc3RydWN0aW9ucy4KCQkJVHJpZyBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkIGluLWxpbmUuICBUaGlzIHVzZWQKCQkJdGhlIEZPUlRSQU4gNzcgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSwgRkJGT1JUNzcuRi4KCiAgICA0LjAwICAgICAgMTQuMjAJU3VuMzg2aS8yNSBNaHogbW9kZWwgMjUwLCBTdW4gQyBjb21waWxlci4KCiAgICA0LjAwICAgICAgMTQuMDAJU3VuMzg2aS8yNSBNaHogbW9kZWwgMjUwLCBNZXRhd2FyZSBDLgoKICAgIDMuMTAgICAgICAxMi4wMAlDb21wYXEgMzg2LzM4NyAyNSBNaHogcnVubmluZyBTQ08gWGVuaXggMi4KCQkJQ29tcGlsZWQgd2l0aCBNZXRhd2FyZSBIaWdoQyAzODYsIG9wdGltaXplZAoJCQlmb3IgMzg2LgoKICAgIDMuMDAgICAgICAxMi4wMAlDb21wYXEgMzg2LzM4NyAyNU1IWiBvcHRpbWl6ZWQgZm9yIDM4Ni8zODcuCgogICAgMi45NiAgICAgICA1LjE3CVN1biA0LzI2MCwgU3BhcmMgUklTQyBwcm9jZXNzb3IuICBTdW4gQywKCQkJY29tcGlsZWQgd2l0aCB0aGUgLU8yIHN3aXRjaCBmb3IgZ2xvYmFsCgkJCW9wdGltaXNhdGlvbi4KCiAgICAyLjQ3CQlDT01QQVEgNDg2LzI1LCBzZWNvbmRhcnkgY2FjaGUgZGlzYWJsZWQsIEhpZ2ggQywKCQkJNDg2LzM4NywgaW5saW5lIGYucC4sIHNtYWxsIG1lbW9yeSBtb2RlbC4KCiAgICAyLjIwICAgICAgIDMuNDAJRGF0YSBHZW5lcmFsIE1vdG9yb2xhIDg4MDAwLCAxNiBNaHosIEdudSBDLgoKICAgIDEuNTYJCUNPTVBBUSA0ODYvMjUsIDEyOEsgc2Vjb25kYXJ5IGNhY2hlLCBIaWdoIEMsIDQ4Ni8zODcsCgkJCWlubGluZSBmLnAuLCBzbWFsbCBtZW1vcnkgbW9kZWwuCgogICAgMC42NiAgICAgICAxLjUwCURFQyBQbWF4LCBNaXBzIHByb2Nlc3Nvci4KCiAgICAwLjYzICAgICAgIDAuOTEJU3VuIFNwYXJjU3RhdGlvbiAyLCBTdW4gQyAoU3VuT1MgNC4xLjEpIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgLU80IG9wdGltaXNhdGlvbiBhbmQgIi91c3IvbGliL2xpYm0uaWwiIGlubGluZQoJCQlmbG9hdGluZyBwb2ludC4KCiAgICAwLjYwICAgICAgIDEuMDcJSW50ZWwgODYwIFJJU0MgcHJvY2Vzc29yLCAzMyBNaHosIEdyZWVuaGlsbHMKCQkJQyBjb21waWxlci4KCiAgICAwLjQwICAgICAgIDAuOTAJRGVjIDNNQVgsIE1JUFMgMzAwMCBwcm9jZXNzb3IsIC1PNC4KCiAgICAwLjMxICAgICAgIDAuOTAJSUJNIFJTLzYwMDAsIC1PLgoKICAgIDAuMTEyOSAgICAgMC4yMTE5CURlbGwgRGltZW5zaW9uIFhQUyBQMTMzYywgUGVudGl1bSAxMzMgTUh6LAoJCQlXaW5kb3dzIDk1LCBNaWNyb3NvZnQgVmlzdWFsIEMgNS4wLgoKICAgIDAuMDg4MyAgICAgMC4yMTY2CVNpbGljb24gR3JhcGhpY3MgSW5kaWdvsiwgTUlQUyBSNDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgMTc1IE1oeiwgIi1PMyIuCgogICAgMC4wMzUxICAgICAwLjA1NjEJRGVsbCBEaW1lbnNpb24gWFBTIFIxMDAsIFBlbnRpdW0gSUkgNDAwIE1IeiwKCQkJV2luZG93cyA5OCwgTWljcm9zb2Z0IFZpc3VhbCBDIDUuMC4KCiAgICAwLjAzMTIgICAgIDAuMDU0MglTdW4gVWx0cmEgMiwgVWx0cmFTUEFSQyBWOSwgMzAwIE1IeiwgU29sYXJpcwoJCQkyLjUuMS4KCQkJCiAgICAwLjAwODYyICAgIDAuMDEwNzQgIERlbGwgSW5zcGlyb24gOTEwMCwgUGVudGl1bSA0LCAzLjQgR0h6LCBnY2MgLU8zLgoKKi8KCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZm5kZWYgSU5UUklHCiNpbmNsdWRlIDxtYXRoLmg+CiNlbmRpZgoKI2RlZmluZSBjb3QoeCkgKDEuMCAvIHRhbih4KSkKCiNkZWZpbmUgVFJVRSAgMQojZGVmaW5lIEZBTFNFIDAKCiNkZWZpbmUgbWF4X3N1cmZhY2VzIDEwCgovKiAgTG9jYWwgdmFyaWFibGVzICAqLwoKLyogc3RhdGljIGNoYXIgdGJmclsxMzJdOyAqLwoKc3RhdGljIHNob3J0IGN1cnJlbnRfc3VyZmFjZXM7CnN0YXRpYyBzaG9ydCBwYXJheGlhbDsKCnN0YXRpYyBkb3VibGUgY2xlYXJfYXBlcnR1cmU7CgpzdGF0aWMgZG91YmxlIGFiZXJyX2xzcGhlcjsKc3RhdGljIGRvdWJsZSBhYmVycl9vc2M7CnN0YXRpYyBkb3VibGUgYWJlcnJfbGNocm9tOwoKc3RhdGljIGRvdWJsZSBtYXhfbHNwaGVyOwpzdGF0aWMgZG91YmxlIG1heF9vc2M7CnN0YXRpYyBkb3VibGUgbWF4X2xjaHJvbTsKCnN0YXRpYyBkb3VibGUgcmFkaXVzX29mX2N1cnZhdHVyZTsKc3RhdGljIGRvdWJsZSBvYmplY3RfZGlzdGFuY2U7CnN0YXRpYyBkb3VibGUgcmF5X2hlaWdodDsKc3RhdGljIGRvdWJsZSBheGlzX3Nsb3BlX2FuZ2xlOwpzdGF0aWMgZG91YmxlIGZyb21faW5kZXg7CnN0YXRpYyBkb3VibGUgdG9faW5kZXg7CgpzdGF0aWMgZG91YmxlIHNwZWN0cmFsX2xpbmVbOV07CnN0YXRpYyBkb3VibGUgc1ttYXhfc3VyZmFjZXNdWzVdOwpzdGF0aWMgZG91YmxlIG9kX3NhWzJdWzJdOwoKc3RhdGljIGNoYXIgb3V0YXJyWzhdWzgwXTsJICAgLyogQ29tcHV0ZWQgb3V0cHV0IG9mIHByb2dyYW0gZ29lcyBoZXJlICovCgppbnQgaXRlcmNvdW50OwkJCSAgIC8qIFRoZSBpdGVyYXRpb24gY291bnRlciBmb3IgdGhlIG1haW4gbG9vcAoJCQkJICAgICAgaW4gdGhlIHByb2dyYW0gaXMgbWFkZSBnbG9iYWwgc28gdGhhdAoJCQkJICAgICAgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0bwoJCQkJICAgICAgb3B0aW1pc2Ugb3V0IHRoZSBsb29wIG92ZXIgdGhlIHJheQoJCQkJICAgICAgdHJhY2luZyBjb2RlLiAqLwoKI2lmbmRlZiBJVEVSQVRJT05TCiNkZWZpbmUgSVRFUkFUSU9OUyAvKjEwMDAqLyAvKjUwMDAwMCovIDgwMDAwCiNlbmRpZgppbnQgbml0ZXIgPSBJVEVSQVRJT05TOyAJICAgLyogSXRlcmF0aW9uIGNvdW50ZXIgKi8KCnN0YXRpYyBjaGFyICpyZWZhcnJbXSA9IHsJICAgLyogUmVmZXJlbmNlIHJlc3VsdHMuICBUaGVzZSBoYXBwZW4gdG8KCQkJCSAgICAgIGJlIGRlcml2ZWQgZnJvbSBhIHJ1biBvbiBNaWNyb3NvZnQgCgkJCQkgICAgICBRdWljayBCQVNJQyBvbiB0aGUgSUJNIFBDL0FULiAqLwoKICAgICAgICAiICAgTWFyZ2luYWwgcmF5ICAgICAgICAgIDQ3LjA5NDc5MTIwOTIwICAgMC4wNDE3ODQ3MjY4MyIsCiAgICAgICAgIiAgIFBhcmF4aWFsIHJheSAgICAgICAgICA0Ny4wODM3MjE2MDI0OSAgIDAuMDQxNzc4NjQ4MjEiLAogICAgICAgICJMb25naXR1ZGluYWwgc3BoZXJpY2FsIGFiZXJyYXRpb246ICAgICAgICAtMC4wMTEwNjk2MDY3MSIsCiAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAgICAwLjA1MzA2NzQ5OTA3IiwKICAgICAgICAiT2ZmZW5zZSBhZ2FpbnN0IHNpbmUgY29uZGl0aW9uIChjb21hKTogICAgIDAuMDAwMDg5NTQ3NjEiLAogICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgICAgMC4wMDI1MDAwMDAwMCIsCiAgICAgICAgIkF4aWFsIGNocm9tYXRpYyBhYmVycmF0aW9uOiAgICAgICAgICAgICAgICAwLjAwNDQ4MjI5MDMyIiwKICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICAgIDAuMDUzMDY3NDk5MDciCn07CgovKiBUaGUJdGVzdCAgY2FzZSAgdXNlZCAgaW4gIHRoaXMgcHJvZ3JhbSBpcyB0aGUgIGRlc2lnbiBmb3IgYSA0IGluY2gKICAgYWNocm9tYXRpYyB0ZWxlc2NvcGUgIG9iamVjdGl2ZSAgdXNlZCAgYXMgIHRoZSAgZXhhbXBsZSAgaW4gIFd5bGQncwogICBjbGFzc2ljICB3b3JrICBvbiAgcmF5ICB0cmFjaW5nIGJ5IGhhbmQsIGdpdmVuIGluIEFtYXRldXIgVGVsZXNjb3BlCiAgIE1ha2luZywgVm9sdW1lIDMuICAqLwoKc3RhdGljIGRvdWJsZSB0ZXN0Y2FzZVs0XVs0XSA9IHsKCXsyNy4wNSwgMS41MTM3LCA2My42LCAwLjUyfSwKCXstMTYuNjgsIDEsIDAsIDAuMTM4fSwKCXstMTYuNjgsIDEuNjE2NCwgMzYuNywgMC4zOH0sCgl7LTc4LjEsIDEsIDAsIDB9Cn07CgovKiAgSW50ZXJuYWwgdHJpZyBmdW5jdGlvbnMgKHVzZWQgb25seSBpZiBJTlRSSUcgaXMgIGRlZmluZWQpLgkgVGhlc2UKICAgIHN0YW5kYXJkICBmdW5jdGlvbnMgIG1heSBiZSBlbmFibGVkIHRvIG9idGFpbiB0aW1pbmdzIHRoYXQgcmVmbGVjdAogICAgdGhlIG1hY2hpbmUncyBmbG9hdGluZyBwb2ludCBwZXJmb3JtYW5jZSByYXRoZXIgdGhhbiB0aGUgc3BlZWQgIG9mCiAgICBpdHMgdHJpZyBmdW5jdGlvbiBldmFsdWF0aW9uLiAgKi8KCiNpZmRlZiBJTlRSSUcKCi8qICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHNob3VsZCBrZWVwIHlvdSBmcm9tIGdldHRpbmcgaW50cm8gdHJvdWJsZQogICAgd2l0aCBjb21waWxlcnMgd2hpY2ggZG9uJ3QgbGV0IHlvdSByZWRlZmluZSBpbnRyaW5zaWMgZnVuY3Rpb25zLiAgKi8KCiNkZWZpbmUgc2luIElfc2luCiNkZWZpbmUgY29zIElfY29zCiNkZWZpbmUgdGFuIElfdGFuCiNkZWZpbmUgc3FydCBJX3NxcnQKI2RlZmluZSBhdGFuIElfYXRhbgojZGVmaW5lIGF0YW4yIElfYXRhbjIKI2RlZmluZSBhc2luIElfYXNpbgoKI2RlZmluZSBmYWJzKHgpICAoKHggPCAwLjApID8gLXggOiB4KQoKI2RlZmluZSBwaWMgMy4xNDE1OTI2NTM1ODk3OTMyCgovKiAgQ29tbW9ubHkgdXNlZCBjb25zdGFudHMgICovCgpzdGF0aWMgZG91YmxlIHBpID0gcGljLAoJdHdvcGkgPXBpYyAqIDIuMCwKCXBpb3ZlcjQgPSBwaWMgLyA0LjAsCglmb3Vyb3ZlcnBpID0gNC4wIC8gcGljLAoJcGlvdmVyMiA9IHBpYyAvIDIuMDsKCi8qICBDb2VmZmljaWVudHMgZm9yIEFUQU4gZXZhbHVhdGlvbiAgKi8KCnN0YXRpYyBkb3VibGUgYXRhbmNbXSA9IHsKCTAuMCwKCTAuNDYzNjQ3NjA5MDAwODA2MTE2NSwKCTAuNzg1Mzk4MTYzMzk3NDQ4MzA5NCwKCTAuOTgyNzkzNzIzMjQ3MzI5MDY3MTQsCgkxLjEwNzE0ODcxNzc5NDA5MDUwMjIsCgkxLjE5MDI4OTk0OTY4MjUzMTczMjIsCgkxLjI0OTA0NTc3MjM5ODI1NDQyNjIsCgkxLjI5MjQ5NjY2Nzc4OTc4NTI2NzMsCgkxLjMyNTgxNzY2MzY2ODAzMjQ2NDQKfTsKCi8qICBhaW50KHgpCSAgUmV0dXJuIGludGVnZXIgcGFydCBvZiBudW1iZXIuICBUcnVuY2F0ZXMgdG93YXJkcyAwCSAqLwoKZG91YmxlIGFpbnQoeCkKZG91YmxlIHg7CnsKCWxvbmcgbDsKCgkvKiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBjYW5ub3QgaGFuZGxlIHRoZSBmdWxsIGZsb2F0aW5nIHBvaW50CgkgICAgbnVtYmVyIHJhbmdlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW4gdGhlIG1hY2hpbmUtZGVwZW5kZW50CgkgICAgZmxvYXRpbmcgcG9pbnQgbGlicmFyeSEgICovCgoJbCA9IHg7CglpZiAoKGludCkoLTAuNSkgIT0gMCAgJiYgIGwgPCAwICkKCSAgIGwrKzsKCXggPSBsOwoJcmV0dXJuIHg7Cn0KCi8qICBzaW4oeCkJICBSZXR1cm4gc2luZSwgeCBpbiByYWRpYW5zICAqLwoKc3RhdGljIGRvdWJsZSBzaW4oeCkKZG91YmxlIHg7CnsKCWludCBzaWduOwoJZG91YmxlIHksIHIsIHo7CgoJeCA9ICgoKHNpZ249ICh4IDwgMC4wKSkgIT0gMCkgPyAteDogeCk7CgoJaWYgKHggPiB0d29waSkKCSAgIHggLT0gKGFpbnQoeCAvIHR3b3BpKSAqIHR3b3BpKTsKCglpZiAoeCA+IHBpKSB7CgkgICB4IC09IHBpOwoJICAgc2lnbiA9ICFzaWduOwoJfQoKCWlmICh4ID4gcGlvdmVyMikKCSAgIHggPSBwaSAtIHg7CgoJaWYgKHggPCBwaW92ZXI0KSB7CgkgICB5ID0geCAqIGZvdXJvdmVycGk7CgkgICB6ID0geSAqIHk7CgkgICByID0geSAqICgoKCgoKCgtMC4yMDIyNTMxMjkyOTNFLTEzICogeiArIDAuNjk0ODE1MjAzNTA1MjJFLTExKSAqIHogLQoJICAgICAgMC4xNzU3MjQ3NDE3NjE3MDgwNkUtOCkgKiB6ICsgMC4zMTMzNjE2ODg5MTczMjUzNDhFLTYpICogeiAtCgkgICAgICAwLjM2NTc2MjA0MTgyMTQ2NDAwMUUtNCkgKiB6ICsgMC4yNDkwMzk0NTcwMTkyNzE2MjhFLTIpICogeiAtCgkgICAgICAwLjA4MDc0NTUxMjE4ODI4MDc4MTUpICogeiArIDAuNzg1Mzk4MTYzMzk3NDQ4MzEwKTsKCX0gZWxzZSB7CgkgICB5ID0gKHBpb3ZlcjIgLSB4KSAqIGZvdXJvdmVycGk7CgkgICB6ID0geSAqIHk7CgkgICByID0gKCgoKCgoLTAuMzg1Nzc2MjAzNzJFLTEyICogeiArIDAuMTE1MDA0OTcwMjQyNjNFLTkpICogeiAtCgkgICAgICAwLjI0NjExMzYzODI2MzcwMDVFLTcpICogeiArIDAuMzU5MDg2MDQ0NTg4NTgxOTUzRS01KSAqIHogLQoJICAgICAgMC4zMjU5OTE4ODY5MjY2ODc1NTBFLTMpICogeiArIDAuMDE1ODU0MzQ0MjQzODE1NDEwOSkgKiB6IC0KCSAgICAgIDAuMzA4NDI1MTM3NTM0MDQyNDUyKSAqIHogKyAxLjA7Cgl9CglyZXR1cm4gc2lnbiA/IC1yIDogcjsKfQoKLyogIGNvcyh4KQkgIFJldHVybiBjb3NpbmUsIHggaW4gcmFkaWFucywgYnkgaWRlbnRpdHkgICovCgpzdGF0aWMgZG91YmxlIGNvcyh4KQpkb3VibGUgeDsKewoJeCA9ICh4IDwgMC4wKSA/IC14IDogeDsKCWlmICh4ID4gdHdvcGkpCQkgICAgICAvKiBEbyByYW5nZSByZWR1Y3Rpb24gaGVyZSB0byBsaW1pdCAqLwoJICAgeCA9IHggLSAoYWludCh4IC8gdHdvcGkpICogdHdvcGkpOyAvKiByb3VuZG9mZiBvbiBhZGQgb2YgUEkvMiAgICAqLwoJcmV0dXJuIHNpbih4ICsgcGlvdmVyMik7Cn0KCi8qICB0YW4oeCkJICBSZXR1cm4gdGFuZ2VudCwgeCBpbiByYWRpYW5zLCBieSBpZGVudGl0eSAgKi8KCnN0YXRpYyBkb3VibGUgdGFuKHgpCmRvdWJsZSB4Owp7CglyZXR1cm4gc2luKHgpIC8gY29zKHgpOwp9CgovKiAgc3FydCh4KQkgIFJldHVybiBzcXVhcmUgcm9vdC4gIEluaXRpYWwgZ3Vlc3MsIHRoZW4gTmV3dG9uLQoJCSAgUmFwaHNvbiByZWZpbmVtZW50ICAqLwoKZG91YmxlIHNxcnQoeCkKZG91YmxlIHg7CnsKCWRvdWJsZSBjLCBjbCwgeTsKCWludCBuOwoKCWlmICh4ID09IDAuMCkKCSAgIHJldHVybiAwLjA7CgoJaWYgKHggPCAwLjApIHsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbkdvb2Qgd29yayEgIFlvdSB0cmllZCB0byB0YWtlIHRoZSBzcXVhcmUgcm9vdCBvZiAlZyIsCgkgICAgIHgpOwoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxudW5mb3J0dW5hdGVseSwgdGhhdCBpcyB0b28gY29tcGxleCBmb3IgbWUgdG8gaGFuZGxlLlxuIik7CgkgICBleGl0KDEpOwoJfQoKCXkgPSAoMC4xNTQxMTYgKyAxLjg5Mzg3MiAqIHgpIC8gKDEuMCArIDEuMDQ3OTg4ICogeCk7CgoJYyA9ICh5IC0geCAvIHkpIC8gMi4wOwoJY2wgPSAwLjA7Cglmb3IgKG4gPSA1MDsgYyAhPSBjbCAmJiBuLS07KSB7CgkgICB5ID0geSAtIGM7CgkgICBjbCA9IGM7CgkgICBjID0gKHkgLSB4IC8geSkgLyAyLjA7Cgl9CglyZXR1cm4geTsKfQoKLyogIGF0YW4oeCkJICBSZXR1cm4gYXJjdGFuZ2VudCBpbiByYWRpYW5zLAoJCSAgcmFuZ2UgLXBpLzIgdG8gcGkvMiAgKi8KCnN0YXRpYyBkb3VibGUgYXRhbih4KQpkb3VibGUgeDsKewoJaW50IHNpZ24sIGwsIHk7Cglkb3VibGUgYSwgYiwgejsKCgl4ID0gKCgoc2lnbiA9ICh4IDwgMC4wKSkgIT0gMCkgPyAteCA6IHgpOwoJbCA9IDA7CgoJaWYgKHggPj0gNC4wKSB7CgkgICBsID0gLTE7CgkgICB4ID0gMS4wIC8geDsKCSAgIHkgPSAwOwoJICAgZ290byBhdGw7Cgl9IGVsc2UgewoJICAgaWYgKHggPCAwLjI1KSB7CgkgICAgICB5ID0gMDsKCSAgICAgIGdvdG8gYXRsOwoJICAgfQoJfQoKCXkgPSBhaW50KHggLyAwLjUpOwoJeiA9IHkgKiAwLjU7Cgl4ID0gKHggLSB6KSAvICh4ICogeiArIDEpOwoKYXRsOgoJeiA9IHggKiB4OwoJYiA9ICgoKCg4OTMwMjUuMCAqIHogKyA0OTExNjM3NS4wKSAqIHogKyA0MjU2NzUyNTAuMCkgKiB6ICsKCSAgICAxMjc3MDI1NzUwLjApICogeiArIDE1NTA2NzQxMjUuMCkgKiB6ICsgNjU0NzI5MDc1LjA7CglhID0gKCgoMTM4NTI1NzUuMCAqIHogKyAyMTY2MDIxMDAuMCkgKiB6ICsgODkxMDgwMTkwLjApICogeiArCgkgICAgMTMzMjQzMTEwMC4wKSAqIHogKyA2NTQ3MjkwNzUuMDsKCWEgPSAoYSAvIGIpICogeCArIGF0YW5jW3ldOwoJaWYgKGwpCgkgICBhPXBpb3ZlcjIgLSBhOwoJcmV0dXJuIHNpZ24gPyAtYSA6IGE7Cn0KCi8qICBhdGFuMih5LHgpCSAgUmV0dXJuIGFyY3RhbmdlbnQgaW4gcmFkaWFucyBvZiB5L3gsCgkJICByYW5nZSAtcGkgdG8gcGkgICovCgpzdGF0aWMgZG91YmxlIGF0YW4yKHksIHgpCmRvdWJsZSB5LCB4Owp7Cglkb3VibGUgdGVtcDsKCglpZiAoeCA9PSAwLjApIHsKCSAgIGlmICh5ID09IDAuMCkgICAvKiAgU3BlY2lhbCBjYXNlOiBhdGFuMigwLDApID0gMCAgKi8KCSAgICAgIHJldHVybiAwLjA7CgkgICBlbHNlIGlmICh5ID4gMCkKCSAgICAgIHJldHVybiBwaW92ZXIyOwoJICAgZWxzZQoJICAgICAgcmV0dXJuIC1waW92ZXIyOwoJfQoJdGVtcCA9IGF0YW4oeSAvIHgpOwoJaWYgKHggPCAwLjApIHsKCSAgIGlmICh5ID49IDAuMCkKCSAgICAgIHRlbXAgKz0gcGljOwoJICAgZWxzZQoJICAgICAgdGVtcCAtPSBwaWM7Cgl9CglyZXR1cm4gdGVtcDsKfQoKLyogIGFzaW4oeCkJICBSZXR1cm4gYXJjc2luZSBpbiByYWRpYW5zIG9mIHggICovCgpzdGF0aWMgZG91YmxlIGFzaW4oeCkKZG91YmxlIHg7CnsKCWlmIChmYWJzKHgpPjEuMCkgewoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxuSW52ZXJzZSB0cmlnIGZ1bmN0aW9ucyBsb3NlIG11Y2ggb2YgdGhlaXIgZ2xvc3Mgd2hlbiIpOwoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxudGhlaXIgYXJndW1lbnRzIGFyZSBncmVhdGVyIHRoYW4gMSwgc3VjaCBhcyB0aGUiKTsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbnZhbHVlICVnIHlvdSBwYXNzZWQuXG4iLCB4KTsKCSAgIGV4aXQoMSk7Cgl9CglyZXR1cm4gYXRhbjIoeCwgc3FydCgxIC0geCAqIHgpKTsKfQojZW5kaWYKCi8qCSAgICAgIENhbGN1bGF0ZSBwYXNzYWdlIHRocm91Z2ggc3VyZmFjZQoKCSAgICAgIElmICB0aGUgdmFyaWFibGUgUEFSQVhJQUwgaXMgdHJ1ZSwgdGhlIHRyYWNlIHRocm91Z2ggdGhlCgkgICAgICBzdXJmYWNlIHdpbGwgYmUgZG9uZSB1c2luZyB0aGUgcGFyYXhpYWwgIGFwcHJveGltYXRpb25zLgoJICAgICAgT3RoZXJ3aXNlLCAgdGhlIG5vcm1hbCB0cmlnb25vbWV0cmljIHRyYWNlIHdpbGwgYmUgZG9uZS4KCgkgICAgICBUaGlzIHJvdXRpbmUgdGFrZXMgdGhlIGZvbGxvd2luZyBpbnB1dHM6CgoJICAgICAgUkFESVVTX09GX0NVUlZBVFVSRQkgIFJhZGl1cyBvZiBjdXJ2YXR1cmUgb2Ygc3VyZmFjZQoJCQkJCSAgYmVpbmcgY3Jvc3NlZC4gIElmIDAsIHN1cmZhY2UgaXMKCQkJCQkgIHBsYW5lLgoKCSAgICAgIE9CSkVDVF9ESVNUQU5DRQkJICBEaXN0YW5jZSBvZiBvYmplY3QgZm9jdXMgZnJvbQoJCQkJCSAgbGVucyB2ZXJ0ZXguCUlmIDAsIGluY29taW5nCgkJCQkJICByYXlzIGFyZSBwYXJhbGxlbCBhbmQKCQkJCQkgIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzcGVjaWZpZWQ6CgoJICAgICAgUkFZX0hFSUdIVAkJICBIZWlnaHQgb2YgcmF5IGZyb20gYXhpcy4gIE9ubHkKCQkJCQkgIHJlbGV2YW50IGlmIE9CSkVDVC5ESVNUQU5DRSA9PSAwCgoJICAgICAgQVhJU19TTE9QRV9BTkdMRQkJICBBbmdsZSBpbmNvbWluZyByYXkgbWFrZXMgd2l0aCBheGlzCgkJCQkJICBhdCBpbnRlcmNlcHQKCgkgICAgICBGUk9NX0lOREVYCQkgIFJlZnJhY3RpdmUgaW5kZXggb2YgbWVkaXVtIGJlaW5nIGxlZnQKCgkgICAgICBUT19JTkRFWAkJCSAgUmVmcmFjdGl2ZSBpbmRleCBvZiBtZWRpdW0gYmVpbmcKCQkJCQkgIGVudGVyZWQuCgoJICAgICAgVGhlIG91dHB1dHMgYXJlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgoKCSAgICAgIE9CSkVDVF9ESVNUQU5DRQkJICBEaXN0YW5jZSBmcm9tIHZlcnRleCB0byBvYmplY3QgZm9jdXMKCQkJCQkgIGFmdGVyIHJlZnJhY3Rpb24uCgoJICAgICAgQVhJU19TTE9QRV9BTkdMRQkJICBBbmdsZSBpbmNvbWluZyByYXkgbWFrZXMgd2l0aCBheGlzCgkJCQkJICBhdCBpbnRlcmNlcHQgYWZ0ZXIgcmVmcmFjdGlvbi4KCiovCgpzdGF0aWMgdm9pZCB0cmFuc2l0X3N1cmZhY2UoKSB7Cglkb3VibGUgaWFuZywJCSAgIC8qIEluY2lkZW5jZSBhbmdsZSAqLwoJICAgICAgIHJhbmcsCQkgICAvKiBSZWZyYWN0aW9uIGFuZ2xlICovCgkgICAgICAgaWFuZ19zaW4sCSAgIC8qIEluY2lkZW5jZSBhbmdsZSBzaW4gKi8KCSAgICAgICByYW5nX3NpbiwJICAgLyogUmVmcmFjdGlvbiBhbmdsZSBzaW4gKi8KCSAgICAgICBvbGRfYXhpc19zbG9wZV9hbmdsZSwgc2FnaXR0YTsKCglpZiAocGFyYXhpYWwpIHsKCSAgIGlmIChyYWRpdXNfb2ZfY3VydmF0dXJlICE9IDAuMCkgewoJICAgICAgaWYgKG9iamVjdF9kaXN0YW5jZSA9PSAwLjApIHsKCQkgYXhpc19zbG9wZV9hbmdsZSA9IDAuMDsKCQkgaWFuZ19zaW4gPSByYXlfaGVpZ2h0IC8gcmFkaXVzX29mX2N1cnZhdHVyZTsKCSAgICAgIH0gZWxzZQoJCSBpYW5nX3NpbiA9ICgob2JqZWN0X2Rpc3RhbmNlIC0KCQkgICAgcmFkaXVzX29mX2N1cnZhdHVyZSkgLyByYWRpdXNfb2ZfY3VydmF0dXJlKSAqCgkJICAgIGF4aXNfc2xvcGVfYW5nbGU7CgoJICAgICAgcmFuZ19zaW4gPSAoZnJvbV9pbmRleCAvIHRvX2luZGV4KSAqCgkJIGlhbmdfc2luOwoJICAgICAgb2xkX2F4aXNfc2xvcGVfYW5nbGUgPSBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgICAgYXhpc19zbG9wZV9hbmdsZSA9IGF4aXNfc2xvcGVfYW5nbGUgKwoJCSBpYW5nX3NpbiAtIHJhbmdfc2luOwoJICAgICAgaWYgKG9iamVjdF9kaXN0YW5jZSAhPSAwLjApCgkJIHJheV9oZWlnaHQgPSBvYmplY3RfZGlzdGFuY2UgKiBvbGRfYXhpc19zbG9wZV9hbmdsZTsKCSAgICAgIG9iamVjdF9kaXN0YW5jZSA9IHJheV9oZWlnaHQgLyBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgICAgcmV0dXJuOwoJICAgfQoJICAgb2JqZWN0X2Rpc3RhbmNlID0gb2JqZWN0X2Rpc3RhbmNlICogKHRvX2luZGV4IC8gZnJvbV9pbmRleCk7CgkgICBheGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZSAqIChmcm9tX2luZGV4IC8gdG9faW5kZXgpOwoJICAgcmV0dXJuOwoJfQoKCWlmIChyYWRpdXNfb2ZfY3VydmF0dXJlICE9IDAuMCkgewoJICAgaWYgKG9iamVjdF9kaXN0YW5jZSA9PSAwLjApIHsKCSAgICAgIGF4aXNfc2xvcGVfYW5nbGUgPSAwLjA7CgkgICAgICBpYW5nX3NpbiA9IHJheV9oZWlnaHQgLyByYWRpdXNfb2ZfY3VydmF0dXJlOwoJICAgfSBlbHNlIHsKCSAgICAgIGlhbmdfc2luID0gKChvYmplY3RfZGlzdGFuY2UgLQoJCSByYWRpdXNfb2ZfY3VydmF0dXJlKSAvIHJhZGl1c19vZl9jdXJ2YXR1cmUpICoKCQkgc2luKGF4aXNfc2xvcGVfYW5nbGUpOwoJICAgfQoJICAgaWFuZyA9IGFzaW4oaWFuZ19zaW4pOwoJICAgcmFuZ19zaW4gPSAoZnJvbV9pbmRleCAvIHRvX2luZGV4KSAqCgkgICAgICBpYW5nX3NpbjsKCSAgIG9sZF9heGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZTsKCSAgIGF4aXNfc2xvcGVfYW5nbGUgPSBheGlzX3Nsb3BlX2FuZ2xlICsKCSAgICAgIGlhbmcgLSBhc2luKHJhbmdfc2luKTsKCSAgIHNhZ2l0dGEgPSBzaW4oKG9sZF9heGlzX3Nsb3BlX2FuZ2xlICsgaWFuZykgLyAyLjApOwoJICAgc2FnaXR0YSA9IDIuMCAqIHJhZGl1c19vZl9jdXJ2YXR1cmUqc2FnaXR0YSpzYWdpdHRhOwoJICAgb2JqZWN0X2Rpc3RhbmNlID0gKChyYWRpdXNfb2ZfY3VydmF0dXJlICogc2luKAoJICAgICAgb2xkX2F4aXNfc2xvcGVfYW5nbGUgKyBpYW5nKSkgKgoJICAgICAgY290KGF4aXNfc2xvcGVfYW5nbGUpKSArIHNhZ2l0dGE7CgkgICByZXR1cm47Cgl9CgoJcmFuZyA9IC1hc2luKChmcm9tX2luZGV4IC8gdG9faW5kZXgpICoKCSAgIHNpbihheGlzX3Nsb3BlX2FuZ2xlKSk7CglvYmplY3RfZGlzdGFuY2UgPSBvYmplY3RfZGlzdGFuY2UgKiAoKHRvX2luZGV4ICoKCSAgIGNvcygtcmFuZykpIC8gKGZyb21faW5kZXggKgoJICAgY29zKGF4aXNfc2xvcGVfYW5nbGUpKSk7CglheGlzX3Nsb3BlX2FuZ2xlID0gLXJhbmc7Cn0KCi8qICBQZXJmb3JtIHJheSB0cmFjZSBpbiBzcGVjaWZpYyBzcGVjdHJhbCBsaW5lICAqLwoKc3RhdGljIHZvaWQgdHJhY2VfbGluZShsaW5lLCByYXlfaCkKaW50IGxpbmU7CmRvdWJsZSByYXlfaDsKewoJaW50IGk7CgoJb2JqZWN0X2Rpc3RhbmNlID0gMC4wOwoJcmF5X2hlaWdodCA9IHJheV9oOwoJZnJvbV9pbmRleCA9IDEuMDsKCglmb3IgKGkgPSAxOyBpIDw9IGN1cnJlbnRfc3VyZmFjZXM7IGkrKykgewoJICAgcmFkaXVzX29mX2N1cnZhdHVyZSA9IHNbaV1bMV07CgkgICB0b19pbmRleCA9IHNbaV1bMl07CgkgICBpZiAodG9faW5kZXggPiAxLjApCgkgICAgICB0b19pbmRleCA9IHRvX2luZGV4ICsgKChzcGVjdHJhbF9saW5lWzRdIC0KCQkgc3BlY3RyYWxfbGluZVtsaW5lXSkgLwoJCSAoc3BlY3RyYWxfbGluZVszXSAtIHNwZWN0cmFsX2xpbmVbNl0pKSAqICgoc1tpXVsyXSAtIDEuMCkgLwoJCSBzW2ldWzNdKTsKCSAgIHRyYW5zaXRfc3VyZmFjZSgpOwoJICAgZnJvbV9pbmRleCA9IHRvX2luZGV4OwoJICAgaWYgKGkgPCBjdXJyZW50X3N1cmZhY2VzKQoJICAgICAgb2JqZWN0X2Rpc3RhbmNlID0gb2JqZWN0X2Rpc3RhbmNlIC0gc1tpXVs0XTsKCX0KfQoKLyogIEluaXRpYWxpc2Ugd2hlbiBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgICovCgppbnQgbWFpbihhcmdjLCBhcmd2KQppbnQgYXJnYzsKY2hhciAqYXJndltdOwp7CglpbnQgaSwgaiwgaywgZXJyb3JzOwoJZG91YmxlIG9kX2ZsaW5lLCBvZF9jbGluZTsKI2lmZGVmIEFDQ1VSQUNZCglsb25nIHBhc3NlczsKI2VuZGlmCgoJc3BlY3RyYWxfbGluZVsxXSA9IDc2MjEuMDsJIC8qIEEgKi8KCXNwZWN0cmFsX2xpbmVbMl0gPSA2ODY5Ljk1NTsJIC8qIEIgKi8KCXNwZWN0cmFsX2xpbmVbM10gPSA2NTYyLjgxNjsJIC8qIEMgKi8KCXNwZWN0cmFsX2xpbmVbNF0gPSA1ODk1Ljk0NDsJIC8qIEQgKi8KCXNwZWN0cmFsX2xpbmVbNV0gPSA1MjY5LjU1NzsJIC8qIEUgKi8KCXNwZWN0cmFsX2xpbmVbNl0gPSA0ODYxLjM0NDsJIC8qIEYgKi8KICAgICAgICBzcGVjdHJhbF9saW5lWzddID0gNDM0MC40Nzc7ICAgICAvKiBHJyovCglzcGVjdHJhbF9saW5lWzhdID0gMzk2OC40OTQ7CSAvKiBIICovCgoJLyogUHJvY2VzcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYXJndW1lbnQsIGlmIG9uZSBpcyBzdXBwbGllZC4gKi8KCglpZiAoYXJnYyA+IDEpIHsKCSAgIG5pdGVyID0gYXRvaShhcmd2WzFdKTsKICAgICAgICAgICBpZiAoKmFyZ3ZbMV0gPT0gJy0nIHx8IG5pdGVyIDwgMSkgewogICAgICAgICAgICAgIHByaW50ZigiVGhpcyBpcyBKb2huIFdhbGtlcidzIGZsb2F0aW5nIHBvaW50IGFjY3VyYWN5IGFuZFxuIik7CiAgICAgICAgICAgICAgcHJpbnRmKCJwZXJmb3JtYW5jZSBiZW5jaG1hcmsgcHJvZ3JhbS4gIFlvdSBjYWxsIGl0IHdpdGhcbiIpOwogICAgICAgICAgICAgIHByaW50ZigiXG5mYmVuY2ggPGl0ZXJjb3VudD5cblxuIik7CiAgICAgICAgICAgICAgcHJpbnRmKCJ3aGVyZSA8aXRlcmNvdW50PiBpcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnNcbiIpOwogICAgICAgICAgICAgIHByaW50ZigidG8gYmUgZXhlY3V0ZWQuICBBcmNoaXZhbCB0aW1pbmdzIHNob3VsZCBiZSBtYWRlXG4iKTsKICAgICAgICAgICAgICBwcmludGYoIndpdGggdGhlIGl0ZXJhdGlvbiBjb3VudCBzZXQgc28gdGhhdCByb3VnaGx5IGZpdmVcbiIpOwogICAgICAgICAgICAgIHByaW50ZigibWludXRlcyBvZiBleGVjdXRpb24gaXMgdGltZWQuXG4iKTsKCSAgICAgIGV4aXQoMCk7CgkgICB9Cgl9CgoJLyogTG9hZCB0ZXN0IGNhc2UgaW50byB3b3JraW5nIGFycmF5ICovCgoJY2xlYXJfYXBlcnR1cmUgPSA0LjA7CgljdXJyZW50X3N1cmZhY2VzID0gNDsKCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X3N1cmZhY2VzOyBpKyspCgkgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQoJICAgICAgc1tpICsgMV1baiArIDFdID0gdGVzdGNhc2VbaV1bal07CgojaWZkZWYgQUNDVVJBQ1kKICAgICAgICBwcmludGYoIkJlZ2lubmluZyBleGVjdXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgYWNjdXJhY3kgdGVzdC4uLlxuIik7CglwYXNzZXMgPSAwOwojZWxzZQogICAgICAgIHByaW50ZigiUmVhZHkgdG8gYmVnaW4gSm9obiBXYWxrZXIncyBmbG9hdGluZyBwb2ludCBhY2N1cmFjeVxuIik7CiAgICAgICAgcHJpbnRmKCJhbmQgcGVyZm9ybWFuY2UgYmVuY2htYXJrLiAgJWQgaXRlcmF0aW9ucyB3aWxsIGJlIG1hZGUuXG5cbiIsCgkgICBuaXRlcik7CgogICAgICAgIHByaW50ZigiXG5NZWFzdXJlZCBydW4gdGltZSBpbiBzZWNvbmRzIHNob3VsZCBiZSBkaXZpZGVkIGJ5ICUuZlxuIiwgbml0ZXIgLyAxMDAwLjApOwogICAgICAgIHByaW50ZigidG8gbm9ybWFsaXNlIGZvciByZXBvcnRpbmcgcmVzdWx0cy4gIEZvciBhcmNoaXZhbCByZXN1bHRzLFxuIik7CiAgICAgICAgcHJpbnRmKCJhZGp1c3QgaXRlcmF0aW9uIGNvdW50IHNvIHRoZSBiZW5jaG1hcmsgcnVucyBhYm91dCBmaXZlIG1pbnV0ZXMuXG5cbiIpOwoKICAgICAgICAvL3ByaW50ZigiUHJlc3MgcmV0dXJuIHRvIGJlZ2luIGJlbmNobWFyazoiKTsKCS8vZ2V0cyh0YmZyKTsKI2VuZGlmCgoJLyogUGVyZm9ybSByYXkgdHJhY2UgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICovCgojaWZkZWYgQUNDVVJBQ1kKCXdoaWxlIChUUlVFKSB7CgkgICBwYXNzZXMrKzsKCSAgIGlmICgocGFzc2VzICUgMTAwTCkgPT0gMCkgewogICAgICAgICAgICAgIHByaW50ZigiUGFzcyAlbGQuXG4iLCBwYXNzZXMpOwoJICAgfQojZWxzZQoJZm9yIChpdGVyY291bnQgPSAwOyBpdGVyY291bnQgPCBuaXRlcjsgaXRlcmNvdW50KyspIHsKI2VuZGlmCgoJICAgZm9yIChwYXJheGlhbCA9IDA7IHBhcmF4aWFsIDw9IDE7IHBhcmF4aWFsKyspIHsKCgkgICAgICAvKiBEbyBtYWluIHRyYWNlIGluIEQgbGlnaHQgKi8KCgkgICAgICB0cmFjZV9saW5lKDQsIGNsZWFyX2FwZXJ0dXJlIC8gMi4wKTsKCSAgICAgIG9kX3NhW3BhcmF4aWFsXVswXSA9IG9iamVjdF9kaXN0YW5jZTsKCSAgICAgIG9kX3NhW3BhcmF4aWFsXVsxXSA9IGF4aXNfc2xvcGVfYW5nbGU7CgkgICB9CgkgICBwYXJheGlhbCA9IEZBTFNFOwoKCSAgIC8qIFRyYWNlIG1hcmdpbmFsIHJheSBpbiBDICovCgoJICAgdHJhY2VfbGluZSgzLCBjbGVhcl9hcGVydHVyZSAvIDIuMCk7CgkgICBvZF9jbGluZSA9IG9iamVjdF9kaXN0YW5jZTsKCgkgICAvKiBUcmFjZSBtYXJnaW5hbCByYXkgaW4gRiAqLwoKCSAgIHRyYWNlX2xpbmUoNiwgY2xlYXJfYXBlcnR1cmUgLyAyLjApOwoJICAgb2RfZmxpbmUgPSBvYmplY3RfZGlzdGFuY2U7CgoJICAgYWJlcnJfbHNwaGVyID0gb2Rfc2FbMV1bMF0gLSBvZF9zYVswXVswXTsKCSAgIGFiZXJyX29zYyA9IDEuMCAtIChvZF9zYVsxXVswXSAqIG9kX3NhWzFdWzFdKSAvCgkgICAgICAoc2luKG9kX3NhWzBdWzFdKSAqIG9kX3NhWzBdWzBdKTsKCSAgIGFiZXJyX2xjaHJvbSA9IG9kX2ZsaW5lIC0gb2RfY2xpbmU7CgkgICBtYXhfbHNwaGVyID0gc2luKG9kX3NhWzBdWzFdKTsKCgkgICAvKiBEIGxpZ2h0ICovCgoJICAgbWF4X2xzcGhlciA9IDAuMDAwMDkyNiAvIChtYXhfbHNwaGVyICogbWF4X2xzcGhlcik7CgkgICBtYXhfb3NjID0gMC4wMDI1OwoJICAgbWF4X2xjaHJvbSA9IG1heF9sc3BoZXI7CiNpZm5kZWYgQUNDVVJBQ1kKCX0KCiAgICAgICAgLy9wcmludGYoIlN0b3AgdGhlIHRpbWVyOlwwMDciKTsKCS8vZ2V0cyh0YmZyKTsKI2VuZGlmCgoJLyogTm93IGV2YWx1YXRlIHRoZSBhY2N1cmFjeSBvZiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBsYXN0IHJheSB0cmFjZSAqLwoKICAgICAgICBzcHJpbnRmKG91dGFyclswXSwgIiUxNXMgICAlMjEuMTFmICAlMTQuMTFmIiwKICAgICAgICAgICAiTWFyZ2luYWwgcmF5Iiwgb2Rfc2FbMF1bMF0sIG9kX3NhWzBdWzFdKTsKICAgICAgICBzcHJpbnRmKG91dGFyclsxXSwgIiUxNXMgICAlMjEuMTFmICAlMTQuMTFmIiwKICAgICAgICAgICAiUGFyYXhpYWwgcmF5Iiwgb2Rfc2FbMV1bMF0sIG9kX3NhWzFdWzFdKTsKCXNwcmludGYob3V0YXJyWzJdLAogICAgICAgICAgICJMb25naXR1ZGluYWwgc3BoZXJpY2FsIGFiZXJyYXRpb246ICAgICAgJTE2LjExZiIsCgkgICBhYmVycl9sc3BoZXIpOwoJc3ByaW50ZihvdXRhcnJbM10sCiAgICAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAlMTYuMTFmIiwKCSAgIG1heF9sc3BoZXIpOwoJc3ByaW50ZihvdXRhcnJbNF0sCiAgICAgICAgICAgIk9mZmVuc2UgYWdhaW5zdCBzaW5lIGNvbmRpdGlvbiAoY29tYSk6ICAlMTYuMTFmIiwKCSAgIGFiZXJyX29zYyk7CglzcHJpbnRmKG91dGFycls1XSwKICAgICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICUxNi4xMWYiLAoJICAgbWF4X29zYyk7CglzcHJpbnRmKG91dGFycls2XSwKICAgICAgICAgICAiQXhpYWwgY2hyb21hdGljIGFiZXJyYXRpb246ICAgICAgICAgICAgICUxNi4xMWYiLAoJICAgYWJlcnJfbGNocm9tKTsKCXNwcmludGYob3V0YXJyWzddLAogICAgICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgJTE2LjExZiIsCgkgICBtYXhfbGNocm9tKTsKCgkvKiBOb3cgY29tcGFyZSB0aGUgZWRpdGVkIHJlc3VsdHMgd2l0aCB0aGUgbWFzdGVyIHZhbHVlcyBmcm9tCgkgICByZWZlcmVuY2UgZXhlY3V0aW9ucyBvZiB0aGlzIHByb2dyYW0uICovCgoJZXJyb3JzID0gMDsKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCSAgIGlmIChzdHJjbXAob3V0YXJyW2ldLCByZWZhcnJbaV0pICE9IDApIHsKI2lmZGVmIEFDQ1VSQUNZCiAgICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yIGluIHBhc3MgJWxkIGZvciByZXN1bHRzIG9uIGxpbmUgJWQuLi5cbiIsCgkJICAgICBwYXNzZXMsIGkgKyAxKTsKI2Vsc2UKICAgICAgICAgICAgICBwcmludGYoIlxuRXJyb3IgaW4gcmVzdWx0cyBvbiBsaW5lICVkLi4uXG4iLCBpICsgMSk7CiNlbmRpZgogICAgICAgICAgICAgIHByaW50ZigiRXhwZWN0ZWQ6ICBcIiVzXCJcbiIsIHJlZmFycltpXSk7CiAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZDogIFwiJXNcIlxuIiwgb3V0YXJyW2ldKTsKICAgICAgICAgICAgICBwcmludGYoIihFcnJvcnMpICAgICIpOwoJICAgICAgayA9IHN0cmxlbihyZWZhcnJbaV0pOwoJICAgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKykgewogICAgICAgICAgICAgICAgIHByaW50ZigiJWMiLCByZWZhcnJbaV1bal0gPT0gb3V0YXJyW2ldW2pdID8gJyAnIDogJ14nKTsKCQkgaWYgKHJlZmFycltpXVtqXSAhPSBvdXRhcnJbaV1bal0pCgkJICAgIGVycm9ycysrOwoJICAgICAgfQogICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKCSAgIH0KCX0KI2lmZGVmIEFDQ1VSQUNZCgl9CiNlbHNlCglpZiAoZXJyb3JzID4gMCkgewogICAgICAgICAgIHByaW50ZigiXG4lZCBlcnJvciVzIGluIHJlc3VsdHMuICBUaGlzIGlzIFZFUlkgU0VSSU9VUy5cbiIsCiAgICAgICAgICAgICAgZXJyb3JzLCBlcnJvcnMgPiAxID8gInMiIDogIiIpOwoJfSBlbHNlCiAgICAgICAgICAgcHJpbnRmKCJcbk5vIGVycm9ycyBpbiByZXN1bHRzLlxuIik7CiNlbmRpZgoJcmV0dXJuIDA7Cn0K