LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCiAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgImNvbmZpZy5oIgoKI2lmbmRlZiBYX0RJU1BMQVlfTUlTU0lORwoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSAidHNfeGxpYi5oIgojaW5jbHVkZSAidHNfeHJlc291cmNlLmgiCiNpbmNsdWRlICJ0c194dXRpbC5oIgoKI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAia2V5Ym9hcmQuaCIKI2luY2x1ZGUgIm1lc3NhZ2UuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXkpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXlib2FyZCkKCmV4dGVybiBMUEJZVEUgcEtleVN0YXRlVGFibGU7CgppbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCnN0YXRpYyBpbnQga2NDb250cm9sLCBrY0FsdCwga2NTaGlmdCwga2NOdW1Mb2NrLCBrY0NhcHNMb2NrOyAvKiBrZXljb2RlcyAqLwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ4CnN0YXRpYyBjb25zdCBpbnQgbWFpbl9rZXlfc2NhbltNQUlOX0xFTl0gPQp7Ci8qIHRoaXMgaXMgbXkgKDEwMi1rZXkpIGtleWJvYXJkIGxheW91dCwgc29ycnkgaWYgaXQgZG9lc24ndCBxdWl0ZSBtYXRjaCB5b3VycyAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSAtZGVidWdtc2cgK2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUtbTUFJTl9MRU5dWzRdID0KewogImAiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ0AiLCIjfiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgRXJpYyBQb3VlY2gpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMn4iLCJcIjMjIiwiJzR7IiwiKDVbIiwiLTZ8Iiwi6DciLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjpCIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBVbHJpY2ggV2VpZ2FuZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCInIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiI7QiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gTmF5bG9yKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxK3wiLCIyXCJAIiwiMyojIiwiNOciLCI1JSIsIjYmrCIsIjcvpiIsIjgooiIsIjkpIiwiMD0iLCInP7QiLCJeYH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/OhbIiwiqCFdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgeyIsIiSjfSIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEJlcnRobyBTdHVsdGllbnMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIrRgfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBldGVyIEJvcnRhcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/XFwiLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApsyIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIqhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCdfIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXKYiLCIxISIsIjJcIkAiLCIzI6MiLCI0JKciLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiJz8iLCKruyIsCiAicVEiLCAgIndXIiwiZUUiLCAgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIisqXFyoIiwiXFwnXFxgIiwKICJhQSIsICAic1MiLCJkRCIsICAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAi58ciLCAiuqoiLCAiXFx+XFxeIiwKICJ6WiIsICAieFgiLCJjQyIsICAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDsiLCAiLjoiLCAiLV8iLAogIjw+Igp9OwoKLyoqKiBGaW5uaXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GSVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiMSEiLCIyXCJAIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrP1xcIiwiXCdgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIiIsIlwiXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiIsIiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvc+kgTWFyY29zIEzzcGV6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqpcXCIsIjEhfCIsIjJcIkAiLCIztyMiLCI0JCIsIjUlIiwiNiasIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeWyIsIisqXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCInqHsiLCLnx30iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIHN0cnVjdCB7CiBXT1JEIGxhbmcsIGFuc2lfY29kZXBhZ2UsIG9lbV9jb2RlcGFnZTsKIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKfSBtYWluX2tleV90YWJbXT17CiB7TUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsU1VCTEFOR19FTkdMSVNIX1VTKSwgICAgIDEyNTIsIDQzNywgJm1haW5fa2V5X1VTfSwKIHtNQUtFTEFOR0lEKExBTkdfRU5HTElTSCxTVUJMQU5HX0VOR0xJU0hfVUspLCAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfVUt9LAoge01BS0VMQU5HSUQoTEFOR19HRVJNQU4sU1VCTEFOR19ERUZBVUxUKSwgICAgICAgICAxMjUyLCA4NTAsICZtYWluX2tleV9ERX0sCiB7TUFLRUxBTkdJRChMQU5HX0dFUk1BTixTVUJMQU5HX0dFUk1BTl9TV0lTUyksICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X1NHfSwKIHtNQUtFTEFOR0lEKExBTkdfU1dFRElTSCxTVUJMQU5HX1NXRURJU0gpLCAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfU0V9LAoge01BS0VMQU5HSUQoTEFOR19OT1JXRUdJQU4sU1VCTEFOR19ERUZBVUxUKSwgICAgICAxMjUyLCA4NjUsICZtYWluX2tleV9OT30sCiB7TUFLRUxBTkdJRChMQU5HX0RBTklTSCxTVUJMQU5HX0RFRkFVTFQpLCAgICAgICAgIDEyNTIsIDg2NSwgJm1haW5fa2V5X0RBfSwKIHtNQUtFTEFOR0lEKExBTkdfRlJFTkNILFNVQkxBTkdfREVGQVVMVCksICAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfRlJ9LAoge01BS0VMQU5HSUQoTEFOR19GUkVOQ0gsU1VCTEFOR19GUkVOQ0hfQ0FOQURJQU4pLCAxMjUyLCA4NjMsICZtYWluX2tleV9DRn0sCiB7TUFLRUxBTkdJRChMQU5HX0ZSRU5DSCxTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOKSwgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0JFfSwKIHtNQUtFTEFOR0lEKExBTkdfV0FMT04sU1VCTEFOR19ERUZBVUxUKSwgICAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfQkV9LAoge01BS0VMQU5HSUQoTEFOR19QT1JUVUdVRVNFLFNVQkxBTkdfREVGQVVMVCksICAgICAxMjUyLCA4NjAsICZtYWluX2tleV9QVH0sCiB7TUFLRUxBTkdJRChMQU5HX0ZJTk5JU0gsU1VCTEFOR19ERUZBVUxUKSwgICAgICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0ZJfSwKIHtNQUtFTEFOR0lEKExBTkdfUlVTU0lBTixTVUJMQU5HX0RFRkFVTFQpLCAgICAgICAgMTI1MSwgODY2LCAmbWFpbl9rZXlfUlV9LAoge01BS0VMQU5HSUQoTEFOR19TUEFOSVNILFNVQkxBTkdfREVGQVVMVCksICAgICAgICAxMjUyLCA4NTAsICZtYWluX2tleV9FU30sCiB7TUFLRUxBTkdJRChMQU5HX0RVVENILFNVQkxBTkdfRFVUQ0hfQkVMR0lBTiksICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0JFfSwKCiB7MH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCnN0YXRpYyBjb25zdCBpbnQgc3BlY2lhbF9rZXlfdmtleVtdID0KewogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwp9OwpzdGF0aWMgY29uc3QgaW50IHNwZWNpYWxfa2V5X3NjYW5bXSA9CnsKICAgIDB4MEUsIDB4MEYsIDAsIC8qPyovIDAsIDAsIDB4MUMsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsICAgIDAsICAgIDAsIDB4NDUsIDB4NDYsIDAgICAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsICAgIDAsICAgIDAsIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgY3Vyc29yX2tleV92a2V5W10gPQp7CiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTkVYVCwgVktfRU5EICAgICAgICAgIC8qIEZGNTAgKi8KfTsKc3RhdGljIGNvbnN0IGludCBjdXJzb3Jfa2V5X3NjYW5bXSA9CnsKICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiAgICAgIC8qIEZGNTAgKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgbWlzY19rZXlfdmtleVtdID0KewogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLCAwLCAwLCAwLCAgLyogRkY2MCAqLwogICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX01FTlUgICAgICAgICAgICAgICAgICAgICAgLyogRkY2OCAqLwp9OwpzdGF0aWMgY29uc3QgaW50IG1pc2Nfa2V5X3NjYW5bXSA9CnsKICAgIC8qPyovIDAsIDB4MzcsIC8qPyovIDAsIDB4MTUyLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNjggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQga2V5cGFkX2tleV92a2V5W10gPQp7CiAgICAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogRkY3RSAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsIDAsCgkJCQkgVktfSU5TRVJULCBWS19ERUxFVEUsICAgICAgICAgIC8qIEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVDSU1BTCwgVktfRElWSURFLCAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgVktfTlVNUEFENCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KfTsKc3RhdGljIGNvbnN0IGludCBrZXlwYWRfa2V5X3NjYW5bXSA9CnsKICAgIDB4MTM4LCAweDQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGN0UgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDB4MTFDLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDB4NDcsIDB4NEIsIDB4NDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIDB4MzcsIDB4NEUsIC8qPyovIDAsIDB4NEEsIDB4NTMsIDB4MTM1LCAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KfTsKICAgIApzdGF0aWMgY29uc3QgaW50IGZ1bmN0aW9uX2tleV92a2V5W10gPQp7CiAgICBWS19GMSwgVktfRjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkJFICovCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2ICAgICAgICAgICAgICAvKiBGRkM4ICovCn07CnN0YXRpYyBjb25zdCBpbnQgZnVuY3Rpb25fa2V5X3NjYW5bXSA9CnsKICAgIDB4M0IsIDB4M0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQkUgKi8KICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQzggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgbW9kaWZpZXJfa2V5X3ZrZXlbXSA9CnsKICAgIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgLyogRkZFMSAqLwogICAgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCn07CnN0YXRpYyBjb25zdCBpbnQgbW9kaWZpZXJfa2V5X3NjYW5bXSA9CnsKICAgIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMSAqLwogICAgMHgzOCwgMHgxMzgsIDB4MzgsIDB4MTM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCn07CgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW07CgogICAgVFNYTG9va3VwU3RyaW5nKGUsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoa2V5c3ltID49IDB4RkZBRSkgJiYgKGtleXN5bSA8PSAweEZGQjkpICYmIChrZXlzeW0gIT0gMHhGRkFGKSAKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkgCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4ga2V5cGFkX2tleV92a2V5WyhrZXlzeW0gJiAweEZGKSAtIDB4N0VdOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnZvaWQgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFdPUkQgdmtleSwgV09SRCBzY2FuLCBpbnQgRXZ0eXBlLCBJTlQgZXZlbnRfeCwgSU5UIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGV2ZW50X3RpbWUgKQp7CiAgQk9PTCAqIFN0YXRlID0gKHZrZXk9PVZLX05VTUxPQ0s/ICZOdW1TdGF0ZSA6ICZDYXBzU3RhdGUpOwogIERXT1JEIHVwLCBkb3duOwoKICBpZiAoKlN0YXRlKSB7CiAgICAvKiBUaGUgSU5URVJNRURJQVJZIHN0YXRlIG1lYW5zIDoganVzdCBhZnRlciBhICdwcmVzcycgZXZlbnQsIGlmIGEgJ3JlbGVhc2UnIGV2ZW50IGNvbWVzLAogICAgICAgZG9uJ3QgdHJlYXQgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCiAgICAgICBBbmQgZnJvbSB0aGVyZSwgYSAncmVsZWFzZScgZXZlbnQgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB0b2dnbGUga2V5LiAqLwogICAgKlN0YXRlPUZBTFNFOwogICAgVFJBQ0Uoa2V5Ym9hcmQsIklOVEVSTSA6IGRvblwndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4XG4iLHZrZXkscEtleVN0YXRlVGFibGVbdmtleV0pOwogIH0gZWxzZQogICAgewogICAgICAgIGRvd24gPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApOwogICAgICAgIHVwID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKSB8IEtFWUVWRU5URl9LRVlVUDsKCWlmICggcEtleVN0YXRlVGFibGVbdmtleV0gJiAweDEgKSAvKiBpdCB3YXMgT04gKi8KCSAgewoJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQoJICAgICAgewoJCVRSQUNFKGtleWJvYXJkLCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIGRvd24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCSAgICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCB1cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCQkqU3RhdGU9RkFMU0U7CgkJcEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovIAoJICAgICAgfSAKCSAgfQoJZWxzZSAvKiBpdCB3YXMgT0ZGICovCgkgIGlmIChFdnR5cGU9PUtleVByZXNzKQoJICAgIHsKCSAgICAgIFRSQUNFKGtleWJvYXJkLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIGRvd24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIHVwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCSAgICAgICpTdGF0ZT1UUlVFOyAvKiBHb2VzIHRvIGludGVybWVkaWFyeSBzdGF0ZSBiZWZvcmUgZ29pbmcgdG8gT04gKi8KCSAgICAgIHBLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvbi4gKi8KCSAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8Kdm9pZCBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSAoIGludCB2a2V5LCBpbnQgc3RhdGUgKQp7CiAgICAvKiBEbyBzb21ldGhpbmcgaWYgaW50ZXJuYWwgdGFibGUgc3RhdGUgIT0gWCBzdGF0ZSBmb3Iga2V5Y29kZSAqLwogICAgaWYgKCgocEtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSE9MCkgIT0gc3RhdGUpCiAgICB7CiAgICAgICAgVFJBQ0Uoa2V5Ym9hcmQsIkFkanVzdGluZyBzdGF0ZSBmb3IgdmtleSAlIy4yeC4gU3RhdGUgYmVmb3JlICUjLjJ4IFxuIiwKICAgICAgICAgICAgICB2a2V5LCBwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CgogICAgICAgIC8qIEZha2Uga2V5IGJlaW5nIHByZXNzZWQgaW5zaWRlIHdpbmUgKi8KCUtFWUJPQVJEX1NlbmRFdmVudCggdmtleSwgMCwgc3RhdGU/IDAgOiBLRVlFVkVOVEZfS0VZVVAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgR2V0VGlja0NvdW50KCkgKTsKCiAgICAgICAgVFJBQ0Uoa2V5Ym9hcmQsIlN0YXRlIGFmdGVyICUjLjJ4IFxuIixwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tFWUJPQVJEX1VwZGF0ZVN0YXRlCiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpCiAqIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZCAoY2FsbGVkIGJ5IEVWRU5UX0ZvY3VzSW4gaW4gZXZlbnQuYykKICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4gKGJlY2F1c2UgWFF1ZXJ5S2V5bWFwIHNheXMgbm90aGluZwogKiAgYWJvdXQgdGhlbSkKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX1VwZGF0ZVN0YXRlICggdm9pZCApCnsKLyogZXh0cmFjdCBhIGJpdCBmcm9tIHRoZSBjaGFyWzMyXSBiaXQgc3VpdGUgKi8KI2RlZmluZSBLZXlTdGF0ZShrZXljb2RlKSAoKGtleXNfcmV0dXJuW2tleWNvZGUvOF0gJiAoMTw8KGtleWNvZGUlOCkpKSE9MCkKCiAgICBjaGFyIGtleXNfcmV0dXJuWzMyXTsKCiAgICBUUkFDRShrZXlib2FyZCwiY2FsbGVkXG4iKTsKICAgIGlmICghVFNYUXVlcnlLZXltYXAoZGlzcGxheSwga2V5c19yZXR1cm4pKSB7CiAgICAgICAgRVJSKGtleWJvYXJkLCJFcnJvciBnZXR0aW5nIGtleW1hcCAhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEFkanVzdCB0aGUgQUxUIGFuZCBDT05UUk9MIHN0YXRlIGlmIGFueSBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoVktfTUVOVSwgS2V5U3RhdGUoa2NBbHQpKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX0NPTlRST0wsIEtleVN0YXRlKGtjQ29udHJvbCkpOwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoVktfU0hJRlQsIEtleVN0YXRlKGtjU2hpZnQpKTsKI3VuZGVmIEtleVN0YXRlCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LRVlCT0FSRF9IYW5kbGVFdmVudCggV05EICpwV25kLCBYS2V5RXZlbnQgKmV2ZW50ICkKewogICAgY2hhciBTdHJbMjRdOyAKICAgIFhDb21wb3NlU3RhdHVzIGNzOyAKICAgIEtleVN5bSBrZXlzeW07CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBzdGF0aWMgQk9PTCBmb3JjZV9leHRlbmRlZCA9IEZBTFNFOyAvKiBoYWNrIGZvciBBbHRHciB0cmFuc2xhdGlvbiAqLwogICAgCiAgICBpbnQgYXNjaWlfY2hhcnM7CgogICAgSU5UIGV2ZW50X3ggPSAocFduZD8gcFduZC0+cmVjdFdpbmRvdy5sZWZ0IDogMCkgKyBldmVudC0+eDsKICAgIElOVCBldmVudF95ID0gKHBXbmQ/IHBXbmQtPnJlY3RXaW5kb3cudG9wICA6IDApICsgZXZlbnQtPnk7CiAgICBEV09SRCBldmVudF90aW1lID0gZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3M7CgogICAgLyogdGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgZGVhZCBrZXlzICovCiAgICBpZiAoKGV2ZW50LT5rZXljb2RlID4+IDgpID09IDB4MTApCglldmVudC0+a2V5Y29kZT0oZXZlbnQtPmtleWNvZGUgJiAweGZmKTsKCiAgICBhc2NpaV9jaGFycyA9IFRTWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCAxLCAma2V5c3ltLCAmY3MpOwoKICAgIFRSQUNFKGtleSwgIkVWRU5UX2tleSA6IHN0YXRlID0gJVhcbiIsIGV2ZW50LT5zdGF0ZSk7CiAgICBpZiAoa2V5c3ltID09IFhLX01vZGVfc3dpdGNoKQoJewoJVFJBQ0Uoa2V5LCAiQWx0IEdyIGtleSBldmVudCByZWNlaXZlZFxuIik7CglldmVudC0+a2V5Y29kZSA9IGtjQ29udHJvbDsgLyogU2ltdWxhdGUgQ29udHJvbCAqLwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwoKCWV2ZW50LT5rZXljb2RlID0ga2NBbHQ7IC8qIFNpbXVsYXRlIEFsdCAqLwoJZm9yY2VfZXh0ZW5kZWQgPSBUUlVFOwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwoJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKCXJldHVybjsKCX0KCiAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNoYXIJKmtzbmFtZTsKCglrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFKGtleSwgIiVzIDoga2V5c3ltPSVsWCAoJXMpLCBhc2NpaSBjaGFycz0ldSAvICVYIC8gJyVzJ1xuIiwgCgkJICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKCQkgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKICAgIH0KCiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleShldmVudCk7CiAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CgogICAgVFJBQ0Uoa2V5LCAia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCgkJICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKCiAgIGlmICh2a2V5KQogICB7CiAgICBzd2l0Y2ggKHZrZXkgJiAweGZmKQogICAgewogICAgY2FzZSBWS19OVU1MT0NLOiAgICAKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIGV2ZW50LT50eXBlLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSApOwogICAgICBicmVhazsKICAgIGNhc2UgVktfQ0FQSVRBTDoKICAgICAgVFJBQ0Uoa2V5Ym9hcmQsIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBldmVudC0+dHlwZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsgCiAgICAgIFRSQUNFKGtleWJvYXJkLCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIEFkanVzdCB0aGUgTlVNTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKCSAgeyAKCSAgICBUUkFDRShrZXlib2FyZCwiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUuIFxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVByZXNzLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBLZXlSZWxlYXNlLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSApOwoJICB9CiAgICAgICAgLyogQWRqdXN0IHRoZSBDQVBTTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSkKCSAgewogICAgICAgICAgICAgIFRSQUNFKGtleWJvYXJkLCJBZGp1c3RpbmcgQ2FwcyBMb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIEtleVByZXNzLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlSZWxlYXNlLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSApOwoJICB9CgkvKiBOb3QgTnVtIG5vciBDYXBzIDogZW5kIG9mIGludGVybWVkaWFyeSBzdGF0ZXMgZm9yIGJvdGguICovCglOdW1TdGF0ZSA9IEZBTFNFOwoJQ2Fwc1N0YXRlID0gRkFMU0U7CgoJYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKCVRSQUNFKGtleSwgImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKCWR3RmxhZ3MgPSAwOwoJaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCWlmICggZm9yY2VfZXh0ZW5kZWQgKSAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX1dJTkVfRk9SQ0VFWFRFTkRFRDsKCglLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXkgJiAweGZmLCBiU2NhbiwgZHdGbGFncywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CiAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0tFWUJPQVJEX0luaXQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICovCnZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCAodm9pZCkKewogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxOwogIGludCBzY29yZSwga2V5YywgaSwga2V5LCBwa2V5LCBvaywgc3ltczsKICBLZXlTeW0ga2V5c3ltOwogIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgdW5zaWduZWQgbWF4X3NlcSA9IDA7CiAgaW50IG1heF9zY29yZSA9IDAsIGlzbWF0Y2ggPSAwOwogIGNoYXIgY2tleVs0XSA9CiAgezAsIDAsIDAsIDB9OwoKICBzeW1zID0ga2V5c3ltc19wZXJfa2V5Y29kZTsKICBpZiAoc3ltcyA+IDQpIHsKICAgIFdBUk4gKGtleWJvYXJkLCAiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNCIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5sYW5nOyBjdXJyZW50KyspIHsKICAgIFRSQUNFIChrZXlib2FyZCwgIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBsYXlvdXQgJTA0eFxuIiwKCSAgIG1haW5fa2V5X3RhYltjdXJyZW50XS5sYW5nKTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgLyogZ2V0IGRhdGEgZm9yIGtleWNvZGUgZnJvbSBYIHNlcnZlciAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltczsgaSsrKSB7CglrZXlzeW0gPSBUU1hLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMCkgJiYgKGtleXN5bSAhPSAnICcpKQoJICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKCWVsc2UgewoJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJfQogICAgICB9CiAgICAgIGlmIChja2V5WzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI6MiLCBmb3IgZXhhbXBsZSkgKi8KCS8qIGhvd2V2ZXIsIHRoZSBzY29yZSB3aWxsIGJlIGhpZ2hlciBmb3IgbG9uZ2VyIG1hdGNoZXMgKi8KCWZvciAoa2V5ID0gMDsga2V5IDwgTUFJTl9MRU47IGtleSsrKSB7CgkgIGZvciAob2sgPSAwLCBpID0gMDsgKG9rID49IDApICYmIChpIDwgc3ltcyk7IGkrKykgewoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSA9PSBja2V5W2ldKSkKCSAgICAgIG9rKys7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldICE9IGNrZXlbaV0pKQoJICAgICAgb2sgPSAtMTsKCSAgfQoJICBpZiAob2sgPiAwKSB7CgkgICAgc2NvcmUgKz0gb2s7CgkgICAgYnJlYWs7CgkgIH0KCX0KCS8qIGNvdW50IHRoZSBtYXRjaGVzIGFuZCBtaXNtYXRjaGVzICovCglpZiAob2sgPiAwKSB7CgkgIG1hdGNoKys7CgkgIC8qIGFuZCBob3cgbXVjaCB0aGUga2V5Y29kZSBvcmRlciBtYXRjaGVzICovCgkgIGlmIChrZXkgPiBwa2V5KSBzZXErKzsKCSAgcGtleSA9IGtleTsKCX0gZWxzZSB7CgkgIFRSQUNFIChrZXksICJtaXNtYXRjaCBmb3Iga2V5Y29kZSAlZCwgY2hhcmFjdGVyICVjXG4iLCBrZXljLAoJCSBja2V5WzBdKTsKCSAgbWlzbWF0Y2grKzsKCSAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UgKGtleWJvYXJkLCAibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkgewogICAgRklYTUUgKGtleWJvYXJkLAoJICAgIllvdXIga2V5Ym9hcmQgbGF5b3V0IHdhcyBub3QgZm91bmQhXG4iCgkgICAiSW5zdGVhZCB1c2luZyBjbG9zZXN0IG1hdGNoICglMDR4KSBmb3Igc2NhbmNvZGUgbWFwcGluZy5cbiIKCSAgICJQbGVhc2UgZGVmaW5lIHlvdXIgbGF5b3V0IGluIHdpbmRvd3MveDExZHJ2L2tleWJvYXJkLmMgYW5kIHN1Ym1pdCB0aGVtXG4iCgkgICAidG8gdXMgZm9yIGluY2x1c2lvbiBpbnRvIGZ1dHVyZSBXaW5lIHJlbGVhc2VzLlxuIgoJICAgIlNlZSBkb2N1bWVudGF0aW9uL2tleWJvYXJkIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwKCSAgIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sYW5nKTsKICB9CiAgVFJBQ0UgKGtleWJvYXJkLCAiZGV0ZWN0ZWQgbGF5b3V0IGlzICUwNHhcbiIsIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sYW5nKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9Jbml0CiAqLwp2b2lkIFgxMURSVl9LRVlCT0FSRF9Jbml0KHZvaWQpCnsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5LCBPRU12a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKCiAgICBUU1hEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gVFNYR2V0S2V5Ym9hcmRNYXBwaW5nKGRpc3BsYXksIG1pbl9rZXljb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOwogICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXlzeW1zX3Blcl9rZXljb2RlLgogICAgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBob2xkIGEgbG9jYWwgY29weSBvZiB0aGUga2V5c3ltcyB0YWJsZSAqLwogICAgVFNYRnJlZShrc3ApOwogICAgbW1wID0gVFNYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwogICAga2NwID0gbW1wLT5tb2RpZmllcm1hcDsKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgIHsKICAgICAgICBpbnQgajsKICAgICAgICAKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CiAgICAgICAgICAgICAgICAKCQlmb3IgKGsgPSAwOyBrIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgayArPSAxKQogICAgICAgICAgICAgICAgICAgIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTW9kZV9zd2l0Y2gpCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWx0R3JNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShrZXksICJBbHRHck1hc2sgaXMgJXhcbiIsIEFsdEdyTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKGtleSwgIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgVFNYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgT0VNdmtleSA9IFZLX09FTV83OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIFRTWExvb2t1cFN0cmluZygmZTIsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBrZXkgPSBrZXlzeW0gJiAweGZmOwoJCQogICAgICAgICAgICAgICAgaWYgKGtleSA+PSAweDA4ICYmIGtleSA8PSAweDFCKSB7ICAgICAgICAvKiBzcGVjaWFsIGtleSAqLwoJCSAgICB2a2V5ID0gc3BlY2lhbF9rZXlfdmtleVtrZXkgLSAweDA4XTsKCQkgICAgc2NhbiA9IHNwZWNpYWxfa2V5X3NjYW5ba2V5IC0gMHgwOF07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweDUwICYmIGtleSA8PSAweDU3KSB7IC8qIGN1cnNvciBrZXkgKi8KCQkgICAgdmtleSA9IGN1cnNvcl9rZXlfdmtleVtrZXkgLSAweDUwXTsKCQkgICAgc2NhbiA9IGN1cnNvcl9rZXlfc2NhbltrZXkgLSAweDUwXTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpIHsgLyogbWlzY2VsbGFuZW91cyBrZXkgKi8KCQkgICAgdmtleSA9IG1pc2Nfa2V5X3ZrZXlba2V5IC0gMHg2MF07CgkJICAgIHNjYW4gPSBtaXNjX2tleV9zY2FuW2tleSAtIDB4NjBdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHg3RSAmJiBrZXkgPD0gMHhCOSkgeyAvKiBrZXlwYWQga2V5ICovCgkJICAgIHZrZXkgPSBrZXlwYWRfa2V5X3ZrZXlba2V5IC0gMHg3RV07CgkJICAgIHNjYW4gPSBrZXlwYWRfa2V5X3NjYW5ba2V5IC0gMHg3RV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweEJFICYmIGtleSA8PSAweENEKSB7IC8qIGZ1bmN0aW9uIGtleSAqLwogICAgICAgICAgICAgICAgICAgIHZrZXkgPSBmdW5jdGlvbl9rZXlfdmtleVtrZXkgLSAweEJFXSB8IDB4MTAwOyAvKiBzZXQgZXh0ZW5kZWQgYml0ICovCiAgICAgICAgICAgICAgICAgICAgc2NhbiA9IGZ1bmN0aW9uX2tleV9zY2FuW2tleSAtIDB4QkVdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHhFMSAmJiBrZXkgPD0gMHhFQSkgeyAvKiBtb2RpZmllciBrZXkgKi8KCQkgICAgdmtleSA9IG1vZGlmaWVyX2tleV92a2V5W2tleSAtIDB4RTFdOwoJCSAgICBzY2FuID0gbW9kaWZpZXJfa2V5X3NjYW5ba2V5IC0gMHhFMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAweEZGKSB7ICAgICAgICAgICAgICAgIC8qIERFTCBrZXkgKi8KCQkgICAgdmtleSA9IFZLX0RFTEVURTsKCQkgICAgc2NhbiA9IDB4MTUzOwoJCX0KCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMCkgJiYgKGtleXN5bSE9JyAnKSkgewoJCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJc2NhbiA9IG1haW5fa2V5X3NjYW5bbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CgogICAgICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCgkgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5c3ltID0gVFNYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBWS18wICYmIGtleXN5bSA8PSBWS185KQogICAgICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gVktfQSAmJiBrZXlzeW0gPD0gVktfWikpIHsKCQkgICAgdmtleSA9IGtleXN5bTsKCQl9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKCQlzd2l0Y2ggKGtleXN5bSkKCQl7CgkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CgkJY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMjsgYnJlYWs7CgkJY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMzsgYnJlYWs7CgkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CgkJY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNTsgYnJlYWs7CgkJY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNjsgYnJlYWs7CgkJY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CgkJY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fQ09NTUE7IGJyZWFrOwoJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CgkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOwoJCWNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BMVVM7IGJyZWFrOwoJCX0KCSAgICB9CgogICAgICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCsrT0VNdmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBXQVJOKGtleWJvYXJkLCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OwoJCSAgCiAgICAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgICAgICAgICAgewoJCSAgICBkYmdfZGVjbF9zdHIoa2V5Ym9hcmQsIDEwMjQpOwoKICAgICAgICAgICAgICAgICAgICBUUkFDRShrZXlib2FyZCwgIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCAiCgkJCQkgInRvIGtleWNvZGUgJVg6XG4iLCBPRU12a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcgkqa3NuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltID0gVFNYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQoJCQkgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgICAgICAgICAgZHNwcmludGYoa2V5Ym9hcmQsICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRSQUNFKGtleWJvYXJkLCAiKCVzKVxuIiwgZGJnX3N0cihrZXlib2FyZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgIH0gLyogZm9yICovCgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFKGtleSwiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIC8qIE5vdyBzdG9yZSBvbmUga2V5Y29kZSBmb3IgZWFjaCBtb2RpZmllci4gVXNlZCB0byBzaW11bGF0ZSBrZXlwcmVzc2VzLiAqLwogICAga2NDb250cm9sID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CiAgICBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19BbHRfTCk7CiAgICBpZiAoIWtjQWx0KSBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19NZXRhX0wpOwogICAga2NTaGlmdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19TaGlmdF9MKTsKICAgIGtjTnVtTG9jayA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19OdW1fTG9jayk7CiAgICBrY0NhcHNMb2NrID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NhcHNfTG9jayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX1ZrS2V5U2NhbgogKi8KV09SRCBYMTFEUlZfS0VZQk9BUkRfVmtLZXlTY2FuKENIQVIgY0NoYXIpCnsKCUtleUNvZGUga2V5Y29kZTsKCUtleVN5bSBrZXlzeW07ICAgIAkKCWludCBpLGluZGV4OwoJaW50IGhpZ2hieXRlPTA7CgoJLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwoJa2V5c3ltPSh1bnNpZ25lZCBjaGFyKSBjQ2hhcjsvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCglpZiAoa2V5c3ltPD0yNykga2V5c3ltKz0weEZGMDA7LypzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4qLwoJCglrZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwoJaWYgKCFrZXljb2RlKQoJeyAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwoJfQoKCVRSQUNFKGtleWJvYXJkLCJWa0tleVNjYW4gJyVjJyglI2x4LCAlbHUpOiBnb3Qga2V5Y29kZSAlIy4yeFxuIiwKCQkJIGNDaGFyLGtleXN5bSxrZXlzeW0sa2V5Y29kZSk7CgkKCWlmIChrZXljb2RlKQoJICB7CgkgICAgZm9yIChpbmRleD0tMSwgaT0wOyAoaTw4KSAmJiAoaW5kZXg8MCk7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwoJICAgICAgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LGtleWNvZGUsaSk9PWtleXN5bSkgaW5kZXg9aTsKCSAgICBzd2l0Y2ggKGluZGV4KSB7CgkgICAgY2FzZSAtMSA6CgkgICAgICBXQVJOKGtleWJvYXJkLCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLGtleXN5bSk7IGJyZWFrOwoJICAgIGNhc2UgMCA6IGJyZWFrOwoJICAgIGNhc2UgMSA6IGhpZ2hieXRlID0gMHgwMTAwOyBicmVhazsKCSAgICBjYXNlIDIgOiBoaWdoYnl0ZSA9IDB4MDYwMDsgYnJlYWs7CgkgICAgY2FzZSAzIDogaGlnaGJ5dGUgPSAweDA3MDA7IGJyZWFrOwoJICAgIGRlZmF1bHQgOiBFUlIoa2V5Ym9hcmQsImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CgkgICAgfQoJICAgIC8qCgkgICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCgkgICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCgkgICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKCSAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQoJICAgICAqLwoJICB9CglUUkFDRShrZXlib2FyZCwiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZSk7CglyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlOyAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBWaXJ0dWFsS2V5CiAqLwpVSU5UMTYgWDExRFJWX0tFWUJPQVJEX01hcFZpcnR1YWxLZXkoVUlOVDE2IHdDb2RlLCBVSU5UMTYgd01hcFR5cGUpCnsKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0Uoa2V5Ym9hcmQsInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKCVRSQUNFKGtleWJvYXJkLCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uIFxuIiwKCQkJIHdDb2RlLHdNYXBUeXBlKTsKCXN3aXRjaCh3TWFwVHlwZSkgewoJCWNhc2UgMDoJeyAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkJCXJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CgkJCVRSQUNFKGtleWJvYXJkLCJyZXR1cm5pbmcgbm8gc2Nhbi1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDE6IHsgLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwoJCQkvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkKCQkJCQlyZXR1cm5NVksgKGtleWMydmtleVtrZXljXSAmIDB4RkYpOwoJCQlUUkFDRShrZXlib2FyZCwicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7IH0KCgkJY2FzZSAyOiB7IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCgkJCS8qICh3YXMgRklYTUUpIDogd2hhdCBkb2VzIHVuc2hpZnRlZCBtZWFuID8gJ2EnIG9yICdBJyA/ICovCgkJICAgICAgICAvKiBNeSBXaW5kb3dzIHJldHVybnMgJ0EnLiAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWM7CgkJCWNoYXIgc1syXTsKCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKCQkJZS5zdGF0ZSA9IDA7IC8qIHVuc2hpZnRlZCAqLwoKCQkJZS5rZXljb2RlID0gMDsKCQkJLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQoJCQl7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwoJCQkgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCSAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCgkJCSAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KCQkJCWlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgmZSkgJiAweEZGKSAhPSB3Q29kZSkgewoJCQkJICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKCQkJCQkgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoKHdDb2RlPj1WS19OVU1QQUQwKSAmJiAod0NvZGU8PVZLX05VTVBBRDkpKQoJCQkgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHdDb2RlLVZLX05VTVBBRDArWEtfS1BfMCk7CiAgICAgICAgICAKCQkJaWYgKHdDb2RlPT1WS19ERUNJTUFMKQoJCQkgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKCQkJaWYgKCFlLmtleWNvZGUpCgkJCXsKCQkJICBXQVJOKGtleWJvYXJkLCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsIHdDb2RlKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRShrZXlib2FyZCwiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKCQkJaWYgKFRTWExvb2t1cFN0cmluZygmZSwgcywgMiwgJmtleXN5bSwgTlVMTCkpCgkJCSAgcmV0dXJuTVZLICgqcyk7CgkJCQoJCQlUUkFDRShrZXlib2FyZCwicmV0dXJuaW5nIG5vIEFOU0kuXG4iKTsKCQkJcmV0dXJuIDA7CgkJCX0KCgkJY2FzZSAzOiAgIC8qICoqTlQgb25seSoqIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgYnV0IGRpc3Rpbmd1aXNoIGJldHdlZW4gICovCiAgICAgICAgICAgICAgCQkgIC8qICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICAqLwoJCSAgICAgICAgICBGSVhNRShrZXlib2FyZCwgIiBzdHViIGZvciBOVFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCVdBUk4oa2V5Ym9hcmQsICJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsCgkJCQl3TWFwVHlwZSk7CgkJCXJldHVybiAwOwkKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9HZXRLZXlOYW1lVGV4dAogKi8KSU5UMTYgWDExRFJWX0tFWUJPQVJEX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMTYgblNpemUpCnsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CgkKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgLyogRklYTUU6IHNob3VsZCB1c2UgTVZLIHR5cGUgMyAoTlQgdmVyc2lvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgcmlnaHQgYW5kIGxlZnQgKi8KICB2a2V5ID0gWDExRFJWX0tFWUJPQVJEX01hcFZpcnR1YWxLZXkoc2NhbkNvZGUsIDEpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfS0VZQk9BUkRfTWFwVmlydHVhbEtleSh2a2V5LCAyKTsKICBUUkFDRShrZXlib2FyZCwgInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0eCwgQU5TSSAweCUwNHhcbiIsCiAgICAgICAgICBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIGlmICgodmtleSA+PSAweDMwKSAmJiAodmtleSA8PSAweDM5KSAmJgogICAgICAodmtleSA+PSAweDQxKSAmJiAodmtleSA8PSAweDVhKSkgLyogV2luZG93cyBWS18qIGFyZSBBTlNJIGNvZGVzICovCiAgICAgIHsKICAgICAgICBpZiAoKG5TaXplID49IDIpICYmIGxwQnVmZmVyKQoJewogICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXIoKGNoYXIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gCiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogdXNlIHZrZXkgdmFsdWVzIHRvIGNvbnN0cnVjdCBuYW1lcyAqLwoKICBGSVhNRShrZXlib2FyZCwiKCUwOGx4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSk7CgogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CSAKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0Uoa2V5Ym9hcmQsIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX1RvQXNjaWkKICoKICogVGhlIFRvQXNjaWkgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQxNiBYMTFEUlZfS0VZQk9BUkRfVG9Bc2NpaSgKICAgIFVJTlQxNiB2aXJ0S2V5LFVJTlQxNiBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsIAogICAgTFBWT0lEIGxwQ2hhciwgVUlOVDE2IGZsYWdzKQp7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBzdGF0aWMgWENvbXBvc2VTdGF0dXMgY3M7CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CgogICAgaWYgKHNjYW5Db2RlPT0wKSB7CiAgICAgICAgLyogVGhpcyBoYXBwZW5zIHdoZW4gZG9pbmcgQWx0K2xldHRlciA6IGEgZmFrZSAnZG93biBhcnJvdycga2V5IHByZXNzCiAgICAgICAgICAgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHdpbmRvd3MuIEp1c3QgaWdub3JlIGl0LiAqLwogICAgICAgIFRSQUNFKGtleWJvYXJkLCJzY2FuQ29kZT0wLCBkb2luZyBub3RoaW5nXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRSgga2V5Ym9hcmQsICJLZXkgVVAsIGRvaW5nIG5vdGhpbmdcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlLmtleWNvZGUgPSAwOwogICAgZS5zdGF0ZSA9IDA7CiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQoJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCgllLnN0YXRlIHw9IExvY2tNYXNrOwogICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQogICAgewoJaWYgKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKQoJICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoJZWxzZQoJICAgIGUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgVFJBQ0Uoa2V5LCAiKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKICAgICAgICAgIAogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgogICAgaWYgKCFlLmtleWNvZGUpCiAgICAgIHsKCVdBUk4oa2V5Ym9hcmQsIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIix2aXJ0S2V5KTsKCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICB9CiAgICBlbHNlIFRSQUNFKGtleWJvYXJkLCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgcmV0ID0gVFNYTG9va3VwU3RyaW5nKCZlLCAoTFBWT0lEKWxwQ2hhciwgMiwgJmtleXN5bSwgJmNzKTsKICAgIGlmIChyZXQgPT0gMCkKCXsKCUJZVEUgZGVhZF9jaGFyID0gMDsKCgkoKGNoYXIqKWxwQ2hhcilbMV0gPSAnXDAnOwoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKCSAgICB7CgkgICAgKihjaGFyKilscENoYXIgPSBkZWFkX2NoYXI7CgkgICAgcmV0ID0gLTE7CgkgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjaGFyCSprc25hbWU7CgoJICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCUVSUihrZXlib2FyZCwgIlBsZWFzZSByZXBvcnQ6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCgkJCWtleXN5bSwga3NuYW1lKTsKCQlFUlIoa2V5Ym9hcmQsICIodmlydEtleT0lWCxzY2FuQ29kZT0lWCxrZXljb2RlPSVYLHN0YXRlPSVYKVxuIiwKCQkJdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ID0gMSAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0Uoa2V5LCAiVG9Bc2NpaSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4XG4iLAoJCXJldCwgKihjaGFyKilscENoYXIpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfR2V0QmVlcEFjdGl2ZQogKi8KQk9PTCBYMTFEUlZfS0VZQk9BUkRfR2V0QmVlcEFjdGl2ZSgpCnsKICBYS2V5Ym9hcmRTdGF0ZSAga2V5Ym9hcmRfc3RhdGU7CgogIFRTWEdldEtleWJvYXJkQ29udHJvbChkaXNwbGF5LCAma2V5Ym9hcmRfc3RhdGUpOwoKICByZXR1cm4ga2V5Ym9hcmRfc3RhdGUuYmVsbF9wZXJjZW50ICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX1NldEJlZXBBY3RpdmUKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX1NldEJlZXBBY3RpdmUoQk9PTCBiQWN0aXZhdGUpCnsKICBYS2V5Ym9hcmRDb250cm9sIGtleWJvYXJkX3ZhbHVlOwogIAogIGlmKGJBY3RpdmF0ZSkKICAgIGtleWJvYXJkX3ZhbHVlLmJlbGxfcGVyY2VudCA9IC0xOwogIGVsc2UKICAgIGtleWJvYXJkX3ZhbHVlLmJlbGxfcGVyY2VudCA9IDA7CiAgCiAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKGRpc3BsYXksIEtCQmVsbFBlcmNlbnQsICZrZXlib2FyZF92YWx1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0JlZXAKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX0JlZXAoKQp7CiAgVFNYQmVsbChkaXNwbGF5LCAwKTsKfQoKI2VuZGlmIC8qICFkZWZpbmVkKFhfRElTUExBWV9NSVNTSU5HKSAqLwoK