Lyogd2luZHVuaS5jIC0tIHVuaWNvZGUgc3VwcG9ydCBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4KICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDcKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCiAgIFJld3JpdHRlbiBieSBLYWkgVGlldHosIE9uZXZpc2lvbi4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKICAgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCgovKiBUaGlzIGZpbGUgY29udGFpbnMgdW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgd2luZHJlcwogICBwcm9ncmFtLiAgSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBnZW5lcmljIHVuaWNvZGUgc3VwcG9ydCB3aGljaAogICB3b3VsZCB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgSG93ZXZlciwgd2UgZG9uJ3QuICBJbnN0ZWFkLCBvbiBhCiAgIFdpbmRvd3MgaG9zdCwgd2UgYXJlIHByZXBhcmVkIHRvIGNhbGwgc29tZSBXaW5kb3dzIHJvdXRpbmVzLiAgVGhpcwogICBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgZGlmZmVyZW50IG91dHB1dCBvbiBXaW5kb3dzIGFuZCBVbml4CiAgIGhvc3RzLCBidXQgdGhhdCBzZWVtcyBiZXR0ZXIgdGhhbiBub3QgcmVhbGx5IHN1cHBvcnRpbmcgdW5pY29kZSBhdAogICBhbGwuICAqLwoKI2luY2x1ZGUgInN5c2RlcC5oIgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJsaWJpYmVydHkuaCIgLyogZm9yIHhzdHJkdXAgKi8KI2luY2x1ZGUgImJ1Y29tbS5oIgovKiBNdXN0IGJlIGluY2x1ZGUgYmVmb3JlIHdpbmRvd3MuaCBhbmQgd2lubmxzLmguICAqLwojaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8d2lubmxzLmg+CiNlbmRpZgojaW5jbHVkZSAid2luZHVuaS5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgoKI2lmIEhBVkVfSUNPTlZfSAojaW5jbHVkZSA8aWNvbnYuaD4KI2VuZGlmCgpzdGF0aWMgcmNfdWludF90eXBlIHdpbmRfV2lkZUNoYXJUb011bHRpQnl0ZSAocmNfdWludF90eXBlLCBjb25zdCB1bmljaGFyICosIGNoYXIgKiwgcmNfdWludF90eXBlKTsKc3RhdGljIHJjX3VpbnRfdHlwZSB3aW5kX011bHRpQnl0ZVRvV2lkZUNoYXIgKHJjX3VpbnRfdHlwZSwgY29uc3QgY2hhciAqLCB1bmljaGFyICosIHJjX3VpbnRfdHlwZSk7CnN0YXRpYyBpbnQgdW5pY2hhcl9pc2FzY2lpIChjb25zdCB1bmljaGFyICosIHJjX3VpbnRfdHlwZSk7CgovKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAogICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLwogCiNpZiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKCi8qIENvZGVwYWdlcyBtYXBwZWQuICAqLwpzdGF0aWMgbG9jYWxfaWNvbnZfbWFwIGNvZGVwYWdlc1tdID0KewogIHsgMCwgIk1TLUFOU0kiIH0sCiAgeyAxLCAiV0lORE9XUy0xMjUyIiB9LAogIHsgNDM3LCAiTVMtQU5TSSIgfSwKICB7IDczNywgIk1TLUdSRUVLIiB9LAogIHsgNzc1LCAiV0lOQkFMVFJJTSIgfSwKICB7IDg1MCwgIk1TLUFOU0kiIH0sCiAgeyA4NTIsICJNUy1FRSIgfSwKICB7IDg1NywgIk1TLVRVUksiIH0sCiAgeyA4NjIsICJDUDg2MiIgfSwKICB7IDg2NCwgIkNQODY0IiB9LAogIHsgODY2LCAiTVMtQ1lSTCIgfSwKICB7IDg3NCwgIldJTkRPV1MtODc0IiB9LAogIHsgOTMyLCAiQ1A5MzIiIH0sCiAgeyA5MzYsICJDUDkzNiIgfSwKICB7IDk0OSwgIkNQOTQ5IiB9LAogIHsgOTUwLCAiQ1A5NTAiIH0sCiAgeyAxMjUwLCAiV0lORE9XUy0xMjUwIiB9LAogIHsgMTI1MSwgIldJTkRPV1MtMTI1MSIgfSwKICB7IDEyNTIsICJXSU5ET1dTLTEyNTIiIH0sCiAgeyAxMjUzLCAiV0lORE9XUy0xMjUzIiB9LAogIHsgMTI1NCwgIldJTkRPV1MtMTI1NCIgfSwKICB7IDEyNTUsICJXSU5ET1dTLTEyNTUiIH0sCiAgeyAxMjU2LCAiV0lORE9XUy0xMjU2IiB9LAogIHsgMTI1NywgIldJTkRPV1MtMTI1NyIgfSwKICB7IDEyNTgsICJXSU5ET1dTLTEyNTgiIH0sCiAgeyBDUF9VVEY3LCAiVVRGLTciIH0sCiAgeyBDUF9VVEY4LCAiVVRGLTgiIH0sCiAgeyBDUF9VVEYxNiwgIlVURi0xNiIgfSwKICB7IChyY191aW50X3R5cGUpIC0xLCBOVUxMIH0KfTsKCi8qIExhbmd1YWdlcyBzdXBwb3J0ZWQuICAqLwpzdGF0aWMgY29uc3Qgd2luZF9sYW5ndWFnZV90IGxhbmd1YWdlc1tdID0KewogIHsgMHgwMDAwLCA0MzcsIDEyNTIsICJOZXV0cmFsIiwgIk5ldXRyYWwiIH0sCiAgeyAweDA0MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJTYXVkaSBBcmFiaWEiIH0sICAgIHsgMHgwNDAyLCA4NjYsIDEyNTEsICJCdWxnYXJpYW4iLCAiQnVsZ2FyaWEiIH0sCiAgeyAweDA0MDMsIDg1MCwgMTI1MiwgIkNhdGFsYW4iLCAiU3BhaW4iIH0sCSAgICAgIHsgMHgwNDA0LCA5NTAsICA5NTAsICJDaGluZXNlIiwgIlRhaXdhbiIgfSwKICB7IDB4MDQwNSwgODUyLCAxMjUwLCAiQ3plY2giLCAiQ3plY2ggUmVwdWJsaWMiIH0sICAgeyAweDA0MDYsIDg1MCwgMTI1MiwgIkRhbmlzaCIsICJEZW5tYXJrIiB9LAogIHsgMHgwNDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiR2VybWFueSIgfSwJICAgICAgeyAweDA0MDgsIDczNywgMTI1MywgIkdyZWVrIiwgIkdyZWVjZSIgfSwKICB7IDB4MDQwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgU3RhdGVzIiB9LCAgeyAweDA0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2ggLSBUcmFkaXRpb25hbCBTb3J0IiwgIlNwYWluIiB9LAogIHsgMHgwNDBCLCA4NTAsIDEyNTIsICJGaW5uaXNoIiwgIkZpbmxhbmQiIH0sCSAgICAgIHsgMHgwNDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiRnJhbmNlIiB9LAogIHsgMHgwNDBELCA4NjIsIDEyNTUsICJIZWJyZXciLCAiSXNyYWVsIiB9LAkgICAgICB7IDB4MDQwRSwgODUyLCAxMjUwLCAiSHVuZ2FyaWFuIiwgIkh1bmdhcnkiIH0sCiAgeyAweDA0MEYsIDg1MCwgMTI1MiwgIkljZWxhbmRpYyIsICJJY2VsYW5kIiB9LCAgICAgIHsgMHgwNDEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIkl0YWx5IiB9LAogIHsgMHgwNDExLCA5MzIsICA5MzIsICJKYXBhbmVzZSIsICJKYXBhbiIgfSwJICAgICAgeyAweDA0MTIsIDk0OSwgIDk0OSwgIktvcmVhbiIsICJLb3JlYSAoc291dGgpIiB9LAogIHsgMHgwNDEzLCA4NTAsIDEyNTIsICJEdXRjaCIsICJOZXRoZXJsYW5kcyIgfSwgICAgICB7IDB4MDQxNCwgODUwLCAxMjUyLCAiTm9yd2VnaWFuIChCb2tt5WwpIiwgIk5vcndheSIgfSwKICB7IDB4MDQxNSwgODUyLCAxMjUwLCAiUG9saXNoIiwgIlBvbGFuZCIgfSwJICAgICAgeyAweDA0MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiQnJhemlsIiB9LAogIHsgMHgwNDE4LCA4NTIsIDEyNTAsICJSb21hbmlhbiIsICJSb21hbmlhIiB9LAkgICAgICB7IDB4MDQxOSwgODY2LCAxMjUxLCAiUnVzc2lhbiIsICJSdXNzaWEiIH0sCiAgeyAweDA0MUEsIDg1MiwgMTI1MCwgIkNyb2F0aWFuIiwgIkNyb2F0aWEiIH0sCSAgICAgIHsgMHgwNDFCLCA4NTIsIDEyNTAsICJTbG92YWsiLCAiU2xvdmFraWEiIH0sCiAgeyAweDA0MUMsIDg1MiwgMTI1MCwgIkFsYmFuaWFuIiwgIkFsYmFuaWEiIH0sCSAgICAgIHsgMHgwNDFELCA4NTAsIDEyNTIsICJTd2VkaXNoIiwgIlN3ZWRlbiIgfSwKICB7IDB4MDQxRSwgODc0LCAgODc0LCAiVGhhaSIsICJUaGFpbGFuZCIgfSwJICAgICAgeyAweDA0MUYsIDg1NywgMTI1NCwgIlR1cmtpc2giLCAiVHVya2V5IiB9LAogIHsgMHgwNDIxLCA4NTAsIDEyNTIsICJJbmRvbmVzaWFuIiwgIkluZG9uZXNpYSIgfSwgICB7IDB4MDQyMiwgODY2LCAxMjUxLCAiVWtyYWluaWFuIiwgIlVrcmFpbmUiIH0sCiAgeyAweDA0MjMsIDg2NiwgMTI1MSwgIkJlbGFydXNpYW4iLCAiQmVsYXJ1cyIgfSwgICAgIHsgMHgwNDI0LCA4NTIsIDEyNTAsICJTbG92ZW5lIiwgIlNsb3ZlbmlhIiB9LAogIHsgMHgwNDI1LCA3NzUsIDEyNTcsICJFc3RvbmlhbiIsICJFc3RvbmlhIiB9LAkgICAgICB7IDB4MDQyNiwgNzc1LCAxMjU3LCAiTGF0dmlhbiIsICJMYXR2aWEiIH0sCiAgeyAweDA0MjcsIDc3NSwgMTI1NywgIkxpdGh1YW5pYW4iLCAiTGl0aHVhbmlhIiB9LAogIHsgMHgwNDI5LCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiRmFyc2kiIH0sCSAgICAgIHsgMHgwNDJBLDEyNTgsIDEyNTgsICJWaWV0bmFtZXNlIiwgIlZpZXRuYW0iIH0sCiAgeyAweDA0MkQsIDg1MCwgMTI1MiwgIkJhc3F1ZSIsICJTcGFpbiIgfSwKICB7IDB4MDQyRiwgODY2LCAxMjUxLCAiTWFjZWRvbmlhbiIsICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiB9LAogIHsgMHgwNDM2LCA4NTAsIDEyNTIsICJBZnJpa2FhbnMiLCAiU291dGggQWZyaWNhIiB9LAogIHsgMHgwNDM4LCA4NTAsIDEyNTIsICJGYXJvZXNlIiwgIkZhcm9lIElzbGFuZHMiIH0sCiAgeyAweDA0M0MsIDQzNywgMTI1MiwgIklyaXNoIiwgIklyZWxhbmQiIH0sCiAgeyAweDA0M0UsIDg1MCwgMTI1MiwgIk1hbGF5IiwgIk1hbGF5c2lhIiB9LAogIHsgMHgwODAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiSXJhcSIgfSwKICB7IDB4MDgwNCwgOTM2LCAgOTM2LCAiQ2hpbmVzZSAoUGVvcGxlJ3MgcmVwdWJsaWMgb2YgQ2hpbmEpIiwgIlBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hIiB9LAogIHsgMHgwODA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiU3dpdHplcmxhbmQiIH0sCiAgeyAweDA4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIEtpbmdkb20iIH0sIHsgMHgwODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk1leGljbyIgfSwKICB7IDB4MDgwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkJlbGdpdW0iIH0sCiAgeyAweDA4MTAsIDg1MCwgMTI1MiwgIkl0YWxpYW4iLCAiU3dpdHplcmxhbmQiIH0sCiAgeyAweDA4MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIkJlbGdpdW0iIH0sCSAgICAgIHsgMHgwODE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKE55bm9yc2spIiwgIk5vcndheSIgfSwKICB7IDB4MDgxNiwgODUwLCAxMjUyLCAiUG9ydHVndWVzZSIsICJQb3J0dWdhbCIgfSwKICB7IDB4MDgxQSwgODUyLCAxMjUyLCAiU2VyYmlhbiAobGF0aW4pIiwgIll1Z29zbGF2aWEiIH0sCiAgeyAweDA4MUQsIDg1MCwgMTI1MiwgIlN3ZWRpc2ggKEZpbmxhbmQpIiwgIkZpbmxhbmQiIH0sCiAgeyAweDBDMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJFZ3lwdCIgfSwKICB7IDB4MEMwNCwgOTUwLCAgOTUwLCAiQ2hpbmVzZSIsICJIb25nIEtvbmciIH0sCiAgeyAweDBDMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJBdXN0cmlhIiB9LAogIHsgMHgwQzA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkF1c3RyYWxpYSIgfSwgICAgICB7IDB4MEMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIEludGVybmF0aW9uYWwgU29ydCIsICJTcGFpbiIgfSwKICB7IDB4MEMwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkNhbmFkYSJ9LAogIHsgMHgwQzFBLCA4NTUsIDEyNTEsICJTZXJiaWFuIChDeXJpbGxpYykiLCAiU2VyYmlhIiB9LAogIHsgMHgxMDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiTGlieWEiIH0sCiAgeyAweDEwMDQsIDkzNiwgIDkzNiwgIkNoaW5lc2UiLCAiU2luZ2Fwb3JlIiB9LAogIHsgMHgxMDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiTHV4ZW1ib3VyZyIgfSwKICB7IDB4MTAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYW5hZGEiIH0sCiAgeyAweDEwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiR3VhdGVtYWxhIiB9LAogIHsgMHgxMDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiU3dpdHplcmxhbmQiIH0sCiAgeyAweDE0MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJBbGdlcmlhIiB9LAogIHsgMHgxNDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiTGllY2h0ZW5zdGVpbiIgfSwKICB7IDB4MTQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJOZXcgWmVhbGFuZCIgfSwgICAgeyAweDE0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29zdGEgUmljYSIgfSwKICB7IDB4MTQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkx1eGVtYm91cmciIH0sCiAgeyAweDE4MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJNb3JvY2NvIiB9LAogIHsgMHgxODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIklyZWxhbmQiIH0sCSAgICAgIHsgMHgxODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBhbmFtYSIgfSwKICB7IDB4MTgwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIk1vbmFjbyIgfSwKICB7IDB4MUMwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlR1bmlzaWEiIH0sCiAgeyAweDFDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiU291dGggQWZyaWNhIiB9LCAgIHsgMHgxQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIgfSwKICB7IDB4MjAwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIk9tYW4iIH0sCiAgeyAweDIwMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSmFtYWljYSIgfSwJICAgICAgeyAweDIwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVmVuZXp1ZWxhIiB9LAogIHsgMHgyNDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiWWVtZW4iIH0sCiAgeyAweDI0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQ2FyaWJiZWFuIiB9LCAgICAgIHsgMHgyNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNvbG9tYmlhIiB9LAogIHsgMHgyODAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiU3lyaWEiIH0sCiAgeyAweDI4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQmVsaXplIiB9LAkgICAgICB7IDB4MjgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQZXJ1IiB9LAogIHsgMHgyQzAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiSm9yZGFuIiB9LAogIHsgMHgyQzA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlRyaW5pZGFkICYgVG9iYWdvIiB9LHsgMHgyQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkFyZ2VudGluYSIgfSwKICB7IDB4MzAwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkxlYmFub24iIH0sCiAgeyAweDMwMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiWmltYmFid2UiIH0sCSAgICAgIHsgMHgzMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVjdWFkb3IiIH0sCiAgeyAweDM0MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJLdXdhaXQiIH0sCiAgeyAweDM0MDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiUGhpbGlwcGluZXMiIH0sICAgIHsgMHgzNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNoaWxlIiB9LAogIHsgMHgzODAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiIH0sCiAgeyAweDM4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVXJ1Z3VheSIgfSwKICB7IDB4M0MwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkJhaHJhaW4iIH0sCiAgeyAweDNDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGFyYWd1YXkiIH0sCiAgeyAweDQwMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJRYXRhciIgfSwKICB7IDB4NDAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJCb2xpdmlhIiB9LAogIHsgMHg0NDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVsIFNhbHZhZG9yIiB9LAogIHsgMHg0ODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkhvbmR1cmFzIiB9LAogIHsgMHg0QzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk5pY2FyYWd1YSIgfSwKICB7IDB4NTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQdWVydG8gUmljbyIgfSwKICB7ICh1bnNpZ25lZCkgLTEsICAwLCAgICAgIDAsIE5VTEwsIE5VTEwgfQp9OwoKI2VuZGlmCgovKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgY29kZXBhZ2UgdG8gYmUgdXNlZCBmb3IgdW5pY29kZQogICB0cmFuc2Zvcm1hdGlvbnMuICBCeSBkZWZhdWx0IHRoaXMgaXMgQ1BfQUNQLiAgKi8KcmNfdWludF90eXBlIHdpbmRfZGVmYXVsdF9jb2RlcGFnZSA9IENQX0FDUDsKCi8qIFNwZWNpZmllcyB0aGUgY3VycmVudGx5IHVzZWQgY29kZXBhZ2UgZm9yIHVuaWNvZGUKICAgdHJhbnNmb3JtYXRpb25zLiAgQnkgZGVmYXVsdCB0aGlzIGlzIENQX0FDUC4gICovCnJjX3VpbnRfdHlwZSB3aW5kX2N1cnJlbnRfY29kZXBhZ2UgPSBDUF9BQ1A7CgovKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAogICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLwoKdm9pZAp1bmljb2RlX2Zyb21fYXNjaWkgKHJjX3VpbnRfdHlwZSAqbGVuZ3RoLCB1bmljaGFyICoqdW5pY29kZSwgY29uc3QgY2hhciAqYXNjaWkpCnsKICB1bmljb2RlX2Zyb21fY29kZXBhZ2UgKGxlbmd0aCwgdW5pY29kZSwgYXNjaWksIHdpbmRfY3VycmVudF9jb2RlcGFnZSk7Cn0KCi8qIENvbnZlcnQgYW4gdW5pY29kZSBzdHJpbmcgdG8gYW4gQVNDSUkgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAogICBzaHJpbmsgc2hvcnRzIHRvIGNoYXJzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuCiAgIFNob3J0cyB3aXRoIG5vdCB3aXRoaW4gdGhlIGNoYXIgcmFuZ2UgYXJlIHJlcGxhY2VkIGJ5ICdfJy4gICovCgp2b2lkCmFzY2lpX2Zyb21fdW5pY29kZSAocmNfdWludF90eXBlICpsZW5ndGgsIGNvbnN0IHVuaWNoYXIgKnVuaWNvZGUsIGNoYXIgKiphc2NpaSkKewogIGNvZGVwYWdlX2Zyb21fdW5pY29kZSAobGVuZ3RoLCB1bmljb2RlLCBhc2NpaSwgd2luZF9jdXJyZW50X2NvZGVwYWdlKTsKfQoKLyogUHJpbnQgdGhlIHVuaWNvZGUgc3RyaW5nIFVOSUNPREUgdG8gdGhlIGZpbGUgRS4gIExFTkdUSCBpcyB0aGUKICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQsIG9yIC0xIGlmIHdlIHNob3VsZCBwcmludCB1bnRpbCB0aGUKICAgZW5kIG9mIHRoZSBzdHJpbmcuICBGSVhNRTogT24gYSBXaW5kb3dzIGhvc3QsIHdlIHNob3VsZCBiZSBjYWxsaW5nCiAgIHNvbWUgV2luZG93cyBmdW5jdGlvbiwgcHJvYmFibHkgV2lkZUNoYXJUb011bHRpQnl0ZS4gICovCgp2b2lkCnVuaWNvZGVfcHJpbnQgKEZJTEUgKmUsIGNvbnN0IHVuaWNoYXIgKnVuaWNvZGUsIHJjX3VpbnRfdHlwZSBsZW5ndGgpCnsKICB3aGlsZSAoMSkKICAgIHsKICAgICAgdW5pY2hhciBjaDsKCiAgICAgIGlmIChsZW5ndGggPT0gMCkKCXJldHVybjsKICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgbGVuZ3RoID4gMCkKCS0tbGVuZ3RoOwoKICAgICAgY2ggPSAqdW5pY29kZTsKCiAgICAgIGlmIChjaCA9PSAwICYmIChiZmRfc2lnbmVkX3ZtYSkgbGVuZ3RoIDwgMCkKCXJldHVybjsKCiAgICAgICsrdW5pY29kZTsKCiAgICAgIGlmICgoY2ggJiAweDdmKSA9PSBjaCkKCXsKCSAgaWYgKGNoID09ICdcXCcpCgkgICAgZnB1dHMgKCJcXFxcIiwgZSk7CgkgIGVsc2UgaWYgKGNoID09ICciJykKCSAgICBmcHV0cyAoIlwiXCIiLCBlKTsKCSAgZWxzZSBpZiAoSVNQUklOVCAoY2gpKQoJICAgIHB1dGMgKGNoLCBlKTsKCSAgZWxzZQoJICAgIHsKCSAgICAgIHN3aXRjaCAoY2gpCgkJewoJCWNhc2UgRVNDQVBFX0E6CgkJICBmcHV0cyAoIlxcYSIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX0I6CgkJICBmcHV0cyAoIlxcYiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX0Y6CgkJICBmcHV0cyAoIlxcZiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX046CgkJICBmcHV0cyAoIlxcbiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1I6CgkJICBmcHV0cyAoIlxcciIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1Q6CgkJICBmcHV0cyAoIlxcdCIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1Y6CgkJICBmcHV0cyAoIlxcdiIsIGUpOwoJCSAgYnJlYWs7CgoJCWRlZmF1bHQ6CgkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwoJCSAgYnJlYWs7CgkJfQoJICAgIH0KCX0KICAgICAgZWxzZSBpZiAoKGNoICYgMHhmZikgPT0gY2gpCglmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwogICAgICBlbHNlCglmcHJpbnRmIChlLCAiXFx4JTA0eCIsICh1bnNpZ25lZCBpbnQpIGNoKTsKICAgIH0KfQoKLyogUHJpbnQgYSB1bmljb2RlIHN0cmluZyB0byBhIGZpbGUuICAqLwoKdm9pZAphc2NpaV9wcmludCAoRklMRSAqZSwgY29uc3QgY2hhciAqcywgcmNfdWludF90eXBlIGxlbmd0aCkKewogIHdoaWxlICgxKQogICAgewogICAgICBjaGFyIGNoOwoKICAgICAgaWYgKGxlbmd0aCA9PSAwKQoJcmV0dXJuOwogICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSBsZW5ndGggPiAwKQoJLS1sZW5ndGg7CgogICAgICBjaCA9ICpzOwoKICAgICAgaWYgKGNoID09IDAgJiYgKGJmZF9zaWduZWRfdm1hKSBsZW5ndGggPCAwKQoJcmV0dXJuOwoKICAgICAgKytzOwoKICAgICAgaWYgKChjaCAmIDB4N2YpID09IGNoKQoJewoJICBpZiAoY2ggPT0gJ1xcJykKCSAgICBmcHV0cyAoIlxcXFwiLCBlKTsKCSAgZWxzZSBpZiAoY2ggPT0gJyInKQoJICAgIGZwdXRzICgiXCJcIiIsIGUpOwoJICBlbHNlIGlmIChJU1BSSU5UIChjaCkpCgkgICAgcHV0YyAoY2gsIGUpOwoJICBlbHNlCgkgICAgewoJICAgICAgc3dpdGNoIChjaCkKCQl7CgkJY2FzZSBFU0NBUEVfQToKCQkgIGZwdXRzICgiXFxhIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfQjoKCQkgIGZwdXRzICgiXFxiIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfRjoKCQkgIGZwdXRzICgiXFxmIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfTjoKCQkgIGZwdXRzICgiXFxuIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfUjoKCQkgIGZwdXRzICgiXFxyIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfVDoKCQkgIGZwdXRzICgiXFx0IiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfVjoKCQkgIGZwdXRzICgiXFx2IiwgZSk7CgkJICBicmVhazsKCgkJZGVmYXVsdDoKCQkgIGZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7CgkJICBicmVhazsKCQl9CgkgICAgfQoJfQogICAgICBlbHNlCglmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2ggJiAweGZmKTsKICAgIH0KfQoKcmNfdWludF90eXBlCnVuaWNoYXJfbGVuIChjb25zdCB1bmljaGFyICp1bmljb2RlKQp7CiAgcmNfdWludF90eXBlIHIgPSAwOwoKICBpZiAodW5pY29kZSkKICAgIHdoaWxlICh1bmljb2RlW3JdICE9IDApCiAgICAgIHIrKzsKICBlbHNlCiAgICAtLXI7CiAgcmV0dXJuIHI7Cn0KCnVuaWNoYXIgKgp1bmljaGFyX2R1cCAoY29uc3QgdW5pY2hhciAqdW5pY29kZSkKewogIHVuaWNoYXIgKnI7CiAgaW50IGxlbjsKCiAgaWYgKCEgdW5pY29kZSkKICAgIHJldHVybiBOVUxMOwogIGZvciAobGVuID0gMDsgdW5pY29kZVtsZW5dICE9IDA7ICsrbGVuKQogICAgOwogICsrbGVuOwogIHIgPSAoKHVuaWNoYXIgKikgcmVzX2FsbG9jIChsZW4gKiBzaXplb2YgKHVuaWNoYXIpKSk7CiAgbWVtY3B5IChyLCB1bmljb2RlLCBsZW4gKiBzaXplb2YgKHVuaWNoYXIpKTsKICByZXR1cm4gcjsKfQoKdW5pY2hhciAqCnVuaWNoYXJfZHVwX3VwcGVyY2FzZSAoY29uc3QgdW5pY2hhciAqdSkKewogIHVuaWNoYXIgKnIgPSB1bmljaGFyX2R1cCAodSk7CiAgaW50IGk7CgogIGlmICghIHIpCiAgICByZXR1cm4gTlVMTDsKCiAgZm9yIChpID0gMDsgcltpXSAhPSAwOyArK2kpCiAgICB7CiAgICAgIGlmIChyW2ldID49ICdhJyAmJiByW2ldIDw9ICd6JykKCXJbaV0gJj0gMHhkZjsKICAgIH0KICByZXR1cm4gcjsKfQoKc3RhdGljIGludAp1bmljaGFyX2lzYXNjaWkgKGNvbnN0IHVuaWNoYXIgKnUsIHJjX3VpbnRfdHlwZSBsZW4pCnsKICByY191aW50X3R5cGUgaTsKCiAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgbGVuIDwgMCkKICAgIHsKICAgICAgaWYgKHUpCglsZW4gPSAocmNfdWludF90eXBlKSB1bmljaGFyX2xlbiAodSk7CiAgICAgIGVsc2UKCWxlbiA9IDA7CiAgICB9CgogIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKICAgIGlmICgodVtpXSAmIDB4ZmY4MCkgIT0gMCkKICAgICAgcmV0dXJuIDA7CiAgcmV0dXJuIDE7Cn0KCnZvaWQKdW5pY29kZV9wcmludF9xdW90ZWQgKEZJTEUgKmUsIGNvbnN0IHVuaWNoYXIgKnUsIHJjX3VpbnRfdHlwZSBsZW4pCnsKICBpZiAoISB1bmljaGFyX2lzYXNjaWkgKHUsIGxlbikpCiAgICBmcHV0YyAoJ0wnLCBlKTsKICBmcHV0YyAoJyInLCBlKTsKICB1bmljb2RlX3ByaW50IChlLCB1LCBsZW4pOwogIGZwdXRjICgnIicsIGUpOwp9CgppbnQKdW5pY29kZV9pc192YWxpZF9jb2RlcGFnZSAocmNfdWludF90eXBlIGNwKQp7CiAgaWYgKChjcCAmIDB4ZmZmZikgIT0gY3ApCiAgICByZXR1cm4gMDsKICBpZiAoY3AgPT0gQ1BfVVRGMTYgfHwgY3AgPT0gQ1BfQUNQKQogICAgcmV0dXJuIDE7CgojaWYgIWRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCiAgaWYgKCEgd2luZF9maW5kX2NvZGVwYWdlX2luZm8gKGNwKSkKICAgIHJldHVybiAwOwogIHJldHVybiAxOwojZWxzZQogIHJldHVybiAhISBJc1ZhbGlkQ29kZVBhZ2UgKChVSU5UKSBjcCk7CiNlbmRpZgp9CgojaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQoKI2RlZmluZSBtYXhfY3Bfc3RyaW5nX2xlbiA2CgpzdGF0aWMgdW5zaWduZWQgaW50CmNvZGVwYWdlX2Zyb21fbGFuZ2lkICh1bnNpZ25lZCBzaG9ydCBsYW5naWQpCnsKICBjaGFyIGNwX3N0cmluZyBbbWF4X2NwX3N0cmluZ19sZW5dOwogIGludCBjOwoKICBtZW1zZXQgKGNwX3N0cmluZywgMCwgbWF4X2NwX3N0cmluZ19sZW4pOwogIC8qIExPQ0FMRV9SRVRVUk5fTlVNQkVSIGZsYWcgd291bGQgYXZvaWQgc3RydG91bCBjb252ZXJzaW9uLAogICAgIGJ1dCBpcyB1bmF2YWlsYWJsZSBvbiBXaW45NS4gICovCiAgYyA9IEdldExvY2FsZUluZm9BIChNQUtFTENJRCAobGFuZ2lkLCBTT1JUX0RFRkFVTFQpLAogIAkJICAgICAgTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLAogIAkJICAgICAgY3Bfc3RyaW5nLCBtYXhfY3Bfc3RyaW5nX2xlbik7CiAgLyogSWYgY29kZXBhZ2UgZGF0YSBmb3IgYW4gTENJRCBpcyBub3QgaW5zdGFsbGVkIG9uIHVzZXJzJ3Mgc3lzdGVtLAogICAgIEdldExvY2FsZUluZm8gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuICBGYWxsIGJhY2sgdG8gc3lzdGVtIEFOU0kKICAgICBkZWZhdWx0LiAqLwogIGlmIChjID09IDApCiAgICByZXR1cm4gQ1BfQUNQOwogIHJldHVybiBzdHJ0b3VsIChjcF9zdHJpbmcsIDAsIDEwKTsKfQoKc3RhdGljIHVuc2lnbmVkIGludAp3aW5jb2RlcGFnZV9mcm9tX2xhbmdpZCAodW5zaWduZWQgc2hvcnQgbGFuZ2lkKQp7CiAgY2hhciBjcF9zdHJpbmcgW21heF9jcF9zdHJpbmdfbGVuXTsKICBpbnQgYzsKCiAgbWVtc2V0IChjcF9zdHJpbmcsIDAsIG1heF9jcF9zdHJpbmdfbGVuKTsKICAvKiBMT0NBTEVfUkVUVVJOX05VTUJFUiBmbGFnIHdvdWxkIGF2b2lkIHN0cnRvdWwgY29udmVyc2lvbiwKICAgICBidXQgaXMgdW5hdmFpbGFibGUgb24gV2luOTUuICAqLwogIGMgPSBHZXRMb2NhbGVJbmZvQSAoTUFLRUxDSUQgKGxhbmdpZCwgU09SVF9ERUZBVUxUKSwKCQkgICAgICBMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwKCQkgICAgICBjcF9zdHJpbmcsIG1heF9jcF9zdHJpbmdfbGVuKTsKICAvKiBJZiBjb2RlcGFnZSBkYXRhIGZvciBhbiBMQ0lEIGlzIG5vdCBpbnN0YWxsZWQgb24gdXNlcnMncyBzeXN0ZW0sCiAgICAgR2V0TG9jYWxlSW5mbyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gIEZhbGwgYmFjayB0byBzeXN0ZW0gQU5TSQogICAgIGRlZmF1bHQuICovCiAgaWYgKGMgPT0gMCkKICAgIHJldHVybiBDUF9PRU07CiAgcmV0dXJuIHN0cnRvdWwgKGNwX3N0cmluZywgMCwgMTApOwp9CgpzdGF0aWMgY2hhciAqCmxhbmdfZnJvbV9sYW5naWQgKHVuc2lnbmVkIHNob3J0IGxhbmdpZCkKewogIGNoYXIgY3Bfc3RyaW5nWzI2MV07CiAgaW50IGM7CgogIG1lbXNldCAoY3Bfc3RyaW5nLCAwLCAyNjEpOwogIGMgPSBHZXRMb2NhbGVJbmZvQSAoTUFLRUxDSUQgKGxhbmdpZCwgU09SVF9ERUZBVUxUKSwKICAJCSAgICAgIExPQ0FMRV9TRU5HTEFOR1VBR0UsCiAgCQkgICAgICBjcF9zdHJpbmcsIDI2MCk7CiAgLyogSWYgY29kZXBhZ2UgZGF0YSBmb3IgYW4gTENJRCBpcyBub3QgaW5zdGFsbGVkIG9uIHVzZXJzJ3Mgc3lzdGVtLAogICAgIEdldExvY2FsZUluZm8gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuICBGYWxsIGJhY2sgdG8gc3lzdGVtIEFOU0kKICAgICBkZWZhdWx0LiAqLwogIGlmIChjID09IDApCiAgICBzdHJjcHkgKGNwX3N0cmluZywgIk5ldXRyYWwiKTsKICByZXR1cm4geHN0cmR1cCAoY3Bfc3RyaW5nKTsKfQoKc3RhdGljIGNoYXIgKgpjb3VudHJ5X2Zyb21fbGFuZ2lkICh1bnNpZ25lZCBzaG9ydCBsYW5naWQpCnsKICBjaGFyIGNwX3N0cmluZ1syNjFdOwogIGludCBjOwoKICBtZW1zZXQgKGNwX3N0cmluZywgMCwgMjYxKTsKICBjID0gR2V0TG9jYWxlSW5mb0EgKE1BS0VMQ0lEIChsYW5naWQsIFNPUlRfREVGQVVMVCksCiAgCQkgICAgICBMT0NBTEVfU0VOR0NPVU5UUlksCiAgCQkgICAgICBjcF9zdHJpbmcsIDI2MCk7CiAgLyogSWYgY29kZXBhZ2UgZGF0YSBmb3IgYW4gTENJRCBpcyBub3QgaW5zdGFsbGVkIG9uIHVzZXJzJ3Mgc3lzdGVtLAogICAgIEdldExvY2FsZUluZm8gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuICBGYWxsIGJhY2sgdG8gc3lzdGVtIEFOU0kKICAgICBkZWZhdWx0LiAqLwogIGlmIChjID09IDApCiAgICBzdHJjcHkgKGNwX3N0cmluZywgIk5ldXRyYWwiKTsKICByZXR1cm4geHN0cmR1cCAoY3Bfc3RyaW5nKTsKfQoKI2VuZGlmCgpjb25zdCB3aW5kX2xhbmd1YWdlX3QgKgp3aW5kX2ZpbmRfbGFuZ3VhZ2VfYnlfaWQgKHVuc2lnbmVkIGlkKQp7CiNpZiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKICBpbnQgaTsKCiAgaWYgKCEgaWQpCiAgICByZXR1cm4gTlVMTDsKICBmb3IgKGkgPSAwOyBsYW5ndWFnZXNbaV0uaWQgIT0gKHVuc2lnbmVkKSAtMSAmJiBsYW5ndWFnZXNbaV0uaWQgIT0gaWQ7IGkrKykKICAgIDsKICBpZiAobGFuZ3VhZ2VzW2ldLmlkID09IGlkKQogICAgcmV0dXJuICZsYW5ndWFnZXNbaV07CiAgcmV0dXJuIE5VTEw7CiNlbHNlCiAgc3RhdGljIHdpbmRfbGFuZ3VhZ2VfdCB3bDsKCiAgd2wuaWQgPSBpZDsKICB3bC5kb3NjcCA9IGNvZGVwYWdlX2Zyb21fbGFuZ2lkICgodW5zaWduZWQgc2hvcnQpIGlkKTsKICB3bC53aW5jcCA9IHdpbmNvZGVwYWdlX2Zyb21fbGFuZ2lkICgodW5zaWduZWQgc2hvcnQpIGlkKTsKICB3bC5uYW1lID0gbGFuZ19mcm9tX2xhbmdpZCAoKHVuc2lnbmVkIHNob3J0KSBpZCk7CiAgd2wuY291bnRyeSA9IGNvdW50cnlfZnJvbV9sYW5naWQgKCh1bnNpZ25lZCBzaG9ydCkgaWQpOwoKICByZXR1cm4gJiB3bDsKI2VuZGlmCn0KCmNvbnN0IGxvY2FsX2ljb252X21hcCAqCndpbmRfZmluZF9jb2RlcGFnZV9pbmZvICh1bnNpZ25lZCBjcCkKewojaWYgIWRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGNvZGVwYWdlc1tpXS5jb2RlcGFnZSAhPSAocmNfdWludF90eXBlKSAtMSAmJiBjb2RlcGFnZXNbaV0uY29kZXBhZ2UgIT0gY3A7IGkrKykKICAgIDsKICBpZiAoY29kZXBhZ2VzW2ldLmNvZGVwYWdlID09IChyY191aW50X3R5cGUpIC0xKQogICAgcmV0dXJuIE5VTEw7CiAgcmV0dXJuICZjb2RlcGFnZXNbaV07CiNlbHNlCiAgc3RhdGljIGxvY2FsX2ljb252X21hcCBsaW07CiAgaWYgKCF1bmljb2RlX2lzX3ZhbGlkX2NvZGVwYWdlIChjcCkpCiAgCXJldHVybiBOVUxMOwogIGxpbS5jb2RlcGFnZSA9IGNwOwogIGxpbS5pY29udl9uYW1lID0gIiI7CiAgcmV0dXJuICYgbGltOwojZW5kaWYKfQoKLyogQ29udmVydCBhbiBDb2RlcGFnZSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gICovCgp2b2lkCnVuaWNvZGVfZnJvbV9jb2RlcGFnZSAocmNfdWludF90eXBlICpsZW5ndGgsIHVuaWNoYXIgKip1LCBjb25zdCBjaGFyICpzcmMsIHJjX3VpbnRfdHlwZSBjcCkKewogIHJjX3VpbnRfdHlwZSBsZW47CgogIGxlbiA9IHdpbmRfTXVsdGlCeXRlVG9XaWRlQ2hhciAoY3AsIHNyYywgTlVMTCwgMCk7CiAgaWYgKGxlbikKICAgIHsKICAgICAgKnUgPSAoKHVuaWNoYXIgKikgcmVzX2FsbG9jIChsZW4pKTsKICAgICAgd2luZF9NdWx0aUJ5dGVUb1dpZGVDaGFyIChjcCwgc3JjLCAqdSwgbGVuKTsKICAgIH0KICAvKiBEaXNjb3VudCB0aGUgdHJhaWxpbmcgJy8wJy4gIElmIE11bHRpQnl0ZVRvV2lkZUNoYXIgZmFpbGVkLAogICAgIHRoaXMgd2lsbCBzZXQgKmxlbmd0aCB0byAtMS4gICovCiAgbGVuIC09IHNpemVvZiAodW5pY2hhcik7CgogIGlmIChsZW5ndGggIT0gTlVMTCkKICAgICpsZW5ndGggPSBsZW4gLyBzaXplb2YgKHVuaWNoYXIpOwp9CgovKiBDb252ZXJ0IGFuIHVuaWNvZGUgc3RyaW5nIHRvIGFuIGNvZGVwYWdlIHN0cmluZy4gICovCgp2b2lkCmNvZGVwYWdlX2Zyb21fdW5pY29kZSAocmNfdWludF90eXBlICpsZW5ndGgsIGNvbnN0IHVuaWNoYXIgKnVuaWNvZGUsIGNoYXIgKiphc2NpaSwgcmNfdWludF90eXBlIGNwKQp7CiAgcmNfdWludF90eXBlIGxlbjsKCiAgbGVuID0gd2luZF9XaWRlQ2hhclRvTXVsdGlCeXRlIChjcCwgdW5pY29kZSwgTlVMTCwgMCk7CiAgaWYgKGxlbikKICAgIHsKICAgICAgKmFzY2lpID0gKGNoYXIgKikgcmVzX2FsbG9jIChsZW4gKiBzaXplb2YgKGNoYXIpKTsKICAgICAgd2luZF9XaWRlQ2hhclRvTXVsdGlCeXRlIChjcCwgdW5pY29kZSwgKmFzY2lpLCBsZW4pOwogICAgfQogIC8qIERpc2NvdW50IHRoZSB0cmFpbGluZyAnLzAnLiAgSWYgTXVsdGlCeXRlVG9XaWRlQ2hhciBmYWlsZWQsCiAgICAgdGhpcyB3aWxsIHNldCAqbGVuZ3RoIHRvIC0xLiAgKi8KICBsZW4tLTsKCiAgaWYgKGxlbmd0aCAhPSBOVUxMKQogICAgKmxlbmd0aCA9IGxlbjsKfQoKI2lmZGVmIEhBVkVfSUNPTlZfSApzdGF0aWMgaW50Cmljb252X29uZWNoYXIgKGljb252X3QgY2QsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKmQsIGludCBkX2xlbiwgY29uc3QgY2hhciAqKm5fcywgY2hhciAqKm5fZCkKewogIGludCBpOwoKICBmb3IgKGkgPSAxOyBpIDw9IDMyOyBpKyspCiAgICB7CiAgICAgIGNoYXIgKnRtcF9kID0gZDsKICAgICAgY29uc3QgY2hhciAqdG1wX3MgPSBzOwogICAgICBzaXplX3QgcmV0OwogICAgICBzaXplX3Qgc19sZWZ0ID0gKHNpemVfdCkgaTsKICAgICAgc2l6ZV90IGRfbGVmdCA9IChzaXplX3QpIGRfbGVuOwoKICAgICAgcmV0ID0gaWNvbnYgKGNkLCAmIHRtcF9zLCAmIHNfbGVmdCwgJiB0bXBfZCwgJiBkX2xlZnQpOwoKICAgICAgaWYgKHJldCAhPSAoc2l6ZV90KSAtMSkKCXsKCSAgKm5fcyA9IHRtcF9zOwoJICAqbl9kID0gdG1wX2Q7CgkgIHJldHVybiAwOwoJfQogICAgfQoKICByZXR1cm4gMTsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKgp3aW5kX2ljb252X2NwIChyY191aW50X3R5cGUgY3ApCnsKICBjb25zdCBsb2NhbF9pY29udl9tYXAgKmxpbSA9IHdpbmRfZmluZF9jb2RlcGFnZV9pbmZvIChjcCk7CgogIGlmICghbGltKQogICAgcmV0dXJuIE5VTEw7CiAgcmV0dXJuIGxpbS0+aWNvbnZfbmFtZTsKfQojZW5kaWYgLyogSEFWRV9JQ09OVl9IICovCgpzdGF0aWMgcmNfdWludF90eXBlCndpbmRfTXVsdGlCeXRlVG9XaWRlQ2hhciAocmNfdWludF90eXBlIGNwLCBjb25zdCBjaGFyICptYiwKCQkJICB1bmljaGFyICp1LCByY191aW50X3R5cGUgdV9sZW4pCnsKICByY191aW50X3R5cGUgcmV0ID0gMDsKCiNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCiAgcmV0ID0gKHJjX3VpbnRfdHlwZSkgTXVsdGlCeXRlVG9XaWRlQ2hhciAoY3AsIE1CX1BSRUNPTVBPU0VELAoJCQkJCSAgICBtYiwgLTEsIHUsIHVfbGVuKTsKICAvKiBDb252ZXJ0IHRvIGJ5dGVzLiAqLwogIHJldCAqPSBzaXplb2YgKHVuaWNoYXIpOwoKI2VsaWYgZGVmaW5lZCAoSEFWRV9JQ09OVl9IKQogIGludCBmaXJzdCA9IDE7CiAgY2hhciB0bXBbMzJdOwogIGNoYXIgKnBfdG1wOwogIGNvbnN0IGNoYXIgKmljb252X25hbWUgPSB3aW5kX2ljb252X2NwIChjcCk7CgogIGlmICghbWIgfHwgIWljb252X25hbWUpCiAgICByZXR1cm4gMDsKICBpY29udl90IGNkID0gaWNvbnZfb3BlbiAoIlVURi0xNiIsIGljb252X25hbWUpOwoKICB3aGlsZSAoMSkKICAgIHsKICAgICAgaW50IGlyZXQ7CiAgICAgIGNvbnN0IGNoYXIgKm5fbWI7CiAgICAgIGNoYXIgKm5fdG1wOwoKICAgICAgcF90bXAgPSB0bXA7CiAgICAgIGlyZXQgPSBpY29udl9vbmVjaGFyIChjZCwgKGNvbnN0IGNoYXIgKikgbWIsIHBfdG1wLCAzMiwgJiBuX21iLCAmIG5fdG1wKTsKICAgICAgaWYgKGZpcnN0KQoJewoJICBmaXJzdCA9IDA7CgkgIGNvbnRpbnVlOwoJfQogICAgICBpZiAoIWlyZXQpCgl7CgkgIHNpemVfdCBsX3RtcCA9IChzaXplX3QpIChuX3RtcCAtIHBfdG1wKTsKCgkgIGlmICh1KQoJICAgIHsKCSAgICAgIGlmICgoc2l6ZV90KSB1X2xlbiA8IGxfdG1wKQoJCWJyZWFrOwoJICAgICAgbWVtY3B5ICh1LCB0bXAsIGxfdG1wKTsKCSAgICAgIHUgKz0gbF90bXAvMjsKCSAgICAgIHVfbGVuIC09IGxfdG1wOwoJICAgIH0KCSAgcmV0ICs9IGxfdG1wOwoJfQogICAgICBlbHNlCglicmVhazsKICAgICAgaWYgKHRtcFswXSA9PSAwICYmIHRtcFsxXSA9PSAwKQoJYnJlYWs7CiAgICAgIG1iID0gbl9tYjsKICAgIH0KICBpY29udl9jbG9zZSAoY2QpOwojZWxzZQogIGlmIChjcCkKICAgIHJldCA9IDA7CiAgcmV0ID0gc3RybGVuIChtYikgKyAxOwogIHJldCAqPSBzaXplb2YgKHVuaWNoYXIpOwogIGlmICh1ICE9IE5VTEwgJiYgdV9sZW4gIT0gMCkKICAgIHsKICAgICAgZG8KCXsKCSAgKnUrKyA9ICgodW5pY2hhcikgKm1iKSAmIDB4ZmY7CgkgIC0tdV9sZW47IG1iKys7Cgl9CiAgICAgIHdoaWxlICh1X2xlbiAhPSAwICYmIG1iWy0xXSAhPSAwKTsKICAgIH0KICBpZiAodSAhPSBOVUxMICYmIHVfbGVuICE9IDApCiAgICAqdSA9IDA7CiNlbmRpZgogIHJldHVybiByZXQ7Cn0KCnN0YXRpYyByY191aW50X3R5cGUKd2luZF9XaWRlQ2hhclRvTXVsdGlCeXRlIChyY191aW50X3R5cGUgY3AsIGNvbnN0IHVuaWNoYXIgKnUsIGNoYXIgKm1iLCByY191aW50X3R5cGUgbWJfbGVuKQp7CiAgcmNfdWludF90eXBlIHJldCA9IDA7CiNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCiAgV0lOQk9PTCB1c2VkX2RlZiA9IEZBTFNFOwoKICByZXQgPSAocmNfdWludF90eXBlKSBXaWRlQ2hhclRvTXVsdGlCeXRlIChjcCwgMCwgdSwgLTEsIG1iLCBtYl9sZW4sCgkJCQkgICAgICAJICAgIE5VTEwsICYgdXNlZF9kZWYpOwojZWxpZiBkZWZpbmVkIChIQVZFX0lDT05WX0gpCiAgaW50IGZpcnN0ID0gMTsKICBjaGFyIHRtcFszMl07CiAgY2hhciAqcF90bXA7CiAgY29uc3QgY2hhciAqaWNvbnZfbmFtZSA9IHdpbmRfaWNvbnZfY3AgKGNwKTsKCiAgaWYgKCF1IHx8ICFpY29udl9uYW1lKQogICAgcmV0dXJuIDA7CiAgaWNvbnZfdCBjZCA9IGljb252X29wZW4gKGljb252X25hbWUsICJVVEYtMTYiKTsKCiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIGludCBpcmV0OwogICAgICBjb25zdCBjaGFyICpuX3U7CiAgICAgIGNoYXIgKm5fdG1wOwoKICAgICAgcF90bXAgPSB0bXA7CiAgICAgIGlyZXQgPSBpY29udl9vbmVjaGFyIChjZCwgKGNvbnN0IGNoYXIgKikgdSwgcF90bXAsIDMyLCAmbl91LCAmIG5fdG1wKTsKICAgICAgaWYgKGZpcnN0KQoJewoJICBmaXJzdCA9IDA7CgkgIGNvbnRpbnVlOwoJfQogICAgICBpZiAoIWlyZXQpCgl7CgkgIHNpemVfdCBsX3RtcCA9IChzaXplX3QpIChuX3RtcCAtIHBfdG1wKTsKCgkgIGlmIChtYikKCSAgICB7CgkgICAgICBpZiAoKHNpemVfdCkgbWJfbGVuIDwgbF90bXApCgkJYnJlYWs7CgkgICAgICBtZW1jcHkgKG1iLCB0bXAsIGxfdG1wKTsKCSAgICAgIG1iICs9IGxfdG1wOwoJICAgICAgbWJfbGVuIC09IGxfdG1wOwoJICAgIH0KCSAgcmV0ICs9IGxfdG1wOwoJfQogICAgICBlbHNlCglicmVhazsKICAgICAgaWYgKHVbMF0gPT0gMCkKCWJyZWFrOwogICAgICB1ID0gKGNvbnN0IHVuaWNoYXIgKikgbl91OwogICAgfQogIGljb252X2Nsb3NlIChjZCk7CiNlbHNlCiAgaWYgKGNwKQogICAgcmV0ID0gMDsKCiAgd2hpbGUgKHVbcmV0XSAhPSAwKQogICAgKytyZXQ7CgogICsrcmV0OwoKICBpZiAobWIpCiAgICB7CiAgICAgIHdoaWxlICgqdSAhPSAwICYmIG1iX2xlbiAhPSAwKQoJewoJICBpZiAodVswXSA9PSAodVswXSAmIDB4N2YpKQoJICAgICptYisrID0gKGNoYXIpIHVbMF07CgkgIGVsc2UKCSAgICAqbWIrKyA9ICdfJzsKCSAgKyt1OyAtLW1iX2xlbjsKCX0KICAgICAgaWYgKG1iX2xlbiAhPSAwKQoJKm1iID0gMDsKICAgIH0KI2VuZGlmCiAgcmV0dXJuIHJldDsKfQo=