LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1hLQgojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7Cgp0eXBlZGVmIHVuaW9uCnsKICAgIHN0cnVjdAogICAgewojaWZuZGVmIEJJVEZJRUxEU19CSUdFTkRJQU4KICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50IDogMTY7CiNlbmRpZgogICAgICAgIHVuc2lnbmVkIGxvbmcgY29kZSA6IDg7CiAgICAgICAgdW5zaWduZWQgbG9uZyBleHRlbmRlZCA6IDE7CiAgICAgICAgdW5zaWduZWQgbG9uZyB1bnVzZWQgOiAyOwogICAgICAgIHVuc2lnbmVkIGxvbmcgd2luX2ludGVybmFsIDogMjsKICAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQgOiAxOwogICAgICAgIHVuc2lnbmVkIGxvbmcgcHJldmlvdXMgOiAxOwogICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNpdGlvbiA6IDE7CiNpZmRlZiBCSVRGSUVMRFNfQklHRU5ESUFOCiAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCA6IDE2OwojZW5kaWYKICAgIH0gbHAxOwogICAgdW5zaWduZWQgbG9uZyBscDI7Cn0gS0VZTFA7CgovKiBrZXkgc3RhdGUgdGFibGUgYml0czoKICAweDgwIC0+IGtleSBpcyBwcmVzc2VkCiAgMHg0MCAtPiBrZXkgZ290IHByZXNzZWQgc2luY2UgbGFzdCB0aW1lCiAgMHgwMSAtPiBrZXkgaXMgdG9nZ2xlZAoqLwpCWVRFIGtleV9zdGF0ZV90YWJsZVsyNTZdOwoKc3RhdGljIEJZVEUgVHJhY2tTeXNLZXkgPSAwOyAvKiBkZXRlcm1pbmUgd2hldGhlciBBTFQga2V5IHVwIHdpbGwgY2F1c2UgYSBXTV9TWVNLRVlVUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgV01fS0VZVVAgbWVzc2FnZSAqLwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCnN0YXRpYyBpbnQga2NDb250cm9sLCBrY0FsdCwga2NTaGlmdCwga2NOdW1Mb2NrLCBrY0NhcHNMb2NrOyAvKiBrZXljb2RlcyAqLwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgVktfT0VNXzEwMiwnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV84LFZLX09FTV81LAogICBWS19PRU1fNywnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hemVydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fNywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgICdBJywnWicsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNixWS19PRU1fMSwKICAgJ1EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsJ00nLFZLX09FTV8zLFZLX09FTV81LAogICAnVycsJ1gnLCdDJywnVicsJ0InLCdOJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fOCwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfZHZvcmFrW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV82LAogICBWS19PRU1fNyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCwnUCcsJ1knLCdGJywnRycsJ0MnLCdSJywnTCcsVktfT0VNXzIsVktfT0VNX1BMVVMsCiAgICdBJywnTycsJ0UnLCdVJywnSScsJ0QnLCdIJywnVCcsJ04nLCdTJyxWS19PRU1fTUlOVVMsVktfT0VNXzUsCiAgIFZLX09FTV8xLCdRJywnSicsJ0snLCdYJywnQicsJ00nLCdXJywnVicsJ1onLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgV0lORURFQlVHPStrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIlx4ZmNceGRjIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGY2XHhkNiIsIlx4ZTRceGM0IiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBFcmljIFBvdWVjaCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyfiIsIlwiMyMiLCInNHsiLCIoNVsiLCItNnwiLCLoN2AiLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFvyIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqgiLCIko6QiLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi3z8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwitCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgMTA1IEtleXMgKGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEZlY2huZXIpKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkXzEwNVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogIjw+fCIsInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlMLAiLCI2L7IiLCI3PWAiLCI4KP8iLCI5KbQiLCL21r0iLCL83KgiLCLz07giLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUnNIiwib0/4IiwicFAiLCL11fciLCL62tciLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSu0iLCJrS7MiLCJsTKMiLCLpySQiLCLhwd8iLCL726QiLAogInlZPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD87IiwiLjo+IiwiLV8qIiwKICLtzTwiCn07CgovKioqIFBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JqciLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUXqyiIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/PTIiwicFAiLCJbeyIsIl19IiwKICJhQbGhIiwic1O2piIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMs6MiLCI7OiIsIidcIiIsIlxcfCIsCiAielq/ryIsInhYvKwiLCJjQ+bGIiwidlYiLCJiQiIsIm5O8dEiLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2kpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICKpuSIsIqq6IiwixeUiLCLS8iIsItT0Iiwi2voiLCLV9SIsIsnpIiwiz+8iLCLQ8CIsItv7IiwiW10iLAogIsHhIiwi0/MiLCLE5CIsIsbmIiwix+ciLCLI6CIsIqi4Iiwiy+siLCLM7CIsIt7+Iiwiq7siLCItXyIsCiAiobEiLCKvvyIsIsPjIiwi1/ciLCLC4iIsIs7uIiwize0iLCIsOyIsIi46Iiwi1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAMlwiIiwiMyMiLCI0JCIsIjUlIiwiNl42JiIsIjcmNy8iLCI4KjgoIiwiOSg5KSIsIjApMD0iLCItXyc/IiwiPSsrKiIsCiAicVGpuSIsIndXqroiLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdr6IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfVtdIiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSqi4Iiwia0vL6yIsImxMzOwiLCI7Ot7+IiwiJ1wiq7siLCJcXHwtXyIsCiAielqhsSIsInhYr78iLCJjQ8PjIiwidlbX9yIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8LDsiLCIuPi46IiwiLz/W9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGhyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCIvPyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfcGM5OHgxW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXmAiLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQH4iLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgR29tZXMgRmVybmFuZGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjaoIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrRgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IHdpdGggPEFMVCBHUj4gKGNvbnRyaWJ1dGVkIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJfYWx0X2dyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxITkiLCIyQDIiLCIzIzMiLCI0JCMiLCI1JVwiIiwiNigsIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rJyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCI0YCIsIlt7KiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiZ0ciLCJ+XiIsIl19OiIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPzAiCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiOzAiLCIrMSIsIrUyIiwiuTMiLCLoNCIsIrs1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwiJ3YiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCLkKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9FwiIiwipyEiLCLyKSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjeikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjel9xd2VydHkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaX3F3ZXJ0eVtNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIFNsb3ZhayBhbmQgQ3plY2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19kdWFsKGNzX3NrX3VjdykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLX3Byb2dbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUeTEIiwid1fszCIsImVF6ckiLCJyUvjYIiwidFS7qyIsInlZ/d0iLCJ1VfnZIiwiaUntzSIsIm9P89MiLCJwUPbWIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTuakiLCJkRO/PIiwiZkbryyIsImdH4MAiLCJoSPraIiwiakr83CIsImtL9NQiLCJsTLWlIiwiOzoiLCInXCIiLCJcXHwiLAogInpavq4iLCJ4WKQiLCJjQ+jIIiwidlbnxyIsImJCIiwibk7y0iIsIm1N5cUiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShjc19xd2VydHkpIGluIHhrYnNlbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1NbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpML0pIiwiPSUiLCIiLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i9beyIsIikoXX0iLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIvlcIiQiLCKnId8iLCKoJyIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEdhYnJpZWwgT3JsYW5kbyBHYXJjaWEpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xBW01BSU5fTEVOXVs0XSA9CnsKICJ8sCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiv6EiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrSoIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwie1teIiwifV0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQgKHBjL2x0IGluIFhGcmVlODYgNC4zLjAsIGNvbnRyaWJ1dGVkIGJ5IE5lcmlqdXMgQmFsaftuYXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJbTUFJTl9MRU5dWzRdID0KewoiXCJcXCIsIjEhIiwiMiciLCIzXiIsIjQrIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKj8iLCItXyIsCiJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIlx4YjlJIiwib08iLCJwUCIsIlx4YmJceGFiIiwi/NwiLAoiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiXHhiYVx4YWEiLCJpXDAiLCIsOyIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIsCiI8PiIKfTsKCi8qKiogVHVya2lzaCBGIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyZikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJfRltNQUlOX0xFTl1bNF0gPQp7CiIrKiIsIjEhIiwiMlwiIiwiM14jIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMD0iLCIvPyIsIi1fIiwKImZGIiwiZ0ciLCJceGJiXHhhYiIsIlx4YjlJIiwib08iLCJkRCIsInJSIiwibk4iLCJoSCIsInBQIiwicVEiLCJ3VyIsCiJ1VSIsImlcMCIsImVFIiwiYUEiLCL83CIsInRUIiwia0siLCJtTSIsImxMIiwieVkiLCJceGJhXHhhYSIsInhYIiwKImpKIiwi9tYiLCJ2ViIsImNDIiwi58ciLCJ6WiIsInNTIiwiYkIiLCIuOiIsIiw7IiwKIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMW01BSU5fTEVOXVs0XSA9CnsKICJgfjsiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRLyIsIndXJyIsImVF9yIsInJS+CIsInRU4CIsInlZ6CIsInVV5SIsImlJ7yIsIm9P7SIsInBQ9CIsIlt7IiwiXX0iLAogImFB+SIsInNT4yIsImRE4iIsImZG6yIsImdH8iIsImhI6SIsImpK5yIsImtL7CIsImxM6iIsIjs68yIsIlwnXCIsIiwiXFx8IiwKICJ6WuYiLCJ4WPEiLCJjQ+EiLCJ2VuQiLCJiQvAiLCJuTu4iLCJtTfYiLCIsPPoiLCIuPvUiLCIvPy4iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWxfcGhvbmV0aWMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1flIiwiZUXgIiwiclL4IiwidFT6IiwieVnyIiwidVXlIiwiaUnpIiwib0/xIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1P5IiwiZETjIiwiZkb0IiwiZ0fiIiwiaEjkIiwiakrpIiwia0vrIiwibEzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW5SIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIC1zeW1ib2xzICJ1cyhwYzEwNSkraWxfc2FoYXJvbiIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3NhaGFyb25bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V/EiLCJlRSIsInJS+CIsInRU6CIsInlZ4yIsInVVIiwiaUkiLCJvTyIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT5SIsImRE7CIsImZG+iIsImdH4iIsImhI5CIsImpK+SIsImtL6yIsImxM6SIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VvIiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBHcmVlayBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEtyaXRvbiBLeXJpbWlzIDxreXJpbWlzQGN0aS5ncj4pCiAgR3JlZWsgY2hhcmFjdGVycyBmb3IgIndXIiBhbmQgInNTIiBhcmUgb21pdHRlZCB0byBub3QgcHJvZHVjZSBhIG1pc21hdGNoCiAgbWVzc2FnZSBzaW5jZSB0aGV5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgaW4gZ3IgYW5kIGVsIFhGcmVlODYgbGF5b3V0cy4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRUxbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUTs6Iiwid1ciLCJlReXFIiwiclLx0SIsInRU9NQiLCJ5WfXVIiwidVXoyCIsImlJ6ckiLCJvT+/PIiwicFDw0CIsIlt7IiwiXX0iLAogImFB4cEiLCJzUyIsImRE5MQiLCJmRvbWIiwiZ0fjwyIsImhI58ciLCJqSu7OIiwia0vqyiIsImxM68siLCI7OrSoIiwiJ1wiIiwiXFx8IiwKICJ6WubGIiwieFj31yIsImND+NgiLCJ2VvnZIiwiYkLiwiIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogVGhhaSAoS2VkbWFuZWUpIGtleWJvYXJkIGxheW91dCBieSBTdXBwaGFjaG9rZSBTdW50aXdpY2hheWEgPG1yY2hva2VAb3BlbnRsZS5vcmc+ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3RoW01BSU5fTEVOXVs0XSA9CnsKICJgfl8lIiwiMSHlKyIsIjJAL/EiLCIzIy3yIiwiNCTA8yIsIjUltvQiLCI2XtjZIiwiNybW3yIsIjgqpPUiLCI5KLX2IiwiMCmo9yIsIi1fovgiLCI9K6r5IiwKICJxUebwIiwid1fkXCIiLCJlRdOuIiwiclK+sSIsInRU0LgiLCJ5WdHtIiwidVXV6iIsImlJw7MiLCJvT7nPIiwicFDCrSIsIlt7urAiLCJdfcUsIiwKICJhQb/EIiwic1PLpiIsImREoa8iLCJmRrTiIiwiZ0fgrCIsImhI6eciLCJqSujrIiwia0vSySIsImxMysgiLCI7OserIiwiXCdcIqcuIiwiXFx8o6UiLAogInpavCgiLCJ4WLspIiwiY0PhqSIsInZWzc4iLCJiQtoiLCJuTtfsIiwibU23PyIsIiw8wbIiLCIuPuPMIiwiLz+9xiIKfTsgCgovKioqIFZOQyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl92bmNbTUFJTl9MRU5dID0KewogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDFBLDB4MUIsMHgyNywweDI4LDB4MjksMHgzMywweDM0LDB4MzUsMHgyQiwKICAgMHgxRSwweDMwLDB4MkUsMHgyMCwweDEyLDB4MjEsMHgyMiwweDIzLDB4MTcsMHgyNCwweDI1LDB4MjYsMHgzMiwweDMxLDB4MTgsMHgxOSwweDEwLDB4MTMsMHgxRiwweDE0LDB4MTYsMHgyRiwweDExLDB4MkQsMHgxNSwweDJDLAogICAweDU2Cn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3ZuY1tNQUlOX0xFTl0gPQp7CiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgICdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08nLCdQJywnUScsJ1InLCdTJywnVCcsJ1UnLCdWJywnVycsJ1gnLCdZJywnWicsCiAgIFZLX09FTV8xMDIKfTsKCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3ZuY1tNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwiW3siLCJdfSIsIjs6IiwiJ1wiIiwiYH4iLCIsPCIsIi4+IiwiLz8iLCJcXHwiLAogImFBIiwiYkIiLCJjQyIsImREIiwiZUUiLCJmRiIsImdHIiwiaEgiLCJpSSIsImpKIiwia0siLCJsTCIsIm1NIiwibk4iLCJvTyIsInBQIiwicVEiLCJyUiIsInNTIiwidFQiLCJ1VSIsInZWIiwid1ciLCJ4WCIsInlZIiwieloiCn07CgovKioqIER1dGNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIG5sKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05MW01BSU5fTEVOXVs0XSA9CnsKICJApyIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3XyIsIjgoIiwiOSkiLCIwJyIsIi8/IiwisH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiqH4iLCIqfCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiK7EiLCInYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItPSIsCiAiW10iCn07CgoKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBMQ0lEIGxjaWQ7IC8qIGlucHV0IGxvY2FsZSBpZGVudGlmaWVyLCBsb29rIGZvciBMT0NBTEVfSUxBTkdVQUdFCiAgICAgICAgICAgICAgICAgaW4gdGhlIGFwcHJvcHJpYXRlIGRsbHMva2VybmVsL25scy8ubmxzIGZpbGUgKi8KICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQ7CiAgICBjb25zdCBjaGFyICgqa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjb25zdCBXT1JEICgqc2NhbilbTUFJTl9MRU5dOyAvKiBzY2FuIGNvZGVzIG1hcHBpbmcgKi8KICAgIGNvbnN0IFdPUkQgKCp2a2V5KVtNQUlOX0xFTl07IC8qIHZpcnR1YWwga2V5IGNvZGVzIG1hcHBpbmcgKi8KfSBtYWluX2tleV90YWJbXT17CiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWspIiwgJm1haW5fa2V5X1VTX2R2b3JhaywgJm1haW5fa2V5X3NjYW5fZHZvcmFrLCAmbWFpbl9rZXlfdmtleV9kdm9yYWt9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMgSW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVNfaW50bCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwOSwgIkJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9ERSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCBmb3IgbG9naXRlY2ggZGVza3RvcCBwcm8iLCAmbWFpbl9rZXlfREVfbG9naXRlY2gsICAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUiLCAmbWFpbl9rZXlfREVfbm9kZWFkXzEwNSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKENBX2ZyKSIsICZtYWluX2tleV9DQV9mciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwYywgIkJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwODE2LCAiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCBBTFQgR1IiLCAmbWFpbl9rZXlfUFRfYnJfYWx0X2dyLCZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDBiLCAiRmlubmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19iZHMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIzLCAiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxIiwgJm1haW5fa2V5X1JVX2NwMTI1MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfVUFfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9SVV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMCwgIkl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBmLCAiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZSwgIkh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MTUsICJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI0LCAiU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHNyIiwgJm1haW5fa2V5X1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzciIsICZtYWluX2tleV9VU19TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDYsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNn0sCiB7MHgwNDExLCAiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjeiIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjel9xd2VydHkiLCAmbWFpbl9rZXlfQ1pfcXdlcnR5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI3LCAiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIiLCAmbWFpbl9rZXlfVFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0cmYiLCAmbWFpbl9rZXlfVFJfRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3NhaGFyb24sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJWTkMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3ZuYywgJm1haW5fa2V5X3NjYW5fdm5jLCAmbWFpbl9rZXlfdmtleV92bmN9LAogezB4MDQwOCwgIkdyZWVrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZSwgIlRoYWkgKEtlZG1hbmVlKSAga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3RoLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEzLCAiRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05MLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgogezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAwLCAwLCBWS19FU0NBUEUsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjUwICovCiAgICBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsIDAsIDAsIDAsICAvKiBGRjYwICovCiAgICBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAvKiBGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgVktfRU5ELCBWS19DTEVBUiwgVktfSU5TRVJULCBWS19ERUxFVEUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgMCwgMCwgICAgICAgLyogRkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfU0hJRlQsIFZLX1NISUZULCBWS19DT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgVktfTUVOVSwKICAgIFZLX01FTlUsIFZLX01FTlUsIFZLX01FTlUsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzOCwgMHgxNDUsICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAvKj8qLyAwLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAweDAwLCAweDM4LCAgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIGlmICh4aWMpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGtleXN5bSA+PSAweEZGQUUpICYmIChrZXlzeW0gPD0gMHhGRkI5KSAmJiAoa2V5c3ltICE9IDB4RkZBRikKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIFRSQUNFXyhrZXkpKCJlLT5rZXljb2RlID0gJXhcbiIsIGUtPmtleWNvZGUpOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kdm9pZCBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggV09SRCB3VmssIFdPUkQgd1NjYW4sIERXT1JEIGR3RmxhZ3MsIERXT1JEIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RXh0cmFJbmZvLCBVSU5UIGluamVjdGVkX2ZsYWdzICkKewogICAgVUlOVCBtZXNzYWdlOwogICAgS0VZTFAga2V5bHA7CiAgICBLQkRMTEhPT0tTVFJVQ1QgaG9vazsKCiAgICBrZXlscC5scDIgPSAwOwogICAga2V5bHAubHAxLmNvdW50ID0gMTsKICAgIGtleWxwLmxwMS5jb2RlID0gd1NjYW47CiAgICBrZXlscC5scDEuZXh0ZW5kZWQgPSAoZHdGbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgIT0gMDsKICAgIGtleWxwLmxwMS53aW5faW50ZXJuYWwgPSAwOyAvKiB0aGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBkaWFsb2dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZG9uJ3QgcmVtZW1iZXIgd2hlcmUgSSByZWFkIGl0IC0gQUsgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCdzICcxJyB1bmRlciB3aW5kb3dzLCB3aGVuIGEgZGlhbG9nIGJveCBhcHBlYXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHlvdSBwcmVzcyBvbmUgb2YgdGhlIHVuZGVybGluZWQga2V5cyAtIERGKi8KCiAgICAvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSB0ZXN0IGZvciBhbGwgdGhpcyAqLwogICAgaWYgKGR3RmxhZ3MgJiBLRVlFVkVOVEZfS0VZVVAgKQogICAgewogICAgICAgIG1lc3NhZ2UgPSBXTV9LRVlVUDsKICAgICAgICBpZiAoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODApICYmCiAgICAgICAgICAgICgod1ZrID09IFZLX01FTlUpIHx8ICh3VmsgPT0gVktfQ09OVFJPTCkgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgewogICAgICAgICAgICBpZiggVHJhY2tTeXNLZXkgPT0gVktfTUVOVSB8fCAvKiA8QUxUPi1kb3duLzxBTFQ+LXVwIHNlcXVlbmNlICovCiAgICAgICAgICAgICAgICAod1ZrICE9IFZLX01FTlUpKSAvKiA8QUxUPi1kb3duLi4uPHNvbWV0aGluZyBlbHNlPi11cCAqLwogICAgICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWVVQOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IDA7CiAgICAgICAgfQogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdICY9IH4weDgwOwogICAgICAgIGtleWxwLmxwMS5wcmV2aW91cyA9IDE7CiAgICAgICAga2V5bHAubHAxLnRyYW5zaXRpb24gPSAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGtleWxwLmxwMS5wcmV2aW91cyA9IChrZXlfc3RhdGVfdGFibGVbd1ZrXSAmIDB4ODApICE9IDA7CiAgICAgICAga2V5bHAubHAxLnRyYW5zaXRpb24gPSAwOwogICAgICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVt3VmtdICYgMHg4MCkpIGtleV9zdGF0ZV90YWJsZVt3VmtdIF49IDB4MDE7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gfD0gMHhjMDsKCiAgICAgICAgbWVzc2FnZSA9IFdNX0tFWURPV047CiAgICAgICAgaWYgKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSAmJiAhKGtleV9zdGF0ZV90YWJsZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWURPV047CiAgICAgICAgICAgIFRyYWNrU3lzS2V5ID0gd1ZrOwogICAgICAgIH0KICAgIH0KCiAgICBrZXlscC5scDEuY29udGV4dCA9IChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSAhPSAwOyAvKiAxIGlmIGFsdCAqLwoKICAgIFRSQUNFXyhrZXkpKCIgd1BhcmFtPSUwNHgsIGxQYXJhbT0lMDhseCwgSW5wdXRLZXlTdGF0ZT0leFxuIiwKICAgICAgICAgICAgICAgIHdWaywga2V5bHAubHAyLCBrZXlfc3RhdGVfdGFibGVbd1ZrXSApOwoKICAgIGhvb2sudmtDb2RlICAgICAgPSB3Vms7CiAgICBob29rLnNjYW5Db2RlICAgID0gd1NjYW47CiAgICBob29rLmZsYWdzICAgICAgID0gKGtleWxwLmxwMiA+PiAyNCkgfCBpbmplY3RlZF9mbGFnczsKICAgIGhvb2sudGltZSAgICAgICAgPSB0aW1lOwogICAgaG9vay5kd0V4dHJhSW5mbyA9IGR3RXh0cmFJbmZvOwogICAgaWYgKEhPT0tfQ2FsbEhvb2tzKCBXSF9LRVlCT0FSRF9MTCwgSENfQUNUSU9OLCBtZXNzYWdlLCAoTFBBUkFNKSZob29rLCBUUlVFICkpIHJldHVybjsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZW5kX21lc3NhZ2UgKQogICAgewogICAgICAgIHJlcS0+aWQgICAgICAgPSAoaW5qZWN0ZWRfZmxhZ3MgJiBMTEtIRl9JTkpFQ1RFRCkgPyAwIDogR2V0Q3VycmVudFRocmVhZElkKCk7CiAgICAgICAgcmVxLT50eXBlICAgICA9IE1TR19IQVJEV0FSRTsKICAgICAgICByZXEtPmZsYWdzICAgID0gMDsKICAgICAgICByZXEtPndpbiAgICAgID0gMDsKICAgICAgICByZXEtPm1zZyAgICAgID0gbWVzc2FnZTsKICAgICAgICByZXEtPndwYXJhbSAgID0gd1ZrOwogICAgICAgIHJlcS0+bHBhcmFtICAgPSBrZXlscC5scDI7CiAgICAgICAgcmVxLT54ICAgICAgICA9IGN1cnNvcl9wb3MueDsKICAgICAgICByZXEtPnkgICAgICAgID0gY3Vyc29yX3Bvcy55OwogICAgICAgIHJlcS0+dGltZSAgICAgPSB0aW1lOwogICAgICAgIHJlcS0+aW5mbyAgICAgPSBkd0V4dHJhSW5mbzsKICAgICAgICByZXEtPnRpbWVvdXQgID0gLTE7CiAgICAgICAgcmVxLT5jYWxsYmFjayA9IE5VTEw7CiAgICAgICAgd2luZV9zZXJ2ZXJfY2FsbCggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlLRVlCT0FSRF9HZW5lcmF0ZU1zZwogKgogKiBHZW5lcmF0ZSBEb3duK1VwIG1lc3NhZ2VzIHdoZW4gTnVtTG9jayBvciBDYXBzTG9jayBpcyBwcmVzc2VkLgogKgogKiBDb252ZW50aW9uIDogY2FsbGVkIHdpdGggdmtleSBvbmx5IFZLX05VTUxPQ0sgb3IgVktfQ0FQSVRBTAogKgogKi8Kc3RhdGljIHZvaWQgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFdPUkQgdmtleSwgV09SRCBzY2FuLCBpbnQgRXZ0eXBlLCBEV09SRCBldmVudF90aW1lICkKewogIEJPT0wgKiBTdGF0ZSA9ICh2a2V5PT1WS19OVU1MT0NLPyAmTnVtU3RhdGUgOiAmQ2Fwc1N0YXRlKTsKICBEV09SRCB1cCwgZG93bjsKCiAgaWYgKCpTdGF0ZSkgewogICAgLyogVGhlIElOVEVSTUVESUFSWSBzdGF0ZSBtZWFucyA6IGp1c3QgYWZ0ZXIgYSAncHJlc3MnIGV2ZW50LCBpZiBhICdyZWxlYXNlJyBldmVudCBjb21lcywKICAgICAgIGRvbid0IHRyZWF0IGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgogICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KICAgICpTdGF0ZT1GQUxTRTsKICAgIFRSQUNFKCJJTlRFUk0gOiBkb24ndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIGtleV9zdGF0ZV90YWJsZVslI3hdID0gJSN4XG4iLAogICAgICAgICAgdmtleSxrZXlfc3RhdGVfdGFibGVbdmtleV0pOwogIH0gZWxzZQogICAgewogICAgICAgIGRvd24gPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApOwogICAgICAgIHVwID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKSB8IEtFWUVWRU5URl9LRVlVUDsKCWlmICgga2V5X3N0YXRlX3RhYmxlW3ZrZXldICYgMHgxICkgLyogaXQgd2FzIE9OICovCgkgIHsKCSAgICBpZiAoRXZ0eXBlIT1LZXlQcmVzcykKCSAgICAgIHsKCQlUUkFDRSgiT04gKyBLZXlSZWxlYXNlID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKCSAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGRvd24sIGV2ZW50X3RpbWUsIDAsIDAgKTsKCSAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIHVwLCBldmVudF90aW1lLCAwLCAwICk7CgkJKlN0YXRlPUZBTFNFOwoJCWtleV9zdGF0ZV90YWJsZVt2a2V5XSAmPSB+MHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9mZi4gKi8KCSAgICAgIH0KCSAgfQoJZWxzZSAvKiBpdCB3YXMgT0ZGICovCgkgIGlmIChFdnR5cGU9PUtleVByZXNzKQoJICAgIHsKCSAgICAgIFRSQUNFKCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZG93biwgZXZlbnRfdGltZSwgMCwgMCApOwoJICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIHVwLCBldmVudF90aW1lLCAwLCAwICk7CgkgICAgICAqU3RhdGU9VFJVRTsgLyogR29lcyB0byBpbnRlcm1lZGlhcnkgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIE9OICovCgkgICAgICBrZXlfc3RhdGVfdGFibGVbdmtleV0gfD0gMHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9uLiAqLwoJICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZQogKgogKiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGZvciA8dmtleT4sIGRlcGVuZGluZyBvbiBrZXkgPHN0YXRlPiB1bmRlciBYCiAqCiAqLwppbmxpbmUgc3RhdGljIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBpbnQgdmtleSwgaW50IHN0YXRlLCBEV09SRCB0aW1lICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVt2a2V5XSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgdmtleSwga2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKCiAgICAgICAgLyogRmFrZSBrZXkgYmVpbmcgcHJlc3NlZCBpbnNpZGUgd2luZSAqLwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCAwLCBzdGF0ZT8gMCA6IEtFWUVWRU5URl9LRVlVUCwgdGltZSwgMCwgMCApOwoKICAgICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgJSMuMnhcbiIsa2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5bWFwTm90aWZ5CiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZC4KICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4KICovCnZvaWQgWDExRFJWX0tleW1hcE5vdGlmeSggSFdORCBod25kLCBYRXZlbnQgKmV2ZW50ICkKewogICAgaW50IGksIGosIGFsdCwgY29udHJvbCwgc2hpZnQ7CiAgICBEV09SRCB0aW1lID0gR2V0Q3VycmVudFRpbWUoKTsKCiAgICBhbHQgPSBjb250cm9sID0gc2hpZnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCFldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldKSBjb250aW51ZTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEoZXZlbnQtPnhrZXltYXAua2V5X3ZlY3RvcltpXSAmICgxPDxqKSkpIGNvbnRpbnVlOwogICAgICAgICAgICBzd2l0Y2goa2V5YzJ2a2V5WyhpICogOCkgKyBqXSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19NRU5VOiAgICBhbHQgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19DT05UUk9MOiBjb250cm9sID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6ICAgc2hpZnQgPSAxOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19NRU5VLCBhbHQsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19DT05UUk9MLCBjb250cm9sLCB0aW1lICk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggVktfU0hJRlQsIHNoaWZ0LCB0aW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBTdHJbMjRdOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAweCUwNHhcbiIsCgkJZXZlbnQtPnR5cGUsIGV2ZW50LT53aW5kb3csIGV2ZW50LT5zdGF0ZSwgZXZlbnQtPmtleWNvZGUpOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgaWYgKHhpYykKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICAvKiBJZ25vcmUgc29tZSB1bndhbnRlZCBldmVudHMgKi8KICAgIGlmICgoa2V5c3ltID49IFhLX0lTT19Mb2NrICYmIGtleXN5bSA8PSBYS19JU09fTGFzdF9Hcm91cF9Mb2NrKSB8fAogICAgICAgICBrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCiAgICB7CiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAgVFJBQ0UoIklnbm9yaW5nICVzIGtleWJvYXJkIGV2ZW50XG4iLCBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgVFJBQ0VfKGtleSkoInN0YXRlID0gJVggbmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIGV2ZW50LT5zdGF0ZSwgYXNjaWlfY2hhcnMsIHN0YXR1cyk7CgogICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgRVJSKCJCdWZmZXIgT3ZlcmZsb3cgbmVlZCAlaSFcbiIsYXNjaWlfY2hhcnMpOwoKICAgIGlmIChzdGF0dXMgPT0gWExvb2t1cENoYXJzKQogICAgewogICAgICAgIFgxMURSVl9YSU1Mb29rdXBDaGFycyggU3RyLCBhc2NpaV9jaGFycyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBJZiBYS0IgZXh0ZW5zaW9ucyBhcmUgdXNlZCwgdGhlIHN0YXRlIG1hc2sgZm9yIEFsdEdyIHdpbGwgdXNlIHRoZSBncm91cAogICAgICAgaW5kZXggaW5zdGVhZCBvZiB0aGUgbW9kaWZpZXIgbWFzay4gVGhlIGdyb3VwIGluZGV4IGlzIHNldCBpbiBiaXRzCiAgICAgICAxMy0xNCBvZiB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIFhLZXlFdmVudCBzdHJ1Y3R1cmUuIFNvIGlmIEFsdEdyIGlzCiAgICAgICBwcmVzc2VkLCBsb29rIGlmIHRoZSBncm91cCBpbmRleCBpcyBkaWZmZXJlbnQgdGhhbiAwLiBGcm9tIFhLQgogICAgICAgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb24sIHRoZSBncm91cCBpbmRleCBmb3IgQWx0R3Igc2hvdWxkIGJlIDIKICAgICAgIChldmVudC0+c3RhdGUgPSAweDIwMDApLiBJdCdzIHByb2JhYmx5IGJldHRlciB0byBub3QgYXNzdW1lIGEKICAgICAgIHByZWRlZmluZWQgZ3JvdXAgaW5kZXggYW5kIGZpbmQgaXQgZHluYW1pY2FsbHkKCiAgICAgICBSZWY6IFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBMaWJyYXJ5IHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTQuMS4xIGFuZCAxNy4xLjEpICovCiAgICAvKiBTYXZlIGFsc28gYWxsIHBvc3NpYmxlIG1vZGlmaWVyIHN0YXRlcy4gKi8KICAgIEFsdEdyTWFzayA9IGV2ZW50LT5zdGF0ZSAmICgweDYwMDAgfCBNb2QxTWFzayB8IE1vZDJNYXNrIHwgTW9kM01hc2sgfCBNb2Q0TWFzayB8IE1vZDVNYXNrKTsKCiAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNoYXIJKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAweCUwMnggLyAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKICAgIH0KCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KHhpYyxldmVudCk7CiAgICAvKiBYIHJldHVybnMga2V5Y29kZSAwIGZvciBjb21wb3NlZCBjaGFyYWN0ZXJzICovCiAgICBpZiAoIXZrZXkgJiYgYXNjaWlfY2hhcnMpIHZrZXkgPSBWS19OT05BTUU7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKICAgICAgICAgICAgICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKCiAgIGlmICh2a2V5KQogICB7CiAgICBzd2l0Y2ggKHZrZXkgJiAweGZmKQogICAgewogICAgY2FzZSBWS19OVU1MT0NLOgogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgZXZlbnQtPnR5cGUsIGV2ZW50X3RpbWUgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX0NBUElUQUw6CiAgICAgIFRSQUNFKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUsa2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLGtleV9zdGF0ZV90YWJsZVt2a2V5XSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKGtleV9zdGF0ZV90YWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQoJICB7CgkgICAgVFJBQ0UoIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVByZXNzLCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVJlbGVhc2UsIGV2ZW50X3RpbWUgKTsKCSAgfQogICAgICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spKQoJICB7CiAgICAgICAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UHJlc3MsIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UmVsZWFzZSwgZXZlbnRfdGltZSApOwoJICB9CgkvKiBOb3QgTnVtIG5vciBDYXBzIDogZW5kIG9mIGludGVybWVkaWFyeSBzdGF0ZXMgZm9yIGJvdGguICovCglOdW1TdGF0ZSA9IEZBTFNFOwoJQ2Fwc1N0YXRlID0gRkFMU0U7CgoJYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKCVRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCglkd0ZsYWdzID0gMDsKCWlmICggZXZlbnQtPnR5cGUgPT0gS2V5UmVsZWFzZSApIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCB2a2V5ICYgMHgxMDAgKSAgICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CgogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUsIDAsIDAgKTsKICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dAogKgogKiBDYWxsZWQgZnJvbSBYMTFEUlZfSW5pdEtleWJvYXJkCiAqICBUaGlzIHJvdXRpbmUgd2Fsa3MgdGhyb3VnaCB0aGUgZGVmaW5lZCBrZXlib2FyZCBsYXlvdXRzIGFuZCBzZWxlY3RzCiAqICB3aGljaGV2ZXIgbWF0Y2hlcyBtb3N0IGNsb3NlbHkuCiAqIFgxMSBsb2NrIG11c3QgYmUgaGVsZC4KICovCnN0YXRpYyB2b2lkClgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQgKHZvaWQpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bTsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbNF0gPQogIHswLCAwLCAwLCAwfTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KICBmb3IgKGN1cnJlbnQgPSAwOyBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudDsgY3VycmVudCsrKSB7CiAgICBUUkFDRSgiQXR0ZW1wdGluZyB0byBtYXRjaCBhZ2FpbnN0IFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQpOwogICAgbWF0Y2ggPSAwOwogICAgbWlzbWF0Y2ggPSAwOwogICAgc2NvcmUgPSAwOwogICAgc2VxID0gMDsKICAgIGxrZXkgPSBtYWluX2tleV90YWJbY3VycmVudF0ua2V5OwogICAgcGtleSA9IC0xOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMDApICYmIChrZXlzeW0gIT0gJyAnKSkKICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICVsZFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNrZXlbMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlbaV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKICAgICAgICAgIC8qIHByaW50IHNwYWNlcyBpbnN0ZWFkIG9mIFwwJ3MgKi8KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2tleSk7IGkrKykgaWYgKCFja2V5W2ldKSBja2V5W2ldID0gJyAnOwogICAgICAgICAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXlzeW0gMHglMDRsWCwga2V5Y29kZSAlZCwgZ290ICVjJWMlYyVjXG4iLAogICAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrZXljLCBja2V5WzBdLCBja2V5WzFdLCBja2V5WzJdLCBja2V5WzNdKTsKCSAgbWlzbWF0Y2grKzsKCSAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKQogICAgV0FSTigiVXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuL3ZpcnR1YWwgY29kZXMgbWFwcGluZy5cbiIsCiAgICAgICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0luaXRLZXlib2FyZAogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKHZvaWQpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgS2V5U3ltICprc3A7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXksIE9FTXZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWERpc3BsYXlLZXljb2RlcyhkaXNwbGF5LCAmbWluX2tleWNvZGUsICZtYXhfa2V5Y29kZSk7CiAgICBrc3AgPSBYR2V0S2V5Ym9hcmRNYXBwaW5nKGRpc3BsYXksIG1pbl9rZXljb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOwogICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXlzeW1zX3Blcl9rZXljb2RlLgogICAgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBob2xkIGEgbG9jYWwgY29weSBvZiB0aGUga2V5c3ltcyB0YWJsZSAqLwogICAgWEZyZWUoa3NwKTsKCiAgICBtbXAgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwogICAga2NwID0gbW1wLT5tb2RpZmllcm1hcDsKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgIHsKICAgICAgICBpbnQgajsKCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwoKCQlmb3IgKGsgPSAwOyBrIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgayArPSAxKQogICAgICAgICAgICAgICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgT0VNdmtleSA9IFZLX09FTV84OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGNoYXIgYnVmWzMwXTsKICAgICAgICBpbnQgaGF2ZV9jaGFyczsKCiAgICAgICAga2V5c3ltID0gMDsKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBoYXZlX2NoYXJzID0gWExvb2t1cFN0cmluZygmZTIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgc2NhbiA9IG5vbmNoYXJfa2V5X3NjYW5ba2V5c3ltICYgMHhmZl07CgkJLyogc2V0IGV4dGVuZGVkIGJpdCB3aGVuIG5lY2Vzc2FyeSAqLwoJCWlmIChzY2FuICYgMHgxMDApIHZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5c3ltID09IDB4MjApIHsgICAgICAgICAgICAgICAgIC8qIFNwYWNlYmFyICovCgkgICAgICAgIHZrZXkgPSBWS19TUEFDRTsKCQlzY2FuID0gMHgzOTsKCSAgICB9IGVsc2UgaWYgKGhhdmVfY2hhcnMpIHsKCSAgICAgIC8qIHdlIHNlZW0gdG8gbmVlZCB0byBzZWFyY2ggdGhlIGxheW91dC1kZXBlbmRlbnQgc2NhbmNvZGVzICovCgkgICAgICBpbnQgbWF4bGVuPTAsbWF4dmFsPS0xLG9rOwoJICAgICAgZm9yIChpPTA7IGk8c3ltczsgaSsrKSB7CgkJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMDApICYmIChrZXlzeW0hPScgJykpCiAgICAgICAgICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIH0KCQl9IGVsc2UgewoJCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCQl9CgkgICAgICB9CgkgICAgICAvKiBmaW5kIGtleSB3aXRoIGxvbmdlc3QgbWF0Y2ggc3RyZWFrICovCgkgICAgICBmb3IgKGtleW49MDsga2V5bjxNQUlOX0xFTjsga2V5bisrKSB7CgkJZm9yIChvaz0oKmxrZXkpW2tleW5dW2k9MF07IG9rJiYoaTw0KTsgaSsrKQoJCSAgaWYgKCgqbGtleSlba2V5bl1baV0gJiYgKCpsa2V5KVtrZXluXVtpXSE9Y2tleVtpXSkgb2s9MDsKCQlpZiAob2t8fChpPm1heGxlbikpIHsKCQkgIG1heGxlbj1pOyBtYXh2YWw9a2V5bjsKCQl9CgkJaWYgKG9rKSBicmVhazsKCSAgICAgIH0KCSAgICAgIGlmIChtYXh2YWw+PTApIHsKCQkvKiBnb3QgaXQgKi8KCQljb25zdCBXT1JEICgqbHNjYW4pW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5zY2FuOwoJCWNvbnN0IFdPUkQgKCpsdmtleSlbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnZrZXk7CgkJc2NhbiA9ICgqbHNjYW4pW21heHZhbF07CgkJdmtleSA9ICgqbHZrZXkpW21heHZhbF07CgkgICAgICB9CgkgICAgfQojaWYgMCAvKiB0aGlzIGJyZWFrcyBWS19PRU1feCBWS2V5cyBpbiBzb21lIGxheW91dCB0YWJsZXMgYnkgaW5zZXJ0aW5nCiAgICAgICAqIGEgVksgY29kZSBpbnRvIGEgbm90IGFwcHJvcHJpYXRlIHBsYWNlLgogICAgICAgKi8KICAgICAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwoJICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFZLXzAgJiYga2V5c3ltIDw9IFZLXzkpCiAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKSkgewoJCSAgICB2a2V5ID0ga2V5c3ltOwoJCX0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKCQlzd2l0Y2ggKGtleXN5bSkKCQl7CgkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CgkJY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMjsgYnJlYWs7CgkJY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMzsgYnJlYWs7CgkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CgkJY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNTsgYnJlYWs7CgkJY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNjsgYnJlYWs7CgkJY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CgkJY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fQ09NTUE7IGJyZWFrOwoJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CgkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOwoJCWNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BMVVM7IGJyZWFrOwoJCX0KCSAgICB9CgogICAgICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCsrT0VNdmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBXQVJOKCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OwoKICAgICAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIJKmtzbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQoJCQkgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICB9CiAgICAgICAgVFJBQ0UoImtleWNvZGUgJTA0eCA9PiB2a2V5ICUwNHhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgIH0gLyogZm9yICovCgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICUwMnggKCVzKVxuIixzY2FuLGtleWMsa3NuYW1lKTsKCWtleWMyc2NhbltrZXljXT1zY2FuKys7CiAgICAgIH0KCiAgICAvKiBOb3cgc3RvcmUgb25lIGtleWNvZGUgZm9yIGVhY2ggbW9kaWZpZXIuIFVzZWQgdG8gc2ltdWxhdGUga2V5cHJlc3Nlcy4gKi8KICAgIGtjQ29udHJvbCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKICAgIGtjQWx0ID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19BbHRfTCk7CiAgICBpZiAoIWtjQWx0KSBrY0FsdCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfTWV0YV9MKTsKICAgIGtjU2hpZnQgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX1NoaWZ0X0wpOwogICAga2NOdW1Mb2NrID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19OdW1fTG9jayk7CiAgICBrY0NhcHNMb2NrID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19DYXBzX0xvY2spOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRBc3luY0tleVN0YXRlIChYMTFEUlYuQCkKICovClNIT1JUIFgxMURSVl9HZXRBc3luY0tleVN0YXRlKElOVCBrZXkpCnsKICAgIFNIT1JUIHJldHZhbCA9ICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDQwKSA/IDB4MDAwMSA6IDApIHwKICAgICAgICAgICAgICAgICAgICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDgwKSA/IDB4ODAwMCA6IDApOwogICAga2V5X3N0YXRlX3RhYmxlW2tleV0gJj0gfjB4NDA7CiAgICBUUkFDRV8oa2V5KSgiKCV4KSAtPiAleFxuIiwga2V5LCByZXR2YWwpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXRMaXN0IChYMTFEUlYuQCkKICovClVJTlQgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TGlzdChJTlQgc2l6ZSwgSEtMICpoa2wpCnsKICAgIElOVCBpOwoKICAgIFRSQUNFKCIlZCwgJXBcbiIsIHNpemUsIGhrbCk7CgogICAgaWYgKCFzaXplKQogICAgewogICAgICAgIHNpemUgPSA0MDk2OyAvKiBob3BlIHdlIHdpbGwgbmV2ZXIgaGF2ZSB0aGF0IG1hbnkgKi8KICAgICAgICBoa2wgPSBOVUxMOwogICAgfQoKICAgIGZvciAoaSA9IDA7IG1haW5fa2V5X3RhYltpXS5jb21tZW50ICYmIChpIDwgc2l6ZSk7IGkrKykKICAgIHsKICAgICAgICBpZiAoaGtsKQogICAgICAgIHsKICAgICAgICAgICAgVUxPTkdfUFRSIGxheW91dCA9IG1haW5fa2V5X3RhYltpXS5sY2lkOwogICAgICAgICAgICBMQU5HSUQgbGFuZ2lkOwoKICAgICAgICAgICAgLyogc2VlIGNvbW1lbnQgZm9yIEdldEtleWJvYXJkTGF5b3V0ICovCiAgICAgICAgICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICAgICAgICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICAgICAgICAgIGxheW91dCB8PSAweGUwMDEgPDwgMTY7IC8qIEZJWE1FICovCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgICAgICAgICBoa2xbaV0gPSAoSEtMKWxheW91dDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9HZXRLZXlib2FyZExheW91dChEV09SRCBkd1RocmVhZGlkKQp7CiAgICBVTE9OR19QVFIgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBpZiAoZHdUaHJlYWRpZCAmJiBkd1RocmVhZGlkICE9IEdldEN1cnJlbnRUaHJlYWRJZCgpKQogICAgICAgIEZJWE1FKCJjb3VsZG4ndCByZXR1cm4ga2V5Ym9hcmQgbGF5b3V0IGZvciB0aHJlYWQgJTA0bHhcbiIsIGR3VGhyZWFkaWQpOwoKI2lmIDAKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwojZWxzZQogICAgLyogRklYTUU6CiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKI2VuZGlmCiAgICAvKiAKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogRklYTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywnbCcsJ3gnLDB9OwogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgc3ByaW50ZlcobmFtZSwgZm9ybWF0VywgbGF5b3V0KTsKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cobmFtZSkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcCwgJTA0eDogc3R1YiFcbiIsIGhrbCwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKCZldmVudC0+eG1hcHBpbmcpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaSwgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIC8qIEZJWE1FOiB3aGF0IGhhcHBlbnMgaWYgd0NoYXIgaXMgbm90IGEgTGF0aW4xIGNoYXJhY3RlciBhbmQgQ1BfVU5JWENQCiAgICAgKiBpcyBVVEYtOCAobXVsdGlieXRlIGVuY29kaW5nKT8KICAgICAqLwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFKCInJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4ICglZClcbiIsCiAgICAgICAgICAgIGNDaGFyLCBrZXlzeW0sIGtleXN5bSwga2V5Y29kZSwga2V5Y29kZSk7CgogICAgLyoga2V5Y29kZSAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCiAgICByZXQgPSBrZXljMnZrZXlba2V5Y29kZV07CgogICAgaWYgKCFrZXljb2RlIHx8ICFyZXQpCiAgICB7CiAgICAgICAgVFJBQ0UoImtleWNvZGUgZm9yICclYycgbm90IGZvdW5kLCByZXR1cm5pbmcgLTFcbiIsIGNDaGFyKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW5kZXggPSAtMTsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwogICAgewogICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGkpID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBzd2l0Y2ggKGluZGV4KQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIiwga2V5c3ltKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgIGNhc2UgMTogcmV0ICs9IDB4MDEwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiByZXQgKz0gMHgwNjAwOyBicmVhazsKICAgICAgICBjYXNlIDM6IHJldCArPSAweDA3MDA7IGJyZWFrOwogICAgfQogICAgLyoKICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAogICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCiAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQogICAgICovCgogICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5RXggKFgxMURSVi5AKQogKi8KVUlOVCBYMTFEUlZfTWFwVmlydHVhbEtleUV4KFVJTlQgd0NvZGUsIFVJTlQgd01hcFR5cGUsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoaGtsICE9IFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgoJc3dpdGNoKHdNYXBUeXBlKSB7CgkJY2FzZSAwOgl7IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCQkJcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMTogeyAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCgkJCS8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQoJCQkJCXJldHVybk1WSyAoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gdmtleS1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDI6IHsgLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Ugc3RpbGwgZG9uJ3Qga25vdyB3aGF0ICJ1bnNoaWZ0ZWQiIG1lYW5zLiBpbiB3aW5kb3dzIFZLX1cgKDB4NTcpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybnMgMHg1Nywgd2hpY2ggaXMgdXBlcmNhc2UgJ1cnLiBTbyB3ZSBoYXZlIHRvIHJldHVybiB0aGUgdXBwZXJjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGtleS4uIExvb2tzIGxpa2Ugc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIE1TIGRvY3M/CiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgb25seSB0cnVlIGZvciBsZXR0ZXJzLCBmb3IgZXhhbXBsZSBWS18wIHJldHVybnMgJzAnIG5vdCAnKScuCiAgICAgICAgICAgICAgICAgICAgICAgICAqIC0gaGVuY2Ugd2UgdXNlIHRoZSBsb2NrIG1hc2sgdG8gZW5zdXJlIHRoaXMgaGFwcGVucy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiAoWExvb2t1cFN0cmluZykgYW5zaSBjaGFyICovCgkJCVhLZXlFdmVudCBlOwoJCQlLZXlTeW0ga2V5c3ltOwoJCQlpbnQga2V5YzsKCQkJY2hhciBzWzJdOwoJCQllLmRpc3BsYXkgPSBkaXNwbGF5OwoKCQkJZS5zdGF0ZSA9IExvY2tNYXNrOwoJCQkvKiBMb2NrTWFzayBzaG91bGQgYmVoYXZlIGV4YWN0bHkgbGlrZSBjYXBzIGxvY2sgLSB1cGVyY2FzZQoJCQkgKiB0aGUgbGV0dGVyIGtleXMgYW5kIHRoYXRzIGFib3V0IGl0LiAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgoJCQllLmtleWNvZGUgPSAwOwoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KDAsJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKCQkJaWYgKFhMb29rdXBTdHJpbmcoJmUsIHMsIDIsICZrZXlzeW0sIE5VTEwpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTVZLICgqcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQlyZXR1cm4gMDsKCQkJfQoKCQljYXNlIDM6ICAgLyogKipOVCBvbmx5Kiogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSBidXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAgKi8KICAgICAgICAgICAgICAJCSAgLyogICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgICovCgkJICAgICAgICAgIEZJWE1FKCIgc3R1YiBmb3IgTlRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwoKCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlXQVJOKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIC8qIEZJWE1FOiBzaG91bGQgdXNlIE1WSyB0eXBlIDMgKE5UIHZlcnNpb24gdGhhdCBkaXN0aW5ndWlzaGVzIHJpZ2h0IGFuZCBsZWZ0ICovCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoc2NhbkNvZGUsIDEsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgodmtleSwgMiwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKICBUUkFDRSgic2NhbiAweCUwNHgsIHZrZXkgMHglMDR4LCBBTlNJIDB4JTA0eFxuIiwgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmICgoblNpemUgPj0gMikgJiYgbHBCdWZmZXIpCgl7CiAgICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyVygoV0NIQVIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIGZvciAoa2V5aT1taW5fa2V5Y29kZTsga2V5aTw9bWF4X2tleWNvZGU7IGtleWkrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5aV0pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5aSA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICBrZXljID0gKEtleUNvZGUpIGtleWk7CiAgICAgIGtleXMgPSBYS2V5Y29kZVRvS2V5c3ltKHRocmVhZF9kaXNwbGF5KCksIGtleWMsIDApOwogICAgICBuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXMpOwogICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JTA0eCBrZXlzeW09JTA0eCBzdHJpbmc9JXNcbiIsCiAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCAoaW50KWtleXMsIG5hbWUpOwogICAgICBpZiAobHBCdWZmZXIgJiYgblNpemUgJiYgbmFtZSkKICAgICAgewogICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIG5hbWUsIC0xLCBscEJ1ZmZlciwgblNpemUpOwogICAgICAgICAgbHBCdWZmZXJbblNpemUgLSAxXSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgfQogIH0KCiAgLyogRmluYWxseSBpc3N1ZSBGSVhNRSBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgRklYTUUoIiglMDhseCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDR4LCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgaWYgKGxwQnVmZmVyICYmIG5TaXplKQogICAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlRXggKFgxMURSVi5AKQogKgogKiBUaGUgVG9Vbmljb2RlIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsLWtleSBjb2RlIGFuZCBrZXlib2FyZAogKiBzdGF0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBXaW5kb3dzIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzLgogKgogKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBhIGRlYWQga2V5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiBPdGhlcndpc2UsCiAqIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogVmFsdWUJTWVhbmluZwogKiAwCVRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgaGFzIG5vIHRyYW5zbGF0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQuCiAqIDEJT25lIFdpbmRvd3MgY2hhcmFjdGVyIHdhcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KICogMglUd28gY2hhcmFjdGVycyB3ZXJlIGNvcGllZCB0byB0aGUgYnVmZmVyLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEKICogICAgICBkZWFkLWtleSBjaGFyYWN0ZXIgKGFjY2VudCBvciBkaWFjcml0aWMpIHN0b3JlZCBpbiB0aGUga2V5Ym9hcmQgbGF5b3V0IGNhbm5vdAogKiAgICAgIGJlIGNvbXBvc2VkIHdpdGggdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSB0byBmb3JtIGEgc2luZ2xlIGNoYXJhY3Rlci4KICoKICogRklYTUUgOiBzaG91bGQgZG8gdGhlIGFib3ZlIChyZXR1cm4gMiBmb3Igbm9uIG1hdGNoaW5nIGRlYWRjaGFyK2NoYXIgY29tYmluYXRpb25zKQogKgogKi8KSU5UIFgxMURSVl9Ub1VuaWNvZGVFeChVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIExQQllURSBscEtleVN0YXRlLAoJCSAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgWEtleUV2ZW50IGU7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKICAgIGNoYXIgbHBDaGFyWzEwXTsKICAgIEhXTkQgZm9jdXM7CiAgICBYSUMgeGljOwogICAgU3RhdHVzIHN0YXR1czsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChoa2wgIT0gWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAweCUwNHhcbiIsCgkJZS50eXBlLCBlLndpbmRvdywgZS5zdGF0ZSwgZS5rZXljb2RlKTsKCiAgICBpZiAoeGljKQogICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHNpemVvZihscENoYXIpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIHNpemVvZihscENoYXIpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgaWYgKHJldCA9PSAwKQogICAgewoJY2hhciBkZWFkX2NoYXI7CgojaWZkZWYgWEtfRXVyb1NpZ24KICAgICAgICAvKiBBbiB1Z2x5IGhhY2sgZm9yIEV1cm9TaWduOiBYIGNhbid0IHRyYW5zbGF0ZSBpdCB0byBhIGNoYXJhY3RlcgogICAgICAgICAgIGZvciBzb21lIGxvY2FsZXMuICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19FdXJvU2lnbikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDIwQUM7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IFggdHVybnMgc2hpZnQtdGFiIGludG8gSVNPX0xlZnRfVGFiLiAqLwogICAgICAgIC8qIEhlcmUgd2UgY2hhbmdlIGl0IGJhY2suICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19JU09fTGVmdF9UYWIpCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgwOTsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKCSAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CgkgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjaGFyCSprc25hbWU7CgogICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJRVJSKCJQbGVhc2UgcmVwb3J0OiBubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lKTsKCQlFUlIoIih2aXJ0S2V5PSVYLHNjYW5Db2RlPSVYLGtleWNvZGU9JVgsc3RhdGU9JVgpXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0EnKSkgfHwKICAgICAgICAgICAgICAgICgoa2V5c3ltID4gJ1onKSAmJiAoa2V5c3ltIDwgJ2EnKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBXZSBoYXZlIGFub3RoZXIgc3BlY2lhbCBjYXNlIGZvciBkZWxldGUga2V5IChYS19EZWxldGUpIG9uIGFuCiAgICAgICAgIGV4dGVuZGVkIGtleWJvYXJkLiBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndCAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRGVsZXRlKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgllbHNlIGlmKChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX0tQX0RlY2ltYWwpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IHRvIHVuaWNvZGVcbiIsICooQllURSAqKWxwQ2hhcik7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIGxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKZm91bmQ6CiAgICBUUkFDRV8oa2V5KSgiVG9Vbmljb2RlIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXggJXNcbiIsCgkJcmV0LCAocmV0ICYmIGJ1ZlcpID8gYnVmV1swXSA6IDAsIGJ1ZlcgPyAiIiA6ICIobm8gYnVmZmVyKSIpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgWDExRFJWX0JlZXAodm9pZCkKewogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYQmVsbCh0aHJlYWRfZGlzcGxheSgpLCAwKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0K