J3VzZSBzdHJpY3QnOwovKioKICogQ2xpZW50IFRpbWVUb25pYyBBUEkgcG91ciBXYXkgdG8gR3Jl ZW4g4oCUIHY1LjAKICogU291cmNlIHByaW5jaXBhbGUgOiBDQVRfQUNDRVMgKFBvcnRhaWwgQ2xp ZW50KSDigJQgMSBsaWduZS9jbGllbnQKICogQ29udGllbnQgY29udHJhdHMsIGxpZW5zIGZhY3R1 cmVzLCBldCBQREZzIGRpcmVjdHMuCiAqLwpjb25zdCBmZXRjaCA9IHJlcXVpcmUoJ25vZGUtZmV0 Y2gnKTsKY29uc3QgeyBVUkxTZWFyY2hQYXJhbXMgfSA9IHJlcXVpcmUoJ3VybCcpOwoKY29uc3Qg VFRfQVBJICA9ICdodHRwczovL3RpbWV0b25pYy5jb20vbGl2ZS9hcGkucGhwJzsKY29uc3QgVFRf T19VICA9IHByb2Nlc3MuZW52LlRUX09fVSAgfHwgJ3dheXRvZ3JlZW4nOwpjb25zdCBUVF9MT0dJ TiA9IHByb2Nlc3MuZW52LlRUX0xPR0lOOwpjb25zdCBUVF9QV0QgICA9IHByb2Nlc3MuZW52LlRU X1BXRDsKCi8vIOKUgOKUgCBJRHMgdGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBDQVRfQUNDRVMg PSA2NTE2ODc7ICAvLyBQb3J0YWlsIENsaWVudCAoMSBsaWduZS9jbGllbnQpCmNvbnN0IENBVF9G QUNUICA9IDQ0MjMwMjsgIC8vIEZhY3R1cmVzIGNsaWVudHMKY29uc3QgRkFDVF9UQUIgID0gNDkz NjgxOyAgLy8gVGFiIElEIHBvdXIgQ0FUX0ZBQ1QKCi8vIOKUgOKUgCBDaGFtcHMgQ0FUX0FDQ0VT IChkw6ljb3V2ZXJ0cyB2aWEgL2FwaS9kZWJ1Zy9hY2Nlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IEFDQ0VTX1JT ICAgICAgICAgID0gODczMzk5MTsgIC8vIFJhaXNvbiBTb2NpYWxlIGNsaWVudCAobGluayt0ZXh0 KQpjb25zdCBBQ0NFU19GX0NPTlRSQVQgICA9IDg3MzM5OTQ7ICAvLyBQREYocykgQ29udHJhdCAo bWVkaWFzIGRpcmVjdHMpCmNvbnN0IEFDQ0VTX0ZfUFYgICAgICAgID0gODczMzk5NTsgIC8vIFBE RihzKSBQViBpbnN0YWxsYXRpb24gKG1lZGlhcykKY29uc3QgQUNDRVNfRl9QVjIgICAgICAgPSA4 NzMzOTk2OyAgLy8gUERGKHMpIFBWIHN1cHBsw6ltZW50YWlyZXMKY29uc3QgQUNDRVNfRl9QVjMg ICAgICAgPSA4NzMzOTk3OyAgLy8gUERGKHMpIFBWIHN1cHBsw6ltZW50YWlyZXMKY29uc3QgQUND RVNfRl9QVjQgICAgICAgPSA4NzMzOTk5OyAgLy8gUERGKHMpIFBWIHN1cHBsw6ltZW50YWlyZXMK Y29uc3QgQUNDRVNfRl9GQUNUVVJFUyAgPSA4NzM0MTUzOyAgLy8gTGllbnMg4oaSIDQ0IHJvd3Mg RmFjdHVyZXMgKGxpbmtlZFJvd0lkcykKY29uc3QgQUNDRVNfRl9GQUNUX1BERlMgPSA4NzM0MTYw OyAgLy8gUERGcyBmYWN0dXJlcyAoNDUgbWVkaWFzIGRpcmVjdHMpCgovLyDilIDilIAgQ2hhbXBz IEZhY3R1cmVzIENBVF9GQUNUIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBGQUNU X1JFRiAgICAgICA9IDU4NTM4ODM7CmNvbnN0IEZBQ1RfUlMgICAgICAgID0gNTg1NTkwMTsKY29u c3QgRkFDVF9ERU5PTSAgICAgPSA1ODU3NTg5Owpjb25zdCBGQUNUX0NBVCAgICAgICA9IDU4NTM4 NjU7CmNvbnN0IEZBQ1RfVFlQRSAgICAgID0gNTg1Mzg2NjsKY29uc3QgRkFDVF9EQVRFX0VNSSAg PSA1ODUzNzI5Owpjb25zdCBGQUNUX0RBVEVfRUNIICA9IDU4NTM5MDY7CmNvbnN0IEZBQ1RfTU9E RV9QQUlFID0gNTg1MzkwNzsKY29uc3QgRkFDVF9NT05UX0hUICAgPSA1ODU5MTM4Owpjb25zdCBG QUNUX1RWQSAgICAgICA9IDU4NTY5NzI7CmNvbnN0IEZBQ1RfTU9OVF9UVEMgID0gNTg1NzAxMTsK Y29uc3QgRkFDVF9SRUdMRSAgICAgPSA1ODUzNzQ1Owpjb25zdCBGQUNUX1BERiAgICAgICA9IDU4 NTM3MzE7CgovLyDilIDilIAgQ2FjaGUgMTAgbWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBjYWNoZSA9IG5ldyBNYXAo KTsKY29uc3QgQ0FDSEVfTVMgPSAxMCAqIDYwICogMTAwMDsKCi8vIOKUgOKUgCBTZXNza2V5IOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgApsZXQgX3Nlc3NrZXkgPSBudWxsLCBfc2Vzc2tleVRpbWUgPSAwOwpj b25zdCBTRVNTS0VZX1RUTCA9IDIgKiAzNjAwICogMTAwMDsKCmFzeW5jIGZ1bmN0aW9uIF9wb3N0 KHBhcmFtcykgewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFRUX0FQSSwgewogICAgbWV0aG9k OiAnUE9TVCcsCiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13 d3ctZm9ybS11cmxlbmNvZGVkJywgJ1VzZXItQWdlbnQnOiAnV2F5VG9HcmVlbi1Qb3J0YWlsLzUu MCcgfSwKICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpLAog IH0pOwogIHJldHVybiByZXMuanNvbigpOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRTZXNza2V5KCkg ewogIGlmIChfc2Vzc2tleSAmJiBEYXRlLm5vdygpIC0gX3Nlc3NrZXlUaW1lIDwgU0VTU0tFWV9U VEwpIHJldHVybiBfc2Vzc2tleTsKICBpZiAoIVRUX0xPR0lOIHx8ICFUVF9QV0QpIHRocm93IG5l dyBFcnJvcignVFRfTE9HSU4vVFRfUFdEIG1hbnF1YW50cycpOwogIGNvbnN0IGQxID0gYXdhaXQg X3Bvc3QoeyByZXE6ICdjcmVhdGVBcHBrZXknLCBhcHBuYW1lOiAncG9ydGFpbC13dGctdjUnIH0p OwogIGlmICghZDEuYXBwa2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZUFwcGtleTogJyArIEpT T04uc3RyaW5naWZ5KGQxKSk7CiAgY29uc3QgZDIgPSBhd2FpdCBfcG9zdCh7IHJlcTogJ2NyZWF0 ZU9hdXRoa2V5JywgbG9naW46IFRUX0xPR0lOLCBwd2Q6IFRUX1BXRCwgYXBwa2V5OiBkMS5hcHBr ZXkgfSk7CiAgaWYgKCFkMi5vYXV0aGtleSkgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVPYXV0aGtl eTogJyArIEpTT04uc3RyaW5naWZ5KGQyKSk7CiAgY29uc3QgZDMgPSBhd2FpdCBfcG9zdCh7IHJl cTogJ2NyZWF0ZVNlc3NrZXknLCBvX3U6IFRUX09fVSwgdV9jOiBUVF9PX1UsIG9hdXRoa2V5OiBk Mi5vYXV0aGtleSwgYXBwa2V5OiBkMS5hcHBrZXksIHJlc3RyaWN0aW9uczogJ3t9JyB9KTsKICBp ZiAoIWQzLnNlc3NrZXkpIHRocm93IG5ldyBFcnJvcignY3JlYXRlU2Vzc2tleTogJyArIEpTT04u c3RyaW5naWZ5KGQzKSk7CiAgX3Nlc3NrZXkgPSBkMy5zZXNza2V5OyBfc2Vzc2tleVRpbWUgPSBE YXRlLm5vdygpOwogIHJldHVybiBfc2Vzc2tleTsKfQoKYXN5bmMgZnVuY3Rpb24gYXBpQ2FsbChw YXJhbXMsIHJldHJ5ID0gdHJ1ZSkgewogIGlmICghX3Nlc3NrZXkpIGF3YWl0IGdldFNlc3NrZXko KTsKICBjb25zdCBkYXRhID0gYXdhaXQgX3Bvc3QoeyBvX3U6IFRUX09fVSwgdV9jOiBUVF9PX1Us IHNlc3NrZXk6IF9zZXNza2V5LCAuLi5wYXJhbXMgfSk7CiAgaWYgKGRhdGEgJiYgKGRhdGEuZXJy b3JDb2RlID09PSAnaW52YWxpZFNlc3Npb24nIHx8IChkYXRhLnN0YXR1cyA9PT0gJ25vaycgJiYg ZGF0YS5lcnJvck1zZyAmJiBkYXRhLmVycm9yTXNnLmluY2x1ZGVzKCdzZXNzaW9uJykpKSkgewog ICAgaWYgKHJldHJ5KSB7IF9zZXNza2V5ID0gbnVsbDsgX3Nlc3NrZXlUaW1lID0gMDsgYXdhaXQg Z2V0U2Vzc2tleSgpOyByZXR1cm4gYXBpQ2FsbChwYXJhbXMsIGZhbHNlKTsgfQogICAgdGhyb3cg bmV3IEVycm9yKCdBUEkgbm9rOiAnICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpOwogIH0KICByZXR1 cm4gZGF0YTsKfQoKLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jdGlv biBmVmFsKHJvdywgZmlkKSB7CiAgY29uc3QgdiA9IChyb3cudmFsdWVzIHx8IFtdKS5maW5kKHgg PT4gTnVtYmVyKHguZmllbGRJZCkgPT09IGZpZCk7CiAgcmV0dXJuIHYgPyAodi50ZXh0VmFsdWUg Pz8gbnVsbCkgOiBudWxsOwp9CgpmdW5jdGlvbiBhbGxNZWRpYXMocm93LCBmaWQpIHsKICBjb25z dCB2ID0gKHJvdy52YWx1ZXMgfHwgW10pLmZpbmQoeCA9PiBOdW1iZXIoeC5maWVsZElkKSA9PT0g ZmlkKTsKICBpZiAoIXYgfHwgIUFycmF5LmlzQXJyYXkodi5tZWRpYXMpKSByZXR1cm4gW107CiAg cmV0dXJuIHYubWVkaWFzOwp9CgpmdW5jdGlvbiBsaW5rZWRJZHMocm93LCBmaWQpIHsKICBjb25z dCB2ID0gKHJvdy52YWx1ZXMgfHwgW10pLmZpbmQoeCA9PiBOdW1iZXIoeC5maWVsZElkKSA9PT0g ZmlkKTsKICBpZiAoIXYpIHJldHVybiBbXTsKICBpZiAodi5saW5rZWRSb3dJZHMpIHJldHVybiBT dHJpbmcodi5saW5rZWRSb3dJZHMpLnNwbGl0KCcsJykubWFwKE51bWJlcikuZmlsdGVyKEJvb2xl YW4pOwogIGlmIChBcnJheS5pc0FycmF5KHYubGlua2VkUm93VmFsdWVzKSkgcmV0dXJuIHYubGlu a2VkUm93VmFsdWVzLm1hcCh4ID0+IE51bWJlcih4LnJvd0lkIHx8IHguaWQpKS5maWx0ZXIoQm9v bGVhbik7CiAgcmV0dXJuIFtdOwp9CgpmdW5jdGlvbiBwZGZVcmwocm93LCBmaWQpIHsKICBjb25z dCBtcyA9IGFsbE1lZGlhcyhyb3csIGZpZCk7CiAgcmV0dXJuIG1zLmxlbmd0aCA/IChtc1swXS5w b3N0RnVsbFVybFN0cmluZyB8fCBtc1swXS51cmwgfHwgbnVsbCkgOiBudWxsOwp9CgovKiogTm9y bWFsaXNlIG4naW1wb3J0ZSBxdWVsIGZvcm1hdCBkYXRlIOKGkiBERC9NTS9ZWVlZICovCmZ1bmN0 aW9uIGZtdERhdGUocykgewogIGlmICghcykgcmV0dXJuICcnOwogIGNvbnN0IGlzbyA9IHMubWF0 Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pOwogIGlmIChpc28pIHJldHVybiBpc29bM10g KyAnLycgKyBpc29bMl0gKyAnLycgKyBpc29bMV07CiAgaWYgKC9eXGR7Mn1cL1xkezJ9XC9cZHs0 fS8udGVzdChzKSkgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIDEwKTsKICBpZiAoL15cZHsxMCwxM30k Ly50ZXN0KHMpKSB7CiAgICBjb25zdCBkID0gbmV3IERhdGUocy5sZW5ndGggPT09IDEwID8gTnVt YmVyKHMpICogMTAwMCA6IE51bWJlcihzKSk7CiAgICBpZiAoIWlzTmFOKGQpKSByZXR1cm4gZC50 b0xvY2FsZURhdGVTdHJpbmcoJ2ZyLUZSJyk7CiAgfQogIHJldHVybiBzOwp9CgovLyDilIDilIAg TGVjdHVyZSBDQVRfQUNDRVMgKGNhY2hlIDEwIG1pbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphc3luYyBmdW5jdGlvbiBnZXRBbGxBY2Nl c1Jvd3MoKSB7CiAgY29uc3QgaGl0ID0gY2FjaGUuZ2V0KCdhY2NlcycpOwogIGlmIChoaXQgJiYg RGF0ZS5ub3coKSAtIGhpdC50cyA8IENBQ0hFX01TKSByZXR1cm4gaGl0LmRhdGE7CiAgY29uc3Qg ZCA9IGF3YWl0IGFwaUNhbGwoeyByZXE6ICdnZXRUYWJsZVJvd3MnLCB2ZXJzaW9uOiAnNi40OW8v Ni40OScsIGNhdElkOiBDQVRfQUNDRVMsIG1heFJvd3M6IDIwMCwgc3RhcnRSb3c6IDAgfSk7CiAg Y29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkoZC50YWJsZVJvd3MpID8gZC50YWJsZVJvd3MgOiBb XTsKICBjYWNoZS5zZXQoJ2FjY2VzJywgeyB0czogRGF0ZS5ub3coKSwgZGF0YTogcm93cyB9KTsK ICByZXR1cm4gcm93czsKfQoKZnVuY3Rpb24gZmluZENsaWVudFJvdyhyb3dzLCByYWlzb25Tb2Np YWxlKSB7CiAgY29uc3QgcnMgPSByYWlzb25Tb2NpYWxlLnRvTG93ZXJDYXNlKCk7CiAgcmV0dXJu IHJvd3MuZmluZChyID0+IChyLnZhbHVlcyB8fCBbXSkuc29tZSh2ID0+ICh2LnRleHRWYWx1ZSB8 fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhycykpKSB8fCBudWxsOwp9CgovLyDilIDilIAg TGVjdHVyZSBDQVRfRkFDVCBwYXIgcm93SWRzIHNww6ljaWZpcXVlcyDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIAKCmFzeW5jIGZ1bmN0aW9uIGdldEZhY3RSb3dzQnlJZHMo cm93SWRzKSB7CiAgaWYgKCFyb3dJZHMubGVuZ3RoKSByZXR1cm4gW107CiAgLy8gRXNzYWkgMSA6 IHJvd0lkcyBwYXJhbWV0ZXIgKHNpIHN1cHBvcnTDqSBwYXIgbCdBUEkpCiAgdHJ5IHsKICAgIGNv bnN0IGQgPSBhd2FpdCBhcGlDYWxsKHsKICAgICAgcmVxOiAnZ2V0VGFibGVSb3dzJywgdmVyc2lv bjogJzYuNDlvLzYuNDknLAogICAgICBjYXRJZDogQ0FUX0ZBQ1QsIGJfaWQ6IEZBQ1RfVEFCLAog ICAgICBtYXhSb3dzOiAyMDAsIHN0YXJ0Um93OiAwLAogICAgICByb3dJZHM6IHJvd0lkcy5qb2lu KCcsJykKICAgIH0pOwogICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkoZC50YWJsZVJvd3Mp ID8gZC50YWJsZVJvd3MgOiBbXTsKICAgIGlmIChyb3dzLmxlbmd0aCA+IDApIHJldHVybiByb3dz OwogIH0gY2F0Y2ggKF8pIHt9CiAgLy8gRXNzYWkgMiA6IHLDqWN1cMOpcmVyIGxlcyAxMDAgZGVy bmnDqHJlcyBldCBmaWx0cmVyCiAgY29uc3QgaGl0ID0gY2FjaGUuZ2V0KCdmYWN0MTAwJyk7CiAg bGV0IGFsbFJvd3M7CiAgaWYgKGhpdCAmJiBEYXRlLm5vdygpIC0gaGl0LnRzIDwgQ0FDSEVfTVMp IHsKICAgIGFsbFJvd3MgPSBoaXQuZGF0YTsKICB9IGVsc2UgewogICAgY29uc3QgZCA9IGF3YWl0 IGFwaUNhbGwoeyByZXE6ICdnZXRUYWJsZVJvd3MnLCB2ZXJzaW9uOiAnNi40OW8vNi40OScsIGNh dElkOiBDQVRfRkFDVCwgYl9pZDogRkFDVF9UQUIsIG1heFJvd3M6IDEwMCwgc3RhcnRSb3c6IDAg fSk7CiAgICBhbGxSb3dzID0gQXJyYXkuaXNBcnJheShkLnRhYmxlUm93cykgPyBkLnRhYmxlUm93 cyA6IFtdOwogICAgY2FjaGUuc2V0KCdmYWN0MTAwJywgeyB0czogRGF0ZS5ub3coKSwgZGF0YTog YWxsUm93cyB9KTsKICB9CiAgY29uc3QgaWRTZXQgPSBuZXcgU2V0KHJvd0lkcy5tYXAoTnVtYmVy KSk7CiAgcmV0dXJuIGFsbFJvd3MuZmlsdGVyKHIgPT4gaWRTZXQuaGFzKE51bWJlcihyLnJvd0lk KSkpOwp9CgovLyDilIDilIAgbWFwRmFjdHVyZSA6IHRyYW5zZm9ybWUgdW5lIHJvdyBDQVRfRkFD VCDihpIgb2JqZXQgZmFjdHVyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIAKCmZ1bmN0aW9uIG1hcEZhY3R1cmUociwgcmFpc29uU29jaWFsZSwgcGRmT3ZlcnJpZGUp IHsKICBjb25zdCBtb250VFRDID0gcGFyc2VGbG9hdChmVmFsKHIsIEZBQ1RfTU9OVF9UVEMpKSB8 fCAwOwogIGNvbnN0IHJlZ2xlICAgPSBwYXJzZUZsb2F0KGZWYWwociwgRkFDVF9SRUdMRSkpICAg IHx8IDA7CiAgbGV0IHN0YXR1dCwgbW9kZVBhaWVtZW50LCBwYXllZUxlOwogIGlmIChtb250VFRD ID4gMCAmJiByZWdsZSA+PSBtb250VFRDKSB7IHN0YXR1dCA9ICdQYXnDqSc7IG1vZGVQYWllbWVu dCA9ICdSw6lnbMOpJzsgcGF5ZWVMZSA9ICdSw6lnbMOpJzsgfQogIGVsc2UgaWYgKHJlZ2xlID4g MCkgeyBzdGF0dXQgPSAnUGFydGllbCc7IG1vZGVQYWllbWVudCA9ICdQYXJ0aWVsJzsgcGF5ZWVM ZSA9ICcnOyB9CiAgZWxzZSB7IHN0YXR1dCA9ICdOb24gcGF5w6knOyBtb2RlUGFpZW1lbnQgPSBm VmFsKHIsIEZBQ1RfTU9ERV9QQUlFKSB8fCAnJzsgcGF5ZWVMZSA9ICcnOyB9CiAgcmV0dXJuIHsK ICAgIGlkOiBOdW1iZXIoci5yb3dJZCksIHJvd0lkOiBOdW1iZXIoci5yb3dJZCksCiAgICBudW1l cm86IGZWYWwociwgRkFDVF9SRUYpIHx8ICgnRi0nICsgci5yb3dJZCksCiAgICBkZW5vbWluYXRp b246IGZWYWwociwgRkFDVF9ERU5PTSkgfHwgJycsCiAgICBkZXNpZ25hdGlvbjogZlZhbChyLCBG QUNUX0RFTk9NKSB8fCAnJywKICAgIGNhdGVnb3JpZTogZlZhbChyLCBGQUNUX0NBVCkgfHwgJycs CiAgICB0eXBlOiBmVmFsKHIsIEZBQ1RfVFlQRSkgfHwgJycsCiAgICByYWlzb25Tb2NpYWxlOiBm VmFsKHIsIEZBQ1RfUlMpIHx8IHJhaXNvblNvY2lhbGUsCiAgICBkYXRlRW1pc2U6IGZtdERhdGUo ZlZhbChyLCBGQUNUX0RBVEVfRU1JKSksCiAgICBlY2hlYW5jZTogZm10RGF0ZShmVmFsKHIsIEZB Q1RfREFURV9FQ0gpKSwKICAgIG1vZGVQYWllbWVudCwgcGF5ZWVMZSwKICAgIG1vbnRhbnRIVDog cGFyc2VGbG9hdChmVmFsKHIsIEZBQ1RfTU9OVF9IVCkpIHx8IDAsCiAgICB0dmE6IHBhcnNlRmxv YXQoZlZhbChyLCBGQUNUX1RWQSkpIHx8IDAsCiAgICBtb250YW50VFRDOiBtb250VFRDLAogICAg bW9udGFudFJlZ2xlOiByZWdsZSwKICAgIHN0YXR1dCwKICAgIHBkZlVybDogcGRmT3ZlcnJpZGUg fHwgcGRmVXJsKHIsIEZBQ1RfUERGKSwKICB9Owp9CgovLyDilIDilIAgZ2V0RmFjdHVyZXMg4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSACgphc3luYyBmdW5jdGlvbiBnZXRGYWN0dXJlcyhyYWlzb25Tb2NpYWxlKSB7CiAgdHJ5 IHsKICAgIGNvbnN0IGtleSA9ICdmYWN0XycgKyByYWlzb25Tb2NpYWxlOwogICAgY29uc3QgaGl0 ID0gY2FjaGUuZ2V0KGtleSk7CiAgICBpZiAoaGl0ICYmIERhdGUubm93KCkgLSBoaXQudHMgPCBD QUNIRV9NUykgcmV0dXJuIGhpdC5kYXRhOwoKICAgIC8vIDEuIExpZ25lIGNsaWVudCBkYW5zIFBv cnRhaWwgQ2xpZW50CiAgICBjb25zdCBhY2Nlc1Jvd3MgPSBhd2FpdCBnZXRBbGxBY2Nlc1Jvd3Mo KTsKICAgIGNvbnN0IGNsaWVudFJvdyA9IGZpbmRDbGllbnRSb3coYWNjZXNSb3dzLCByYWlzb25T b2NpYWxlKTsKCiAgICBsZXQgZmFjdHVyZXMgPSBbXTsKCiAgICBpZiAoY2xpZW50Um93KSB7CiAg ICAgIC8vIDIuIElEcyBkZXMgNDQgZmFjdHVyZXMgbGnDqWVzCiAgICAgIGNvbnN0IGZhY0lkcyA9 IGxpbmtlZElkcyhjbGllbnRSb3csIEFDQ0VTX0ZfRkFDVFVSRVMpOwogICAgICBjb25zb2xlLmxv ZygnW2dldEZhY3R1cmVzXScsIHJhaXNvblNvY2lhbGUsICfigJQgbGlua2VkIGZhY3R1cmUgSURz OicsIGZhY0lkcy5sZW5ndGgpOwoKICAgICAgLy8gMy4gUERGcyBkaXJlY3RzIGRhbnMgQ0FUX0FD Q0VTIChmaWQgODczNDE2MCkKICAgICAgY29uc3QgcGRmTWVkaWFzID0gYWxsTWVkaWFzKGNsaWVu dFJvdywgQUNDRVNfRl9GQUNUX1BERlMpOwogICAgICAvLyBNYXA6IGludm9pY2UgcmVmIOKGkiBw ZGZVcmwgKGV4dHJhY3QgcmVmIGZyb20gZmlsZW5hbWUpCiAgICAgIGNvbnN0IHBkZkJ5UmVmID0g e307CiAgICAgIGZvciAoY29uc3QgbSBvZiBwZGZNZWRpYXMpIHsKICAgICAgICBjb25zdCBmbiA9 IG0ucG9zdEZ1bGxVcmxTdHJpbmcgfHwgbS51cmwgfHwgJyc7CiAgICAgICAgY29uc3QgcmVmTWF0 Y2ggPSBmbi5tYXRjaCgvTVBTLUYtXGR7NH0tXGQrLyk7CiAgICAgICAgaWYgKHJlZk1hdGNoKSBw ZGZCeVJlZltyZWZNYXRjaFswXV0gPSBmbjsKICAgICAgfQoKICAgICAgLy8gNC4gRmV0Y2ggbWV0 YWRhdGEgZGUgQ0FUX0ZBQ1QKICAgICAgY29uc3QgZmFjdFJvd3MgPSBhd2FpdCBnZXRGYWN0Um93 c0J5SWRzKGZhY0lkcyk7CiAgICAgIGNvbnNvbGUubG9nKCdbZ2V0RmFjdHVyZXNdIHJvd3MgZmV0 Y2hlZDonLCBmYWN0Um93cy5sZW5ndGgsICcvJywgZmFjSWRzLmxlbmd0aCk7CgogICAgICBpZiAo ZmFjdFJvd3MubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAoY29uc3QgciBvZiBmYWN0Um93cykg ewogICAgICAgICAgY29uc3QgcmVmID0gZlZhbChyLCBGQUNUX1JFRikgfHwgKCdNUFMtRi0nICsg ci5yb3dJZCk7CiAgICAgICAgICBjb25zdCBwZGZPdmVycmlkZSA9IHBkZkJ5UmVmW3JlZl0gfHwg bnVsbDsKICAgICAgICAgIGZhY3R1cmVzLnB1c2gobWFwRmFjdHVyZShyLCByYWlzb25Tb2NpYWxl LCBwZGZPdmVycmlkZSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwZGZNZWRpYXMubGVu Z3RoID4gMCkgewogICAgICAgIC8vIEZhbGxiYWNrIDogcmVjb25zdGl0dWVyIGRlcHVpcyBQREZz IHNldWxzICsgdGV4dFZhbHVlIGRlcyByZWZzCiAgICAgICAgY29uc3QgcmVmc1RleHQgPSBmVmFs KGNsaWVudFJvdywgQUNDRVNfRl9GQUNUVVJFUykgfHwgJyc7CiAgICAgICAgY29uc3QgcmVmcyA9 IHJlZnNUZXh0LnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKTsK ICAgICAgICBmYWN0dXJlcyA9IHBkZk1lZGlhcy5tYXAoKG0sIGkpID0+IHsKICAgICAgICAgIGNv bnN0IGZuID0gbS5wb3N0RnVsbFVybFN0cmluZyB8fCBtLnVybCB8fCAnJzsKICAgICAgICAgIGNv bnN0IHJlZk1hdGNoID0gZm4ubWF0Y2goL01QUy1GLVxkezR9LVxkKy8pOwogICAgICAgICAgY29u c3QgcmVmID0gcmVmTWF0Y2ggPyByZWZNYXRjaFswXSA6IChyZWZzW2ldIHx8ICgnRi0nICsgaSkp OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaWQ6IGksIHJvd0lkOiBpLCBudW1lcm86 IHJlZiwKICAgICAgICAgICAgZGVub21pbmF0aW9uOiByZWYsIGRlc2lnbmF0aW9uOiByZWYsCiAg ICAgICAgICAgIGNhdGVnb3JpZTogJycsIHR5cGU6ICcnLCByYWlzb25Tb2NpYWxlLAogICAgICAg ICAgICBkYXRlRW1pc2U6ICcnLCBlY2hlYW5jZTogJycsCiAgICAgICAgICAgIG1vZGVQYWllbWVu dDogJycsIHBheWVlTGU6ICcnLAogICAgICAgICAgICBtb250YW50SFQ6IDAsIHR2YTogMCwgbW9u dGFudFRUQzogMCwgbW9udGFudFJlZ2xlOiAwLAogICAgICAgICAgICBzdGF0dXQ6ICdJbmNvbm51 JywKICAgICAgICAgICAgcGRmVXJsOiBmbiwKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAg IH0KICAgIH0KCiAgICAvLyBUcmkgZMOpY3JvaXNzYW50IHBhciBkYXRlCiAgICBmYWN0dXJlcy5z b3J0KChhLCBiKSA9PiB7CiAgICAgIGNvbnN0IGRhID0gYS5kYXRlRW1pc2UgPyBhLmRhdGVFbWlz ZS5zcGxpdCgnLycpLnJldmVyc2UoKS5qb2luKCcnKSA6ICcwJzsKICAgICAgY29uc3QgZGIgPSBi LmRhdGVFbWlzZSA/IGIuZGF0ZUVtaXNlLnNwbGl0KCcvJykucmV2ZXJzZSgpLmpvaW4oJycpIDog JzAnOwogICAgICByZXR1cm4gZGIubG9jYWxlQ29tcGFyZShkYSk7CiAgICB9KTsKCiAgICBjYWNo ZS5zZXQoa2V5LCB7IHRzOiBEYXRlLm5vdygpLCBkYXRhOiBmYWN0dXJlcyB9KTsKICAgIHJldHVy biBmYWN0dXJlczsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ1tnZXRGYWN0 dXJlc10nLCBlcnIubWVzc2FnZSk7CiAgICByZXR1cm4gW107CiAgfQp9CgovLyDilIDilIAgZ2V0 Q29udHJhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSACgphc3luYyBmdW5jdGlvbiBnZXRDb250cmF0cyhyYWlzb25Tb2Np YWxlKSB7CiAgdHJ5IHsKICAgIGNvbnN0IGFjY2VzUm93cyA9IGF3YWl0IGdldEFsbEFjY2VzUm93 cygpOwogICAgY29uc3QgY2xpZW50Um93ID0gZmluZENsaWVudFJvdyhhY2Nlc1Jvd3MsIHJhaXNv blNvY2lhbGUpOwogICAgaWYgKCFjbGllbnRSb3cpIHJldHVybiBbXTsKCiAgICBjb25zdCBjb250 cmF0cyA9IFtdOwogICAgLy8gQ2hhbXBzIGNvbnRyYXQgcG9zc2libGVzIDogQUNDRVNfRl9DT05U UkFUICg4NzMzOTk0KQogICAgZm9yIChjb25zdCBmaWQgb2YgW0FDQ0VTX0ZfQ09OVFJBVF0pIHsK ICAgICAgY29uc3QgbXMgPSBhbGxNZWRpYXMoY2xpZW50Um93LCBmaWQpOwogICAgICBmb3IgKGNv bnN0IG0gb2YgbXMpIHsKICAgICAgICBjb25zdCB1cmwgPSBtLnBvc3RGdWxsVXJsU3RyaW5nIHx8 IG0udXJsIHx8ICcnOwogICAgICAgIGNvbnN0IGZuICA9IHVybC5zcGxpdCgnLycpLnBvcCgpLnNw bGl0KCc/JylbMF07CiAgICAgICAgLy8gRXh0cmFpdCBsZSBudW3DqXJvIGRlcHVpcyBsZSBub20g ZGUgZmljaGllcgogICAgICAgIGNvbnN0IG51bU1hdGNoID0gZm4ubWF0Y2goL1swLTldezcsfS8p OwogICAgICAgIGNvbnRyYXRzLnB1c2goewogICAgICAgICAgcmVmOiBmbi5yZXBsYWNlKC9cLnBk ZiQvaSwgJycpLnJlcGxhY2UoLy0vZywgJyAnKSwKICAgICAgICAgIG51bWVybzogbnVtTWF0Y2gg PyBudW1NYXRjaFswXSA6IGZuLAogICAgICAgICAgZGV2aXM6ICcnLAogICAgICAgICAgc3RhdHV0 OiAnRW4gY291cnMnLAogICAgICAgICAgbGllbkNvbnRyYXQ6IHVybCwKICAgICAgICAgIHBkZlVy bDogdXJsLAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29udHJhdHM7CiAg fSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKCdbZ2V0Q29udHJhdHNdJywgZXJyLm1l c3NhZ2UpOwogICAgcmV0dXJuIFtdOwogIH0KfQoKLy8g4pSA4pSAIGdldFBWSW5zdGFsbGF0aW9u IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKYXN5bmMg ZnVuY3Rpb24gZ2V0UFZJbnN0YWxsYXRpb24ocmFpc29uU29jaWFsZSkgewogIHRyeSB7CiAgICBj b25zdCBhY2Nlc1Jvd3MgPSBhd2FpdCBnZXRBbGxBY2Nlc1Jvd3MoKTsKICAgIGNvbnN0IGNsaWVu dFJvdyA9IGZpbmRDbGllbnRSb3coYWNjZXNSb3dzLCByYWlzb25Tb2NpYWxlKTsKICAgIGlmICgh Y2xpZW50Um93KSByZXR1cm4gW107CgogICAgY29uc3QgcHZMaXN0ID0gW107CiAgICBmb3IgKGNv bnN0IGZpZCBvZiBbQUNDRVNfRl9QViwgQUNDRVNfRl9QVjIsIEFDQ0VTX0ZfUFYzLCBBQ0NFU19G X1BWNF0pIHsKICAgICAgY29uc3QgbXMgPSBhbGxNZWRpYXMoY2xpZW50Um93LCBmaWQpOwogICAg ICBmb3IgKGNvbnN0IG0gb2YgbXMpIHsKICAgICAgICBjb25zdCB1cmwgPSBtLnBvc3RGdWxsVXJs U3RyaW5nIHx8IG0udXJsIHx8ICcnOwogICAgICAgIGNvbnN0IGZuICA9IHVybC5zcGxpdCgnLycp LnBvcCgpLnNwbGl0KCc/JylbMF07CiAgICAgICAgcHZMaXN0LnB1c2goewogICAgICAgICAgaWQ6 IHB2TGlzdC5sZW5ndGgsCiAgICAgICAgICBkZXNpZ25hdGlvbjogZm4ucmVwbGFjZSgvXC5wZGYk L2ksICcnKS5yZXBsYWNlKC8tL2csICcgJyksCiAgICAgICAgICBtb2RlbGU6ICcnLCBtYXJxdWU6 ICcnLCBudW1lcm9TZXJpZTogJycsCiAgICAgICAgICBkYXRlTUVTOiAnJywKICAgICAgICAgIHB2 RmljaGllcjogZm4sCiAgICAgICAgICBwZGZVcmw6IHVybCwKICAgICAgICB9KTsKICAgICAgfQog ICAgfQogICAgcmV0dXJuIHB2TGlzdDsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJy b3IoJ1tnZXRQVkluc3RhbGxhdGlvbl0nLCBlcnIubWVzc2FnZSk7CiAgICByZXR1cm4gW107CiAg fQp9CgovLyDilIDilIAgZmV0Y2hQZGYg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphc3luYyBmdW5jdGlv biBmZXRjaFBkZihub3RlSWQsIGRpcmVjdFVybCkgewogIGNvbnN0IHNrID0gYXdhaXQgZ2V0U2Vz c2tleSgpOwogIGlmICghZGlyZWN0VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1VSTCBQREYgcmVxdWlz ZScpOwogIGNvbnN0IHNlcCA9IGRpcmVjdFVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nOwog IGNvbnN0IHVybCA9IGRpcmVjdFVybCArIHNlcCArICdvX3U9JyArIGVuY29kZVVSSUNvbXBvbmVu dChUVF9PX1UpICsgJyZvX3Vfc2Vzc2tleT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNrKTsKICBj b25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgdGltZW91dDogMzAwMDAgfSk7CiAgaWYgKCFy ZXMub2spIHRocm93IG5ldyBFcnJvcignSFRUUCAnICsgcmVzLnN0YXR1cyArICcgcG91ciBQREYn KTsKICBjb25zdCBidWYgPSBhd2FpdCByZXMuYnVmZmVyKCk7CiAgcmV0dXJuIHsgZGF0YTogYnVm LCBjb250ZW50VHlwZTogcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGlj YXRpb24vcGRmJyB9Owp9CgovLyDilIDilIAgZGVidWdBY2NlcyDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmFzeW5j IGZ1bmN0aW9uIGRlYnVnQWNjZXMoc2VhcmNoVGVybSkgewogIGNvbnN0IHJvd3MgPSBhd2FpdCBn ZXRBbGxBY2Nlc1Jvd3MoKTsKICBjb25zdCBjbGllbnRSb3cgPSBmaW5kQ2xpZW50Um93KHJvd3Ms IHNlYXJjaFRlcm0pOwogIHJldHVybiB7CiAgICB0b3RhbFJvd3M6IHJvd3MubGVuZ3RoLAogICAg Y2xpZW50Rm91bmQ6ICEhY2xpZW50Um93LAogICAgY2xpZW50Um93SWQ6IGNsaWVudFJvdyA/IGNs aWVudFJvdy5yb3dJZCA6IG51bGwsCiAgICBhbGxSb3dzU2FtcGxlOiByb3dzLm1hcChyID0+ICh7 IHJvd0lkOiByLnJvd0lkLCB0ZXh0OiAoci52YWx1ZXN8fFtdKS5zbGljZSgwLDIpLm1hcCh2PT52 LmZpZWxkSWQrJzonKygodi50ZXh0VmFsdWV8fCcnKS5zdWJzdHJpbmcoMCwzMCkpKS5qb2luKCcg fCAnKSB9KSksCiAgICBjbGllbnRGaWVsZHM6IGNsaWVudFJvdyA/IChjbGllbnRSb3cudmFsdWVz fHxbXSkubWFwKHYgPT4gKHsKICAgICAgZmlkOiBOdW1iZXIodi5maWVsZElkKSwgdGV4dFZhbHVl OiAodi50ZXh0VmFsdWV8fCcnKS5zdWJzdHJpbmcoMCwxMjApLAogICAgICBsaW5rZWRSb3dJZHM6 IHYubGlua2VkUm93SWRzfHxudWxsLCBsaW5rZWRSb3dDb3VudDogQXJyYXkuaXNBcnJheSh2Lmxp bmtlZFJvd1ZhbHVlcyk/di5saW5rZWRSb3dWYWx1ZXMubGVuZ3RoOm51bGwsCiAgICAgIG1lZGlh Q291bnQ6IEFycmF5LmlzQXJyYXkodi5tZWRpYXMpP3YubWVkaWFzLmxlbmd0aDowLAogICAgICBt ZWRpYVVybDogQXJyYXkuaXNBcnJheSh2Lm1lZGlhcykmJnYubWVkaWFzLmxlbmd0aD8odi5tZWRp YXNbMF0ucG9zdEZ1bGxVcmxTdHJpbmd8fHYubWVkaWFzWzBdLnVybHx8JycpOm51bGwKICAgIH0p KSA6IFtdCiAgfTsKfQoKYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlKCkgeyB0aHJvdyBuZXcg RXJyb3IoJ29ic29sw6h0ZScpOyB9Cgptb2R1bGUuZXhwb3J0cyA9IHsgZ2V0U2Vzc2tleSwgZ2V0 Q29udHJhdHMsIGdldFBWSW5zdGFsbGF0aW9uLCBnZXRGYWN0dXJlcywgZG93bmxvYWRGaWxlLCBm ZXRjaFBkZiwgZGVidWdBY2NlcyB9Owo=