#!/usr/bin/env bash set -uo pipefail ssh himma-admin 'mkdir -p /tmp/himma-lease-stage' ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/privilege_gate.py' <<'B64_privilege_gate_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJQb2xpY3kgYW5kIGR1cmFibGUgcmVxdWVzdCBzdG9yZSBmb3IgdGhlIEhpbW1hIHByaXZpbGVnZSBnYXRlLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzZWNyZXRzCmltcG9ydCB0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgQW55CgoKY2xhc3MgR2F0ZUVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICBwYXNzCgoKZGVmIGNhbm9uaWNhbF9qc29uKHZhbHVlOiBBbnkpIC0+IGJ5dGVzOgogICAgcmV0dXJuIGpzb24uZHVtcHModmFsdWUsIHNvcnRfa2V5cz1UcnVlLCBzZXBhcmF0b3JzPSgiLCIsICI6IiksIGVuc3VyZV9hc2NpaT1GYWxzZSkuZW5jb2RlKCkKCgpjbGFzcyBBdWRpdExvZzoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoOiBQYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBQYXRoKHBhdGgpCiAgICAgICAgc2VsZi5wYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCgogICAgZGVmIF9sYXN0X2hhc2goc2VsZikgLT4gc3RyOgogICAgICAgIGlmIG5vdCBzZWxmLnBhdGguZXhpc3RzKCkgb3Igbm90IHNlbGYucGF0aC5zdGF0KCkuc3Rfc2l6ZToKICAgICAgICAgICAgcmV0dXJuICIwIiAqIDY0CiAgICAgICAgbGFzdCA9IHNlbGYucGF0aC5yZWFkX3RleHQoKS5zcGxpdGxpbmVzKClbLTFdCiAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMobGFzdClbImVudHJ5X2hhc2giXQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgZXZlbnQ6IGRpY3Rbc3RyLCBBbnldKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICByb3cgPSB7CiAgICAgICAgICAgICJ0aW1lc3RhbXAiOiBpbnQodGltZS50aW1lKCkpLAogICAgICAgICAgICAicHJldmlvdXNfaGFzaCI6IHNlbGYuX2xhc3RfaGFzaCgpLAogICAgICAgICAgICAqKmV2ZW50LAogICAgICAgIH0KICAgICAgICByb3dbImVudHJ5X2hhc2giXSA9IGhhc2hsaWIuc2hhMjU2KGNhbm9uaWNhbF9qc29uKHJvdykpLmhleGRpZ2VzdCgpCiAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYucGF0aCwgb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19BUFBFTkQsIDBvNjAwKQogICAgICAgIHRyeToKICAgICAgICAgICAgb3Mud3JpdGUoZmQsIGNhbm9uaWNhbF9qc29uKHJvdykgKyBiIlxuIikKICAgICAgICAgICAgb3MuZnN5bmMoZmQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgcmV0dXJuIHJvdwoKICAgIGRlZiB2ZXJpZnkoc2VsZikgLT4gYm9vbDoKICAgICAgICBwcmV2aW91cyA9ICIwIiAqIDY0CiAgICAgICAgaWYgbm90IHNlbGYucGF0aC5leGlzdHMoKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBmb3IgbGluZSBpbiBzZWxmLnBhdGgucmVhZF90ZXh0KCkuc3BsaXRsaW5lcygpOgogICAgICAgICAgICByb3cgPSBqc29uLmxvYWRzKGxpbmUpCiAgICAgICAgICAgIGNsYWltZWQgPSByb3cucG9wKCJlbnRyeV9oYXNoIikKICAgICAgICAgICAgaWYgcm93LmdldCgicHJldmlvdXNfaGFzaCIpICE9IHByZXZpb3VzOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGFjdHVhbCA9IGhhc2hsaWIuc2hhMjU2KGNhbm9uaWNhbF9qc29uKHJvdykpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGlmIGFjdHVhbCAhPSBjbGFpbWVkOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHByZXZpb3VzID0gY2xhaW1lZAogICAgICAgIHJldHVybiBUcnVlCgoKY2xhc3MgUG9saWN5OgogICAgUEFDS0FHRV9SRSA9IHJlLmNvbXBpbGUociJeW2EtejAtOV1bYS16MC05Ky4tXXswLDEyN30kIikKCiAgICBBQ1RJT05TID0gewogICAgICAgICJpbnNwZWN0LmZpcmV3YWxsIjogMCwKICAgICAgICAiaW5zcGVjdC5zZXJ2aWNlIjogMCwKICAgICAgICAic2VydmljZS5yZXN0YXJ0IjogMSwKICAgICAgICAibmdpbngucmVsb2FkIjogMSwKICAgICAgICAicGFja2FnZS5pbnN0YWxsIjogMSwKICAgICAgICAic3lzdGVtLnVwZGF0ZSI6IDIsCiAgICAgICAgImZpcmV3YWxsLmFwcGx5IjogMiwKICAgICAgICAic3NoLmFwcGx5IjogMiwKICAgICAgICAidXNlci5tb2RpZnkiOiAyLAogICAgICAgICJjcmVkZW50aWFsLnJvdGF0ZSI6IDIsCiAgICAgICAgInN0cm9uZ19hdXRoLnRlc3QiOiAyLAogICAgICAgICJiYWNrdXAuc3RhdHVzIjogMCwKICAgICAgICAiYmFja3VwLnJ1biI6IDEsCiAgICAgICAgImJhY2t1cC5yZXN0b3JlX3Rlc3QiOiAyLAogICAgICAgICJsZWFzZS5jcmVhdGUiOiAyLAogICAgICAgICJkYXRhLnF1YXJhbnRpbmUiOiAzLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IGRpY3Rbc3RyLCBBbnldKToKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYucmVxdWVzdF91aWRzID0ge2ludCh4KSBmb3IgeCBpbiBjb25maWcuZ2V0KCJyZXF1ZXN0X3VpZHMiLCBbXSl9CiAgICAgICAgc2VsZi5hZG1pbl91aWRzID0ge2ludCh4KSBmb3IgeCBpbiBjb25maWcuZ2V0KCJhZG1pbl91aWRzIiwgW10pfQogICAgICAgIHNlbGYuc3Ryb25nX2FwcHJvdmVyX3VpZHMgPSB7aW50KHgpIGZvciB4IGluIGNvbmZpZy5nZXQoInN0cm9uZ19hcHByb3Zlcl91aWRzIiwgY29uZmlnLmdldCgiYWRtaW5fdWlkcyIsIFtdKSl9CiAgICAgICAgc2VsZi5zZXJ2aWNlcyA9IHNldChjb25maWcuZ2V0KCJzZXJ2aWNlcyIsIFtdKSkKICAgICAgICBzZWxmLmFsbG93ZWRfZGF0YV9yb290cyA9IFtQYXRoKHgpLnJlc29sdmUoKSBmb3IgeCBpbiBjb25maWcuZ2V0KCJhbGxvd2VkX2RhdGFfcm9vdHMiLCBbXSldCiAgICAgICAgc2VsZi5wYXNza2V5X21hbmFnZXIgPSBOb25lCiAgICAgICAgc2VsZi5sZWFzZV9tYW5hZ2VyID0gTm9uZQogICAgICAgIHNlbGYudG90cF9tYW5hZ2VyID0gTm9uZQoKICAgIGRlZiBjbGFzc2lmeShzZWxmLCBhY3Rpb246IHN0ciwgcGFyYW1zOiBkaWN0W3N0ciwgQW55XSkgLT4gdHVwbGVbaW50LCBkaWN0W3N0ciwgQW55XV06CiAgICAgICAgaWYgYWN0aW9uIG5vdCBpbiBzZWxmLkFDVElPTlM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigidW5zdXBwb3J0ZWQtYWN0aW9uIikKICAgICAgICBjbGVhbiA9IGRpY3QocGFyYW1zKQogICAgICAgIHRpZXIgPSBzZWxmLkFDVElPTlNbYWN0aW9uXQoKICAgICAgICBpZiBhY3Rpb24gaW4geyJpbnNwZWN0LnNlcnZpY2UiLCAic2VydmljZS5yZXN0YXJ0In06CiAgICAgICAgICAgIHNlcnZpY2UgPSBjbGVhbi5nZXQoInNlcnZpY2UiKQogICAgICAgICAgICBpZiBzZXJ2aWNlIG5vdCBpbiBzZWxmLnNlcnZpY2VzOgogICAgICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJzZXJ2aWNlLW5vdC1hbGxvd2xpc3RlZCIpCiAgICAgICAgICAgIGNsZWFuID0geyJzZXJ2aWNlIjogc2VydmljZX0KICAgICAgICBlbGlmIGFjdGlvbiA9PSAicGFja2FnZS5pbnN0YWxsIjoKICAgICAgICAgICAgcGFja2FnZSA9IGNsZWFuLmdldCgicGFja2FnZSIpCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhY2thZ2UsIHN0cikgb3Igbm90IHNlbGYuUEFDS0FHRV9SRS5mdWxsbWF0Y2gocGFja2FnZSk6CiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImludmFsaWQtcGFja2FnZS1uYW1lIikKICAgICAgICAgICAgY2xlYW4gPSB7InBhY2thZ2UiOiBwYWNrYWdlfQogICAgICAgIGVsaWYgYWN0aW9uID09ICJkYXRhLnF1YXJhbnRpbmUiOgogICAgICAgICAgICBjbGVhbiA9IHNlbGYuX3ZhbGlkYXRlX3F1YXJhbnRpbmUoY2xlYW4pCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gImxlYXNlLmNyZWF0ZSI6CiAgICAgICAgICAgIGlmIHNlbGYubGVhc2VfbWFuYWdlciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJsZWFzZS1tYW5hZ2VyLXVuYXZhaWxhYmxlIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZHVyYXRpb24gPSBpbnQoY2xlYW4uZ2V0KCJkdXJhdGlvbl9zZWNvbmRzIiwgMCkpCiAgICAgICAgICAgICAgICBtYXhfdXNlcyA9IGludChjbGVhbi5nZXQoIm1heF91c2VzIiwgMCkpCiAgICAgICAgICAgICAgICBzY29wZXMgPSBzZWxmLmxlYXNlX21hbmFnZXIuX3ZhbGlkYXRlX3Njb3BlcyhjbGVhbi5nZXQoInNjb3BlcyIpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcihzdHIoZXhjKSkgZnJvbSBleGMKICAgICAgICAgICAgaWYgZHVyYXRpb24gbm90IGluIHNlbGYubGVhc2VfbWFuYWdlci5EVVJBVElPTlMgb3IgbWF4X3VzZXMgPCAxIG9yIG1heF91c2VzID4gc2VsZi5sZWFzZV9tYW5hZ2VyLkRVUkFUSU9OU1tkdXJhdGlvbl06CiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImludmFsaWQtbGVhc2Utd2luZG93IikKICAgICAgICAgICAgIyBUaWVyLTMgKGRlbGV0aW9uLCBzc2gsIGZpcmV3YWxsLCB1c2VycywgY3JlZGVudGlhbHMsIHNlY3VyaXR5CiAgICAgICAgICAgICMgY2hhbmdlcykgaXMgTkVWRVIgbGVhc2VhYmxlLiBSZWplY3QgYW55IGxlYXNlIHRoYXQgdHJpZXMgdG8KICAgICAgICAgICAgIyBidW5kbGUgYSBub24tbGVhc2VhYmxlIHNjb3BlLCBzbyBhIGxlYXNlIGNhbm5vdCBiZSB1c2VkIHRvIGdyYW50CiAgICAgICAgICAgICMgYXV0aG9yaXR5IHRoZSBvd25lciB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0byBhcHByb3ZlIGRpcmVjdGx5LgogICAgICAgICAgICBmb3Igc2NvcGUgaW4gc2NvcGVzOgogICAgICAgICAgICAgICAgaWYgc2NvcGUuZ2V0KCJhY3Rpb24iKSBub3QgaW4gc2VsZi5sZWFzZV9tYW5hZ2VyLkxFQVNFQUJMRToKICAgICAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImxlYXNlLXNjb3BlLW5vdC1sZWFzZWFibGUiKQogICAgICAgICAgICByZXF1aXJlX3RvdHAgPSBib29sKGNsZWFuLmdldCgicmVxdWlyZV90b3RwIikpIG9yIGR1cmF0aW9uID09IDM2MDAKICAgICAgICAgICAgY2xlYW4gPSB7ImR1cmF0aW9uX3NlY29uZHMiOiBkdXJhdGlvbiwgIm1heF91c2VzIjogbWF4X3VzZXMsICJzY29wZXMiOiBzY29wZXMsICJyZXF1aXJlX3RvdHAiOiByZXF1aXJlX3RvdHB9CiAgICAgICAgZWxpZiBhY3Rpb24gaW4geyJpbnNwZWN0LmZpcmV3YWxsIiwgIm5naW54LnJlbG9hZCIsICJzeXN0ZW0udXBkYXRlIiwgInN0cm9uZ19hdXRoLnRlc3QiLCAiYmFja3VwLnN0YXR1cyIsICJiYWNrdXAucnVuIiwgImJhY2t1cC5yZXN0b3JlX3Rlc3QifToKICAgICAgICAgICAgaWYgY2xlYW46CiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInVuZXhwZWN0ZWQtcGFyYW1ldGVycyIpCiAgICAgICAgcmV0dXJuIHRpZXIsIGNsZWFuCgogICAgZGVmIF92YWxpZGF0ZV9xdWFyYW50aW5lKHNlbGYsIHBhcmFtczogZGljdFtzdHIsIEFueV0pIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIGJhY2t1cCA9IHBhcmFtcy5nZXQoImJhY2t1cF9yZWYiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJhY2t1cCwgc3RyKSBvciBub3QgYmFja3VwLnN0YXJ0c3dpdGgoInNuYXBzaG90LXZlcmlmaWVkLSIpOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInZlcmlmaWVkLWJhY2t1cC1yZXF1aXJlZCIpCiAgICAgICAgcmV0ZW50aW9uID0gcGFyYW1zLmdldCgicmV0ZW50aW9uX2RheXMiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldGVudGlvbiwgaW50KSBvciBub3QgNyA8PSByZXRlbnRpb24gPD0gMzY1OgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImludmFsaWQtcmV0ZW50aW9uLXBlcmlvZCIpCiAgICAgICAgcGF0aHMgPSBwYXJhbXMuZ2V0KCJwYXRocyIpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGF0aHMsIGxpc3QpIG9yIG5vdCBwYXRocyBvciBsZW4ocGF0aHMpID4gMTAwMDoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJpbnZhbGlkLXBhdGgtbWFuaWZlc3QiKQogICAgICAgIHJlc29sdmVkID0gW10KICAgICAgICBmb3IgcmF3IGluIHBhdGhzOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyYXcsIHN0cikgb3IgIlx4MDAiIGluIHJhdzoKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigiaW52YWxpZC1wYXRoLW1hbmlmZXN0IikKICAgICAgICAgICAgcGF0aCA9IFBhdGgocmF3KS5yZXNvbHZlKHN0cmljdD1UcnVlKQogICAgICAgICAgICBhbGxvd2VkID0gRmFsc2UKICAgICAgICAgICAgZm9yIHJvb3QgaW4gc2VsZi5hbGxvd2VkX2RhdGFfcm9vdHM6CiAgICAgICAgICAgICAgICBpZiBwYXRoICE9IHJvb3QgYW5kIHJvb3QgaW4gcGF0aC5wYXJlbnRzOgogICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbm90IGFsbG93ZWQ6CiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInBhdGgtb3V0c2lkZS1hbGxvd2VkLXJvb3RzIikKICAgICAgICAgICAgcmVzb2x2ZWQuYXBwZW5kKHN0cihwYXRoKSkKICAgICAgICBpZiBsZW4oc2V0KHJlc29sdmVkKSkgIT0gbGVuKHJlc29sdmVkKToKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJkdXBsaWNhdGUtcGF0aCIpCiAgICAgICAgcmV0dXJuIHsicGF0aHMiOiBzb3J0ZWQocmVzb2x2ZWQpLCAiYmFja3VwX3JlZiI6IGJhY2t1cCwgInJldGVudGlvbl9kYXlzIjogcmV0ZW50aW9ufQoKICAgIGRlZiBzdHJvbmdfYXV0aF9lbnJvbGxlZChzZWxmKSAtPiBib29sOgogICAgICAgIGlmIHNlbGYucGFzc2tleV9tYW5hZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLnBhc3NrZXlfbWFuYWdlci5lbnJvbGxlZCgpKQogICAgICAgIHJldHVybiBib29sKHNlbGYuY29uZmlnLmdldCgic3Ryb25nX2F1dGhfcHVibGljX2tleXMiKSkKCiAgICBkZWYgdmVyaWZ5X3N0cm9uZ19hc3NlcnRpb24oc2VsZiwgcmVxdWVzdDogZGljdFtzdHIsIEFueV0sIGFzc2VydGlvbjogZGljdFtzdHIsIHN0cl0gfCBOb25lKSAtPiBib29sOgogICAgICAgIGlmIHNlbGYucGFzc2tleV9tYW5hZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXNza2V5X21hbmFnZXIuZW5yb2xsZWQoKToKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigic3Ryb25nLWF1dGgtbm90LWVucm9sbGVkIikKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXNzZXJ0aW9uLCBkaWN0KSBvciBhc3NlcnRpb24uZ2V0KCJ0eXBlIikgIT0gIndlYmF1dGhuIjoKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigic3Ryb25nLWF1dGgtcmVxdWlyZWQiKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gYm9vbCgKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhc3NrZXlfbWFuYWdlci52ZXJpZnlfYXV0aGVudGljYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RbImlkIl0sIHJlcXVlc3RbImFwcHJvdmFsX2RpZ2VzdCJdLCBhc3NlcnRpb24uZ2V0KCJjcmVkZW50aWFsIiwge30pCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzdHIoZXhjKQogICAgICAgICAgICAgICAgaWYgbWVzc2FnZS5zdGFydHN3aXRoKCgic3Ryb25nLWF1dGgtIiwgImF1dGhlbnRpY2F0aW9uLSIpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IobWVzc2FnZSkgZnJvbSBleGMKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigic3Ryb25nLWF1dGgtaW52YWxpZCIpIGZyb20gZXhjCiAgICAgICAga2V5cyA9IHNlbGYuY29uZmlnLmdldCgic3Ryb25nX2F1dGhfcHVibGljX2tleXMiLCBbXSkKICAgICAgICBpZiBub3Qga2V5czoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJzdHJvbmctYXV0aC1ub3QtZW5yb2xsZWQiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFzc2VydGlvbiwgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigic3Ryb25nLWF1dGgtcmVxdWlyZWQiKQogICAgICAgIGtleSA9IG5leHQoKHggZm9yIHggaW4ga2V5cyBpZiB4LmdldCgiaWQiKSA9PSBhc3NlcnRpb24uZ2V0KCJrZXlfaWQiKSksIE5vbmUpCiAgICAgICAgaWYgbm90IGtleToKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJ1bmtub3duLXN0cm9uZy1hdXRoLWtleSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQucHJpbWl0aXZlcy5hc3ltbWV0cmljLmVkMjU1MTkgaW1wb3J0IEVkMjU1MTlQdWJsaWNLZXkKCiAgICAgICAgICAgIHB1YmxpYyA9IEVkMjU1MTlQdWJsaWNLZXkuZnJvbV9wdWJsaWNfYnl0ZXMoYmFzZTY0LmI2NGRlY29kZShrZXlbInB1YmxpY19rZXlfYjY0Il0sIHZhbGlkYXRlPVRydWUpKQogICAgICAgICAgICBzaWduYXR1cmUgPSBiYXNlNjQuYjY0ZGVjb2RlKGFzc2VydGlvblsic2lnbmF0dXJlX2I2NCJdLCB2YWxpZGF0ZT1UcnVlKQogICAgICAgICAgICBwdWJsaWMudmVyaWZ5KHNpZ25hdHVyZSwgcmVxdWVzdFsiYXBwcm92YWxfZGlnZXN0Il0uZW5jb2RlKCkpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IEdhdGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJzdHJvbmctYXV0aC1pbnZhbGlkIikgZnJvbSBleGMKCgpjbGFzcyBSZXF1ZXN0U3RvcmU6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5OiBQYXRoLCBwb2xpY3k6IFBvbGljeSwgYXVkaXQ6IEF1ZGl0TG9nKToKICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IFBhdGgoZGlyZWN0b3J5KQogICAgICAgIHNlbGYuZGlyZWN0b3J5Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBzZWxmLnBvbGljeSA9IHBvbGljeQogICAgICAgIHNlbGYuYXVkaXQgPSBhdWRpdAoKICAgIGRlZiBfcGF0aChzZWxmLCByZXF1ZXN0X2lkOiBzdHIpIC0+IFBhdGg6CiAgICAgICAgaWYgbm90IHJlLmZ1bGxtYXRjaChyIlthLWYwLTldezMyfSIsIHJlcXVlc3RfaWQpOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImludmFsaWQtcmVxdWVzdC1pZCIpCiAgICAgICAgcmV0dXJuIHNlbGYuZGlyZWN0b3J5IC8gZiJ7cmVxdWVzdF9pZH0uanNvbiIKCiAgICBkZWYgX3dyaXRlKHNlbGYsIHJlcXVlc3Q6IGRpY3Rbc3RyLCBBbnldKSAtPiBOb25lOgogICAgICAgIHBhdGggPSBzZWxmLl9wYXRoKHJlcXVlc3RbImlkIl0pCiAgICAgICAgdGVtcCA9IHBhdGgud2l0aF9zdWZmaXgoIi50bXAiKQogICAgICAgIGZkID0gb3Mub3Blbih0ZW1wLCBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQgfCBvcy5PX1RSVU5DLCAwbzYwMCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLndyaXRlKGZkLCBjYW5vbmljYWxfanNvbihyZXF1ZXN0KSArIGIiXG4iKQogICAgICAgICAgICBvcy5mc3luYyhmZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICBvcy5yZXBsYWNlKHRlbXAsIHBhdGgpCgogICAgZGVmIGdldChzZWxmLCByZXF1ZXN0X2lkOiBzdHIpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIHBhdGggPSBzZWxmLl9wYXRoKHJlcXVlc3RfaWQpCiAgICAgICAgaWYgbm90IHBhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigicmVxdWVzdC1ub3QtZm91bmQiKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHBhdGgucmVhZF90ZXh0KCkpCgogICAgZGVmIGNyZWF0ZSgKICAgICAgICBzZWxmLAogICAgICAgICosCiAgICAgICAgcGVlcl91aWQ6IGludCwKICAgICAgICBhY3Rpb246IHN0ciwKICAgICAgICBwYXJhbXM6IGRpY3Rbc3RyLCBBbnldLAogICAgICAgIHByb3ZlbmFuY2U6IGRpY3Rbc3RyLCBBbnldLAogICAgKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBpZiBpbnQocGVlcl91aWQpIG5vdCBpbiBzZWxmLnBvbGljeS5yZXF1ZXN0X3VpZHM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigicmVxdWVzdGVyLW5vdC1hdXRob3JpemVkIikKICAgICAgICBzb3VyY2VfdHlwZSA9IHByb3ZlbmFuY2UuZ2V0KCJzb3VyY2VfdHlwZSIpCiAgICAgICAgaWYgc291cmNlX3R5cGUgPT0gImxvY2FsX2FkbWluIjoKICAgICAgICAgICAgaWYgaW50KHBlZXJfdWlkKSBub3QgaW4gc2VsZi5wb2xpY3kuYWRtaW5fdWlkczoKICAgICAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigibG9jYWwtYWRtaW4taWRlbnRpdHktcmVxdWlyZWQiKQogICAgICAgIGVsaWYgc291cmNlX3R5cGUgPT0gImRpcmVjdF9vd25lcl9tZXNzYWdlIjoKICAgICAgICAgICAgcGxhdGZvcm0gPSBzdHIocHJvdmVuYW5jZS5nZXQoInBsYXRmb3JtIiwgIiIpKQogICAgICAgICAgICBzZW5kZXJfaWQgPSBzdHIocHJvdmVuYW5jZS5nZXQoInNlbmRlcl9pZCIsICIiKSkKICAgICAgICAgICAgYWxsb3dsaXN0ZWQgPSB7c3RyKHgpIGZvciB4IGluIHNlbGYucG9saWN5LmNvbmZpZy5nZXQoIm93bmVyX2lkZW50aXRpZXMiLCB7fSkuZ2V0KHBsYXRmb3JtLCBbXSl9CiAgICAgICAgICAgIGlmIHNlbmRlcl9pZCBub3QgaW4gYWxsb3dsaXN0ZWQ6CiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoIm93bmVyLWlkZW50aXR5LW5vdC1hbGxvd2xpc3RlZCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJ1bnRydXN0ZWQtcmVxdWVzdC1vcmlnaW4iKQogICAgICAgIHRpZXIsIGNsZWFuID0gc2VsZi5wb2xpY3kuY2xhc3NpZnkoYWN0aW9uLCBwYXJhbXMpCiAgICAgICAgbm93ID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIHJlcXVlc3RfaWQgPSBzZWNyZXRzLnRva2VuX2hleCgxNikKICAgICAgICBtYW5pZmVzdF9oYXNoID0gaGFzaGxpYi5zaGEyNTYoY2Fub25pY2FsX2pzb24oY2xlYW4pKS5oZXhkaWdlc3QoKSBpZiB0aWVyID09IDMgZWxzZSBOb25lCiAgICAgICAgbGVhc2UgPSBzZWxmLnBvbGljeS5sZWFzZV9tYW5hZ2VyLm1hdGNoKGludChwZWVyX3VpZCksIGFjdGlvbiwgY2xlYW4pIGlmIHRpZXIgPT0gMSBhbmQgc2VsZi5wb2xpY3kubGVhc2VfbWFuYWdlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICBzdGF0dXMgPSAiYXBwcm92ZWQiIGlmIHRpZXIgPT0gMCBvciBsZWFzZSBpcyBub3QgTm9uZSBlbHNlICJwZW5kaW5nX3N0cm9uZ19hcHByb3ZhbCIgaWYgdGllciA+PSAyIGVsc2UgInBlbmRpbmdfb3duZXJfYXBwcm92YWwiCiAgICAgICAgcmVxdWVzdCA9IHsKICAgICAgICAgICAgImlkIjogcmVxdWVzdF9pZCwKICAgICAgICAgICAgImFjdGlvbiI6IGFjdGlvbiwKICAgICAgICAgICAgInBhcmFtcyI6IGNsZWFuLAogICAgICAgICAgICAidGllciI6IHRpZXIsCiAgICAgICAgICAgICJyZXF1ZXN0ZXJfdWlkIjogaW50KHBlZXJfdWlkKSwKICAgICAgICAgICAgInByb3ZlbmFuY2UiOiBwcm92ZW5hbmNlLAogICAgICAgICAgICAiY3JlYXRlZF9hdCI6IG5vdywKICAgICAgICAgICAgImV4cGlyZXNfYXQiOiBub3cgKyBpbnQoc2VsZi5wb2xpY3kuY29uZmlnLmdldCgicmVxdWVzdF90dGxfc2Vjb25kcyIsIDMwMCkpLAogICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzLAogICAgICAgICAgICAibGVhc2VfaWQiOiBsZWFzZS5nZXQoImlkIikgaWYgbGVhc2UgZWxzZSBOb25lLAogICAgICAgICAgICAibWFuaWZlc3RfaGFzaCI6IG1hbmlmZXN0X2hhc2gsCiAgICAgICAgfQogICAgICAgIGRpZ2VzdF9maWVsZHMgPSB7azogcmVxdWVzdFtrXSBmb3IgayBpbiAoImlkIiwgImFjdGlvbiIsICJwYXJhbXMiLCAidGllciIsICJjcmVhdGVkX2F0IiwgImV4cGlyZXNfYXQiLCAibWFuaWZlc3RfaGFzaCIpfQogICAgICAgIHJlcXVlc3RbImFwcHJvdmFsX2RpZ2VzdCJdID0gaGFzaGxpYi5zaGEyNTYoY2Fub25pY2FsX2pzb24oZGlnZXN0X2ZpZWxkcykpLmhleGRpZ2VzdCgpCiAgICAgICAgc2VsZi5fd3JpdGUocmVxdWVzdCkKICAgICAgICBzZWxmLmF1ZGl0LmFwcGVuZCh7ImV2ZW50IjogInJlcXVlc3QtY3JlYXRlZCIsICJyZXF1ZXN0X2lkIjogcmVxdWVzdF9pZCwgImFjdGlvbiI6IGFjdGlvbiwgInRpZXIiOiB0aWVyLCAic3RhdHVzIjogcmVxdWVzdFsic3RhdHVzIl19KQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSByZXF1ZXN0X25vdGlmaWVyIGltcG9ydCBub3RpZnlfcmVxdWVzdF9jcmVhdGVkCiAgICAgICAgICAgIG5vdGlmeV9yZXF1ZXN0X2NyZWF0ZWQocmVxdWVzdCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlcXVlc3QKCiAgICBkZWYgYXBwcm92ZSgKICAgICAgICBzZWxmLAogICAgICAgIHJlcXVlc3RfaWQ6IHN0ciwKICAgICAgICAqLAogICAgICAgIHBlZXJfdWlkOiBpbnQsCiAgICAgICAgc3Ryb25nX2Fzc2VydGlvbjogZGljdFtzdHIsIHN0cl0gfCBOb25lID0gTm9uZSwKICAgICkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZ2V0KHJlcXVlc3RfaWQpCiAgICAgICAgaWYgcmVxdWVzdFsic3RhdHVzIl0gbm90IGluIHsicGVuZGluZ19vd25lcl9hcHByb3ZhbCIsICJwZW5kaW5nX3N0cm9uZ19hcHByb3ZhbCJ9OgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3Qtbm90LXBlbmRpbmciKQogICAgICAgIGlmIGludCh0aW1lLnRpbWUoKSkgPiByZXF1ZXN0WyJleHBpcmVzX2F0Il06CiAgICAgICAgICAgIHJlcXVlc3RbInN0YXR1cyJdID0gImV4cGlyZWQiCiAgICAgICAgICAgIHNlbGYuX3dyaXRlKHJlcXVlc3QpCiAgICAgICAgICAgIHNlbGYuYXVkaXQuYXBwZW5kKHsiZXZlbnQiOiAicmVxdWVzdC1leHBpcmVkIiwgInJlcXVlc3RfaWQiOiByZXF1ZXN0X2lkfSkKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJyZXF1ZXN0LWV4cGlyZWQiKQogICAgICAgIHN0cm9uZ19wYXRoID0gaW50KHBlZXJfdWlkKSBpbiBzZWxmLnBvbGljeS5zdHJvbmdfYXBwcm92ZXJfdWlkcyBhbmQgaXNpbnN0YW5jZShzdHJvbmdfYXNzZXJ0aW9uLCBkaWN0KQogICAgICAgIGlmIHN0cm9uZ19wYXRoOgogICAgICAgICAgICBzZWxmLnBvbGljeS52ZXJpZnlfc3Ryb25nX2Fzc2VydGlvbihyZXF1ZXN0LCBzdHJvbmdfYXNzZXJ0aW9uKQogICAgICAgICAgICBpZiByZXF1ZXN0LmdldCgiYWN0aW9uIikgPT0gImxlYXNlLmNyZWF0ZSIgYW5kIHJlcXVlc3QuZ2V0KCJwYXJhbXMiLCB7fSkuZ2V0KCJyZXF1aXJlX3RvdHAiKToKICAgICAgICAgICAgICAgIGlmIHNlbGYucG9saWN5LnRvdHBfbWFuYWdlciBpcyBOb25lIG9yIG5vdCBzZWxmLnBvbGljeS50b3RwX21hbmFnZXIuZW5yb2xsZWQoKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInRvdHAtbm90LWVucm9sbGVkIikKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvbGljeS50b3RwX21hbmFnZXIudmVyaWZ5KHN0cihzdHJvbmdfYXNzZXJ0aW9uLmdldCgidG90cF9jb2RlIiwgIiIpKSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJ0b3RwLWludmFsaWQiKQogICAgICAgIGVsaWYgcmVxdWVzdFsidGllciJdID49IDI6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvbGljeS5zdHJvbmdfYXV0aF9lbnJvbGxlZCgpOgogICAgICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJzdHJvbmctYXV0aC1ub3QtZW5yb2xsZWQiKQogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInN0cm9uZy1hdXRoLXJlcXVpcmVkIikKICAgICAgICBlbGlmIGludChwZWVyX3VpZCkgbm90IGluIHNlbGYucG9saWN5LmFkbWluX3VpZHM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigiYXBwcm92ZXItbm90LWF1dGhvcml6ZWQiKQogICAgICAgIHJlcXVlc3RbInN0YXR1cyJdID0gImFwcHJvdmVkIgogICAgICAgIHJlcXVlc3RbImFwcHJvdmVkX2F0Il0gPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgcmVxdWVzdFsiYXBwcm92ZWRfYnlfdWlkIl0gPSBpbnQocGVlcl91aWQpCiAgICAgICAgc2VsZi5fd3JpdGUocmVxdWVzdCkKICAgICAgICBzZWxmLmF1ZGl0LmFwcGVuZCh7ImV2ZW50IjogInJlcXVlc3QtYXBwcm92ZWQiLCAicmVxdWVzdF9pZCI6IHJlcXVlc3RfaWQsICJ0aWVyIjogcmVxdWVzdFsidGllciJdfSkKICAgICAgICByZXR1cm4gcmVxdWVzdAoKICAgIGRlZiBfc3Ryb25nX21hbmFnZXIoc2VsZiwgcGVlcl91aWQ6IGludCk6CiAgICAgICAgaWYgaW50KHBlZXJfdWlkKSBub3QgaW4gc2VsZi5wb2xpY3kuc3Ryb25nX2FwcHJvdmVyX3VpZHM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigiYXBwcm92ZXItbm90LWF1dGhvcml6ZWQiKQogICAgICAgIGlmIHNlbGYucG9saWN5LnBhc3NrZXlfbWFuYWdlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInN0cm9uZy1hdXRoLXVuYXZhaWxhYmxlIikKICAgICAgICByZXR1cm4gc2VsZi5wb2xpY3kucGFzc2tleV9tYW5hZ2VyCgogICAgZGVmIGJlZ2luX3JlZ2lzdHJhdGlvbihzZWxmLCBwZWVyX3VpZDogaW50KSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBtYW5hZ2VyID0gc2VsZi5fc3Ryb25nX21hbmFnZXIocGVlcl91aWQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBtYW5hZ2VyLmJlZ2luX3JlZ2lzdHJhdGlvbigpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcihzdHIoZXhjKSkgZnJvbSBleGMKICAgICAgICBzZWxmLmF1ZGl0LmFwcGVuZCh7ImV2ZW50IjogInBhc3NrZXktcmVnaXN0cmF0aW9uLXN0YXJ0ZWQiLCAiYXBwcm92ZXJfdWlkIjogaW50KHBlZXJfdWlkKX0pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBmaW5pc2hfcmVnaXN0cmF0aW9uKHNlbGYsIHBlZXJfdWlkOiBpbnQsIGNyZWRlbnRpYWw6IGRpY3Rbc3RyLCBBbnldKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBtYW5hZ2VyID0gc2VsZi5fc3Ryb25nX21hbmFnZXIocGVlcl91aWQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYW5hZ2VyLmZpbmlzaF9yZWdpc3RyYXRpb24oY3JlZGVudGlhbCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKHN0cihleGMpKSBmcm9tIGV4YwogICAgICAgIHNlbGYuYXVkaXQuYXBwZW5kKHsiZXZlbnQiOiAicGFzc2tleS1lbnJvbGxlZCIsICJhcHByb3Zlcl91aWQiOiBpbnQocGVlcl91aWQpfSkKICAgICAgICByZXR1cm4geyJlbnJvbGxlZCI6IFRydWV9CgogICAgZGVmIGJlZ2luX3N0cm9uZ19hdXRoKHNlbGYsIHJlcXVlc3RfaWQ6IHN0ciwgcGVlcl91aWQ6IGludCkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgbWFuYWdlciA9IHNlbGYuX3N0cm9uZ19tYW5hZ2VyKHBlZXJfdWlkKQogICAgICAgIHJlcXVlc3QgPSBzZWxmLmdldChyZXF1ZXN0X2lkKQogICAgICAgIGlmIHJlcXVlc3RbInN0YXR1cyJdIG5vdCBpbiB7InBlbmRpbmdfb3duZXJfYXBwcm92YWwiLCAicGVuZGluZ19zdHJvbmdfYXBwcm92YWwifToKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJyZXF1ZXN0LW5vdC1wZW5kaW5nLWFwcHJvdmFsIikKICAgICAgICBpZiBpbnQodGltZS50aW1lKCkpID4gcmVxdWVzdFsiZXhwaXJlc19hdCJdOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3QtZXhwaXJlZCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gbWFuYWdlci5iZWdpbl9hdXRoZW50aWNhdGlvbihyZXF1ZXN0WyJpZCJdLCByZXF1ZXN0WyJhcHByb3ZhbF9kaWdlc3QiXSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKHN0cihleGMpKSBmcm9tIGV4YwoKICAgIGRlZiBsaXN0X3BlbmRpbmdfc3Ryb25nKHNlbGYsIHBlZXJfdWlkOiBpbnQpIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgICAgIHNlbGYuX3N0cm9uZ19tYW5hZ2VyKHBlZXJfdWlkKQogICAgICAgIHJvd3MgPSBbXQogICAgICAgIGZvciBwYXRoIGluIHNlbGYuZGlyZWN0b3J5Lmdsb2IoIiouanNvbiIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXF1ZXN0ID0ganNvbi5sb2FkcyhwYXRoLnJlYWRfdGV4dCgpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcmVxdWVzdC5nZXQoInN0YXR1cyIpIGluIHsicGVuZGluZ19vd25lcl9hcHByb3ZhbCIsICJwZW5kaW5nX3N0cm9uZ19hcHByb3ZhbCJ9IGFuZCBpbnQocmVxdWVzdC5nZXQoImV4cGlyZXNfYXQiLCAwKSkgPj0gaW50KHRpbWUudGltZSgpKToKICAgICAgICAgICAgICAgIHJvd3MuYXBwZW5kKHtrOiByZXF1ZXN0LmdldChrKSBmb3IgayBpbiAoImlkIiwgImFjdGlvbiIsICJwYXJhbXMiLCAidGllciIsICJjcmVhdGVkX2F0IiwgImV4cGlyZXNfYXQiLCAibWFuaWZlc3RfaGFzaCIpfSkKICAgICAgICByZXR1cm4gc29ydGVkKHJvd3MsIGtleT1sYW1iZGEgeDogeFsiY3JlYXRlZF9hdCJdLCByZXZlcnNlPVRydWUpCgogICAgZGVmIGNyZWF0ZV9sZWFzZV9yZXF1ZXN0KHNlbGYsIHBlZXJfdWlkOiBpbnQsIGFnZW50X3VpZDogaW50LCBwYXJhbXM6IGRpY3Rbc3RyLCBBbnldKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBzZWxmLl9zdHJvbmdfbWFuYWdlcihwZWVyX3VpZCkKICAgICAgICBpZiBpbnQoYWdlbnRfdWlkKSBub3QgaW4gc2VsZi5wb2xpY3kucmVxdWVzdF91aWRzOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3Rlci1ub3QtYXV0aG9yaXplZCIpCiAgICAgICAgaWRlbnRpdGllcyA9IHNlbGYucG9saWN5LmNvbmZpZy5nZXQoIm93bmVyX2lkZW50aXRpZXMiLCB7fSkKICAgICAgICBwbGF0Zm9ybSA9IG5leHQoKG5hbWUgZm9yIG5hbWUsIHZhbHVlcyBpbiBpZGVudGl0aWVzLml0ZW1zKCkgaWYgdmFsdWVzKSwgTm9uZSkKICAgICAgICBpZiBub3QgcGxhdGZvcm06CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigib3duZXItaWRlbnRpdHktdW5hdmFpbGFibGUiKQogICAgICAgIHNlbmRlcl9pZCA9IHN0cihpZGVudGl0aWVzW3BsYXRmb3JtXVswXSkKICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGUocGVlcl91aWQ9aW50KGFnZW50X3VpZCksIGFjdGlvbj0ibGVhc2UuY3JlYXRlIiwgcGFyYW1zPXBhcmFtcywgcHJvdmVuYW5jZT17InNvdXJjZV90eXBlIjogImRpcmVjdF9vd25lcl9tZXNzYWdlIiwgInBsYXRmb3JtIjogcGxhdGZvcm0sICJzZW5kZXJfaWQiOiBzZW5kZXJfaWR9KQoKICAgIGRlZiBsZWFzZV9saXN0KHNlbGYsIHBlZXJfdWlkOiBpbnQpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIHNlbGYuX3N0cm9uZ19tYW5hZ2VyKHBlZXJfdWlkKQogICAgICAgIGlmIHNlbGYucG9saWN5LmxlYXNlX21hbmFnZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJsZWFzZS1tYW5hZ2VyLXVuYXZhaWxhYmxlIikKICAgICAgICByZXR1cm4geyJsZWFzZXMiOiBzZWxmLnBvbGljeS5sZWFzZV9tYW5hZ2VyLmFjdGl2ZSgpfQoKICAgIGRlZiBsZWFzZV9yZXZva2Uoc2VsZiwgcGVlcl91aWQ6IGludCwgbGVhc2VfaWQ6IHN0cikgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgc2VsZi5fc3Ryb25nX21hbmFnZXIocGVlcl91aWQpCiAgICAgICAgaWYgc2VsZi5wb2xpY3kubGVhc2VfbWFuYWdlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImxlYXNlLW1hbmFnZXItdW5hdmFpbGFibGUiKQogICAgICAgIGxlYXNlID0gc2VsZi5wb2xpY3kubGVhc2VfbWFuYWdlci5yZXZva2UobGVhc2VfaWQpCiAgICAgICAgc2VsZi5hdWRpdC5hcHBlbmQoeyJldmVudCI6ICJsZWFzZS1yZXZva2VkIiwgImxlYXNlX2lkIjogbGVhc2VfaWQsICJhcHByb3Zlcl91aWQiOiBpbnQocGVlcl91aWQpfSkKICAgICAgICByZXR1cm4geyJyZXZva2VkIjogVHJ1ZSwgImlkIjogbGVhc2VbImlkIl19CgogICAgZGVmIHRvdHBfc2V0dXBfYmVnaW4oc2VsZiwgcGVlcl91aWQ6IGludCkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgc2VsZi5fc3Ryb25nX21hbmFnZXIocGVlcl91aWQpCiAgICAgICAgaWYgc2VsZi5wb2xpY3kudG90cF9tYW5hZ2VyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigidG90cC11bmF2YWlsYWJsZSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wb2xpY3kudG90cF9tYW5hZ2VyLmJlZ2luX3NldHVwKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKHN0cihleGMpKSBmcm9tIGV4YwoKICAgIGRlZiB0b3RwX3NldHVwX2ZpbmlzaChzZWxmLCBwZWVyX3VpZDogaW50LCBjb2RlOiBzdHIpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIHNlbGYuX3N0cm9uZ19tYW5hZ2VyKHBlZXJfdWlkKQogICAgICAgIGlmIHNlbGYucG9saWN5LnRvdHBfbWFuYWdlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInRvdHAtdW5hdmFpbGFibGUiKQogICAgICAgIGlmIG5vdCBzZWxmLnBvbGljeS50b3RwX21hbmFnZXIuZmluaXNoX3NldHVwKHN0cihjb2RlKSk6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigidG90cC1pbnZhbGlkIikKICAgICAgICBzZWxmLmF1ZGl0LmFwcGVuZCh7ImV2ZW50IjogInRvdHAtZW5yb2xsZWQiLCAiYXBwcm92ZXJfdWlkIjogaW50KHBlZXJfdWlkKX0pCiAgICAgICAgcmV0dXJuIHsiZW5yb2xsZWQiOiBUcnVlfQoKCmNsYXNzIEV4ZWN1dG9yOgogICAgIiIiRXhlY3V0ZSBvbmx5IHN0cnVjdHVyZWQsIHBvbGljeS1hcHByb3ZlZCB2ZXJiczsgbmV2ZXIgYXJiaXRyYXJ5IHNoZWxsLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdG9yZTogUmVxdWVzdFN0b3JlLCBhdWRpdDogQXVkaXRMb2csIHJ1bm5lcj1Ob25lKToKICAgICAgICBpbXBvcnQgc3VicHJvY2VzcwoKICAgICAgICBzZWxmLnN0b3JlID0gc3RvcmUKICAgICAgICBzZWxmLmF1ZGl0ID0gYXVkaXQKICAgICAgICBzZWxmLnJ1bm5lciA9IHJ1bm5lciBvciBzZWxmLl9zdWJwcm9jZXNzX3J1bm5lcgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3VicHJvY2Vzc19ydW5uZXIoY29tbWFuZDogbGlzdFtzdHJdKSAtPiB0dXBsZVtpbnQsIHN0cl06CiAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKCiAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgIGNvbW1hbmQsCiAgICAgICAgICAgIHRleHQ9VHJ1ZSwKICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAogICAgICAgICAgICB0aW1lb3V0PTYwMCwKICAgICAgICAgICAgZW52PXsqKm9zLmVudmlyb24sICJQQVRIIjogIi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwgIlhER19SVU5USU1FX0RJUiI6ICIvcnVuL3VzZXIvMCJ9LAogICAgICAgICkKICAgICAgICByZXR1cm4gcmVzdWx0LnJldHVybmNvZGUsIHJlc3VsdC5zdGRvdXRbLTgwMDA6XQoKICAgIGRlZiBfY29tbWFuZChzZWxmLCByZXF1ZXN0OiBkaWN0W3N0ciwgQW55XSkgLT4gbGlzdFtzdHJdOgogICAgICAgIGFjdGlvbiA9IHJlcXVlc3RbImFjdGlvbiJdCiAgICAgICAgcGFyYW1zID0gcmVxdWVzdFsicGFyYW1zIl0KICAgICAgICBpZiBhY3Rpb24gPT0gImluc3BlY3QuZmlyZXdhbGwiOgogICAgICAgICAgICByZXR1cm4gWyJuZnQiLCAibGlzdCIsICJ0YWJsZSIsICJpbmV0IiwgImhpbW1hX2ZpcmV3YWxsIl0KICAgICAgICBpZiBhY3Rpb24gPT0gImluc3BlY3Quc2VydmljZSI6CiAgICAgICAgICAgIHNjb3BlID0gc2VsZi5zdG9yZS5wb2xpY3kuY29uZmlnLmdldCgic2VydmljZV9zY29wZXMiLCB7fSkuZ2V0KHBhcmFtc1sic2VydmljZSJdLCAidXNlciIpCiAgICAgICAgICAgIHJldHVybiBbInN5c3RlbWN0bCIsICJpcy1hY3RpdmUiLCBwYXJhbXNbInNlcnZpY2UiXV0gaWYgc2NvcGUgPT0gInN5c3RlbSIgZWxzZSBbInN5c3RlbWN0bCIsICItLXVzZXIiLCAiaXMtYWN0aXZlIiwgcGFyYW1zWyJzZXJ2aWNlIl1dCiAgICAgICAgaWYgYWN0aW9uID09ICJzZXJ2aWNlLnJlc3RhcnQiOgogICAgICAgICAgICBzY29wZSA9IHNlbGYuc3RvcmUucG9saWN5LmNvbmZpZy5nZXQoInNlcnZpY2Vfc2NvcGVzIiwge30pLmdldChwYXJhbXNbInNlcnZpY2UiXSwgInVzZXIiKQogICAgICAgICAgICByZXR1cm4gWyJzeXN0ZW1jdGwiLCAicmVzdGFydCIsIHBhcmFtc1sic2VydmljZSJdXSBpZiBzY29wZSA9PSAic3lzdGVtIiBlbHNlIFsic3lzdGVtY3RsIiwgIi0tdXNlciIsICJyZXN0YXJ0IiwgcGFyYW1zWyJzZXJ2aWNlIl1dCiAgICAgICAgaWYgYWN0aW9uID09ICJwYWNrYWdlLmluc3RhbGwiOgogICAgICAgICAgICByZXR1cm4gWyJhcHQtZ2V0IiwgImluc3RhbGwiLCAiLXkiLCAiLS1uby1pbnN0YWxsLXJlY29tbWVuZHMiLCBwYXJhbXNbInBhY2thZ2UiXV0KICAgICAgICBpZiBhY3Rpb24gPT0gIm5naW54LnJlbG9hZCI6CiAgICAgICAgICAgIHJldHVybiBbInN5c3RlbWN0bCIsICJyZWxvYWQiLCAibmdpbngiXQogICAgICAgIGlmIGFjdGlvbiA9PSAic3Ryb25nX2F1dGgudGVzdCI6CiAgICAgICAgICAgIHJldHVybiBbIi91c3IvYmluL3RydWUiXQogICAgICAgIGlmIGFjdGlvbiA9PSAiYmFja3VwLnN0YXR1cyI6CiAgICAgICAgICAgIHJldHVybiBbIi91c3IvbG9jYWwvc2Jpbi9oaW1tYS1wcm90ZWN0ZWQtYmFja3VwIiwgInN0YXR1cyJdCiAgICAgICAgaWYgYWN0aW9uID09ICJiYWNrdXAucnVuIjoKICAgICAgICAgICAgcmV0dXJuIFsiL3Vzci9sb2NhbC9zYmluL2hpbW1hLXByb3RlY3RlZC1iYWNrdXAiLCAicnVuIl0KICAgICAgICBpZiBhY3Rpb24gPT0gImJhY2t1cC5yZXN0b3JlX3Rlc3QiOgogICAgICAgICAgICByZXR1cm4gWyIvdXNyL2xvY2FsL3NiaW4vaGltbWEtcHJvdGVjdGVkLWJhY2t1cCIsICJyZXN0b3JlLXRlc3QiXQogICAgICAgIHJhaXNlIEdhdGVFcnJvcigiYWN0aW9uLW5vdC1pbXBsZW1lbnRlZCIpCgogICAgZGVmIGV4ZWN1dGUoc2VsZiwgcmVxdWVzdF9pZDogc3RyKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICByZXF1ZXN0ID0gc2VsZi5zdG9yZS5nZXQocmVxdWVzdF9pZCkKICAgICAgICBpZiByZXF1ZXN0WyJzdGF0dXMiXSAhPSAiYXBwcm92ZWQiOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3Qtbm90LWFwcHJvdmVkIikKICAgICAgICBpZiBpbnQodGltZS50aW1lKCkpID4gcmVxdWVzdFsiZXhwaXJlc19hdCJdOgogICAgICAgICAgICByZXF1ZXN0WyJzdGF0dXMiXSA9ICJleHBpcmVkIgogICAgICAgICAgICBzZWxmLnN0b3JlLl93cml0ZShyZXF1ZXN0KQogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3QtZXhwaXJlZCIpCiAgICAgICAgaWYgcmVxdWVzdC5nZXQoImxlYXNlX2lkIik6CiAgICAgICAgICAgIGlmIHNlbGYuc3RvcmUucG9saWN5LmxlYXNlX21hbmFnZXIgaXMgTm9uZSBvciBub3Qgc2VsZi5zdG9yZS5wb2xpY3kubGVhc2VfbWFuYWdlci5jb25zdW1lKHJlcXVlc3RbImxlYXNlX2lkIl0pOgogICAgICAgICAgICAgICAgcmVxdWVzdFsic3RhdHVzIl0gPSAiZmFpbGVkIgogICAgICAgICAgICAgICAgcmVxdWVzdFsicmVzdWx0Il0gPSB7ImVycm9yIjogImxlYXNlLWV4cGlyZWQtb3ItZXhoYXVzdGVkIn0KICAgICAgICAgICAgICAgIHNlbGYuc3RvcmUuX3dyaXRlKHJlcXVlc3QpCiAgICAgICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImxlYXNlLWV4cGlyZWQtb3ItZXhoYXVzdGVkIikKICAgICAgICAgICAgc2VsZi5hdWRpdC5hcHBlbmQoeyJldmVudCI6ICJsZWFzZS1jb25zdW1lZCIsICJsZWFzZV9pZCI6IHJlcXVlc3RbImxlYXNlX2lkIl0sICJyZXF1ZXN0X2lkIjogcmVxdWVzdF9pZCwgImFjdGlvbiI6IHJlcXVlc3RbImFjdGlvbiJdfSkKICAgICAgICBpZiByZXF1ZXN0WyJhY3Rpb24iXSA9PSAibGVhc2UuY3JlYXRlIjoKICAgICAgICAgICAgaWYgc2VsZi5zdG9yZS5wb2xpY3kubGVhc2VfbWFuYWdlciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJsZWFzZS1tYW5hZ2VyLXVuYXZhaWxhYmxlIikKICAgICAgICAgICAgcGFyYW1zID0gcmVxdWVzdFsicGFyYW1zIl0KICAgICAgICAgICAgbGVhc2UgPSBzZWxmLnN0b3JlLnBvbGljeS5sZWFzZV9tYW5hZ2VyLmFjdGl2YXRlKHJlcXVlc3Rlcl91aWQ9cmVxdWVzdFsicmVxdWVzdGVyX3VpZCJdLCBkdXJhdGlvbl9zZWNvbmRzPXBhcmFtc1siZHVyYXRpb25fc2Vjb25kcyJdLCBzY29wZXM9cGFyYW1zWyJzY29wZXMiXSwgbWF4X3VzZXM9cGFyYW1zWyJtYXhfdXNlcyJdKQogICAgICAgICAgICByZXF1ZXN0WyJzdGF0dXMiXSA9ICJleGVjdXRlZCIKICAgICAgICAgICAgcmVxdWVzdFsiZXhlY3V0ZWRfYXQiXSA9IGludCh0aW1lLnRpbWUoKSkKICAgICAgICAgICAgcmVxdWVzdFsicmVzdWx0Il0gPSB7ImxlYXNlX2lkIjogbGVhc2VbImlkIl0sICJleHBpcmVzX2F0IjogbGVhc2VbImV4cGlyZXNfYXQiXSwgIm1heF91c2VzIjogbGVhc2VbIm1heF91c2VzIl0sICJzY29wZXMiOiBsZWFzZVsic2NvcGVzIl19CiAgICAgICAgICAgIHNlbGYuc3RvcmUuX3dyaXRlKHJlcXVlc3QpCiAgICAgICAgICAgIHNlbGYuYXVkaXQuYXBwZW5kKHsiZXZlbnQiOiAibGVhc2UtYWN0aXZhdGVkIiwgInJlcXVlc3RfaWQiOiByZXF1ZXN0X2lkLCAibGVhc2VfaWQiOiBsZWFzZVsiaWQiXSwgInJlcXVlc3Rlcl91aWQiOiByZXF1ZXN0WyJyZXF1ZXN0ZXJfdWlkIl0sICJleHBpcmVzX2F0IjogbGVhc2VbImV4cGlyZXNfYXQiXX0pCiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0CiAgICAgICAgY29tbWFuZCA9IHNlbGYuX2NvbW1hbmQocmVxdWVzdCkKICAgICAgICBpZiByZXF1ZXN0WyJhY3Rpb24iXSA9PSAibmdpbngucmVsb2FkIjoKICAgICAgICAgICAgY2hlY2tfcmMsIGNoZWNrX291dHB1dCA9IHNlbGYucnVubmVyKFsibmdpbngiLCAiLXQiXSkKICAgICAgICAgICAgaWYgY2hlY2tfcmM6CiAgICAgICAgICAgICAgICByZXF1ZXN0WyJzdGF0dXMiXSA9ICJmYWlsZWQiCiAgICAgICAgICAgICAgICByZXF1ZXN0WyJyZXN1bHQiXSA9IHsicmV0dXJuY29kZSI6IGNoZWNrX3JjLCAib3V0cHV0IjogY2hlY2tfb3V0cHV0Wy0yMDAwOl19CiAgICAgICAgICAgICAgICBzZWxmLnN0b3JlLl93cml0ZShyZXF1ZXN0KQogICAgICAgICAgICAgICAgc2VsZi5hdWRpdC5hcHBlbmQoeyJldmVudCI6ICJleGVjdXRpb24tZmFpbGVkIiwgInJlcXVlc3RfaWQiOiByZXF1ZXN0X2lkLCAic3RhZ2UiOiAicHJlZmxpZ2h0In0pCiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdAogICAgICAgIHJlcXVlc3RbInN0YXR1cyJdID0gImV4ZWN1dGluZyIKICAgICAgICByZXF1ZXN0WyJleGVjdXRpb25fc3RhcnRlZF9hdCJdID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIHNlbGYuc3RvcmUuX3dyaXRlKHJlcXVlc3QpCiAgICAgICAgc2VsZi5hdWRpdC5hcHBlbmQoeyJldmVudCI6ICJleGVjdXRpb24tc3RhcnRlZCIsICJyZXF1ZXN0X2lkIjogcmVxdWVzdF9pZCwgImFjdGlvbiI6IHJlcXVlc3RbImFjdGlvbiJdfSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybmNvZGUsIG91dHB1dCA9IHNlbGYucnVubmVyKGNvbW1hbmQpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHJlcXVlc3RbInN0YXR1cyJdID0gImZhaWxlZCIKICAgICAgICAgICAgcmVxdWVzdFsicmVzdWx0Il0gPSB7ImVycm9yIjogdHlwZShleGMpLl9fbmFtZV9ffQogICAgICAgICAgICBzZWxmLnN0b3JlLl93cml0ZShyZXF1ZXN0KQogICAgICAgICAgICBzZWxmLmF1ZGl0LmFwcGVuZCh7ImV2ZW50IjogImV4ZWN1dGlvbi1mYWlsZWQiLCAicmVxdWVzdF9pZCI6IHJlcXVlc3RfaWQsICJlcnJvciI6IHR5cGUoZXhjKS5fX25hbWVfX30pCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgcmVxdWVzdFsic3RhdHVzIl0gPSAiZXhlY3V0ZWQiIGlmIHJldHVybmNvZGUgPT0gMCBlbHNlICJmYWlsZWQiCiAgICAgICAgcmVxdWVzdFsiZXhlY3V0ZWRfYXQiXSA9IGludCh0aW1lLnRpbWUoKSkKICAgICAgICByZXF1ZXN0WyJyZXN1bHQiXSA9IHsicmV0dXJuY29kZSI6IGludChyZXR1cm5jb2RlKSwgIm91dHB1dCI6IG91dHB1dFstMjAwMDpdfQogICAgICAgIHNlbGYuc3RvcmUuX3dyaXRlKHJlcXVlc3QpCiAgICAgICAgc2VsZi5hdWRpdC5hcHBlbmQoeyJldmVudCI6ICJleGVjdXRpb24tY29tcGxldGVkIiwgInJlcXVlc3RfaWQiOiByZXF1ZXN0X2lkLCAic3RhdHVzIjogcmVxdWVzdFsic3RhdHVzIl0sICJyZXR1cm5jb2RlIjogaW50KHJldHVybmNvZGUpfSkKICAgICAgICByZXR1cm4gcmVxdWVzdAoKCmRlZiBoYW5kbGVfbWVzc2FnZShtZXNzYWdlOiBkaWN0W3N0ciwgQW55XSwgcGVlcl91aWQ6IGludCwgc3RvcmU6IFJlcXVlc3RTdG9yZSwgZXhlY3V0b3I6IEV4ZWN1dG9yKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICIiIkhhbmRsZSBvbmUgYXV0aGVudGljYXRlZCBVbml4LXNvY2tldCBtZXNzYWdlLiIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UobWVzc2FnZSwgZGljdCk6CiAgICAgICAgcmFpc2UgR2F0ZUVycm9yKCJpbnZhbGlkLW1lc3NhZ2UiKQogICAgb3BlcmF0aW9uID0gbWVzc2FnZS5nZXQoIm9wZXJhdGlvbiIpCiAgICBpZiBvcGVyYXRpb24gPT0gInJlcXVlc3QiOgogICAgICAgIHJldHVybiBzdG9yZS5jcmVhdGUoCiAgICAgICAgICAgIHBlZXJfdWlkPXBlZXJfdWlkLAogICAgICAgICAgICBhY3Rpb249bWVzc2FnZS5nZXQoImFjdGlvbiIsICIiKSwKICAgICAgICAgICAgcGFyYW1zPW1lc3NhZ2UuZ2V0KCJwYXJhbXMiKSBpZiBpc2luc3RhbmNlKG1lc3NhZ2UuZ2V0KCJwYXJhbXMiKSwgZGljdCkgZWxzZSB7fSwKICAgICAgICAgICAgcHJvdmVuYW5jZT1tZXNzYWdlLmdldCgicHJvdmVuYW5jZSIpIGlmIGlzaW5zdGFuY2UobWVzc2FnZS5nZXQoInByb3ZlbmFuY2UiKSwgZGljdCkgZWxzZSB7fSwKICAgICAgICApCiAgICBpZiBvcGVyYXRpb24gPT0gInN0YXR1cyI6CiAgICAgICAgcmVxdWVzdCA9IHN0b3JlLmdldChtZXNzYWdlLmdldCgicmVxdWVzdF9pZCIsICIiKSkKICAgICAgICBpZiBwZWVyX3VpZCBub3QgaW4gc3RvcmUucG9saWN5LnJlcXVlc3RfdWlkcyB8IHN0b3JlLnBvbGljeS5hZG1pbl91aWRzOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoInJlcXVlc3Rlci1ub3QtYXV0aG9yaXplZCIpCiAgICAgICAgcmV0dXJuIHJlcXVlc3QKICAgIGlmIG9wZXJhdGlvbiA9PSAicmVnaXN0cmF0aW9uX2JlZ2luIjoKICAgICAgICByZXR1cm4gc3RvcmUuYmVnaW5fcmVnaXN0cmF0aW9uKHBlZXJfdWlkKQogICAgaWYgb3BlcmF0aW9uID09ICJyZWdpc3RyYXRpb25fZmluaXNoIjoKICAgICAgICBjcmVkZW50aWFsID0gbWVzc2FnZS5nZXQoImNyZWRlbnRpYWwiKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNyZWRlbnRpYWwsIGRpY3QpOgogICAgICAgICAgICByYWlzZSBHYXRlRXJyb3IoImludmFsaWQtY3JlZGVudGlhbCIpCiAgICAgICAgcmV0dXJuIHN0b3JlLmZpbmlzaF9yZWdpc3RyYXRpb24ocGVlcl91aWQsIGNyZWRlbnRpYWwpCiAgICBpZiBvcGVyYXRpb24gPT0gInN0cm9uZ19iZWdpbiI6CiAgICAgICAgcmV0dXJuIHN0b3JlLmJlZ2luX3N0cm9uZ19hdXRoKG1lc3NhZ2UuZ2V0KCJyZXF1ZXN0X2lkIiwgIiIpLCBwZWVyX3VpZCkKICAgIGlmIG9wZXJhdGlvbiA9PSAibGlzdF9wZW5kaW5nX3N0cm9uZyI6CiAgICAgICAgcmV0dXJuIHsicmVxdWVzdHMiOiBzdG9yZS5saXN0X3BlbmRpbmdfc3Ryb25nKHBlZXJfdWlkKX0KICAgIGlmIG9wZXJhdGlvbiA9PSAibGVhc2VfcmVxdWVzdCI6CiAgICAgICAgcGFyYW1zID0gbWVzc2FnZS5nZXQoInBhcmFtcyIpIGlmIGlzaW5zdGFuY2UobWVzc2FnZS5nZXQoInBhcmFtcyIpLCBkaWN0KSBlbHNlIHt9CiAgICAgICAgcmV0dXJuIHN0b3JlLmNyZWF0ZV9sZWFzZV9yZXF1ZXN0KHBlZXJfdWlkLCBpbnQobWVzc2FnZS5nZXQoImFnZW50X3VpZCIsIC0xKSksIHBhcmFtcykKICAgIGlmIG9wZXJhdGlvbiA9PSAibGVhc2VfbGlzdCI6CiAgICAgICAgcmV0dXJuIHN0b3JlLmxlYXNlX2xpc3QocGVlcl91aWQpCiAgICBpZiBvcGVyYXRpb24gPT0gImxlYXNlX3Jldm9rZSI6CiAgICAgICAgcmV0dXJuIHN0b3JlLmxlYXNlX3Jldm9rZShwZWVyX3VpZCwgc3RyKG1lc3NhZ2UuZ2V0KCJsZWFzZV9pZCIsICIiKSkpCiAgICBpZiBvcGVyYXRpb24gPT0gInRvdHBfc2V0dXBfYmVnaW4iOgogICAgICAgIHJldHVybiBzdG9yZS50b3RwX3NldHVwX2JlZ2luKHBlZXJfdWlkKQogICAgaWYgb3BlcmF0aW9uID09ICJ0b3RwX3NldHVwX2ZpbmlzaCI6CiAgICAgICAgcmV0dXJuIHN0b3JlLnRvdHBfc2V0dXBfZmluaXNoKHBlZXJfdWlkLCBzdHIobWVzc2FnZS5nZXQoImNvZGUiLCAiIikpKQogICAgaWYgb3BlcmF0aW9uID09ICJhcHByb3ZlIjoKICAgICAgICByZXR1cm4gc3RvcmUuYXBwcm92ZSgKICAgICAgICAgICAgbWVzc2FnZS5nZXQoInJlcXVlc3RfaWQiLCAiIiksCiAgICAgICAgICAgIHBlZXJfdWlkPXBlZXJfdWlkLAogICAgICAgICAgICBzdHJvbmdfYXNzZXJ0aW9uPW1lc3NhZ2UuZ2V0KCJzdHJvbmdfYXNzZXJ0aW9uIiksCiAgICAgICAgKQogICAgaWYgb3BlcmF0aW9uID09ICJleGVjdXRlIjoKICAgICAgICByZXF1ZXN0ID0gc3RvcmUuZ2V0KG1lc3NhZ2UuZ2V0KCJyZXF1ZXN0X2lkIiwgIiIpKQogICAgICAgIGlmIHBlZXJfdWlkIG5vdCBpbiBzdG9yZS5wb2xpY3kucmVxdWVzdF91aWRzIHwgc3RvcmUucG9saWN5LmFkbWluX3VpZHM6CiAgICAgICAgICAgIHJhaXNlIEdhdGVFcnJvcigicmVxdWVzdGVyLW5vdC1hdXRob3JpemVkIikKICAgICAgICByZXR1cm4gZXhlY3V0b3IuZXhlY3V0ZShyZXF1ZXN0WyJpZCJdKQogICAgcmFpc2UgR2F0ZUVycm9yKCJ1bnN1cHBvcnRlZC1vcGVyYXRpb24iKQo= B64_privilege_gate_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/gate_daemon.py' <<'B64_gate_daemon_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJSb290LW93bmVkIFVuaXgtc29ja2V0IGRhZW1vbiBmb3Igc3RydWN0dXJlZCBwcml2aWxlZ2VkIG9wZXJhdGlvbnMuIiIiCgppbXBvcnQgZ3JwCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCBzb2NrZXRzZXJ2ZXIKaW1wb3J0IHN0cnVjdAppbXBvcnQgc3lzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKZnJvbSBwcml2aWxlZ2VfZ2F0ZSBpbXBvcnQgQXVkaXRMb2csIEV4ZWN1dG9yLCBHYXRlRXJyb3IsIFBvbGljeSwgUmVxdWVzdFN0b3JlLCBoYW5kbGVfbWVzc2FnZQpmcm9tIHBhc3NrZXlfbWFuYWdlciBpbXBvcnQgUGFzc2tleU1hbmFnZXIKZnJvbSBsZWFzZV9tYW5hZ2VyIGltcG9ydCBMZWFzZU1hbmFnZXIsIFRvdHBNYW5hZ2VyCgpDT05GSUcgPSBQYXRoKCIvZXRjL2hpbW1hLXByaXZpbGVnZS1nYXRlL2NvbmZpZy5qc29uIikKU09DS0VUID0gUGF0aCgiL3J1bi9oaW1tYS1wcml2aWxlZ2UtZ2F0ZS9nYXRlLnNvY2siKQpTVEFURSA9IFBhdGgoIi92YXIvbGliL2hpbW1hLXByaXZpbGVnZS1nYXRlIikKQVVESVQgPSBQYXRoKCIvdmFyL2xvZy9oaW1tYS1wcml2aWxlZ2UtZ2F0ZS9hdWRpdC5qc29ubCIpCk1BWF9NRVNTQUdFID0gNjU1MzYKCgpkZWYgbG9hZF9jb21wb25lbnRzKCk6CiAgICBjb25maWcgPSBqc29uLmxvYWRzKENPTkZJRy5yZWFkX3RleHQoKSkKICAgIHBvbGljeSA9IFBvbGljeShjb25maWcpCiAgICBwYXNza2V5ID0gY29uZmlnLmdldCgicGFzc2tleSIpIG9yIHt9CiAgICBpZiBwYXNza2V5LmdldCgicnBfaWQiKSBhbmQgcGFzc2tleS5nZXQoIm9yaWdpbiIpOgogICAgICAgIHBvbGljeS5wYXNza2V5X21hbmFnZXIgPSBQYXNza2V5TWFuYWdlcigKICAgICAgICAgICAgc3RhdGVfcGF0aD1QYXRoKHBhc3NrZXkuZ2V0KCJzdGF0ZV9wYXRoIiwgU1RBVEUgLyAicGFzc2tleS1jcmVkZW50aWFsLmpzb24iKSksCiAgICAgICAgICAgIGVucm9sbG1lbnRfbWFya2VyPVBhdGgocGFzc2tleS5nZXQoImVucm9sbG1lbnRfbWFya2VyIiwgU1RBVEUgLyAiZW5yb2xsbWVudC13aW5kb3cuanNvbiIpKSwKICAgICAgICAgICAgcnBfaWQ9cGFzc2tleVsicnBfaWQiXSwKICAgICAgICAgICAgb3JpZ2luPXBhc3NrZXlbIm9yaWdpbiJdLAogICAgICAgICkKICAgIGF1ZGl0ID0gQXVkaXRMb2coQVVESVQpCiAgICBwb2xpY3kubGVhc2VfbWFuYWdlciA9IExlYXNlTWFuYWdlcihTVEFURSAvICJsZWFzZXMiKQogICAgcG9saWN5LnRvdHBfbWFuYWdlciA9IFRvdHBNYW5hZ2VyKFNUQVRFIC8gInRvdHAuanNvbiIsIGlzc3Vlcj0iSGltbWEgUHJpdmlsZWdlZCBBcHByb3ZhbCIsIGFjY291bnQ9IkFidSBIaW1tYSIpCiAgICBzdG9yZSA9IFJlcXVlc3RTdG9yZShTVEFURSAvICJyZXF1ZXN0cyIsIHBvbGljeSwgYXVkaXQpCiAgICByZXR1cm4gc3RvcmUsIEV4ZWN1dG9yKHN0b3JlLCBhdWRpdCkKCgpTVE9SRSwgRVhFQ1VUT1IgPSBsb2FkX2NvbXBvbmVudHMoKQoKCmNsYXNzIEhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKICAgIGRlZiBoYW5kbGUoc2VsZik6CiAgICAgICAgY3JlZGVudGlhbHMgPSBzZWxmLnJlcXVlc3QuZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1BFRVJDUkVELCBzdHJ1Y3QuY2FsY3NpemUoIjNpIikpCiAgICAgICAgX3BpZCwgdWlkLCBfZ2lkID0gc3RydWN0LnVucGFjaygiM2kiLCBjcmVkZW50aWFscykKICAgICAgICByYXcgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKE1BWF9NRVNTQUdFICsgMSkKICAgICAgICBpZiBsZW4ocmF3KSA+IE1BWF9NRVNTQUdFOgogICAgICAgICAgICByZXNwb25zZSA9IHsib2siOiBGYWxzZSwgImVycm9yIjogIm1lc3NhZ2UtdG9vLWxhcmdlIn0KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0ganNvbi5sb2FkcyhyYXcpCiAgICAgICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVfbWVzc2FnZShtZXNzYWdlLCB1aWQsIFNUT1JFLCBFWEVDVVRPUikKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geyJvayI6IFRydWUsICJyZXN1bHQiOiByZXN1bHR9CiAgICAgICAgICAgIGV4Y2VwdCBHYXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB7Im9rIjogRmFsc2UsICJlcnJvciI6IHN0cihleGMpfQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geyJvayI6IEZhbHNlLCAiZXJyb3IiOiAiaW50ZXJuYWwtZXJyb3IiLCAidHlwZSI6IHR5cGUoZXhjKS5fX25hbWVfX30KICAgICAgICBzZWxmLndmaWxlLndyaXRlKGpzb24uZHVtcHMocmVzcG9uc2UsIHNvcnRfa2V5cz1UcnVlKS5lbmNvZGUoKSArIGIiXG4iKQoKCmNsYXNzIFNlcnZlcihzb2NrZXRzZXJ2ZXIuVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlcik6CiAgICBkYWVtb25fdGhyZWFkcyA9IFRydWUKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgaWYgb3MuZ2V0ZXVpZCgpICE9IDA6CiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCgibXVzdCBydW4gYXMgcm9vdCIpCiAgICBTT0NLRVQucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgIGdpZCA9IGdycC5nZXRncm5hbSgiaGltbWEtcHJpdmlsZWdlIikuZ3JfZ2lkCiAgICBvcy5jaG93bihTT0NLRVQucGFyZW50LCAwLCBnaWQpCiAgICBvcy5jaG1vZChTT0NLRVQucGFyZW50LCAwbzc1MCkKICAgIFNPQ0tFVC51bmxpbmsobWlzc2luZ19vaz1UcnVlKQogICAgd2l0aCBTZXJ2ZXIoc3RyKFNPQ0tFVCksIEhhbmRsZXIpIGFzIHNlcnZlcjoKICAgICAgICBvcy5jaG93bihTT0NLRVQsIDAsIGdpZCkKICAgICAgICBvcy5jaG1vZChTT0NLRVQsIDBvNjYwKQogICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkK B64_gate_daemon_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/lease_manager.py' <<'B64_lease_manager_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYmFzZTY0CmltcG9ydCBoYXNobGliCmltcG9ydCBobWFjCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc2VjcmV0cwppbXBvcnQgc3RydWN0CmltcG9ydCB0aW1lCmltcG9ydCB1cmxsaWIucGFyc2UKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCgpjbGFzcyBMZWFzZUVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICBwYXNzCgoKZGVmIGF0b21pY19qc29uKHBhdGg6IFBhdGgsIHZhbHVlOiBkaWN0W3N0ciwgQW55XSwgbW9kZTogaW50ID0gMG82MDApIC0+IE5vbmU6CiAgICBwYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICB0ZW1wID0gcGF0aC53aXRoX3N1ZmZpeCgnLnRtcCcpCiAgICBmZCA9IG9zLm9wZW4odGVtcCwgb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUIHwgb3MuT19UUlVOQywgbW9kZSkKICAgIHRyeToKICAgICAgICBvcy53cml0ZShmZCwganNvbi5kdW1wcyh2YWx1ZSwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCcsJywgJzonKSkuZW5jb2RlKCkgKyBiJ1xuJykKICAgICAgICBvcy5mc3luYyhmZCkKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2xvc2UoZmQpCiAgICBvcy5yZXBsYWNlKHRlbXAsIHBhdGgpCiAgICBvcy5jaG1vZChwYXRoLCBtb2RlKQoKCmNsYXNzIExlYXNlTWFuYWdlcjoKICAgIERVUkFUSU9OUyA9IHszMDA6IDIwLCA5MDA6IDUwLCAxODAwOiAxMDAsIDM2MDA6IDIwMH0KICAgIExFQVNFQUJMRSA9IHsnc2VydmljZS5yZXN0YXJ0JywgJ2JhY2t1cC5ydW4nLCAnbmdpbngucmVsb2FkJ30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5OiBQYXRoKToKICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IFBhdGgoZGlyZWN0b3J5KQogICAgICAgIHNlbGYuZGlyZWN0b3J5Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBkZWYgX3BhdGgoc2VsZiwgbGVhc2VfaWQ6IHN0cikgLT4gUGF0aDoKICAgICAgICBpZiBub3QgbGVhc2VfaWQgb3IgbGVuKGxlYXNlX2lkKSAhPSAzMiBvciBhbnkoYyBub3QgaW4gJzAxMjM0NTY3ODlhYmNkZWYnIGZvciBjIGluIGxlYXNlX2lkKToKICAgICAgICAgICAgcmFpc2UgTGVhc2VFcnJvcignaW52YWxpZC1sZWFzZS1pZCcpCiAgICAgICAgcmV0dXJuIHNlbGYuZGlyZWN0b3J5IC8gZid7bGVhc2VfaWR9Lmpzb24nCgogICAgZGVmIF92YWxpZGF0ZV9zY29wZXMoc2VsZiwgc2NvcGVzOiBsaXN0W2RpY3Rbc3RyLCBBbnldXSkgLT4gbGlzdFtkaWN0W3N0ciwgQW55XV06CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2NvcGVzLCBsaXN0KSBvciBub3Qgc2NvcGVzIG9yIGxlbihzY29wZXMpID4gMTA6CiAgICAgICAgICAgIHJhaXNlIExlYXNlRXJyb3IoJ2ludmFsaWQtc2NvcGVzJykKICAgICAgICBjbGVhbiA9IFtdCiAgICAgICAgZm9yIHNjb3BlIGluIHNjb3BlczoKICAgICAgICAgICAgYWN0aW9uID0gc3RyKHNjb3BlLmdldCgnYWN0aW9uJywgJycpKQogICAgICAgICAgICBpZiBhY3Rpb24gbm90IGluIHNlbGYuTEVBU0VBQkxFOgogICAgICAgICAgICAgICAgcmFpc2UgTGVhc2VFcnJvcignYWN0aW9uLW5vdC1sZWFzZWFibGUnKQogICAgICAgICAgICBpdGVtOiBkaWN0W3N0ciwgQW55XSA9IHsnYWN0aW9uJzogYWN0aW9ufQogICAgICAgICAgICBpZiBhY3Rpb24gPT0gJ3NlcnZpY2UucmVzdGFydCc6CiAgICAgICAgICAgICAgICB0YXJnZXRzID0gc2NvcGUuZ2V0KCd0YXJnZXRzJykKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhcmdldHMsIGxpc3QpIG9yIG5vdCB0YXJnZXRzIG9yIGxlbih0YXJnZXRzKSA+IDEwIG9yIG5vdCBhbGwoaXNpbnN0YW5jZSh4LCBzdHIpIGFuZCB4LmVuZHN3aXRoKCcuc2VydmljZScpIGZvciB4IGluIHRhcmdldHMpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIExlYXNlRXJyb3IoJ2ludmFsaWQtc2VydmljZS10YXJnZXRzJykKICAgICAgICAgICAgICAgIGl0ZW1bJ3RhcmdldHMnXSA9IHNvcnRlZChzZXQodGFyZ2V0cykpCiAgICAgICAgICAgIGNsZWFuLmFwcGVuZChpdGVtKQogICAgICAgIHJldHVybiBjbGVhbgoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCAqLCByZXF1ZXN0ZXJfdWlkOiBpbnQsIGR1cmF0aW9uX3NlY29uZHM6IGludCwgc2NvcGVzOiBsaXN0W2RpY3Rbc3RyLCBBbnldXSwgbWF4X3VzZXM6IGludCkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgaWYgZHVyYXRpb25fc2Vjb25kcyBub3QgaW4gc2VsZi5EVVJBVElPTlM6CiAgICAgICAgICAgIHJhaXNlIExlYXNlRXJyb3IoJ3Vuc3VwcG9ydGVkLWR1cmF0aW9uJykKICAgICAgICBjbGVhbiA9IHNlbGYuX3ZhbGlkYXRlX3Njb3BlcyhzY29wZXMpCiAgICAgICAgY2FwID0gc2VsZi5EVVJBVElPTlNbZHVyYXRpb25fc2Vjb25kc10KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtYXhfdXNlcywgaW50KSBvciBtYXhfdXNlcyA8IDEgb3IgbWF4X3VzZXMgPiBjYXA6CiAgICAgICAgICAgIHJhaXNlIExlYXNlRXJyb3IoJ2ludmFsaWQtdXNlLWxpbWl0JykKICAgICAgICBub3cgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgbGVhc2UgPSB7CiAgICAgICAgICAgICdpZCc6IHNlY3JldHMudG9rZW5faGV4KDE2KSwKICAgICAgICAgICAgJ3JlcXVlc3Rlcl91aWQnOiBpbnQocmVxdWVzdGVyX3VpZCksCiAgICAgICAgICAgICdzY29wZXMnOiBjbGVhbiwKICAgICAgICAgICAgJ2NyZWF0ZWRfYXQnOiBub3csCiAgICAgICAgICAgICdleHBpcmVzX2F0Jzogbm93ICsgZHVyYXRpb25fc2Vjb25kcywKICAgICAgICAgICAgJ21heF91c2VzJzogbWF4X3VzZXMsCiAgICAgICAgICAgICd1c2VzJzogMCwKICAgICAgICAgICAgJ3N0YXR1cyc6ICdhY3RpdmUnLAogICAgICAgIH0KICAgICAgICBhdG9taWNfanNvbihzZWxmLl9wYXRoKGxlYXNlWydpZCddKSwgbGVhc2UpCiAgICAgICAgcmV0dXJuIGxlYXNlCgogICAgZGVmIGdldChzZWxmLCBsZWFzZV9pZDogc3RyKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICBwYXRoID0gc2VsZi5fcGF0aChsZWFzZV9pZCkKICAgICAgICBpZiBub3QgcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgcmFpc2UgTGVhc2VFcnJvcignbGVhc2Utbm90LWZvdW5kJykKICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhwYXRoLnJlYWRfdGV4dCgpKQoKICAgIGRlZiBfbWF0Y2hlcyhzZWxmLCBsZWFzZTogZGljdFtzdHIsIEFueV0sIHJlcXVlc3Rlcl91aWQ6IGludCwgYWN0aW9uOiBzdHIsIHBhcmFtczogZGljdFtzdHIsIEFueV0pIC0+IGJvb2w6CiAgICAgICAgaWYgbGVhc2UuZ2V0KCdzdGF0dXMnKSAhPSAnYWN0aXZlJyBvciBpbnQobGVhc2UuZ2V0KCdleHBpcmVzX2F0JywgMCkpIDw9IGludCh0aW1lLnRpbWUoKSkgb3IgaW50KGxlYXNlLmdldCgndXNlcycsIDApKSA+PSBpbnQobGVhc2UuZ2V0KCdtYXhfdXNlcycsIDApKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgaW50KGxlYXNlLmdldCgncmVxdWVzdGVyX3VpZCcsIC0xKSkgIT0gaW50KHJlcXVlc3Rlcl91aWQpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBmb3Igc2NvcGUgaW4gbGVhc2UuZ2V0KCdzY29wZXMnLCBbXSk6CiAgICAgICAgICAgIGlmIHNjb3BlLmdldCgnYWN0aW9uJykgIT0gYWN0aW9uOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgYWN0aW9uID09ICdzZXJ2aWNlLnJlc3RhcnQnIGFuZCBwYXJhbXMuZ2V0KCdzZXJ2aWNlJykgbm90IGluIHNjb3BlLmdldCgndGFyZ2V0cycsIFtdKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIG1hdGNoKHNlbGYsIHJlcXVlc3Rlcl91aWQ6IGludCwgYWN0aW9uOiBzdHIsIHBhcmFtczogZGljdFtzdHIsIEFueV0pIC0+IGRpY3Rbc3RyLCBBbnldIHwgTm9uZToKICAgICAgICBmb3IgcGF0aCBpbiBzb3J0ZWQoc2VsZi5kaXJlY3RvcnkuZ2xvYignKi5qc29uJyksIHJldmVyc2U9VHJ1ZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxlYXNlID0ganNvbi5sb2FkcyhwYXRoLnJlYWRfdGV4dCgpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc2VsZi5fbWF0Y2hlcyhsZWFzZSwgcmVxdWVzdGVyX3VpZCwgYWN0aW9uLCBwYXJhbXMpOgogICAgICAgICAgICAgICAgcmV0dXJuIGxlYXNlCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgY29uc3VtZShzZWxmLCBsZWFzZV9pZDogc3RyKSAtPiBib29sOgogICAgICAgIGxlYXNlID0gc2VsZi5nZXQobGVhc2VfaWQpCiAgICAgICAgaWYgbGVhc2UuZ2V0KCdzdGF0dXMnKSAhPSAnYWN0aXZlJyBvciBpbnQobGVhc2UuZ2V0KCdleHBpcmVzX2F0JywgMCkpIDw9IGludCh0aW1lLnRpbWUoKSkgb3IgaW50KGxlYXNlLmdldCgndXNlcycsIDApKSA+PSBpbnQobGVhc2UuZ2V0KCdtYXhfdXNlcycsIDApKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbGVhc2VbJ3VzZXMnXSA9IGludChsZWFzZS5nZXQoJ3VzZXMnLCAwKSkgKyAxCiAgICAgICAgaWYgbGVhc2VbJ3VzZXMnXSA+PSBsZWFzZVsnbWF4X3VzZXMnXToKICAgICAgICAgICAgbGVhc2VbJ3N0YXR1cyddID0gJ2V4aGF1c3RlZCcKICAgICAgICBhdG9taWNfanNvbihzZWxmLl9wYXRoKGxlYXNlX2lkKSwgbGVhc2UpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmV2b2tlKHNlbGYsIGxlYXNlX2lkOiBzdHIpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIGxlYXNlID0gc2VsZi5nZXQobGVhc2VfaWQpCiAgICAgICAgbGVhc2VbJ3N0YXR1cyddID0gJ3Jldm9rZWQnCiAgICAgICAgbGVhc2VbJ3Jldm9rZWRfYXQnXSA9IGludCh0aW1lLnRpbWUoKSkKICAgICAgICBhdG9taWNfanNvbihzZWxmLl9wYXRoKGxlYXNlX2lkKSwgbGVhc2UpCiAgICAgICAgcmV0dXJuIGxlYXNlCgogICAgZGVmIGFjdGl2ZShzZWxmKSAtPiBsaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICAgICBub3cgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmRpcmVjdG9yeS5nbG9iKCcqLmpzb24nKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbGVhc2UgPSBqc29uLmxvYWRzKHBhdGgucmVhZF90ZXh0KCkpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBsZWFzZS5nZXQoJ3N0YXR1cycpID09ICdhY3RpdmUnIGFuZCBpbnQobGVhc2UuZ2V0KCdleHBpcmVzX2F0JywgMCkpID4gbm93IGFuZCBpbnQobGVhc2UuZ2V0KCd1c2VzJywgMCkpIDwgaW50KGxlYXNlLmdldCgnbWF4X3VzZXMnLCAwKSk6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxlYXNlKQogICAgICAgIHJldHVybiBzb3J0ZWQocmVzdWx0LCBrZXk9bGFtYmRhIHg6IHhbJ2V4cGlyZXNfYXQnXSkKCgpjbGFzcyBUb3RwTWFuYWdlcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0ZV9wYXRoOiBQYXRoLCAqLCBpc3N1ZXI6IHN0ciwgYWNjb3VudDogc3RyKToKICAgICAgICBzZWxmLnN0YXRlX3BhdGggPSBQYXRoKHN0YXRlX3BhdGgpCiAgICAgICAgc2VsZi5pc3N1ZXIgPSBpc3N1ZXIKICAgICAgICBzZWxmLmFjY291bnQgPSBhY2NvdW50CgogICAgZGVmIF9zdGF0ZShzZWxmKSAtPiBkaWN0W3N0ciwgQW55XToKICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnN0YXRlX3BhdGgucmVhZF90ZXh0KCkpIGlmIHNlbGYuc3RhdGVfcGF0aC5leGlzdHMoKSBlbHNlIHt9CgogICAgZGVmIGVucm9sbGVkKHNlbGYpIC0+IGJvb2w6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fc3RhdGUoKS5nZXQoJ2Vucm9sbGVkJykpCgogICAgZGVmIGJlZ2luX3NldHVwKHNlbGYpIC0+IGRpY3Rbc3RyLCBzdHJdOgogICAgICAgIHN0YXRlID0gc2VsZi5fc3RhdGUoKQogICAgICAgIGlmIHN0YXRlLmdldCgnZW5yb2xsZWQnKToKICAgICAgICAgICAgcmFpc2UgTGVhc2VFcnJvcigndG90cC1hbHJlYWR5LWVucm9sbGVkJykKICAgICAgICBzZWNyZXQgPSBzdGF0ZS5nZXQoJ3NlY3JldCcpIG9yIGJhc2U2NC5iMzJlbmNvZGUoc2VjcmV0cy50b2tlbl9ieXRlcygyMCkpLmRlY29kZSgpLnJzdHJpcCgnPScpCiAgICAgICAgc3RhdGUgPSB7J3NlY3JldCc6IHNlY3JldCwgJ2Vucm9sbGVkJzogRmFsc2UsICdsYXN0X2NvdW50ZXInOiAtMSwgJ2NyZWF0ZWRfYXQnOiBpbnQodGltZS50aW1lKCkpfQogICAgICAgIGF0b21pY19qc29uKHNlbGYuc3RhdGVfcGF0aCwgc3RhdGUpCiAgICAgICAgbGFiZWwgPSB1cmxsaWIucGFyc2UucXVvdGUoZid7c2VsZi5pc3N1ZXJ9OntzZWxmLmFjY291bnR9JykKICAgICAgICBxdWVyeSA9IHVybGxpYi5wYXJzZS51cmxlbmNvZGUoeydzZWNyZXQnOiBzZWNyZXQsICdpc3N1ZXInOiBzZWxmLmlzc3VlciwgJ2FsZ29yaXRobSc6ICdTSEExJywgJ2RpZ2l0cyc6IDYsICdwZXJpb2QnOiAzMH0pCiAgICAgICAgcmV0dXJuIHsndXJpJzogZidvdHBhdXRoOi8vdG90cC97bGFiZWx9P3txdWVyeX0nLCAnc2VjcmV0Jzogc2VjcmV0fQoKICAgIGRlZiBfc2VjcmV0KHNlbGYpIC0+IGJ5dGVzOgogICAgICAgIHNlY3JldCA9IHNlbGYuX3N0YXRlKCkuZ2V0KCdzZWNyZXQnKQogICAgICAgIGlmIG5vdCBzZWNyZXQ6CiAgICAgICAgICAgIHJhaXNlIExlYXNlRXJyb3IoJ3RvdHAtbm90LWNvbmZpZ3VyZWQnKQogICAgICAgIHJldHVybiBiYXNlNjQuYjMyZGVjb2RlKHNlY3JldCArICc9JyAqICgoOCAtIGxlbihzZWNyZXQpICUgOCkgJSA4KSkKCiAgICBkZWYgY29kZV9hdChzZWxmLCBub3c6IGludCB8IGZsb2F0IHwgTm9uZSA9IE5vbmUpIC0+IHN0cjoKICAgICAgICBjb3VudGVyID0gaW50KCh0aW1lLnRpbWUoKSBpZiBub3cgaXMgTm9uZSBlbHNlIG5vdykgLy8gMzApCiAgICAgICAgZGlnZXN0ID0gaG1hYy5uZXcoc2VsZi5fc2VjcmV0KCksIHN0cnVjdC5wYWNrKCc+UScsIGNvdW50ZXIpLCBoYXNobGliLnNoYTEpLmRpZ2VzdCgpCiAgICAgICAgb2Zmc2V0ID0gZGlnZXN0Wy0xXSAmIDB4MEYKICAgICAgICB2YWx1ZSA9IChzdHJ1Y3QudW5wYWNrKCc+SScsIGRpZ2VzdFtvZmZzZXQ6b2Zmc2V0ICsgNF0pWzBdICYgMHg3RkZGRkZGRikgJSAxXzAwMF8wMDAKICAgICAgICByZXR1cm4gZid7dmFsdWU6MDZkfScKCiAgICBkZWYgX21hdGNoX2NvdW50ZXIoc2VsZiwgY29kZTogc3RyLCBub3c6IGludCB8IGZsb2F0IHwgTm9uZSA9IE5vbmUpIC0+IGludCB8IE5vbmU6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29kZSwgc3RyKSBvciBsZW4oY29kZSkgIT0gNiBvciBub3QgY29kZS5pc2RpZ2l0KCk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY3VycmVudCA9IGludCgodGltZS50aW1lKCkgaWYgbm93IGlzIE5vbmUgZWxzZSBub3cpIC8vIDMwKQogICAgICAgIHNlY3JldCA9IHNlbGYuX3NlY3JldCgpCiAgICAgICAgZm9yIGNvdW50ZXIgaW4gKGN1cnJlbnQgLSAxLCBjdXJyZW50LCBjdXJyZW50ICsgMSk6CiAgICAgICAgICAgIGRpZ2VzdCA9IGhtYWMubmV3KHNlY3JldCwgc3RydWN0LnBhY2soJz5RJywgY291bnRlciksIGhhc2hsaWIuc2hhMSkuZGlnZXN0KCkKICAgICAgICAgICAgb2Zmc2V0ID0gZGlnZXN0Wy0xXSAmIDB4MEYKICAgICAgICAgICAgdmFsdWUgPSAoc3RydWN0LnVucGFjaygnPkknLCBkaWdlc3Rbb2Zmc2V0Om9mZnNldCArIDRdKVswXSAmIDB4N0ZGRkZGRkYpICUgMV8wMDBfMDAwCiAgICAgICAgICAgIGlmIGhtYWMuY29tcGFyZV9kaWdlc3QoZid7dmFsdWU6MDZkfScsIGNvZGUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXIKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBmaW5pc2hfc2V0dXAoc2VsZiwgY29kZTogc3RyLCAqLCBub3c6IGludCB8IGZsb2F0IHwgTm9uZSA9IE5vbmUpIC0+IGJvb2w6CiAgICAgICAgc3RhdGUgPSBzZWxmLl9zdGF0ZSgpCiAgICAgICAgY291bnRlciA9IHNlbGYuX21hdGNoX2NvdW50ZXIoY29kZSwgbm93KQogICAgICAgIGlmIGNvdW50ZXIgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc3RhdGVbJ2Vucm9sbGVkJ10gPSBUcnVlCiAgICAgICAgc3RhdGVbJ2xhc3RfY291bnRlciddID0gY291bnRlcgogICAgICAgIHN0YXRlWydlbnJvbGxlZF9hdCddID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIGF0b21pY19qc29uKHNlbGYuc3RhdGVfcGF0aCwgc3RhdGUpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgdmVyaWZ5KHNlbGYsIGNvZGU6IHN0ciwgKiwgbm93OiBpbnQgfCBmbG9hdCB8IE5vbmUgPSBOb25lKSAtPiBib29sOgogICAgICAgIHN0YXRlID0gc2VsZi5fc3RhdGUoKQogICAgICAgIGlmIG5vdCBzdGF0ZS5nZXQoJ2Vucm9sbGVkJyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGNvdW50ZXIgPSBzZWxmLl9tYXRjaF9jb3VudGVyKGNvZGUsIG5vdykKICAgICAgICBpZiBjb3VudGVyIGlzIE5vbmUgb3IgY291bnRlciA8PSBpbnQoc3RhdGUuZ2V0KCdsYXN0X2NvdW50ZXInLCAtMSkpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ZVsnbGFzdF9jb3VudGVyJ10gPSBjb3VudGVyCiAgICAgICAgc3RhdGVbJ2xhc3RfdXNlZF9hdCddID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIGF0b21pY19qc29uKHNlbGYuc3RhdGVfcGF0aCwgc3RhdGUpCiAgICAgICAgcmV0dXJuIFRydWUK B64_lease_manager_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/approval_portal.py' <<'B64_approval_portal_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJQcml2YXRlIFRhaWxzY2FsZS1vbmx5IFdlYkF1dGhuL1RPVFAgYXBwcm92YWwgcG9ydGFsIHdpdGggc2NvcGVkIGxlYXNlcy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGpzb24KaW1wb3J0IHNvY2tldApmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBDYWxsYWJsZQoKZnJvbSBmYXN0YXBpIGltcG9ydCBEZXBlbmRzLCBGYXN0QVBJLCBIZWFkZXIsIEhUVFBFeGNlcHRpb24KZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgSFRNTFJlc3BvbnNlCmZyb20gcHlkYW50aWMgaW1wb3J0IEJhc2VNb2RlbAoKU09DS0VUID0gIi9ydW4vaGltbWEtcHJpdmlsZWdlLWdhdGUvZ2F0ZS5zb2NrIgoKCmRlZiBicm9rZXJfY2FsbChtZXNzYWdlOiBkaWN0W3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06CiAgICBwYXlsb2FkID0ganNvbi5kdW1wcyhtZXNzYWdlLCBzZXBhcmF0b3JzPSgiLCIsICI6IikpLmVuY29kZSgpICsgYiJcbiIKICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKSBhcyBjbGllbnQ6CiAgICAgICAgY2xpZW50LmNvbm5lY3QoU09DS0VUKTsgY2xpZW50LnNlbmRhbGwocGF5bG9hZCk7IGRhdGEgPSBiIiIKICAgICAgICB3aGlsZSBub3QgZGF0YS5lbmRzd2l0aChiIlxuIik6CiAgICAgICAgICAgIGNodW5rID0gY2xpZW50LnJlY3YoNjU1MzYpCiAgICAgICAgICAgIGlmIG5vdCBjaHVuazogYnJlYWsKICAgICAgICAgICAgZGF0YSArPSBjaHVuawogICAgcmV0dXJuIGpzb24ubG9hZHMoZGF0YSkKCgpjbGFzcyBDcmVkZW50aWFsQm9keShCYXNlTW9kZWwpOiBjcmVkZW50aWFsOiBkaWN0W3N0ciwgQW55XQpjbGFzcyBBcHByb3ZhbEJvZHkoQmFzZU1vZGVsKToKICAgIHJlcXVlc3RfaWQ6IHN0cgogICAgY3JlZGVudGlhbDogZGljdFtzdHIsIEFueV0gfCBOb25lID0gTm9uZQogICAgdG90cF9jb2RlOiBzdHIgfCBOb25lID0gTm9uZQpjbGFzcyBMZWFzZUJvZHkoQmFzZU1vZGVsKToKICAgIGFnZW50OiBzdHIKICAgIGR1cmF0aW9uX3NlY29uZHM6IGludApjbGFzcyBSZXZva2VCb2R5KEJhc2VNb2RlbCk6IGxlYXNlX2lkOiBzdHIKY2xhc3MgVG90cEJvZHkoQmFzZU1vZGVsKTogY29kZTogc3RyCgoKUEFHRSA9IHInJyc8IWRvY3R5cGUgaHRtbD48aHRtbCBsYW5nPSJlbiI+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+SGltbWEg4oCUIFByb3RlY3RlZCBBcHByb3ZhbDwvdGl0bGU+PHN0eWxlPgo6cm9vdHtjb2xvci1zY2hlbWU6ZGFyazstLWJnOiMxMTE3MTk7LS1wYW5lbDojMTgyMTI0Oy0tbGluZTojMzM0MjQ3Oy0tdGV4dDojZThlM2Q3Oy0tbXV0ZWQ6IzkxYTBhMjstLWdvbGQ6I2MyYTc2OTstLWRhbmdlcjojZDM4YjgyfSp7Ym94LXNpemluZzpib3JkZXItYm94fWJvZHl7bWFyZ2luOjA7YmFja2dyb3VuZDp2YXIoLS1iZyk7Y29sb3I6dmFyKC0tdGV4dCk7Zm9udDoxNnB4LzEuNSB1aS1zYW5zLXNlcmlmLHN5c3RlbS11aTttaW4taGVpZ2h0OjEwMHZofW1haW57bWF4LXdpZHRoOjgwMHB4O21hcmdpbjphdXRvO3BhZGRpbmc6NDJweCAyMHB4fWgxLGgye2ZvbnQ6NTAwIDMwcHgvMS4yIEdlb3JnaWEsc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjAyZW07bWFyZ2luOjAgMCA4cHh9aDJ7Zm9udC1zaXplOjIxcHg7bWFyZ2luLXRvcDozMHB4fS5sZWFkLC5tZXRhe2NvbG9yOnZhcigtLW11dGVkKX0uY2FyZHtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6MTRweDtwYWRkaW5nOjE4cHg7bWFyZ2luOjEycHggMH0ucm93e2Rpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXJ9YnV0dG9uLHNlbGVjdCxpbnB1dHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWdvbGQpO2JhY2tncm91bmQ6IzExMTcxOTtjb2xvcjp2YXIoLS10ZXh0KTtwYWRkaW5nOjEwcHggMTNweDtib3JkZXItcmFkaXVzOjlweH1idXR0b257Zm9udC13ZWlnaHQ6NjUwO2N1cnNvcjpwb2ludGVyfWJ1dHRvbi5kYW5nZXJ7Ym9yZGVyLWNvbG9yOnZhcigtLWRhbmdlcil9cHJle3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstd29yZDtjb2xvcjojYzdkMWNmO2JhY2tncm91bmQ6IzEwMTUxNztwYWRkaW5nOjEycHg7Ym9yZGVyLXJhZGl1czo5cHg7Zm9udC1zaXplOjEzcHh9I3N0YXR1c3ttaW4taGVpZ2h0OjI0cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbjoxNnB4IDB9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmNvZGV7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2xldHRlci1zcGFjaW5nOi4wNWVtfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxtYWluPgo8aDE+UHJvdGVjdGVkIEFwcHJvdmFsPC9oMT48cCBjbGFzcz0ibGVhZCI+RXhhY3QgYXV0aG9yaXR5LCBib3VuZGVkIGJ5IGFjdGlvbiwgYWdlbnQsIHRpbWUsIGFuZCB1c2UgY291bnQuPC9wPjxkaXYgaWQ9InN0YXR1cyI+PC9kaXY+CjxoMj5EZWVwIFdvcmsgV2luZG93PC9oMj48ZGl2IGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJyb3ciPjxzZWxlY3QgaWQ9ImFnZW50Ij48b3B0aW9uIHZhbHVlPSJoZXJtZXMiPkhlcm1lczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im9wZW5jbGF3Ij5PcGVuQ2xhdzwvb3B0aW9uPjwvc2VsZWN0PjxzZWxlY3QgaWQ9ImR1cmF0aW9uIj48b3B0aW9uIHZhbHVlPSIwIj5BbHdheXMgcmVxdWVzdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjMwMCI+NSBtaW51dGVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iOTAwIiBzZWxlY3RlZD4xNSBtaW51dGVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMTgwMCI+MzAgbWludXRlczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjM2MDAiPjEgaG91ciDCtyBwYXNza2V5ICsgY29kZTwvb3B0aW9uPjwvc2VsZWN0PjxidXR0b24gaWQ9ImNyZWF0ZUxlYXNlIj5BcHBseTwvYnV0dG9uPjwvZGl2PjxwIGNsYXNzPSJtZXRhIj5XaW5kb3dzIGFsbG93IG9ubHkgc2VydmljZSByZXN0YXJ0cywgcHJvdGVjdGVkIGJhY2t1cHMsIGFuZCB2YWxpZGF0ZWQgTmdpbnggcmVsb2Fkcy4gRGVsZXRpb24sIFNTSCwgZmlyZXdhbGwsIHVzZXJzLCBjcmVkZW50aWFscywgYW5kIHNlY3VyaXR5IGNoYW5nZXMgYWx3YXlzIHJlcXVlc3QgZnJlc2ggYXBwcm92YWwuPC9wPjwvZGl2Pgo8c2VjdGlvbiBpZD0ibGVhc2VzIj48L3NlY3Rpb24+CjxoMj5BcHBsZSBQYXNzd29yZHMgVmVyaWZpY2F0aW9uIENvZGU8L2gyPjxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9InJvdyI+PGJ1dHRvbiBpZD0idG90cEJlZ2luIj5TZXQgdXAgY29kZTwvYnV0dG9uPjxhIGlkPSJ0b3RwTGluayIgY2xhc3M9ImhpZGRlbiI+PGJ1dHRvbj5PcGVuIGluIEFwcGxlIFBhc3N3b3JkczwvYnV0dG9uPjwvYT48aW5wdXQgaWQ9InRvdHBDb2RlIiBpbnB1dG1vZGU9Im51bWVyaWMiIG1heGxlbmd0aD0iNiIgcGxhY2Vob2xkZXI9IjYtZGlnaXQgY29kZSI+PGJ1dHRvbiBpZD0idG90cEZpbmlzaCI+VmVyaWZ5PC9idXR0b24+PC9kaXY+PGRpdiBpZD0idG90cFNlY3JldCIgY2xhc3M9Im1ldGEgY29kZSI+PC9kaXY+PC9kaXY+CjxoMj5QZW5kaW5nIGV4YWN0IHJlcXVlc3RzPC9oMj48cCBjbGFzcz0ibWV0YSI+RWFjaCByZXF1ZXN0IGFsc28gc2VuZHMgYSBwdXNoIG5vdGlmaWNhdGlvbiB0byB0aGUgb3duZXIncyBUZWxlZ3JhbSBhbmQgRGlzY29yZCwgd2hlcmV2ZXIgdGhleSBhcmUuPC9wPjxzZWN0aW9uIGlkPSJyZXF1ZXN0cyI+PC9zZWN0aW9uPgo8c2NyaXB0Pgpjb25zdCBiNjRidWY9cz0+e3M9cy5yZXBsYWNlKC8tL2csJysnKS5yZXBsYWNlKC9fL2csJy8nKTt3aGlsZShzLmxlbmd0aCU0KXMrPSc9JztyZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IocyksYz0+Yy5jaGFyQ29kZUF0KDApKS5idWZmZXJ9LGJ1ZjY0PWI9PmJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5uZXcgVWludDhBcnJheShiKSkpLnJlcGxhY2UoL1wrL2csJy0nKS5yZXBsYWNlKC9cLy9nLCdfJykucmVwbGFjZSgvPSskLywnJyk7CmNvbnN0IGNyZWQ9Yz0+KHtpZDpjLmlkLHJhd0lkOmJ1ZjY0KGMucmF3SWQpLHR5cGU6Yy50eXBlLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OmMuYXV0aGVudGljYXRvckF0dGFjaG1lbnQsY2xpZW50RXh0ZW5zaW9uUmVzdWx0czpjLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKSxyZXNwb25zZTp7Y2xpZW50RGF0YUpTT046YnVmNjQoYy5yZXNwb25zZS5jbGllbnREYXRhSlNPTiksYXR0ZXN0YXRpb25PYmplY3Q6Yy5yZXNwb25zZS5hdHRlc3RhdGlvbk9iamVjdD9idWY2NChjLnJlc3BvbnNlLmF0dGVzdGF0aW9uT2JqZWN0KTp1bmRlZmluZWQsYXV0aGVudGljYXRvckRhdGE6Yy5yZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YT9idWY2NChjLnJlc3BvbnNlLmF1dGhlbnRpY2F0b3JEYXRhKTp1bmRlZmluZWQsc2lnbmF0dXJlOmMucmVzcG9uc2Uuc2lnbmF0dXJlP2J1ZjY0KGMucmVzcG9uc2Uuc2lnbmF0dXJlKTp1bmRlZmluZWQsdXNlckhhbmRsZTpjLnJlc3BvbnNlLnVzZXJIYW5kbGU/YnVmNjQoYy5yZXNwb25zZS51c2VySGFuZGxlKTpudWxsLHRyYW5zcG9ydHM6Yy5yZXNwb25zZS5nZXRUcmFuc3BvcnRzP2MucmVzcG9uc2UuZ2V0VHJhbnNwb3J0cygpOnVuZGVmaW5lZH19KTsKY29uc3QgcHJlcENyZWF0ZT1vPT57by5jaGFsbGVuZ2U9YjY0YnVmKG8uY2hhbGxlbmdlKTtvLnVzZXIuaWQ9YjY0YnVmKG8udXNlci5pZCk7KG8uZXhjbHVkZUNyZWRlbnRpYWxzfHxbXSkuZm9yRWFjaCh4PT54LmlkPWI2NGJ1Zih4LmlkKSk7cmV0dXJuIG99LHByZXBHZXQ9bz0+e28uY2hhbGxlbmdlPWI2NGJ1ZihvLmNoYWxsZW5nZSk7KG8uYWxsb3dDcmVkZW50aWFsc3x8W10pLmZvckVhY2goeD0+eC5pZD1iNjRidWYoeC5pZCkpO2RlbGV0ZSBvLnJlcXVlc3RfaWQ7cmV0dXJuIG99Owphc3luYyBmdW5jdGlvbiBhcGkocGF0aCxib2R5KXtsZXQgcj1hd2FpdCBmZXRjaChwYXRoLHttZXRob2Q6Ym9keT8nUE9TVCc6J0dFVCcsaGVhZGVyczpib2R5P3snY29udGVudC10eXBlJzonYXBwbGljYXRpb24vanNvbid9Ont9LGJvZHk6Ym9keT9KU09OLnN0cmluZ2lmeShib2R5KTp1bmRlZmluZWR9KTtsZXQgaj1hd2FpdCByLmpzb24oKTtpZighci5vayl0aHJvdyBFcnJvcihqLmRldGFpbHx8J1JlcXVlc3QgZmFpbGVkJyk7cmV0dXJuIGp9ZnVuY3Rpb24gc3RhdHVzKHgsYj1mYWxzZSl7bGV0IGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXR1cycpO2UudGV4dENvbnRlbnQ9eDtlLnN0eWxlLmNvbG9yPWI/J3ZhcigtLWRhbmdlciknOid2YXIoLS1tdXRlZCknfQphc3luYyBmdW5jdGlvbiBsb2FkKCl7dHJ5e2xldCBkPWF3YWl0IGFwaSgnL2FwaS9wZW5kaW5nJykscm9vdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVxdWVzdHMnKTtyb290LmlubmVySFRNTD0nJztpZighZC5yZXF1ZXN0cy5sZW5ndGgpcm9vdC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImNhcmQgbWV0YSI+Tm8gcmVxdWVzdHMgd2FpdGluZy48L2Rpdj4nO2ZvcihsZXQgciBvZiBkLnJlcXVlc3RzKXtsZXQgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhcnRpY2xlJyk7ZS5jbGFzc05hbWU9J2NhcmQnO2UuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJtZXRhIj48L2Rpdj48c3Ryb25nPjwvc3Ryb25nPjxwcmU+PC9wcmU+PGRpdiBjbGFzcz0icm93Ij48aW5wdXQgbWF4bGVuZ3RoPSI2IiBpbnB1dG1vZGU9Im51bWVyaWMiIHBsYWNlaG9sZGVyPSJDb2RlIGlmIHJlcXVpcmVkIj48YnV0dG9uIGNsYXNzPSJkYW5nZXIiPkFwcHJvdmUgd2l0aCBwYXNza2V5PC9idXR0b24+PC9kaXY+JztlLnF1ZXJ5U2VsZWN0b3IoJy5tZXRhJykudGV4dENvbnRlbnQ9YFRpZXIgJHtyLnRpZXJ9IMK3IGV4cGlyZXMgJHtuZXcgRGF0ZShyLmV4cGlyZXNfYXQqMTAwMCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDtlLnF1ZXJ5U2VsZWN0b3IoJ3N0cm9uZycpLnRleHRDb250ZW50PXIuYWN0aW9uO2UucXVlcnlTZWxlY3RvcigncHJlJykudGV4dENvbnRlbnQ9SlNPTi5zdHJpbmdpZnkoci5wYXJhbXMsbnVsbCwyKTtlLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLm9uY2xpY2s9KCk9PmFwcHJvdmUoci5pZCxlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWUpO3Jvb3QuYXBwZW5kQ2hpbGQoZSl9YXdhaXQgbG9hZExlYXNlcygpfWNhdGNoKGUpe3N0YXR1cyhlLm1lc3NhZ2UsdHJ1ZSl9fQphc3luYyBmdW5jdGlvbiBhcHByb3ZlKGlkLGNvZGUpe3RyeXtzdGF0dXMoJ1dhaXRpbmcgZm9yIHBhc3NrZXnigKYnKTtsZXQgbz1hd2FpdCBhcGkoJy9hcGkvYXBwcm92ZS9vcHRpb25zJyx7cmVxdWVzdF9pZDppZH0pLGM9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCh7cHVibGljS2V5OnByZXBHZXQobyl9KTthd2FpdCBhcGkoJy9hcGkvYXBwcm92ZS92ZXJpZnknLHtyZXF1ZXN0X2lkOmlkLGNyZWRlbnRpYWw6Y3JlZChjKSx0b3RwX2NvZGU6Y29kZXx8bnVsbH0pO3N0YXR1cygnQXBwcm92ZWQgZXhhY3RseSBvbmNlLicpO2F3YWl0IGxvYWQoKX1jYXRjaChlKXtzdGF0dXMoZS5tZXNzYWdlLHRydWUpfX0KYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGVhc2UoKXt0cnl7bGV0IGR1cmF0aW9uPU51bWJlcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZHVyYXRpb24nKS52YWx1ZSksYWdlbnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FnZW50JykudmFsdWU7aWYoZHVyYXRpb249PT0wKXtsZXQgZD1hd2FpdCBhcGkoJy9hcGkvbGVhc2VzJyk7Zm9yKGxldCBsIG9mIGQubGVhc2VzKWlmKGwuYWdlbnQ9PT1hZ2VudClhd2FpdCBhcGkoJy9hcGkvbGVhc2UvcmV2b2tlJyx7bGVhc2VfaWQ6bC5pZH0pO3N0YXR1cygnQWx3YXlzIHJlcXVlc3QgcmVzdG9yZWQuJyk7cmV0dXJuIGxvYWQoKX1hd2FpdCBhcGkoJy9hcGkvbGVhc2UvcmVxdWVzdCcse2FnZW50LGR1cmF0aW9uX3NlY29uZHM6ZHVyYXRpb259KTtzdGF0dXMoJ0xlYXNlIHJlcXVlc3QgY3JlYXRlZC4gQXBwcm92ZSBpdCBiZWxvdy4nKTthd2FpdCBsb2FkKCl9Y2F0Y2goZSl7c3RhdHVzKGUubWVzc2FnZSx0cnVlKX19CmFzeW5jIGZ1bmN0aW9uIGxvYWRMZWFzZXMoKXtsZXQgZD1hd2FpdCBhcGkoJy9hcGkvbGVhc2VzJykscm9vdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGVhc2VzJyk7cm9vdC5pbm5lckhUTUw9Jyc7Zm9yKGxldCBsIG9mIGQubGVhc2VzKXtsZXQgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtlLmNsYXNzTmFtZT0nY2FyZCc7ZS5pbm5lckhUTUw9JzxzcGFuPjwvc3Bhbj4gPGJ1dHRvbiBjbGFzcz0iZGFuZ2VyIj5FbmQgbm93PC9idXR0b24+JztlLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKS50ZXh0Q29udGVudD1gJHtsLmFnZW50fSDCtyBleHBpcmVzICR7bmV3IERhdGUobC5leHBpcmVzX2F0KjEwMDApLnRvTG9jYWxlVGltZVN0cmluZygpfSDCtyAke2wudXNlc30vJHtsLm1heF91c2VzfSB1c2VzYDtlLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLm9uY2xpY2s9YXN5bmMoKT0+e2F3YWl0IGFwaSgnL2FwaS9sZWFzZS9yZXZva2UnLHtsZWFzZV9pZDpsLmlkfSk7YXdhaXQgbG9hZCgpfTtyb290LmFwcGVuZENoaWxkKGUpfX0KYXN5bmMgZnVuY3Rpb24gdG90cEJlZ2luKCl7dHJ5e2xldCBkPWF3YWl0IGFwaSgnL2FwaS90b3RwL3NldHVwJyx7fSksYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG90cExpbmsnKTthLmhyZWY9ZC51cmk7YS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG90cFNlY3JldCcpLnRleHRDb250ZW50PSdTZXR1cCBrZXk6ICcrZC5zZWNyZXQ7c3RhdHVzKCdBZGQgdGhlIGNvZGUgdG8gQXBwbGUgUGFzc3dvcmRzLCB0aGVuIGVudGVyIHRoZSBjdXJyZW50IHNpeCBkaWdpdHMuJyl9Y2F0Y2goZSl7c3RhdHVzKGUubWVzc2FnZSx0cnVlKX19YXN5bmMgZnVuY3Rpb24gdG90cEZpbmlzaCgpe3RyeXthd2FpdCBhcGkoJy9hcGkvdG90cC92ZXJpZnknLHtjb2RlOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b3RwQ29kZScpLnZhbHVlfSk7c3RhdHVzKCdBcHBsZSBQYXNzd29yZHMgdmVyaWZpY2F0aW9uIGNvZGUgZW5yb2xsZWQuJyl9Y2F0Y2goZSl7c3RhdHVzKGUubWVzc2FnZSx0cnVlKX19CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjcmVhdGVMZWFzZScpLm9uY2xpY2s9Y3JlYXRlTGVhc2U7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvdHBCZWdpbicpLm9uY2xpY2s9dG90cEJlZ2luO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b3RwRmluaXNoJykub25jbGljaz10b3RwRmluaXNoO2xvYWQoKTsKPC9zY3JpcHQ+PC9tYWluPjwvYm9keT48L2h0bWw+JycnCgoKZGVmIGNyZWF0ZV9hcHAoKiwgb3duZXJfbG9naW46IHN0ciwgZ2F0ZV9jYWxsOiBDYWxsYWJsZVtbZGljdFtzdHIsIEFueV1dLCBkaWN0W3N0ciwgQW55XV0gPSBicm9rZXJfY2FsbCwgYWdlbnRzOiBkaWN0W3N0ciwgaW50XSB8IE5vbmUgPSBOb25lLCBsZWFzZV9zZXJ2aWNlczogZGljdFtzdHIsIGxpc3Rbc3RyXV0gfCBOb25lID0gTm9uZSkgLT4gRmFzdEFQSToKICAgIGFnZW50cyA9IGFnZW50cyBvciB7J2hlcm1lcyc6IDEwMDAsICdvcGVuY2xhdyc6IDEwMDF9CiAgICBsZWFzZV9zZXJ2aWNlcyA9IGxlYXNlX3NlcnZpY2VzIG9yIHsnaGVybWVzJzogWydoZXJtZXMtZ2F0ZXdheS5zZXJ2aWNlJywgJ2hlcm1lcy1nYXRld2F5LWhpbW1hLnNlcnZpY2UnXSwgJ29wZW5jbGF3JzogWydvcGVuY2xhdy1nYXRld2F5LnNlcnZpY2UnLCAnb3BlbmNsYXctbm9kZS5zZXJ2aWNlJ119CiAgICBhcHA9RmFzdEFQSShkb2NzX3VybD1Ob25lLHJlZG9jX3VybD1Ob25lLG9wZW5hcGlfdXJsPU5vbmUpCiAgICBkZWYgb3duZXIodGFpbHNjYWxlX3VzZXJfbG9naW46IHN0cnxOb25lPUhlYWRlcihkZWZhdWx0PU5vbmUpKToKICAgICAgICBpZiBub3QgdGFpbHNjYWxlX3VzZXJfbG9naW4gb3IgdGFpbHNjYWxlX3VzZXJfbG9naW4uY2FzZWZvbGQoKSE9b3duZXJfbG9naW4uY2FzZWZvbGQoKTogcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDMsJ293bmVyIGlkZW50aXR5IHJlcXVpcmVkJykKICAgIGRlZiByZWxheShtKToKICAgICAgICByPWdhdGVfY2FsbChtKQogICAgICAgIGlmIG5vdCByLmdldCgnb2snKTogcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsci5nZXQoJ2Vycm9yJywnYnJva2VyIHJlamVjdGVkIHJlcXVlc3QnKSkKICAgICAgICByZXR1cm4gci5nZXQoJ3Jlc3VsdCcpCiAgICBAYXBwLmdldCgnL2hlYWx0aCcpCiAgICBkZWYgaGVhbHRoKCk6IHJldHVybiB7J29rJzpUcnVlfQogICAgQGFwcC5nZXQoJy8nLHJlc3BvbnNlX2NsYXNzPUhUTUxSZXNwb25zZSkKICAgIGRlZiBwYWdlKF89RGVwZW5kcyhvd25lcikpOiByZXR1cm4gUEFHRQogICAgQGFwcC5nZXQoJy9hcGkvcGVuZGluZycpCiAgICBkZWYgcGVuZGluZyhfPURlcGVuZHMob3duZXIpKTogcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzonbGlzdF9wZW5kaW5nX3N0cm9uZyd9KQogICAgQGFwcC5wb3N0KCcvYXBpL3JlZ2lzdGVyL29wdGlvbnMnKQogICAgZGVmIHJlZ29wdChfPURlcGVuZHMob3duZXIpKTogcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzoncmVnaXN0cmF0aW9uX2JlZ2luJ30pCiAgICBAYXBwLnBvc3QoJy9hcGkvcmVnaXN0ZXIvdmVyaWZ5JykKICAgIGRlZiByZWd2ZXJpZnkoYm9keTpDcmVkZW50aWFsQm9keSxfPURlcGVuZHMob3duZXIpKTogcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzoncmVnaXN0cmF0aW9uX2ZpbmlzaCcsJ2NyZWRlbnRpYWwnOmJvZHkuY3JlZGVudGlhbH0pCiAgICBAYXBwLnBvc3QoJy9hcGkvYXBwcm92ZS9vcHRpb25zJykKICAgIGRlZiBhdXRob3B0KGJvZHk6QXBwcm92YWxCb2R5LF89RGVwZW5kcyhvd25lcikpOiByZXR1cm4gcmVsYXkoeydvcGVyYXRpb24nOidzdHJvbmdfYmVnaW4nLCdyZXF1ZXN0X2lkJzpib2R5LnJlcXVlc3RfaWR9KQogICAgQGFwcC5wb3N0KCcvYXBpL2FwcHJvdmUvdmVyaWZ5JykKICAgIGRlZiBhdXRodmVyaWZ5KGJvZHk6QXBwcm92YWxCb2R5LF89RGVwZW5kcyhvd25lcikpOgogICAgICAgIGlmIGJvZHkuY3JlZGVudGlhbCBpcyBOb25lOiByYWlzZSBIVFRQRXhjZXB0aW9uKDQyMiwnY3JlZGVudGlhbCByZXF1aXJlZCcpCiAgICAgICAgcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzonYXBwcm92ZScsJ3JlcXVlc3RfaWQnOmJvZHkucmVxdWVzdF9pZCwnc3Ryb25nX2Fzc2VydGlvbic6eyd0eXBlJzond2ViYXV0aG4nLCdjcmVkZW50aWFsJzpib2R5LmNyZWRlbnRpYWwsJ3RvdHBfY29kZSc6Ym9keS50b3RwX2NvZGV9fSkKICAgIEBhcHAucG9zdCgnL2FwaS9sZWFzZS9yZXF1ZXN0JykKICAgIGRlZiBsZWFzZV9yZXF1ZXN0KGJvZHk6TGVhc2VCb2R5LF89RGVwZW5kcyhvd25lcikpOgogICAgICAgIGlmIGJvZHkuYWdlbnQgbm90IGluIGFnZW50cyBvciBib2R5LmR1cmF0aW9uX3NlY29uZHMgbm90IGluICgzMDAsOTAwLDE4MDAsMzYwMCk6IHJhaXNlIEhUVFBFeGNlcHRpb24oNDIyLCdpbnZhbGlkIGxlYXNlIHNlbGVjdGlvbicpCiAgICAgICAgc2NvcGVzPVt7J2FjdGlvbic6J3NlcnZpY2UucmVzdGFydCcsJ3RhcmdldHMnOmxlYXNlX3NlcnZpY2VzW2JvZHkuYWdlbnRdfSx7J2FjdGlvbic6J2JhY2t1cC5ydW4nfSx7J2FjdGlvbic6J25naW54LnJlbG9hZCd9XQogICAgICAgIG1heF91c2VzPXszMDA6MjAsOTAwOjUwLDE4MDA6MTAwLDM2MDA6MjAwfVtib2R5LmR1cmF0aW9uX3NlY29uZHNdCiAgICAgICAgcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzonbGVhc2VfcmVxdWVzdCcsJ2FnZW50X3VpZCc6YWdlbnRzW2JvZHkuYWdlbnRdLCdwYXJhbXMnOnsnZHVyYXRpb25fc2Vjb25kcyc6Ym9keS5kdXJhdGlvbl9zZWNvbmRzLCdtYXhfdXNlcyc6bWF4X3VzZXMsJ3Njb3Blcyc6c2NvcGVzLCdyZXF1aXJlX3RvdHAnOmJvZHkuZHVyYXRpb25fc2Vjb25kcz09MzYwMH19KQogICAgQGFwcC5nZXQoJy9hcGkvbGVhc2VzJykKICAgIGRlZiBsZWFzZXMoXz1EZXBlbmRzKG93bmVyKSk6CiAgICAgICAgcmVzdWx0PXJlbGF5KHsnb3BlcmF0aW9uJzonbGVhc2VfbGlzdCd9KTsgcmV2ZXJzZT17djprIGZvciBrLHYgaW4gYWdlbnRzLml0ZW1zKCl9CiAgICAgICAgZm9yIGxlYXNlIGluIHJlc3VsdC5nZXQoJ2xlYXNlcycsW10pOiBsZWFzZVsnYWdlbnQnXT1yZXZlcnNlLmdldChsZWFzZS5nZXQoJ3JlcXVlc3Rlcl91aWQnKSwndW5rbm93bicpCiAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgQGFwcC5wb3N0KCcvYXBpL2xlYXNlL3Jldm9rZScpCiAgICBkZWYgcmV2b2tlKGJvZHk6UmV2b2tlQm9keSxfPURlcGVuZHMob3duZXIpKTogcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzonbGVhc2VfcmV2b2tlJywnbGVhc2VfaWQnOmJvZHkubGVhc2VfaWR9KQogICAgQGFwcC5wb3N0KCcvYXBpL3RvdHAvc2V0dXAnKQogICAgZGVmIHRvdHBfc2V0dXAoXz1EZXBlbmRzKG93bmVyKSk6IHJldHVybiByZWxheSh7J29wZXJhdGlvbic6J3RvdHBfc2V0dXBfYmVnaW4nfSkKICAgIEBhcHAucG9zdCgnL2FwaS90b3RwL3ZlcmlmeScpCiAgICBkZWYgdG90cF92ZXJpZnkoYm9keTpUb3RwQm9keSxfPURlcGVuZHMob3duZXIpKTogcmV0dXJuIHJlbGF5KHsnb3BlcmF0aW9uJzondG90cF9zZXR1cF9maW5pc2gnLCdjb2RlJzpib2R5LmNvZGV9KQogICAgcmV0dXJuIGFwcAoKCmRlZiBsb2FkX2FwcCgpIC0+IEZhc3RBUEk6CiAgICBjb25maWc9anNvbi5sb2FkcyhvcGVuKCcvZXRjL2hpbW1hLXByaXZpbGVnZS1nYXRlL3BvcnRhbC5qc29uJyxlbmNvZGluZz0ndXRmLTgnKS5yZWFkKCkpCiAgICByZXR1cm4gY3JlYXRlX2FwcChvd25lcl9sb2dpbj1jb25maWdbJ293bmVyX2xvZ2luJ10sYWdlbnRzPXtrOmludCh2KSBmb3Igayx2IGluIGNvbmZpZy5nZXQoJ2FnZW50cycse30pLml0ZW1zKCl9LGxlYXNlX3NlcnZpY2VzPWNvbmZpZy5nZXQoJ2xlYXNlX3NlcnZpY2VzJykpCg== B64_approval_portal_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/request_notifier.py' <<'B64_request_notifier_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJPdXQtb2YtYmFuZCBwdXNoIG5vdGlmaWVyIGZvciBwcml2aWxlZ2VkLWJyb2tlciByZXF1ZXN0cy4KClNlbmRzIGEgcGxhaW4tbGFuZ3VhZ2Ugc3VtbWFyeSB0byB0aGUgb3duZXIgd2hlbmV2ZXIgYW4gYWdlbnQgcmFpc2VzIGEKcHJpdmlsZWdlZCByZXF1ZXN0LCBzbyB0aGUgb3duZXIgaXMgcHJvbXB0ZWQgd2hlcmV2ZXIgdGhleSBhcmUuCgpEZWxpdmVyeSBpcyBiZXN0LWVmZm9ydCBhbmQgbmV2ZXIgYmxvY2tzIHJlcXVlc3QgY3JlYXRpb24uIFR3byBwYXRoczoKICAxLiBgaGVybWVzIG1lc3NhZ2VgIENMSSwgaWYgcHJlc2VudCBvbiB0aGUgaG9zdCAoVlBTIEhlcm1lcyBnYXRld2F5KS4KICAyLiBBIHdlYmhvb2sgKFRlbGVncmFtIEJvdCBBUEkgb3IgRGlzY29yZCkgY29uZmlndXJlZCBpbiBub3RpZnkuanNvbgogICAgIHVuZGVyIGB3ZWJob29rX3VybGAgKG9yIGB0ZWxlZ3JhbV9ib3RfdG9rZW5gK2B0ZWxlZ3JhbV9jaGF0X2lkYCkuCgpUaGUgcG9ydGFsIHJlbWFpbnMgdGhlIGF1dGhvcml0YXRpdmUgYXBwcm92YWwgc3VyZmFjZTsgdGhpcyBpcyB0aGUgbnVkZ2UuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQganNvbgppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgdXJsbGliLnJlcXVlc3QKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpTVEFURSA9IFBhdGgoIi92YXIvbGliL2hpbW1hLXByaXZpbGVnZS1nYXRlIikKQ09ORklHID0gU1RBVEUgLyAibm90aWZ5Lmpzb24iCgoKZGVmIF9sb2FkX2NvbmZpZygpIC0+IGRpY3Q6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoQ09ORklHLnJlYWRfdGV4dCgpKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4ge30KCgpkZWYgX2h1bWFuX2xpbmUocmVxdWVzdDogZGljdCkgLT4gc3RyOgogICAgdGllciA9IHJlcXVlc3QuZ2V0KCJ0aWVyIiwgIj8iKQogICAgYWN0aW9uID0gcmVxdWVzdC5nZXQoImFjdGlvbiIsICJ1bmtub3duIikKICAgIHBhcmFtcyA9IHJlcXVlc3QuZ2V0KCJwYXJhbXMiLCB7fSkgb3Ige30KICAgIHNjb3BlID0gIiIKICAgIGlmIGFjdGlvbiA9PSAic2VydmljZS5yZXN0YXJ0IjoKICAgICAgICBzY29wZSA9IGYiIOKGkiB7cGFyYW1zLmdldCgnc2VydmljZScsICc/Jyl9IgogICAgZWxpZiBhY3Rpb24gPT0gImxlYXNlLmNyZWF0ZSI6CiAgICAgICAgZHVyID0gcGFyYW1zLmdldCgiZHVyYXRpb25fc2Vjb25kcyIsIDApCiAgICAgICAgc2NvcGUgPSBmIiDihpIgZGVlcC13b3JrIHdpbmRvdyB7ZHVyfXMiCiAgICBlbGlmIGFjdGlvbiA9PSAiZGF0YS5xdWFyYW50aW5lIjoKICAgICAgICBzY29wZSA9ICIg4oaSIERFTEVUSU9OL1FVQVJBTlRJTkUiCiAgICBlbGlmIGFjdGlvbiA9PSAic3NoLmFwcGx5IjoKICAgICAgICBzY29wZSA9ICIg4oaSIFNTSCBjaGFuZ2UiCiAgICBlbGlmIGFjdGlvbiA9PSAiZmlyZXdhbGwuYXBwbHkiOgogICAgICAgIHNjb3BlID0gIiDihpIgZmlyZXdhbGwgY2hhbmdlIgogICAgZWxpZiBhY3Rpb24gPT0gInVzZXIubW9kaWZ5IjoKICAgICAgICBzY29wZSA9ICIg4oaSIHVzZXIgY2hhbmdlIgogICAgZWxpZiBhY3Rpb24gPT0gImNyZWRlbnRpYWwucm90YXRlIjoKICAgICAgICBzY29wZSA9ICIg4oaSIGNyZWRlbnRpYWwgY2hhbmdlIgogICAgZWxpZiBhY3Rpb24gPT0gInN5c3RlbS51cGRhdGUiOgogICAgICAgIHNjb3BlID0gIiDihpIgc3lzdGVtIHVwZGF0ZSIKICAgIHJldHVybiBmIlByaXZpbGVnZWQgcmVxdWVzdCDCtyBUaWVyIHt0aWVyfSDCtyB7YWN0aW9ufXtzY29wZX0gwrcgaWQge3JlcXVlc3QuZ2V0KCdpZCcsICc/JylbOjEwXX0iCgoKZGVmIF9wb3N0X3dlYmhvb2soY2ZnOiBkaWN0LCBsaW5lOiBzdHIpIC0+IE5vbmU6CiAgICB1cmwgPSBjZmcuZ2V0KCJ3ZWJob29rX3VybCIpCiAgICBpZiB1cmw6CiAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoeyJjb250ZW50IjogbGluZX0pLmVuY29kZSgpCiAgICAgICAgcmVxID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCh1cmwsIGRhdGE9ZGF0YSwgaGVhZGVycz17ImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgdXJsbGliLnJlcXVlc3QudXJsb3BlbihyZXEsIHRpbWVvdXQ9MTApCiAgICAgICAgcmV0dXJuCiAgICB0b2tlbiA9IGNmZy5nZXQoInRlbGVncmFtX2JvdF90b2tlbiIpCiAgICBjaGF0ID0gY2ZnLmdldCgidGVsZWdyYW1fY2hhdF9pZCIpCiAgICBpZiB0b2tlbiBhbmQgY2hhdDoKICAgICAgICBhcGkgPSBmImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3R7dG9rZW59L3NlbmRNZXNzYWdlIgogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsiY2hhdF9pZCI6IGNoYXQsICJ0ZXh0IjogbGluZX0pLmVuY29kZSgpCiAgICAgICAgcmVxID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdChhcGksIGRhdGE9ZGF0YSwgaGVhZGVycz17ImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgdXJsbGliLnJlcXVlc3QudXJsb3BlbihyZXEsIHRpbWVvdXQ9MTApCgoKZGVmIG5vdGlmeV9yZXF1ZXN0X2NyZWF0ZWQocmVxdWVzdDogZGljdCkgLT4gTm9uZToKICAgICIiIkZpcmUtYW5kLWZvcmdldCBvd25lciBwaW5nLiBTYWZlIHRvIGNhbGwgZnJvbSB0aGUgYnJva2VyLiIiIgogICAgdHJ5OgogICAgICAgIGNmZyA9IF9sb2FkX2NvbmZpZygpCiAgICAgICAgbGluZSA9IF9odW1hbl9saW5lKHJlcXVlc3QpCiAgICAgICAgIyBQYXRoIDE6IGhlcm1lcyBDTEkgKGJlc3QtZWZmb3J0KQogICAgICAgIGlmIGNmZy5nZXQoImhlcm1lc19jbGkiLCBUcnVlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgICAgICAgICAgWyJoZXJtZXMiLCAibWVzc2FnZSIsIGxpbmUsICItLWpzb24iXSwKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PTE1LAogICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAjIFBhdGggMjogd2ViaG9vayAoVGVsZWdyYW0gYm90IC8gRGlzY29yZCkKICAgICAgICBpZiBjZmcuZ2V0KCJ3ZWJob29rX3VybCIpIG9yIChjZmcuZ2V0KCJ0ZWxlZ3JhbV9ib3RfdG9rZW4iKSBhbmQgY2ZnLmdldCgidGVsZWdyYW1fY2hhdF9pZCIpKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3Bvc3Rfd2ViaG9vayhjZmcsIGxpbmUpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICMgTmV2ZXIgbGV0IG5vdGlmaWNhdGlvbiBmYWlsdXJlIGFmZmVjdCB0aGUgYnJva2VyLgogICAgICAgIHBhc3MKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc2FtcGxlID0gewogICAgICAgICJpZCI6ICIwMTIzNDU2Nzg5YWJjZGVmMDEyMyIsCiAgICAgICAgInRpZXIiOiAzLAogICAgICAgICJhY3Rpb24iOiAiZGF0YS5xdWFyYW50aW5lIiwKICAgICAgICAicGFyYW1zIjogeyJwYXRocyI6IFsiL3giXX0sCiAgICB9CiAgICBwcmludChfaHVtYW5fbGluZShzYW1wbGUpKQo= B64_request_notifier_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/passkey_manager.py' <<'B64_passkey_manager_py' IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJXZWJBdXRobiBwYXNza2V5IGVucm9sbG1lbnQgYW5kIHJlcXVlc3QtYm91bmQgYXV0aGVudGljYXRpb24uIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYmFzZTY0CmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgc2VjcmV0cwppbXBvcnQgdGltZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgQ2FsbGFibGUKCmZyb20gd2ViYXV0aG4gaW1wb3J0ICgKICAgIGJhc2U2NHVybF90b19ieXRlcywKICAgIGdlbmVyYXRlX2F1dGhlbnRpY2F0aW9uX29wdGlvbnMsCiAgICBnZW5lcmF0ZV9yZWdpc3RyYXRpb25fb3B0aW9ucywKICAgIG9wdGlvbnNfdG9fanNvbiwKICAgIHZlcmlmeV9hdXRoZW50aWNhdGlvbl9yZXNwb25zZSwKICAgIHZlcmlmeV9yZWdpc3RyYXRpb25fcmVzcG9uc2UsCikKZnJvbSB3ZWJhdXRobi5oZWxwZXJzLnN0cnVjdHMgaW1wb3J0ICgKICAgIEF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Dcml0ZXJpYSwKICAgIFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yLAogICAgUmVzaWRlbnRLZXlSZXF1aXJlbWVudCwKICAgIFVzZXJWZXJpZmljYXRpb25SZXF1aXJlbWVudCwKKQoKCmNsYXNzIFBhc3NrZXlFcnJvcihSdW50aW1lRXJyb3IpOgogICAgcGFzcwoKCmRlZiBiNjR1cmwoZGF0YTogYnl0ZXMpIC0+IHN0cjoKICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUoZGF0YSkucnN0cmlwKGIiPSIpLmRlY29kZSgpCgoKZGVmIGF0b21pY19qc29uKHBhdGg6IFBhdGgsIHZhbHVlOiBkaWN0W3N0ciwgQW55XSwgbW9kZTogaW50ID0gMG82MDApIC0+IE5vbmU6CiAgICBwYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICB0ZW1wID0gcGF0aC53aXRoX3N1ZmZpeChwYXRoLnN1ZmZpeCArICIudG1wIikKICAgIGZkID0gb3Mub3Blbih0ZW1wLCBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQgfCBvcy5PX1RSVU5DLCBtb2RlKQogICAgdHJ5OgogICAgICAgIG9zLndyaXRlKGZkLCBqc29uLmR1bXBzKHZhbHVlLCBzb3J0X2tleXM9VHJ1ZSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpKS5lbmNvZGUoKSArIGIiXG4iKQogICAgICAgIG9zLmZzeW5jKGZkKQogICAgZmluYWxseToKICAgICAgICBvcy5jbG9zZShmZCkKICAgIG9zLnJlcGxhY2UodGVtcCwgcGF0aCkKICAgIG9zLmNobW9kKHBhdGgsIG1vZGUpCgoKY2xhc3MgUGFzc2tleU1hbmFnZXI6CiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICAqLAogICAgICAgIHN0YXRlX3BhdGg6IFBhdGgsCiAgICAgICAgZW5yb2xsbWVudF9tYXJrZXI6IFBhdGgsCiAgICAgICAgcnBfaWQ6IHN0ciwKICAgICAgICBvcmlnaW46IHN0ciwKICAgICAgICByZWdpc3RyYXRpb25fdmVyaWZpZXI6IENhbGxhYmxlWy4uLiwgQW55XSA9IHZlcmlmeV9yZWdpc3RyYXRpb25fcmVzcG9uc2UsCiAgICAgICAgYXV0aGVudGljYXRpb25fdmVyaWZpZXI6IENhbGxhYmxlWy4uLiwgQW55XSA9IHZlcmlmeV9hdXRoZW50aWNhdGlvbl9yZXNwb25zZSwKICAgICk6CiAgICAgICAgc2VsZi5zdGF0ZV9wYXRoID0gUGF0aChzdGF0ZV9wYXRoKQogICAgICAgIHNlbGYuZW5yb2xsbWVudF9tYXJrZXIgPSBQYXRoKGVucm9sbG1lbnRfbWFya2VyKQogICAgICAgIHNlbGYucnBfaWQgPSBycF9pZAogICAgICAgIHNlbGYub3JpZ2luID0gb3JpZ2luCiAgICAgICAgc2VsZi5yZWdpc3RyYXRpb25fdmVyaWZpZXIgPSByZWdpc3RyYXRpb25fdmVyaWZpZXIKICAgICAgICBzZWxmLmF1dGhlbnRpY2F0aW9uX3ZlcmlmaWVyID0gYXV0aGVudGljYXRpb25fdmVyaWZpZXIKICAgICAgICBzZWxmLnJlZ2lzdHJhdGlvbl9jaGFsbGVuZ2UgPSBzZWxmLnN0YXRlX3BhdGgud2l0aF9uYW1lKCJyZWdpc3RyYXRpb24tY2hhbGxlbmdlLmpzb24iKQogICAgICAgIHNlbGYuYXV0aF9kaXIgPSBzZWxmLnN0YXRlX3BhdGgucGFyZW50IC8gImF1dGhlbnRpY2F0aW9uLWNoYWxsZW5nZXMiCgogICAgZGVmIGVucm9sbGVkKHNlbGYpIC0+IGJvb2w6CiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGVfcGF0aC5pc19maWxlKCkgYW5kIHNlbGYuc3RhdGVfcGF0aC5zdGF0KCkuc3Rfc2l6ZSA+IDAKCiAgICBkZWYgX2Vucm9sbG1lbnRfb3BlbihzZWxmKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuZW5yb2xsZWQoKToKICAgICAgICAgICAgcmFpc2UgUGFzc2tleUVycm9yKCJwYXNza2V5LWFscmVhZHktZW5yb2xsZWQiKQogICAgICAgIGlmIG5vdCBzZWxmLmVucm9sbG1lbnRfbWFya2VyLmV4aXN0cygpOgogICAgICAgICAgICByYWlzZSBQYXNza2V5RXJyb3IoImVucm9sbG1lbnQtY2xvc2VkIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hcmtlciA9IGpzb24ubG9hZHMoc2VsZi5lbnJvbGxtZW50X21hcmtlci5yZWFkX3RleHQoKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgUGFzc2tleUVycm9yKCJlbnJvbGxtZW50LWNsb3NlZCIpIGZyb20gZXhjCiAgICAgICAgaWYgaW50KG1hcmtlci5nZXQoImV4cGlyZXNfYXQiLCAwKSkgPCBpbnQodGltZS50aW1lKCkpOgogICAgICAgICAgICBzZWxmLmVucm9sbG1lbnRfbWFya2VyLnVubGluayhtaXNzaW5nX29rPVRydWUpCiAgICAgICAgICAgIHJhaXNlIFBhc3NrZXlFcnJvcigiZW5yb2xsbWVudC1jbG9zZWQiKQoKICAgIGRlZiBiZWdpbl9yZWdpc3RyYXRpb24oc2VsZikgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgc2VsZi5fZW5yb2xsbWVudF9vcGVuKCkKICAgICAgICBjaGFsbGVuZ2UgPSBzZWNyZXRzLnRva2VuX2J5dGVzKDMyKQogICAgICAgIGF0b21pY19qc29uKHNlbGYucmVnaXN0cmF0aW9uX2NoYWxsZW5nZSwgeyJjaGFsbGVuZ2UiOiBiNjR1cmwoY2hhbGxlbmdlKSwgImV4cGlyZXNfYXQiOiBpbnQodGltZS50aW1lKCkpICsgMzAwfSkKICAgICAgICBvcHRpb25zID0gZ2VuZXJhdGVfcmVnaXN0cmF0aW9uX29wdGlvbnMoCiAgICAgICAgICAgIHJwX2lkPXNlbGYucnBfaWQsCiAgICAgICAgICAgIHJwX25hbWU9IkhpbW1hIFByaXZpbGVnZWQgQXBwcm92YWwiLAogICAgICAgICAgICB1c2VyX2lkPWhhc2hsaWIuc2hhMjU2KGIiYWJ1LWhpbW1hLW93bmVyIikuZGlnZXN0KCksCiAgICAgICAgICAgIHVzZXJfbmFtZT0iQWJ1IEhpbW1hIiwKICAgICAgICAgICAgdXNlcl9kaXNwbGF5X25hbWU9IkFidSBIaW1tYSIsCiAgICAgICAgICAgIGNoYWxsZW5nZT1jaGFsbGVuZ2UsCiAgICAgICAgICAgIHRpbWVvdXQ9MzAwMDAwLAogICAgICAgICAgICBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbj1BdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWEoCiAgICAgICAgICAgICAgICByZXNpZGVudF9rZXk9UmVzaWRlbnRLZXlSZXF1aXJlbWVudC5QUkVGRVJSRUQsCiAgICAgICAgICAgICAgICB1c2VyX3ZlcmlmaWNhdGlvbj1Vc2VyVmVyaWZpY2F0aW9uUmVxdWlyZW1lbnQuUkVRVUlSRUQsCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgICAgIHJldHVybiBqc29uLmxvYWRzKG9wdGlvbnNfdG9fanNvbihvcHRpb25zKSkKCiAgICBkZWYgZmluaXNoX3JlZ2lzdHJhdGlvbihzZWxmLCBjcmVkZW50aWFsOiBkaWN0W3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06CiAgICAgICAgc2VsZi5fZW5yb2xsbWVudF9vcGVuKCkKICAgICAgICBpZiBub3Qgc2VsZi5yZWdpc3RyYXRpb25fY2hhbGxlbmdlLmV4aXN0cygpOgogICAgICAgICAgICByYWlzZSBQYXNza2V5RXJyb3IoInJlZ2lzdHJhdGlvbi1jaGFsbGVuZ2UtbWlzc2luZyIpCiAgICAgICAgcmVjb3JkID0ganNvbi5sb2FkcyhzZWxmLnJlZ2lzdHJhdGlvbl9jaGFsbGVuZ2UucmVhZF90ZXh0KCkpCiAgICAgICAgaWYgaW50KHJlY29yZC5nZXQoImV4cGlyZXNfYXQiLCAwKSkgPCBpbnQodGltZS50aW1lKCkpOgogICAgICAgICAgICBzZWxmLnJlZ2lzdHJhdGlvbl9jaGFsbGVuZ2UudW5saW5rKG1pc3Npbmdfb2s9VHJ1ZSkKICAgICAgICAgICAgcmFpc2UgUGFzc2tleUVycm9yKCJyZWdpc3RyYXRpb24tY2hhbGxlbmdlLWV4cGlyZWQiKQogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyaWZpZWQgPSBzZWxmLnJlZ2lzdHJhdGlvbl92ZXJpZmllcigKICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw9Y3JlZGVudGlhbCwKICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NoYWxsZW5nZT1iYXNlNjR1cmxfdG9fYnl0ZXMocmVjb3JkWyJjaGFsbGVuZ2UiXSksCiAgICAgICAgICAgICAgICBleHBlY3RlZF9ycF9pZD1zZWxmLnJwX2lkLAogICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3JpZ2luPXNlbGYub3JpZ2luLAogICAgICAgICAgICAgICAgcmVxdWlyZV91c2VyX3ZlcmlmaWNhdGlvbj1UcnVlLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIFBhc3NrZXlFcnJvcigicmVnaXN0cmF0aW9uLXZlcmlmaWNhdGlvbi1mYWlsZWQiKSBmcm9tIGV4YwogICAgICAgIHN0YXRlID0gewogICAgICAgICAgICAiY3JlZGVudGlhbF9pZF9iNjQiOiBiNjR1cmwodmVyaWZpZWQuY3JlZGVudGlhbF9pZCksCiAgICAgICAgICAgICJjcmVkZW50aWFsX3B1YmxpY19rZXlfYjY0IjogYjY0dXJsKHZlcmlmaWVkLmNyZWRlbnRpYWxfcHVibGljX2tleSksCiAgICAgICAgICAgICJzaWduX2NvdW50IjogaW50KHZlcmlmaWVkLnNpZ25fY291bnQpLAogICAgICAgICAgICAiY3JlZGVudGlhbF9kZXZpY2VfdHlwZSI6IHN0cih2ZXJpZmllZC5jcmVkZW50aWFsX2RldmljZV90eXBlKSwKICAgICAgICAgICAgImNyZWRlbnRpYWxfYmFja2VkX3VwIjogYm9vbCh2ZXJpZmllZC5jcmVkZW50aWFsX2JhY2tlZF91cCksCiAgICAgICAgICAgICJycF9pZCI6IHNlbGYucnBfaWQsCiAgICAgICAgICAgICJvcmlnaW4iOiBzZWxmLm9yaWdpbiwKICAgICAgICAgICAgImVucm9sbGVkX2F0IjogaW50KHRpbWUudGltZSgpKSwKICAgICAgICB9CiAgICAgICAgYXRvbWljX2pzb24oc2VsZi5zdGF0ZV9wYXRoLCBzdGF0ZSkKICAgICAgICBzZWxmLnJlZ2lzdHJhdGlvbl9jaGFsbGVuZ2UudW5saW5rKG1pc3Npbmdfb2s9VHJ1ZSkKICAgICAgICBzZWxmLmVucm9sbG1lbnRfbWFya2VyLnVubGluayhtaXNzaW5nX29rPVRydWUpCiAgICAgICAgcmV0dXJuIHN0YXRlCgogICAgZGVmIGJlZ2luX2F1dGhlbnRpY2F0aW9uKHNlbGYsIHJlcXVlc3RfaWQ6IHN0ciwgYXBwcm92YWxfZGlnZXN0OiBzdHIpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgICAgIGlmIG5vdCBzZWxmLmVucm9sbGVkKCk6CiAgICAgICAgICAgIHJhaXNlIFBhc3NrZXlFcnJvcigic3Ryb25nLWF1dGgtbm90LWVucm9sbGVkIikKICAgICAgICBzdGF0ZSA9IGpzb24ubG9hZHMoc2VsZi5zdGF0ZV9wYXRoLnJlYWRfdGV4dCgpKQogICAgICAgIGNoYWxsZW5nZSA9IGhhc2hsaWIuc2hhMjU2KHNlY3JldHMudG9rZW5fYnl0ZXMoMzIpICsgcmVxdWVzdF9pZC5lbmNvZGUoKSArIGFwcHJvdmFsX2RpZ2VzdC5lbmNvZGUoKSkuZGlnZXN0KCkKICAgICAgICBzZWxmLmF1dGhfZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBhdG9taWNfanNvbigKICAgICAgICAgICAgc2VsZi5hdXRoX2RpciAvIGYie3JlcXVlc3RfaWR9Lmpzb24iLAogICAgICAgICAgICB7ImNoYWxsZW5nZSI6IGI2NHVybChjaGFsbGVuZ2UpLCAiYXBwcm92YWxfZGlnZXN0IjogYXBwcm92YWxfZGlnZXN0LCAiZXhwaXJlc19hdCI6IGludCh0aW1lLnRpbWUoKSkgKyAxODB9LAogICAgICAgICkKICAgICAgICBvcHRpb25zID0gZ2VuZXJhdGVfYXV0aGVudGljYXRpb25fb3B0aW9ucygKICAgICAgICAgICAgcnBfaWQ9c2VsZi5ycF9pZCwKICAgICAgICAgICAgY2hhbGxlbmdlPWNoYWxsZW5nZSwKICAgICAgICAgICAgdGltZW91dD0xODAwMDAsCiAgICAgICAgICAgIGFsbG93X2NyZWRlbnRpYWxzPVtQdWJsaWNLZXlDcmVkZW50aWFsRGVzY3JpcHRvcihpZD1iYXNlNjR1cmxfdG9fYnl0ZXMoc3RhdGVbImNyZWRlbnRpYWxfaWRfYjY0Il0pKV0sCiAgICAgICAgICAgIHVzZXJfdmVyaWZpY2F0aW9uPVVzZXJWZXJpZmljYXRpb25SZXF1aXJlbWVudC5SRVFVSVJFRCwKICAgICAgICApCiAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhvcHRpb25zX3RvX2pzb24ob3B0aW9ucykpCiAgICAgICAgcmVzdWx0WyJyZXF1ZXN0X2lkIl0gPSByZXF1ZXN0X2lkCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB2ZXJpZnlfYXV0aGVudGljYXRpb24oc2VsZiwgcmVxdWVzdF9pZDogc3RyLCBhcHByb3ZhbF9kaWdlc3Q6IHN0ciwgY3JlZGVudGlhbDogZGljdFtzdHIsIEFueV0pIC0+IGJvb2w6CiAgICAgICAgaWYgbm90IHNlbGYuZW5yb2xsZWQoKToKICAgICAgICAgICAgcmFpc2UgUGFzc2tleUVycm9yKCJzdHJvbmctYXV0aC1ub3QtZW5yb2xsZWQiKQogICAgICAgIGNoYWxsZW5nZV9wYXRoID0gc2VsZi5hdXRoX2RpciAvIGYie3JlcXVlc3RfaWR9Lmpzb24iCiAgICAgICAgaWYgbm90IGNoYWxsZW5nZV9wYXRoLmV4aXN0cygpOgogICAgICAgICAgICBpZiBzZWxmLmF1dGhfZGlyLmV4aXN0cygpIGFuZCBhbnkoc2VsZi5hdXRoX2Rpci5nbG9iKCIqLmpzb24iKSk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXNza2V5RXJyb3IoImF1dGhlbnRpY2F0aW9uLWNoYWxsZW5nZS1taXNtYXRjaCIpCiAgICAgICAgICAgIHJhaXNlIFBhc3NrZXlFcnJvcigiYXV0aGVudGljYXRpb24tY2hhbGxlbmdlLW1pc3NpbmciKQogICAgICAgIGNoYWxsZW5nZSA9IGpzb24ubG9hZHMoY2hhbGxlbmdlX3BhdGgucmVhZF90ZXh0KCkpCiAgICAgICAgaWYgY2hhbGxlbmdlLmdldCgiYXBwcm92YWxfZGlnZXN0IikgIT0gYXBwcm92YWxfZGlnZXN0OgogICAgICAgICAgICByYWlzZSBQYXNza2V5RXJyb3IoImF1dGhlbnRpY2F0aW9uLWNoYWxsZW5nZS1taXNtYXRjaCIpCiAgICAgICAgaWYgaW50KGNoYWxsZW5nZS5nZXQoImV4cGlyZXNfYXQiLCAwKSkgPCBpbnQodGltZS50aW1lKCkpOgogICAgICAgICAgICBjaGFsbGVuZ2VfcGF0aC51bmxpbmsobWlzc2luZ19vaz1UcnVlKQogICAgICAgICAgICByYWlzZSBQYXNza2V5RXJyb3IoImF1dGhlbnRpY2F0aW9uLWNoYWxsZW5nZS1leHBpcmVkIikKICAgICAgICBzdGF0ZSA9IGpzb24ubG9hZHMoc2VsZi5zdGF0ZV9wYXRoLnJlYWRfdGV4dCgpKQogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyaWZpZWQgPSBzZWxmLmF1dGhlbnRpY2F0aW9uX3ZlcmlmaWVyKAogICAgICAgICAgICAgICAgY3JlZGVudGlhbD1jcmVkZW50aWFsLAogICAgICAgICAgICAgICAgZXhwZWN0ZWRfY2hhbGxlbmdlPWJhc2U2NHVybF90b19ieXRlcyhjaGFsbGVuZ2VbImNoYWxsZW5nZSJdKSwKICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JwX2lkPXNlbGYucnBfaWQsCiAgICAgICAgICAgICAgICBleHBlY3RlZF9vcmlnaW49c2VsZi5vcmlnaW4sCiAgICAgICAgICAgICAgICBjcmVkZW50aWFsX3B1YmxpY19rZXk9YmFzZTY0dXJsX3RvX2J5dGVzKHN0YXRlWyJjcmVkZW50aWFsX3B1YmxpY19rZXlfYjY0Il0pLAogICAgICAgICAgICAgICAgY3JlZGVudGlhbF9jdXJyZW50X3NpZ25fY291bnQ9aW50KHN0YXRlWyJzaWduX2NvdW50Il0pLAogICAgICAgICAgICAgICAgcmVxdWlyZV91c2VyX3ZlcmlmaWNhdGlvbj1UcnVlLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIFBhc3NrZXlFcnJvcigiYXV0aGVudGljYXRpb24tdmVyaWZpY2F0aW9uLWZhaWxlZCIpIGZyb20gZXhjCiAgICAgICAgc3RhdGVbInNpZ25fY291bnQiXSA9IGludCh2ZXJpZmllZC5uZXdfc2lnbl9jb3VudCkKICAgICAgICBzdGF0ZVsiY3JlZGVudGlhbF9kZXZpY2VfdHlwZSJdID0gc3RyKHZlcmlmaWVkLmNyZWRlbnRpYWxfZGV2aWNlX3R5cGUpCiAgICAgICAgc3RhdGVbImNyZWRlbnRpYWxfYmFja2VkX3VwIl0gPSBib29sKHZlcmlmaWVkLmNyZWRlbnRpYWxfYmFja2VkX3VwKQogICAgICAgIHN0YXRlWyJsYXN0X3VzZWRfYXQiXSA9IGludCh0aW1lLnRpbWUoKSkKICAgICAgICBhdG9taWNfanNvbihzZWxmLnN0YXRlX3BhdGgsIHN0YXRlKQogICAgICAgIGNoYWxsZW5nZV9wYXRoLnVubGluayhtaXNzaW5nX29rPVRydWUpCiAgICAgICAgcmV0dXJuIFRydWUK B64_passkey_manager_py ssh himma-admin 'base64 -d > /tmp/himma-lease-stage/deploy_lease_control_plane.sh' <<'B64_INSTALLER' IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLXVvIHBpcGVmYWlsClNUQUdFPS90bXAvaGltbWEtbGVhc2Utc3RhZ2UKT1BUPS9vcHQvaGltbWEtcHJpdmlsZWdlLWdhdGUKZWNobyAiPT09IGRlcGxveSBzdGFydCA9PT0iCmluc3RhbGwgLWQgLW8gcm9vdCAtZyByb290IC1tIDc1NSAiJE9QVCIgMj4vZGV2L251bGwgfHwgdHJ1ZQojIGNhbm9uaWNhbCBmaWxlcwppbnN0YWxsIC1vIHJvb3QgLWcgcm9vdCAtbSA2NDQgIiRTVEFHRS9wcml2aWxlZ2VfZ2F0ZS5weSIgICAiJE9QVC9wcml2aWxlZ2VfZ2F0ZS5weSIKaW5zdGFsbCAtbyByb290IC1nIHJvb3QgLW0gNjQ0ICIkU1RBR0UvZ2F0ZV9kYWVtb24ucHkiICAgICAgICIkT1BUL2dhdGVfZGFlbW9uLnB5IgppbnN0YWxsIC1vIHJvb3QgLWcgcm9vdCAtbSA2NDQgIiRTVEFHRS9sZWFzZV9tYW5hZ2VyLnB5IiAgICAgIiRPUFQvbGVhc2VfbWFuYWdlci5weSIKaW5zdGFsbCAtbyByb290IC1nIHJvb3QgLW0gNjQ0ICIkU1RBR0UvYXBwcm92YWxfcG9ydGFsLnB5IiAgICIkT1BUL2FwcHJvdmFsX3BvcnRhbC5weSIKaW5zdGFsbCAtbyByb290IC1nIHJvb3QgLW0gNjQ0ICIkU1RBR0UvcmVxdWVzdF9ub3RpZmllci5weSIgICIkT1BUL3JlcXVlc3Rfbm90aWZpZXIucHkiCmluc3RhbGwgLW8gcm9vdCAtZyByb290IC1tIDY0NCAiJFNUQUdFL3Bhc3NrZXlfbWFuYWdlci5weSIgICAiJE9QVC9wYXNza2V5X21hbmFnZXIucHkiCiMgbGVnYWN5IG5hbWUgYWxpYXNlcyBzbyBhbnkgZXhpc3RpbmcgdW5pdCByZWZlcmVuY2luZyBvbGQgbmFtZXMgc3RpbGwgcmVzb2x2ZXMKWyAtZiAiJE9QVC9wcml2aWxlZ2VfZ2F0ZS5weSIgXSAgJiYgaW5zdGFsbCAtbyByb290IC1nIHJvb3QgLW0gNjQ0ICIkT1BUL3ByaXZpbGVnZV9nYXRlLnB5IiAgIiRPUFQvbGVhc2VfcHJpdmlsZWdlX2dhdGUucHkiClsgLWYgIiRPUFQvYXBwcm92YWxfcG9ydGFsLnB5IiBdICYmIGluc3RhbGwgLW8gcm9vdCAtZyByb290IC1tIDY0NCAiJE9QVC9hcHByb3ZhbF9wb3J0YWwucHkiICIkT1BUL2xlYXNlX2FwcHJvdmFsX3BvcnRhbC5weSIKWyAtZiAiJE9QVC9wYXNza2V5X21hbmFnZXIucHkiIF0gJiYgaW5zdGFsbCAtbyByb290IC1nIHJvb3QgLW0gNjQ0ICIkT1BUL3Bhc3NrZXlfbWFuYWdlci5weSIgIiRPUFQvbGVhc2VfcGFzc2tleV9tYW5hZ2VyLnB5IgpbIC1mICIkT1BUIGRvZXMgbm90IG1hdHRlciIgXSB8fCB0cnVlClsgLWYgIiRPUFQvZ2F0ZV9kYWVtb24ucHkiIF0gICAgICYmIGluc3RhbGwgLW8gcm9vdCAtZyByb290IC1tIDY0NCAiJE9QVC9nYXRlX2RhZW1vbi5weSIgICAgICIkT1BUL2xlYXNlX2dhdGVfZGFlbW9uLnB5IgplY2hvICJmaWxlcyBpbnN0YWxsZWQ6IgpscyAtMSAiJE9QVCIvKi5weSAyPi9kZXYvbnVsbAojIHBvcnRhbC5qc29uIGVkaXQgKGJlc3QtZWZmb3J0KQpweXRob24zIC0gPDwnUFknIHx8IHRydWUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmltcG9ydCBqc29uLG9zLHB3ZCxncnAKdHJ5OgogICAgcD1QYXRoKCcvZXRjL2hpbW1hLXByaXZpbGVnZS1nYXRlL3BvcnRhbC5qc29uJykKICAgIGlmIHAuZXhpc3RzKCk6CiAgICAgICAgZD1qc29uLmxvYWRzKHAucmVhZF90ZXh0KCkpCiAgICAgICAgZFsnYWdlbnRzJ109eydoZXJtZXMnOnB3ZC5nZXRwd25hbSgnaGVybWVzLWFnZW50JykucHdfdWlkLCdvcGVuY2xhdyc6cHdkLmdldHB3bmFtKCdvcGVuY2xhdy1hZ2VudCcpLnB3X3VpZH0KICAgICAgICBkWydsZWFzZV9zZXJ2aWNlcyddPXsnaGVybWVzJzpbJ2hlcm1lcy1nYXRld2F5LnNlcnZpY2UnLCdoZXJtZXMtZ2F0ZXdheS1oaW1tYS5zZXJ2aWNlJywnaGVybWVzLWRhc2hib2FyZC5zZXJ2aWNlJ10sJ29wZW5jbGF3JzpbJ29wZW5jbGF3LWdhdGV3YXkuc2VydmljZScsJ29wZW5jbGF3LW5vZGUuc2VydmljZSddfQogICAgICAgIHAud3JpdGVfdGV4dChqc29uLmR1bXBzKGQsaW5kZW50PTIsc29ydF9rZXlzPVRydWUpKydcbicpOyBvcy5jaG1vZChwLDBvNjQwKQogICAgICAgIHRyeTogb3MuY2hvd24ocCwwLGdycC5nZXRncm5hbSgnaGltbWEtcHJpdmlsZWdlJykuZ3JfZ2lkKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IHBhc3MKZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgcHJpbnQoJ3BvcnRhbC5qc29uIGVkaXQgc2tpcHBlZDonLCBlKQpQWQojIG5vdGlmeSB0YXJnZXRzIChiZXN0LWVmZm9ydCkKcHl0aG9uMyAtIDw8J1BZJwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKaW1wb3J0IGpzb24sb3MKcD1QYXRoKCcvdmFyL2xpYi9oaW1tYS1wcml2aWxlZ2UtZ2F0ZS9ub3RpZnkuanNvbicpCmRlZmF1bHRzPXsndGVsZWdyYW0nOlRydWUsJ2Rpc2NvcmQnOlRydWV9CnRyeToKICAgIGQ9anNvbi5sb2FkcyhwLnJlYWRfdGV4dCgpKSBpZiBwLmV4aXN0cygpIGVsc2UgZGVmYXVsdHMKZXhjZXB0IEV4Y2VwdGlvbjoKICAgIGQ9ZGVmYXVsdHMKcC53cml0ZV90ZXh0KGpzb24uZHVtcHMoZCxpbmRlbnQ9Mixzb3J0X2tleXM9VHJ1ZSkrJ1xuJyk7IG9zLmNobW9kKHAsMG82NDQpClBZCmVjaG8gIj09PSBjb21waWxpbmcgPT09Igovb3B0L2hpbW1hLXByaXZpbGVnZS1nYXRlLy52ZW52L2Jpbi9weXRob24gLW0gcHlfY29tcGlsZSAiJE9QVCIvKi5weSAmJiBlY2hvICJjb21waWxlLW9rIgplY2hvICI9PT0gcmVzdGFydGluZyBzZXJ2aWNlcyA9PT0iCnN5c3RlbWN0bCBkYWVtb24tcmVsb2FkIDI+L2Rldi9udWxsIHx8IHRydWUKc3lzdGVtY3RsIHJlc3RhcnQgaGltbWEtcHJpdmlsZWdlLWdhdGUuc2VydmljZSBoaW1tYS1hcHByb3ZhbC1wb3J0YWwuc2VydmljZQplY2hvICJyZXN0YXJ0IGlzc3VlZCIKZWNobyAiPT09IGhlYWx0aCBjaGVjayB3aXRoIHJldHJ5ID09PSIKb2s9MApmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDg7IGRvCiAgaWYgY3VybCAtZnNTIGh0dHA6Ly8xMjcuMC4wLjE6OTE0My9oZWFsdGggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICJwb3J0YWwtaGVhbHRoLW9rIGFmdGVyICR7aX0gdHJpZXMiOyBvaz0xOyBicmVhawogIGZpCiAgc2xlZXAgMgpkb25lCmlmIFsgIiRvayIgLW5lIDEgXTsgdGhlbgogIGVjaG8gIlBPUlRBTCBIRUFMVEggRkFJTEVEIOKAlCBkaWFnbm9zdGljcyBmb2xsb3c6IgogIHN5c3RlbWN0bCBzdGF0dXMgaGltbWEtYXBwcm92YWwtcG9ydGFsLnNlcnZpY2UgLS1uby1wYWdlciAtbCAyPi9kZXYvbnVsbCB8IGhlYWQgLTI1CiAgZWNobyAiLS0tLS0gam91cm5hbGN0bCAtLS0tLSIKICBqb3VybmFsY3RsIC11IGhpbW1hLWFwcHJvdmFsLXBvcnRhbC5zZXJ2aWNlIC0tbm8tcGFnZXIgLW4gNTAgMj4vZGV2L251bGwKICBlY2hvICItLS0tLSBsaXN0ZW5pbmcgc29ja2V0cyAtLS0tLSIKICBzcyAtbHRucCAyPi9kZXYvbnVsbCB8IGdyZXAgLUUgJzkxNDN8OTQ0MycgfHwgZWNobyAibm90aGluZyBsaXN0ZW5pbmcgb24gOTE0My85NDQzIgogIGVjaG8gImxlYXNlLWNvbnRyb2wtcGxhbmUtaW5zdGFsbGVkPUlOQ09NUExFVEUiCiAgZXhpdCAxCmZpCnByaW50ZiAnbGVhc2UtY29udHJvbC1wbGFuZS1pbnN0YWxsZWQ9dHJ1ZVxuJyA+IC92YXIvbGliL2hpbW1hLWxlYXNlLWluc3RhbGwtc3RhdHVzCmNobW9kIDY0NCAvdmFyL2xpYi9oaW1tYS1sZWFzZS1pbnN0YWxsLXN0YXR1cwplY2hvICJsZWFzZS1jb250cm9sLXBsYW5lLWluc3RhbGxlZD10cnVlIgo= B64_INSTALLER ssh himma-admin 'sudo bash /tmp/himma-lease-stage/deploy_lease_control_plane.sh'