36 lines
120 KiB
PowerShell
36 lines
120 KiB
PowerShell
# ASCII-only bootstrap generated from setup.ps1. Do not edit.
|
|
[CmdletBinding()]
|
|
param(
|
|
[ValidateSet('Install','Daemon','UpgradeAll','ApplyPolicy','ProcessQueue','ProcessRequest')]
|
|
[string]$Mode = 'Install',
|
|
[ValidateSet('Install','Uninstall')]
|
|
[string]$RequestAction = 'Install',
|
|
[string]$AppAlias,
|
|
[string]$RequestedBy,
|
|
[string]$RequestedBySid
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$Payload = @'
|
|
PCMKU2VsZlNlcnZpY2VXaW5nZXQucHMxCgpVc2UgYXM6Ci0gQ29tcHV0ZXIgU3RhcnR1cCBHUE8gc2NyaXB0IChkZWZhdWx0IG1vZGUgPSBJbnN0YWxsKQotIFNjaGVkdWxlZCB0YXNrIHRhcmdldCAoTW9kZSA9IERhZW1vbiAvIFVwZ3JhZGVBbGwgLyBBcHBseVBvbGljeSAvIFByb2Nlc3NRdWV1ZSAvIFByb2Nlc3NSZXF1ZXN0KQoKQmVoYXZpb3I6ClVzZXIgLT4gR1VJIC8gcmVxdWVzdCBoZWxwZXIgLT4gbmFtZWQgcGlwZSAtPiBkYWVtb24gdGFzayAoU1lTVEVNKSAtPiB3aW5nZXQgaW5zdGFsbCAtLXNjb3BlIG1hY2hpbmUKCkNyZWF0ZWQgcGF0aHM6CkM6XFByb2dyYW1EYXRhXF9fU29mdHdhcmVrYXRhbG9nXAogIFNlbGZTZXJ2aWNlV2luZ2V0LnBzMQogIFJlcXVlc3QtQXBwLnBzMQogIFNvZnR3YXJlLUNhdGFsb2cucHMxCiAgTGF1bmNoLVNvZnR3YXJlLUNhdGFsb2cudmJzCiAgSW5zdGFsbGVkLVBhY2thZ2VzLmpzb24KICBMb2dzXHNlcnZpY2UubG9nCiM+CgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ0RhZW1vbicsJ1VwZ3JhZGVBbGwnLCdBcHBseVBvbGljeScsJ1Byb2Nlc3NRdWV1ZScsJ1Byb2Nlc3NSZXF1ZXN0JyldCiAgICBbc3RyaW5nXSRNb2RlID0gJ0luc3RhbGwnLAogICAgW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldCiAgICBbc3RyaW5nXSRSZXF1ZXN0QWN0aW9uID0gJ0luc3RhbGwnLAogICAgW3N0cmluZ10kQXBwQWxpYXMsCiAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCikKClNldC1TdHJpY3RNb2RlIC1WZXJzaW9uIExhdGVzdAokRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDb25maWd1cmF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQokQ2F0YWxvZ0Rpc3BsYXlOYW1lICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRCYXNlRGlyICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6UHJvZ3JhbURhdGEgJ19fU29mdHdhcmVrYXRhbG9nJwokTG9jYWxTY3JpcHRQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU2VsZlNlcnZpY2VXaW5nZXQucHMxJwokUmVxdWVzdFRvb2xQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnUmVxdWVzdC1BcHAucHMxJwokQ2F0YWxvZ0d1aVBhdGggICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU29mdHdhcmUtQ2F0YWxvZy5wczEnCiRDYXRhbG9nTGF1bmNoZXJQYXRoICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMYXVuY2gtU29mdHdhcmUtQ2F0YWxvZy52YnMnCiRJbnN0YWxsZWRQYWNrYWdlc1BhdGggID0gSm9pbi1QYXRoICRCYXNlRGlyICdJbnN0YWxsZWQtUGFja2FnZXMuanNvbicKJFF1ZXVlU3RhdGVQYXRoICAgICAgICAgPSBKb2luLVBhdGggJEJhc2VEaXIgJ1F1ZXVlLVN0YXRlLmpzb24nCiRMb2dEaXIgICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMb2dzJwokTG9nRmlsZSAgICAgICAgICAgICAgICA9IEpvaW4tUGF0aCAkTG9nRGlyICdzZXJ2aWNlLmxvZycKJFBvbGljeVJvb3QgICAgICAgICAgICAgPSAnSEtMTTpcU29mdHdhcmVcUG9saWNpZXNcU1RMXFNvZnR3YXJla2F0YWxvZycKJFBvbGljeUNhdGFsb2dSb290ICAgICAgPSBKb2luLVBhdGggJFBvbGljeVJvb3QgJ0NhdGFsb2cnCiRQb2xpY3lSZXF1aXJlZFJvb3QgICAgID0gSm9pbi1QYXRoICRQb2xpY3lSb290ICdSZXF1aXJlZCcKJFBvbGljeU1heEVudHJpZXMgICAgICAgPSA1MDAKJExlZ2FjeVF1ZXVlVGFza05hbWUgICAgPSAnU29mdHdhcmVrYXRhbG9nIC0gV2luZ2V0IFF1ZXVlJwokRGFlbW9uVGFza05hbWUgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cgLSBEYWVtb24nCiRVcGdyYWRlVGFza05hbWUgICAgICAgID0gJ1NvZnR3YXJla2F0YWxvZyAtIFdpbmdldCBVcGdyYWRlJwokUGlwZU5hbWUgICAgICAgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRXaW5nZXRNdXRleE5hbWUgICAgICAgID0gJ0dsb2JhbFxTb2Z0d2FyZWthdGFsb2ctV2luZ2V0JwokUXVldWVTdGF0ZU11dGV4TmFtZSAgICA9ICdHbG9iYWxcU29mdHdhcmVrYXRhbG9nLVF1ZXVlU3RhdGUnCiRQb3dlclNoZWxsRXhlICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFxwb3dlcnNoZWxsLmV4ZScKJFdTY3JpcHRFeGUgICAgICAgICAgICAgPSBKb2luLVBhdGggJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlx3c2NyaXB0LmV4ZScKJEFwcEluc3RhbGxlckZhbWlseU5hbWUgPSAnTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXJfOHdla3liM2Q4YmJ3ZScKJENvbW1vbkRlc2t0b3BEaXIgICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25EZXNrdG9wRGlyZWN0b3J5JykKJENvbW1vblByb2dyYW1zRGlyICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25Qcm9ncmFtcycpCiREZXNrdG9wU2hvcnRjdXRQYXRoICAgID0gSm9pbi1QYXRoICRDb21tb25EZXNrdG9wRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJFN0YXJ0TWVudVNob3J0Y3V0UGF0aCAgPSBKb2luLVBhdGggJENvbW1vblByb2dyYW1zRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFV0aWxpdHkgZnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBFbnN1cmUtRGlyZWN0b3J5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBhdGgpKSB7CiAgICAgICAgTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkUGF0aCAtRm9yY2UgfCBPdXQtTnVsbAogICAgfQp9CgpmdW5jdGlvbiBXcml0ZS1Mb2cgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJE1lc3NhZ2UsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdJTkZPJywnV0FSTicsJ0VSUk9SJyldCiAgICAgICAgW3N0cmluZ10kTGV2ZWwgPSAnSU5GTycKICAgICkKCiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRMb2dEaXIKICAgICRsaW5lID0gJ3swfSBbezF9XSB7Mn0nIC1mIChHZXQtRGF0ZSAtRm9ybWF0ICd5eXl5LU1NLWRkIEhIOm1tOnNzJyksICRMZXZlbCwgJE1lc3NhZ2UKICAgIEFkZC1Db250ZW50IC1MaXRlcmFsUGF0aCAkTG9nRmlsZSAtVmFsdWUgJGxpbmUgLUVuY29kaW5nIFVURjgKfQoKZnVuY3Rpb24gU2V0LURpcmVjdG9yeUFjbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW2Jvb2xdJFVzZXJzQ2FuTW9kaWZ5CiAgICApCgogICAgJGluaGVyaXRhbmNlID0gW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkluaGVyaXRhbmNlRmxhZ3NdJ0NvbnRhaW5lckluaGVyaXQsIE9iamVjdEluaGVyaXQnCiAgICAkcHJvcGFnYXRpb24gPSBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuUHJvcGFnYXRpb25GbGFnc106Ok5vbmUKCiAgICAkYWNsID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5EaXJlY3RvcnlTZWN1cml0eQogICAgJGFjbC5TZXRBY2Nlc3NSdWxlUHJvdGVjdGlvbigkdHJ1ZSwgJGZhbHNlKQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sICdGdWxsQ29udHJvbCcsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICApCiAgICAkcnVsZUFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZEFkbWlucywgJ0Z1bGxDb250cm9sJywgJGluaGVyaXRhbmNlLCAkcHJvcGFnYXRpb24sICdBbGxvdycKICAgICkKCiAgICBpZiAoJFVzZXJzQ2FuTW9kaWZ5KSB7CiAgICAgICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgICAgICRzaWRVc2VycywgJ01vZGlmeScsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICAgICAgKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgICAgICRzaWRVc2VycywgJ1JlYWRBbmRFeGVjdXRlLCBTeW5jaHJvbml6ZScsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICAgICAgKQogICAgfQoKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlU3lzdGVtKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVBZG1pbnMpCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVVzZXJzKQoKICAgIFNldC1BY2wgLUxpdGVyYWxQYXRoICRQYXRoIC1BY2xPYmplY3QgJGFjbAp9CgpmdW5jdGlvbiBTZXQtRmlsZUFjbEFkbWluc09ubHkgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgpCgogICAgJGFjbCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVNlY3VyaXR5CiAgICAkYWNsLlNldEFjY2Vzc1J1bGVQcm90ZWN0aW9uKCR0cnVlLCAkZmFsc2UpCgogICAgJHNpZFN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTE4JykKICAgICRzaWRBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDQnKQogICAgJHNpZFVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ1JykKCiAgICAkcnVsZVN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZFN5c3RlbSwgJ0Z1bGxDb250cm9sJywgJ0FsbG93JwogICAgKQogICAgJHJ1bGVBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsICdGdWxsQ29udHJvbCcsICdBbGxvdycKICAgICkKICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRVc2VycywgJ1JlYWRBbmRFeGVjdXRlLCBTeW5jaHJvbml6ZScsICdBbGxvdycKICAgICkKCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICBTZXQtQWNsIC1MaXRlcmFsUGF0aCAkUGF0aCAtQWNsT2JqZWN0ICRhY2wKfQoKZnVuY3Rpb24gR2V0LVBvbGljeUR3b3JkIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSROYW1lLAogICAgICAgIFtpbnRdJERlZmF1bHQgPSAwCiAgICApCgogICAgdHJ5IHsKICAgICAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUG9saWN5Um9vdCkpIHsKICAgICAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICAgICAgfQoKICAgICAgICAkcHJvcHMgPSBHZXQtSXRlbVByb3BlcnR5IC1MaXRlcmFsUGF0aCAkUG9saWN5Um9vdCAtRXJyb3JBY3Rpb24gU3RvcAogICAgICAgICRwcm9wZXJ0eSA9ICRwcm9wcy5QU09iamVjdC5Qcm9wZXJ0aWVzWyROYW1lXQogICAgICAgIGlmICgtbm90ICRwcm9wZXJ0eSkgewogICAgICAgICAgICByZXR1cm4gJERlZmF1bHQKICAgICAgICB9CgogICAgICAgIHJldHVybiBbaW50XSRwcm9wZXJ0eS5WYWx1ZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcG9saWN5IHZhbHVlICckTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gJERlZmF1bHQKICAgIH0KfQoKZnVuY3Rpb24gVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkIHsKICAgIChHZXQtUG9saWN5RHdvcmQgLU5hbWUgJ0VuYWJsZWQnIC1EZWZhdWx0IDApIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdBbGxvd1VzZXJJbnN0YWxscycgLURlZmF1bHQgMSkgLWVxIDEKfQoKZnVuY3Rpb24gVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdBbGxvd1VzZXJVbmluc3RhbGwnIC1EZWZhdWx0IDEpIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnRW5mb3JjZVJlcXVpcmVkJyAtRGVmYXVsdCAxKSAtZXEgMQp9CgpmdW5jdGlvbiBHZXQtUG9saWN5U3RyaW5nVmFsdWVzIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQYXRoKSkgewogICAgICAgIHJldHVybiBAKCkKICAgIH0KCiAgICB0cnkgewogICAgICAgICRpdGVtID0gR2V0LUl0ZW0gLUxpdGVyYWxQYXRoICRQYXRoIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgJG5hbWVzID0gQCgkaXRlbS5HZXRWYWx1ZU5hbWVzKCkpIHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHsgJF8gLWFuZCAkXyAtbm90bWF0Y2ggJ15cKicgfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IHwKICAgICAgICAgICAgU2VsZWN0LU9iamVjdCAtRmlyc3QgJFBvbGljeU1heEVudHJpZXMKCiAgICAgICAgZm9yZWFjaCAoJG5hbWUgaW4gJG5hbWVzKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IFtzdHJpbmddJGl0ZW0uR2V0VmFsdWUoJG5hbWUsICcnKQogICAgICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0gW3N0cmluZ10kbmFtZQogICAgICAgICAgICAgICAgICAgIFZhbHVlID0gJHZhbHVlLlRyaW0oKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcG9saWN5IGxpc3QgJyRQYXRoJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIHJldHVybiBAKCkKICAgIH0KfQoKZnVuY3Rpb24gR2V0LUFwcENhdGFsb2dPYmplY3RzIHsKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgcmV0dXJuIEAoKQogICAgfQoKICAgICRzZWVuQWxpYXNlcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICRyb3dzID0gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyAtUGF0aCAkUG9saWN5Q2F0YWxvZ1Jvb3QKICAgIGZvcmVhY2ggKCRyb3cgaW4gJHJvd3MpIHsKICAgICAgICAkYWxpYXMgPSAoW3N0cmluZ10kcm93Lk5hbWUpLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYWxpYXMpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCAkc2VlbkFsaWFzZXMuQWRkKCRhbGlhcykpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJEdXBsaWNhdGUgY2F0YWxvZyBhbGlhcyAnJGFsaWFzJyBpbiBwb2xpY3k7IGlnbm9yaW5nIGR1cGxpY2F0ZS4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJHBhcnRzID0gKFtzdHJpbmddJHJvdy5WYWx1ZSkgLXNwbGl0ICdcfCcsIDMKICAgICAgICBpZiAoQCgkcGFydHMpLkNvdW50IC1sdCAyKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiTWFsZm9ybWVkIGNhdGFsb2cgcm93ICckYWxpYXMnLiBFeHBlY3RlZDogUGFja2FnZUlkfERpc3BsYXlOYW1lfERlc2NyaXB0aW9uIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRwYWNrYWdlSWQgPSAoW3N0cmluZ10kcGFydHNbMF0pLlRyaW0oKQogICAgICAgICRkaXNwbGF5TmFtZSA9IChbc3RyaW5nXSRwYXJ0c1sxXSkuVHJpbSgpCiAgICAgICAgJGRlc2NyaXB0aW9uID0gJycKICAgICAgICBpZiAoQCgkcGFydHMpLkNvdW50IC1nZSAzKSB7CiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IChbc3RyaW5nXSRwYXJ0c1syXSkuVHJpbSgpCiAgICAgICAgfQoKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkcGFja2FnZUlkKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIkNhdGFsb2cgcm93ICckYWxpYXMnIGhhcyBlbXB0eSBwYWNrYWdlIElEOyBpZ25vcmluZy4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGRpc3BsYXlOYW1lKSkgewogICAgICAgICAgICAkZGlzcGxheU5hbWUgPSAkYWxpYXMKICAgICAgICB9CgogICAgICAgIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICBBbGlhcyAgICAgICA9ICRhbGlhcwogICAgICAgICAgICBEaXNwbGF5TmFtZSA9ICRkaXNwbGF5TmFtZQogICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbgogICAgICAgICAgICBQYWNrYWdlSWQgICA9ICRwYWNrYWdlSWQKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1SZXF1aXJlZEFsaWFzZXMgewogICAgaWYgKC1ub3QgKFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCkpIHsKICAgICAgICByZXR1cm4gQCgpCiAgICB9CgogICAgJHNlZW5BbGlhc2VzID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgJHJvd3MgPSBHZXQtUG9saWN5U3RyaW5nVmFsdWVzIC1QYXRoICRQb2xpY3lSZXF1aXJlZFJvb3QKICAgIGZvcmVhY2ggKCRyb3cgaW4gJHJvd3MpIHsKICAgICAgICAkdmFsdWUgPSAoW3N0cmluZ10kcm93LlZhbHVlKS5UcmltKCkKICAgICAgICBpZiAoJHZhbHVlIC1lcSAnMCcgLW9yICR2YWx1ZSAtZXEgJ2ZhbHNlJykgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJHJvdy5OYW1lKS5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKCRzZWVuQWxpYXNlcy5BZGQoJGFsaWFzKSkgewogICAgICAgICAgICAkYWxpYXMKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1QYWNrYWdlSWRCeUFsaWFzIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBbGlhcykKCiAgICBmb3JlYWNoICgkYXBwIGluIEdldC1BcHBDYXRhbG9nT2JqZWN0cykgewogICAgICAgIGlmIChbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddJGFwcC5BbGlhcywgJEFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgcmV0dXJuIFtzdHJpbmddJGFwcC5QYWNrYWdlSWQKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRudWxsCn0KCmZ1bmN0aW9uIEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQWxpYXMpCgogICAgZm9yZWFjaCAoJGFwcCBpbiBHZXQtQXBwQ2F0YWxvZ09iamVjdHMpIHsKICAgICAgICBpZiAoW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRhcHAuQWxpYXMsICRBbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkYXBwCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBXcml0ZS1UZXh0RmlsZSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQ29udGVudCwKICAgICAgICBbVmFsaWRhdGVTZXQoJ1V0ZjhCb20nLCdVbmljb2RlJyldCiAgICAgICAgW3N0cmluZ10kRW5jb2RpbmcgPSAnVXRmOEJvbScKICAgICkKCiAgICAkcGFyZW50ID0gU3BsaXQtUGF0aCAtUGF0aCAkUGF0aCAtUGFyZW50CiAgICBpZiAoJHBhcmVudCkgewogICAgICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJHBhcmVudAogICAgfQoKICAgIHN3aXRjaCAoJEVuY29kaW5nKSB7CiAgICAgICAgJ1VuaWNvZGUnIHsgJHRleHRFbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVW5pY29kZUVuY29kaW5nKCRmYWxzZSwgJHRydWUpIH0KICAgICAgICBkZWZhdWx0ICAgeyAkdGV4dEVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoJHRydWUpIH0KICAgIH0KCiAgICBbU3lzdGVtLklPLkZpbGVdOjpXcml0ZUFsbFRleHQoJFBhdGgsICRDb250ZW50LCAkdGV4dEVuY29kaW5nKQp9CgpmdW5jdGlvbiBOZXctUXVldWVTdGF0ZU9iamVjdCB7CiAgICBbcHNjdXN0b21vYmplY3RdW29yZGVyZWRdQHsKICAgICAgICBWZXJzaW9uID0gMAogICAgICAgIFVwZGF0ZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgIEN1cnJlbnQgPSAkbnVsbAogICAgICAgIFF1ZXVlID0gQCgpCiAgICB9Cn0KCmZ1bmN0aW9uIFJlYWQtUXVldWVTdGF0ZSB7CiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUXVldWVTdGF0ZVBhdGgpKSB7CiAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICB9CgogICAgdHJ5IHsKICAgICAgICAkcmF3ID0gR2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICRRdWV1ZVN0YXRlUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICAgICAgfQoKICAgICAgICAkc3RhdGUgPSAkcmF3IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgIGlmICgtbm90ICRzdGF0ZS5QU09iamVjdC5Qcm9wZXJ0aWVzWydWZXJzaW9uJ10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBWZXJzaW9uIC1Ob3RlUHJvcGVydHlWYWx1ZSAwIH0KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snVXBkYXRlZEF0J10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBVcGRhdGVkQXQgLU5vdGVQcm9wZXJ0eVZhbHVlIChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKSB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ0N1cnJlbnQnXSkgeyAkc3RhdGUgfCBBZGQtTWVtYmVyIC1Ob3RlUHJvcGVydHlOYW1lIEN1cnJlbnQgLU5vdGVQcm9wZXJ0eVZhbHVlICRudWxsIH0KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snUXVldWUnXSkgewogICAgICAgICAgICAkc3RhdGUgfCBBZGQtTWVtYmVyIC1Ob3RlUHJvcGVydHlOYW1lIFF1ZXVlIC1Ob3RlUHJvcGVydHlWYWx1ZSBAKCkKICAgICAgICB9CiAgICAgICAgZWxzZWlmICgtbm90ICRzdGF0ZS5RdWV1ZSkgewogICAgICAgICAgICAkc3RhdGUuUXVldWUgPSBAKCkKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdGF0ZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcXVldWUgc3RhdGU6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gTmV3LVF1ZXVlU3RhdGVPYmplY3QKICAgIH0KfQoKZnVuY3Rpb24gV3JpdGUtUXVldWVTdGF0ZSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldJFN0YXRlKQoKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgICR0ZW1wUGF0aCA9IEpvaW4tUGF0aCAkQmFzZURpciAoIlF1ZXVlLVN0YXRlLXswfS5qc29uLnRtcCIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKICAgIHRyeSB7CiAgICAgICAgJFN0YXRlIHwgQ29udmVydFRvLUpzb24gLURlcHRoIDggfCBTZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1FbmNvZGluZyBVVEY4CiAgICAgICAgTW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkdGVtcFBhdGggLURlc3RpbmF0aW9uICRRdWV1ZVN0YXRlUGF0aCAtRm9yY2UKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVdpdGhRdWV1ZVN0YXRlTG9jayB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3NjcmlwdGJsb2NrXSRTY3JpcHRCbG9jaykKCiAgICAkbXV0ZXggPSBOZXctT2JqZWN0IFN5c3RlbS5UaHJlYWRpbmcuTXV0ZXgoJGZhbHNlLCAkUXVldWVTdGF0ZU11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRoYXNMb2NrID0gJG11dGV4LldhaXRPbmUoW1RpbWVTcGFuXTo6RnJvbVNlY29uZHMoMzApKQogICAgICAgIGlmICgtbm90ICRoYXNMb2NrKSB7CiAgICAgICAgICAgIHRocm93ICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcXVldWUgc3RhdGUgbG9jayAnJFF1ZXVlU3RhdGVNdXRleE5hbWUnLiIKICAgICAgICB9CgogICAgICAgICYgJFNjcmlwdEJsb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsgJG11dGV4LlJlbGVhc2VNdXRleCgpIH0KICAgICAgICAkbXV0ZXguRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIFVwZGF0ZS1RdWV1ZVN0YXRlIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc2NyaXB0YmxvY2tdJFNjcmlwdEJsb2NrKQoKICAgIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgLVNjcmlwdEJsb2NrIHsKICAgICAgICAkc3RhdGUgPSBSZWFkLVF1ZXVlU3RhdGUKICAgICAgICAmICRTY3JpcHRCbG9jayAkc3RhdGUKICAgICAgICAkc3RhdGUuVmVyc2lvbiA9IFtpbnQ2NF0kc3RhdGUuVmVyc2lvbiArIDEKICAgICAgICAkc3RhdGUuVXBkYXRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgV3JpdGUtUXVldWVTdGF0ZSAtU3RhdGUgJHN0YXRlCiAgICAgICAgcmV0dXJuICRzdGF0ZQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUXVldWVTdGF0ZVNuYXBzaG90IHsKICAgIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgLVNjcmlwdEJsb2NrIHsgUmVhZC1RdWV1ZVN0YXRlIH0KfQoKZnVuY3Rpb24gTmV3LVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJywnVXBncmFkZUFsbCcpXVtzdHJpbmddJEFjdGlvbiwKICAgICAgICBbc3RyaW5nXSRBbGlhcywKICAgICAgICBbc3RyaW5nXSRQYWNrYWdlSWQsCiAgICAgICAgW3N0cmluZ10kRGlzcGxheU5hbWUsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdVc2VyJywnUmVxdWlyZWQnLCdTeXN0ZW0nKV1bc3RyaW5nXSRTb3VyY2UgPSAnVXNlcicsCiAgICAgICAgW2Jvb2xdJFJlcXVpcmVkID0gJGZhbHNlLAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5LAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCiAgICApCgogICAgW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgSWQgPSBbR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygnTicpCiAgICAgICAgQWN0aW9uID0gJEFjdGlvbgogICAgICAgIEFsaWFzID0gJEFsaWFzCiAgICAgICAgUGFja2FnZUlkID0gJFBhY2thZ2VJZAogICAgICAgIERpc3BsYXlOYW1lID0gJERpc3BsYXlOYW1lCiAgICAgICAgU291cmNlID0gJFNvdXJjZQogICAgICAgIFJlcXVpcmVkID0gW2Jvb2xdJFJlcXVpcmVkCiAgICAgICAgUmVxdWVzdGVkQnkgPSAkUmVxdWVzdGVkQnkKICAgICAgICBSZXF1ZXN0ZWRCeVNpZCA9ICRSZXF1ZXN0ZWRCeVNpZAogICAgICAgIFN0YXRlID0gJ1F1ZXVlZCcKICAgICAgICBTdGFnZSA9ICdRdWV1ZWQnCiAgICAgICAgU3RhZ2VUZXh0ID0gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgUHJvZ3Jlc3NQZXJjZW50ID0gJG51bGwKICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkZmFsc2UKICAgICAgICBDcmVhdGVkQXQgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICBTdGFydGVkQXQgPSAkbnVsbAogICAgICAgIEZpbmlzaGVkQXQgPSAkbnVsbAogICAgICAgIEV4aXRDb2RlID0gJG51bGwKICAgICAgICBNZXNzYWdlID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIHsKICAgIHBhcmFtKFtzdHJpbmddJExpbmUpCgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJExpbmUpKSB7IHJldHVybiAkbnVsbCB9CiAgICAkbWF0Y2ggPSBbcmVnZXhdOjpNYXRjaCgkTGluZSwgJyg/PCFcZCkoMTAwfFsxLTldP1xkKSg/OltcLixdXGQrKT9ccyolJykKICAgIGlmICgtbm90ICRtYXRjaC5TdWNjZXNzKSB7IHJldHVybiAkbnVsbCB9CiAgICAkcmF3ID0gJG1hdGNoLkdyb3Vwc1sxXS5WYWx1ZQogICAgJHZhbHVlID0gW2ludF0kcmF3CiAgICBpZiAoJHZhbHVlIC1sdCAwKSB7IHJldHVybiAwIH0KICAgIGlmICgkdmFsdWUgLWd0IDEwMCkgeyByZXR1cm4gMTAwIH0KICAgIHJldHVybiAkdmFsdWUKfQoKZnVuY3Rpb24gVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRJZCwKICAgICAgICBbc3RyaW5nXSRTdGFnZSA9ICdSdW5uaW5nJywKICAgICAgICBbc3RyaW5nXSRTdGFnZVRleHQgPSAnQWt0aW9uIGzDpHVmdC4uLicsCiAgICAgICAgW051bGxhYmxlW2ludF1dJFByb2dyZXNzUGVyY2VudCwKICAgICAgICBbYm9vbF0kSXNJbmRldGVybWluYXRlID0gJHRydWUKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIEAoJHN0YXRlLlF1ZXVlKSkgewogICAgICAgICAgICBpZiAoLW5vdCAkaXRlbSkgeyBjb250aW51ZSB9CiAgICAgICAgICAgIGlmICgkaXRlbS5JZCAtZXEgJElkKSB7CiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZSA9ICRTdGFnZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJFN0YWdlVGV4dAogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gJFByb2dyZXNzUGVyY2VudAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJElzSW5kZXRlcm1pbmF0ZQogICAgICAgICAgICAgICAgJHN0YXRlLkN1cnJlbnQgPSBbcHNjdXN0b21vYmplY3RdW29yZGVyZWRdQHsKICAgICAgICAgICAgICAgICAgICBJZCA9ICRpdGVtLklkCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0gJGl0ZW0uQWN0aW9uCiAgICAgICAgICAgICAgICAgICAgQWxpYXMgPSAkaXRlbS5BbGlhcwogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0gJGl0ZW0uRGlzcGxheU5hbWUKICAgICAgICAgICAgICAgICAgICBTdGFnZSA9ICRTdGFnZQogICAgICAgICAgICAgICAgICAgIFN0YWdlVGV4dCA9ICRTdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkUHJvZ3Jlc3NQZXJjZW50CiAgICAgICAgICAgICAgICAgICAgSXNJbmRldGVybWluYXRlID0gJElzSW5kZXRlcm1pbmF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gR2V0LVJlcXVpcmVkQWxpYXNTZXQgewogICAgJHNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIGZvcmVhY2ggKCRhbGlhcyBpbiBAKEdldC1SZXF1aXJlZEFsaWFzZXMpKSB7CiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYWxpYXMpKSB7CiAgICAgICAgICAgIFt2b2lkXSRzZXQuQWRkKFtzdHJpbmddJGFsaWFzKQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkc2V0Cn0KCmZ1bmN0aW9uIEFkZC1RdWV1ZUl0ZW0gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtKQoKICAgICRyZXN1bHQgPSAkbnVsbAogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICAkcXVldWUgPSBAKCRzdGF0ZS5RdWV1ZSkKCiAgICAgICAgZm9yZWFjaCAoJGV4aXN0aW5nIGluICRxdWV1ZSkgewogICAgICAgICAgICBpZiAoLW5vdCAkZXhpc3RpbmcpIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGV4aXN0aW5nLlN0YXRlIC1pbiBAKCdRdWV1ZWQnLCdSdW5uaW5nJykgLWFuZCAkZXhpc3RpbmcuQWN0aW9uIC1lcSAkSXRlbS5BY3Rpb24gLWFuZCBbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddJGV4aXN0aW5nLkFsaWFzLCBbc3RyaW5nXSRJdGVtLkFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgICAgICRzY3JpcHQ6UXVldWVBZGRSZXN1bHQgPSBbcHNjdXN0b21vYmplY3RdQHsgQWRkZWQgPSAkZmFsc2U7IEl0ZW0gPSAkZXhpc3RpbmcgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRzdGF0ZS5RdWV1ZSA9IEAoJHF1ZXVlICsgJEl0ZW0pCiAgICAgICAgJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdCA9IFtwc2N1c3RvbW9iamVjdF1AeyBBZGRlZCA9ICR0cnVlOyBJdGVtID0gJEl0ZW0gfQogICAgfQoKICAgICRyZXN1bHQgPSAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0CiAgICAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0ID0gJG51bGwKICAgIHJldHVybiAkcmVzdWx0Cn0KCmZ1bmN0aW9uIEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bVmFsaWRhdGVTZXQoJ0luc3RhbGwnLCdVbmluc3RhbGwnKV1bc3RyaW5nXSRBY3Rpb24sCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJEFsaWFzLAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5LAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkLAogICAgICAgIFtWYWxpZGF0ZVNldCgnVXNlcicsJ1JlcXVpcmVkJyldW3N0cmluZ10kU291cmNlID0gJ1VzZXInCiAgICApCgogICAgJG5vcm1hbGl6ZWRBbGlhcyA9ICRBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkbm9ybWFsaXplZEFsaWFzCiAgICBpZiAoLW5vdCAkYXBwKSB7CiAgICAgICAgdGhyb3cgIkFsaWFzICckbm9ybWFsaXplZEFsaWFzJyBpcyBub3QgaW4gdGhlIGFsbG93bGlzdC4iCiAgICB9CgogICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICRpc1JlcXVpcmVkID0gJHJlcXVpcmVkU2V0LkNvbnRhaW5zKCRub3JtYWxpemVkQWxpYXMpCiAgICBpZiAoJEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAkaXNSZXF1aXJlZCkgewogICAgICAgIHRocm93ICdQZmxpY2h0c29mdHdhcmUga2FubiBuaWNodCB6dXIgRGVpbnN0YWxsYXRpb24gYW5nZWZyYWd0IHdlcmRlbi4nCiAgICB9CgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIGAKICAgICAgICAtQWN0aW9uICRBY3Rpb24gYAogICAgICAgIC1BbGlhcyAkbm9ybWFsaXplZEFsaWFzIGAKICAgICAgICAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSBgCiAgICAgICAgLURpc3BsYXlOYW1lIChbc3RyaW5nXSRhcHAuRGlzcGxheU5hbWUpIGAKICAgICAgICAtU291cmNlICRTb3VyY2UgYAogICAgICAgIC1SZXF1aXJlZDokaXNSZXF1aXJlZCBgCiAgICAgICAgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSBgCiAgICAgICAgLVJlcXVlc3RlZEJ5U2lkICRSZXF1ZXN0ZWRCeVNpZAoKICAgIHJldHVybiBBZGQtUXVldWVJdGVtIC1JdGVtICRpdGVtCn0KCmZ1bmN0aW9uIEVuc3VyZS1SZXF1aXJlZFNvZnR3YXJlUXVldWVkIHsKICAgICRhZGRlZENvdW50ID0gMAogICAgaWYgKC1ub3QgKFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCkpIHsgcmV0dXJuIDAgfQogICAgaWYgKC1ub3QgKFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQpKSB7IHJldHVybiAwIH0KCiAgICAkaW5zdGFsbGVkU2V0ID0gR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldAogICAgZm9yZWFjaCAoJGFsaWFzIGluIEAoR2V0LVJlcXVpcmVkQWxpYXNlcykpIHsKICAgICAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgICAgICBpZiAoLW5vdCAkYXBwKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiUmVxdWlyZWQgYWxpYXMgJyRhbGlhcycgaXMgbm90IHByZXNlbnQgaW4gY2F0YWxvZyBwb2xpY3k7IHNraXBwaW5nLiIgJ1dBUk4nCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICBpZiAoJGluc3RhbGxlZFNldC5Db250YWlucyhbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIC1BY3Rpb24gSW5zdGFsbCAtQWxpYXMgJGFsaWFzIC1SZXF1ZXN0ZWRCeSAnUG9saWN5JyAtUmVxdWVzdGVkQnlTaWQgJ1BvbGljeScgLVNvdXJjZSBSZXF1aXJlZAogICAgICAgIGlmICgkcmVzdWx0IC1hbmQgJHJlc3VsdC5BZGRlZCkgewogICAgICAgICAgICAkYWRkZWRDb3VudCsrCiAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIHJlcXVpcmVkIHNvZnR3YXJlIGFsaWFzICckYWxpYXMnIHBhY2thZ2UgJyQoJGFwcC5QYWNrYWdlSWQpJy4iCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkYWRkZWRDb3VudAp9CgpmdW5jdGlvbiBJbnZva2UtV2l0aFdpbmdldExvY2sgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzY3JpcHRibG9ja10kU2NyaXB0QmxvY2ssCiAgICAgICAgW2ludF0kVGltZW91dFNlY29uZHMgPSA3MjAwCiAgICApCgogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFdpbmdldE11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCgogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKFtUaW1lU3Bhbl06OkZyb21TZWNvbmRzKCRUaW1lb3V0U2Vjb25kcykpCiAgICAgICAgaWYgKC1ub3QgJGhhc0xvY2spIHsKICAgICAgICAgICAgdGhyb3cgIlRpbWVkIG91dCB3YWl0aW5nIGZvciB3aW5nZXQgbG9jayAnJFdpbmdldE11dGV4TmFtZScuIgogICAgICAgIH0KCiAgICAgICAgJiAkU2NyaXB0QmxvY2sKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmICgkaGFzTG9jaykgewogICAgICAgICAgICAkbXV0ZXguUmVsZWFzZU11dGV4KCkKICAgICAgICB9CiAgICAgICAgJG11dGV4LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBUZXN0LVdpbmdldExvY2tBdmFpbGFibGUgewogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFdpbmdldE11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCgogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKDApCiAgICAgICAgcmV0dXJuICRoYXNMb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsKICAgICAgICAgICAgJG11dGV4LlJlbGVhc2VNdXRleCgpCiAgICAgICAgfQogICAgICAgICRtdXRleC5EaXNwb3NlKCkKICAgIH0KfQoKZnVuY3Rpb24gQ29udmVydFRvLVByb2Nlc3NBcmd1bWVudCB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kVmFsdWUpCgogICAgaWYgKCRWYWx1ZSAtbWF0Y2ggJ1tccyJdJykgewogICAgICAgIHJldHVybiAnInswfSInIC1mICgkVmFsdWUuUmVwbGFjZSgnIicsICdcIicpKQogICAgfQoKICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gR2V0LVdvcmtlclNjcmlwdFBhdGggewogICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJExvY2FsU2NyaXB0UGF0aCkgewogICAgICAgIHJldHVybiAkTG9jYWxTY3JpcHRQYXRoCiAgICB9CgogICAgaWYgKCRQU0NvbW1hbmRQYXRoIC1hbmQgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBTQ29tbWFuZFBhdGgpKSB7CiAgICAgICAgcmV0dXJuICRQU0NvbW1hbmRQYXRoCiAgICB9CgogICAgdGhyb3cgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgd29ya2VyIHNjcmlwdCBwYXRoLicKfQoKZnVuY3Rpb24gU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bVmFsaWRhdGVTZXQoJ0FwcGx5UG9saWN5JywnUHJvY2Vzc1JlcXVlc3QnLCdQcm9jZXNzUXVldWUnKV1bc3RyaW5nXSRXb3JrZXJNb2RlLAogICAgICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXVtzdHJpbmddJFdvcmtlckFjdGlvbiA9ICdJbnN0YWxsJywKICAgICAgICBbc3RyaW5nXSRXb3JrZXJBbGlhcywKICAgICAgICBbc3RyaW5nXSRXb3JrZXJSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRXb3JrZXJSZXF1ZXN0ZWRCeVNpZAogICAgKQoKICAgICR3b3JrZXJTY3JpcHQgPSBHZXQtV29ya2VyU2NyaXB0UGF0aAogICAgJGFyZ3MgPSBAKAogICAgICAgICctTm9Qcm9maWxlJywKICAgICAgICAnLUV4ZWN1dGlvblBvbGljeScsICdCeXBhc3MnLAogICAgICAgICctRmlsZScsICR3b3JrZXJTY3JpcHQsCiAgICAgICAgJy1Nb2RlJywgJFdvcmtlck1vZGUKICAgICkKCiAgICBpZiAoJFdvcmtlck1vZGUgLWVxICdQcm9jZXNzUmVxdWVzdCcpIHsKICAgICAgICAkYXJncyArPSBAKCctUmVxdWVzdEFjdGlvbicsICRXb3JrZXJBY3Rpb24sICctQXBwQWxpYXMnLCAkV29ya2VyQWxpYXMpCgogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJFdvcmtlclJlcXVlc3RlZEJ5KSkgewogICAgICAgICAgICAkYXJncyArPSBAKCctUmVxdWVzdGVkQnknLCAkV29ya2VyUmVxdWVzdGVkQnkpCiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRXb3JrZXJSZXF1ZXN0ZWRCeVNpZCkpIHsKICAgICAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RlZEJ5U2lkJywgJFdvcmtlclJlcXVlc3RlZEJ5U2lkKQogICAgICAgIH0KICAgIH0KCiAgICAkYXJndW1lbnRMaW5lID0gKEAoJGFyZ3MpIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tUHJvY2Vzc0FyZ3VtZW50IC1WYWx1ZSAoW3N0cmluZ10kXykgfSkgLWpvaW4gJyAnCiAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAkUG93ZXJTaGVsbEV4ZSAtQXJndW1lbnRMaXN0ICRhcmd1bWVudExpbmUgLVdpbmRvd1N0eWxlIEhpZGRlbiB8IE91dC1OdWxsCn0KCmZ1bmN0aW9uIFN0YXJ0LVF1ZXVlV29ya2VyIHsKICAgIFN0YXJ0LVNvZnR3YXJla2F0YWxvZ1dvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKfQoKZnVuY3Rpb24gR2V0LVdpbmdldFBhdGggewogICAgJGNhbmRpZGF0ZXMgPSBAKCkKCiAgICB0cnkgewogICAgICAgICRjbWQgPSBHZXQtQ29tbWFuZCB3aW5nZXQuZXhlIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgaWYgKCRjbWQgLWFuZCAkY21kLlNvdXJjZSkgewogICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY21kLlNvdXJjZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICB0cnkgewogICAgICAgICRwYWNrYWdlcyA9IEdldC1BcHB4UGFja2FnZSAtQWxsVXNlcnMgLU5hbWUgTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXIgLUVycm9yQWN0aW9uIFN0b3AgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAkXy5JbnN0YWxsTG9jYXRpb24gfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IFZlcnNpb24gLURlc2NlbmRpbmcKCiAgICAgICAgZm9yZWFjaCAoJHBhY2thZ2UgaW4gJHBhY2thZ2VzKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJHBhY2thZ2UuSW5zdGFsbExvY2F0aW9uICd3aW5nZXQuZXhlJwogICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY2FuZGlkYXRlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgJHdpbmRvd3NBcHBzUm9vdCA9IEpvaW4tUGF0aCAkZW52OlByb2dyYW1GaWxlcyAnV2luZG93c0FwcHMnCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkd2luZG93c0FwcHNSb290KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGl0ZW1zID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHdpbmRvd3NBcHBzUm9vdCAtRGlyZWN0b3J5IC1FcnJvckFjdGlvbiBTdG9wIHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfLk5hbWUgLWxpa2UgJ01pY3Jvc29mdC5EZXNrdG9wQXBwSW5zdGFsbGVyXypfOHdla3liM2Q4YmJ3ZScgfSB8CiAgICAgICAgICAgICAgICBTb3J0LU9iamVjdCBOYW1lIC1EZXNjZW5kaW5nCgogICAgICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiAkaXRlbXMpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJGl0ZW0uRnVsbE5hbWUgJ3dpbmdldC5leGUnCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXMgKz0gJGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgJHJlc29sdmVkID0gJGNhbmRpZGF0ZXMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxCiAgICByZXR1cm4gJHJlc29sdmVkCn0KCmZ1bmN0aW9uIEVuc3VyZS1XaW5nZXRBdmFpbGFibGUgewogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYWxyZWFkeSBhdmFpbGFibGUgYXQ6ICR3aW5nZXRQYXRoIgogICAgICAgIHJldHVybiAkd2luZ2V0UGF0aAogICAgfQoKICAgIFdyaXRlLUxvZyAnd2luZ2V0LmV4ZSBub3QgZm91bmQuJwoKICAgICRpc0xvY2FsU3lzdGVtID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRpc0xvY2FsU3lzdGVtID0gW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpLklzU3lzdGVtCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgaWYgKCRpc0xvY2FsU3lzdGVtKSB7CiAgICAgICAgV3JpdGUtTG9nICJBcHAgSW5zdGFsbGVyIHBhY2thZ2UgcmVnaXN0cmF0aW9uIGNhbm5vdCBydW4gYXMgTG9jYWxTeXN0ZW07IHNraXBwaW5nIEFkZC1BcHB4UGFja2FnZSBmYWxsYmFjayBmb3IgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iICdFUlJPUicKICAgICAgICBXcml0ZS1Mb2cgJ3dpbmdldCBpcyB1bmF2YWlsYWJsZS4gSW5zdGFsbC9wcm92aXNpb24gQXBwIEluc3RhbGxlciwgb3IgdmVyaWZ5IHdpbmdldCBwYXRoIGRpc2NvdmVyeSBmb3IgdGhpcyBkZXZpY2UuJyAnRVJST1InCiAgICAgICAgcmV0dXJuICRudWxsCiAgICB9CgogICAgV3JpdGUtTG9nICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIEFwcCBJbnN0YWxsZXIgcGFja2FnZSBmYW1pbHkgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBBZGQtQXBweFBhY2thZ2UgLVJlZ2lzdGVyQnlGYW1pbHlOYW1lIC1NYWluUGFja2FnZSAkQXBwSW5zdGFsbGVyRmFtaWx5TmFtZQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkFkZC1BcHB4UGFja2FnZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CgogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYmVjYW1lIGF2YWlsYWJsZSBhZnRlciBBcHAgSW5zdGFsbGVyIHJlZ2lzdHJhdGlvbjogJHdpbmdldFBhdGgiCiAgICAgICAgcmV0dXJuICR3aW5nZXRQYXRoCiAgICB9CgogICAgV3JpdGUtTG9nICJ3aW5nZXQgaXMgc3RpbGwgdW5hdmFpbGFibGUgYWZ0ZXIgQXBwIEluc3RhbGxlciByZWdpc3RyYXRpb24gYXR0ZW1wdC4iICdFUlJPUicKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBOZXctVXNlclJlcXVlc3RUb29sIHsKICAgICRwaXBlTGl0ZXJhbCAgID0gJFBpcGVOYW1lLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtzdHJpbmddYCRBcHBBbGlhcywKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXQogICAgW3N0cmluZ11gJEFjdGlvbiA9ICdJbnN0YWxsJywKICAgIFtzd2l0Y2hdYCRVbmluc3RhbGwsCiAgICBbc3dpdGNoXWAkTGlzdAopCgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb24gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1bc3RyaW5nXWAkQ29tbWFuZCwKICAgICAgICBbc3RyaW5nXWAkQWxpYXMKICAgICkKCiAgICBgJHBheWxvYWQgPSBbb3JkZXJlZF1AewogICAgICAgIENvbW1hbmQgID0gYCRDb21tYW5kCiAgICAgICAgQXBwQWxpYXMgPSBgJEFsaWFzCiAgICB9CiAgICBgJGpzb24gPSBgJHBheWxvYWQgfCBDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKCiAgICBgJGVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoYCRmYWxzZSkKICAgIGAkY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlQ2xpZW50U3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAnLicsCiAgICAgICAgYCRQaXBlTmFtZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVEaXJlY3Rpb25dOjpJbk91dCwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5Ub2tlbkltcGVyc29uYXRpb25MZXZlbF06OkltcGVyc29uYXRpb24KICAgICkKCiAgICB0cnkgewogICAgICAgIGAkY2xpZW50LkNvbm5lY3QoNjAwMDApCiAgICAgICAgYCRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIuQXV0b0ZsdXNoID0gYCR0cnVlCiAgICAgICAgYCR3cml0ZXIuV3JpdGVMaW5lKGAkanNvbikKCiAgICAgICAgYCRsaW5lID0gYCRyZWFkZXIuUmVhZExpbmUoKQogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKGAkbGluZSkpIHsKICAgICAgICAgICAgdGhyb3cgJ0RlciBTb2Z0d2FyZWthdGFsb2ctRGllbnN0IGhhdCBrZWluZSBBbnR3b3J0IGdlc2VuZGV0LicKICAgICAgICB9CgogICAgICAgIGAkcmVzcG9uc2UgPSBgJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKC1ub3QgYCRyZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgIHRocm93IChbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSkKICAgICAgICB9CgogICAgICAgIHJldHVybiBgJHJlc3BvbnNlCiAgICB9CiAgICBjYXRjaCBbU3lzdGVtLlRpbWVvdXRFeGNlcHRpb25dIHsKICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaXN0IG5pY2h0IGVycmVpY2hiYXIgb2RlciBzdGFydGV0IG5vY2guIEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0LicKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGAkY2xpZW50LkRpc3Bvc2UoKQogICAgfQp9CgppZiAoYCRVbmluc3RhbGwpIHsKICAgIGAkQWN0aW9uID0gJ1VuaW5zdGFsbCcKfQoKaWYgKGAkTGlzdCkgewogICAgYCRyZXNwb25zZSA9IEludm9rZS1DYXRhbG9nRGFlbW9uIC1Db21tYW5kICdHZXRDYXRhbG9nJwogICAgV3JpdGUtSG9zdCAnRnJlaWdlZ2ViZW5lIEFud2VuZHVuZ2VuOicKICAgIEAoYCRyZXNwb25zZS5DYXRhbG9nKSB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgIFdyaXRlLUhvc3QgKCIgLSB7MH0gW3sxfV0gOiB7Mn0iIC1mIGAkXy5EaXNwbGF5TmFtZSwgYCRfLkFsaWFzLCBgJF8uRGVzY3JpcHRpb24pCiAgICB9CiAgICBleGl0IDAKfQoKaWYgKC1ub3QgYCRBcHBBbGlhcykgewogICAgdGhyb3cgJ1NpZSBtw7xzc2VuIC1BcHBBbGlhcyBhbmdlYmVuIG9kZXIgLUxpc3QgdmVyd2VuZGVuLicKfQoKYCRhbGlhcyA9IGAkQXBwQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQpgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgYCRBY3Rpb24gLUFsaWFzIGAkYWxpYXMKCmlmIChgJEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsKICAgIFdyaXRlLUhvc3QgIkRlaW5zdGFsbGF0aW9uIGbDvHIgJ2AkYWxpYXMnIGVpbmdlcmVpaHQuIgp9CmVsc2UgewogICAgV3JpdGUtSG9zdCAiSW5zdGFsbGF0aW9uIGbDvHIgJ2AkYWxpYXMnIGVpbmdlcmVpaHQuIgp9CgppZiAoYCRyZXNwb25zZS5NZXNzYWdlKSB7CiAgICBXcml0ZS1Ib3N0IGAkcmVzcG9uc2UuTWVzc2FnZQp9CiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJFJlcXVlc3RUb29sUGF0aCAtQ29udGVudCAkY29udGVudCAtRW5jb2RpbmcgVXRmOEJvbQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRSZXF1ZXN0VG9vbFBhdGgKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dHdWkgewogICAgJHBpcGVMaXRlcmFsICAgICAgPSAkUGlwZU5hbWUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkdGl0bGVMaXRlcmFsICAgICA9ICRDYXRhbG9nRGlzcGxheU5hbWUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkbG9nTGl0ZXJhbCAgICAgICA9ICRMb2dGaWxlLlJlcGxhY2UoIiciLCAiJyciKQogICAgJGluc3RhbGxlZExpdGVyYWwgPSAkSW5zdGFsbGVkUGFja2FnZXNQYXRoLlJlcGxhY2UoIiciLCAiJyciKQogICAgJHF1ZXVlU3RhdGVMaXRlcmFsID0gJFF1ZXVlU3RhdGVQYXRoLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5XaW5kb3dzLkZvcm1zCkFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLkRyYXdpbmcKW1N5c3RlbS5XaW5kb3dzLkZvcm1zLkFwcGxpY2F0aW9uXTo6RW5hYmxlVmlzdWFsU3R5bGVzKCkKCmlmICgtbm90ICgnTGlzdFZpZXdDb2x1bW5Tb3J0ZXInIC1hcyBbdHlwZV0pKSB7CkFkZC1UeXBlIC1UeXBlRGVmaW5pdGlvbiBAJwp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7CgpwdWJsaWMgY2xhc3MgTGlzdFZpZXdDb2x1bW5Tb3J0ZXIgOiBJQ29tcGFyZXIgewogICAgcHVibGljIGludCBDb2x1bW4gPSAwOwogICAgcHVibGljIFNvcnRPcmRlciBPcmRlciA9IFNvcnRPcmRlci5Bc2NlbmRpbmc7CgogICAgcHVibGljIGludCBDb21wYXJlKG9iamVjdCB4LCBvYmplY3QgeSkgewogICAgICAgIHZhciBpdGVtWCA9IHggYXMgTGlzdFZpZXdJdGVtOwogICAgICAgIHZhciBpdGVtWSA9IHkgYXMgTGlzdFZpZXdJdGVtOwogICAgICAgIHN0cmluZyBhID0gc3RyaW5nLkVtcHR5OwogICAgICAgIHN0cmluZyBiID0gc3RyaW5nLkVtcHR5OwoKICAgICAgICBpZiAoaXRlbVggIT0gbnVsbCAmJiBpdGVtWC5TdWJJdGVtcy5Db3VudCA+IENvbHVtbikgewogICAgICAgICAgICBhID0gaXRlbVguU3ViSXRlbXNbQ29sdW1uXS5UZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoaXRlbVkgIT0gbnVsbCAmJiBpdGVtWS5TdWJJdGVtcy5Db3VudCA+IENvbHVtbikgewogICAgICAgICAgICBiID0gaXRlbVkuU3ViSXRlbXNbQ29sdW1uXS5UZXh0OwogICAgICAgIH0KCiAgICAgICAgaW50IHJlc3VsdCA9IFN0cmluZ0NvbXBhcmVyLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZS5Db21wYXJlKGEsIGIpOwogICAgICAgIHJldHVybiBPcmRlciA9PSBTb3J0T3JkZXIuRGVzY2VuZGluZyA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICB9Cn0KJ0AgLVJlZmVyZW5jZWRBc3NlbWJsaWVzIEAoJ1N5c3RlbS5kbGwnLCdTeXN0ZW0uV2luZG93cy5Gb3Jtcy5kbGwnKQp9CgppZiAoLW5vdCAoJ1NoZWxsSWNvbkV4dHJhY3RvcicgLWFzIFt0eXBlXSkpIHsKQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAnCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKcHVibGljIHN0YXRpYyBjbGFzcyBTaGVsbEljb25FeHRyYWN0b3IgewogICAgW0RsbEltcG9ydCgic2hlbGwzMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5Vbmljb2RlKV0KICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIHVpbnQgRXh0cmFjdEljb25FeChzdHJpbmcgc3pGaWxlTmFtZSwgaW50IG5JY29uSW5kZXgsIEludFB0cltdIHBoaWNvbkxhcmdlLCBJbnRQdHJbXSBwaGljb25TbWFsbCwgdWludCBuSWNvbnMpOwoKICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0KICAgIFtyZXR1cm46IE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJvb2wpXQpwdWJsaWMgc3RhdGljIGV4dGVybiBib29sIERlc3Ryb3lJY29uKEludFB0ciBoSWNvbik7Cn0KJ0AKfQoKU2V0LVN0cmljdE1vZGUgLVZlcnNpb24gTGF0ZXN0CmAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgpgJFBpcGVOYW1lID0gJyRwaXBlTGl0ZXJhbCcKYCRDYXRhbG9nVGl0bGUgPSAnJHRpdGxlTGl0ZXJhbCcKYCRMb2dGaWxlID0gJyRsb2dMaXRlcmFsJwpgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCA9ICckaW5zdGFsbGVkTGl0ZXJhbCcKYCRRdWV1ZVN0YXRlUGF0aCA9ICckcXVldWVTdGF0ZUxpdGVyYWwnCmAkQWxsb3dVc2VySW5zdGFsbHMgPSBgJHRydWUKYCRBbGxvd1VzZXJVbmluc3RhbGwgPSBgJHRydWUKYCRSZXF1aXJlZEFsaWFzU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQpgJExhc3RTdGF0ZVZlcnNpb24gPSAtMQpgJExhc3RRdWV1ZSA9IEAoKQpgJExhc3RDdXJyZW50ID0gYCRudWxsCmAkTGFzdEluc3RhbGxlZElkcyA9IEAoKQoKZnVuY3Rpb24gU2V0LUZvcm1JY29uIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRGb3JtKQoKICAgIGAkbGFyZ2UgPSBgJG51bGwKICAgIGAkc21hbGwgPSBgJG51bGwKCiAgICB0cnkgewogICAgICAgIGAkaWNvbkZpbGUgPSBKb2luLVBhdGggYCRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcc2hlbGwzMi5kbGwnCiAgICAgICAgYCRsYXJnZSA9IE5ldy1PYmplY3QgU3lzdGVtLkludFB0cltdIDEKICAgICAgICBgJHNtYWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uSW50UHRyW10gMQogICAgICAgIGAkY291bnQgPSBbU2hlbGxJY29uRXh0cmFjdG9yXTo6RXh0cmFjdEljb25FeChgJGljb25GaWxlLCA4MCwgYCRsYXJnZSwgYCRzbWFsbCwgMSkKCiAgICAgICAgaWYgKGAkY291bnQgLWd0IDApIHsKICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBbSW50UHRyXTo6WmVybwogICAgICAgICAgICBpZiAoYCRzbWFsbFswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkdXNlSGFuZGxlID0gYCRzbWFsbFswXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRsYXJnZVswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkdXNlSGFuZGxlID0gYCRsYXJnZVswXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYCR1c2VIYW5kbGUgLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBgJGljb24gPSBbU3lzdGVtLkRyYXdpbmcuSWNvbl06OkZyb21IYW5kbGUoYCR1c2VIYW5kbGUpCiAgICAgICAgICAgICAgICBgJEZvcm0uSWNvbiA9IFtTeXN0ZW0uRHJhd2luZy5JY29uXWAkaWNvbi5DbG9uZSgpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRzbWFsbCAtYW5kIGAkc21hbGxbMF0gLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1bU2hlbGxJY29uRXh0cmFjdG9yXTo6RGVzdHJveUljb24oYCRzbWFsbFswXSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRsYXJnZSAtYW5kIGAkbGFyZ2VbMF0gLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1bU2hlbGxJY29uRXh0cmFjdG9yXTo6RGVzdHJveUljb24oYCRsYXJnZVswXSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtQ2F0YWxvZ0RhZW1vbiB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtzdHJpbmddYCRDb21tYW5kLAogICAgICAgIFtzdHJpbmddYCRBbGlhcwogICAgKQoKICAgIGAkcGF5bG9hZCA9IFtvcmRlcmVkXUB7CiAgICAgICAgQ29tbWFuZCAgPSBgJENvbW1hbmQKICAgICAgICBBcHBBbGlhcyA9IGAkQWxpYXMKICAgIH0KICAgIGAkanNvbiA9IGAkcGF5bG9hZCB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcwoKICAgIGAkZW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZyhgJGZhbHNlKQogICAgYCRjbGllbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5OYW1lZFBpcGVDbGllbnRTdHJlYW0gLUFyZ3VtZW50TGlzdCBAKAogICAgICAgICcuJywKICAgICAgICBgJFBpcGVOYW1lLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZURpcmVjdGlvbl06OkluT3V0LAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZU9wdGlvbnNdOjpOb25lLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlRva2VuSW1wZXJzb25hdGlvbkxldmVsXTo6SW1wZXJzb25hdGlvbgogICAgKQoKICAgIHRyeSB7CiAgICAgICAgYCRjbGllbnQuQ29ubmVjdCg2MDAwMCkKICAgICAgICBgJHJlYWRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVJlYWRlcihgJGNsaWVudCwgYCRlbmNvZGluZykKICAgICAgICBgJHdyaXRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVdyaXRlcihgJGNsaWVudCwgYCRlbmNvZGluZykKICAgICAgICBgJHdyaXRlci5BdXRvRmx1c2ggPSBgJHRydWUKICAgICAgICBgJHdyaXRlci5Xcml0ZUxpbmUoYCRqc29uKQoKICAgICAgICBgJGxpbmUgPSBgJHJlYWRlci5SZWFkTGluZSgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsaW5lKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaGF0IGtlaW5lIEFudHdvcnQgZ2VzZW5kZXQuJwogICAgICAgIH0KCiAgICAgICAgYCRyZXNwb25zZSA9IGAkbGluZSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCBgJHJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgdGhyb3cgKFtzdHJpbmddYCRyZXNwb25zZS5NZXNzYWdlKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGAkcmVzcG9uc2UKICAgIH0KICAgIGNhdGNoIFtTeXN0ZW0uVGltZW91dEV4Y2VwdGlvbl0gewogICAgICAgIHRocm93ICdEZXIgU29mdHdhcmVrYXRhbG9nLURpZW5zdCBpc3QgbmljaHQgZXJyZWljaGJhciBvZGVyIHN0YXJ0ZXQgbm9jaC4gQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXQuJwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRjbGllbnQuRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1BcHBSZXF1ZXN0IHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW3N0cmluZ11gJEFsaWFzLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldW3N0cmluZ11gJEFjdGlvbgogICAgKQoKICAgIHJldHVybiBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCBgJEFjdGlvbiAtQWxpYXMgKGAkQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKSkKfQoKZnVuY3Rpb24gR2V0LUNhdGFsb2dBcHBzIHsKICAgIGAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCAnR2V0U3RhdGUnCiAgICBgJHNjcmlwdDpBbGxvd1VzZXJJbnN0YWxscyA9IFtib29sXWAkcmVzcG9uc2UuQWxsb3dVc2VySW5zdGFsbHMKICAgIGAkc2NyaXB0OkFsbG93VXNlclVuaW5zdGFsbCA9IFtib29sXWAkcmVzcG9uc2UuQWxsb3dVc2VyVW5pbnN0YWxsCiAgICBgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgZm9yZWFjaCAoYCRhbGlhcyBpbiBAKGAkcmVzcG9uc2UuUmVxdWlyZWRBbGlhc2VzKSkgewogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ11gJGFsaWFzKSkgewogICAgICAgICAgICBbdm9pZF1gJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkFkZChbc3RyaW5nXWAkYWxpYXMpCiAgICAgICAgfQogICAgfQogICAgYCRzY3JpcHQ6TGFzdFN0YXRlVmVyc2lvbiA9IFtpbnQ2NF1gJHJlc3BvbnNlLlZlcnNpb24KICAgIGlmIChgJHJlc3BvbnNlLlF1ZXVlKSB7IGAkc2NyaXB0Okxhc3RRdWV1ZSA9IEAoYCRyZXNwb25zZS5RdWV1ZSkgfSBlbHNlIHsgYCRzY3JpcHQ6TGFzdFF1ZXVlID0gQCgpIH0KICAgIGAkc2NyaXB0Okxhc3RDdXJyZW50ID0gYCRyZXNwb25zZS5DdXJyZW50CiAgICBpZiAoYCRyZXNwb25zZS5JbnN0YWxsZWRQYWNrYWdlSWRzKSB7IGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMgPSBAKGAkcmVzcG9uc2UuSW5zdGFsbGVkUGFja2FnZUlkcykgfSBlbHNlIHsgYCRzY3JpcHQ6TGFzdEluc3RhbGxlZElkcyA9IEAoKSB9CiAgICByZXR1cm4gQChgJHJlc3BvbnNlLkNhdGFsb2cpCn0KCmZ1bmN0aW9uIEdldC1JbnN0YWxsZWRQYWNrYWdlU3RhdGUgewogICAgYCRzdGF0ZSA9IFtvcmRlcmVkXUB7CiAgICAgICAgR2VuZXJhdGVkQXQgPSBgJG51bGwKICAgICAgICBQYWNrYWdlU2V0ICA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCkpIHsKICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XWAkc3RhdGUKICAgIH0KCiAgICB0cnkgewogICAgICAgIGAkcmF3ID0gR2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1gJHN0YXRlCiAgICAgICAgfQoKICAgICAgICBgJHNuYXBzaG90ID0gYCRyYXcgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKGAkc25hcHNob3QuR2VuZXJhdGVkQXQpIHsKICAgICAgICAgICAgYCRzdGF0ZS5HZW5lcmF0ZWRBdCA9IFtzdHJpbmddYCRzbmFwc2hvdC5HZW5lcmF0ZWRBdAogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoYCRpZCBpbiBAKGAkc25hcHNob3QuSW5zdGFsbGVkUGFja2FnZUlkcykpIHsKICAgICAgICAgICAgaWYgKGAkaWQpIHsKICAgICAgICAgICAgICAgIFt2b2lkXWAkc3RhdGUuUGFja2FnZVNldC5BZGQoKFtzdHJpbmddYCRpZCkuVHJpbSgpKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdYCRzdGF0ZQp9CgpmdW5jdGlvbiBHZXQtQXBwU3RhdHVzIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRBcHAsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJEluc3RhbGxlZFNldCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXWAkUXVldWVJdGVtcwogICAgKQoKICAgIGZvcmVhY2ggKGAkcXVldWVkIGluIEAoYCRRdWV1ZUl0ZW1zKSkgewogICAgICAgIGlmICgtbm90IGAkcXVldWVkKSB7IGNvbnRpbnVlIH0KICAgICAgICBpZiAoYCRxdWV1ZWQuU3RhdGUgLWluIEAoJ1F1ZXVlZCcsJ1J1bm5pbmcnKSAtYW5kIFtzdHJpbmddOjpFcXVhbHMoW3N0cmluZ11gJHF1ZXVlZC5BbGlhcywgW3N0cmluZ11gJEFwcC5BbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIGlmIChgJHF1ZXVlZC5TdGF0ZSAtZXEgJ1J1bm5pbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoYCRxdWV1ZWQuQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgeyByZXR1cm4gJ1dpcmQgZGVpbnN0YWxsaWVydCcgfQogICAgICAgICAgICAgICAgcmV0dXJuICdXaXJkIGluc3RhbGxpZXJ0JwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYCRxdWV1ZWQuQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgeyByZXR1cm4gJ0RlaW5zdGFsbGF0aW9uIGluIFdhcnRlc2NobGFuZ2UnIH0KICAgICAgICAgICAgcmV0dXJuICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoYCRJbnN0YWxsZWRTZXQuQ29udGFpbnMoYCRBcHAuUGFja2FnZUlkKSkgewogICAgICAgIHJldHVybiAnSW5zdGFsbGllcnQnCiAgICB9CgogICAgaWYgKGAkc2NyaXB0OlJlcXVpcmVkQWxpYXNTZXQuQ29udGFpbnMoW3N0cmluZ11gJEFwcC5BbGlhcykpIHsKICAgICAgICByZXR1cm4gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICB9CgogICAgcmV0dXJuICdJbnN0YWxsaWVyYmFyJwp9CgpgJGZvcm0gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkZvcm0KYCRmb3JtLlRleHQgPSBgJENhdGFsb2dUaXRsZQpgJGZvcm0uU3RhcnRQb3NpdGlvbiA9ICdDZW50ZXJTY3JlZW4nCmAkZm9ybS5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk4MCwgNjYwKQpgJGZvcm0uTWluaW11bVNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTYwLCA2NDApCmAkZm9ybS5Ub3BNb3N0ID0gYCRmYWxzZQpgJGZvcm0uU2hvd0ljb24gPSBgJHRydWUKYCRmb3JtLkZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoJ1NlZ29lIFVJJywgOSkKYCRmb3JtLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvclRyYW5zbGF0b3JdOjpGcm9tSHRtbCgnI0YzRjNGMycpClNldC1Gb3JtSWNvbiAtRm9ybSBgJGZvcm0KCmAkaGVhZGVyUGFuZWwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaGVhZGVyUGFuZWwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCAxMikKYCRoZWFkZXJQYW5lbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgNTIpCmAkaGVhZGVyUGFuZWwuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQnCmAkaGVhZGVyUGFuZWwuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwpgJGhlYWRlclBhbmVsLkJvcmRlclN0eWxlID0gJ0ZpeGVkU2luZ2xlJwoKYCRoZWFkZXJBY2NlbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaGVhZGVyQWNjZW50LkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgwLCAwKQpgJGhlYWRlckFjY2VudC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDYsIDUwKQpgJGhlYWRlckFjY2VudC5BbmNob3IgPSAnVG9wLCBMZWZ0LCBCb3R0b20nCmAkaGVhZGVyQWNjZW50LkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvclRyYW5zbGF0b3JdOjpGcm9tSHRtbCgnIzBGNkNCRCcpCgpgJGhlYWRlclRpdGxlID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJGhlYWRlclRpdGxlLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxOCwgMTIpCmAkaGVhZGVyVGl0bGUuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MDAsIDI0KQpgJGhlYWRlclRpdGxlLkZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoJ1NlZ29lIFVJIFNlbWlib2xkJywgMTMpCmAkaGVhZGVyVGl0bGUuVGV4dCA9IGAkQ2F0YWxvZ1RpdGxlCgpgJGhlYWRlclBhbmVsLkNvbnRyb2xzLkFkZChgJGhlYWRlckFjY2VudCkKYCRoZWFkZXJQYW5lbC5Db250cm9scy5BZGQoYCRoZWFkZXJUaXRsZSkKCmAkZ3JvdXBBcHBzID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGdyb3VwQXBwcy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDcyKQpgJGdyb3VwQXBwcy5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgMzg0KQpgJGdyb3VwQXBwcy5BbmNob3IgPSAnVG9wLCBMZWZ0LCBSaWdodCwgQm90dG9tJwpgJGdyb3VwQXBwcy5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzXTo6V2luZG93CmAkZ3JvdXBBcHBzLkJvcmRlclN0eWxlID0gJ0ZpeGVkU2luZ2xlJwoKYCRsaXN0Q2FwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRsaXN0Q2FwdGlvbi5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDEwKQpgJGxpc3RDYXB0aW9uLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTEyLCAyMCkKYCRsaXN0Q2FwdGlvbi5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSSBTZW1pYm9sZCcsIDkuNSkKYCRsaXN0Q2FwdGlvbi5UZXh0ID0gJ0ZyZWlnZWdlYmVuZSBBbndlbmR1bmdlbicKCmAkbGlzdCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGlzdFZpZXcKYCRsaXN0LkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgMzQpCmAkbGlzdC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDkxNiwgMzM4KQpgJGxpc3QuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRsaXN0LlZpZXcgPSAnRGV0YWlscycKYCRsaXN0LkZ1bGxSb3dTZWxlY3QgPSBgJHRydWUKYCRsaXN0Lk11bHRpU2VsZWN0ID0gYCRmYWxzZQpgJGxpc3QuR3JpZExpbmVzID0gYCRmYWxzZQpgJGxpc3QuSGlkZVNlbGVjdGlvbiA9IGAkZmFsc2UKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdBbndlbmR1bmcnLCAyNjApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQmVzY2hyZWlidW5nJywgNDUwKQpbdm9pZF1gJGxpc3QuQ29sdW1ucy5BZGQoJ1N0YXR1cycsIDE1MCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdBbGlhcycsIDExMCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdQYWtldC1JRCcsIDEwMCkKYCRsaXN0LkJvcmRlclN0eWxlID0gJ05vbmUnCmAkbGlzdC5IZWFkZXJTdHlsZSA9ICdDbGlja2FibGUnCgpgJGNvbHVtblNvcnRlciA9IE5ldy1PYmplY3QgTGlzdFZpZXdDb2x1bW5Tb3J0ZXIKYCRsaXN0Lkxpc3RWaWV3SXRlbVNvcnRlciA9IGAkY29sdW1uU29ydGVyCgpmdW5jdGlvbiBTb3J0LUxpc3RCeUNvbHVtbiB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtpbnRdYCRDb2x1bW5JbmRleCkKCiAgICBpZiAoYCRjb2x1bW5Tb3J0ZXIuQ29sdW1uIC1lcSBgJENvbHVtbkluZGV4KSB7CiAgICAgICAgaWYgKGAkY29sdW1uU29ydGVyLk9yZGVyIC1lcSBbU3lzdGVtLldpbmRvd3MuRm9ybXMuU29ydE9yZGVyXTo6QXNjZW5kaW5nKSB7CiAgICAgICAgICAgIGAkY29sdW1uU29ydGVyLk9yZGVyID0gW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkRlc2NlbmRpbmcKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGAkY29sdW1uU29ydGVyLk9yZGVyID0gW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkFzY2VuZGluZwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGAkY29sdW1uU29ydGVyLkNvbHVtbiA9IGAkQ29sdW1uSW5kZXgKICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpBc2NlbmRpbmcKICAgIH0KCiAgICBgJGxpc3QuU29ydCgpCn0KCmAkZ3JvdXBBcHBzLkNvbnRyb2xzLkFkZChgJGxpc3RDYXB0aW9uKQpgJGdyb3VwQXBwcy5Db250cm9scy5BZGQoYCRsaXN0KQoKYCRpbmZvUGFuZWwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaW5mb1BhbmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNDY2KQpgJGluZm9QYW5lbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgNTQpCmAkaW5mb1BhbmVsLkFuY2hvciA9ICdMZWZ0LCBSaWdodCwgQm90dG9tJwpgJGluZm9QYW5lbC5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKYCRpbmZvUGFuZWwuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwoKYCRzbmFwc2hvdExhYmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJHNuYXBzaG90TGFiZWwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEwLCA4KQpgJHNuYXBzaG90TGFiZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTQsIDE4KQpgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW46IGtlaW4gRGF0ZW5zdGFuZCB2b3JoYW5kZW4nCgpgJGluc3RhbGxlZExhYmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJGluc3RhbGxlZExhYmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMCwgMzApCmAkaW5zdGFsbGVkTGFiZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTQsIDE4KQpgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDoga2VpbmUnCgpgJGluZm9QYW5lbC5Db250cm9scy5BZGQoYCRzbmFwc2hvdExhYmVsKQpgJGluZm9QYW5lbC5Db250cm9scy5BZGQoYCRpbnN0YWxsZWRMYWJlbCkKCmZ1bmN0aW9uIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUgewogICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1sdCAxKSB7CiAgICAgICAgYCRidG5JbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICAgICAgYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBgJHNlbGVjdGVkSXRlbSA9IGAkbGlzdC5TZWxlY3RlZEl0ZW1zWzBdCiAgICBgJHN0YXRlID0gYCRzZWxlY3RlZEl0ZW0uU3ViSXRlbXNbMl0uVGV4dAoKICAgIGAkaXNSZXF1aXJlZCA9IGAkc2NyaXB0OlJlcXVpcmVkQWxpYXNTZXQuQ29udGFpbnMoW3N0cmluZ11gJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1szXS5UZXh0KQogICAgYCRidG5JbnN0YWxsLkVuYWJsZWQgPSAoYCRzY3JpcHQ6QWxsb3dVc2VySW5zdGFsbHMgLWFuZCBgJHN0YXRlIC1lcSAnSW5zdGFsbGllcmJhcicpCiAgICBgJGJ0blVuaW5zdGFsbC5FbmFibGVkID0gKGAkc2NyaXB0OkFsbG93VXNlclVuaW5zdGFsbCAtYW5kIC1ub3QgYCRpc1JlcXVpcmVkIC1hbmQgYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJ0JykKfQoKZnVuY3Rpb24gVXBkYXRlLVByb2dyZXNzQXJlYSB7CiAgICBgJGN1cnJlbnQgPSBgJHNjcmlwdDpMYXN0Q3VycmVudAogICAgYCRxdWV1ZWRDb3VudCA9IEAoYCRzY3JpcHQ6TGFzdFF1ZXVlIHwgV2hlcmUtT2JqZWN0IHsgYCRfIC1hbmQgYCRfLlN0YXRlIC1lcSAnUXVldWVkJyB9KS5Db3VudAogICAgaWYgKGAkY3VycmVudCkgewogICAgICAgIGAkbGFiZWwgPSBbc3RyaW5nXWAkY3VycmVudC5TdGFnZVRleHQKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJGxhYmVsKSkgeyBgJGxhYmVsID0gJ0FrdGlvbiBsw6R1ZnQuLi4nIH0KICAgICAgICBgJHN0YXR1cy5UZXh0ID0gInswfSAoV2FydGVzY2hsYW5nZTogezF9KSIgLWYgYCRsYWJlbCwgYCRxdWV1ZWRDb3VudAogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkdHJ1ZQogICAgICAgIGlmIChgJGN1cnJlbnQuSXNJbmRldGVybWluYXRlIC1vciBgJG51bGwgLWVxIGAkY3VycmVudC5Qcm9ncmVzc1BlcmNlbnQpIHsKICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdNYXJxdWVlJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwogICAgICAgICAgICBgJHZhbHVlID0gW2ludF1gJGN1cnJlbnQuUHJvZ3Jlc3NQZXJjZW50CiAgICAgICAgICAgIGlmIChgJHZhbHVlIC1sdCAwKSB7IGAkdmFsdWUgPSAwIH0KICAgICAgICAgICAgaWYgKGAkdmFsdWUgLWd0IDEwMCkgeyBgJHZhbHVlID0gMTAwIH0KICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IGAkdmFsdWUKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKGAkcXVldWVkQ291bnQgLWd0IDApIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIldhcnRlc2NobGFuZ2U6IHswfSIgLWYgYCRxdWV1ZWRDb3VudAogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkdHJ1ZQogICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKICAgICAgICBgJHByb2dyZXNzQmFyLlZhbHVlID0gMAogICAgfQogICAgZWxzZSB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICdCZXJlaXQuJwogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkZmFsc2UKICAgICAgICBgJHByb2dyZXNzQmFyLlN0eWxlID0gJ0NvbnRpbnVvdXMnCiAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IDAKICAgIH0KfQoKZnVuY3Rpb24gTG9hZC1BcHBMaXN0IHsKICAgIGAkc2VsZWN0ZWRBbGlhcyA9IGAkbnVsbAogICAgYCRsaXN0LkJlZ2luVXBkYXRlKCkKICAgIHRyeSB7CiAgICAgICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1ndCAwKSB7CiAgICAgICAgICAgIGAkc2VsZWN0ZWRBbGlhcyA9IFtzdHJpbmddYCRsaXN0LlNlbGVjdGVkSXRlbXNbMF0uU3ViSXRlbXNbM10uVGV4dAogICAgICAgIH0KCiAgICAgICAgYCRsaXN0Lkl0ZW1zLkNsZWFyKCkKCiAgICAgICAgYCRhcHBzID0gR2V0LUNhdGFsb2dBcHBzCiAgICAgICAgYCRpbnN0YWxsZWRTdGF0ZSA9IEdldC1JbnN0YWxsZWRQYWNrYWdlU3RhdGUKICAgICAgICBgJGluc3RhbGxlZFNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICBmb3JlYWNoIChgJGlkIGluIEAoYCRzY3JpcHQ6TGFzdEluc3RhbGxlZElkcykpIHsKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXWAkaWQpKSB7IFt2b2lkXWAkaW5zdGFsbGVkU2V0LkFkZChbc3RyaW5nXWAkaWQpIH0KICAgICAgICB9CgogICAgICAgIGlmICgtbm90IGAkaW5zdGFsbGVkU2V0KSB7CiAgICAgICAgICAgIGAkaW5zdGFsbGVkU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgICAgIH0KCiAgICAgICAgYCRpbnN0YWxsZWROYW1lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKCiAgICAgICAgZm9yZWFjaCAoYCRhcHAgaW4gKGAkYXBwcyB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lKSkgewogICAgICAgICAgICBgJHN0YXRlID0gR2V0LUFwcFN0YXR1cyAtQXBwIGAkYXBwIC1JbnN0YWxsZWRTZXQgYCRpbnN0YWxsZWRTZXQgLVF1ZXVlSXRlbXMgYCRzY3JpcHQ6TGFzdFF1ZXVlCgogICAgICAgICAgICBgJGl0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxpc3RWaWV3SXRlbShgJGFwcC5EaXNwbGF5TmFtZSkKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5EZXNjcmlwdGlvbikKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJHN0YXRlKQogICAgICAgICAgICBbdm9pZF1gJGl0ZW0uU3ViSXRlbXMuQWRkKGAkYXBwLkFsaWFzKQogICAgICAgICAgICBbdm9pZF1gJGl0ZW0uU3ViSXRlbXMuQWRkKGAkYXBwLlBhY2thZ2VJZCkKICAgICAgICAgICAgYCRpdGVtLlRhZyA9IGAkYXBwCgogICAgICAgICAgICBpZiAoYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJ0JykgewogICAgICAgICAgICAgICAgYCRpdGVtLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OkRhcmtHcmVlbgogICAgICAgICAgICAgICAgW3ZvaWRdYCRpbnN0YWxsZWROYW1lcy5BZGQoYCRhcHAuRGlzcGxheU5hbWUpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJHN0YXRlIC1saWtlICcqV2FydGVzY2hsYW5nZScpIHsKICAgICAgICAgICAgICAgIGAkaXRlbS5Gb3JlQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpEYXJrR29sZGVucm9kCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJHN0YXRlIC1saWtlICdXaXJkIConKSB7CiAgICAgICAgICAgICAgICBgJGl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6Um95YWxCbHVlCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFt2b2lkXWAkbGlzdC5JdGVtcy5BZGQoYCRpdGVtKQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoYCRjb2wgaW4gYCRsaXN0LkNvbHVtbnMpIHsKICAgICAgICAgICAgaWYgKGAkY29sLlRleHQgLWVxICdQYWtldC1JRCcpIHsgYCRjb2wuV2lkdGggPSAwIH0KICAgICAgICB9CgogICAgICAgIGAkbGlzdC5Tb3J0KCkKCiAgICAgICAgaWYgKGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGAkdGltZXN0YW1wID0gW0RhdGVUaW1lXTo6UGFyc2UoYCRpbnN0YWxsZWRTdGF0ZS5HZW5lcmF0ZWRBdCkuVG9Mb2NhbFRpbWUoKQogICAgICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIHZvbTogJyArIGAkdGltZXN0YW1wLlRvU3RyaW5nKCdkZC5NTS55eXl5IEhIOm1tOnNzJykKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW4gdm9tOiAnICsgYCRpbnN0YWxsZWRTdGF0ZS5HZW5lcmF0ZWRBdAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW46IGtlaW4gRGF0ZW5zdGFuZCB2b3JoYW5kZW4nCiAgICAgICAgfQoKICAgICAgICBpZiAoYCRpbnN0YWxsZWROYW1lcy5Db3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDogJyArIChgJGluc3RhbGxlZE5hbWVzIC1qb2luICcsICcpCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDoga2VpbmUgZnJlaWdlZ2ViZW5lIFNvZnR3YXJlIGVya2FubnQnCiAgICAgICAgfQoKICAgICAgICBVcGRhdGUtUHJvZ3Jlc3NBcmVhCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBgJGxpc3QuRW5kVXBkYXRlKCkKCiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJHNlbGVjdGVkQWxpYXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKGAkaXRlbSBpbiBgJGxpc3QuSXRlbXMpIHsKICAgICAgICAgICAgICAgIGlmIChgJGl0ZW0uU3ViSXRlbXMuQ291bnQgLWd0IDMgLWFuZCBbc3RyaW5nXTo6RXF1YWxzKGAkaXRlbS5TdWJJdGVtc1szXS5UZXh0LCBgJHNlbGVjdGVkQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICAgICAgICAgIGAkaXRlbS5TZWxlY3RlZCA9IGAkdHJ1ZQogICAgICAgICAgICAgICAgICAgIGAkaXRlbS5FbnN1cmVWaXNpYmxlKCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlCiAgICB9Cn0KCmAkc3RhdHVzID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJHN0YXR1cy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDUyNikKYCRzdGF0dXMuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg3MDAsIDIwKQpgJHN0YXR1cy5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRzdGF0dXMuRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGltR3JheQpgJHN0YXR1cy5UZXh0ID0gJ0JlcmVpdC4nCgpgJHByb2dyZXNzQmFyID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Qcm9ncmVzc0JhcgpgJHByb2dyZXNzQmFyLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNTQ4KQpgJHByb2dyZXNzQmFyLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoNzAwLCAxMikKYCRwcm9ncmVzc0Jhci5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwpgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJGZhbHNlCgpgJGJ0bkluc3RhbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0bkluc3RhbGwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA1NjgpCmAkYnRuSW5zdGFsbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDE3MCwgMzApCmAkYnRuSW5zdGFsbC5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0bkluc3RhbGwuVGV4dCA9ICdJbnN0YWxsaWVyZW4nCmAkYnRuSW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQoKYCRidG5Vbmluc3RhbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0blVuaW5zdGFsbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTkwLCA1NjgpCmAkYnRuVW5pbnN0YWxsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTQwLCAzMCkKYCRidG5Vbmluc3RhbGwuQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5Vbmluc3RhbGwuVGV4dCA9ICdEZWluc3RhbGxhdGlvbicKYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKCmAkYnRuUmVmcmVzaCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuUmVmcmVzaC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMzM4LCA1NjgpCmAkYnRuUmVmcmVzaC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDExMCwgMzApCmAkYnRuUmVmcmVzaC5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0blJlZnJlc2guVGV4dCA9ICdBa3R1YWxpc2llcmVuJwoKYCRidG5PcGVuTG9nID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5PcGVuTG9nLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCg0NTYsIDU2OCkKYCRidG5PcGVuTG9nLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTMwLCAzMCkKYCRidG5PcGVuTG9nLkFuY2hvciA9ICdMZWZ0LCBCb3R0b20nCmAkYnRuT3BlbkxvZy5UZXh0ID0gJ1Byb3Rva29sbCDDtmZmbmVuJwoKYCRidG5DbG9zZSA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuQ2xvc2UuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDgzMiwgNTY4KQpgJGJ0bkNsb3NlLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTIwLCAzMCkKYCRidG5DbG9zZS5BbmNob3IgPSAnUmlnaHQsIEJvdHRvbScKYCRidG5DbG9zZS5UZXh0ID0gJ1NjaGxpZcOfZW4nCgpgJHNjcmlwdDpTdGF0ZVdhdGNoZXIgPSBgJG51bGwKYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyID0gYCRudWxsCmAkc3RhdGVSZWZyZXNoVGltZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRpbWVyCmAkc3RhdGVSZWZyZXNoVGltZXIuSW50ZXJ2YWwgPSA1MDAKYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkZmFsc2UKCmAkYnRuSW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1lcSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBiZXJlaXRzIGluc3RhbGxpZXJ0LiIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSksCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJJbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHJlc3BvbnNlID0gTmV3LUFwcFJlcXVlc3QgLUFsaWFzIGAkc2VsZWN0ZWQuQWxpYXMgLUFjdGlvbiAnSW5zdGFsbCcKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gaWYgKGAkcmVzcG9uc2UuTWVzc2FnZSkgeyBgJHJlc3BvbnNlLk1lc3NhZ2UgfSBlbHNlIHsgIkluc3RhbGxhdGlvbiBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUgfQoKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICgiSW5zdGFsbGF0aW9uIGVpbmdlcmVpaHQ6YHJgbmByYG57MH1gcmBuQWxpYXM6IHsxfSIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSwgYCRzZWxlY3RlZC5BbGlhcyksCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICApIHwgT3V0LU51bGwKCiAgICAgICAgTG9hZC1BcHBMaXN0CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJGZWhsZXI6ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgICAgICkgfCBPdXQtTnVsbAogICAgfQp9KQoKYCRidG5Vbmluc3RhbGwuQWRkX0NsaWNrKHsKICAgIHRyeSB7CiAgICAgICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1sdCAxKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICdCaXR0ZSB6dWVyc3QgZWluZSBBbndlbmR1bmcgYXVzd8OkaGxlbi4nLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGAkc2VsZWN0ZWRJdGVtID0gYCRsaXN0LlNlbGVjdGVkSXRlbXNbMF0KICAgICAgICBgJHNlbGVjdGVkID0gYCRzZWxlY3RlZEl0ZW0uVGFnCiAgICAgICAgYCRjdXJyZW50U3RhdGUgPSBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0CgogICAgICAgIGlmIChgJGN1cnJlbnRTdGF0ZSAtbmUgJ0luc3RhbGxpZXJ0JykgewogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICAgICAoInswfSBpc3QgZGVyemVpdCBuaWNodCBhbHMgaW5zdGFsbGllcnQgbWFya2llcnQuIiAtZiBgJHNlbGVjdGVkLkRpc3BsYXlOYW1lKSwKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkRlaW5zdGFsbGF0aW9uIHdpcmQgZWluZ2VyZWlodDogezB9IiAtZiBgJHNlbGVjdGVkLkRpc3BsYXlOYW1lCiAgICAgICAgYCRyZXNwb25zZSA9IE5ldy1BcHBSZXF1ZXN0IC1BbGlhcyBgJHNlbGVjdGVkLkFsaWFzIC1BY3Rpb24gJ1VuaW5zdGFsbCcKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gaWYgKGAkcmVzcG9uc2UuTWVzc2FnZSkgeyBgJHJlc3BvbnNlLk1lc3NhZ2UgfSBlbHNlIHsgIkRlaW5zdGFsbGF0aW9uIGVpbmdlcmVpaHQ6IHswfSIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSB9CgogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgKCJEZWluc3RhbGxhdGlvbiBlaW5nZXJlaWh0OmByYG5gcmBuezB9YHJgbkFsaWFzOiB7MX0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUsIGAkc2VsZWN0ZWQuQWxpYXMpLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgKSB8IE91dC1OdWxsCgogICAgICAgIExvYWQtQXBwTGlzdAogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuUmVmcmVzaC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gJ0luc3RhbGxhdGlvbnNkYXRlbiB3ZXJkZW4gYWt0dWFsaXNpZXJ0Li4uJwogICAgICAgIGAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCAnUmVmcmVzaFN0YXR1cycKICAgICAgICBMb2FkLUFwcExpc3QKICAgICAgICBpZiAoYCRyZXNwb25zZS5NZXNzYWdlKSB7IGAkc3RhdHVzLlRleHQgPSBgJHJlc3BvbnNlLk1lc3NhZ2UgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkc3RhdGVSZWZyZXNoVGltZXIuQWRkX1RpY2soewogICAgaWYgKC1ub3QgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZykgeyByZXR1cm4gfQogICAgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkZmFsc2UKICAgIHRyeSB7IExvYWQtQXBwTGlzdCB9CiAgICBjYXRjaCB7IGAkc3RhdHVzLlRleHQgPSAiRmVobGVyIGJlaSBhdXRvbWF0aXNjaGVyIEFrdHVhbGlzaWVydW5nOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0KfSkKCmAkYnRuT3BlbkxvZy5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJExvZ0ZpbGUpKSB7CiAgICAgICAgICAgIHRocm93ICdEZXIgUGZhZCB6dXIgUHJvdG9rb2xsZGF0ZWkgaXN0IGxlZXIuJwogICAgICAgIH0KCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRMb2dGaWxlKSB7CiAgICAgICAgICAgIFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdub3RlcGFkLmV4ZScgLUFyZ3VtZW50TGlzdCBAKGAkTG9nRmlsZSkKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICdEaWUgUHJvdG9rb2xsZGF0ZWkgd3VyZGUgbm9jaCBuaWNodCBlcnN0ZWxsdC4nLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgICAgICkgfCBPdXQtTnVsbAogICAgfQp9KQoKYCRidG5DbG9zZS5BZGRfQ2xpY2soeyBgJGZvcm0uQ2xvc2UoKSB9KQoKYCRmb3JtLkFkZF9TaG93bih7CiAgICB0cnkgewogICAgICAgIGAkc3RhdGVEaXIgPSBTcGxpdC1QYXRoIC1QYXRoIGAkUXVldWVTdGF0ZVBhdGggLVBhcmVudAogICAgICAgIGAkc3RhdGVGaWxlID0gU3BsaXQtUGF0aCAtUGF0aCBgJFF1ZXVlU3RhdGVQYXRoIC1MZWFmCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRzdGF0ZURpcikgewogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlU3lzdGVtV2F0Y2hlcihgJHN0YXRlRGlyLCBgJHN0YXRlRmlsZSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLk5vdGlmeUZpbHRlciA9IFtTeXN0ZW0uSU8uTm90aWZ5RmlsdGVyc10nTGFzdFdyaXRlLCBGaWxlTmFtZSwgU2l6ZScKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkFkZF9DaGFuZ2VkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIuQWRkX0NyZWF0ZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5BZGRfUmVuYW1lZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkVuYWJsZVJhaXNpbmdFdmVudHMgPSBgJHRydWUKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJTdGF0dXN1ZWJlcndhY2h1bmcga29ubnRlIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW46ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgIH0KCiAgICB0cnkgewogICAgICAgIGAkc25hcHNob3REaXIgPSBTcGxpdC1QYXRoIC1QYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1QYXJlbnQKICAgICAgICBgJHNuYXBzaG90RmlsZSA9IFNwbGl0LVBhdGggLVBhdGggYCRJbnN0YWxsZWRQYWNrYWdlc1BhdGggLUxlYWYKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCBgJHNuYXBzaG90RGlyKSB7CiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVTeXN0ZW1XYXRjaGVyKGAkc25hcHNob3REaXIsIGAkc25hcHNob3RGaWxlKQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuTm90aWZ5RmlsdGVyID0gW1N5c3RlbS5JTy5Ob3RpZnlGaWx0ZXJzXSdMYXN0V3JpdGUsIEZpbGVOYW1lLCBTaXplJwogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuQWRkX0NoYW5nZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5BZGRfQ3JlYXRlZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkFkZF9SZW5hbWVkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuRW5hYmxlUmFpc2luZ0V2ZW50cyA9IGAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIlNuYXBzaG90dWViZXJ3YWNodW5nIGtvbm50ZSBuaWNodCBnZXN0YXJ0ZXQgd2VyZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICB9CiAgICBgJHN0YXRlUmVmcmVzaFRpbWVyLlN0YXJ0KCkKfSkKYCRmb3JtLkFkZF9Gb3JtQ2xvc2luZyh7CiAgICBgJHN0YXRlUmVmcmVzaFRpbWVyLlN0b3AoKQogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5EaXNwb3NlKCkKICAgIGlmIChgJHNjcmlwdDpTdGF0ZVdhdGNoZXIpIHsgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkRpc3Bvc2UoKSB9CiAgICBpZiAoYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyKSB7IGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5EaXNwb3NlKCkgfQp9KQoKYCRsaXN0LkFkZF9TZWxlY3RlZEluZGV4Q2hhbmdlZCh7IFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUgfSkKYCRsaXN0LkFkZF9Db2x1bW5DbGljayh7CiAgICBwYXJhbShgJHNlbmRlciwgYCRldmVudEFyZ3MpCiAgICBTb3J0LUxpc3RCeUNvbHVtbiAtQ29sdW1uSW5kZXggYCRldmVudEFyZ3MuQ29sdW1uCn0pCgpgJGxpc3QuQWRkX0RvdWJsZUNsaWNrKHsKICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtZ3QgMCkgewogICAgICAgIGlmIChgJGJ0bkluc3RhbGwuRW5hYmxlZCkgewogICAgICAgICAgICBgJGJ0bkluc3RhbGwuUGVyZm9ybUNsaWNrKCkKICAgICAgICB9CiAgICB9Cn0pCgpgJGZvcm0uQ29udHJvbHMuQWRkKGAkaGVhZGVyUGFuZWwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRncm91cEFwcHMpCmAkZm9ybS5Db250cm9scy5BZGQoYCRpbmZvUGFuZWwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRzdGF0dXMpCmAkZm9ybS5Db250cm9scy5BZGQoYCRwcm9ncmVzc0JhcikKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bkluc3RhbGwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5Vbmluc3RhbGwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5SZWZyZXNoKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuT3BlbkxvZykKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bkNsb3NlKQoKYCRmb3JtLkFjY2VwdEJ1dHRvbiA9IGAkYnRuSW5zdGFsbApgJGZvcm0uQ2FuY2VsQnV0dG9uID0gYCRidG5DbG9zZQoKdHJ5IHsKICAgIExvYWQtQXBwTGlzdAp9CmNhdGNoIHsKICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyIGJlaW0gTGFkZW46ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAiRGVyIFNvZnR3YXJla2F0YWxvZyBrb25udGUgbmljaHQgdm9sbHN0w6RuZGlnIGdlbGFkZW4gd2VyZGVuLmByYG5gcmBuIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgKSB8IE91dC1OdWxsCn0KClt2b2lkXWAkZm9ybS5TaG93RGlhbG9nKCkKIkAKCiAgICBXcml0ZS1UZXh0RmlsZSAtUGF0aCAkQ2F0YWxvZ0d1aVBhdGggLUNvbnRlbnQgJGNvbnRlbnQgLUVuY29kaW5nIFV0ZjhCb20KICAgIFNldC1GaWxlQWNsQWRtaW5zT25seSAtUGF0aCAkQ2F0YWxvZ0d1aVBhdGgKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dMYXVuY2hlciB7CiAgICAkcHNRdW90ZWQgPSAkUG93ZXJTaGVsbEV4ZS5SZXBsYWNlKCciJywgJyIiJykKICAgICRndWlRdW90ZWQgPSAkQ2F0YWxvZ0d1aVBhdGguUmVwbGFjZSgnIicsICciIicpCgogICAgJHZicyA9IEAiClNldCBzaGVsbCA9IENyZWF0ZU9iamVjdCgiV1NjcmlwdC5TaGVsbCIpCmNtZExpbmUgPSBDaHIoMzQpICYgIiRwc1F1b3RlZCIgJiBDaHIoMzQpICYgIiAtTm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1TVEEgLVdpbmRvd1N0eWxlIEhpZGRlbiAtRmlsZSAiICYgQ2hyKDM0KSAmICIkZ3VpUXVvdGVkIiAmIENocigzNCkKc2hlbGwuUnVuIGNtZExpbmUsIDAsIEZhbHNlCiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJENhdGFsb2dMYXVuY2hlclBhdGggLUNvbnRlbnQgJHZicyAtRW5jb2RpbmcgVW5pY29kZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRDYXRhbG9nTGF1bmNoZXJQYXRoCn0KCmZ1bmN0aW9uIE5ldy1TaG9ydGN1dCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kU2hvcnRjdXRQYXRoCiAgICApCgogICAgJHBhcmVudCA9IFNwbGl0LVBhdGggLVBhdGggJFNob3J0Y3V0UGF0aCAtUGFyZW50CiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRwYXJlbnQKCiAgICAkc2hlbGwgPSBOZXctT2JqZWN0IC1Db21PYmplY3QgV1NjcmlwdC5TaGVsbAogICAgJHNob3J0Y3V0ID0gJHNoZWxsLkNyZWF0ZVNob3J0Y3V0KCRTaG9ydGN1dFBhdGgpCiAgICAkc2hvcnRjdXQuVGFyZ2V0UGF0aCA9ICRXU2NyaXB0RXhlCiAgICAkc2hvcnRjdXQuQXJndW1lbnRzID0gImAiJENhdGFsb2dMYXVuY2hlclBhdGhgIiIKICAgICRzaG9ydGN1dC5Xb3JraW5nRGlyZWN0b3J5ID0gJEJhc2VEaXIKICAgICRzaG9ydGN1dC5XaW5kb3dTdHlsZSA9IDEKICAgICRzaG9ydGN1dC5EZXNjcmlwdGlvbiA9ICRDYXRhbG9nRGlzcGxheU5hbWUKICAgICRzaG9ydGN1dC5JY29uTG9jYXRpb24gPSAiJGVudjpTeXN0ZW1Sb290XFN5c3RlbTMyXHNoZWxsMzIuZGxsLDgwIgogICAgJHNob3J0Y3V0LlNhdmUoKQp9CgpmdW5jdGlvbiBVbnJlZ2lzdGVyLUxlZ2FjeVF1ZXVlVGFzayB7CiAgICB0cnkgewogICAgICAgICR0YXNrID0gR2V0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRMZWdhY3lRdWV1ZVRhc2tOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgaWYgKCR0YXNrKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiUmVtb3ZpbmcgbGVnYWN5IHNjaGVkdWxlZCB0YXNrICckTGVnYWN5UXVldWVUYXNrTmFtZScuIgogICAgICAgICAgICBVbnJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRMZWdhY3lRdWV1ZVRhc2tOYW1lIC1Db25maXJtOiRmYWxzZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCByZW1vdmUgbGVnYWN5IHNjaGVkdWxlZCB0YXNrICckTGVnYWN5UXVldWVUYXNrTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KfQoKZnVuY3Rpb24gUmVnaXN0ZXItT3JVcGRhdGVUYXNrcyB7CiAgICBVbnJlZ2lzdGVyLUxlZ2FjeVF1ZXVlVGFzawoKICAgIHRyeSB7CiAgICAgICAgJGV4aXN0aW5nRGFlbW9uID0gR2V0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIGlmICgkZXhpc3RpbmdEYWVtb24pIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJTdG9wcGluZyBzY2hlZHVsZWQgdGFzayAnJERhZW1vblRhc2tOYW1lJyBiZWZvcmUgdXBkYXRlLiIKICAgICAgICAgICAgU3RvcC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMgogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdG9wIGRhZW1vbiB0YXNrICckRGFlbW9uVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9CgogICAgJHByaW5jaXBhbCA9IE5ldy1TY2hlZHVsZWRUYXNrUHJpbmNpcGFsIGAKICAgICAgICAtVXNlcklkICdTWVNURU0nIGAKICAgICAgICAtTG9nb25UeXBlIFNlcnZpY2VBY2NvdW50IGAKICAgICAgICAtUnVuTGV2ZWwgSGlnaGVzdAoKICAgIFdyaXRlLUxvZyAiUmVnaXN0ZXJpbmcvdXBkYXRpbmcgc2NoZWR1bGVkIHRhc2sgJyREYWVtb25UYXNrTmFtZScuIgogICAgJGRhZW1vbkFyZ3MgPSAiLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtRmlsZSBgIiRMb2NhbFNjcmlwdFBhdGhgIiAtTW9kZSBEYWVtb24iCiAgICAkZGFlbW9uQWN0aW9uID0gTmV3LVNjaGVkdWxlZFRhc2tBY3Rpb24gLUV4ZWN1dGUgJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50ICRkYWVtb25BcmdzCiAgICAkZGFlbW9uVHJpZ2dlciA9IE5ldy1TY2hlZHVsZWRUYXNrVHJpZ2dlciAtQXRTdGFydHVwCiAgICAkZGFlbW9uU2V0dGluZ3MgPSBOZXctU2NoZWR1bGVkVGFza1NldHRpbmdzU2V0IGAKICAgICAgICAtQWxsb3dTdGFydElmT25CYXR0ZXJpZXMgYAogICAgICAgIC1Eb250U3RvcElmR29pbmdPbkJhdHRlcmllcyBgCiAgICAgICAgLVN0YXJ0V2hlbkF2YWlsYWJsZSBgCiAgICAgICAgLU11bHRpcGxlSW5zdGFuY2VzIElnbm9yZU5ldyBgCiAgICAgICAgLUV4ZWN1dGlvblRpbWVMaW1pdCAoTmV3LVRpbWVTcGFuIC1TZWNvbmRzIDApIGAKICAgICAgICAtUmVzdGFydENvdW50IDMgYAogICAgICAgIC1SZXN0YXJ0SW50ZXJ2YWwgKE5ldy1UaW1lU3BhbiAtTWludXRlcyAxKQoKICAgICRkYWVtb25UYXNrID0gTmV3LVNjaGVkdWxlZFRhc2sgYAogICAgICAgIC1BY3Rpb24gJGRhZW1vbkFjdGlvbiBgCiAgICAgICAgLVRyaWdnZXIgJGRhZW1vblRyaWdnZXIgYAogICAgICAgIC1QcmluY2lwYWwgJHByaW5jaXBhbCBgCiAgICAgICAgLVNldHRpbmdzICRkYWVtb25TZXR0aW5ncwoKICAgIFJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZSAtSW5wdXRPYmplY3QgJGRhZW1vblRhc2sgLUZvcmNlIHwgT3V0LU51bGwKCiAgICBXcml0ZS1Mb2cgIlJlZ2lzdGVyaW5nL3VwZGF0aW5nIHNjaGVkdWxlZCB0YXNrICckVXBncmFkZVRhc2tOYW1lJy4iCiAgICAkdXBncmFkZUFyZ3MgPSAiLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtRmlsZSBgIiRMb2NhbFNjcmlwdFBhdGhgIiAtTW9kZSBVcGdyYWRlQWxsIgogICAgJHVwZ3JhZGVBY3Rpb24gPSBOZXctU2NoZWR1bGVkVGFza0FjdGlvbiAtRXhlY3V0ZSAkUG93ZXJTaGVsbEV4ZSAtQXJndW1lbnQgJHVwZ3JhZGVBcmdzCiAgICAkdXBncmFkZVRyaWdnZXIgPSBOZXctU2NoZWR1bGVkVGFza1RyaWdnZXIgYAogICAgICAgIC1PbmNlIGAKICAgICAgICAtQXQgKChHZXQtRGF0ZSkuQWRkTWludXRlcygyKSkgYAogICAgICAgIC1SZXBldGl0aW9uSW50ZXJ2YWwgKE5ldy1UaW1lU3BhbiAtSG91cnMgMikgYAogICAgICAgIC1SZXBldGl0aW9uRHVyYXRpb24gKE5ldy1UaW1lU3BhbiAtRGF5cyAzNjUwKQogICAgJHVwZ3JhZGVTZXR0aW5ncyA9IE5ldy1TY2hlZHVsZWRUYXNrU2V0dGluZ3NTZXQgYAogICAgICAgIC1BbGxvd1N0YXJ0SWZPbkJhdHRlcmllcyBgCiAgICAgICAgLURvbnRTdG9wSWZHb2luZ09uQmF0dGVyaWVzIGAKICAgICAgICAtU3RhcnRXaGVuQXZhaWxhYmxlIGAKICAgICAgICAtTXVsdGlwbGVJbnN0YW5jZXMgSWdub3JlTmV3IGAKICAgICAgICAtRXhlY3V0aW9uVGltZUxpbWl0IChOZXctVGltZVNwYW4gLUhvdXJzIDIpCgogICAgJHVwZ3JhZGVUYXNrID0gTmV3LVNjaGVkdWxlZFRhc2sgYAogICAgICAgIC1BY3Rpb24gJHVwZ3JhZGVBY3Rpb24gYAogICAgICAgIC1UcmlnZ2VyICR1cGdyYWRlVHJpZ2dlciBgCiAgICAgICAgLVByaW5jaXBhbCAkcHJpbmNpcGFsIGAKICAgICAgICAtU2V0dGluZ3MgJHVwZ3JhZGVTZXR0aW5ncwoKICAgIFJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRVcGdyYWRlVGFza05hbWUgLUlucHV0T2JqZWN0ICR1cGdyYWRlVGFzayAtRm9yY2UgfCBPdXQtTnVsbAoKICAgIHRyeSB7CiAgICAgICAgU3RhcnQtU2NoZWR1bGVkVGFzayAtVGFza05hbWUgJERhZW1vblRhc2tOYW1lCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RhcnQgZGFlbW9uIHRhc2sgJyREYWVtb25UYXNrTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVdpbmdldEluc3RhbGwgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFdpbmdldFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhY2thZ2VJZCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICdpbnN0YWxsJwogICAgICAgICctLWlkJywgJFBhY2thZ2VJZAogICAgICAgICctLWV4YWN0JwogICAgICAgICctLXNjb3BlJywgJ21hY2hpbmUnCiAgICAgICAgJy0tc2lsZW50JwogICAgICAgICctLWFjY2VwdC1wYWNrYWdlLWFncmVlbWVudHMnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZzogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnSW5zdGFsbCcgLVN0YWdlVGV4dCAnSW5zdGFsbGF0aW9uIGzDpHVmdC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQoKICAgICRvdXRwdXRMaW5lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKICAgICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICRsaW5lID0gW3N0cmluZ10kXwogICAgICAgIFt2b2lkXSRvdXRwdXRMaW5lcy5BZGQoJGxpbmUpCiAgICAgICAgaWYgKCRsaW5lLlRyaW0oKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldDogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdEb3dubG9hZCcgLVN0YWdlVGV4dCAoIkRvd25sb2FkIGzDpHVmdC4uLiB7MH0lIiAtZiAkcGVyY2VudCkgLVByb2dyZXNzUGVyY2VudCAkcGVyY2VudCAtSXNJbmRldGVybWluYXRlOiRmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJGV4aXRDb2RlID0gJExBU1RFWElUQ09ERQoKICAgIHJldHVybiAkZXhpdENvZGUKfQoKZnVuY3Rpb24gSW52b2tlLVdpbmdldFVuaW5zdGFsbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGFja2FnZUlkLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ3VuaW5zdGFsbCcKICAgICAgICAnLS1pZCcsICRQYWNrYWdlSWQKICAgICAgICAnLS1leGFjdCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtc291cmNlLWFncmVlbWVudHMnCiAgICAgICAgJy0tZGlzYWJsZS1pbnRlcmFjdGl2aXR5JwogICAgKQoKICAgIFdyaXRlLUxvZyAiRXhlY3V0aW5nOiBgIiRXaW5nZXRQYXRoYCIgJCgkYXJndW1lbnRzIC1qb2luICcgJykiCiAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVbmluc3RhbGwnIC1TdGFnZVRleHQgJ0RlaW5zdGFsbGF0aW9uIGzDpHVmdC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQoKICAgICRvdXRwdXRMaW5lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKICAgICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICRsaW5lID0gW3N0cmluZ10kXwogICAgICAgIFt2b2lkXSRvdXRwdXRMaW5lcy5BZGQoJGxpbmUpCiAgICAgICAgaWYgKCRsaW5lLlRyaW0oKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldDogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVbmluc3RhbGwnIC1TdGFnZVRleHQgKCJEZWluc3RhbGxhdGlvbiBsw6R1ZnQuLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRVcGdyYWRlQWxsIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ3VwZ3JhZGUnCiAgICAgICAgJy0tYWxsJwogICAgICAgICctLXNjb3BlJywgJ21hY2hpbmUnCiAgICAgICAgJy0tc2lsZW50JwogICAgICAgICctLWFjY2VwdC1wYWNrYWdlLWFncmVlbWVudHMnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZyAyLWhvdXIgdXBncmFkZTogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVXBncmFkZScgLVN0YWdlVGV4dCAnVXBkYXRlcyBsYXVmZW4uLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgdXBncmFkZTogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVcGdyYWRlJyAtU3RhZ2VUZXh0ICgiVXBkYXRlcyBsYXVmZW4uLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgoKICAgICR0ZW1wUm9vdCA9IGlmICgkZW52OlRFTVApIHsgJGVudjpURU1QIH0gZWxzZWlmICgkZW52OlRNUCkgeyAkZW52OlRNUCB9IGVsc2UgeyAkQmFzZURpciB9CiAgICAkdGVtcEZpbGUgPSBKb2luLVBhdGggJHRlbXBSb290ICgic2VsZnNlcnZpY2Utd2luZ2V0LWV4cG9ydC17MH0uanNvbiIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKICAgICRzbmFwc2hvdFRlbXBGaWxlID0gSm9pbi1QYXRoICRCYXNlRGlyICgiSW5zdGFsbGVkLVBhY2thZ2VzLXswfS5qc29uLnRtcCIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKCiAgICAkYXJndW1lbnRzID0gQCgKICAgICAgICAnZXhwb3J0JwogICAgICAgICctLW91dHB1dCcsICR0ZW1wRmlsZQogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICdSZWZyZXNoaW5nIGluc3RhbGxlZCBwYWNrYWdlIHNuYXBzaG90LicKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ1NuYXBzaG90JyAtU3RhZ2VUZXh0ICdJbnN0YWxsYXRpb25zZGF0ZW4gd2VyZGVuIGFrdHVhbGlzaWVydC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQogICAgJG91dHB1dCA9ICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgT3V0LVN0cmluZwogICAgJGV4aXRDb2RlID0gJExBU1RFWElUQ09ERQoKICAgIGlmICgkb3V0cHV0KSB7CiAgICAgICAgZm9yZWFjaCAoJGxpbmUgaW4gKCRvdXRwdXQgLXNwbGl0ICJgcj9gbiIpKSB7CiAgICAgICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IGV4cG9ydDogJGxpbmUiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCRleGl0Q29kZSAtbmUgMCkgewogICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IGV4cG9ydCBmYWlsZWQgd2l0aCBjb2RlICRleGl0Q29kZTsgc25hcHNob3Qgd2FzIG5vdCB1cGRhdGVkLiIgJ1dBUk4nCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlKSB7CiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgfQogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUpKSB7CiAgICAgICAgV3JpdGUtTG9nICd3aW5nZXQgZXhwb3J0IGRpZCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZTsgc25hcHNob3Qgd2FzIG5vdCB1cGRhdGVkLicgJ1dBUk4nCiAgICAgICAgcmV0dXJuICRmYWxzZQogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUgLVJhdyAtRW5jb2RpbmcgVVRGOAogICAgICAgICRleHBvcnQgPSAkcmF3IHwgQ29udmVydEZyb20tSnNvbgoKICAgICAgICAkcGFja2FnZUlkcyA9IEAoKQogICAgICAgIGZvcmVhY2ggKCRzb3VyY2UgaW4gQCgkZXhwb3J0LlNvdXJjZXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRwa2cgaW4gQCgkc291cmNlLlBhY2thZ2VzKSkgewogICAgICAgICAgICAgICAgaWYgKCRwa2cuUGFja2FnZUlkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZUlkcyArPSBbc3RyaW5nXSRwa2cuUGFja2FnZUlkZW50aWZpZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBrZy5QYWNrYWdlSWQpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZUlkcyArPSBbc3RyaW5nXSRwa2cuUGFja2FnZUlkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRwYWNrYWdlSWRzID0gJHBhY2thZ2VJZHMgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJF8pIH0gfAogICAgICAgICAgICBGb3JFYWNoLU9iamVjdCB7ICRfLlRyaW0oKSB9IHwKICAgICAgICAgICAgU29ydC1PYmplY3QgLVVuaXF1ZQoKICAgICAgICAkc25hcHNob3QgPSBbb3JkZXJlZF1AewogICAgICAgICAgICBHZW5lcmF0ZWRBdCAgICAgICAgICA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICBJbnN0YWxsZWRQYWNrYWdlSWRzICA9IEAoJHBhY2thZ2VJZHMpCiAgICAgICAgfQoKICAgICAgICAkc25hcHNob3QgfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggNSB8IFNldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkc25hcHNob3RUZW1wRmlsZSAtRW5jb2RpbmcgVVRGOAogICAgICAgIE1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLURlc3RpbmF0aW9uICRJbnN0YWxsZWRQYWNrYWdlc1BhdGggLUZvcmNlCiAgICAgICAgV3JpdGUtTG9nICJJbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdCB3cml0dGVuIHRvICckSW5zdGFsbGVkUGFja2FnZXNQYXRoJyAoY291bnQ9JChAKCRwYWNrYWdlSWRzKS5Db3VudCkpLiIKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byB3cml0ZSBpbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkc25hcHNob3RUZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0IHsKICAgICRzZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJEluc3RhbGxlZFBhY2thZ2VzUGF0aCkpIHsKICAgICAgICByZXR1cm4gJHNldAogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkcmF3KSkgewogICAgICAgICAgICByZXR1cm4gJHNldAogICAgICAgIH0KCiAgICAgICAgJHNuYXBzaG90ID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBmb3JlYWNoICgkaWQgaW4gQCgkc25hcHNob3QuSW5zdGFsbGVkUGFja2FnZUlkcykpIHsKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXSRpZCkpIHsKICAgICAgICAgICAgICAgIFt2b2lkXSRzZXQuQWRkKChbc3RyaW5nXSRpZCkuVHJpbSgpKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgaW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Q6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KCiAgICByZXR1cm4gJHNldAp9CgpmdW5jdGlvbiBJbnZva2UtUmVxdWlyZWRTb2Z0d2FyZVBvbGljeSB7CiAgICBwYXJhbShbc3RyaW5nXSRXaW5nZXRQYXRoKQoKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgV3JpdGUtTG9nICdSZXF1aXJlZCBzb2Z0d2FyZSBwb2xpY3kgc2tpcHBlZCBiZWNhdXNlIFNvZnR3YXJla2F0YWxvZyBwb2xpY3kgaXMgZGlzYWJsZWQgb3Igbm90IGNvbmZpZ3VyZWQuJyAnV0FSTicKICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7IEluc3RhbGxlZCA9IDA7IEZhaWxlZCA9IDA7IFNraXBwZWQgPSAwIH0KICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1SZXF1aXJlZEVuZm9yY2VtZW50RW5hYmxlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1JlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IGlzIGRpc2FibGVkIGJ5IHBvbGljeS4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgJHJlcXVpcmVkQWxpYXNlcyA9IEAoR2V0LVJlcXVpcmVkQWxpYXNlcykKICAgIGlmICgkcmVxdWlyZWRBbGlhc2VzLkNvdW50IC1sdCAxKSB7CiAgICAgICAgV3JpdGUtTG9nICdObyByZXF1aXJlZCBzb2Z0d2FyZSBjb25maWd1cmVkIGJ5IHBvbGljeS4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgaWYgKCRXaW5nZXRQYXRoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1UaW1lb3V0U2Vjb25kcyAyIC1TY3JpcHRCbG9jayB7CiAgICAgICAgICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICRXaW5nZXRQYXRoCiAgICAgICAgICAgIH0gfCBPdXQtTnVsbAogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiQ291bGQgbm90IHJlZnJlc2ggc25hcHNob3QgYmVmb3JlIHJlcXVpcmVkIHF1ZXVlaW5nOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgfQogICAgfQoKICAgICRxdWV1ZWQgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAogICAgaWYgKCRxdWV1ZWQgLWd0IDApIHsKICAgICAgICBTdGFydC1RdWV1ZVdvcmtlcgogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDA7IFF1ZXVlZCA9ICRxdWV1ZWQgfQp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ1BpcGVTZWN1cml0eSB7CiAgICAkcGlwZVNlY3VyaXR5ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuUGlwZVNlY3VyaXR5CgogICAgJHNpZFN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTE4JykKICAgICRzaWRBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDQnKQogICAgJHNpZFVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ1JykKCiAgICAkcnVsZVN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6RnVsbENvbnRyb2wsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKICAgICRydWxlQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuUGlwZUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZEFkbWlucywKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSaWdodHNdOjpGdWxsQ29udHJvbCwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGVdOjpBbGxvdwogICAgKQogICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRVc2VycywKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSaWdodHNdOjpSZWFkV3JpdGUsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKCiAgICAkbnVsbCA9ICRwaXBlU2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJHBpcGVTZWN1cml0eS5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkcGlwZVNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICByZXR1cm4gJHBpcGVTZWN1cml0eQp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ1BpcGVTZXJ2ZXIgewogICAgJHBpcGVTZWN1cml0eSA9IE5ldy1DYXRhbG9nUGlwZVNlY3VyaXR5CiAgICByZXR1cm4gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlU2VydmVyU3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAkUGlwZU5hbWUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlRGlyZWN0aW9uXTo6SW5PdXQsCiAgICAgICAgMSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVUcmFuc21pc3Npb25Nb2RlXTo6Qnl0ZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICA0MDk2LAogICAgICAgIDQwOTYsCiAgICAgICAgJHBpcGVTZWN1cml0eQogICAgKQp9CgpmdW5jdGlvbiBHZXQtUGlwZUNsaWVudElkZW50aXR5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZVNlcnZlclN0cmVhbV0kUGlwZSkKCiAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUgPSAkbnVsbAogICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlTaWQgPSAkbnVsbAoKICAgIHRyeSB7CiAgICAgICAgJFBpcGUuUnVuQXNDbGllbnQoW1N5c3RlbS5JTy5QaXBlcy5QaXBlU3RyZWFtSW1wZXJzb25hdGlvbldvcmtlcl17CiAgICAgICAgICAgICRpZGVudGl0eSA9IFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLldpbmRvd3NJZGVudGl0eV06OkdldEN1cnJlbnQoKQogICAgICAgICAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUgPSAkaWRlbnRpdHkuTmFtZQogICAgICAgICAgICBpZiAoJGlkZW50aXR5LlVzZXIpIHsKICAgICAgICAgICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkID0gJGlkZW50aXR5LlVzZXIuVmFsdWUKICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJFBpcGUuR2V0SW1wZXJzb25hdGlvblVzZXJOYW1lKCkKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgIH0KICAgIH0KCiAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUpKSB7CiAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJ1Vua25vd24nCiAgICB9CgogICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgIE5hbWUgPSAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUKICAgICAgICBTaWQgID0gJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlTaWQKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb25Db21tYW5kIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV0kUmVxdWVzdCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldJENsaWVudElkZW50aXR5CiAgICApCgogICAgaWYgKC1ub3QgJENsaWVudElkZW50aXR5IC1vciBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRDbGllbnRJZGVudGl0eS5OYW1lKSAtb3IgJENsaWVudElkZW50aXR5Lk5hbWUgLWVxICdVbmtub3duJykgewogICAgICAgIHRocm93ICdOYW1lZCBwaXBlIGNsaWVudCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZC4nCiAgICB9CgogICAgJGNvbW1hbmQgPSAkbnVsbAogICAgJGNvbW1hbmRQcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0NvbW1hbmQnXQogICAgJGFjdGlvblByb3BlcnR5ID0gJFJlcXVlc3QuUFNPYmplY3QuUHJvcGVydGllc1snQWN0aW9uJ10KICAgIGlmICgkY29tbWFuZFByb3BlcnR5IC1hbmQgJGNvbW1hbmRQcm9wZXJ0eS5WYWx1ZSkgewogICAgICAgICRjb21tYW5kID0gW3N0cmluZ10kY29tbWFuZFByb3BlcnR5LlZhbHVlCiAgICB9CiAgICBlbHNlaWYgKCRhY3Rpb25Qcm9wZXJ0eSAtYW5kICRhY3Rpb25Qcm9wZXJ0eS5WYWx1ZSkgewogICAgICAgICRjb21tYW5kID0gW3N0cmluZ10kYWN0aW9uUHJvcGVydHkuVmFsdWUKICAgIH0KCiAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkY29tbWFuZCkpIHsKICAgICAgICB0aHJvdyAnTWlzc2luZyBjb21tYW5kLicKICAgIH0KCiAgICAkY29tbWFuZCA9ICRjb21tYW5kLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKCiAgICBzd2l0Y2ggKCRjb21tYW5kKSB7CiAgICAgICAgeyAkXyAtaW4gQCgnZ2V0Y2F0YWxvZycsJ2dldHN0YXRlJykgfSB7CiAgICAgICAgICAgICRyZXF1aXJlZFF1ZXVlZCA9IEVuc3VyZS1SZXF1aXJlZFNvZnR3YXJlUXVldWVkCiAgICAgICAgICAgIGlmICgkcmVxdWlyZWRRdWV1ZWQgLWd0IDApIHsKICAgICAgICAgICAgICAgIFN0YXJ0LVF1ZXVlV29ya2VyCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNhdGFsb2cgPSBAKEdldC1BcHBDYXRhbG9nT2JqZWN0cyB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lKQogICAgICAgICAgICAkcmVxdWlyZWRBbGlhc2VzID0gQChHZXQtUmVxdWlyZWRBbGlhc2VzKQogICAgICAgICAgICAkcmVxdWlyZWRTZXQgPSBHZXQtUmVxdWlyZWRBbGlhc1NldAogICAgICAgICAgICAkaW5zdGFsbGVkSWRzID0gQCgoR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldCkgfCBGb3JFYWNoLU9iamVjdCB7IFtzdHJpbmddJF8gfSkKICAgICAgICAgICAgJHF1ZXVlU3RhdGUgPSBHZXQtUXVldWVTdGF0ZVNuYXBzaG90CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9ICR0cnVlCiAgICAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICAgICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIENhdGFsb2cgICAgICAgICAgICA9ICRjYXRhbG9nCiAgICAgICAgICAgICAgICBSZXF1aXJlZEFsaWFzZXMgICAgPSAkcmVxdWlyZWRBbGlhc2VzCiAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICAgICAgPSBAKCRxdWV1ZVN0YXRlLlF1ZXVlKQogICAgICAgICAgICAgICAgQ3VycmVudCAgICAgICAgICAgID0gJHF1ZXVlU3RhdGUuQ3VycmVudAogICAgICAgICAgICAgICAgVmVyc2lvbiAgICAgICAgICAgID0gJHF1ZXVlU3RhdGUuVmVyc2lvbgogICAgICAgICAgICAgICAgSW5zdGFsbGVkUGFja2FnZUlkcyA9ICRpbnN0YWxsZWRJZHMKICAgICAgICAgICAgICAgIEFsbG93VXNlckluc3RhbGxzICA9IChUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQpCiAgICAgICAgICAgICAgICBBbGxvd1VzZXJVbmluc3RhbGwgPSAoVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCkKICAgICAgICAgICAgICAgIEVuZm9yY2VSZXF1aXJlZCAgICA9IChUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkKQogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgID0gJ0thdGFsb2cgZ2VsYWRlbi4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICdhcHBseXBvbGljeScgewogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgcG9saWN5IGFwcGx5IHJlcXVlc3RlZCBieSB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKICAgICAgICAgICAgU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIC1Xb3JrZXJNb2RlIEFwcGx5UG9saWN5CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJENsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgPSAnUG9saWN5YW53ZW5kdW5nIGdlc3RhcnRldC4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsgJF8gLWluIEAoJ2luc3RhbGwnLCd1bmluc3RhbGwnKSB9IHsKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAnaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnQmVudXR6ZXJpbnN0YWxsYXRpb25lbiBzaW5kIHBlciBSaWNodGxpbmllIGRlYWt0aXZpZXJ0LicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnQmVudXR6ZXJkZWluc3RhbGxhdGlvbmVuIHNpbmQgcGVyIFJpY2h0bGluaWUgZGVha3RpdmllcnQuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYXBwQWxpYXNQcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0FwcEFsaWFzJ10KICAgICAgICAgICAgaWYgKC1ub3QgJGFwcEFsaWFzUHJvcGVydHkgLW9yIFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ10kYXBwQWxpYXNQcm9wZXJ0eS5WYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdNaXNzaW5nIEFwcEFsaWFzLicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJGFwcEFsaWFzUHJvcGVydHkuVmFsdWUpLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKICAgICAgICAgICAgJHBhY2thZ2VJZCA9IEdldC1QYWNrYWdlSWRCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgICAgICAgICAgaWYgKC1ub3QgJHBhY2thZ2VJZCkgewogICAgICAgICAgICAgICAgdGhyb3cgIkFsaWFzICckYWxpYXMnIGlzIG5vdCBpbiB0aGUgYWxsb3dsaXN0LiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucygkYWxpYXMpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYWN0aW9uVGV4dCA9IGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsgJ3VuaW5zdGFsbCcgfSBlbHNlIHsgJ2luc3RhbGwnIH0KICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHJlcXVlc3Q6IGFjdGlvbj0kYWN0aW9uVGV4dCBhbGlhcz0nJGFsaWFzJyBwYWNrYWdlPSckcGFja2FnZUlkJyB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKCiAgICAgICAgICAgICRxdWV1ZVJlc3VsdCA9IEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIC1BY3Rpb24gJGNvbW1hbmQgLUFsaWFzICRhbGlhcyAtUmVxdWVzdGVkQnkgJENsaWVudElkZW50aXR5Lk5hbWUgLVJlcXVlc3RlZEJ5U2lkICRDbGllbnRJZGVudGl0eS5TaWQgLVNvdXJjZSBVc2VyCiAgICAgICAgICAgIFN0YXJ0LVF1ZXVlV29ya2VyCgogICAgICAgICAgICAkdmVyYiA9IGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsgJ0RlaW5zdGFsbGF0aW9uJyB9IGVsc2UgeyAnSW5zdGFsbGF0aW9uJyB9CiAgICAgICAgICAgICRtZXNzYWdlID0gaWYgKCRxdWV1ZVJlc3VsdC5BZGRlZCkgeyAiJHZlcmIgZWluZ2VyZWlodDogJGFsaWFzIiB9IGVsc2UgeyAiJHZlcmIgaXN0IGJlcmVpdHMgaW4gZGVyIFdhcnRlc2NobGFuZ2U6ICRhbGlhcyIgfQogICAgICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIEFwcEFsaWFzICAgICAgICA9ICRhbGlhcwogICAgICAgICAgICAgICAgUGFja2FnZUlkICAgICAgID0gJHBhY2thZ2VJZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIFF1ZXVlSWQgICAgICAgICA9ICRxdWV1ZVJlc3VsdC5JdGVtLklkCiAgICAgICAgICAgICAgICBRdWV1ZWQgICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0gJG1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeyAkXyAtaW4gQCgncmVmcmVzaHN0YXR1cycsJ2dldHN0YXR1cycpIH0gewogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgc3RhdHVzIHJlZnJlc2ggcmVxdWVzdGVkIGJ5IHVzZXI9JyQoJENsaWVudElkZW50aXR5Lk5hbWUpJyBzaWQ9JyQoJENsaWVudElkZW50aXR5LlNpZCknIgogICAgICAgICAgICAkd2luZ2V0UGF0aCA9IEVuc3VyZS1XaW5nZXRBdmFpbGFibGUKICAgICAgICAgICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICAgICAgICAgIHRocm93ICd3aW5nZXQgaXMgdW5hdmFpbGFibGUuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0ID0gSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1UaW1lb3V0U2Vjb25kcyAyIC1TY3JpcHRCbG9jayB7CiAgICAgICAgICAgICAgICAkc25hcHNob3RVcGRhdGVkID0gVXBkYXRlLUluc3RhbGxlZFBhY2thZ2VzU25hcHNob3QgLVdpbmdldFBhdGggJHdpbmdldFBhdGgKICAgICAgICAgICAgICAgIFtwc2N1c3RvbW9iamVjdF1AeyBTbmFwc2hvdFVwZGF0ZWQgPSBbYm9vbF0kc25hcHNob3RVcGRhdGVkIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gQCgkcmVzdWx0KVstMV0KCiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICA9IFtib29sXSRyZXN1bHQuU25hcHNob3RVcGRhdGVkCiAgICAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIFNuYXBzaG90VXBkYXRlZCA9IFtib29sXSRyZXN1bHQuU25hcHNob3RVcGRhdGVkCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICAgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICB0aHJvdyAiVW5zdXBwb3J0ZWQgY29tbWFuZCAnJGNvbW1hbmQnLiIKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIFN0YXJ0LUNhdGFsb2dEYWVtb24gewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBzdGFydGluZyBvbiAnXFwuXHBpcGVcJFBpcGVOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdGFydCBpbml0aWFsIHJlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IHdvcmtlcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgIHdoaWxlICgkdHJ1ZSkgewogICAgICAgICRwaXBlID0gJG51bGwKICAgICAgICB0cnkgewogICAgICAgICAgICAkcGlwZSA9IE5ldy1DYXRhbG9nUGlwZVNlcnZlcgogICAgICAgICAgICAkcGlwZS5XYWl0Rm9yQ29ubmVjdGlvbigpCgogICAgICAgICAgICAkY2xpZW50SWRlbnRpdHkgPSBHZXQtUGlwZUNsaWVudElkZW50aXR5IC1QaXBlICRwaXBlCiAgICAgICAgICAgICRlbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSkKICAgICAgICAgICAgJHJlYWRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVJlYWRlcigkcGlwZSwgJGVuY29kaW5nKQogICAgICAgICAgICAkd3JpdGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtV3JpdGVyKCRwaXBlLCAkZW5jb2RpbmcpCiAgICAgICAgICAgICR3cml0ZXIuQXV0b0ZsdXNoID0gJHRydWUKCiAgICAgICAgICAgICRyZXNwb25zZSA9ICRudWxsCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkbGluZSA9ICRyZWFkZXIuUmVhZExpbmUoKQogICAgICAgICAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0VtcHR5IHJlcXVlc3QuJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXF1ZXN0ID0gJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbkNvbW1hbmQgLVJlcXVlc3QgJHJlcXVlc3QgLUNsaWVudElkZW50aXR5ICRjbGllbnRJZGVudGl0eQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTmFtZWQgcGlwZSByZXF1ZXN0IGZhaWxlZDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJGZhbHNlCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkY2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJGNsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgID0gJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHdyaXRlci5Xcml0ZUxpbmUoKCRyZXNwb25zZSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcyAtRGVwdGggNikpCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBlcnJvcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcGlwZS5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMgewogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ05hY2ggTmV1c3RhcnQgZXJuZXV0IGVpbmdlcmVpaHQnCiAgICAgICAgICAgICAgICAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQgPSAkbnVsbAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFydGVkQXQgPSAkbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LU5leHRRdWV1ZWRJdGVtIHsKICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRudWxsCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIChAKCRzdGF0ZS5RdWV1ZSkgfCBTb3J0LU9iamVjdCBDcmVhdGVkQXQpKSB7CiAgICAgICAgICAgIGlmICgtbm90ICRpdGVtKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRpdGVtLlN0YXRlIC1lcSAnUXVldWVkJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUnVubmluZycKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJ1N0YXJ0aW5nJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ1ZvcmJlcmVpdHVuZy4uLicKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgICAgICAgICAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUgPSAkdHJ1ZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhcnRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgICAgICAgICAkc3RhdGUuQ3VycmVudCA9IFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgICAgICAgICAgICAgIElkID0gJGl0ZW0uSWQKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPSAkaXRlbS5BY3Rpb24KICAgICAgICAgICAgICAgICAgICBBbGlhcyA9ICRpdGVtLkFsaWFzCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkaXRlbS5EaXNwbGF5TmFtZQogICAgICAgICAgICAgICAgICAgIFN0YWdlID0gJGl0ZW0uU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkaXRlbS5TdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRpdGVtCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRpdGVtID0gJHNjcmlwdDpOZXh0UXVldWVJdGVtCiAgICAkc2NyaXB0Ok5leHRRdWV1ZUl0ZW0gPSAkbnVsbAogICAgcmV0dXJuICRpdGVtCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnU3VjY2VlZGVkJywnRmFpbGVkJyldW3N0cmluZ10kU3RhdGUsCiAgICAgICAgW2ludF0kRXhpdENvZGUgPSAwLAogICAgICAgIFtzdHJpbmddJE1lc3NhZ2UKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHF1ZXVlU3RhdGUpCiAgICAgICAgZm9yZWFjaCAoJGl0ZW0gaW4gQCgkcXVldWVTdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAkU3RhdGUKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJFN0YXRlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZVRleHQgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gaWYgKCRTdGF0ZSAtZXEgJ1N1Y2NlZWRlZCcpIHsgMTAwIH0gZWxzZSB7ICRudWxsIH0KICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRmYWxzZQogICAgICAgICAgICAgICAgJGl0ZW0uRmluaXNoZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICAgICAgJGl0ZW0uRXhpdENvZGUgPSAkRXhpdENvZGUKICAgICAgICAgICAgICAgICRpdGVtLk1lc3NhZ2UgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcXVldWVTdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVF1ZXVlZEl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoCiAgICApCgogICAgaWYgKCRJdGVtLkFjdGlvbiAtZXEgJ1VwZ3JhZGVBbGwnKSB7CiAgICAgICAgJGV4aXRDb2RlID0gSW52b2tlLVdpbmdldFVwZ3JhZGVBbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgICAgICBpZiAoJGV4aXRDb2RlIC1lcSAwKSB7CiAgICAgICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIFN1Y2NlZWRlZCAtRXhpdENvZGUgJGV4aXRDb2RlIC1NZXNzYWdlICdVcGRhdGVzIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgRmFpbGVkIC1FeGl0Q29kZSAkZXhpdENvZGUgLU1lc3NhZ2UgIlVwZGF0ZXMgZmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQoKICAgICRhcHAgPSBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgLUFsaWFzIChbc3RyaW5nXSRJdGVtLkFsaWFzKQogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnQWxpYXMgaXN0IG5pY2h0IG1laHIgZnJlaWdlZ2ViZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnVW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucyhbc3RyaW5nXSRJdGVtLkFsaWFzKSkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRpbnN0YWxsZWRTZXQgPSBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcgLWFuZCAkaW5zdGFsbGVkU2V0LkNvbnRhaW5zKFtzdHJpbmddJGFwcC5QYWNrYWdlSWQpKSB7CiAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgU3VjY2VlZGVkIC1FeGl0Q29kZSAwIC1NZXNzYWdlICdCZXJlaXRzIGluc3RhbGxpZXJ0LicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcpIHsKICAgICAgICAkZXhpdENvZGUgPSBJbnZva2UtV2luZ2V0SW5zdGFsbCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIH0KICAgIGVsc2UgewogICAgICAgICRleGl0Q29kZSA9IEludm9rZS1XaW5nZXRVbmluc3RhbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICB9CgogICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIGlmICgkZXhpdENvZGUgLWVxIDApIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBTdWNjZWVkZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAnQWJnZXNjaGxvc3Nlbi4nCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAiRmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1Qcm9jZXNzUXVldWVNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICBXcml0ZS1Mb2cgJ0Fib3J0aW5nIHF1ZXVlIHByb2Nlc3NpbmcgYmVjYXVzZSB3aW5nZXQgaXMgdW5hdmFpbGFibGUuJyAnRVJST1InCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMKICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICAgICAgJG51bGwgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAoKICAgICAgICB3aGlsZSAoJHRydWUpIHsKICAgICAgICAgICAgJGl0ZW0gPSBHZXQtTmV4dFF1ZXVlZEl0ZW0KICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgYnJlYWsgfQoKICAgICAgICAgICAgV3JpdGUtTG9nICJQcm9jZXNzaW5nIHF1ZXVlZCBpdGVtIGlkPSckKCRpdGVtLklkKScgYWN0aW9uPSckKCRpdGVtLkFjdGlvbiknIGFsaWFzPSckKCRpdGVtLkFsaWFzKScgc291cmNlPSckKCRpdGVtLlNvdXJjZSknIHJlcXVlc3RlZEJ5PSckKCRpdGVtLlJlcXVlc3RlZEJ5KSciCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBJbnZva2UtUXVldWVkSXRlbSAtSXRlbSAkaXRlbSAtV2luZ2V0UGF0aCAkd2luZ2V0UGF0aAogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIGl0ZW0gJyQoJGl0ZW0uSWQpJyBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICAgICAgICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRpdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlIDEgLU1lc3NhZ2UgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgeyBwYXJhbSgkc3RhdGUpICRzdGF0ZS5DdXJyZW50ID0gJG51bGwgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtVXBncmFkZUFsbE1vZGUgewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIC1BY3Rpb24gVXBncmFkZUFsbCAtRGlzcGxheU5hbWUgJ3dpbmdldCB1cGdyYWRlIC0tYWxsJyAtU291cmNlIFN5c3RlbSAtUmVxdWVzdGVkQnkgJ1N5c3RlbScgLVJlcXVlc3RlZEJ5U2lkICdTeXN0ZW0nCiAgICAkcmVzdWx0ID0gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQogICAgaWYgKCRyZXN1bHQuQWRkZWQpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1F1ZXVlZCAyLWhvdXIgd2luZ2V0IHVwZ3JhZGUuJwogICAgfQogICAgZWxzZSB7CiAgICAgICAgV3JpdGUtTG9nICcyLWhvdXIgd2luZ2V0IHVwZ3JhZGUgaXMgYWxyZWFkeSBxdWV1ZWQgb3IgcnVubmluZy4nCiAgICB9CiAgICBTdGFydC1RdWV1ZVdvcmtlcgp9CgpmdW5jdGlvbiBJbnZva2UtQXBwbHlQb2xpY3lNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgJHJlc3VsdCA9IEludm9rZS1SZXF1aXJlZFNvZnR3YXJlUG9saWN5IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIHBvbGljeSBhcHBseSBxdWV1ZWQgaXRlbXM9JCgkcmVzdWx0LlF1ZXVlZCkuIgp9CgpmdW5jdGlvbiBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRBcHBBbGlhcykpIHsKICAgICAgICB0aHJvdyAnQXBwQWxpYXMgaXMgcmVxdWlyZWQgZm9yIFByb2Nlc3NSZXF1ZXN0IG1vZGUuJwogICAgfQoKICAgICRhbGlhcyA9ICRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgIGlmICgtbm90ICRhcHApIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBpbiBjYXRhbG9nIHBvbGljeS4gUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIiAnV0FSTicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFJlcXVlc3RBY3Rpb24gLWVxICdJbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBpbnN0YWxsIGZvciBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIHVzZXIgaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkUmVxdWVzdEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJVbmluc3RhbGxBbGxvd2VkKSkgewogICAgICAgIFdyaXRlLUxvZyAiV29ya2VyIHJlamVjdGVkIHVuaW5zdGFsbCBmb3IgYWxpYXMgJyRhbGlhcycgYmVjYXVzZSB1c2VyIHVuaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uICRSZXF1ZXN0QWN0aW9uIC1BbGlhcyAkYWxpYXMgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSAtUmVxdWVzdGVkQnlTaWQgJFJlcXVlc3RlZEJ5U2lkIC1Tb3VyY2UgVXNlcgogICAgV3JpdGUtTG9nICJRdWV1ZWQgd29ya2VyIHJlcXVlc3QgYWN0aW9uPSRSZXF1ZXN0QWN0aW9uIGFsaWFzPSckYWxpYXMnIGFkZGVkPSQoJHJlc3VsdC5BZGRlZCkgUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIgogICAgU3RhcnQtUXVldWVXb3JrZXIKfQoKZnVuY3Rpb24gSW5zdGFsbC1TZXJ2aWNlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIFNldC1EaXJlY3RvcnlBY2wgLVBhdGggJEJhc2VEaXIgLVVzZXJzQ2FuTW9kaWZ5OiRmYWxzZQogICAgU2V0LURpcmVjdG9yeUFjbCAtUGF0aCAkTG9nRGlyIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKCiAgICBmb3JlYWNoICgkbGVnYWN5RGlyTmFtZSBpbiBAKCdSZXF1ZXN0cycsJ1Byb2Nlc3NlZCcsJ0ZhaWxlZCcpKSB7CiAgICAgICAgJGxlZ2FjeURpclBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgJGxlZ2FjeURpck5hbWUKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkbGVnYWN5RGlyUGF0aCkgewogICAgICAgICAgICBTZXQtRGlyZWN0b3J5QWNsIC1QYXRoICRsZWdhY3lEaXJQYXRoIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKICAgICAgICB9CiAgICB9CgogICAgaWYgKC1ub3QgJFBTQ29tbWFuZFBhdGgpIHsKICAgICAgICB0aHJvdyAnUFNDb21tYW5kUGF0aCBpcyBlbXB0eTsgY2Fubm90IGRldGVybWluZSB0aGUgc291cmNlIHNjcmlwdCBwYXRoLicKICAgIH0KCiAgICBDb3B5LUl0ZW0gLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoIC1EZXN0aW5hdGlvbiAkTG9jYWxTY3JpcHRQYXRoIC1Gb3JjZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRMb2NhbFNjcmlwdFBhdGgKCiAgICBOZXctVXNlclJlcXVlc3RUb29sCiAgICBOZXctQ2F0YWxvZ0d1aQogICAgTmV3LUNhdGFsb2dMYXVuY2hlcgogICAgTmV3LVNob3J0Y3V0IC1TaG9ydGN1dFBhdGggJERlc2t0b3BTaG9ydGN1dFBhdGgKICAgIE5ldy1TaG9ydGN1dCAtU2hvcnRjdXRQYXRoICRTdGFydE1lbnVTaG9ydGN1dFBhdGgKICAgIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MKCiAgICBXcml0ZS1Mb2cgJ0luc3RhbGwvdXBkYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFbnRyeSBwb2ludAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHJ5IHsKICAgIHN3aXRjaCAoJE1vZGUpIHsKICAgICAgICAnSW5zdGFsbCcgICAgeyBJbnN0YWxsLVNlcnZpY2UgfQogICAgICAgICdEYWVtb24nICAgICB7IFN0YXJ0LUNhdGFsb2dEYWVtb24gfQogICAgICAgICdVcGdyYWRlQWxsJyB7IEludm9rZS1VcGdyYWRlQWxsTW9kZSB9CiAgICAgICAgJ0FwcGx5UG9saWN5JyB7IEludm9rZS1BcHBseVBvbGljeU1vZGUgfQogICAgICAgICdQcm9jZXNzUXVldWUnIHsgSW52b2tlLVByb2Nlc3NRdWV1ZU1vZGUgfQogICAgICAgICdQcm9jZXNzUmVxdWVzdCcgeyBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIH0KICAgICAgICBkZWZhdWx0ICAgICAgeyB0aHJvdyAiVW5zdXBwb3J0ZWQgbW9kZSAnJE1vZGUnLiIgfQogICAgfQp9CmNhdGNoIHsKICAgIHRyeSB7CiAgICAgICAgV3JpdGUtTG9nICJGYXRhbCBlcnJvciBpbiBtb2RlICckTW9kZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICB0aHJvdwp9Cg==
|
|
'@
|
|
|
|
$PayloadBytes = [Convert]::FromBase64String($Payload)
|
|
$OutputBytes = New-Object byte[] ($PayloadBytes.Length + 3)
|
|
$OutputBytes[0] = 0xEF
|
|
$OutputBytes[1] = 0xBB
|
|
$OutputBytes[2] = 0xBF
|
|
[Array]::Copy($PayloadBytes, 0, $OutputBytes, 3, $PayloadBytes.Length)
|
|
|
|
$TempScript = Join-Path ([System.IO.Path]::GetTempPath()) ('softkat-{0}.ps1' -f [Guid]::NewGuid().ToString('N'))
|
|
[System.IO.File]::WriteAllBytes($TempScript, $OutputBytes)
|
|
|
|
try {
|
|
& $TempScript -Mode $Mode -RequestAction $RequestAction -AppAlias $AppAlias -RequestedBy $RequestedBy -RequestedBySid $RequestedBySid
|
|
}
|
|
finally {
|
|
Remove-Item -LiteralPath $TempScript -Force -ErrorAction SilentlyContinue
|
|
}
|