LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBsb2cgZm9ybWF0IChhZGQgMC1wYWRkaW5nIGFzIGFwcHJvcHJpYXRlKToKICAgIGtleWNvZGUgICV1ICBhcyBpbiBvdXRwdXQgZnJvbSB4ZXYKICAgIGtleXN5bSAgICVseCBhcyBpbiBYMTEva2V5c3ltZGVmLmgKICAgIHZrZXkgICAgICVYICBhcyBpbiB3aW51c2VyLmgKICAgIHNjYW5jb2RlICV4CiovCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCnN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpzdGF0aWMgS2V5U3ltICprZXlfbWFwcGluZzsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgU2Nyb2xsTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBrYmRfc2VjdGlvbjsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgY3JpdHNlY3RfZGVidWcgPQp7CiAgICAwLCAwLCAma2JkX3NlY3Rpb24sCiAgICB7ICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IChEV09SRF9QVFIpKF9fRklMRV9fICI6IGtiZF9zZWN0aW9uIikgfQp9OwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBrYmRfc2VjdGlvbiA9IHsgJmNyaXRzZWN0X2RlYnVnLCAtMSwgMCwgMCwgMCwgMCB9OwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewogLyogMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgIF4gICAgXCAqLwogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDdkLAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBAICAgIFsgKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgIDogICAgXSAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg3MyAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fMywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV83LFZLX09FTV81LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzMsVktfT0VNXzQsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV9QTFVTLFZLX09FTV8xLFZLX09FTV82LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LCdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fUExVUywKICAgJ0EnLCdaJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnUScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJywnTScsVktfT0VNXzMsVktfT0VNXzUsCiAgICdXJywnWCcsJ0MnLCdWJywnQicsJ04nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX09FTV83LFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELCdQJywnWScsJ0YnLCdHJywnQycsJ1InLCdMJyxWS19PRU1fMixWS19PRU1fUExVUywKICAgJ0EnLCdPJywnRScsJ1UnLCdJJywnRCcsJ0gnLCdUJywnTicsJ1MnLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsJ1EnLCdKJywnSycsJ1gnLCdCJywnTScsJ1cnLCdWJywnWicsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFRoZXNlIHRhYmxlcyBzZXJ2ZSB0byBndWVzcyB0aGUga2V5Ym9hcmQgdHlwZSBhbmQgc2NhbmNvZGUgbWFwcGluZy4KICAgQ29tcGxldGUgbW9kZWxpbmcgaXMgbm90IGltcG9ydGFudCwgaWRlbnRpZmljYXRpb24vZGlzY3JpbWluYXRpb24gaXMuICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSBXSU5FREVCVUc9K2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMiIsIlwiMyIsIic0IiwiKDUiLCItNiIsIug3IiwiXzgiLCLnOSIsIuAwIiwiKbAiLCI9KyIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjIiwKICJxUSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKiBBbGwgZ2VybWFuIGtleWIgbGF5b3V0IHRhYmxlcyBoYXZlIHRoZSBhY3V0ZS9hcG9zdHJvcGhlIHN5bWJvbCBuZXh0IHRvCiAqIHRoZSBCQUNLU1BBQ0Uga2V5IHJlbW92ZWQgKHJlcGxhY2VkIHdpdGggTlVMTCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZQogKiBkZXRlY3Rpb24gY29kZSkuCiAqIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgbWFwcGluZyBvZiB0aGUgYWN1dGUgKGFuZCBhcG9zdHJvcGhlKSBpcyBkb25lCiAqIGRpZmZlcmVudGx5IGluIHZhcmlvdXMgeGtiLWRhdGEveGtleWJvYXJkLWNvbmZpZyB2ZXJzaW9ucy4gU29tZSByZXBsYWNlCiAqIHRoZSBhY3V0ZSB3aXRoIGEgbm9ybWFsIGFwb3N0cm9waGUsIHNvIHRoYXQgdGhlIGFwb3N0cm9waGUgaXMgZm91bmQgdHdpY2UKICogb24gdGhlIGtleWJvYXJkIChvbmUgbmV4dCB0byBCQUNLU1BBQ0UgYW5kIG9uZSBuZXh0IHRvIEVOVEVSKS4KICogT3RoZXJzIHB1dCB0aGUgYWN1dGUgYW5kIGdyYXZlIGFjY2VudHMgb24gdGhlIGtleSBsZWZ0IG9mIEJBQ0tTUEFDRS4KICogTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmQubyBidWd0cmFja2VyOgogKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUxNAogKiBLZXlzIHJlYWNoYWJsZSB2aWEgQWx0R3IgKEAsIFtdLCB+LCBcLCB8LCB7fSkgZGlmZmVyIGNvbXBsZXRlbHkKICogYW1vbmcgUEMgYW5kIE1hYyBrZXlib2FyZHMsIHNvIHRoZXNlIGFyZSBub3QgbGlzdGVkLgogKi8KCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRlIFstdmFyaWFudCBub2RlYWRrZXlzfGRlYWRhY3V0ZSBldGMuXSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi3z8iLCIiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjaCAtdmFyaWFudCBkZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0dbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSsiLCIyXCIiLCIzKiIsIjTnIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCJeYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86CIsIqghIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgIiwiJKMiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRltNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8IiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIun2Iiwi4OQiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGspICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2UpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEVzdG9uaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FVFtNQUlOX0xFTl1bNF0gPQp7CiAit34iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwi9dUiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2FfZW5oYW5jZWQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApvCIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIrioXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzp+IiwiYGB7IiwiPD59IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnLSIsIi4iLCLpySIsCiAiq7uwIgp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EgLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBX2ZyW01BSU5fTEVOXVs0XSA9CnsKICIjfCIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjUlIiwiNj8iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXl4iLCK4qCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCJgYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnIiwiLiIsIunJIiwKICKruyIKfTsKCi8qKiogQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBW01BSU5fTEVOXVs0XSA9CnsKICIvXFwiLCIxIbmhIiwiMkCyIiwiMyOzoyIsIjQkvKQiLCI1Jb0iLCI2P74iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/jYIiwicFD+3iIsIl6oqCIsIufHfiIsCiAiYUHmxiIsInNT36ciLCJkRPDQIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzq0Iiwi6MgiLCLgwCIsCiAieloiLCJ4WCIsImNDoqkiLCJ2ViIsImJCIiwibk4iLCJtTbW6IiwiLCciLCIuXCK39yIsIunJIiwKICL52SIKfTsKCi8qKiogUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBwdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiq7siLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiKyoiLCK0YCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCK6qiIsIn5eIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIuxeIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIujpIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvLnIiwi4LAiLCL5pyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBGaW5uaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGZpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GSVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19iZHNbTUFJTl9MRU5dWzRdID0KewogImB+KCkiLCIxISIsIjJAMj8iLCIzIzMrIiwiNCQ0XCIiLCI1JSIsIjZeNj0iLCI3Jjc6IiwiOCo4LyIsIjkoIiwiMCkiLCItXy1JIiwiPSsuViIsCiAicVEs+yIsIndX89MiLCJlReXFIiwiclLoyCIsInRU+NgiLCJ5WfnZIiwidVXqyiIsImlJ8dEiLCJvT+TEIiwicFDnxyIsIlt79tYiLCJdfTsiLAogImFB/NwiLCJzU//fIiwiZETgwCIsImZG7s4iLCJnR+bGIiwiaEjjwyIsImpK8tIiLCJrS+3NIiwibEziwiIsIjs67MwiLCInXCL31yIsIlxcfCfbIiwKICJ6Wv7eIiwieFjpySIsImND+toiLCJ2Vv3dIiwiYkL01CIsIm5O9dUiLCJtTe/PIiwiLDzw0CIsIi4+68siLCIvP+HBIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+99ciLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR/98iLCJ3V+LCIiwiZUXlxSIsInJS8NAiLCJ0VPLSIiwieVn62iIsInVV89MiLCJpSejIIiwib0/uziIsInBQ788iLCJbe/jYIiwiXX352SIsCiAiYUHgwCIsInNT8dEiLCJkROTEIiwiZkb01CIsImdH48MiLCJoSPXVIiwiakrpySIsImtL6soiLCJsTOvLIiwiOzoiLCInXCIiLCJcXHz+3iIsCiAielrnxyIsInhY/NwiLCJjQ/bWIiwidlbmxiIsImJC4cEiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCZWxhcnVzaWFuIHN0YW5kYXJkIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSGxlYiBWYWxvc2thKSAqLwovKioqIEl0IG1hdGNoZXMgQmVsYXJ1c2lhbiBsYXlvdXQgZm9yIFhLQiBmcm9tIEFsZXhhbmRlciBNaWtoYWlsaWFuICAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JZW01BSU5fTEVOXVs0XSA9CnsKICJgfqOzIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9Prr4iLCJwUNr6IiwiW3vI6CIsIl19JyciLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfC98IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkKmtiIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy4sIiwgIjw+fKYiLAp9OwoKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9rb2k4cltNQUlOX0xFTl1bNF0gPQp7CiAiKCkiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1OiIsIjYsIiwiNy4iLCI4OyIsIjk/IiwiMCUiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXHwiLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9jcDEyNTFbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUenJIiwid1f21iIsImVF89MiLCJyUurKIiwidFTlxSIsInlZ7c0iLCJ1VePDIiwiaUn42CIsIm9P+dkiLCJwUOfHIiwiW3v11SIsIl19+toiLAogImFB9NQiLCJzU/vbIiwiZETiwiIsImZG4MAiLCJnR+/PIiwiaEjw0CIsImpK7s4iLCJrS+vLIiwibEzkxCIsIjs65sYiLCInXCL93SIsIlxcfCIsCiAielr/3yIsInhY99ciLCJjQ/HRIiwidlbszCIsImJC6MgiLCJuTvLSIiwibU383CIsIiw84cEiLCIuPv7eIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUdHxIiwid1fX9yIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2fkiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl193f0iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKyuoiLCJrS8vrIiwibEzM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wtr6IiwieFjY+CIsImNDw+MiLCJ2Vtb2IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBW01BSU5fTEVOXVs0XSA9CnsKICJgfq29IiwiMSExISIsIjJAMlwiIiwiMyMzJyIsIjQkNCoiLCI1JTU6IiwiNl42LCIsIjcmNy4iLCI4Kjg7IiwiOSg5KCIsIjApMCkiLCItXy1fIiwiPSs9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfae3IiwKICJhQcbmIiwic1OmtiIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wipLQiLCJcXHxcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Lz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgYnkgTy4gTnlreWZvcmNoeW4gKi8KLyoqKiAgKGFzIGl0IGFwcGVhcnMgb24gbW9zdCBvZiBrZXlib2FyZHMgc29sZCB0b2RheSkgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQV9zdGRbTUFJTl9MRU5dWzRdID0KewogIq29IiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIqe3IiwKICLG5iIsIqa2Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsIqS0IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKHBhaXIgdG8gdGhlIHByZXZpb3VzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9zdGRbTUFJTl9MRU5dWzRdID0KewogIqOzIiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTcGFuaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqoiLCIxISIsIjJcIiIsIjO3IiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwitKgiLCLnxyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCZWxnaWFuIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JFW01BSU5fTEVOXVs0XSA9CnsKICIiLCImMXwiLCLpMkAiLCJcIjMjIiwiJzQiLCIoNSIsIqc2XiIsIug3IiwiITgiLCLnOXsiLCLgMH0iLCIpsCIsIi1fIiwKICJhQSIsInpaIiwiZUWkIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqFsiLCIkKl0iLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvkltCIsIrWjYCIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiPSt+IiwKICI8PlxcIgp9OwoKLyoqKiBIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hVW01BSU5fTEVOXVs0XSA9CnsKICIwpyIsIjEnIiwiMlwiIiwiMysiLCI0ISIsIjUlIiwiNi8iLCI3PSIsIjgoIiwiOSkiLCL21iIsIvzcIiwi89MiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi9dUiLCL62iIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6ckiLCLhwSIsIvvbIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAi7c0iCn07CgovKioqIFBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JqciLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUXqyiIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/PTIiwicFAiLCJbeyIsIl19IiwKICJhQbGhIiwic1O2piIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMs6MiLCI7OiIsIidcIiIsIlxcfCIsCiAielq/ryIsInhYvKwiLCJjQ+bGIiwidlYiLCJiQiIsIm5O8dEiLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2kpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICKpuSIsIqq6IiwixeUiLCLS8iIsItT0Iiwi2voiLCLV9SIsIsnpIiwiz+8iLCLQ8CIsItv7IiwiW10iLAogIsHhIiwi0/MiLCLE5CIsIsbmIiwix+ciLCLI6CIsIqi4Iiwiy+siLCLM7CIsIt7+Iiwiq7siLCItXyIsCiAiobEiLCKvvyIsIsPjIiwi1/ciLCLC4iIsIs7uIiwize0iLCIsOyIsIi46Iiwi1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAMlwiIiwiMyMiLCI0JCIsIjUlIiwiNl42JiIsIjcmNy8iLCI4KjgoIiwiOSg5KSIsIjApMD0iLCItXyc/IiwiPSsrKiIsCiAicVGpuSIsIndXqroiLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdr6IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfVtdIiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSqi4Iiwia0vL6yIsImxMzOwiLCI7Ot7+IiwiJ1wiq7siLCJcXHwtXyIsCiAielqhsSIsInhYr78iLCJjQ8PjIiwidlbX9yIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8LDsiLCIuPi46IiwiLz/W9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGhyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCIvPyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfbWFjanBbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJfXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNqgiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCJ+XiIsIl19IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/IiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgd2l0aCA8QUxUIEdSPiAoY29udHJpYnV0ZWQgYnkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icl9hbHRfZ3JbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhOSIsIjJAMiIsIjMjMyIsIjQkIyIsIjUlXCIiLCI2KCwiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsnIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIjRgIiwiW3sqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJnRyIsIn5eIiwiXX06IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/MCIKfTsKCi8qKiogVVMgaW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEd1c3Rhdm8gTm9yb25oYSAoa292QGRlYmlhbi5vcmcpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19pbnRsW01BSU5fTEVOXVs0XSA9CnsKICAiYH4iLCAiMSEiLCAiMkAiLCAiMyMiLCAiNCQiLCAiNSUiLCAiNl4iLCAiNyYiLCAiOCoiLCAiOSgiLCAiMCkiLCAiLV8iLCAiPSsiLCAiXFx8IiwKICAicVEiLCAid1ciLCAiZUUiLCAiclIiLCAidFQiLCAieVkiLCAidVUiLCAiaUkiLCAib08iLCAicFAiLCAiW3siLCAiXX0iLAogICJhQSIsICJzUyIsICJkRCIsICJmRiIsICJnRyIsICJoSCIsICJqSiIsICJrSyIsICJsTCIsICI7OiIsICInXCIiLAogICJ6WiIsICJ4WCIsICJjQyIsICJ2ViIsICJiQiIsICJuTiIsICJtTSIsICIsPCIsICIuPiIsICIvPyIKfTsKCi8qKiogU2xvdmFrIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKHNrX3F3ZXJ0eSkgaW4geGtic2VsKQogIC0gZGVhZF9hYm92ZXJpbmcgcmVwbGFjZWQgd2l0aCBkZWdyZWUgLSBubyBzeW1ib2wgaW4gaXNvODg1OS0yCiAgLSBicm9rZW5iYXIgcmVwbGFjZWQgd2l0aCBiYXIJCQkJCSovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLW01BSU5fTEVOXVs0XSA9CnsKICI7MCIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCIndiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIuQoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL0XCIiLCKnISIsIvIpIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWltNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6X3F3ZXJ0eSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pfcXdlcnR5W01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogU2xvdmFrIGFuZCBDemVjaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2R1YWwoY3Nfc2tfdWN3KSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tfcHJvZ1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR5MQiLCJ3V+zMIiwiZUXpySIsInJS+NgiLCJ0VLurIiwieVn93SIsInVV+dkiLCJpSe3NIiwib0/z0yIsInBQ9tYiLCJbeyIsIl19IiwKICJhQeHBIiwic1O5qSIsImRE788iLCJmRuvLIiwiZ0fgwCIsImhI+toiLCJqSvzcIiwia0v01CIsImxMtaUiLCI7OiIsIidcIiIsIlxcfCIsCiAielq+riIsInhYpCIsImND6MgiLCJ2VufHIiwiYkIiLCJuTvLSIiwibU3lxSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKGNzX3F3ZXJ0eSkgaW4geGtic2VsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DU1tNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwvSkiLCI9JSIsIiIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6L1t7IiwiKShdfSIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi+VwiJCIsIqch3yIsIqgnIiwKICJ6Wj4iLCJ4WCMiLCJjQyYiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTSIsIiw/PCIsIi46PiIsIi1fKiIsCiAiPD5cXHwiCn07CgovKioqIExhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR2FicmllbCBPcmxhbmRvIEdhcmNpYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTEFbTUFJTl9MRU5dWzRdID0KewogInywIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCK/oSIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitKgiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBMaXRodWFuaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGx0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MVF9CW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIuDAIiwi6MgiLCLmxiIsIuvLIiwi4cEiLCLw0CIsIvjYIiwi+9siLCKlKCIsIrQpIiwiLV8iLCL+3iIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIqqsIgp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIExheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9US1tNQUlOX0xFTl1bNF0gPQp7CiJcIukiLCIxISIsIjInIiwiM14jIiwiNCskIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIio/XFwiLCItXyIsCiJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCL9Se4iLCJvTyIsInBQIiwi8NAiLCL83H4iLAoiYUHmIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL+3iIsImndIiwiLDtgIiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46Igp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUltNQUlOX0xFTl1bNF0gPQp7CiJcIlxcIiwiMSEiLCIyJyIsIjNeIiwiNCsiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIqPyIsIi1fIiwKInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiXHhiOUkiLCJvTyIsInBQIiwiXHhiYlx4YWIiLCL83CIsCiJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGJhXHhhYSIsImlcMCIsIiw7IiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46IiwKIjw+Igp9OwoKLyoqKiBUdXJraXNoIEYga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHJmKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUl9GW01BSU5fTEVOXVs0XSA9CnsKIisqIiwiMSEiLCIyXCIiLCIzXiMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwPSIsIi8/IiwiLV8iLAoiZkYiLCJnRyIsIlx4YmJceGFiIiwiXHhiOUkiLCJvTyIsImREIiwiclIiLCJuTiIsImhIIiwicFAiLCJxUSIsIndXIiwKInVVIiwiaVwwIiwiZUUiLCJhQSIsIvzcIiwidFQiLCJrSyIsIm1NIiwibEwiLCJ5WSIsIlx4YmFceGFhIiwieFgiLAoiakoiLCL21iIsInZWIiwiY0MiLCLnxyIsInpaIiwic1MiLCJiQiIsIi46IiwiLDsiLAoiPD4iCn07CgovKioqIElzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxbTUFJTl9MRU5dWzRdID0KewogImB+OyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEvIiwid1cnIiwiZUX3IiwiclL4IiwidFTgIiwieVnoIiwidVXlIiwiaUnvIiwib0/tIiwicFD0IiwiW3siLCJdfSIsCiAiYUH5Iiwic1PjIiwiZETiIiwiZkbrIiwiZ0fyIiwiaEjpIiwiakrnIiwia0vsIiwibEzqIiwiOzrzIiwiXCdcIiwiLCJcXHwiLAogInpa5iIsInhY8SIsImND4SIsInZW5CIsImJC8CIsIm5O7iIsIm1N9iIsIiw8+iIsIi4+9SIsIi8/LiIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbF9waG9uZXRpYykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V+UiLCJlReAiLCJyUvgiLCJ0VPoiLCJ5WfIiLCJ1VeUiLCJpSekiLCJvT/EiLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU/kiLCJkROMiLCJmRvQiLCJnR+IiLCJoSOQiLCJqSukiLCJrS+siLCJsTOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlblIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgLXN5bWJvbHMgInVzKHBjMTA1KStpbF9zYWhhcm9uIikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfc2FoYXJvbltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX8SIsImVFIiwiclL4IiwidFToIiwieVnjIiwidVUiLCJpSSIsIm9PIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1PlIiwiZETsIiwiZkb6IiwiZ0fiIiwiaEjkIiwiakr5Iiwia0vrIiwibEzpIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW8iIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEdyZWVrIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgS3JpdG9uIEt5cmltaXMgPGt5cmltaXNAY3RpLmdyPikKICBHcmVlayBjaGFyYWN0ZXJzIGZvciAid1ciIGFuZCAic1MiIGFyZSBvbWl0dGVkIHRvIG5vdCBwcm9kdWNlIGEgbWlzbWF0Y2gKICBtZXNzYWdlIHNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVycyBpbiBnciBhbmQgZWwgWEZyZWU4NiBsYXlvdXRzLiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFROzoiLCJ3VyIsImVF5cUiLCJyUvHRIiwidFT01CIsInlZ9dUiLCJ1VejIIiwiaUnpySIsIm9P788iLCJwUPDQIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTIiwiZETkxCIsImZG9tYiLCJnR+PDIiwiaEjnxyIsImpK7s4iLCJrS+rKIiwibEzryyIsIjs6tKgiLCInXCIiLCJcXHwiLAogInpa5sYiLCJ4WPfXIiwiY0P42CIsInZW+dkiLCJiQuLCIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBUaGFpIChLZWRtYW5lZSkga2V5Ym9hcmQgbGF5b3V0IGJ5IFN1cHBoYWNob2tlIFN1bnRpd2ljaGF5YSA8bXJjaG9rZUBvcGVudGxlLm9yZz4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdGhbTUFJTl9MRU5dWzRdID0KewogImB+XyUiLCIxIeUrIiwiMkAv8SIsIjMjLfIiLCI0JMDzIiwiNSW29CIsIjZe2NkiLCI3JtbfIiwiOCqk9SIsIjkotfYiLCIwKaj3IiwiLV+i+CIsIj0rqvkiLAogInFR5vAiLCJ3V+RcIiIsImVF064iLCJyUr6xIiwidFTQuCIsInlZ0e0iLCJ1VdXqIiwiaUnDsyIsIm9Puc8iLCJwUMKtIiwiW3u6sCIsIl19xSwiLAogImFBv8QiLCJzU8umIiwiZEShryIsImZGtOIiLCJnR+CsIiwiaEjp5yIsImpK6OsiLCJrS9LJIiwibEzKyCIsIjs6x6siLCJcJ1wipy4iLCJcXHyjpSIsCiAielq8KCIsInhYuykiLCJjQ+GpIiwidlbNziIsImJC2iIsIm5O1+wiLCJtTbc/IiwiLDzBsiIsIi4+48wiLCIvP73GIgp9OyAKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fNCxWS19PRU1fNixWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fMyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fNSwKICAgJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLCdIJywnSScsJ0onLCdLJywnTCcsJ00nLCdOJywnTycsJ1AnLCdRJywnUicsJ1MnLCdUJywnVScsJ1YnLCdXJywnWCcsJ1knLCdaJywKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbmwpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTkxbTUFJTl9MRU5dWzRdID0KewogIkCnIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjdfIiwiOCgiLCI5KSIsIjAnIiwiLz8iLCKwfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCKofiIsIip8IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIrsSIsIidgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi09IiwKICJbXSIKfTsKCgoKLyoqKiBMYXlvdXQgdGFibGUuIEFkZCB5b3VyIGtleWJvYXJkIG1hcHBpbmdzIHRvIHRoaXMgbGlzdCAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIExDSUQgbGNpZDsgLyogaW5wdXQgbG9jYWxlIGlkZW50aWZpZXIsIGxvb2sgZm9yIExPQ0FMRV9JTEFOR1VBR0UKICAgICAgICAgICAgICAgICBpbiB0aGUgYXBwcm9wcmlhdGUgZGxscy9rZXJuZWwvbmxzLy5ubHMgZmlsZSAqLwogICAgY29uc3QgY2hhciAqY29tbWVudDsKICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9VU19waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKGR2b3JhaykiLCAmbWFpbl9rZXlfVVNfZHZvcmFrLCAmbWFpbl9rZXlfc2Nhbl9kdm9yYWssICZtYWluX2tleV92a2V5X2R2b3Jha30sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODA5LCAiQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwODA3LCAiU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MTAwYywgIlN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWQsICJTd2VkaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfdjJ9LAogezB4MDQyNSwgIkVzdG9uaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNCwgIk5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTk8sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDYsICJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBjLCAiRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChDQV9mcikiLCAmbWFpbl9rZXlfQ0FfZnIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0EsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MGMsICJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MDgxNiwgIlBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFRfYnIsICZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgQUxUIEdSIiwgJm1haW5fa2V5X1BUX2JyX2FsdF9nciwmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQwYiwgIkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfYmRzLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMywgIkJlbGFydXNpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JZLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfUlVfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsICZtYWluX2tleV9SVV9rb2k4ciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSIsICZtYWluX2tleV9SVV9jcDEyNTEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVV9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIiwgJm1haW5fa2V5X1VBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1VBX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfUlVfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTAsICJJdGFsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZiwgIkljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGUsICJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDE1LCAiUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNCwgIlNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCBzciIsICZtYWluX2tleV9TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgdXMsc3IiLCAmbWFpbl9rZXlfVVNfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgJm1haW5fa2V5X0hSX2plbGx5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDExLCAiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZ9LAogezB4MDQxMSwgIkphcGFuZXNlIE1hYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfbWFjanAsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcCwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X21hY2pwfSwKIHsweDA0MTEsICJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgJm1haW5fa2V5X0NaLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6X3F3ZXJ0eSIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjcsICJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0ciIsICZtYWluX2tleV9UUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyZiIsICZtYWluX2tleV9UUl9GLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfc2FoYXJvbiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlZOQyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdm5jLCAmbWFpbl9rZXlfc2Nhbl92bmMsICZtYWluX2tleV92a2V5X3ZuY30sCiB7MHgwNDA4LCAiR3JlZWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFlLCAiVGhhaSAoS2VkbWFuZWUpICBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdGgsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTMsICJEdXRjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTkwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKCiB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfdmtleVsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMCwgVktfSEFOR1VMLCAwLCAwLCBWS19IQU5KQSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTAgKi8KICAgIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwwLDAsIFZLX0FQUFMsIC8qIEZGNjAgKi8KICAgIDAsIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICBWS19FTkQsIFZLX0NMRUFSLCBWS19JTlNFUlQsIFZLX0RFTEVURSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIC8qIFdpbmRvd3MgYWx3YXlzIGdlbmVyYXRlcyBWS19ERUNJTUFMIGZvciBEZWwvLiBvbiBrZXlwYWQgd2hpbGUgc29tZQogICAgICogWDExIGtleWJvYXJkIGxheW91dHMgZ2VuZXJhdGUgWEtfS1BfU2VwYXJhdG9yIGluc3RlYWQgb2YgWEtfS1BfRGVjaW1hbAogICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgKi8KICAgIFZLX0RFQ0lNQUwsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgVktfT0VNX05FQ19FUVVBTCwgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgVktfRjE3LCBWS19GMTgsIC8qIEZGQzggKi8KICAgIFZLX0YxOSwgVktfRjIwLCBWS19GMjEsIFZLX0YyMiwgVktfRjIzLCBWS19GMjQsIDAsIDAsICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX0xTSElGVCwgVktfUlNISUZULCBWS19MQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX1JDT05UUk9MLCBWS19DQVBJVEFMLCAwLCBWS19MTUVOVSwKICAgIFZLX1JNRU5VLCBWS19MTUVOVSwgVktfUk1FTlUsIFZLX0xXSU4sIFZLX1JXSU4sIDAsIDAsIDAsICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNUQsICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0NSwgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4NUIsIDB4NUMsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MTM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MTViLCAweDE1YywgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgpzdGF0aWMgaW5saW5lIEtleVN5bSBrZXljb2RlX3RvX2tleXN5bSggRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrZXljb2RlLCBpbnQgaW5kZXggKQp7CiNpZmRlZiBIQVZFX1hLQgogICAgaWYgKHVzZV94a2IpIHJldHVybiBYa2JLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgMCwgaW5kZXgpOwojZW5kaWYKICAgIHJldHVybiBrZXlfbWFwcGluZ1soa2V5Y29kZSAtIG1pbl9rZXljb2RlKSAqIGtleXN5bXNfcGVyX2tleWNvZGUgKyBpbmRleF07Cn0KCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCi8qIGtiZF9zZWN0aW9uIG11c3QgYmUgaGVsZCAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYSUMgeGljLCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgU3RhdHVzIHN0YXR1czsKICAgIGNoYXIgYnVmWzI0XTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBlLT50eXBlID09IEtleVByZXNzKQogICAgICAgIFhtYkxvb2t1cFN0cmluZyh4aWMsIGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIFhMb29rdXBTdHJpbmcoZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgIChrZXlzeW0gPT0gWEtfS1BfU2VwYXJhdG9yIHx8IGtleXN5bSA9PSBYS19LUF9EZWNpbWFsIHx8CiAgICAgICAgIChrZXlzeW0gPj0gWEtfS1BfMCAmJiBrZXlzeW0gPD0gWEtfS1BfOSkpKQogICAgICAgIC8qIE9ubHkgdGhlIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBzZW5kIGRpZmZlcmVudCBrZXlzeW1zCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCiAgICAgICAgcmV0dXJuIG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhGRl07CgogICAgLyogUHJlc3NpbmcgdGhlIFBhdXNlL0JyZWFrIGtleSBhbG9uZSBwcm9kdWNlcyBWS19QQVVTRSB2a2V5LCB3aGlsZQogICAgICogcHJlc3NpbmcgQ3RybCtQYXVzZS9CcmVhayBwcm9kdWNlcyBWS19DQU5DRUwuICovCiAgICBpZiAoKGUtPnN0YXRlICYgQ29udHJvbE1hc2spICYmIChrZXlzeW0gPT0gWEtfQnJlYWspKQogICAgICAgIHJldHVybiBWS19DQU5DRUw7CgogICAgVFJBQ0VfKGtleSkoImUtPmtleWNvZGUgPSAldVxuIiwgZS0+a2V5Y29kZSk7CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnN0YXRpYyB2b2lkIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBIV05EIGh3bmQsIFdPUkQgdmtleSwgV09SRCBzY2FuLCBEV09SRCBmbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIFRSQUNFXyhrZXkpKCAiaHduZCAlcCB2a2V5PSUwNHggc2Nhbj0lMDR4IGZsYWdzPSUwNHhcbiIsIGh3bmQsIHZrZXksIHNjYW4sIGZsYWdzICk7CgogICAgaW5wdXQudHlwZSAgICAgICAgICAgICA9IElOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHZrZXk7CiAgICBpbnB1dC51LmtpLndTY2FuICAgICAgID0gc2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBmbGFnczsKICAgIGlucHV0LnUua2kudGltZSAgICAgICAgPSB0aW1lOwogICAgaW5wdXQudS5raS5kd0V4dHJhSW5mbyA9IDA7CgogICAgX193aW5lX3NlbmRfaW5wdXQoIGh3bmQsICZpbnB1dCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgQk9PTCBnZXRfYXN5bmNfa2V5X3N0YXRlKCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBCT09MIHJldDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IDA7CiAgICAgICAgcmVxLT5rZXkgPSAtMTsKICAgICAgICB3aW5lX3NlcnZlcl9zZXRfcmVwbHkoIHJlcSwgc3RhdGUsIDI1NiApOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgdm9pZCBzZXRfYXN5bmNfa2V5X3N0YXRlKCBjb25zdCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgIHJlcS0+YXN5bmMgPSAxOwogICAgICAgIHdpbmVfc2VydmVyX2FkZF9kYXRhKCByZXEsIHN0YXRlLCAyNTYgKTsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfa2V5X3N0YXRlKCBCWVRFICprZXlzdGF0ZSwgQllURSBrZXksIGludCBkb3duICkKewogICAgaWYgKGRvd24pCiAgICB7CiAgICAgICAgaWYgKCEoa2V5c3RhdGVba2V5XSAmIDB4ODApKSBrZXlzdGF0ZVtrZXldIF49IDB4MDE7CiAgICAgICAga2V5c3RhdGVba2V5XSB8PSAweDgwOwogICAgfQogICAgZWxzZSBrZXlzdGF0ZVtrZXldICY9IH4weDgwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgajsKICAgIEJZVEUga2V5c3RhdGVbMjU2XTsKICAgIFdPUkQgdmtleTsKICAgIEJPT0wgY2hhbmdlZCA9IEZBTFNFOwogICAgc3RydWN0IHsKICAgICAgICBXT1JEIHZrZXk7CiAgICAgICAgQk9PTCBwcmVzc2VkOwogICAgfSBtb2RpZmllcnNbNl07IC8qIFZLX0xTSElGVCB0aHJvdWdoIFZLX1JNRU5VIGFyZSBjb250aWd1b3VzICovCiAgICBCT09MIGx3aW5fcHJlc3NlZCA9IEZBTFNFLCByd2luX3ByZXNzZWQgPSBGQUxTRTsKCiAgICBpZiAoIWdldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICkpIHJldHVybjsKCiAgICBtZW1zZXQobW9kaWZpZXJzLCAwLCBzaXplb2YobW9kaWZpZXJzKSk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIC8qIHRoZSBtaW5pbXVtIGtleWNvZGUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gOCwgc28gd2UgY2FuCiAgICAgKiBza2lwIHRoZSBmaXJzdCA4IHZhbHVlcywgaGVuY2Ugc3RhcnQgYXQgMQogICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IG07CgogICAgICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5WyhpICogOCkgKyBqXTsKCiAgICAgICAgICAgIHN3aXRjaCh2a2V5ICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICBtID0gKHZrZXkgJiAweGZmKSAtIFZLX0xTSElGVDsKICAgICAgICAgICAgICAgIC8qIFRha2UgdGhlIHZrZXkgZnJvbSB0aGUgZmlyc3Qga2V5Y29kZSB3ZSBlbmNvdW50ZXIgZm9yIHRoaXMgbW9kaWZpZXIgKi8KICAgICAgICAgICAgICAgIGlmICghbW9kaWZpZXJzW21dLnZrZXkpIG1vZGlmaWVyc1ttXS52a2V5ID0gdmtleTsKICAgICAgICAgICAgICAgIGlmIChldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSBtb2RpZmllcnNbbV0ucHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19MV0lOOgogICAgICAgICAgICAgICAgaWYgKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpIGx3aW5fcHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19SV0lOOgogICAgICAgICAgICAgICAgaWYgKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpIHJ3aW5fcHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZrZXkgPSBWS19MU0hJRlQ7IHZrZXkgPD0gVktfUk1FTlU7IHZrZXkrKykKICAgIHsKICAgICAgICBpbnQgbSA9IHZrZXkgLSBWS19MU0hJRlQ7CiAgICAgICAgaWYgKG1vZGlmaWVyc1ttXS52a2V5ICYmICEoa2V5c3RhdGVbdmtleV0gJiAweDgwKSAhPSAhbW9kaWZpZXJzW21dLnByZXNzZWQpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSggIkFkanVzdGluZyBzdGF0ZSBmb3IgdmtleSAlIy4yeC4gU3RhdGUgYmVmb3JlICUjLjJ4XG4iLAogICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzW21dLnZrZXksIGtleXN0YXRlW3ZrZXldKTsKCiAgICAgICAgICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCB2a2V5LCBtb2RpZmllcnNbbV0ucHJlc3NlZCApOwogICAgICAgICAgICBjaGFuZ2VkID0gVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCEoa2V5c3RhdGVbVktfTFdJTl0gJiAweDgwKSAhPSAhbHdpbl9wcmVzc2VkKQogICAgewogICAgICAgIFRSQUNFKCAiQWRqdXN0aW5nIHN0YXRlIGZvciBWS19MV0lOLiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsIGtleXN0YXRlW1ZLX0xXSU5dKTsKICAgICAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTFdJTiwgbHdpbl9wcmVzc2VkICk7CiAgICAgICAgY2hhbmdlZCA9IFRSVUU7CiAgICB9CiAgICBpZiAoIShrZXlzdGF0ZVtWS19SV0lOXSAmIDB4ODApICE9ICFyd2luX3ByZXNzZWQpCiAgICB7CiAgICAgICAgVFJBQ0UoICJBZGp1c3Rpbmcgc3RhdGUgZm9yIFZLX1JXSU4uIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwga2V5c3RhdGVbVktfUldJTl0pOwogICAgICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCBWS19SV0lOLCByd2luX3ByZXNzZWQgKTsKICAgICAgICBjaGFuZ2VkID0gVFJVRTsKICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICBpZiAoIWNoYW5nZWQpIHJldHVybjsKCiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfQ09OVFJPTCwgKGtleXN0YXRlW1ZLX0xDT05UUk9MXSB8IGtleXN0YXRlW1ZLX1JDT05UUk9MXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTUVOVSwgKGtleXN0YXRlW1ZLX0xNRU5VXSB8IGtleXN0YXRlW1ZLX1JNRU5VXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfU0hJRlQsIChrZXlzdGF0ZVtWS19MU0hJRlRdIHwga2V5c3RhdGVbVktfUlNISUZUXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTFdJTiwga2V5c3RhdGVbVktfTFdJTl0gJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfUldJTiwga2V5c3RhdGVbVktfUldJTl0gJiAweDgwICk7CiAgICBzZXRfYXN5bmNfa2V5X3N0YXRlKCBrZXlzdGF0ZSApOwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfbG9ja19zdGF0ZSggSFdORCBod25kLCBXT1JEIHZrZXksIFVJTlQgc3RhdGUsIERXT1JEIHRpbWUgKQp7CiAgICBCWVRFIGtleXN0YXRlWzI1Nl07CgogICAgLyogTm90ZTogWCBzZXRzIHRoZSBiZWxvdyBzdGF0ZXMgb24ga2V5IGRvd24gYW5kIGNsZWFycyB0aGVtIG9uIGtleSB1cC4KICAgICAgIFdpbmRvd3MgdHJpZ2dlcnMgdGhlbSBvbiBrZXkgZG93bi4gKi8KCiAgICBpZiAoIWdldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICkpIHJldHVybjsKCiAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBMb2NrTWFzaykgJiYgdmtleSAhPSBWS19DQVBJVEFMKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gMDsKICAgICAgICBpZiAoa2V5c3RhdGVbVktfQ0FQSVRBTF0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBDYXBzTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19DQVBJVEFMXSk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX0NBUElUQUwsIDB4M2EsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX0NBUElUQUwsIDB4M2EsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBOdW1Mb2NrTWFzaykgJiYgKHZrZXkgJiAweGZmKSAhPSBWS19OVU1MT0NLKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19OVU1MT0NLXSAmIDB4ODApIGZsYWdzIF49IEtFWUVWRU5URl9LRVlVUDsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5c3RhdGVbVktfTlVNTE9DS10pOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19OVU1MT0NLLCAweDQ1LCBmbGFncywgdGltZSApOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19OVU1MT0NLLCAweDQ1LCBmbGFncyBeIEtFWUVWRU5URl9LRVlVUCwgdGltZSApOwogICAgfQoKICAgIC8qIEFkanVzdCB0aGUgU0NST0xMTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwogICAgaWYgKCEoa2V5c3RhdGVbVktfU0NST0xMXSAmIDB4MDEpICE9ICEoc3RhdGUgJiBTY3JvbGxMb2NrTWFzaykgJiYgdmtleSAhPSBWS19TQ1JPTEwpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19TQ1JPTExdICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgU2NyTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19TQ1JPTExdKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfU0NST0xMLCAweDQ2LCBmbGFncywgdGltZSApOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19TQ1JPTEwsIDB4NDYsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBidWZbMjRdOwogICAgY2hhciAqU3RyID0gYnVmOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSB1cGRhdGVfdXNlcl90aW1lKCBldmVudC0+dGltZSApOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGV2ZW50LT50eXBlID09IEtleVByZXNzKQogICAgewogICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIFRSQUNFXyhrZXkpKCJYbWJMb29rdXBTdHJpbmcgbmVlZHMgJWkgYnl0ZShzKVxuIiwgYXNjaWlfY2hhcnMpOwogICAgICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIHsKICAgICAgICAgICAgU3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGFzY2lpX2NoYXJzKTsKICAgICAgICAgICAgaWYgKFN0ciA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlJfKGtleSkoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkhXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIGFzY2lpX2NoYXJzLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzICVkXG4iLCBhc2NpaV9jaGFycywgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhMb29rdXBDaGFycykKICAgIHsKICAgICAgICBYMTFEUlZfWElNTG9va3VwQ2hhcnMoIFN0ciwgYXNjaWlfY2hhcnMgKTsKICAgICAgICBpZiAoYnVmICE9IFN0cikKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgU3RyKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkKCSAga3NuYW1lID0gIk5vIE5hbWUiOwoJVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVseCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIGFzY2lpX2NoYXJzLCBkZWJ1Z3N0cl9hbihTdHIsIGFzY2lpX2NoYXJzKSk7CiAgICB9CiAgICBpZiAoYnVmICE9IFN0cikKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBTdHIpOwoKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KHhpYyxldmVudCk7CiAgICAvKiBYIHJldHVybnMga2V5Y29kZSAwIGZvciBjb21wb3NlZCBjaGFyYWN0ZXJzICovCiAgICBpZiAoIXZrZXkgJiYgYXNjaWlfY2hhcnMpIHZrZXkgPSBWS19OT05BTUU7CiAgICBiU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlICV1IGNvbnZlcnRlZCB0byB2a2V5IDB4JVggc2NhbiAlMDJ4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXksIGJTY2FuKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CgogICAgaWYgKCF2a2V5KSByZXR1cm47CgogICAgZHdGbGFncyA9IDA7CiAgICBpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKICAgIGlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoKICAgIHVwZGF0ZV9sb2NrX3N0YXRlKCBod25kLCB2a2V5LCBldmVudC0+c3RhdGUsIGV2ZW50X3RpbWUgKTsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICoga2JkX3NlY3Rpb24gbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bSAoZGlzcGxheSwga2V5YywgaSkpKSBjb250aW51ZTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlba2V5Y11baV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlhLQiBjb3VsZCBub3QgdHJhbnNsYXRlIGtleXN5bSAlMDRseFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI8KjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJXUsIGdvdCAlc1xuIiwga2V5Yywgc3RyKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCnN0YXRpYyBIS0wgZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KHZvaWQpCnsKICAgIFVMT05HX1BUUiBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIC8qIEZJWE1FOgogICAgICoKICAgICAqIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgICoKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCiAgICAvKgogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgPSBNQUtFTE9ORyggbGF5b3V0LCAweGUwMDEgKTsgLyogSU1FICovCiAgICBlbHNlCiAgICAgICAgbGF5b3V0IHw9IGxheW91dCA8PCAxNjsKCiAgICByZXR1cm4gKEhLTClsYXlvdXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CgogICAgbGF5b3V0ID0gSGFuZGxlVG9VbG9uZyggZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCkgKTsKICAgIGlmIChISVdPUkQobGF5b3V0KSA9PSBMT1dPUkQobGF5b3V0KSkgbGF5b3V0ID0gTE9XT1JEKGxheW91dCk7CiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkodm9pZCkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIHByZWxvYWRbXSA9CiAgICAgICAgeydLJywnZScsJ3knLCdiJywnbycsJ2EnLCdyJywnZCcsJyAnLCdMJywnYScsJ3knLCdvJywndScsJ3QnLCdcXCcsJ1AnLCdyJywnZScsJ2wnLCdvJywnYScsJ2QnLDB9OwogICAgc3RhdGljIGNvbnN0IFdDSEFSIG9uZVtdID0geycxJywwfTsKCiAgICBIS0VZIGhrZXk7CiAgICBXQ0hBUiBsYXlvdXRbS0xfTkFNRUxFTkdUSF07CgogICAgaWYgKFJlZ0NyZWF0ZUtleUV4VyhIS0VZX0NVUlJFTlRfVVNFUiwgcHJlbG9hZCwgMCwgTlVMTCwgMCwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsICZoa2V5LCBOVUxMKSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFSZWdRdWVyeVZhbHVlRXhXKGhrZXksIG9uZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFgxMURSVl9HZXRLZXlib2FyZExheW91dE5hbWUobGF5b3V0KSkKICAgICAgICBSZWdTZXRWYWx1ZUV4Vyhoa2V5LCBvbmUsIDAsIFJFR19TWiwgKGNvbnN0IEJZVEUgKilsYXlvdXQsIHNpemVvZihsYXlvdXQpKTsKCiAgICBSZWdDbG9zZUtleShoa2V5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggRGlzcGxheSAqZGlzcGxheSApCnsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjaGFyIHZrZXlfdXNlZFsyNTZdID0geyAwIH07CgogICAgLyogUmFuZ2VzIG9mIE9FTSwgZnVuY3Rpb24ga2V5LCBhbmQgY2hhcmFjdGVyIHZpcnR1YWwga2V5IGNvZGVzLgogICAgICogRG9uJ3QgaW5jbHVkZSB0aG9zZSBoYW5kbGVkIHNwZWNpYWxseSBpbiBYMTFEUlZfVG9Vbmljb2RlRXggYW5kCiAgICAgKiBYMTFEUlZfTWFwVmlydHVhbEtleUV4LCBsaWtlIFZLX05VTVBBRDAgLSBWS19ESVZJREUuICovCiAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICAgICBXT1JEIGZpcnN0LCBsYXN0OwogICAgfSB2a2V5X3Jhbmdlc1tdID0gewogICAgICAgIHsgVktfT0VNXzEsIFZLX09FTV8zIH0sCiAgICAgICAgeyBWS19PRU1fNCwgVktfSUNPXzAwIH0sCiAgICAgICAgeyAweGU2LCAweGU2IH0sCiAgICAgICAgeyAweGU5LCAweGY1IH0sCiAgICAgICAgeyBWS19PRU1fTkVDX0VRVUFMLCBWS19PRU1fTkVDX0VRVUFMIH0sCiAgICAgICAgeyBWS19GMSwgVktfRjI0IH0sCiAgICAgICAgeyAweDMwLCAweDM5IH0sIC8qIFZLXzAgLSBWS185ICovCiAgICAgICAgeyAweDQxLCAweDVhIH0sIC8qIFZLX0EgLSBWS19aICovCiAgICAgICAgeyAwLCAwIH0KICAgIH07CiAgICBpbnQgdmtleV9yYW5nZTsKCiAgICBzZXRfa2JkX2xheW91dF9wcmVsb2FkX2tleSgpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAgaWYgKGtleV9tYXBwaW5nKSBYRnJlZSgga2V5X21hcHBpbmcgKTsKICAgIGtleV9tYXBwaW5nID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX1Njcm9sbF9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbExvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiU2Nyb2xsTG9ja01hc2sgaXMgJXhcbiIsIFNjcm9sbExvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoIGRpc3BsYXkgKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CiAgICBlMi50eXBlID0gS2V5UHJlc3M7CgogICAgbWVtc2V0KGtleWMydmtleSwgMCwgc2l6ZW9mKGtleWMydmtleSkpOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsgLyogWEZyZWU4NiB2ZW5kb3Iga2V5cyAqLwogICAgICAgICAgICAgICAgdmtleSA9IHhmcmVlODZfdmVuZG9yX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgLyogQWxsIHZlbmRvciBrZXlzIGFyZSBleHRlbmRlZCB3aXRoIGEgc2NhbiBjb2RlIG9mIDAgcGVyIHRlc3Rpbmcgb24gV2luWFAgKi8KICAgICAgICAgICAgICAgIHNjYW4gPSAweDEwMDsKCQl2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIGkpOwoJCWlmICgoa2V5c3ltPDB4ODAwMCkgJiYgKGtleXN5bSE9JyAnKSkKICAgICAgICAgICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlbaV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2tleVtpXSA9IChrZXlzeW0gPD0gMHg3RikgPyBrZXlzeW0gOiAwOwogICAgICAgICAgICAgICAgICAgIH0KCQl9IGVsc2UgewoJCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCQl9CgkgICAgICB9CgkgICAgICAvKiBmaW5kIGtleSB3aXRoIGxvbmdlc3QgbWF0Y2ggc3RyZWFrICovCgkgICAgICBmb3IgKGtleW49MDsga2V5bjxNQUlOX0xFTjsga2V5bisrKSB7CgkJZm9yIChvaz0oKmxrZXkpW2tleW5dW2k9MF07IG9rJiYoaTw0KTsgaSsrKQoJCSAgaWYgKCgqbGtleSlba2V5bl1baV0gJiYgKCpsa2V5KVtrZXluXVtpXSE9Y2tleVtpXSkgb2s9MDsKCQlpZiAoIW9rKSBpLS07IC8qIHdlIG92ZXJzaG90ICovCgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KICAgICAgICB9CiAgICAgICAgVFJBQ0UoImtleWNvZGUgJXUgPT4gdmtleSAlMDRYXG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICAgICAgaWYgKCh2a2V5ICYgMHhmZikgJiYgdmtleV91c2VkWyh2a2V5ICYgMHhmZildKQogICAgICAgICAgICBXQVJOKCJ2a2V5ICUwNFggaXMgYmVpbmcgdXNlZCBieSBtb3JlIHRoYW4gb25lIGtleWNvZGVcbiIsIHZrZXkpOwogICAgICAgIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSA9IDE7CiAgICB9IC8qIGZvciAqLwoKI2RlZmluZSBWS0VZX0lGX05PVF9VU0VEKHZrZXkpICh2a2V5X3VzZWRbKHZrZXkpXSA/IDAgOiAodmtleV91c2VkWyh2a2V5KV0gPSAxLCAodmtleSkpKQogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhmZjsKICAgICAgICBpZiAodmtleSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwogICAgICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gWEtfMCAmJiBrZXlzeW0gPD0gWEtfOSkKICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gWEtfQSAmJiBrZXlzeW0gPD0gWEtfWikpIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKGtleXN5bSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8yKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzQpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV81KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9DT01NQSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BFUklPRCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX01JTlVTKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUExVUyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodmtleSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgfQogICAgfSAvKiBmb3IgKi8KCiAgICAvKiBGb3IgYW55IGtleWNvZGVzIHdoaWNoIHN0aWxsIGRvbid0IGhhdmUgYSB2a2V5LCBhc3NpZ24gYW55IHNwYXJlCiAgICAgKiBjaGFyYWN0ZXIsIGZ1bmN0aW9uIGtleSwgb3IgT0VNIHZpcnR1YWwga2V5IGNvZGUuICovCiAgICB2a2V5X3JhbmdlID0gMDsKICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgaWYgKGtleWMydmtleVtrZXljXSAmIDB4ZmYpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHdoaWxlICh2a2V5ICYmIHZrZXlfdXNlZFt2a2V5XSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2a2V5ID09IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmxhc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXlfcmFuZ2UrKzsKICAgICAgICAgICAgICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2a2V5Kys7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgewogICAgICAgICAgICBXQVJOKCJObyBtb3JlIHZrZXlzIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgic3BhcmUgdmlydHVhbCBrZXkgJTA0WCBhc3NpZ25lZCB0byBrZXljb2RlICV1OlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCiAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgIFRSQUNFKCAiJWx4ICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICB9CgogICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICB2a2V5X3VzZWRbdmtleV0gPSAxOwogICAgfSAvKiBmb3IgKi8KI3VuZGVmIFZLRVlfSUZfTk9UX1VTRUQKCiAgICAvKiBJZiBzb21lIGtleXMgc3RpbGwgbGFjayBzY2FuY29kZXMsIGFzc2lnbiBzb21lIGFyYml0cmFyeSBvbmVzIHRvIHRoZW0gbm93ICovCiAgICBmb3IgKHNjYW4gPSAweDYwLCBrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKGtleWMydmtleVtrZXljXSYmIWtleWMyc2NhbltrZXljXSkgewoJY29uc3QgY2hhciAqa3NuYW1lOwoJa2V5c3ltID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICV1ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwp9CgpzdGF0aWMgQk9PTCBtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KEhLTCBoa2wpCnsKICAgIGNvbnN0IERXT1JEIGlzSU1FID0gMHhFMDAwMDAwMDsKICAgIEhLTCB4SGtsID0gZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCk7CgogICAgLyogaWYgdGhlIGxheW91dCBpcyBhbiBJTUUsIG9ubHkgbWF0Y2ggdGhlIGxvdyB3b3JkIChMQ0lEKSAqLwogICAgaWYgKCgoVUxPTkdfUFRSKWhrbCAmIGlzSU1FKSA9PSBpc0lNRSkKICAgICAgICByZXR1cm4gKExPV09SRChoa2wpID09IExPV09SRCh4SGtsKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIChoa2wgPT0geEhrbCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgaWYgKCFkd1RocmVhZGlkIHx8IGR3VGhyZWFkaWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCiAgICB7CiAgICAgICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKTsKICAgICAgICBpZiAodGhyZWFkX2RhdGEgJiYgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQpIHJldHVybiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIH0KICAgIGVsc2UKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIENERUNMIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgSEtMIG9sZEhrbCA9IDA7CiAgICBzdHJ1Y3QgeDExZHJ2X3RocmVhZF9kYXRhICp0aHJlYWRfZGF0YSA9IHgxMWRydl9pbml0X3RocmVhZF9kYXRhKCk7CgogICAgRklYTUUoIiVwLCAlMDR4OiBzZW1pLXN0dWIhXG4iLCBoa2wsIGZsYWdzKTsKICAgIGlmIChmbGFncyAmIEtMRl9TRVRGT1JQUk9DRVNTKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIktMRl9TRVRGT1JQUk9DRVNTIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChmbGFncykKICAgICAgICBGSVhNRSgiZmxhZ3MgJXggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CgogICAgaWYgKGhrbCA9PSAoSEtMKUhLTF9ORVhUIHx8IGhrbCA9PSAoSEtMKUhLTF9QUkVWKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIkhLTF9ORVhUIGFuZCBIS0xfUFJFViBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJzZXR0aW5nIGtleWJvYXJkIG9mIGRpZmZlcmVudCBsb2NhbGVzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG9sZEhrbCA9IHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0OwogICAgaWYgKCFvbGRIa2wpIG9sZEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0ID0gaGtsOwoKICAgIHJldHVybiBvbGRIa2w7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBIV05EIGR1bW15LCBYRXZlbnQgKmV2ZW50ICkKewogICAgSFdORCBod25kOwoKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKCZldmVudC0+eG1hcHBpbmcpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggZXZlbnQtPnhtYXBwaW5nLmRpc3BsYXkgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CgogICAgVFJBQ0UoIiclYycoJWx4KTogZ290IGtleWNvZGUgJXVcbiIsIGNDaGFyLCBrZXlzeW0sIGtleWNvZGUpOwogICAgaWYgKCFrZXljb2RlKSByZXR1cm4gLTE7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwogICAgaWYgKCFyZXQpCiAgICB7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgICAgICBpZiAoa2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaW5kZXgpID09IGtleXN5bSkgYnJlYWs7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHJldCArPSAweDAxMDA7IGJyZWFrOwogICAgICAgIGNhc2UgMjogcmV0ICs9IDB4MDYwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiByZXQgKz0gMHgwNzAwOyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIENERUNMIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgVUlOVCByZXQgPSAwOwogICAgaW50IGtleWM7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIHN3aXRjaCh3TWFwVHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQzogLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDX0VYOgogICAgICAgICAgICBzd2l0Y2ggKHdDb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFZLX1NISUZUOiB3Q29kZSA9IFZLX0xTSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IHdDb2RlID0gVktfTENPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19NRU5VOiB3Q29kZSA9IFZLX0xNRU5VOyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBrZXljMnNjYW5ba2V5Y10gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WSzogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVlNDX1RPX1ZLX0VYOgoKICAgICAgICAgICAgLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHN0b3AgaWYgaXQncyBub3QgYSBudW1wYWQgdmtleTsgb3RoZXJ3aXNlIGtlZXAKICAgICAgICAgICAgICAgICAgICAgICBsb29raW5nIGZvciBhIHBvdGVudGlhbCBiZXR0ZXIgdmtleS4gKi8KICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICYmIChyZXQgPCBWS19OVU1QQUQwIHx8IFZLX0RJVklERSA8IHJldCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdNYXBUeXBlID09IE1BUFZLX1ZTQ19UT19WSykKICAgICAgICAgICAgICAgIHN3aXRjaCAocmV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBWS19TSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBWS19DT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFZLX01FTlU7IGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgTUFQVktfVktfVE9fQ0hBUjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwcGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KICAgICAgICAgICAgWEtleUV2ZW50IGU7CiAgICAgICAgICAgIEtleVN5bSBrZXlzeW07CiAgICAgICAgICAgIGludCBsZW47CiAgICAgICAgICAgIGNoYXIgc1sxMF07CgogICAgICAgICAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgICAgICAgICBlLnN0YXRlID0gMDsKICAgICAgICAgICAgZS5rZXljb2RlID0gMDsKICAgICAgICAgICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgICAgICAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICAgICAgICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgICAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKICAgICAgICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgICAgICAgICAgLyogV2luZG93cyBhbHdheXMgZ2VuZXJhdGVzIFZLX0RFQ0lNQUwgZm9yIERlbC8uIG9uIGtleXBhZCB3aGlsZSBzb21lCiAgICAgICAgICAgICAqIFgxMSBrZXlib2FyZCBsYXlvdXRzIGdlbmVyYXRlIFhLX0tQX1NlcGFyYXRvciBpbnN0ZWFkIG9mIFhLX0tQX0RlY2ltYWwKICAgICAgICAgICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAod0NvZGUgPT0gVktfREVDSU1BTCB8fCB3Q29kZSA9PSBWS19TRVBBUkFUT1IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9TZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICBpZiAobGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXQ0hBUiB3Y2g7CiAgICAgICAgICAgICAgICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIHMsIGxlbiwgJndjaCwgMSkpIHJldCA9IHRvdXBwZXJXKHdjaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwogICAgICAgICAgICBGSVhNRSgiVW5rbm93biB3TWFwVHlwZSAlZCAhXG4iLCB3TWFwVHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgIFRSQUNFKCAicmV0dXJuaW5nIDB4JXguXG4iLCByZXQgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5TmFtZVRleHQgKFgxMURSVi5AKQogKi8KSU5UIENERUNMIFgxMURSVl9HZXRLZXlOYW1lVGV4dChMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQgblNpemUpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHNjYW5Db2RlLCBNQVBWS19WU0NfVE9fVktfRVgsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFItU2hpZnQgaXMgInNwZWNpYWwiIC0gaXQgaXMgYW4gZXh0ZW5kZWQga2V5IHdpdGggc2VwYXJhdGUgc2NhbiBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUgfD0gMHgxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCBNQVBWS19WS19UT19DSEFSLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNFgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKG5TaXplID49IDIpCgl7CiAgICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyVygoV0NIQVIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgSU5UIHJjOwoKICAgICAga2V5YyA9IChLZXlDb2RlKSBrZXlpOwogICAgICBrZXlzID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CgogICAgICBpZiAobmFtZSAmJiAodmtleSA9PSBWS19TSElGVCB8fCB2a2V5ID09IFZLX0NPTlRST0wgfHwgdmtleSA9PSBWS19NRU5VKSkKICAgICAgewogICAgICAgICAgY2hhciogaWR4ID0gc3RycmNocihuYW1lLCAnXycpOwogICAgICAgICAgaWYgKGlkeCAmJiAoc3RyY2FzZWNtcChpZHgsICJfciIpID09IDAgfHwgc3RyY2FzZWNtcChpZHgsICJfbCIpID09IDApKQogICAgICAgICAgewogICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICAgICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JXUga2V5c3ltPSVseCBtb2RpZmllZF9zdHJpbmc9JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIGtleXMsIGRlYnVnc3RyX2FuKG5hbWUsaWR4LW5hbWUpKTsKICAgICAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCBpZHgtbmFtZSsxLCBscEJ1ZmZlciwgblNpemUpOwogICAgICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICAgICAgbHBCdWZmZXJbLS1yY10gPSAwOwogICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG5hbWUpCiAgICAgIHsKICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0ldSBrZXlzeW09JTA0eCB2a2V5PSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgdmtleSwgZGVidWdzdHJfYShuYW1lKSk7CiAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCAtMSwgbHBCdWZmZXIsIG5TaXplKTsKICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICBscEJ1ZmZlclstLXJjXSA9IDA7CiAgICAgICAgICByZXR1cm4gcmM7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgV0FSTiBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwogIFdBUk4oIiglMDh4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNFgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgY29uc3QgQllURSAqbHBLZXlTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBjaGFyIGJ1ZlsxMF07CiAgICBjaGFyICpscENoYXIgPSBidWY7CiAgICBIV05EIGZvY3VzOwogICAgWElDIHhpYzsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRV8oa2V5KSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUVfKGtleSkoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIGlmICgobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApICYmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICB7CiAgICAgICAgVFJBQ0VfKGtleSkoIkN0cmwrQWx0K1trZXldIHdvbid0IGdlbmVyYXRlIGEgY2hhcmFjdGVyXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgZm9jdXMgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKS0+bGFzdF94aWNfaHduZDsKICAgIGlmICghZm9jdXMpCiAgICB7CiAgICAgICAgZm9jdXMgPSBHZXRGb2N1cygpOwogICAgICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgICAgICBpZiAoIWZvY3VzKSBmb2N1cyA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgfQogICAgZS53aW5kb3cgPSBYMTFEUlZfZ2V0X3dob2xlX3dpbmRvdyggZm9jdXMgKTsKICAgIHhpYyA9IFgxMURSVl9nZXRfaWMoIGZvY3VzICk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAgICB7CglUUkFDRV8oa2V5KSgiU2hpZnRNYXNrID0gJTA0eFxuIiwgU2hpZnRNYXNrKTsKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQogICAgewoJVFJBQ0VfKGtleSkoIkxvY2tNYXNrID0gJTA0eFxuIiwgTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCVRSQUNFXyhrZXkpKCJDb250cm9sTWFzayA9ICUwNHhcbiIsIENvbnRyb2xNYXNrKTsKCWUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCiAgICB7CglUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgPSAlMDR4XG4iLCBOdW1Mb2NrTWFzayk7CgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgfQoKICAgIC8qIFJlc3RvcmUgc2F2ZWQgQWx0R3Igc3RhdGUgKi8KICAgIFRSQUNFXyhrZXkpKCJBbHRHck1hc2sgPSAlMDR4XG4iLCBBbHRHck1hc2spOwogICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gMHglMDR4XG4iLAoJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKCiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAodmlydEtleSA+PSBWS19MRUZUICYmIHZpcnRLZXkgPD0gVktfRE9XTikKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleSAtIFZLX0xFRlQgKyBYS19MZWZ0KTsKCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgIC8qIFdpbmRvd3MgYWx3YXlzIGdlbmVyYXRlcyBWS19ERUNJTUFMIGZvciBEZWwvLiBvbiBrZXlwYWQgd2hpbGUgc29tZQogICAgICogWDExIGtleWJvYXJkIGxheW91dHMgZ2VuZXJhdGUgWEtfS1BfU2VwYXJhdG9yIGluc3RlYWQgb2YgWEtfS1BfRGVjaW1hbAogICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgKi8KICAgIGlmICh2aXJ0S2V5ID09IFZLX0RFQ0lNQUwgfHwgdmlydEtleSA9PSBWS19TRVBBUkFUT1IpCiAgICB7CiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CiAgICAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKICAgIH0KCiAgICAvKiBDdHJsLVNwYWNlIGdlbmVyYXRlcyBzcGFjZSBvbiBXaW5kb3dzICovCiAgICBpZiAoZS5zdGF0ZSA9PSBDb250cm9sTWFzayAmJiB2aXJ0S2V5ID09IFZLX1NQQUNFKQogICAgewogICAgICAgIGJ1ZldbMF0gPSAnICc7CiAgICAgICAgcmV0ID0gMTsKICAgICAgICBnb3RvIGZvdW5kOwogICAgfQoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOXyhrZXkpKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0VfKGtleSkoIkZvdW5kIGtleWNvZGUgJXVcbiIsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlICV1XG4iLAoJCWUudHlwZSwgZS53aW5kb3csIGUuc3RhdGUsIGUua2V5Y29kZSk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcsCiAgICAgKiBlLnR5cGUgd2FzIHNldCB0byBLZXlQcmVzcyBhYm92ZS4KICAgICAqLwogICAgaWYgKHhpYykKICAgIHsKICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0VfKGtleSkoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlZCBieXRlKHMpXG4iLCByZXQpOwogICAgICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHJldCk7CiAgICAgICAgICAgIGlmIChscENoYXIgPT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSXyhrZXkpKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CiAgICAgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgbHBDaGFyLCByZXQsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIGlmICgha3NuYW1lKSBrc25hbWUgPSAiTm8gTmFtZSI7CiAgICAgICAgVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVseCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKGUudHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCByZXQsIGRlYnVnc3RyX2FuKGxwQ2hhciwgcmV0KSk7CiAgICB9CgogICAgaWYgKHJldCA9PSAwKQogICAgewoJY2hhciBkZWFkX2NoYXI7CgojaWZkZWYgWEtfRXVyb1NpZ24KICAgICAgICAvKiBBbiB1Z2x5IGhhY2sgZm9yIEV1cm9TaWduOiBYIGNhbid0IHRyYW5zbGF0ZSBpdCB0byBhIGNoYXJhY3RlcgogICAgICAgICAgIGZvciBzb21lIGxvY2FsZXMuICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19FdXJvU2lnbikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDIwQUM7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IFggdHVybnMgc2hpZnQtdGFiIGludG8gSVNPX0xlZnRfVGFiLiAqLwogICAgICAgIC8qIEhlcmUgd2UgY2hhbmdlIGl0IGJhY2suICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19JU09fTGVmdF9UYWIgJiYgIShlLnN0YXRlICYgQ29udHJvbE1hc2spKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MDk7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCWRlYWRfY2hhciA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCWlmIChkZWFkX2NoYXIpCiAgICAgICAgewoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleXN5bSA+PSAweDAxMDAwMTAwICYmIGtleXN5bSA8PSAweDAxMDBmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogVW5pY29kZSBkaXJlY3QgbWFwcGluZyAqLwogICAgICAgICAgICBidWZXWzBdID0ga2V5c3ltICYgMHhmZmZmOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJV0FSTl8oa2V5KSgibm8gY2hhciBmb3Iga2V5c3ltICUwNGx4ICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJV0FSTl8oa2V5KSgidmlydEtleT0lWCwgc2NhbkNvZGU9JVgsIGtleWNvZGU9JXUsIHN0YXRlPSVYXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0AnKSkgfHwKICAgICAgICAgICAgICAgIChrZXlzeW0gPT0gJ2AnKSB8fAogICAgICAgICAgICAgICAgKGtleXN5bSA9PSBYS19UYWIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApIC8qIENvbnRyb2wgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfUmV0dXJuIHx8IGtleXN5bSA9PSBYS19LUF9FbnRlcikpCiAgICAgICAgewogICAgICAgICAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxwQ2hhclswXSA9ICdcbic7CiAgICAgICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBIYWNrIHRvIGRldGVjdCBhbiBYTG9va3VwU3RyaW5nIGhhcmQtY29kZWQgdG8gTGF0aW4xICovCiAgICAgICAgaWYgKHJldCA9PSAxICYmIGtleXN5bSA+PSAweDAwYTAgJiYga2V5c3ltIDw9IDB4MDBmZiAmJiAoQllURSlscENoYXJbMF0gPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IChCWVRFKWxwQ2hhclswXTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IHRvIHVuaWNvZGVcbiIsICooQllURSAqKWxwQ2hhcik7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIGxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKZm91bmQ6CiAgICBpZiAoYnVmICE9IGxwQ2hhcikKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscENoYXIpOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICAvKiBOdWxsLXRlcm1pbmF0ZSB0aGUgYnVmZmVyLCBpZiB0aGVyZSdzIHJvb20uICBNU0ROIGNsZWFybHkgc3RhdGVzIHRoYXQgdGhlCiAgICAgICBjYWxsZXIgbXVzdCBub3QgYXNzdW1lIHRoaXMgaXMgZG9uZSwgYnV0IHNvbWUgcHJvZ3JhbXMgKGUuZy4gQXVkaW9zdXJmKSBkby4gKi8KICAgIGlmICgxIDw9IHJldCAmJiByZXQgPCBidWZXX3NpemUpCiAgICAgICAgYnVmV1tyZXRdID0gMDsKCiAgICBUUkFDRV8oa2V5KSgicmV0dXJuaW5nICVkIHdpdGggJXNcbiIsIHJldCwgZGVidWdzdHJfd24oYnVmVywgcmV0KSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBDREVDTCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICBYQmVsbChnZGlfZGlzcGxheSwgMCk7Cn0K