diff --git a/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template b/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template index 981887e..37c0094 100644 --- a/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template +++ b/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template @@ -8,17 +8,6 @@ "Name": "Disable-Firewall", "Arguments": {} }, - { - "Name": "New-SqlServerSystemAccount", - "Arguments": { - "UserName": "$domainAdminAccountName", - "PrimaryNode": "$primaryNode", - "DomainName": "$domainName", - "SQLServiceUserPassword": "$sqlServiceAccountPassword", - "UserPassword": "$domainAdminAccountPassword", - "SQLServiceUserName": "$sqlServiceAccountName" - } - }, { "Name": "New-SharedFolderForAOAG", "Arguments": { @@ -27,8 +16,8 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQoKCiAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgfQogICAgfQoKICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KCiAgICBpZiAoJFNxbHBzU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTcWxwc1NldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgIH0KCiAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICR0cnVlfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICRmYWxzZX0KICAgIH0KCiAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgLVNldHVwUm9vdCAkU2V0dXBSb290IGAKICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLVNRTFN2Y1VzclBhc3N3b3JkICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkIGAKICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKCiAgICBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgLVNldHVwUm9vdCAkU3FscHNTZXR1cFJvb3QKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCgogICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5BZG1pbkFjY291bnROYW1lIiBgCiAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnSW5pdGlhbGl6ZS1BbHdheXNPbicgLi4uIgpgJFhtbEZpbGUgPSBbSU8uUGF0aF06OkNvbWJpbmUoIiRTaGFyZU5ldHdvcmtQYXRoIiwgImAkKGAkRW52OkNvbXB1dGVyTmFtZSkueG1sIikKV3JpdGUtTG9nICJPdXRwdXQgWE1MIGZpbGUgaXMgJ2AkWG1sRmlsZSciCkluaXRpYWxpemUtQWx3YXlzT24gfCBFeHBvcnQtQ2xpWG1sIC1QYXRoIGAkWG1sRmlsZQoiQCAtQ3JlZGVudGlhbCAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgLU5vQmFzZTY0Cgp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcgc2NyaXB0LiIKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFNoYXJlTmFtZSAtZXEgJycpIHsKICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgIH0KCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVQYXRoID0gJyRTaGFyZVBhdGgnIgogICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICB0cnkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIHNoYXJlICckU2hhcmVOYW1lJyIKICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICB3cml0ZS1Mb2cgIlNoYXJlICckU2hhcmVOYW1lJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJTaGFyZSAnJFNoYXJlTmFtZScgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBmb2xkZXIgJyRTaGFyZVBhdGgiCiAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgfQoKICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAKICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgIGlmICgkUHJpbWFyeU5vZGUuVG9Mb3dlcigpIC1uZSAoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkQ2xpWG1sRmlsZSAtZXEgJycpIHsKICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gNTAyMgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIlNFUlZFUl9JTlNUQU5DRSIgPSAiJE5vZGUiOwogICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAiRkFJTE9WRVJfTU9ERSI9Ik1BTlVBTCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICJOQU1FIj0kTGlzdGVuZXJOYW1lOwogICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICB9CgogICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgJ05hbWUnID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICdQcmVmZXJlbmNlcycgPSAkUHJlZmVyZW5jZXM7CiAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgIH0KCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcKiIgLUZvcmNlCgogICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgYAogICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgLVVzZXJOYW1lICRVc2VyTmFtZSBgCiAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZAogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKCiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uIGFueSBTZWNvbmRhcnlOb2RlIG9ubHkuIgogICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvZmYKfQoKCgpmdW5jdGlvbiBFbmFibGUtRmlyZXdhbGwgewogICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCn0KCgo=", - "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgoR2V0LU1vZHVsZSAtTmFtZSAnQWN0aXZlRGlyZWN0b3J5JykgLWVxICRudWxsKSB7CiAgICAgICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAogICAgfQoKICAgIGlmICgoR2V0LU1vZHVsZSAtTmFtZSAnQWN0aXZlRGlyZWN0b3J5JykgLWVxICRudWxsKSB7CiAgICAgICAgdGhyb3cgIk1vZHVsZSAnQWN0aXZlRGlyZWN0b3J5JyBpcyBub3QgYXZhaWxhYmxlLiIKICAgIH0KCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRudWxsID0gTmV3LUFEVXNlciBgCiAgICAgICAgLU5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLUFjY291bnRQYXNzd29yZCAkKENvbnZlcnRUby1TZWN1cmVTdHJpbmcgLVN0cmluZyAkU1FMU2VydmljZVVzZXJQYXNzd29yZCAtQXNQbGFpblRleHQgLUZvcmNlKSBgCiAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRzCn0K" + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoK", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIFdyaXRlLUxvZyAiSW5zdGFsbGluZyAnUlNBVC1BRC1Qb3dlclNoZWxsJyAuLi4gIgogICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgIEltcG9ydC1Nb2R1bGUgQWN0aXZlRGlyZWN0b3J5CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAkbnVsbCA9IE5ldy1BRFVzZXIgYAogICAgICAgIC1OYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgIC1DcmVkZW50aWFsICRDcmVkcyBgCiAgICAgICAgLUVycm9yQWN0aW9uICdTdG9wJwp9Cg==" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/FailoverCluster.template b/data/templates/agent/SqlServerCluster/FailoverCluster.template index 1c909cb..da1cdc3 100644 --- a/data/templates/agent/SqlServerCluster/FailoverCluster.template +++ b/data/templates/agent/SqlServerCluster/FailoverCluster.template @@ -10,13 +10,23 @@ "UserPassword": "$domainAdminAccountPassword", "StaticAddress": "$clusterIP" } + }, + { + "Name": "New-FailoverClusterSharedFolder", + "Arguments": { + "ClusterName": "$clusterName", + "UserName": "$domainAdminAccountName", + "UserPassword": "$domainAdminAccountPassword", + "ShareServer": "$shareServer", + "DomainName": "$domainName" + } } ], "RebootOnCompletion": 0, "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", - "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgoR2V0LU1vZHVsZSAtTmFtZSAnQWN0aXZlRGlyZWN0b3J5JykgLWVxICRudWxsKSB7CiAgICAgICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAogICAgfQoKICAgIGlmICgoR2V0LU1vZHVsZSAtTmFtZSAnQWN0aXZlRGlyZWN0b3J5JykgLWVxICRudWxsKSB7CiAgICAgICAgdGhyb3cgIk1vZHVsZSAnQWN0aXZlRGlyZWN0b3J5JyBpcyBub3QgYXZhaWxhYmxlLiIKICAgIH0KCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRudWxsID0gTmV3LUFEVXNlciBgCiAgICAgICAgLU5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLUFjY291bnRQYXNzd29yZCAkKENvbnZlcnRUby1TZWN1cmVTdHJpbmcgLVN0cmluZyAkU1FMU2VydmljZVVzZXJQYXNzd29yZCAtQXNQbGFpblRleHQgLUZvcmNlKSBgCiAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRzCn0K", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgCiAgICAkU3RkT3V0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgIGlmICgkTm9CYXNlNjQpIHsKICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICRUbXBTY3JpcHQgPSAiJFRtcFNjcmlwdC5wczEiCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUZpbGUnLCAiJFRtcFNjcmlwdCIpCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQnl0ZXMgPSBbVGV4dC5FbmNvZGluZ106OlVuaWNvZGUuR2V0Qnl0ZXMoJENvbW1hbmQpCiAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEVuY29kZWRDb21tYW5kCgogICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgfQoKICAgIFdyaXRlLUxvZ0RlYnVnICRBcmd1bWVudExpc3QKCiAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgIC1QYXNzVGhydQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAtUGFzc1RocnUKICAgIH0KCiAgICBXcml0ZS1Mb2cgIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBleGl0IGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJy4iCgogICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAjfQoKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkT3V0IGZpbGUgaXMgJyRTdGRPdXQnIgogICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAkVG1wRmlsZSA9IFNlbGVjdC1DbGlYbWxCbG9jayAkU3RkT3V0CiAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgKCRTdGRPdXRPYmplY3QpCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgfQoKICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAkVG1wRmlsZSA9IFNlbGVjdC1DbGlYbWxCbG9jayAkU3RkRXJyCiAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgKCRTdGRFcnJPYmplY3QpCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICRTdGRFcnJPYmplY3QKICAgICAgICB9CiAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgfQoKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlU2F2ZWQKCiAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICB9CgogICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKfQo=", - "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGgsDQoJCVtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbA0KCSkNCiAgICANCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgIH0NCg0KICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICApDQoNCiAgICAgICAgICAgIFJlbW92ZS1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQoNCiAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KCQlbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQoJCVtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KCQlbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQsDQogICAgICAgICRDcmVkZW50aWFsDQoJKQ0KDQogICAgV3JpdGUtTG9nICJDbHVzdGVyTm9kZXM6ICQoJENsdXN0ZXJOb2RlcyAtam9pbiAnLCAnKSINCg0KICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsNCiAgICAgICAgJENyZWRlbnRpYWwgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIg0KICAgIH0NCg0KICAgIEltcG9ydC1Nb2R1bGUgRmFpbG92ZXJDbHVzdGVycw0KDQoJaWYgKChHZXQtQ2x1c3RlciAkQ2x1c3Rlck5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIG5ldyBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgLUNvbW1hbmQgQCINCkltcG9ydC1Nb2R1bGUgRmFpbG92ZXJDbHVzdGVycw0KTmV3LUNsdXN0ZXIgLU5hbWUgJyRDbHVzdGVyTmFtZScgLVN0YXRpY0FkZHJlc3MgJyRTdGF0aWNBZGRyZXNzJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgIH0NCg0KICAgIGZvcmVhY2ggKCROb2RlIGluICRDbHVzdGVyTm9kZXMpIHsNCiAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAuLi4iDQogICAgICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyAtQ29tbWFuZCBAIg0KSW1wb3J0LU1vZHVsZSBGYWlsb3ZlckNsdXN0ZXJzDQpBZGQtQ2x1c3Rlck5vZGUgLUNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLU5hbWUgJyROb2RlJw0KIkAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgLU5vQmFzZTY0DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIk5vZGUgJyROb2RlJyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgY2x1c3RlciAnJENsdXN0ZXJOYW1lJy4iDQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KDQo8Iw0KDQojIEV4YW1wbGUNCg0KJERvbWFpbk5hbWUgPSAnZmMtYWNtZS5sb2NhbCcNCiREb21haW5Vc2VyID0gJ0FkbWluaXN0cmF0b3InDQokRG9tYWluUGFzc3dvcmQgPSAnUEBzc3cwcmQnDQoNCiRDbHVzdGVyTmFtZSA9ICdmYy10ZXN0Jw0KJENsdXN0ZXJJUCA9ICcxMC4yMDAuMC42MCcNCiRDbHVzdGVyTm9kZXMgPSBAKCdmYy1ub2RlLTAxJywnZmMtbm9kZS0wMicsJ2ZjLW5vZGUtMDMnKQ0KDQokU2hhcmVTZXJ2ZXIgPSAnZmMtZGMtMDEnDQokU2hhcmVOYW1lID0gJ0ZDU2hhcmUnDQoNCiRTaGFyZVBhdGggPSAiQzpcJFNoYXJlTmFtZSINCg0KDQoNCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucyAtRm9yY2UNCg0KJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgYA0KICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpblVzZXIiIGANCiAgICAtUGFzc3dvcmQgIiREb21haW5QYXNzd29yZCINCg0KTmV3LUZhaWxvdmVyQ2x1c3RlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLVN0YXRpY0FkZHJlc3MgJENsdXN0ZXJJUCBgDQogICAgLUNsdXN0ZXJOb2RlcyAkQ2x1c3Rlck5vZGVzIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciBgDQogICAgLUNsdXN0ZXJOYW1lICRDbHVzdGVyTmFtZSBgDQogICAgLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KICAgIC1TaGFyZVNlcnZlciAkU2hhcmVTZXJ2ZXIgYA0KICAgIC1TaGFyZVBhdGggIiRTaGFyZVBhdGgiIGANCiAgICAtU2hhcmVOYW1lICIkU2hhcmVOYW1lIiBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCiM+DQo=" + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkLAoKICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUgPSAnICcKICAgICkKCiAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIlRIaXMgZnVuY3Rpb24gcnVucyBvbiBBT0FHIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIFdyaXRlLUxvZyAiSW5zdGFsbGluZyAnUlNBVC1BRC1Qb3dlclNoZWxsJyAuLi4gIgogICAgQWRkLVdpbmRvd3NGZWF0dXJlIFJTQVQtQUQtUG93ZXJTaGVsbAoKICAgIEltcG9ydC1Nb2R1bGUgQWN0aXZlRGlyZWN0b3J5CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICBXcml0ZS1Mb2cgIkFkZGluZyBuZXcgdXNlciAuLi4iCiAgICAkbnVsbCA9IE5ldy1BRFVzZXIgYAogICAgICAgIC1OYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgIC1BY2NvdW50UGFzc3dvcmQgJChDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIC1TdHJpbmcgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgLUFzUGxhaW5UZXh0IC1Gb3JjZSkgYAogICAgICAgIC1DcmVkZW50aWFsICRDcmVkcyBgCiAgICAgICAgLUVycm9yQWN0aW9uICdTdG9wJwp9Cg==", + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=", + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICBXcml0ZS1Mb2cgIi0tPiBOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIg0KDQogICAgICAgIFdyaXRlLUxvZyAiQ3JlYXRpbmcgc2hhcmVkIGZvbGRlciBmb3IgRmFpbG92ZXIgQ2x1c3RlciAuLi4iDQogICAgICAgIA0KICAgICAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICAgICAkQ3JlZGVudGlhbCA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiDQogICAgICAgIH0NCg0KICAgICAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgICAgIHRocm93KCJTZXJ2ZXIgJyRTaGFyZVNlcnZlcicgaXMgdW5yZWFjaGFibGUgdmlhIElDTVAuIikNCiAgICAgICAgfQ0KDQogICAgICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgICAgIFdyaXRlLUxvZyAiQ3JlYXRpbmcgZm9sZGVyIG9uICckU2hhcmVTZXJ2ZXInIC4uLiINCiAgICAgICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgICAgICBwYXJhbSAoDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGgsDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRDbHVzdGVyQWNjb3VudA0KICAgICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgICAgIFJlbW92ZS1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQogICAgICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtRm9yY2UgLUVycm9yQWN0aW9uICdTaWxlbnRseUNvbnRpbnVlJw0KDQogICAgICAgICAgICAgICAgTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIE5ldy1TbWJTaGFyZSAtUGF0aCAkU2hhcmVQYXRoIGANCiAgICAgICAgICAgICAgICAgICAgLU5hbWUgJFNoYXJlTmFtZSBgDQogICAgICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBGYWlsb3ZlciBDbHVzdGVyLiINCg0KICAgICAgICAgICAgfSAtQXJndW1lbnRMaXN0ICRTaGFyZVBhdGgsICRTaGFyZU5hbWUsICIkRG9tYWluTmFtZVwkQ2x1c3Rlck5hbWVgJCINCg0KICAgICAgICBXcml0ZS1Mb2cgIkNvbmZndXJpbmcgRmFpbG92ZXIgQ2x1c3RlciB0byB1c2Ugc2hhcmVkIGZvbGRlciBhcyBxb3VydW0gcmVzb3Vyc2UgLi4uIg0KDQogICAgICAgICRudWxsID0gU2V0LUNsdXN0ZXJRdW9ydW0gLU5vZGVBbmRGaWxlU2hhcmVNYWpvcml0eSAiXFwkU2hhcmVTZXJ2ZXJcJFNoYXJlTmFtZSINCg0KICAgICAgICBXcml0ZS1Mb2cgIjwtLSBOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIg0KICAgIH0NCn0NCg0KDQoNCmZ1bmN0aW9uIE5ldy1GYWlsb3ZlckNsdXN0ZXIgew0KCXBhcmFtICgNCiAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU3RhdGljQWRkcmVzcywNCiAgICAgICAgW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzLA0KICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbA0KICAgICkNCiAgICBiZWdpbiB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbg0KICAgIH0NCiAgICBlbmQgew0KICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZA0KICAgIH0NCiAgICBwcm9jZXNzIHsNCiAgICAgICAgV3JpdGUtTG9nICJDbHVzdGVyTm9kZXM6ICQoJENsdXN0ZXJOb2RlcyAtam9pbiAnLCAnKSINCg0KICAgICAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICAgICAkQ3JlZGVudGlhbCA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiDQogICAgICAgIH0NCg0KICAgICAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIAlpZiAoKEdldC1DbHVzdGVyICRDbHVzdGVyTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZSkgLWVxICRudWxsKSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIG5ldyBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCk5ldy1DbHVzdGVyIC1OYW1lICckQ2x1c3Rlck5hbWUnIC1TdGF0aWNBZGRyZXNzICckU3RhdGljQWRkcmVzcycNCiJAIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIC1Ob0Jhc2U2NA0KICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMTUNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIFdyaXRlLUxvZyAiQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyBhbHJlYWR5IGV4aXN0cy4iDQogICAgICAgIH0NCg0KICAgICAgICBmb3JlYWNoICgkTm9kZSBpbiAkQ2x1c3Rlck5vZGVzKSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlICckTm9kZScgdG8gdGhlIGNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLi4uIg0KICAgICAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiQWRkaW5nIG5vZGUgLi4uIg0KICAgICAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCkFkZC1DbHVzdGVyTm9kZSAtQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyAtTmFtZSAnJE5vZGUnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTm9kZSAnJE5vZGUnIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnLiINCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQoNCjwjDQoNCiMgRXhhbXBsZQ0KDQokRG9tYWluTmFtZSA9ICdmYy1hY21lLmxvY2FsJw0KJERvbWFpblVzZXIgPSAnQWRtaW5pc3RyYXRvcicNCiREb21haW5QYXNzd29yZCA9ICdQQHNzdzByZCcNCg0KJENsdXN0ZXJOYW1lID0gJ2ZjLXRlc3QnDQokQ2x1c3RlcklQID0gJzEwLjIwMC4wLjYwJw0KJENsdXN0ZXJOb2RlcyA9IEAoJ2ZjLW5vZGUtMDEnLCdmYy1ub2RlLTAyJywnZmMtbm9kZS0wMycpDQoNCiRTaGFyZVNlcnZlciA9ICdmYy1kYy0wMScNCiRTaGFyZU5hbWUgPSAnRkNTaGFyZScNCg0KJFNoYXJlUGF0aCA9ICJDOlwkU2hhcmVOYW1lIg0KDQoNCg0KSW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ0KDQokQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCBgDQogICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluVXNlciIgYA0KICAgIC1QYXNzd29yZCAiJERvbWFpblBhc3N3b3JkIg0KDQpOZXctRmFpbG92ZXJDbHVzdGVyIGANCiAgICAtQ2x1c3Rlck5hbWUgJENsdXN0ZXJOYW1lIGANCiAgICAtU3RhdGljQWRkcmVzcyAkQ2x1c3RlcklQIGANCiAgICAtQ2x1c3Rlck5vZGVzICRDbHVzdGVyTm9kZXMgYA0KICAgIC1DcmVkZW50aWFsICRDcmVkcw0KDQpOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIGANCiAgICAtQ2x1c3Rlck5hbWUgJENsdXN0ZXJOYW1lIGANCiAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgDQogICAgLVNoYXJlU2VydmVyICRTaGFyZVNlcnZlciBgDQogICAgLVNoYXJlUGF0aCAiJFNoYXJlUGF0aCIgYA0KICAgIC1TaGFyZU5hbWUgIiRTaGFyZU5hbWUiIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KIz4NCg==" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template b/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template index 1bd7e7e..de3b657 100644 --- a/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template +++ b/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template @@ -16,8 +16,8 @@ ], "RebootOnCompletion": 1, "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "CmZ1bmN0aW9uIFVwZGF0ZS1TZXJ2aWNlQ29uZmlnIHsKICAgIHBhcmFtICgKICAgICAgICBbU3RyaW5nXSAkTmFtZSwKICAgICAgICBbU3RyaW5nXSAkUnVuQXNVc2VyID0gJycsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUgPSAnLicsCiAgICAgICAgW1N0cmluZ10gJFBhc3N3b3JkID0gJycsCiAgICAgICAgW1N3aXRjaF0gJFJ1bkFzTG9jYWxTZXJ2aWNlCiAgICApCgogICAgJEFyZ3VtZW50TGlzdCA9IEAoJ2NvbmZpZycsICJgIiROYW1lYCIiKQoKICAgIGlmICgkUnVuQXNMb2NhbFNlcnZpY2UpIHsKICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoIm9iaj0iLCAiYCJOVCBBVVRIT1JJVFlcTG9jYWxTZXJ2aWNlYCIiKQogICAgfQogICAgZWxzZWlmICgkUnVuQXNVc2VyIC1uZSAnJykgewogICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgib2JqPSIsICJgIiREb21haW5OYW1lXCRSdW5Bc1VzZXJgIiIsICJwYXNzd29yZD0iLCAiYCIkUGFzc3dvcmRgIiIpCiAgICB9CgogICAgJFByb2Nlc3MgPSBFeGVjICdzYy5leGUnICRBcmd1bWVudExpc3QgLVBhc3NUaHJ1IC1SZWRpcmVjdFN0cmVhbXMKCiAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiQ29tbWFuZCAnc2MuZXhlJyByZXR1cm5lZCBleGl0IGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIKICAgIH0KfQo=", - "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGgsDQoJCVtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbA0KCSkNCiAgICANCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgIH0NCg0KICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICApDQoNCiAgICAgICAgICAgIFJlbW92ZS1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQoNCiAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KCQlbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQoJCVtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KCQlbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwNCgkpDQoNCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KCWlmICgoR2V0LUNsdXN0ZXIgJENsdXN0ZXJOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCk5ldy1DbHVzdGVyIC1OYW1lICckQ2x1c3Rlck5hbWUnIC1TdGF0aWNBZGRyZXNzICckU3RhdGljQWRkcmVzcycNCiJAIC1DcmVkZW50aWFsICRDcmVkZW50aWFsDQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgIH0NCg0KICAgIGZvcmVhY2ggKCROb2RlIGluICRDbHVzdGVyTm9kZXMpIHsNCiAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCkFkZC1DbHVzdGVyTm9kZSAtQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyAtTmFtZSAnJE5vZGUnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgV3JpdGUtTG9nICJOb2RlICckTm9kZScgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGNsdXN0ZXIgJyRDbHVzdGVyTmFtZScuIg0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCg0KPCMNCg0KIyBFeGFtcGxlDQoNCiREb21haW5OYW1lID0gJ2ZjLWFjbWUubG9jYWwnDQokRG9tYWluVXNlciA9ICdBZG1pbmlzdHJhdG9yJw0KJERvbWFpblBhc3N3b3JkID0gJ1BAc3N3MHJkJw0KDQokQ2x1c3Rlck5hbWUgPSAnZmMtdGVzdCcNCiRDbHVzdGVySVAgPSAnMTAuMjAwLjAuNjAnDQokQ2x1c3Rlck5vZGVzID0gQCgnZmMtbm9kZS0wMScsJ2ZjLW5vZGUtMDInLCdmYy1ub2RlLTAzJykNCg0KJFNoYXJlU2VydmVyID0gJ2ZjLWRjLTAxJw0KJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJw0KDQokU2hhcmVQYXRoID0gIkM6XCRTaGFyZU5hbWUiDQoNCg0KDQpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMgLUZvcmNlDQoNCiRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGANCiAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5Vc2VyIiBgDQogICAgLVBhc3N3b3JkICIkRG9tYWluUGFzc3dvcmQiDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1TdGF0aWNBZGRyZXNzICRDbHVzdGVySVAgYA0KICAgIC1DbHVzdGVyTm9kZXMgJENsdXN0ZXJOb2RlcyBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGANCiAgICAtU2hhcmVTZXJ2ZXIgJFNoYXJlU2VydmVyIGANCiAgICAtU2hhcmVQYXRoICIkU2hhcmVQYXRoIiBgDQogICAgLVNoYXJlTmFtZSAiJFNoYXJlTmFtZSIgYA0KICAgIC1DcmVkZW50aWFsICRDcmVkcw0KDQojPg0K" + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGggPSAkKCRFbnY6U3lzdGVtRHJpdmUgKyAnXEZDU2hhcmUnKSwNCgkJW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJywNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbCA9ICRudWxsDQoJKQ0KICAgIGJlZ2luIHsNCiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uDQogICAgfQ0KICAgIGVuZCB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kDQogICAgfQ0KICAgIHByb2Nlc3Mgew0KICAgICAgICBXcml0ZS1Mb2cgIi0tPiBOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIg0KDQogICAgICAgIFdyaXRlLUxvZyAiQ3JlYXRpbmcgc2hhcmVkIGZvbGRlciBmb3IgRmFpbG92ZXIgQ2x1c3RlciAuLi4iDQogICAgICAgIA0KICAgICAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICAgICAkQ3JlZGVudGlhbCA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiDQogICAgICAgIH0NCg0KICAgICAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgICAgIHRocm93KCJTZXJ2ZXIgJyRTaGFyZVNlcnZlcicgaXMgdW5yZWFjaGFibGUgdmlhIElDTVAuIikNCiAgICAgICAgfQ0KDQogICAgICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgICAgIFdyaXRlLUxvZyAiQ3JlYXRpbmcgZm9sZGVyIG9uICckU2hhcmVTZXJ2ZXInIC4uLiINCiAgICAgICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgICAgICBwYXJhbSAoDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGgsDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgICAgIFtTdHJpbmddICRDbHVzdGVyQWNjb3VudA0KICAgICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgICAgIFJlbW92ZS1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1Gb3JjZSAtRXJyb3JBY3Rpb24gJ1NpbGVudGx5Q29udGludWUnDQogICAgICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtRm9yY2UgLUVycm9yQWN0aW9uICdTaWxlbnRseUNvbnRpbnVlJw0KDQogICAgICAgICAgICAgICAgTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIE5ldy1TbWJTaGFyZSAtUGF0aCAkU2hhcmVQYXRoIGANCiAgICAgICAgICAgICAgICAgICAgLU5hbWUgJFNoYXJlTmFtZSBgDQogICAgICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBGYWlsb3ZlciBDbHVzdGVyLiINCg0KICAgICAgICAgICAgfSAtQXJndW1lbnRMaXN0ICRTaGFyZVBhdGgsICRTaGFyZU5hbWUsICIkRG9tYWluTmFtZVwkQ2x1c3Rlck5hbWVgJCINCg0KICAgICAgICBXcml0ZS1Mb2cgIkNvbmZndXJpbmcgRmFpbG92ZXIgQ2x1c3RlciB0byB1c2Ugc2hhcmVkIGZvbGRlciBhcyBxb3VydW0gcmVzb3Vyc2UgLi4uIg0KDQogICAgICAgICRudWxsID0gU2V0LUNsdXN0ZXJRdW9ydW0gLU5vZGVBbmRGaWxlU2hhcmVNYWpvcml0eSAiXFwkU2hhcmVTZXJ2ZXJcJFNoYXJlTmFtZSINCg0KICAgICAgICBXcml0ZS1Mb2cgIjwtLSBOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIg0KICAgIH0NCn0NCg0KDQoNCmZ1bmN0aW9uIE5ldy1GYWlsb3ZlckNsdXN0ZXIgew0KCXBhcmFtICgNCiAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU3RhdGljQWRkcmVzcywNCiAgICAgICAgW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzLA0KICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLA0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLA0KICAgICAgICAkQ3JlZGVudGlhbA0KICAgICkNCiAgICBiZWdpbiB7DQogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbg0KICAgIH0NCiAgICBlbmQgew0KICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZA0KICAgIH0NCiAgICBwcm9jZXNzIHsNCiAgICAgICAgV3JpdGUtTG9nICJDbHVzdGVyTm9kZXM6ICQoJENsdXN0ZXJOb2RlcyAtam9pbiAnLCAnKSINCg0KICAgICAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICAgICAkQ3JlZGVudGlhbCA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiDQogICAgICAgIH0NCg0KICAgICAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIAlpZiAoKEdldC1DbHVzdGVyICRDbHVzdGVyTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZSkgLWVxICRudWxsKSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkNyZWF0aW5nIG5ldyBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCk5ldy1DbHVzdGVyIC1OYW1lICckQ2x1c3Rlck5hbWUnIC1TdGF0aWNBZGRyZXNzICckU3RhdGljQWRkcmVzcycNCiJAIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIC1Ob0Jhc2U2NA0KICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMTUNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIFdyaXRlLUxvZyAiQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyBhbHJlYWR5IGV4aXN0cy4iDQogICAgICAgIH0NCg0KICAgICAgICBmb3JlYWNoICgkTm9kZSBpbiAkQ2x1c3Rlck5vZGVzKSB7DQogICAgICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBub2RlICckTm9kZScgdG8gdGhlIGNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgLi4uIg0KICAgICAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiQWRkaW5nIG5vZGUgLi4uIg0KICAgICAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCkFkZC1DbHVzdGVyTm9kZSAtQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyAtTmFtZSAnJE5vZGUnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCAtTm9CYXNlNjQNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTm9kZSAnJE5vZGUnIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnLiINCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQoNCjwjDQoNCiMgRXhhbXBsZQ0KDQokRG9tYWluTmFtZSA9ICdmYy1hY21lLmxvY2FsJw0KJERvbWFpblVzZXIgPSAnQWRtaW5pc3RyYXRvcicNCiREb21haW5QYXNzd29yZCA9ICdQQHNzdzByZCcNCg0KJENsdXN0ZXJOYW1lID0gJ2ZjLXRlc3QnDQokQ2x1c3RlcklQID0gJzEwLjIwMC4wLjYwJw0KJENsdXN0ZXJOb2RlcyA9IEAoJ2ZjLW5vZGUtMDEnLCdmYy1ub2RlLTAyJywnZmMtbm9kZS0wMycpDQoNCiRTaGFyZVNlcnZlciA9ICdmYy1kYy0wMScNCiRTaGFyZU5hbWUgPSAnRkNTaGFyZScNCg0KJFNoYXJlUGF0aCA9ICJDOlwkU2hhcmVOYW1lIg0KDQoNCg0KSW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ0KDQokQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCBgDQogICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluVXNlciIgYA0KICAgIC1QYXNzd29yZCAiJERvbWFpblBhc3N3b3JkIg0KDQpOZXctRmFpbG92ZXJDbHVzdGVyIGANCiAgICAtQ2x1c3Rlck5hbWUgJENsdXN0ZXJOYW1lIGANCiAgICAtU3RhdGljQWRkcmVzcyAkQ2x1c3RlcklQIGANCiAgICAtQ2x1c3Rlck5vZGVzICRDbHVzdGVyTm9kZXMgYA0KICAgIC1DcmVkZW50aWFsICRDcmVkcw0KDQpOZXctRmFpbG92ZXJDbHVzdGVyU2hhcmVkRm9sZGVyIGANCiAgICAtQ2x1c3Rlck5hbWUgJENsdXN0ZXJOYW1lIGANCiAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgDQogICAgLVNoYXJlU2VydmVyICRTaGFyZVNlcnZlciBgDQogICAgLVNoYXJlUGF0aCAiJFNoYXJlUGF0aCIgYA0KICAgIC1TaGFyZU5hbWUgIiRTaGFyZU5hbWUiIGANCiAgICAtQ3JlZGVudGlhbCAkQ3JlZHMNCg0KIz4NCg==" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template b/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template index 8290fc7..75da564 100644 --- a/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template +++ b/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template @@ -17,10 +17,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", - "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQoKCiAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgfQogICAgfQoKICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KCiAgICBpZiAoJFNxbHBzU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTcWxwc1NldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgIH0KCiAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICR0cnVlfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICRmYWxzZX0KICAgIH0KCiAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgLVNldHVwUm9vdCAkU2V0dXBSb290IGAKICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLVNRTFN2Y1VzclBhc3N3b3JkICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkIGAKICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKCiAgICBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgLVNldHVwUm9vdCAkU3FscHNTZXR1cFJvb3QKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCgogICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5BZG1pbkFjY291bnROYW1lIiBgCiAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnSW5pdGlhbGl6ZS1BbHdheXNPbicgLi4uIgpgJFhtbEZpbGUgPSBbSU8uUGF0aF06OkNvbWJpbmUoIiRTaGFyZU5ldHdvcmtQYXRoIiwgImAkKGAkRW52OkNvbXB1dGVyTmFtZSkueG1sIikKV3JpdGUtTG9nICJPdXRwdXQgWE1MIGZpbGUgaXMgJ2AkWG1sRmlsZSciCkluaXRpYWxpemUtQWx3YXlzT24gfCBFeHBvcnQtQ2xpWG1sIC1QYXRoIGAkWG1sRmlsZQoiQCAtQ3JlZGVudGlhbCAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgLU5vQmFzZTY0Cgp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcgc2NyaXB0LiIKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFNoYXJlTmFtZSAtZXEgJycpIHsKICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgIH0KCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVQYXRoID0gJyRTaGFyZVBhdGgnIgogICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICB0cnkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIHNoYXJlICckU2hhcmVOYW1lJyIKICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICB3cml0ZS1Mb2cgIlNoYXJlICckU2hhcmVOYW1lJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJTaGFyZSAnJFNoYXJlTmFtZScgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBmb2xkZXIgJyRTaGFyZVBhdGgiCiAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgfQoKICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAKICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgIGlmICgkUHJpbWFyeU5vZGUuVG9Mb3dlcigpIC1uZSAoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkQ2xpWG1sRmlsZSAtZXEgJycpIHsKICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gNTAyMgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIlNFUlZFUl9JTlNUQU5DRSIgPSAiJE5vZGUiOwogICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAiRkFJTE9WRVJfTU9ERSI9Ik1BTlVBTCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICJOQU1FIj0kTGlzdGVuZXJOYW1lOwogICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICB9CgogICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgJ05hbWUnID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICdQcmVmZXJlbmNlcycgPSAkUHJlZmVyZW5jZXM7CiAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgIH0KCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcKiIgLUZvcmNlCgogICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgYAogICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgLVVzZXJOYW1lICRVc2VyTmFtZSBgCiAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZAogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKCiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uIGFueSBTZWNvbmRhcnlOb2RlIG9ubHkuIgogICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvZmYKfQoKCgpmdW5jdGlvbiBFbmFibGUtRmlyZXdhbGwgewogICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCn0KCgo=" + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoK", + "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template b/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template index 08acb3e..999c6ec 100644 --- a/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template +++ b/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template @@ -12,10 +12,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", - "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQoKCiAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgfQogICAgfQoKICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KCiAgICBpZiAoJFNxbHBzU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTcWxwc1NldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgIH0KCiAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICR0cnVlfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICRmYWxzZX0KICAgIH0KCiAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgLVNldHVwUm9vdCAkU2V0dXBSb290IGAKICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLVNRTFN2Y1VzclBhc3N3b3JkICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkIGAKICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKCiAgICBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgLVNldHVwUm9vdCAkU3FscHNTZXR1cFJvb3QKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCgogICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5BZG1pbkFjY291bnROYW1lIiBgCiAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnSW5pdGlhbGl6ZS1BbHdheXNPbicgLi4uIgpgJFhtbEZpbGUgPSBbSU8uUGF0aF06OkNvbWJpbmUoIiRTaGFyZU5ldHdvcmtQYXRoIiwgImAkKGAkRW52OkNvbXB1dGVyTmFtZSkueG1sIikKV3JpdGUtTG9nICJPdXRwdXQgWE1MIGZpbGUgaXMgJ2AkWG1sRmlsZSciCkluaXRpYWxpemUtQWx3YXlzT24gfCBFeHBvcnQtQ2xpWG1sIC1QYXRoIGAkWG1sRmlsZQoiQCAtQ3JlZGVudGlhbCAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgLU5vQmFzZTY0Cgp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcgc2NyaXB0LiIKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFNoYXJlTmFtZSAtZXEgJycpIHsKICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgIH0KCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVQYXRoID0gJyRTaGFyZVBhdGgnIgogICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICB0cnkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIHNoYXJlICckU2hhcmVOYW1lJyIKICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICB3cml0ZS1Mb2cgIlNoYXJlICckU2hhcmVOYW1lJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJTaGFyZSAnJFNoYXJlTmFtZScgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBmb2xkZXIgJyRTaGFyZVBhdGgiCiAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgfQoKICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAKICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgIGlmICgkUHJpbWFyeU5vZGUuVG9Mb3dlcigpIC1uZSAoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkQ2xpWG1sRmlsZSAtZXEgJycpIHsKICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gNTAyMgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIlNFUlZFUl9JTlNUQU5DRSIgPSAiJE5vZGUiOwogICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAiRkFJTE9WRVJfTU9ERSI9Ik1BTlVBTCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICJOQU1FIj0kTGlzdGVuZXJOYW1lOwogICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICB9CgogICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgJ05hbWUnID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICdQcmVmZXJlbmNlcycgPSAkUHJlZmVyZW5jZXM7CiAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgIH0KCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcKiIgLUZvcmNlCgogICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgYAogICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgLVVzZXJOYW1lICRVc2VyTmFtZSBgCiAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZAogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKCiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uIGFueSBTZWNvbmRhcnlOb2RlIG9ubHkuIgogICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvZmYKfQoKCgpmdW5jdGlvbiBFbmFibGUtRmlyZXdhbGwgewogICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCn0KCgo=" + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoK", + "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InitializeAlwaysOn.template b/data/templates/agent/SqlServerCluster/InitializeAlwaysOn.template index cd3ef44..9f53f28 100644 --- a/data/templates/agent/SqlServerCluster/InitializeAlwaysOn.template +++ b/data/templates/agent/SqlServerCluster/InitializeAlwaysOn.template @@ -12,12 +12,12 @@ } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", - "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", "CmZ1bmN0aW9uIEV4cG9ydC1GdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ1tdXSAkTmFtZSwKCiAgICAgICAgW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFBhdGggPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpLAoKICAgICAgICBbU3dpdGNoXSAkQWxsCiAgICApCgogICAgaWYgKFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRQYXRoKSAtbmUgJ3BzMScpIHsKICAgICAgICAkbnVsbCA9IFJlbmFtZS1JdGVtIC1QYXRoICRQYXRoIC1OZXdOYW1lICIkUGF0aC5wczEiIC1Gb3JjZQogICAgICAgICRQYXRoID0gIiRQYXRoLnBzMSIKICAgIH0KCiAgICAkU3lzdGVtRnVuY3Rpb25zID0gQCgKICAgICAgICAnQTonLCAnQjonLCAnQzonLCAnRDonLCAnRTonLCAnRjonLCAnRzonLCAnSDonLCAnSTonLCAnSjonLAogICAgICAgICdLOicsICdMOicsICdNOicsICdOOicsICdPOicsICdQOicsICdROicsICdSOicsICdTOicsICdUOicsCiAgICAgICAgJ1U6JywgJ1Y6JywgJ1c6JywgJ1g6JywgJ1k6JywgJ1o6JywKICAgICAgICAnY2QuLicsICdjZFwnLCAnaGVscCcsICdta2RpcicsICdtb3JlJywgJ29zcycsICdwcm9tcHQnLAogICAgICAgICdDbGVhci1Ib3N0JywgJ0dldC1WZXJiJywgJ1BhdXNlJywgJ1RhYkV4cGFuc2lvbjInCiAgICApCgogICAgaWYgKCRBbGwpIHsKICAgICAgICBHZXQtQ2hpbGRJdGVtIEZ1bmN0aW9uOiB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7JF8uTW9kdWxlTmFtZSAtZXEgJyd9IHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHskU3lzdGVtRnVuY3Rpb25zIC1ub3Rjb250YWlucyAkXy5OYW1lfSB8CiAgICAgICAgICAgIEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1WYWx1ZSBAIgoKCmZ1bmN0aW9uICQoJF8uTmFtZSkgewokKCRfLlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkRnVuY3Rpb25OYW1lIGluICROYW1lKSB7CiAgICAgICAgICAgICRGdW5jdGlvbk9iamVjdCA9IEdldC1DaGlsZEl0ZW0gIkZ1bmN0aW9uOlwkRnVuY3Rpb25OYW1lIgogICAgICAgICAgICBpZiAoJEZ1bmN0aW9uT2JqZWN0IC1uZSAkbnVsbCkgewogICAgICAgICAgICAgICAgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlIEAiCgoKZnVuY3Rpb24gJEZ1bmN0aW9uTmFtZSB7CiQoJEZ1bmN0aW9uT2JqZWN0LlNjcmlwdEJsb2NrKQp9CgoiQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGF0aAp9Cg==", - "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgCiAgICAkU3RkT3V0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgJFN0ZEVyciA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKCiAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgIGlmICgkTm9CYXNlNjQpIHsKICAgICAgICAkVG1wU2NyaXB0ID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQogICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICRUbXBTY3JpcHQgPSAiJFRtcFNjcmlwdC5wczEiCgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICRUbXBTY3JpcHQKCiAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUZpbGUnLCAiJFRtcFNjcmlwdCIpCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQnl0ZXMgPSBbVGV4dC5FbmNvZGluZ106OlVuaWNvZGUuR2V0Qnl0ZXMoJENvbW1hbmQpCiAgICAgICAgJEVuY29kZWRDb21tYW5kID0gW0NvbnZlcnRdOjpUb0Jhc2U2NFN0cmluZygkQnl0ZXMpCiAgICAgICAgCiAgICAgICAgV3JpdGUtTG9nRGVidWcgJEVuY29kZWRDb21tYW5kCgogICAgICAgICRBcmd1bWVudExpc3QgKz0gQCgnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQogICAgfQoKICAgIFdyaXRlLUxvZ0RlYnVnICRBcmd1bWVudExpc3QKCiAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIGV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyAuLi4iCgogICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAtTm9OZXdXaW5kb3cgYAogICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgIC1QYXNzVGhydQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFByb2Nlc3MgPSBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAncG93ZXJzaGVsbC5leGUnIGAKICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJFN0ZEVyciBgCiAgICAgICAgICAgIC1DcmVkZW50aWFsICRDcmVkZW50aWFsIGAKICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAtUGFzc1RocnUKICAgIH0KCiAgICBXcml0ZS1Mb2cgIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBleGl0IGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJy4iCgogICAgI2lmICgkQXJndW1lbnRMaXN0IC1jb250YWlucyAnLUZpbGUnKSB7CiAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAjfQoKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2VTYXZlZCA9ICRFcnJvckFjdGlvblByZWZlcmVuY2UKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkT3V0IGZpbGUgaXMgJyRTdGRPdXQnIgogICAgV3JpdGUtTG9nRGVidWcgIlN0ZEVyciBmaWxlIGlzICckU3RkRXJyJyIKCiAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJMb2FkaW5nIFN0ZE91dCBmcm9tICckU3RkT3V0JyIKICAgICAgICAkVG1wRmlsZSA9IFNlbGVjdC1DbGlYbWxCbG9jayAkU3RkT3V0CiAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZE91dD4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgKCRTdGRPdXRPYmplY3QpCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAkU3RkT3V0T2JqZWN0CiAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgfQoKICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkRXJyIC4uLiIKICAgICAgICAkVG1wRmlsZSA9IFNlbGVjdC1DbGlYbWxCbG9jayAkU3RkRXJyCiAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPFN0ZEVycj4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgKCRTdGRFcnJPYmplY3QpCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgICAgICRTdGRFcnJPYmplY3QKICAgICAgICB9CiAgICAgICAgI1JlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgfQoKICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlU2F2ZWQKCiAgICBpZiAoJFByb2Nlc3MuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICB9CgogICAgI1JlbW92ZS1JdGVtICRTdGRPdXQgLUZvcmNlCiAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKfQo=", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQoKCiAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgfQogICAgfQoKICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KCiAgICBpZiAoJFNxbHBzU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTcWxwc1NldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgIH0KCiAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICR0cnVlfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICRmYWxzZX0KICAgIH0KCiAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgLVNldHVwUm9vdCAkU2V0dXBSb290IGAKICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLVNRTFN2Y1VzclBhc3N3b3JkICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkIGAKICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKCiAgICBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgLVNldHVwUm9vdCAkU3FscHNTZXR1cFJvb3QKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCgogICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5BZG1pbkFjY291bnROYW1lIiBgCiAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnSW5pdGlhbGl6ZS1BbHdheXNPbicgLi4uIgpgJFhtbEZpbGUgPSBbSU8uUGF0aF06OkNvbWJpbmUoIiRTaGFyZU5ldHdvcmtQYXRoIiwgImAkKGAkRW52OkNvbXB1dGVyTmFtZSkueG1sIikKV3JpdGUtTG9nICJPdXRwdXQgWE1MIGZpbGUgaXMgJ2AkWG1sRmlsZSciCkluaXRpYWxpemUtQWx3YXlzT24gfCBFeHBvcnQtQ2xpWG1sIC1QYXRoIGAkWG1sRmlsZQoiQCAtQ3JlZGVudGlhbCAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgLU5vQmFzZTY0Cgp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcgc2NyaXB0LiIKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFNoYXJlTmFtZSAtZXEgJycpIHsKICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgIH0KCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVQYXRoID0gJyRTaGFyZVBhdGgnIgogICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICB0cnkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIHNoYXJlICckU2hhcmVOYW1lJyIKICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICB3cml0ZS1Mb2cgIlNoYXJlICckU2hhcmVOYW1lJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJTaGFyZSAnJFNoYXJlTmFtZScgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBmb2xkZXIgJyRTaGFyZVBhdGgiCiAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgfQoKICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAKICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgIGlmICgkUHJpbWFyeU5vZGUuVG9Mb3dlcigpIC1uZSAoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkQ2xpWG1sRmlsZSAtZXEgJycpIHsKICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gNTAyMgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIlNFUlZFUl9JTlNUQU5DRSIgPSAiJE5vZGUiOwogICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAiRkFJTE9WRVJfTU9ERSI9Ik1BTlVBTCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICJOQU1FIj0kTGlzdGVuZXJOYW1lOwogICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICB9CgogICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgJ05hbWUnID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICdQcmVmZXJlbmNlcycgPSAkUHJlZmVyZW5jZXM7CiAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgIH0KCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcKiIgLUZvcmNlCgogICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgYAogICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgLVVzZXJOYW1lICRVc2VyTmFtZSBgCiAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZAogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKCiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uIGFueSBTZWNvbmRhcnlOb2RlIG9ubHkuIgogICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvZmYKfQoKCgpmdW5jdGlvbiBFbmFibGUtRmlyZXdhbGwgewogICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCn0KCgo=" + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyLAogICAgICAgIFtTd2l0Y2hdICROb0Jhc2U2NAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICAgICAkU3RkRXJyID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnKQoKICAgICAgICBpZiAoJE5vQmFzZTY0KSB7CiAgICAgICAgICAgICRUbXBTY3JpcHQgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAgICAgICAgIFJlbmFtZS1JdGVtIC1QYXRoICIkVG1wU2NyaXB0IiAtTmV3TmFtZSAiJFRtcFNjcmlwdC5wczEiIC1Gb3JjZQogICAgICAgICAgICAkVG1wU2NyaXB0ID0gIiRUbXBTY3JpcHQucHMxIgoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgJFRtcFNjcmlwdAoKICAgICAgICAgICAgJENvbW1hbmQgfCBPdXQtRmlsZSAkVG1wU2NyaXB0CgogICAgICAgICAgICAkQXJndW1lbnRMaXN0ICs9IEAoJy1GaWxlJywgIiRUbXBTY3JpcHQiKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEJ5dGVzID0gW1RleHQuRW5jb2RpbmddOjpVbmljb2RlLkdldEJ5dGVzKCRDb21tYW5kKQogICAgICAgICAgICAkRW5jb2RlZENvbW1hbmQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKCRCeXRlcykKICAgICAgICAgICAgCiAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICRFbmNvZGVkQ29tbWFuZAoKICAgICAgICAgICAgJEFyZ3VtZW50TGlzdCArPSBAKCctRW5jb2RlZENvbW1hbmQnLCAkRW5jb2RlZENvbW1hbmQpCiAgICAgICAgfQoKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAkQXJndW1lbnRMaXN0CgogICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgZXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIC4uLiIKCiAgICAgICAgaWYgKCRDcmVkZW50aWFsIC1lcSAkbnVsbCkgewogICAgICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAgICAgLUFyZ3VtZW50TGlzdCBAKCRBcmd1bWVudExpc3QpIGAKICAgICAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgICAgICAtV2FpdCBgCiAgICAgICAgICAgICAgICAtUGFzc1RocnUKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgJFN0ZE91dCBgCiAgICAgICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAgICAgLUNyZWRlbnRpYWwgJENyZWRlbnRpYWwgYAogICAgICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgICAgIC1QYXNzVGhydQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeHRlcm5hbCBQb3dlclNoZWxsIHByb2Nlc3MgZXhpdGVkIHdpdGggZXhpdCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKScuIgoKICAgICAgICAjaWYgKCRBcmd1bWVudExpc3QgLWNvbnRhaW5zICctRmlsZScpIHsKICAgICAgICAjICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBTY3JpcHQgLUZvcmNlCiAgICAgICAgI30KCiAgICAgICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgICAgICRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU2lsZW50bHlDb250aW51ZScKCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlN0ZE91dCBmaWxlIGlzICckU3RkT3V0JyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU3RkRXJyIGZpbGUgaXMgJyRTdGRFcnInIgoKICAgICAgICBpZiAoKEdldC1JdGVtICRTdGRPdXQpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZE91dAogICAgICAgICAgICAgICAgJFN0ZE91dE9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkT3V0PiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkT3V0T2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkT3V0PiIKICAgICAgICAgICAgICAgICRTdGRPdXRPYmplY3QKICAgICAgICAgICAgICAgICNSZW1vdmUtSXRlbSAtUGF0aCAkVG1wRmlsZSAtRm9yY2UKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIFN0ZE91dCBmcm9tICckVG1wRmlsZSciCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LUl0ZW0gJFN0ZEVycikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiTG9hZGluZyBTdGRFcnIgLi4uIgogICAgICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICAgICAgJFN0ZEVyck9iamVjdCA9IEltcG9ydC1DbGl4bWwgJFRtcEZpbGUKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8U3RkRXJyPiIKICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICgkU3RkRXJyT2JqZWN0KQogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvU3RkRXJyPiIKICAgICAgICAgICAgICAgIGlmICgtbm90ICRJZ25vcmVTdGRFcnIpIHsKICAgICAgICAgICAgICAgICAgICAkU3RkRXJyT2JqZWN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbG9hZGluZyBTdGRFcnIgZnJvbSAnJFRtcEZpbGUnIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgICAgIGlmICgkUHJvY2Vzcy5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICB0aHJvdygiRXh0ZXJuYWwgUG93ZXJTaGVsbCBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJyQoJFByb2Nlc3MuRXhpdENvZGUpJyIpCiAgICAgICAgfQoKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZE91dCAtRm9yY2UKICAgICAgICAjUmVtb3ZlLUl0ZW0gJFN0ZEVyciAtRm9yY2UKICAgIH0KfQo=", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoK" ] } \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template b/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template index 0f46c9d..78d7f8f 100644 --- a/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template +++ b/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template @@ -3,17 +3,17 @@ { "Name": "Install-SQLServerForAOAG", "Arguments": { - "SQLServiceUserPassword": "$sqlServiceAccountPassword", + "SQLServiceUserPassword": "$domainAdminAccountPassword", "SQLServiceUserDomain": "$domainName", - "SQLServiceUserName": "$sqlServiceAccountName" + "SQLServiceUserName": "$domainAdminAccountName" } } ], "Scripts": [ - "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKZnVuY3Rpb24gU2hvdy1JbnZvY2F0aW9uSW5mbyB7CiAgICBwYXJhbSAoCiAgICAgICAgJEludm9jYXRpb24sCiAgICAgICAgW1N3aXRjaF0gJEVuZAogICAgKQoKICAgIGlmICgkRW5kKSB7CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgIH0KICAgIGVsc2UgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8ZnVuY3Rpb24gbmFtZT0nJCgkSW52b2NhdGlvbi5NeUNvbW1hbmQuTmFtZSknPiIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPHBhcmFtPiIKICAgICAgICBmb3JlYWNoICgkUGFyYW1ldGVyIGluICRJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRLZXkgaW4gJFBhcmFtZXRlci5LZXlzKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICRQYXJhbWV0ZXJbJEtleV0uUGFyYW1ldGVyVHlwZS5GdWxsTmFtZQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJFZhbHVlIGluICRJbnZvY2F0aW9uLkJvdW5kUGFyYW1ldGVyc1skS2V5XSkgewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZ0RlYnVnICJbJFR5cGVdICRLZXkgPSAnJFZhbHVlJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPC9wYXJhbT4iCiAgICB9Cn0KCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K", "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", - "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXC5cZCtcLlxkK1wuXGQrL1xkK1wuXGQrXC5cZCtcLlxkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", - "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgW1N0cmluZ10gJE11cmFub0ZpbGVTaGFyZSA9ICcnLAoKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIG5hbWUKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJEb21haW4gPSAnZmMtYWNtZS5sb2NhbCcsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgZm9yIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBTUUwgc2VydmljZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUgPSAnQWRtaW5pc3RyYXRvcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgPSAnUEBzc3cwcmQnLAoKICAgICAgICBbU3dpdGNoXSAkVXBkYXRlRW5hYmxlZAogICAgKQoKCiAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAkTXVyYW5vRmlsZVNoYXJlID0gW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnTXVyYW5vRmlsZVNoYXJlJykKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgfQogICAgfQoKICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KCiAgICBpZiAoJFNxbHBzU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICRTcWxwc1NldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgIH0KCiAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgaWYgKCRVcGRhdGVFbmFibGVkKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICR0cnVlfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydVcGRhdGVFbmFibGVkJyA9ICRmYWxzZX0KICAgIH0KCiAgICBOZXctU1FMU2VydmVyRm9yQU9BRyBgCiAgICAgICAgLVNldHVwUm9vdCAkU2V0dXBSb290IGAKICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgLVNRTFN2Y1Vzck5hbWUgJFNRTFNlcnZpY2VVc2VyTmFtZSBgCiAgICAgICAgLVNRTFN2Y1VzclBhc3N3b3JkICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkIGAKICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKCiAgICBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgLVNldHVwUm9vdCAkU3FscHNTZXR1cFJvb3QKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCgogICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5BZG1pbkFjY291bnROYW1lIiBgCiAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZpbGUgJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnSW5pdGlhbGl6ZS1BbHdheXNPbicgLi4uIgpgJFhtbEZpbGUgPSBbSU8uUGF0aF06OkNvbWJpbmUoIiRTaGFyZU5ldHdvcmtQYXRoIiwgImAkKGAkRW52OkNvbXB1dGVyTmFtZSkueG1sIikKV3JpdGUtTG9nICJPdXRwdXQgWE1MIGZpbGUgaXMgJ2AkWG1sRmlsZSciCkluaXRpYWxpemUtQWx3YXlzT24gfCBFeHBvcnQtQ2xpWG1sIC1QYXRoIGAkWG1sRmlsZQoiQCAtQ3JlZGVudGlhbCAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgLU5vQmFzZTY0Cgp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcgc2NyaXB0LiIKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFNoYXJlTmFtZSAtZXEgJycpIHsKICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgIH0KCiAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVQYXRoID0gJyRTaGFyZVBhdGgnIgogICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICB0cnkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJUcnlpbmcgdG8gcmVtb3ZlIHNoYXJlICckU2hhcmVOYW1lJyIKICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICB3cml0ZS1Mb2cgIlNoYXJlICckU2hhcmVOYW1lJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJTaGFyZSAnJFNoYXJlTmFtZScgbm90IGV4aXN0cyBvciBjYW5ub3QgYmUgZGVsZXRlZC4iCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBmb2xkZXIgJyRTaGFyZVBhdGgiCiAgICAgICAgJG51bGwgPSBHZXQtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgfQoKICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAKICAgICRudWxsID0gTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYAogICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgIC1EZXNjcmlwdGlvbiAiU2hhcmVkIGZvbGRlciBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwIHNldHVwLiIKCiAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgIGlmICgkUHJpbWFyeU5vZGUuVG9Mb3dlcigpIC1uZSAoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBQcmltYXJ5Tm9kZSBvbmx5LiIKICAgICAgICBXcml0ZS1Mb2cgIkV4aXRpbmcuIgogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkQ2xpWG1sRmlsZSAtZXEgJycpIHsKICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJE5vZGUgaW4gJE5vZGVMaXN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICROb2RlRW5kcG9pbnRQb3J0ID0gNTAyMgogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIlNFUlZFUl9JTlNUQU5DRSIgPSAiJE5vZGUiOwogICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICJBVkFJTEFCSUxJVFlfTU9ERSIgPSAiQVNZTkNIUk9OT1VTX0NPTU1JVCI7CiAgICAgICAgICAgICAgICAiRkFJTE9WRVJfTU9ERSI9Ik1BTlVBTCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU3luY01vZGVOb2RlTGlzdCAtY29udGFpbnMgJE5vZGUpIHsKICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25bJ0ZBSUxPVkVSX01PREUnXSA9ICJBVVRPTUFUSUMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbkxpc3QgKz0gQCgkUmVwbGljYURlZmluaXRpb24pCiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgJExpc3RlbmVyRGVmaW5pdGlvbiA9IEB7CiAgICAgICAgICAgICJOQU1FIj0kTGlzdGVuZXJOYW1lOwogICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICJTVEFUSUMiID0gIiRMaXN0ZW5lcklQLyRMaXN0ZW5lcklQTWFzayIKICAgICAgICB9CgogICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgJ1dvcmtEaXInID0gIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIjsKICAgICAgICAgICAgJ05hbWUnID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgJ1JlcGxpY2FEZWZzJyA9ICRSZXBsaWNhRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgICAgICdQcmVmZXJlbmNlcycgPSAkUHJlZmVyZW5jZXM7CiAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgIH0KCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcKiIgLUZvcmNlCgogICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICBFeHBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlIC1JbnB1dE9iamVjdCAkUGFyYW1ldGVycyAtRGVwdGggMTAKCiAgICAgICAgSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgYAogICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGAKICAgICAgICAgICAgLVVzZXJOYW1lICRVc2VyTmFtZSBgCiAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZAogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKCiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCgogICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgV3JpdGUtTG9nICJUaGlzIGZ1bmN0aW9uIHdvcmtzIG9uIGFueSBTZWNvbmRhcnlOb2RlIG9ubHkuIgogICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgJENyZWRzID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCIKCiAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvZmYKfQoKCgpmdW5jdGlvbiBFbmFibGUtRmlyZXdhbGwgewogICAgbmV0c2ggYWR2ZmlyZXdhbGwgc2V0IGFsbHByb2ZpbGVzIHN0YXRlIG9uCn0KCgo=" + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoKEdldC1Nb2R1bGUgU1FMUFMgLUxpc3RBdmFpbGFibGUpIC1uZSAkbnVsbCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1vZHVsZSBTUUxTUCBhbHJlYWR5IGluc3RhbGxlZC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNldHVwUm9vdCAtZXEgJycpIHsKICAgICAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXFRvb2xzJykKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJEZpbGVMaXN0ID0gQCgKICAgICAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgICAgICdTaGFyZWRNYW5hZ2VtZW50T2JqZWN0cy5tc2knLAogICAgICAgICAgICAnUG93ZXJTaGVsbFRvb2xzLm1zaScKICAgICAgICApCgogICAgICAgIGZvcmVhY2ggKCRNc2lGaWxlIGluICRGaWxlTGlzdCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRyeWluZyB0byBpbnN0YWxsICckTXNpRmlsZScgLi4uIgogICAgICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgICAgIGlmIChbSU8uRmlsZV06OkV4aXN0cygkTXNpUGF0aCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RhcnRpbmcgbXNpZXhlIC4uLiIKICAgICAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL2knLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICAgICAgaWYgKCRSZXN1bHQuRXhpdENvZGUgLW5lIDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoIkluc3RhbGxhdGlvbiBvZiBNU0kgcGFja2FnZSAnJE1zaVBhdGgnIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJyQoJFJlc3VsdC5FeGl0Q29kZSknIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXJGb3JBT0FHIHsKICAgIHBhcmFtICgKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUwgZmVhdHVyZXMgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU2V0dXBSb290ID0gJycsCgogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTFBTIG1vZHVsZSBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTcWxwc1NldHVwUm9vdCA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICAkU2hhcmVOZXR3b3JrUGF0aCA9ICdcXCcgKyAkUHJpbWFyeU5vZGUgKyAnXCcgKyAkU2hhcmVOYW1lCgogICAgICAgICREb21haW5BZG1pbkFjY291bnRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGAKICAgICAgICAgICAgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkRG9tYWluQWRtaW5BY2NvdW50TmFtZSIgYAogICAgICAgICAgICAtUGFzc3dvcmQgIiREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCIKCiAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0dldC1OZXh0RnJlZVBvcnQnLCAnSW5pdGlhbGl6ZS1BbHdheXNPbicKCiAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBpZiAoJFByaW1hcnlOb2RlLlRvTG93ZXIoKSAtbmUgKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJUaGlzIHNjcmlwdCBydW5zIG9uIHByaW1hcnkgbm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nIHNjcmlwdC4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRTaGFyZU5hbWUgLWVxICcnKSB7CiAgICAgICAgICAgICRTaGFyZU5hbWUgPSBbSU8uUGF0aF06OkdldEZpbGVOYW1lV2l0aG91dEV4dGVuc2lvbigkU2hhcmVQYXRoKQogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlUGF0aCA9ICckU2hhcmVQYXRoJyIKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiU2hhcmVOYW1lID0gJyRTaGFyZU5hbWUnIgoKICAgICAgICB0cnkgewogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZSAnJFNoYXJlTmFtZSciCiAgICAgICAgICAgICRudWxsID0gR2V0LVNtYlNoYXJlIC1OYW1lICRTaGFyZU5hbWUgLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1SZWN1cnNlIC1Gb3JjZQogICAgICAgICAgICBXcml0ZS1Mb2cgIkZvbGRlciAnJFNoYXJlUGF0aCcgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiRm9sZGVyICckU2hhcmVQYXRoJyBub3QgZXhpc3RzIG9yIGNhbm5vdCBiZSBkZWxldGVkLiIKICAgICAgICB9CgogICAgICAgICRudWxsID0gTmV3LUl0ZW0gLVBhdGggJFNoYXJlUGF0aCAtSXRlbVR5cGUgQ29udGFpbmVyIC1Gb3JjZQogICAgICAgICAgICAgICAgCiAgICAgICAgJG51bGwgPSBOZXctU21iU2hhcmUgLVBhdGggJFNoYXJlUGF0aCBgCiAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYAogICAgICAgICAgICAtRnVsbEFjY2VzcyAiRXZlcnlvbmUiIGAKICAgICAgICAgICAgLURlc2NyaXB0aW9uICJTaGFyZWQgZm9sZGVyIGZvciBBbHdheXNPbiBBdmFpbGFiaWxpdHkgR3JvdXAgc2V0dXAuIgoKICAgICAgICByZXR1cm4gJ1xcJyArICRFbnY6Q29tcHV0ZXJOYW1lICsgJ1wnICsgJFNoYXJlTmFtZQogICAgfQp9CgoKCmZ1bmN0aW9uIE5ldy1EYXRhYmFzZUZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREYXRhYmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkKCiAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdJbnZva2UtU1FMVGV4dCcsICdDb252ZXJ0VG8tU1FMTmFtZScsICdDb252ZXJ0VG8tU1FMU3RyaW5nJywgJ05ldy1TUUxEYXRhYmFzZScKCiAgICBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gZmlsZSAnJEZ1bmN0aW9uc0ZpbGUnIC4uLiIKLiAiJEZ1bmN0aW9uc0ZpbGUiCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctU1FMRGF0YWJhc2UnIC4uLiIKTmV3LVNRTERhdGFiYXNlICREYXRhYmFzZU5hbWUKIkAgLUNyZWRlbnRpYWwgJENyZWRzIC1Ob0Jhc2U2NAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSA9ICdNdXJhbm9BRycsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkRGF0YWJhc2VMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTGlzdGVuZXIgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBieSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VzIGluIHRoYXQgQUcKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lck5hbWUgPSAnTXVyYW5vQUdfTGlzdGVuZXInLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICAjW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQLAoKICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJJUE1hc2sgPSAnMjU1LjI1NS4yNTUuMCcsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lclBvcnQgPSAnNTAyMycsCgogICAgICAgICMgU3luYyBNb2RlIE5vZGUgTGlzdAogICAgICAgIFtTdHJpbmdbXV0gJFN5bmNNb2RlTm9kZUxpc3QsCgogICAgICAgIFtTdHJpbmddICRTaGFyZWRXb3JrRGlyID0gJ1NoYXJlZFdvcmtEaXInLAoKICAgICAgICBbU3RyaW5nXSAkQ2xpWG1sRmlsZSA9ICcnLAoKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSZW1vdmUtSXRlbSAtUGF0aCAiXFwkUHJpbWFyeU5vZGVcU2hhcmVkV29ya0RpclwqIiAtRm9yY2UKCiAgICAgICAgICAgICRDbGlYbWxGaWxlID0gW0lPLlBhdGhdOjpHZXRUZW1wRmlsZU5hbWUoKQoKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIkNsaVhtbCBmaWxlOiAnJENsaVhtbEZpbGUnIgoKICAgICAgICAgICAgRXhwb3J0LUNsaVhtbCAtUGF0aCAkQ2xpWG1sRmlsZSAtSW5wdXRPYmplY3QgJFBhcmFtZXRlcnMgLURlcHRoIDEwCgogICAgICAgICAgICBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiSW1wb3J0aW5nIENsaVhtbCBwYXJhbWV0ZXJzIGZpbGUgLi4uIgpgJFBhcmFtZXRlcnMgPSBJbXBvcnQtQ2xpWG1sIC1QYXRoICRDbGlYbWxGaWxlCgpXcml0ZS1Mb2cgIlN0YXJ0aW5nICdOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCcgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCBgYAogICAgLVdvcmtEaXIgYCRQYXJhbWV0ZXJzWydXb3JrRGlyJ10gYGAKICAgIC1OYW1lIGAkUGFyYW1ldGVyc1snTmFtZSddIGBgCiAgICAtRGF0YWJhc2VOYW1lcyBgJFBhcmFtZXRlcnNbJ0RhdGFiYXNlTmFtZXMnXSBgYAogICAgLVJlcGxpY2FEZWZzIGAkUGFyYW1ldGVyc1snUmVwbGljYURlZnMnXSBgYAogICAgLVByZWZlcmVuY2VzIGAkUGFyYW1ldGVyc1snUHJlZmVyZW5jZXMnXSBgYAogICAgLUxpc3RlbmVyRGVmIGAkUGFyYW1ldGVyc1snTGlzdGVuZXJEZWYnXQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICAgICAgfQogICAgfQp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1NlY29uZGFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhcyByZXBsaWNhIHBhcnRuZXJzLgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApIAogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmcm9tICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYScgLi4uIgpOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cFJlcGxpY2EgLVdvcmtEaXIgIlxcJFByaW1hcnlOb2RlXCRTaGFyZWRXb3JrRGlyIgoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0CiAgICB9Cn0KCgoKZnVuY3Rpb24gRGlzYWJsZS1GaXJld2FsbCB7CiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIG5ldHNoIGFkdmZpcmV3YWxsIHNldCBhbGxwcm9maWxlcyBzdGF0ZSBvbgogICAgfQp9CgoK" ] } \ No newline at end of file diff --git a/data/workflows/AD.xml b/data/workflows/AD.xml index a4669e1..9560585 100644 --- a/data/workflows/AD.xml +++ b/data/workflows/AD.xml @@ -207,6 +207,9 @@ + ( diff --git a/data/workflows/ExternalAD.xml.example b/data/workflows/ExternalAD.xml.example index bcd6aad..7af6180 100644 --- a/data/workflows/ExternalAD.xml.example +++ b/data/workflows/ExternalAD.xml.example @@ -74,6 +74,9 @@ + ( diff --git a/data/workflows/MsSqlCluster.xml b/data/workflows/MsSqlCluster.xml index 20ecf3f..4c21262 100644 --- a/data/workflows/MsSqlCluster.xml +++ b/data/workflows/MsSqlCluster.xml @@ -141,6 +141,9 @@ + @@ -164,21 +167,6 @@ - - - - - - - - + + +