From ab7a9305ce0bf72bfc0eecdeae0f1d52db52fc85 Mon Sep 17 00:00:00 2001 From: Stan Lagun Date: Fri, 2 Aug 2013 17:09:59 +0400 Subject: [PATCH] SQL Server Cluster workflow Change-Id: I1287f35d756f2ea3937e7711872ad8bd073a0c87 --- .../ConfigureEnvironmentForAOAG.template | 18 ++ .../SqlServerCluster/FailoverCluster.template | 31 ++ .../FailoverClusterPrerequisites.template | 13 + .../InitializeAOAGPrimaryReplica.template | 23 ++ .../InitializeAOAGSecondaryReplica.template | 18 ++ .../InstallSqlServerForAOAG.template | 19 ++ data/workflows/AD.xml | 9 +- data/workflows/MsSqlCluster.xml | 292 ++++++++++++++++++ data/workflows/MsSqlServer.xml | 6 +- muranoconductor/workflow.py | 21 +- 10 files changed, 441 insertions(+), 9 deletions(-) create mode 100644 data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template create mode 100644 data/templates/agent/SqlServerCluster/FailoverCluster.template create mode 100644 data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template create mode 100644 data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template create mode 100644 data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template create mode 100644 data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template create mode 100644 data/workflows/MsSqlCluster.xml diff --git a/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template b/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template new file mode 100644 index 0000000..c3dcf80 --- /dev/null +++ b/data/templates/agent/SqlServerCluster/ConfigureEnvironmentForAOAG.template @@ -0,0 +1,18 @@ +{ + "Commands": [ + { + "Name": "New-SqlServerSystemAccount", + "Arguments": { + "UserName": "$domainAdminAccountName", + "SQLServiceUserPassword": "$sqlServiceAccountPassword", + "UserPassword": "$domainAdminAccountPassword", + "DomainName": "$domainName", + "SQLServiceUserName": "$sqlServiceAccountName" + } + } + ], + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkCiAgICApCn0K" + ] +} \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/FailoverCluster.template b/data/templates/agent/SqlServerCluster/FailoverCluster.template new file mode 100644 index 0000000..32fcf66 --- /dev/null +++ b/data/templates/agent/SqlServerCluster/FailoverCluster.template @@ -0,0 +1,31 @@ +{ + "Commands": [ + { + "Name": "New-FailoverCluster", + "Arguments": { + "ClusterName": "$clusterName", + "ClusterNodes": "$clusterNodes", + "UserPassword": "$domainAdminAccountPassword", + "UserName": "$domainAdminAccountName", + "StaticAddress": "$clusterIP" + } + }, + { + "Name": "New-SqlServerSystemAccount", + "Arguments": { + "UserName": "$domainAdminAccountName", + "SQLServiceUserPassword": "$sqlServiceAccountPassword", + "UserPassword": "$domainAdminAccountPassword", + "DomainName": "$domainName", + "SQLServiceUserName": "$sqlServiceAccountName" + } + } + ], + "RebootOnCompletion": 0, + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "CmZ1bmN0aW9uIE5ldy1TcWxTZXJ2ZXJTeXN0ZW1BY2NvdW50IHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgRG9tYWluIE5hbWUKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBVc2VyIG5hbWUgd2hvIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSB1c2VyUGFzc3dvcmQKICAgICAgICAjIFVzdWFsbHkgdGhpcyBpcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgJyRkb21haW5OYW1lXEFkbWluaXN0cmF0b3InIGFjY291bnQKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciBhIG5ldyBhY2NvdW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biBTUUwgU2VydmVyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlck5hbWUsCgogICAgICAgICMgKFJFUVVJUkVEKSBQYXNzd29yZCBmb3IgdGhhdCB1c2VyCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkCiAgICApCn0K", + "CmZ1bmN0aW9uIFNlbGVjdC1DbGlYbWxCbG9jayB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFBhdGgsCiAgICAgICAgW1N0cmluZ10gJE91dEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICApCgogICAgJFRhZ0ZvdW5kID0gJGZhbHNlCiAgICBHZXQtQ29udGVudCAkUGF0aCB8CiAgICAgICAgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICBpZiAoJF8gLWVxICcjPCBDTElYTUwnKSB7CiAgICAgICAgICAgICAgICAkVGFnRm91bmQgPSAkdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkVGFnRm91bmQpIHsKICAgICAgICAgICAgICAgIEFkZC1Db250ZW50IC1QYXRoICRPdXRGaWxlIC1WYWx1ZSAkXwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgJE91dEZpbGUKfQoKCgpmdW5jdGlvbiBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJENvbW1hbmQsCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbCwKICAgICAgICBbU3dpdGNoXSAkSWdub3JlU3RkRXJyCiAgICApCiAgICAKICAgICRCeXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkQ29tbWFuZCkKICAgICRFbmNvZGVkQ29tbWFuZCA9IFtDb252ZXJ0XTo6VG9CYXNlNjRTdHJpbmcoJEJ5dGVzKQoKICAgIFdyaXRlLUhvc3QgJEVuY29kZWRDb21tYW5kCgogICAgJFN0ZE91dCA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICRTdGRFcnIgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkQXJndW1lbnRMaXN0ID0gQCgnLU91dHB1dEZvcm1hdCcsICdYTUwnLCAnLUVuY29kZWRDb21tYW5kJywgJEVuY29kZWRDb21tYW5kKQoKICAgIGlmICgkQ3JlZGVudGlhbCAtZXEgJG51bGwpIHsKICAgICAgICAkUHJvY2VzcyA9IFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdwb3dlcnNoZWxsLmV4ZScgYAogICAgICAgICAgICAtQXJndW1lbnRMaXN0IEAoJEFyZ3VtZW50TGlzdCkgYAogICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZE91dHB1dCAkU3RkT3V0IGAKICAgICAgICAgICAgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkU3RkRXJyIGAKICAgICAgICAgICAgLU5vTmV3V2luZG93IGAKICAgICAgICAgICAgLVdhaXQgYAogICAgICAgICAgICAtUGFzc1RocnUKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQcm9jZXNzID0gU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJ3Bvd2Vyc2hlbGwuZXhlJyBgCiAgICAgICAgICAgIC1Bcmd1bWVudExpc3QgQCgkQXJndW1lbnRMaXN0KSBgCiAgICAgICAgICAgIC1SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ICRTdGRPdXQgYAogICAgICAgICAgICAtUmVkaXJlY3RTdGFuZGFyZEVycm9yICRTdGRFcnIgYAogICAgICAgICAgICAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbCBgCiAgICAgICAgICAgIC1Ob05ld1dpbmRvdyBgCiAgICAgICAgICAgIC1XYWl0IGAKICAgICAgICAgICAgLVBhc3NUaHJ1CiAgICB9CgogICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZQogICAgJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTaWxlbnRseUNvbnRpbnVlJwoKICAgIFdyaXRlLUxvZyAiU3RkT3V0IGZpbGUgaXMgJyRTdGRPdXQnIgogICAgV3JpdGUtTG9nICJTdGRFcnIgZmlsZSBpcyAnJFN0ZEVyciciCgogICAgU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQgCgogICAgaWYgKChHZXQtSXRlbSAkU3RkT3V0KS5MZW5ndGggLWd0IDApIHsKICAgICAgICBXcml0ZS1Mb2cgIkxvYWRpbmcgU3RkT3V0IGZyb20gJyRTdGRPdXQnIgogICAgICAgICRUbXBGaWxlID0gU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRPdXQKICAgICAgICBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgUmVtb3ZlLUl0ZW0gLVBhdGggJFRtcEZpbGUgLUZvcmNlCiAgICB9CgogICAgU2VsZWN0LUNsaVhtbEJsb2NrICRTdGRFcnIKCiAgICBpZiAoLW5vdCAkSWdub3JlU3RkRXJyKSB7CiAgICAgICAgaWYgKChHZXQtSXRlbSAkU3RkRXJyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJMb2FkaW5nIFN0ZEVyciBmcm9tICckU3RkRXJyJyIKICAgICAgICAgICAgJFRtcEZpbGUgPSBTZWxlY3QtQ2xpWG1sQmxvY2sgJFN0ZEVycgogICAgICAgICAgICBJbXBvcnQtQ2xpeG1sICRUbXBGaWxlCiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1QYXRoICRUbXBGaWxlIC1Gb3JjZQogICAgICAgIH0KICAgIH0KCiAgICAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJEVycm9yQWN0aW9uUHJlZmVyZW5jZVNhdmVkCgogICAgaWYgKCRQcm9jZXNzLkV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3coIkV4dGVybmFsIFBvd2VyU2hlbGwgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICckKCRQcm9jZXNzLkV4aXRDb2RlKSciKQogICAgfQoKICAgICNSZW1vdmUtSXRlbSAkU3RkT3V0IC1Gb3JjZQogICAgI1JlbW92ZS1JdGVtICRTdGRFcnIgLUZvcmNlCn0K", + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGgsDQoJCVtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbA0KCSkNCiAgICANCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgIH0NCg0KICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICApDQoNCiAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KCQlbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQoJCVtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KCQlbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwNCgkpDQoNCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KCWlmICgoR2V0LUNsdXN0ZXIgJENsdXN0ZXJOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCk5ldy1DbHVzdGVyIC1OYW1lICckQ2x1c3Rlck5hbWUnIC1TdGF0aWNBZGRyZXNzICckU3RhdGljQWRkcmVzcycNCiJAIC1DcmVkZW50aWFsICRDcmVkZW50aWFsDQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgIH0NCg0KICAgIGZvcmVhY2ggKCROb2RlIGluICRDbHVzdGVyTm9kZXMpIHsNCiAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCkFkZC1DbHVzdGVyTm9kZSAtQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyAtTmFtZSAnJE5vZGUnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgV3JpdGUtTG9nICJOb2RlICckTm9kZScgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGNsdXN0ZXIgJyRDbHVzdGVyTmFtZScuIg0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCg0KPCMNCg0KIyBFeGFtcGxlDQoNCiREb21haW5OYW1lID0gJ2ZjLWFjbWUubG9jYWwnDQokRG9tYWluVXNlciA9ICdBZG1pbmlzdHJhdG9yJw0KJERvbWFpblBhc3N3b3JkID0gJ1BAc3N3MHJkJw0KDQokQ2x1c3Rlck5hbWUgPSAnZmMtdGVzdCcNCiRDbHVzdGVySVAgPSAnMTAuMjAwLjAuNjAnDQokQ2x1c3Rlck5vZGVzID0gQCgnZmMtbm9kZS0wMScsJ2ZjLW5vZGUtMDInLCdmYy1ub2RlLTAzJykNCg0KJFNoYXJlU2VydmVyID0gJ2ZjLWRjLTAxJw0KJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJw0KDQokU2hhcmVQYXRoID0gIkM6XCRTaGFyZU5hbWUiDQoNCg0KDQpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMgLUZvcmNlDQoNCiRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGANCiAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5Vc2VyIiBgDQogICAgLVBhc3N3b3JkICIkRG9tYWluUGFzc3dvcmQiDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1TdGF0aWNBZGRyZXNzICRDbHVzdGVySVAgYA0KICAgIC1DbHVzdGVyTm9kZXMgJENsdXN0ZXJOb2RlcyBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGANCiAgICAtU2hhcmVTZXJ2ZXIgJFNoYXJlU2VydmVyIGANCiAgICAtU2hhcmVQYXRoICIkU2hhcmVQYXRoIiBgDQogICAgLVNoYXJlTmFtZSAiJFNoYXJlTmFtZSIgYA0KICAgIC1DcmVkZW50aWFsICRDcmVkcw0KDQojPg0K" + ] +} \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template b/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template new file mode 100644 index 0000000..731a3e4 --- /dev/null +++ b/data/templates/agent/SqlServerCluster/FailoverClusterPrerequisites.template @@ -0,0 +1,13 @@ +{ + "Commands": [ + { + "Name": "Install-FailoverClusterPrerequisites", + "Arguments": {} + } + ], + "RebootOnCompletion": 0, + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "PCMNCi5ERVNDUklQVElPTg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIElucHV0IERhdGEgKGZyb20gdGhlIFVJKQ0KDQoqIERvbWFpbiBNZW1iZXJzaGlwDQogICAgLSBbU3RyaW5nXSAvIFtTZWxlY3QgYm94XSAkRG9tYWluTmFtZSAtIERvbWFpbiBuYW1lDQoqIERvbWFpbiBVc2VyIENyZWRlbnRpYWxzDQogICAgLSBbU3RyaW5nXSAkVXNlck5hbWUgLSBVc2VybmFtZQ0KICAgIC0gW1Bhc3N3b3JkIHN0cmluZ10gJFVzZXJQYXNzd29yZCAtIFVzZXIgcGFzc3dvcmQNCiogU2hhcmVkIEZvbGRlciBJbmZvcm1hdGlvbg0KICAgIC0gW1N0cmluZ10gJFNoYXJlU2VydmVyIC0gU2VydmVyIHdoaWNoIHdpbGwgaG9zdCB0aGUgZm9sZGVyDQogICAgLSBbU3RyaW5nXSAkU2hhcmVOYW1lIC0gU2hhcmUgbmFtZQ0KICAgIC0gW1N0cmluZ10gJFNoYXJlUGF0aCAtIFNoYXJlZCBmb2xkZXIgaW50ZXJuYWwgcGF0aA0KKiBGYWlsb3ZlciBDbHVzdGVyIE1lbWJlcnMNCiAgICAtIFtTdHJpbmddICRDbHVzdGVyTmFtZSAtIENsdXN0ZXIgbmFtZQ0KICAgIC0gW1N0cmluZ10gJENsdXN0ZXJJUCAtIFN0YXRpYyBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY2x1c3Rlcg0KICAgIC0gW1N0cmluZ1tdXSAkQ2x1c3Rlck5vZGVzIC0gTGlzdCBvZiBub2RlIG5hbWVzDQoNCg0KDQojIyBGYWlsb3ZlciBDbHVzdGVyIGNyZWF0aW9uIHdvcmtmbG93DQoNCiogQ3JlYXRlIEFEIGRvbWFpbg0KKiBKb2luIGFsbCB0aGUgVk1zIHRvIHRoYXQgZG9tYWluDQoqIFByZXBhcmUgbm9kZXMNCiAgICAtIEluc3RhbGwgRmFpbG92ZXIgQ2x1c3RlciBwcmVyZXF1aXNpdGVzIG9uIGFsbCBGQyBub2Rlcw0KKiBDcmVhdGUgZmFpbG92ZXIgY2x1c3Rlcg0KICAgIC0gQ3JlYXRlIG5ldyBjbHVzdGVyDQogICAgLSBBZGQgbWVtYmVycw0KKiBDb25mdWd1cmUgRkMgcXVvcnVtDQogICAgLSBDcmVhdGUgbmV3IGZvbGRlciB0aGF0IHdpbGwgYmUgc2hhcmVkDQogICAgLSBTaGFyZSB0aGF0IGZvbGRlciB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zDQogICAgLSBDb25maWd1cmUgcXVvcnVtIG1vZGUNCg0KDQoNCiMjIEhlbHBmdWwgU21iU2hhcmUqIEZ1bmN0aW9ucw0KDQoqIE5ldy1TbWJTaGFyZQ0KKiBHcmFudC1TbWJTaGFyZUFjY2Vzcw0KDQojPg0KDQoNCg0KZnVuY3Rpb24gSW5zdGFsbC1GYWlsb3ZlckNsdXN0ZXJQcmVyZXF1aXNpdGVzIHsNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KICAgIEFkZC1XaW5kb3dzRmVhdHVyZSBGYWlsb3Zlci1DbHVzdGVyaW5nLCBSU0FULUNsdXN0ZXJpbmctUG93ZXJTaGVsbA0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlclNoYXJlZEZvbGRlciB7DQoJcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLA0KICAgICAgICBbU3RyaW5nXSAkU2hhcmVTZXJ2ZXIsDQoJCVtTdHJpbmddICRTaGFyZVBhdGgsDQoJCVtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwgPSAkbnVsbA0KCSkNCiAgICANCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBpZiAoKFRlc3QtQ29ubmVjdGlvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ291bnQgMSAtUXVpZXQpIC1lcSAkZmFsc2UpIHsNCiAgICAgICAgdGhyb3coIlNlcnZlciAnJFNoYXJlU2VydmVyJyBpcyB1bnJlYWNoYWJsZSB2aWEgSUNNUC4iKQ0KICAgIH0NCg0KICAgICRTZXNzaW9uID0gTmV3LVBTU2Vzc2lvbiAtQ29tcHV0ZXJOYW1lICRTaGFyZVNlcnZlciAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KDQogICAgSW52b2tlLUNvbW1hbmQgLVNlc3Npb24gJFNlc3Npb24gLVNjcmlwdEJsb2NrIHsNCiAgICAgICAgICAgIHBhcmFtICgNCiAgICAgICAgICAgICAgICBbU3RyaW5nXSAkU2hhcmVQYXRoLA0KICAgICAgICAgICAgICAgIFtTdHJpbmddICRTaGFyZU5hbWUsDQogICAgICAgICAgICAgICAgW1N0cmluZ10gJENsdXN0ZXJBY2NvdW50DQogICAgICAgICAgICApDQoNCiAgICAgICAgICAgIE5ldy1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUl0ZW1UeXBlIENvbnRhaW5lciAtRm9yY2UNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgTmV3LVNtYlNoYXJlIC1QYXRoICRTaGFyZVBhdGggYA0KICAgICAgICAgICAgICAgIC1OYW1lICRTaGFyZU5hbWUgYA0KICAgICAgICAgICAgICAgIC1GdWxsQWNjZXNzICIkQ2x1c3RlckFjY291bnQiIGANCiAgICAgICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEZhaWxvdmVyIENsdXN0ZXIuIg0KDQogICAgICAgIH0gLUFyZ3VtZW50TGlzdCAkU2hhcmVQYXRoLCAkU2hhcmVOYW1lLCAiJERvbWFpbk5hbWVcJENsdXN0ZXJOYW1lYCQiDQoNCiAgICBTZXQtQ2x1c3RlclF1b3J1bSAtTm9kZUFuZEZpbGVTaGFyZU1ham9yaXR5ICJcXCRTaGFyZVNlcnZlclwkU2hhcmVOYW1lIg0KfQ0KDQoNCg0KZnVuY3Rpb24gTmV3LUZhaWxvdmVyQ2x1c3RlciB7DQoJcGFyYW0gKA0KCQlbU3RyaW5nXSAkQ2x1c3Rlck5hbWUsDQoJCVtTdHJpbmddICRTdGF0aWNBZGRyZXNzLA0KCQlbU3RyaW5nW11dICRDbHVzdGVyTm9kZXMsDQogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwNCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZCwNCiAgICAgICAgJENyZWRlbnRpYWwNCgkpDQoNCiAgICBpZiAoJENyZWRlbnRpYWwgLWVxICRudWxsKSB7DQogICAgICAgICRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAiJFVzZXJQYXNzd29yZCINCiAgICB9DQoNCiAgICBJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCg0KCWlmICgoR2V0LUNsdXN0ZXIgJENsdXN0ZXJOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSAtZXEgJG51bGwpIHsNCiAgICAgICAgV3JpdGUtTG9nICJDcmVhdGluZyBuZXcgY2x1c3RlciAnJENsdXN0ZXJOYW1lJyAuLi4iDQogICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCk5ldy1DbHVzdGVyIC1OYW1lICckQ2x1c3Rlck5hbWUnIC1TdGF0aWNBZGRyZXNzICckU3RhdGljQWRkcmVzcycNCiJAIC1DcmVkZW50aWFsICRDcmVkZW50aWFsDQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDE1DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBXcml0ZS1Mb2cgIkNsdXN0ZXIgJyRDbHVzdGVyTmFtZScgYWxyZWFkeSBleGlzdHMuIg0KICAgIH0NCg0KICAgIGZvcmVhY2ggKCROb2RlIGluICRDbHVzdGVyTm9kZXMpIHsNCiAgICAgICAgaWYgKChHZXQtQ2x1c3Rlck5vZGUgJE5vZGUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUpIC1lcSAkbnVsbCkgew0KICAgICAgICAgICAgV3JpdGUtTG9nICJBZGRpbmcgbm9kZSAnJE5vZGUnIHRvIHRoZSBjbHVzdGVyICckQ2x1c3Rlck5hbWUnIC4uLiINCiAgICAgICAgICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIC1Db21tYW5kIEAiDQpJbXBvcnQtTW9kdWxlIEZhaWxvdmVyQ2x1c3RlcnMNCkFkZC1DbHVzdGVyTm9kZSAtQ2x1c3RlciAnJENsdXN0ZXJOYW1lJyAtTmFtZSAnJE5vZGUnDQoiQCAtQ3JlZGVudGlhbCAkQ3JlZGVudGlhbA0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgV3JpdGUtTG9nICJOb2RlICckTm9kZScgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGNsdXN0ZXIgJyRDbHVzdGVyTmFtZScuIg0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCg0KPCMNCg0KIyBFeGFtcGxlDQoNCiREb21haW5OYW1lID0gJ2ZjLWFjbWUubG9jYWwnDQokRG9tYWluVXNlciA9ICdBZG1pbmlzdHJhdG9yJw0KJERvbWFpblBhc3N3b3JkID0gJ1BAc3N3MHJkJw0KDQokQ2x1c3Rlck5hbWUgPSAnZmMtdGVzdCcNCiRDbHVzdGVySVAgPSAnMTAuMjAwLjAuNjAnDQokQ2x1c3Rlck5vZGVzID0gQCgnZmMtbm9kZS0wMScsJ2ZjLW5vZGUtMDInLCdmYy1ub2RlLTAzJykNCg0KJFNoYXJlU2VydmVyID0gJ2ZjLWRjLTAxJw0KJFNoYXJlTmFtZSA9ICdGQ1NoYXJlJw0KDQokU2hhcmVQYXRoID0gIkM6XCRTaGFyZU5hbWUiDQoNCg0KDQpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMgLUZvcmNlDQoNCiRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIGANCiAgICAtVXNlck5hbWUgIiREb21haW5OYW1lXCREb21haW5Vc2VyIiBgDQogICAgLVBhc3N3b3JkICIkRG9tYWluUGFzc3dvcmQiDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1TdGF0aWNBZGRyZXNzICRDbHVzdGVySVAgYA0KICAgIC1DbHVzdGVyTm9kZXMgJENsdXN0ZXJOb2RlcyBgDQogICAgLUNyZWRlbnRpYWwgJENyZWRzDQoNCk5ldy1GYWlsb3ZlckNsdXN0ZXJTaGFyZWRGb2xkZXIgYA0KICAgIC1DbHVzdGVyTmFtZSAkQ2x1c3Rlck5hbWUgYA0KICAgIC1Eb21haW5OYW1lICREb21haW5OYW1lIGANCiAgICAtU2hhcmVTZXJ2ZXIgJFNoYXJlU2VydmVyIGANCiAgICAtU2hhcmVQYXRoICIkU2hhcmVQYXRoIiBgDQogICAgLVNoYXJlTmFtZSAiJFNoYXJlTmFtZSIgYA0KICAgIC1DcmVkZW50aWFsICRDcmVkcw0KDQojPg0K" + ] +} \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template b/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template new file mode 100644 index 0000000..eb7ccea --- /dev/null +++ b/data/templates/agent/SqlServerCluster/InitializeAOAGPrimaryReplica.template @@ -0,0 +1,23 @@ +{ + "Commands": [ + { + "Name": "Initialize-AOAGPrimaryReplica", + "Arguments": { + "GroupName": "$groupName", + "NodeList": "$nodeList", + "PrimaryNode": "$primaryNode", + "SyncModeNodeList": "$syncModeNodeList", + "ListenerIP": "$listenerIP", + "DatabaseList": "$databaseList", + "ListenerName": "$listenerName" + } + } + ], + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", + "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL28nLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJwoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCgoKICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXDIwMTInKQogICAgfQoKICAgIGlmICgkU3FscHNTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNxbHBzU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcVG9vbHMnKQogICAgfQoKICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICBpZiAoJFVwZGF0ZUVuYWJsZWQpIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgfQoKICAgIE5ldy1TUUxTZXJ2ZXJGb3JBT0FHIGAKICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAtU1FMU3ZjVXNyTmFtZSAkU1FMU2VydmljZVVzZXJOYW1lIGAKICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwoKICAgIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSAtU2V0dXBSb290ICRTcWxwc1NldHVwUm9vdAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICREYXRhYmFzZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBMaXN0ZW5lciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gY29ubmVjdCB0byBkYXRhYmFzZXMgaW4gdGhhdCBBRwogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVAKICAgICkKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdTZWNvbmRhcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUKICAgICkKfQoK" + ] +} \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template b/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template new file mode 100644 index 0000000..6fb9f62 --- /dev/null +++ b/data/templates/agent/SqlServerCluster/InitializeAOAGSecondaryReplica.template @@ -0,0 +1,18 @@ +{ + "Commands": [ + { + "Name": "Initialize-AOAGSecondaryReplica", + "Arguments": { + "NodeList": "$nodeList", + "PrimaryNode": "$primaryNode" + } + } + ], + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", + "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL28nLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJwoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCgoKICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXDIwMTInKQogICAgfQoKICAgIGlmICgkU3FscHNTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNxbHBzU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcVG9vbHMnKQogICAgfQoKICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICBpZiAoJFVwZGF0ZUVuYWJsZWQpIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgfQoKICAgIE5ldy1TUUxTZXJ2ZXJGb3JBT0FHIGAKICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAtU1FMU3ZjVXNyTmFtZSAkU1FMU2VydmljZVVzZXJOYW1lIGAKICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwoKICAgIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSAtU2V0dXBSb290ICRTcWxwc1NldHVwUm9vdAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICREYXRhYmFzZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBMaXN0ZW5lciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gY29ubmVjdCB0byBkYXRhYmFzZXMgaW4gdGhhdCBBRwogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVAKICAgICkKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdTZWNvbmRhcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUKICAgICkKfQoK" + ] +} \ No newline at end of file diff --git a/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template b/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template new file mode 100644 index 0000000..1bb398d --- /dev/null +++ b/data/templates/agent/SqlServerCluster/InstallSqlServerForAOAG.template @@ -0,0 +1,19 @@ +{ + "Commands": [ + { + "Name": "Install-SQLServerForAOAG", + "Arguments": { + "SQLServiceUserPassword": "$sqlServiceAccountPassword", + "SQLServiceUserDomain": "$domainName", + "SQLServiceUserName": "$sqlServiceAccountName" + } + } + ], + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=", + "ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==", + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIikgKyAkRXh0cmFGZWF0dXJlczsKICAgICAgICAiQUdUU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFHVFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIkFTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVU2VyOwogICAgICAgICJTUUxTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiU1FMU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVXNlcjsgIklTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIklTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAKICAgICAgICAiUlNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiUlNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmR9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdAogICAgKQoKICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgV3JpdGUtTG9nICJNb2R1bGUgU1FMU1AgYWxyZWFkeSBpbnN0YWxsZWQuIgogICAgICAgIHJldHVybgogICAgfQoKICAgICRGaWxlTGlzdCA9IEAoCiAgICAgICAgJ1NRTFN5c0NsclR5cGVzLm1zaScsCiAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgJ1Bvd2VyU2hlbGxUb29scy5tc2knCiAgICApCgogICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgV3JpdGUtTG9nICJUcnlpbmcgdG8gaW5zdGFsbCAnJE1zaUZpbGUnIC4uLiIKICAgICAgICAkTXNpUGF0aCA9IEpvaW4tUGF0aCAkU2V0dXBSb290ICRNc2lGaWxlCiAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlN0YXJ0aW5nIG1zaWV4ZSAuLi4iCiAgICAgICAgICAgICRSZXN1bHQgPSBFeGVjIC1GaWxlUGF0aCAibXNpZXhlYy5leGUiIC1Bcmd1bWVudExpc3QgQCgnL28nLCAiYCIkTXNpUGF0aGAiIiwgJy9xdWlldCcpIC1QYXNzVGhydQogICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgKCJJbnN0YWxsYXRpb24gb2YgTVNJIHBhY2thZ2UgJyRNc2lQYXRoJyBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICckKCRSZXN1bHQuRXhpdENvZGUpJyIpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRmlsZSAnJE1zaVBhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgfQp9Cgo=", + "CmZ1bmN0aW9uIEluc3RhbGwtU3FsU2VydmVyRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMIGZlYXR1cmVzIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNldHVwUm9vdCA9ICcnLAoKICAgICAgICAjIFBhdGggdG8gZm9sZGVyIHdoZXJlIG1zaSBmaWxlcyBmb3IgYWRkaXRpb25hbCBTUUxQUyBtb2R1bGUgYXJlIGxvY2F0ZWQKICAgICAgICBbU3RyaW5nXSAkU3FscHNTZXR1cFJvb3QgPSAnJwoKICAgICAgICBbU3RyaW5nXSAkTXVyYW5vRmlsZVNoYXJlID0gJycsCgogICAgICAgICMgKFJFUVVJUkVEKSBEb21haW4gbmFtZQogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlckRvbWFpbiA9ICdmYy1hY21lLmxvY2FsJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFVzZXIgbmFtZSBmb3IgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IFNRTCBzZXJ2aWNlCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyTmFtZSA9ICdBZG1pbmlzdHJhdG9yJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIFBhc3N3b3JkIGZvciB0aGF0IHVzZXIKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJQYXNzd29yZCA9ICdQQHNzdzByZCcsCgogICAgICAgIFtTd2l0Y2hdICRVcGRhdGVFbmFibGVkCiAgICApCgoKICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICB0aHJvdygiVW5hYmxlIHRvIGZpbmQgTXVyYW5vRmlsZVNoYXJlIHBhdGguIikKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNldHVwUm9vdCA9IFtJTy5QYXRoXTo6Q29tYmluZSgkTXVyYW5vRmlsZVNoYXJlLCAnUHJlcmVxdWlzaXRlc1xTUUwgU2VydmVyXDIwMTInKQogICAgfQoKICAgIGlmICgkU3FscHNTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgJFNxbHBzU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcVG9vbHMnKQogICAgfQoKICAgICRFeHRyYU9wdGlvbnMgPSBAe30KCiAgICBpZiAoJFVwZGF0ZUVuYWJsZWQpIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgfQoKICAgIE5ldy1TUUxTZXJ2ZXJGb3JBT0FHIGAKICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgIC1TUUxTdmNVc3JEb21haW4gJFNRTFNlcnZpY2VVc2VyRG9tYWluIGAKICAgICAgICAtU1FMU3ZjVXNyTmFtZSAkU1FMU2VydmljZVVzZXJOYW1lIGAKICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgIC1FeHRyYU9wdGlvbnMgJEV4dHJhT3B0aW9ucwoKICAgIEluc3RhbGwtU3FsU2VydmVyUG93ZXJTaGVsbE1vZHVsZSAtU2V0dXBSb290ICRTcWxwc1NldHVwUm9vdAp9CgoKCmZ1bmN0aW9uIEluaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChPUFRJT05BTCkgTmFtZSBvZiB0aGUgbmV3IEF2YWlsYWJpbGl0eSBHcm91cC4gSWYgbm90IHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgbmFtZSB3aWxsIGJlIHVzZWQuCiAgICAgICAgW1N0cmluZ10gJEdyb3VwTmFtZSwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICAjIChSRVFVSVJFRCkgRGF0YWJhc2UgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICREYXRhYmFzZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBMaXN0ZW5lciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gY29ubmVjdCB0byBkYXRhYmFzZXMgaW4gdGhhdCBBRwogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkTGlzdGVuZXJOYW1lLAoKICAgICAgICAjIChSRVFVSVJFRCkgSVAgYWRkcmVzcyBvZiB0aGUgbGlzdGVuZXIKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVAKICAgICkKfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFPQUdTZWNvbmRhcnlSZXBsaWNhIHsKICAgIHBhcmFtICgKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYXMgcmVwbGljYSBwYXJ0bmVycy4KICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ1tdXSAkTm9kZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBOb2RlIG5hbWUgdGhhdCB3aWxsIGJlIHByaW1hcnkgZm9yIHNlbGVjdGVkIEF2YWlsYWJpbGl0eSBHcm91cAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUKICAgICkKfQoK" + ] +} \ No newline at end of file diff --git a/data/workflows/AD.xml b/data/workflows/AD.xml index ea2dcf3..6ee8c67 100644 --- a/data/workflows/AD.xml +++ b/data/workflows/AD.xml @@ -161,7 +161,7 @@ ( + Unit ) has left domain - + /$.services[?(@.type == 'activeDirectory' and @.domain == ' @@ -197,7 +196,9 @@ + diff --git a/data/workflows/MsSqlCluster.xml b/data/workflows/MsSqlCluster.xml new file mode 100644 index 0000000..7020ba9 --- /dev/null +++ b/data/workflows/MsSqlCluster.xml @@ -0,0 +1,292 @@ + + + + + + Creating instance ) + + + + + + + + + + + + + + + + ( + + + /$.services[?(@.type == 'activeDirectory' and @.domain == ' + + + + + + + + + + + + + + Failover cluster prerequisites installed on unit ) + + + + + + + + + + + + + + + + + + + + + + + + Failover cluster created for SQL Server Cluster service ( + + + + + + + + + + + + + + + + ) configured + + + + + + + + + + + + + + + + + + SQL Server installed on unit ) + + + + + + + + + + + + + + + + + + + + + + + + ( + + + + Secondary replica for SQL Server AG initialized for ) + + + + + + \ No newline at end of file diff --git a/data/workflows/MsSqlServer.xml b/data/workflows/MsSqlServer.xml index e571d35..78dd2cf 100644 --- a/data/workflows/MsSqlServer.xml +++ b/data/workflows/MsSqlServer.xml @@ -7,7 +7,7 @@ + desc="Units of SQL Server services having hostname and image names assigned but without instances"> ( @@ -69,7 +69,7 @@ + desc="Units of SQL Server services which have got an instance deployed but have not got an SQL Server installed"> (