@stigmer/server-slim 3.15.0 → 3.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/console/404.html +1 -1
- package/console/__next.__PAGE__.txt +2 -2
- package/console/__next._full.txt +14 -14
- package/console/__next._head.txt +4 -4
- package/console/__next._index.txt +9 -9
- package/console/__next._tree.txt +1 -1
- package/console/_next/static/chunks/033ax6lji-tes.js +1 -0
- package/console/_next/static/chunks/{0g4_345f39a55.js → 0cu7jpps89qek.js} +1 -1
- package/console/_next/static/chunks/0dvs3_g88-y3w.js +1 -0
- package/console/_next/static/chunks/{0qvczivzi0fcj.js → 0lbq-rv4._sxd.js} +1 -1
- package/console/_next/static/chunks/{0wb74irrcc7v7.js → 0r4rc1_40gx7f.js} +1 -1
- package/console/_next/static/chunks/0rt0okeappaf0.js +3 -0
- package/console/_next/static/chunks/0ty3ab~a037dh.js +1 -0
- package/console/_next/static/chunks/{0_gajuu~hgnb5.js → 15aq5lnv07h-o.js} +1 -1
- package/console/_not-found/__next._full.txt +14 -14
- package/console/_not-found/__next._head.txt +4 -4
- package/console/_not-found/__next._index.txt +9 -9
- package/console/_not-found/__next._not-found.__PAGE__.txt +3 -3
- package/console/_not-found/__next._not-found.txt +3 -3
- package/console/_not-found/__next._tree.txt +1 -1
- package/console/_not-found.html +1 -1
- package/console/_not-found.txt +14 -14
- package/console/auth/callback/__next._full.txt +16 -16
- package/console/auth/callback/__next._head.txt +4 -4
- package/console/auth/callback/__next._index.txt +9 -9
- package/console/auth/callback/__next._tree.txt +1 -1
- package/console/auth/callback/__next.auth.callback.__PAGE__.txt +4 -4
- package/console/auth/callback/__next.auth.callback.txt +3 -3
- package/console/auth/callback/__next.auth.txt +3 -3
- package/console/auth/callback.html +1 -1
- package/console/auth/callback.txt +16 -16
- package/console/auth/github/callback/__next._full.txt +16 -16
- package/console/auth/github/callback/__next._head.txt +4 -4
- package/console/auth/github/callback/__next._index.txt +9 -9
- package/console/auth/github/callback/__next._tree.txt +1 -1
- package/console/auth/github/callback/__next.auth.github.callback.__PAGE__.txt +4 -4
- package/console/auth/github/callback/__next.auth.github.callback.txt +3 -3
- package/console/auth/github/callback/__next.auth.github.txt +3 -3
- package/console/auth/github/callback/__next.auth.txt +3 -3
- package/console/auth/github/callback.html +1 -1
- package/console/auth/github/callback.txt +16 -16
- package/console/auth/oauth/callback/__next._full.txt +16 -16
- package/console/auth/oauth/callback/__next._head.txt +4 -4
- package/console/auth/oauth/callback/__next._index.txt +9 -9
- package/console/auth/oauth/callback/__next._tree.txt +1 -1
- package/console/auth/oauth/callback/__next.auth.oauth.callback.__PAGE__.txt +4 -4
- package/console/auth/oauth/callback/__next.auth.oauth.callback.txt +3 -3
- package/console/auth/oauth/callback/__next.auth.oauth.txt +3 -3
- package/console/auth/oauth/callback/__next.auth.txt +3 -3
- package/console/auth/oauth/callback.html +1 -1
- package/console/auth/oauth/callback.txt +16 -16
- package/console/chat/__placeholder__/__placeholder__/__next._full.txt +15 -15
- package/console/chat/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/chat/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/chat/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/chat/__placeholder__/__placeholder__/__next.chat.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/chat/__placeholder__/__placeholder__/__next.chat.$d$org.$d$slug.txt +3 -3
- package/console/chat/__placeholder__/__placeholder__/__next.chat.$d$org.txt +3 -3
- package/console/chat/__placeholder__/__placeholder__/__next.chat.txt +3 -3
- package/console/chat/__placeholder__/__placeholder__.html +1 -1
- package/console/chat/__placeholder__/__placeholder__.txt +15 -15
- package/console/conversations/__next._full.txt +15 -15
- package/console/conversations/__next._head.txt +4 -4
- package/console/conversations/__next._index.txt +9 -9
- package/console/conversations/__next._tree.txt +1 -1
- package/console/conversations/__next.conversations.__PAGE__.txt +3 -3
- package/console/conversations/__next.conversations.txt +3 -3
- package/console/conversations/__placeholder__/__placeholder__/__next._full.txt +15 -15
- package/console/conversations/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/conversations/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/conversations/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/conversations/__placeholder__/__placeholder__/__next.conversations.$d$channelId.$d$key.__PAGE__.txt +3 -3
- package/console/conversations/__placeholder__/__placeholder__/__next.conversations.$d$channelId.$d$key.txt +3 -3
- package/console/conversations/__placeholder__/__placeholder__/__next.conversations.$d$channelId.txt +3 -3
- package/console/conversations/__placeholder__/__placeholder__/__next.conversations.txt +3 -3
- package/console/conversations/__placeholder__/__placeholder__.html +1 -1
- package/console/conversations/__placeholder__/__placeholder__.txt +15 -15
- package/console/conversations.html +1 -1
- package/console/conversations.txt +15 -15
- package/console/dashboard/__next._full.txt +15 -15
- package/console/dashboard/__next._head.txt +4 -4
- package/console/dashboard/__next._index.txt +9 -9
- package/console/dashboard/__next._tree.txt +1 -1
- package/console/dashboard/__next.dashboard.__PAGE__.txt +3 -3
- package/console/dashboard/__next.dashboard.txt +3 -3
- package/console/dashboard.html +1 -1
- package/console/dashboard.txt +15 -15
- package/console/executions/__placeholder__/__next._full.txt +14 -14
- package/console/executions/__placeholder__/__next._head.txt +4 -4
- package/console/executions/__placeholder__/__next._index.txt +9 -9
- package/console/executions/__placeholder__/__next._tree.txt +1 -1
- package/console/executions/__placeholder__/__next.executions.$d$id.__PAGE__.txt +2 -2
- package/console/executions/__placeholder__/__next.executions.$d$id.txt +3 -3
- package/console/executions/__placeholder__/__next.executions.txt +3 -3
- package/console/executions/__placeholder__.html +1 -1
- package/console/executions/__placeholder__.txt +14 -14
- package/console/index.html +1 -1
- package/console/index.txt +14 -14
- package/console/invite/__placeholder__/__next._full.txt +16 -16
- package/console/invite/__placeholder__/__next._head.txt +4 -4
- package/console/invite/__placeholder__/__next._index.txt +9 -9
- package/console/invite/__placeholder__/__next._tree.txt +1 -1
- package/console/invite/__placeholder__/__next.invite.$d$token.__PAGE__.txt +3 -3
- package/console/invite/__placeholder__/__next.invite.$d$token.txt +3 -3
- package/console/invite/__placeholder__/__next.invite.txt +3 -3
- package/console/invite/__placeholder__.html +1 -1
- package/console/invite/__placeholder__.txt +16 -16
- package/console/library/__next._full.txt +17 -17
- package/console/library/__next._head.txt +4 -4
- package/console/library/__next._index.txt +9 -9
- package/console/library/__next._tree.txt +1 -1
- package/console/library/__next.library.__PAGE__.txt +3 -3
- package/console/library/__next.library.txt +5 -5
- package/console/library/agents/__next._full.txt +17 -17
- package/console/library/agents/__next._head.txt +4 -4
- package/console/library/agents/__next._index.txt +9 -9
- package/console/library/agents/__next._tree.txt +1 -1
- package/console/library/agents/__next.library.agents.__PAGE__.txt +3 -3
- package/console/library/agents/__next.library.agents.txt +3 -3
- package/console/library/agents/__next.library.txt +5 -5
- package/console/library/agents/__placeholder__/__placeholder__/__next._full.txt +17 -17
- package/console/library/agents/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/library/agents/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/library/agents/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/library/agents/__placeholder__/__placeholder__/__next.library.agents.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/library/agents/__placeholder__/__placeholder__/__next.library.agents.$d$org.$d$slug.txt +3 -3
- package/console/library/agents/__placeholder__/__placeholder__/__next.library.agents.$d$org.txt +3 -3
- package/console/library/agents/__placeholder__/__placeholder__/__next.library.agents.txt +3 -3
- package/console/library/agents/__placeholder__/__placeholder__/__next.library.txt +5 -5
- package/console/library/agents/__placeholder__/__placeholder__.html +1 -1
- package/console/library/agents/__placeholder__/__placeholder__.txt +17 -17
- package/console/library/agents/new/__next._full.txt +18 -18
- package/console/library/agents/new/__next._head.txt +4 -4
- package/console/library/agents/new/__next._index.txt +9 -9
- package/console/library/agents/new/__next._tree.txt +1 -1
- package/console/library/agents/new/__next.library.agents.new.__PAGE__.txt +4 -4
- package/console/library/agents/new/__next.library.agents.new.txt +3 -3
- package/console/library/agents/new/__next.library.agents.txt +3 -3
- package/console/library/agents/new/__next.library.txt +5 -5
- package/console/library/agents/new.html +1 -1
- package/console/library/agents/new.txt +18 -18
- package/console/library/agents.html +1 -1
- package/console/library/agents.txt +17 -17
- package/console/library/mcp-servers/__next._full.txt +17 -17
- package/console/library/mcp-servers/__next._head.txt +4 -4
- package/console/library/mcp-servers/__next._index.txt +9 -9
- package/console/library/mcp-servers/__next._tree.txt +1 -1
- package/console/library/mcp-servers/__next.library.mcp-servers.__PAGE__.txt +3 -3
- package/console/library/mcp-servers/__next.library.mcp-servers.txt +3 -3
- package/console/library/mcp-servers/__next.library.txt +5 -5
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next._full.txt +17 -17
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next.library.mcp-servers.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next.library.mcp-servers.$d$org.$d$slug.txt +3 -3
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next.library.mcp-servers.$d$org.txt +3 -3
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next.library.mcp-servers.txt +3 -3
- package/console/library/mcp-servers/__placeholder__/__placeholder__/__next.library.txt +5 -5
- package/console/library/mcp-servers/__placeholder__/__placeholder__.html +1 -1
- package/console/library/mcp-servers/__placeholder__/__placeholder__.txt +17 -17
- package/console/library/mcp-servers/new/__next._full.txt +18 -18
- package/console/library/mcp-servers/new/__next._head.txt +4 -4
- package/console/library/mcp-servers/new/__next._index.txt +9 -9
- package/console/library/mcp-servers/new/__next._tree.txt +1 -1
- package/console/library/mcp-servers/new/__next.library.mcp-servers.new.__PAGE__.txt +4 -4
- package/console/library/mcp-servers/new/__next.library.mcp-servers.new.txt +3 -3
- package/console/library/mcp-servers/new/__next.library.mcp-servers.txt +3 -3
- package/console/library/mcp-servers/new/__next.library.txt +5 -5
- package/console/library/mcp-servers/new.html +1 -1
- package/console/library/mcp-servers/new.txt +18 -18
- package/console/library/mcp-servers.html +1 -1
- package/console/library/mcp-servers.txt +17 -17
- package/console/library/schedules/__next._full.txt +17 -17
- package/console/library/schedules/__next._head.txt +4 -4
- package/console/library/schedules/__next._index.txt +9 -9
- package/console/library/schedules/__next._tree.txt +1 -1
- package/console/library/schedules/__next.library.schedules.__PAGE__.txt +3 -3
- package/console/library/schedules/__next.library.schedules.txt +3 -3
- package/console/library/schedules/__next.library.txt +5 -5
- package/console/library/schedules/__placeholder__/__placeholder__/__next._full.txt +17 -17
- package/console/library/schedules/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/library/schedules/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/library/schedules/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/library/schedules/__placeholder__/__placeholder__/__next.library.schedules.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/library/schedules/__placeholder__/__placeholder__/__next.library.schedules.$d$org.$d$slug.txt +3 -3
- package/console/library/schedules/__placeholder__/__placeholder__/__next.library.schedules.$d$org.txt +3 -3
- package/console/library/schedules/__placeholder__/__placeholder__/__next.library.schedules.txt +3 -3
- package/console/library/schedules/__placeholder__/__placeholder__/__next.library.txt +5 -5
- package/console/library/schedules/__placeholder__/__placeholder__.html +1 -1
- package/console/library/schedules/__placeholder__/__placeholder__.txt +17 -17
- package/console/library/schedules/new/__next._full.txt +18 -18
- package/console/library/schedules/new/__next._head.txt +4 -4
- package/console/library/schedules/new/__next._index.txt +9 -9
- package/console/library/schedules/new/__next._tree.txt +1 -1
- package/console/library/schedules/new/__next.library.schedules.new.__PAGE__.txt +4 -4
- package/console/library/schedules/new/__next.library.schedules.new.txt +3 -3
- package/console/library/schedules/new/__next.library.schedules.txt +3 -3
- package/console/library/schedules/new/__next.library.txt +5 -5
- package/console/library/schedules/new.html +1 -1
- package/console/library/schedules/new.txt +18 -18
- package/console/library/schedules.html +1 -1
- package/console/library/schedules.txt +17 -17
- package/console/library/skills/__next._full.txt +17 -17
- package/console/library/skills/__next._head.txt +4 -4
- package/console/library/skills/__next._index.txt +9 -9
- package/console/library/skills/__next._tree.txt +1 -1
- package/console/library/skills/__next.library.skills.__PAGE__.txt +3 -3
- package/console/library/skills/__next.library.skills.txt +3 -3
- package/console/library/skills/__next.library.txt +5 -5
- package/console/library/skills/__placeholder__/__placeholder__/__next._full.txt +17 -17
- package/console/library/skills/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/library/skills/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/library/skills/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/library/skills/__placeholder__/__placeholder__/__next.library.skills.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/library/skills/__placeholder__/__placeholder__/__next.library.skills.$d$org.$d$slug.txt +3 -3
- package/console/library/skills/__placeholder__/__placeholder__/__next.library.skills.$d$org.txt +3 -3
- package/console/library/skills/__placeholder__/__placeholder__/__next.library.skills.txt +3 -3
- package/console/library/skills/__placeholder__/__placeholder__/__next.library.txt +5 -5
- package/console/library/skills/__placeholder__/__placeholder__.html +1 -1
- package/console/library/skills/__placeholder__/__placeholder__.txt +17 -17
- package/console/library/skills/new/__next._full.txt +18 -18
- package/console/library/skills/new/__next._head.txt +4 -4
- package/console/library/skills/new/__next._index.txt +9 -9
- package/console/library/skills/new/__next._tree.txt +1 -1
- package/console/library/skills/new/__next.library.skills.new.__PAGE__.txt +4 -4
- package/console/library/skills/new/__next.library.skills.new.txt +3 -3
- package/console/library/skills/new/__next.library.skills.txt +3 -3
- package/console/library/skills/new/__next.library.txt +5 -5
- package/console/library/skills/new.html +1 -1
- package/console/library/skills/new.txt +18 -18
- package/console/library/skills.html +1 -1
- package/console/library/skills.txt +17 -17
- package/console/library/workflows/__next._full.txt +17 -17
- package/console/library/workflows/__next._head.txt +4 -4
- package/console/library/workflows/__next._index.txt +9 -9
- package/console/library/workflows/__next._tree.txt +1 -1
- package/console/library/workflows/__next.library.txt +5 -5
- package/console/library/workflows/__next.library.workflows.__PAGE__.txt +3 -3
- package/console/library/workflows/__next.library.workflows.txt +3 -3
- package/console/library/workflows/__placeholder__/__placeholder__/__next._full.txt +17 -17
- package/console/library/workflows/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/library/workflows/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/library/workflows/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/library/workflows/__placeholder__/__placeholder__/__next.library.txt +5 -5
- package/console/library/workflows/__placeholder__/__placeholder__/__next.library.workflows.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/library/workflows/__placeholder__/__placeholder__/__next.library.workflows.$d$org.$d$slug.txt +3 -3
- package/console/library/workflows/__placeholder__/__placeholder__/__next.library.workflows.$d$org.txt +3 -3
- package/console/library/workflows/__placeholder__/__placeholder__/__next.library.workflows.txt +3 -3
- package/console/library/workflows/__placeholder__/__placeholder__.html +1 -1
- package/console/library/workflows/__placeholder__/__placeholder__.txt +17 -17
- package/console/library/workflows/executions/__next._full.txt +17 -17
- package/console/library/workflows/executions/__next._head.txt +4 -4
- package/console/library/workflows/executions/__next._index.txt +9 -9
- package/console/library/workflows/executions/__next._tree.txt +1 -1
- package/console/library/workflows/executions/__next.library.txt +5 -5
- package/console/library/workflows/executions/__next.library.workflows.executions.__PAGE__.txt +3 -3
- package/console/library/workflows/executions/__next.library.workflows.executions.txt +3 -3
- package/console/library/workflows/executions/__next.library.workflows.txt +3 -3
- package/console/library/workflows/executions.html +1 -1
- package/console/library/workflows/executions.txt +17 -17
- package/console/library/workflows/new/__next._full.txt +18 -18
- package/console/library/workflows/new/__next._head.txt +4 -4
- package/console/library/workflows/new/__next._index.txt +9 -9
- package/console/library/workflows/new/__next._tree.txt +1 -1
- package/console/library/workflows/new/__next.library.txt +5 -5
- package/console/library/workflows/new/__next.library.workflows.new.__PAGE__.txt +4 -4
- package/console/library/workflows/new/__next.library.workflows.new.txt +3 -3
- package/console/library/workflows/new/__next.library.workflows.txt +3 -3
- package/console/library/workflows/new.html +1 -1
- package/console/library/workflows/new.txt +18 -18
- package/console/library/workflows.html +1 -1
- package/console/library/workflows.txt +17 -17
- package/console/library.html +1 -1
- package/console/library.txt +17 -17
- package/console/login/__next._full.txt +17 -17
- package/console/login/__next._head.txt +4 -4
- package/console/login/__next._index.txt +9 -9
- package/console/login/__next._tree.txt +1 -1
- package/console/login/__next.login.__PAGE__.txt +4 -4
- package/console/login/__next.login.txt +3 -3
- package/console/login.html +1 -1
- package/console/login.txt +17 -17
- package/console/oauth/slack/callback/__next._full.txt +16 -16
- package/console/oauth/slack/callback/__next._head.txt +4 -4
- package/console/oauth/slack/callback/__next._index.txt +9 -9
- package/console/oauth/slack/callback/__next._tree.txt +1 -1
- package/console/oauth/slack/callback/__next.oauth.slack.callback.__PAGE__.txt +4 -4
- package/console/oauth/slack/callback/__next.oauth.slack.callback.txt +3 -3
- package/console/oauth/slack/callback/__next.oauth.slack.txt +3 -3
- package/console/oauth/slack/callback/__next.oauth.txt +3 -3
- package/console/oauth/slack/callback.html +1 -1
- package/console/oauth/slack/callback.txt +16 -16
- package/console/sessions/__placeholder__/__next._full.txt +14 -14
- package/console/sessions/__placeholder__/__next._head.txt +4 -4
- package/console/sessions/__placeholder__/__next._index.txt +9 -9
- package/console/sessions/__placeholder__/__next._tree.txt +1 -1
- package/console/sessions/__placeholder__/__next.sessions.$d$id.__PAGE__.txt +2 -2
- package/console/sessions/__placeholder__/__next.sessions.$d$id.txt +3 -3
- package/console/sessions/__placeholder__/__next.sessions.txt +3 -3
- package/console/sessions/__placeholder__.html +1 -1
- package/console/sessions/__placeholder__.txt +14 -14
- package/console/settings/__next._full.txt +18 -18
- package/console/settings/__next._head.txt +4 -4
- package/console/settings/__next._index.txt +9 -9
- package/console/settings/__next._tree.txt +1 -1
- package/console/settings/__next.settings.__PAGE__.txt +4 -4
- package/console/settings/__next.settings.txt +5 -5
- package/console/settings/account-preferences/__next._full.txt +17 -17
- package/console/settings/account-preferences/__next._head.txt +4 -4
- package/console/settings/account-preferences/__next._index.txt +9 -9
- package/console/settings/account-preferences/__next._tree.txt +1 -1
- package/console/settings/account-preferences/__next.settings.account-preferences.__PAGE__.txt +3 -3
- package/console/settings/account-preferences/__next.settings.account-preferences.txt +3 -3
- package/console/settings/account-preferences/__next.settings.txt +5 -5
- package/console/settings/account-preferences.html +1 -1
- package/console/settings/account-preferences.txt +17 -17
- package/console/settings/api-keys/__next._full.txt +17 -17
- package/console/settings/api-keys/__next._head.txt +4 -4
- package/console/settings/api-keys/__next._index.txt +9 -9
- package/console/settings/api-keys/__next._tree.txt +1 -1
- package/console/settings/api-keys/__next.settings.api-keys.__PAGE__.txt +3 -3
- package/console/settings/api-keys/__next.settings.api-keys.txt +3 -3
- package/console/settings/api-keys/__next.settings.txt +5 -5
- package/console/settings/api-keys.html +1 -1
- package/console/settings/api-keys.txt +17 -17
- package/console/settings/billing/__next._full.txt +18 -18
- package/console/settings/billing/__next._head.txt +4 -4
- package/console/settings/billing/__next._index.txt +9 -9
- package/console/settings/billing/__next._tree.txt +1 -1
- package/console/settings/billing/__next.settings.billing.__PAGE__.txt +4 -4
- package/console/settings/billing/__next.settings.billing.txt +3 -3
- package/console/settings/billing/__next.settings.txt +5 -5
- package/console/settings/billing.html +1 -1
- package/console/settings/billing.txt +18 -18
- package/console/settings/channel-apps/__next._full.txt +17 -17
- package/console/settings/channel-apps/__next._head.txt +4 -4
- package/console/settings/channel-apps/__next._index.txt +9 -9
- package/console/settings/channel-apps/__next._tree.txt +1 -1
- package/console/settings/channel-apps/__next.settings.channel-apps.__PAGE__.txt +3 -3
- package/console/settings/channel-apps/__next.settings.channel-apps.txt +3 -3
- package/console/settings/channel-apps/__next.settings.txt +5 -5
- package/console/settings/channel-apps.html +1 -1
- package/console/settings/channel-apps.txt +17 -17
- package/console/settings/cursor-accounts/__next._full.txt +18 -18
- package/console/settings/cursor-accounts/__next._head.txt +4 -4
- package/console/settings/cursor-accounts/__next._index.txt +9 -9
- package/console/settings/cursor-accounts/__next._tree.txt +1 -1
- package/console/settings/cursor-accounts/__next.settings.cursor-accounts.__PAGE__.txt +4 -4
- package/console/settings/cursor-accounts/__next.settings.cursor-accounts.txt +3 -3
- package/console/settings/cursor-accounts/__next.settings.txt +5 -5
- package/console/settings/cursor-accounts.html +1 -1
- package/console/settings/cursor-accounts.txt +18 -18
- package/console/settings/environments/__next._full.txt +17 -17
- package/console/settings/environments/__next._head.txt +4 -4
- package/console/settings/environments/__next._index.txt +9 -9
- package/console/settings/environments/__next._tree.txt +1 -1
- package/console/settings/environments/__next.settings.environments.__PAGE__.txt +3 -3
- package/console/settings/environments/__next.settings.environments.txt +3 -3
- package/console/settings/environments/__next.settings.txt +5 -5
- package/console/settings/environments.html +1 -1
- package/console/settings/environments.txt +17 -17
- package/console/settings/identity-providers/__next._full.txt +17 -17
- package/console/settings/identity-providers/__next._head.txt +4 -4
- package/console/settings/identity-providers/__next._index.txt +9 -9
- package/console/settings/identity-providers/__next._tree.txt +1 -1
- package/console/settings/identity-providers/__next.settings.identity-providers.__PAGE__.txt +3 -3
- package/console/settings/identity-providers/__next.settings.identity-providers.txt +3 -3
- package/console/settings/identity-providers/__next.settings.txt +5 -5
- package/console/settings/identity-providers.html +1 -1
- package/console/settings/identity-providers.txt +17 -17
- package/console/settings/invitations/__next._full.txt +17 -17
- package/console/settings/invitations/__next._head.txt +4 -4
- package/console/settings/invitations/__next._index.txt +9 -9
- package/console/settings/invitations/__next._tree.txt +1 -1
- package/console/settings/invitations/__next.settings.invitations.__PAGE__.txt +3 -3
- package/console/settings/invitations/__next.settings.invitations.txt +3 -3
- package/console/settings/invitations/__next.settings.txt +5 -5
- package/console/settings/invitations.html +1 -1
- package/console/settings/invitations.txt +17 -17
- package/console/settings/members/__next._full.txt +17 -17
- package/console/settings/members/__next._head.txt +4 -4
- package/console/settings/members/__next._index.txt +9 -9
- package/console/settings/members/__next._tree.txt +1 -1
- package/console/settings/members/__next.settings.members.__PAGE__.txt +3 -3
- package/console/settings/members/__next.settings.members.txt +3 -3
- package/console/settings/members/__next.settings.txt +5 -5
- package/console/settings/members.html +1 -1
- package/console/settings/members.txt +17 -17
- package/console/settings/memory/__next._full.txt +17 -17
- package/console/settings/memory/__next._head.txt +4 -4
- package/console/settings/memory/__next._index.txt +9 -9
- package/console/settings/memory/__next._tree.txt +1 -1
- package/console/settings/memory/__next.settings.memory.__PAGE__.txt +3 -3
- package/console/settings/memory/__next.settings.memory.txt +3 -3
- package/console/settings/memory/__next.settings.txt +5 -5
- package/console/settings/memory.html +1 -1
- package/console/settings/memory.txt +17 -17
- package/console/settings/oauth-apps/__next._full.txt +17 -17
- package/console/settings/oauth-apps/__next._head.txt +4 -4
- package/console/settings/oauth-apps/__next._index.txt +9 -9
- package/console/settings/oauth-apps/__next._tree.txt +1 -1
- package/console/settings/oauth-apps/__next.settings.oauth-apps.__PAGE__.txt +3 -3
- package/console/settings/oauth-apps/__next.settings.oauth-apps.txt +3 -3
- package/console/settings/oauth-apps/__next.settings.txt +5 -5
- package/console/settings/oauth-apps.html +1 -1
- package/console/settings/oauth-apps.txt +17 -17
- package/console/settings/org-preferences/__next._full.txt +17 -17
- package/console/settings/org-preferences/__next._head.txt +4 -4
- package/console/settings/org-preferences/__next._index.txt +9 -9
- package/console/settings/org-preferences/__next._tree.txt +1 -1
- package/console/settings/org-preferences/__next.settings.org-preferences.__PAGE__.txt +3 -3
- package/console/settings/org-preferences/__next.settings.org-preferences.txt +3 -3
- package/console/settings/org-preferences/__next.settings.txt +5 -5
- package/console/settings/org-preferences.html +1 -1
- package/console/settings/org-preferences.txt +17 -17
- package/console/settings/org-profile/__next._full.txt +17 -17
- package/console/settings/org-profile/__next._head.txt +4 -4
- package/console/settings/org-profile/__next._index.txt +9 -9
- package/console/settings/org-profile/__next._tree.txt +1 -1
- package/console/settings/org-profile/__next.settings.org-profile.__PAGE__.txt +3 -3
- package/console/settings/org-profile/__next.settings.org-profile.txt +3 -3
- package/console/settings/org-profile/__next.settings.txt +5 -5
- package/console/settings/org-profile.html +1 -1
- package/console/settings/org-profile.txt +17 -17
- package/console/settings/platform-clients/__next._full.txt +17 -17
- package/console/settings/platform-clients/__next._head.txt +4 -4
- package/console/settings/platform-clients/__next._index.txt +9 -9
- package/console/settings/platform-clients/__next._tree.txt +1 -1
- package/console/settings/platform-clients/__next.settings.platform-clients.__PAGE__.txt +3 -3
- package/console/settings/platform-clients/__next.settings.platform-clients.txt +3 -3
- package/console/settings/platform-clients/__next.settings.txt +5 -5
- package/console/settings/platform-clients.html +1 -1
- package/console/settings/platform-clients.txt +17 -17
- package/console/settings/pricing-governance/__next._full.txt +18 -18
- package/console/settings/pricing-governance/__next._head.txt +4 -4
- package/console/settings/pricing-governance/__next._index.txt +9 -9
- package/console/settings/pricing-governance/__next._tree.txt +1 -1
- package/console/settings/pricing-governance/__next.settings.pricing-governance.__PAGE__.txt +4 -4
- package/console/settings/pricing-governance/__next.settings.pricing-governance.txt +3 -3
- package/console/settings/pricing-governance/__next.settings.txt +5 -5
- package/console/settings/pricing-governance.html +1 -1
- package/console/settings/pricing-governance.txt +18 -18
- package/console/settings/provider-standing/__next._full.txt +18 -18
- package/console/settings/provider-standing/__next._head.txt +4 -4
- package/console/settings/provider-standing/__next._index.txt +9 -9
- package/console/settings/provider-standing/__next._tree.txt +1 -1
- package/console/settings/provider-standing/__next.settings.provider-standing.__PAGE__.txt +4 -4
- package/console/settings/provider-standing/__next.settings.provider-standing.txt +3 -3
- package/console/settings/provider-standing/__next.settings.txt +5 -5
- package/console/settings/provider-standing.html +1 -1
- package/console/settings/provider-standing.txt +18 -18
- package/console/settings/usage/__next._full.txt +17 -17
- package/console/settings/usage/__next._head.txt +4 -4
- package/console/settings/usage/__next._index.txt +9 -9
- package/console/settings/usage/__next._tree.txt +1 -1
- package/console/settings/usage/__next.settings.txt +5 -5
- package/console/settings/usage/__next.settings.usage.__PAGE__.txt +3 -3
- package/console/settings/usage/__next.settings.usage.txt +3 -3
- package/console/settings/usage.html +1 -1
- package/console/settings/usage.txt +17 -17
- package/console/settings.html +1 -1
- package/console/settings.txt +18 -18
- package/console/workflows/__next._full.txt +14 -14
- package/console/workflows/__next._head.txt +4 -4
- package/console/workflows/__next._index.txt +9 -9
- package/console/workflows/__next._tree.txt +1 -1
- package/console/workflows/__next.workflows.__PAGE__.txt +2 -2
- package/console/workflows/__next.workflows.txt +3 -3
- package/console/workflows/__placeholder__/__placeholder__/__next._full.txt +15 -15
- package/console/workflows/__placeholder__/__placeholder__/__next._head.txt +4 -4
- package/console/workflows/__placeholder__/__placeholder__/__next._index.txt +9 -9
- package/console/workflows/__placeholder__/__placeholder__/__next._tree.txt +1 -1
- package/console/workflows/__placeholder__/__placeholder__/__next.workflows.$d$org.$d$slug.__PAGE__.txt +3 -3
- package/console/workflows/__placeholder__/__placeholder__/__next.workflows.$d$org.$d$slug.txt +3 -3
- package/console/workflows/__placeholder__/__placeholder__/__next.workflows.$d$org.txt +3 -3
- package/console/workflows/__placeholder__/__placeholder__/__next.workflows.txt +3 -3
- package/console/workflows/__placeholder__/__placeholder__.html +1 -1
- package/console/workflows/__placeholder__/__placeholder__.txt +15 -15
- package/console/workflows/executions/__next._full.txt +14 -14
- package/console/workflows/executions/__next._head.txt +4 -4
- package/console/workflows/executions/__next._index.txt +9 -9
- package/console/workflows/executions/__next._tree.txt +1 -1
- package/console/workflows/executions/__next.workflows.executions.__PAGE__.txt +2 -2
- package/console/workflows/executions/__next.workflows.executions.txt +3 -3
- package/console/workflows/executions/__next.workflows.txt +3 -3
- package/console/workflows/executions/__placeholder__/__next._full.txt +15 -15
- package/console/workflows/executions/__placeholder__/__next._head.txt +4 -4
- package/console/workflows/executions/__placeholder__/__next._index.txt +9 -9
- package/console/workflows/executions/__placeholder__/__next._tree.txt +1 -1
- package/console/workflows/executions/__placeholder__/__next.workflows.executions.$d$id.__PAGE__.txt +3 -3
- package/console/workflows/executions/__placeholder__/__next.workflows.executions.$d$id.txt +3 -3
- package/console/workflows/executions/__placeholder__/__next.workflows.executions.txt +3 -3
- package/console/workflows/executions/__placeholder__/__next.workflows.txt +3 -3
- package/console/workflows/executions/__placeholder__.html +1 -1
- package/console/workflows/executions/__placeholder__.txt +15 -15
- package/console/workflows/executions.html +1 -1
- package/console/workflows/executions.txt +14 -14
- package/console/workflows.html +1 -1
- package/console/workflows.txt +14 -14
- package/main.js +7 -7
- package/package.json +6 -6
- package/workflow-bundle-agent-execution.js +1 -0
- package/workflow-bundle-schedule.js +1 -0
- package/workflow-bundle-workflow-execution.js +1 -0
- package/console/_next/static/chunks/06d139oapey.-.js +0 -1
- package/console/_next/static/chunks/0n2qydw3oc1oj.js +0 -1
- package/console/_next/static/chunks/0uq41itbafxa3.js +0 -3
- package/console/_next/static/chunks/0xr1dk~mec2dn.js +0 -1
- /package/console/_next/static/{AFZ5DiemTG8Wcz0l7Fw6k → 8wj8rj8lHRqNPvB9OCQPr}/_buildManifest.js +0 -0
- /package/console/_next/static/{AFZ5DiemTG8Wcz0l7Fw6k → 8wj8rj8lHRqNPvB9OCQPr}/_clientMiddlewareManifest.js +0 -0
- /package/console/_next/static/{AFZ5DiemTG8Wcz0l7Fw6k → 8wj8rj8lHRqNPvB9OCQPr}/_ssgManifest.js +0 -0
|
@@ -11313,3 +11313,4 @@ exports.importInterceptors = function importInterceptors() {
|
|
|
11313
11313
|
__TEMPORAL__ = __webpack_exports__;
|
|
11314
11314
|
/******/ })()
|
|
11315
11315
|
;
|
|
11316
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBNEM7WUFDNUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDakIsQ0FBQztZQUNGLElBQUksR0FBRyxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMs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WSxtQkFBTyxDQUFDLGlIQUE4QztBQUNsRSxXQUFXOztBQUVYLFFBQVEsa0JBQWtCLEVBQUUsbUJBQU8sQ0FBQyxpSEFBOEM7QUFDbEY7O0FBRUEsc0JBQXNCOztBQUV0Qjs7QUFFQSx1QkFBdUI7QUFDdkIsU0FBUyxtQkFBTyw0QkFBNEIsZ0dBQTZHO0FBQ3pKOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udGludWUtYXMtbmV3LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2RhdGEtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtY29kZWMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci90eXBlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2RlcHJlY2F0ZWQtdGltZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2VuY29kaW5nLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZXJyb3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZmFpbHVyZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJjZXB0b3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJmYWNlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcm5hbC13b3JrZmxvdy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L29iamVjdHMtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2xvZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL21ldHJpY3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9wcmlvcml0eS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3Jlc2VydmVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvcmV0cnktcG9saWN5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvc2VhcmNoLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdHlwZS1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdXNlci1tZXRhZGF0YS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy92ZXJzaW9uaW5nLWludGVudC50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtlci1kZXBsb3ltZW50cy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWhhbmRsZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LW9wdGlvbnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2FsZWEudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2NhbmNlbGxhdGlvbi1zY29wZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZXJyb3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9mbGFncy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1vdmVycmlkZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmNlcHRvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyZmFjZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVybmFscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbG9ncy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbWV0cmljcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbmV4dXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3BrZy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc2lua3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3N0YWNrLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3RyaWdnZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3VwZGF0ZS1zY29wZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvd29ya2VyLWludGVyZmFjZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvd29ya2Zsb3cudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9jb21tb24vaGFuZGxlci1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9vcGVyYXRpb24tZXJyb3IudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9vcGVyYXRpb24taGFuZGxlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvc2VydmljZS1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zdGFydC1vcGVyYXRpb24tcmVzdWx0LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbnRlcm5hbC9vYmplY3QtdXRpbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbnRlcm5hbC9zeW1ib2wtaW5zdGFuY2VvZi50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2UvaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2UvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9zZXJ2aWNlL3NlcnZpY2UtZGVmaW5pdGlvbi50cyIsImlnbm9yZWR8L2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYnxfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlciIsImlnbm9yZWR8L2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYnxfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlciIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vbm9kZV9tb2R1bGVzL21zL2Rpc3QvaW5kZXguY2pzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvbm9kZV9tb2R1bGVzL2xvbmcvdW1kL2luZGV4LmpzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvc3JjL3RlbXBvcmFsL3NjaGVkdWxlL25hbWVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc3RpZ21lci9zdGlnbWVyL2JhY2tlbmQvc2VydmljZXMvc3RpZ21lci1zZXJ2ZXIvc3JjL3RlbXBvcmFsL3NjaGVkdWxlL3dvcmtmbG93cy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL3NyYy90ZW1wb3JhbC9zY2hlZHVsZS93b3JrZmxvd3MvdGljay50cyIsIndlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCIvaG9tZS9ydW5uZXIvd29yay9zdGlnbWVyL3N0aWdtZXIvYmFja2VuZC9zZXJ2aWNlcy9zdGlnbWVyLXNlcnZlci9kaXN0L3RlbXBvcmFsL3NjaGVkdWxlL3dvcmtmbG93cy9pbmRleC1hdXRvZ2VuZXJhdGVkLWVudHJ5cG9pbnQuY2pzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzSG9sZGVyIHtcbiAgZGV0YWlscz86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNPcHRpb25zIHtcbiAgbm90Rm91bmQ/OiBib29sZWFuO1xuICBjYW5jZWxSZXF1ZXN0ZWQ/OiBib29sZWFuO1xuICBwYXVzZWQ/OiBib29sZWFuO1xuICB0aW1lZE91dD86IGJvb2xlYW47XG4gIHdvcmtlclNodXRkb3duPzogYm9vbGVhbjtcbiAgcmVzZXQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZWFzb25zIGZvciB0aGUgYWN0aXZpdHkncyBjYW5jZWxsYXRpb24uIENhbmNlbGxhdGlvbiBkZXRhaWxzIGFyZSBzZXQgb25jZSBhbmQgZG8gbm90IGNoYW5nZSBvbmNlIHNldC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB7XG4gIHJlYWRvbmx5IG5vdEZvdW5kOiBib29sZWFuO1xuICByZWFkb25seSBjYW5jZWxSZXF1ZXN0ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGltZWRPdXQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdvcmtlclNodXRkb3duOiBib29sZWFuO1xuICByZWFkb25seSByZXNldDogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5ub3RGb3VuZCA9IG9wdGlvbnMubm90Rm91bmQgPz8gZmFsc2U7XG4gICAgdGhpcy5jYW5jZWxSZXF1ZXN0ZWQgPSBvcHRpb25zLmNhbmNlbFJlcXVlc3RlZCA/PyBmYWxzZTtcbiAgICB0aGlzLnBhdXNlZCA9IG9wdGlvbnMucGF1c2VkID8/IGZhbHNlO1xuICAgIHRoaXMudGltZWRPdXQgPSBvcHRpb25zLnRpbWVkT3V0ID8/IGZhbHNlO1xuICAgIHRoaXMud29ya2VyU2h1dGRvd24gPSBvcHRpb25zLndvcmtlclNodXRkb3duID8/IGZhbHNlO1xuICAgIHRoaXMucmVzZXQgPSBvcHRpb25zLnJlc2V0ID8/IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Qcm90byhcbiAgICBwcm90bzogY29yZXNkay5hY3Rpdml0eV90YXNrLklBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB7XG4gICAgaWYgKHByb3RvID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzKHtcbiAgICAgIG5vdEZvdW5kOiBwcm90by5pc05vdEZvdW5kID8/IGZhbHNlLFxuICAgICAgY2FuY2VsUmVxdWVzdGVkOiBwcm90by5pc0NhbmNlbGxlZCA/PyBmYWxzZSxcbiAgICAgIHBhdXNlZDogcHJvdG8uaXNQYXVzZWQgPz8gZmFsc2UsXG4gICAgICB0aW1lZE91dDogcHJvdG8uaXNUaW1lZE91dCA/PyBmYWxzZSxcbiAgICAgIHdvcmtlclNodXRkb3duOiBwcm90by5pc1dvcmtlclNodXRkb3duID8/IGZhbHNlLFxuICAgICAgcmVzZXQ6IHByb3RvLmlzUmVzZXQgPz8gZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgVmVyc2lvbmluZ0ludGVudCB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5cbi8vIE5vdGU6IFRoZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgaGVyZSBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoZXkgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkXG4vLyBpbiB0aGUgJ3dvcmtmbG93JyBwYWNrYWdlLCBpbnN0ZWFkIG9mICdjb21tb24nLiBUaGV5IGFyZSBub3cgcmVleHBvcnRlZCBmcm9tIHRoZSAnd29ya2Zsb3cnXG4vLyBwYWNrYWdlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBpbXBvcnQgdGhlbSwgYnV0IHdlIHVuZm9ydHVuYXRlbHkgY2FuJ3QgcmVtb3ZlIHRoZW0gZnJvbVxuLy8gaGVyZSBhcyB0aGF0IHdvdWxkIGJlIGEgYnJlYWtpbmcgY2hhbmdlLlxuXG4vKipcbiAqIERldGVybWluZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAqXG4gKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eU9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgYW5kXG4vLyAgICAgICAgICAgICAgYExvY2FsQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkcyBsYXRlciBpbiB0aGlzIGZpbGUuXG5leHBvcnQgY29uc3QgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIEFjdGl2aXR5LCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYWN0dWFsbHkgYmUgZGVsaXZlcmVkIHRvIHRoZSBBY3Rpdml0eTsgZS5nLiB0aGUgY2FsbGluZyBXb3JrZmxvd1xuICAgKiBtYXkgZXhpdCBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGNvbXBsZXRlZCwgb3IgdGhlIEFjdGl2aXR5IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseVxuICAgKiBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZSBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlXG4gICAqIHdvcmtmbG93IHRoaW5rcyB0aGUgYWN0aXZpdHkgd2FzIGNhbmNlbGxlZCwgYnV0IHRoZSBhY3Rpdml0eSBhY3R1YWxseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhhdCB0aGUgV29ya2Zsb3cgaXMgcHJvcGVybHkgaW5mb3JtZWQgb2YgdGhlIEFjdGl2aXR5J3MgZmluYWwgc3RhdGUgKGkuZS4gZWl0aGVyXG4gICAqIGNvbXBsZXRpb24gb3IgY2FuY2VsbGF0aW9uKSwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCBhbmQgd2FpdCBmb3IgdGhlIGFjdGl2aXR5XG4gICAqIHRvIGNvbXBsZXRlIGl0cyBleGVjdXRpb24gKGVpdGhlciBzdWNjZXNzZnVsbHksIHVuY2Vzc2Z1bGx5LCBvciBhcyBjYW5jZWxsZWQpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYSBjYW5jZWxsYXRpb24gbm90aWZpY2F0aW9uLiBUaGlzIGNhbiBibG9ja1xuICAgKiB0aGUgV29ya2Zsb3cncyBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIHRoZSBBY3Rpdml0eSBkb2Vzbid0IGhlYXJ0YmVhdCBvciBjaG9vc2VzIHRvXG4gICAqIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9ICh0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsIGRlY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDAsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAxLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDIsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlbW90ZSBhY3Rpdml0eSBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdG8gdXNlIGZvciB0cmFja2luZyB0aGUgYWN0aXZpdHkgaW4gV29ya2Zsb3cgaGlzdG9yeS5cbiAgICogVGhlIGBhY3Rpdml0eUlkYCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uLlxuICAgKiBEb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyXG4gICAqL1xuICBhY3Rpdml0eUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGN1cnJlbnQgd29ya2VyIHRhc2sgcXVldWVcbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSGVhcnRiZWF0IGludGVydmFsLiBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCBiZWZvcmUgdGhpcyBpbnRlcnZhbCBwYXNzZXMgYWZ0ZXIgYSBsYXN0IGhlYXJ0YmVhdCBvciBhY3Rpdml0eSBzdGFydC5cbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBoZWFydGJlYXRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lIGhvdyBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBzZXJ2ZXItZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuIFRvIGVuc3VyZSB6ZXJvIHJldHJpZXMsIHNldCBtYXhpbXVtIGF0dGVtcHRzIHRvIDEuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgb2YgYSBzaW5nbGUgQWN0aXZpdHkgZXhlY3V0aW9uIGF0dGVtcHQuIE5vdGUgdGhhdCB0aGUgVGVtcG9yYWwgU2VydmVyIGRvZXNuJ3QgZGV0ZWN0IFdvcmtlciBwcm9jZXNzXG4gICAqIGZhaWx1cmVzIGRpcmVjdGx5OiBpbnN0ZWFkLCBpdCByZWxpZXMgb24gdGhpcyB0aW1lb3V0IHRvIGRldGVjdCB0aGF0IGFuIEFjdGl2aXR5IGRpZG4ndCBjb21wbGV0ZSBvbiB0aW1lLiBUaGVyZWZvcmUsIHRoaXNcbiAgICogdGltZW91dCBzaG91bGQgYmUgYXMgc2hvcnQgYXMgdGhlIGxvbmdlc3QgcG9zc2libGUgZXhlY3V0aW9uIG9mIHRoZSBBY3Rpdml0eSBib2R5LiBQb3RlbnRpYWxseSBsb25nLXJ1bm5pbmdcbiAgICogQWN0aXZpdGllcyBtdXN0IHNwZWNpZnkge0BsaW5rIGhlYXJ0YmVhdFRpbWVvdXR9IGFuZCBjYWxsIHtAbGluayBhY3Rpdml0eS5Db250ZXh0LmhlYXJ0YmVhdH0gcGVyaW9kaWNhbGx5IGZvclxuICAgKiB0aW1lbHkgZmFpbHVyZSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRpbWUgdGhhdCB0aGUgQWN0aXZpdHkgVGFzayBjYW4gc3RheSBpbiB0aGUgVGFzayBRdWV1ZSBiZWZvcmUgaXQgaXMgcGlja2VkIHVwIGJ5IGEgV29ya2VyLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHRpbWVvdXQgdW5sZXNzIHVzaW5nIGhvc3Qtc3BlY2lmaWMgVGFzayBRdWV1ZXMgZm9yIEFjdGl2aXR5IFRhc2tzIGFyZSBiZWluZyB1c2VkIGZvciByb3V0aW5nLlxuICAgKiBgc2NoZWR1bGVUb1N0YXJ0VGltZW91dGAgaXMgYWx3YXlzIG5vbi1yZXRyeWFibGUuIFJldHJ5aW5nIGFmdGVyIHRoaXMgdGltZW91dCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgaXQgd291bGQganVzdCBwdXQgdGhlIEFjdGl2aXR5IFRhc2sgYmFjayBpbnRvIHRoZSBzYW1lIFRhc2sgUXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRvdGFsIHRpbWUgdGhhdCBhIHdvcmtmbG93IGlzIHdpbGxpbmcgdG8gd2FpdCBmb3IgdGhlIEFjdGl2aXR5IHRvIGNvbXBsZXRlLlxuICAgKiBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgbGltaXRzIHRoZSB0b3RhbCB0aW1lIG9mIGFuIEFjdGl2aXR5J3MgZXhlY3V0aW9uIGluY2x1ZGluZyByZXRyaWVzICh1c2Uge0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IHRvIGxpbWl0IHRoZSB0aW1lIG9mIGEgc2luZ2xlIGF0dGVtcHQpLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHk7IGFuZFxuICAgKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAgICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAgICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gICAqIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlIEFjdGl2aXR5IGNhbGwgd2FzIG1hZGUuIFRlcm1pbmF0aW9uIG9mIGEgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICAgKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBFYWdlciBkaXNwYXRjaCBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpbXByb3ZlcyB0aGUgdGhyb3VnaHB1dCBhbmQgbG9hZCBvbiB0aGUgc2VydmVyIGZvciBzY2hlZHVsaW5nIEFjdGl2aXRpZXMuXG4gICAqIFdoZW4gdXNlZCwgdGhlIHNlcnZlciB3aWxsIGhhbmQgb3V0IEFjdGl2aXR5IHRhc2tzIGJhY2sgdG8gdGhlIFdvcmtlciB3aGVuIGl0IGNvbXBsZXRlcyBhIFdvcmtmbG93IHRhc2suXG4gICAqIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHNlcnZlciB2ZXJzaW9uIDEuMTcgYmVoaW5kIHRoZSBgc3lzdGVtLmVuYWJsZUFjdGl2aXR5RWFnZXJFeGVjdXRpb25gIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogRWFnZXIgZGlzcGF0Y2ggd2lsbCBvbmx5IGJlIHVzZWQgaWYgYGFsbG93RWFnZXJEaXNwYXRjaGAgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIGFuZCB7QGxpbmsgdGFza1F1ZXVlfSBpcyBlaXRoZXJcbiAgICogb21pdHRlZCBvciB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dFYWdlckRpc3BhdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBBY3Rpdml0eSBzaG91bGQgcnVuIG9uIGFcbiAgICogd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyBhY3Rpdml0eVxuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBsb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eU9wdGlvbnMge1xuICAvKipcbiAgICogUmV0cnlQb2xpY3kgdGhhdCBkZWZpbmVzIGhvdyBhbiBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBTREstZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuXG4gICAqIE5vdGUgdGhhdCBsb2NhbCBhY3Rpdml0aWVzIGFyZSBhbHdheXMgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSwgZXZlbiBpZiBtYXhpbXVtIGF0dGVtcHRzIGlzIHNldCB0byAxIGR1ZSB0byBXb3JrZmxvdyB0YXNrIHJldHJpZXMuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSBhZnRlciB0aGUgdGFzayBpcyBkaXNwYXRjaGVkLiBUaGlzXG4gICAqIHRpbWVvdXQgaXMgYWx3YXlzIHJldHJ5YWJsZS5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICogSWYgc2V0LCB0aGlzIG11c3QgYmUgPD0ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9LCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgY2xhbXBlZCBkb3duLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGltaXRzIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGNhbiBpZGxlIGludGVybmFsbHkgYmVmb3JlIGJlaW5nIGV4ZWN1dGVkLiBUaGF0IGNhbiBoYXBwZW4gaWZcbiAgICogdGhlIHdvcmtlciBpcyBjdXJyZW50bHkgYXQgbWF4IGNvbmN1cnJlbnQgbG9jYWwgYWN0aXZpdHkgZXhlY3V0aW9ucy4gVGhpcyB0aW1lb3V0IGlzIGFsd2F5c1xuICAgKiBub24gcmV0cnlhYmxlIGFzIGFsbCBhIHJldHJ5IHdvdWxkIGFjaGlldmUgaXMgdG8gcHV0IGl0IGJhY2sgaW50byB0aGUgc2FtZSBxdWV1ZS4gRGVmYXVsdHNcbiAgICogdG8ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9IGlmIG5vdCBzcGVjaWZpZWQgYW5kIHRoYXQgaXMgc2V0LiBNdXN0IGJlIDw9XG4gICAqIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSB3aGVuIHNldCwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaG93IGxvbmcgdGhlIGNhbGxlciBpcyB3aWxsaW5nIHRvIHdhaXQgZm9yIGxvY2FsIGFjdGl2aXR5IGNvbXBsZXRpb24uIExpbWl0cyBob3dcbiAgICogbG9uZyByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhY3Rpdml0eSBpcyByZXRyeWluZyBhbmQgYmFja29mZiB3b3VsZCBleGNlZWQgdGhpcyB2YWx1ZSwgYSBzZXJ2ZXIgc2lkZSB0aW1lciB3aWxsIGJlIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQgYXR0ZW1wdC5cbiAgICogT3RoZXJ3aXNlLCBiYWNrb2ZmIHdpbGwgaGFwcGVuIGludGVybmFsbHkgaW4gdGhlIFNESy5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBtaW51dGVcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqKi9cbiAgbG9jYWxSZXRyeVRocmVzaG9sZD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAgICogLSB3aGVuIHNob3VsZCB0aGUgQWN0aXZpdHkgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIHRvIFdvcmtmbG93IChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlXG4gICAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gY2FuY2VsbGF0aW9uIGJlaW5nXG4gICAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICAgKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKiBhbHdheXMgcmVzdWx0cyBpbiBjYW5jZWxsYXRpb24gb2YgaXRzIG91dHN0YW5kaW5nIEFjdGl2aXR5IGV4ZWN1dGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhvc2VcbiAgICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3VtbWFyeT86IHN0cmluZztcbn1cbiIsImltcG9ydCB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIsIEZhaWx1cmVDb252ZXJ0ZXIgfSBmcm9tICcuL2ZhaWx1cmUtY29udmVydGVyJztcbmltcG9ydCB7IFBheWxvYWRDb2RlYyB9IGZyb20gJy4vcGF5bG9hZC1jb2RlYyc7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciwgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHtcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBcHBsaWNhdGlvbkZhaWx1cmUsXG4gIENhbmNlbGxlZEZhaWx1cmUsXG4gIENoaWxkV29ya2Zsb3dGYWlsdXJlLFxuICBkZWNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZGVjb2RlUmV0cnlTdGF0ZSxcbiAgZGVjb2RlVGltZW91dFR5cGUsXG4gIGVuY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICBlbmNvZGVSZXRyeVN0YXRlLFxuICBlbmNvZGVUaW1lb3V0VHlwZSxcbiAgRkFJTFVSRV9TT1VSQ0UsXG4gIE5leHVzT3BlcmF0aW9uRmFpbHVyZSxcbiAgUHJvdG9GYWlsdXJlLFxuICBTZXJ2ZXJGYWlsdXJlLFxuICBUZW1wb3JhbEZhaWx1cmUsXG4gIFRlcm1pbmF0ZWRGYWlsdXJlLFxuICBUaW1lb3V0RmFpbHVyZSxcbn0gZnJvbSAnLi4vZmFpbHVyZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4uL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB7IGlzRXJyb3IgfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMgfSBmcm9tICcuLi90aW1lJztcbmltcG9ydCB7IGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7IGFycmF5RnJvbVBheWxvYWRzLCBmcm9tUGF5bG9hZHNBdEluZGV4LCBQYXlsb2FkQ29udmVydGVyLCB0b1BheWxvYWRzIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8vIENhbid0IGltcG9ydCBwcm90byBlbnVtcyBpbnRvIHRoZSB3b3JrZmxvdyBzYW5kYm94LCB1c2UgdGhpcyBoZWxwZXIgdHlwZSBhbmQgZW51bSBjb252ZXJ0ZXIgaW5zdGVhZC5cbmNvbnN0IE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9IHtcbiAgUkVUUllBQkxFOiAnUkVUUllBQkxFJyxcbiAgTk9OX1JFVFJZQUJMRTogJ05PTl9SRVRSWUFCTEUnLFxufSBhcyBjb25zdDtcbnR5cGUgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yID1cbiAgKHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IpW2tleW9mIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3JdO1xuXG5jb25zdCBbZW5jb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLCBkZWNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAgdHlwZW9mIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIFtOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IuUkVUUllBQkxFXTogMSxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLk5PTl9SRVRSWUFCTEVdOiAyLFxuICB9IGFzIGNvbnN0LFxuICAnTkVYVVNfSEFORExFUl9FUlJPUl9SRVRSWV9CRUhBVklPUl8nXG4pO1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnRXhwKC4uLnJlZ2V4cHM6IFJlZ0V4cFtdKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwcy5tYXAoKHgpID0+IGAoPzoke3guc291cmNlfSlgKS5qb2luKCd8JykpO1xufVxuXG4vKipcbiAqIFN0YWNrIHRyYWNlcyB3aWxsIGJlIGN1dG9mZiB3aGVuIG9uIG9mIHRoZXNlIHBhdHRlcm5zIGlzIG1hdGNoZWRcbiAqL1xuY29uc3QgQ1VUT0ZGX1NUQUNLX1BBVFRFUk5TID0gY29tYmluZVJlZ0V4cChcbiAgLyoqIEFjdGl2aXR5IGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0IChBY3Rpdml0eVxcLik/ZXhlY3V0ZSBcXCguKltcXFxcL113b3JrZXJbXFxcXC9dKD86c3JjfGxpYilbXFxcXC9dYWN0aXZpdHlcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogTmV4dXMgZXhlY3V0aW9uICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKE5leHVzSGFuZGxlclxcLik/aW52b2tlVXNlckNvZGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXW5leHVzW1xcXFwvXWluZGV4XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIFdvcmtmbG93IGFjdGl2YXRpb24gKGluYm91bmQgaGFuZGxlcnMgb25seSkgKi9cbiAgL1xccythdCggYXN5bmMpPyAoQWN0aXZhdG9yXFwuKT8oc3RhcnRXb3JrZmxvd3xxdWVyeVdvcmtmbG93fHNpZ25hbFdvcmtmbG93fHVwZGF0ZXx2YWxpZGF0ZVVwZGF0ZSlOZXh0SGFuZGxlciBcXCguKlxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBydW4gYW55dGhpbmcgaW4gY29udGV4dCAqL1xuICAvXFxzK2F0IChTY3JpcHRcXC4pP3J1bkluQ29udGV4dCBcXChuYXRpdmV8dW5rbm93bnwoPzooPzpub2RlOnZtfHZtXFwuanMpOlxcZCs6XFxkKylcXCkvXG4pO1xuXG4vKipcbiAqIEFueSBzdGFjayB0cmFjZSBmcmFtZXMgdGhhdCBtYXRjaCBhbnkgb2YgdGhvc2Ugd2lsIGJlIGRvcHBlZC5cbiAqIFRoZSBcIm51bGwuXCIgcHJlZml4IG9uIHNvbWUgY2FzZXMgaXMgdG8gYXZvaWQgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MjQxN1xuICovXG5jb25zdCBEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/bmV4dCBcXCguKltcXFxcL11jb21tb25bXFxcXC9dKD86c3JjfGxpYilbXFxcXC9daW50ZXJjZXB0b3JzXFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNoYWluIGludGVyY2VwdG9ycyAqL1xuICAvXFxzK2F0IChudWxsXFwuKT9leGVjdXRlTmV4dEhhbmRsZXIgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpL1xuKTtcblxuLyoqXG4gKiBDdXRzIG91dCB0aGUgZnJhbWV3b3JrIHBhcnQgb2YgYSBzdGFjayB0cmFjZSwgbGVhdmluZyBvbmx5IHVzZXIgY29kZSBlbnRyaWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXRvZmZTdGFja1RyYWNlKHN0YWNrPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSAoc3RhY2sgPz8gJycpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGFjYyA9IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKENVVE9GRl9TVEFDS19QQVRURVJOUy50ZXN0KGxpbmUpKSBicmVhaztcbiAgICBpZiAoIURST1BQRURfU1RBQ0tfRlJBTUVTX1BBVFRFUk5TLnRlc3QobGluZSkpIGFjYy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBhY2Muam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQSBgRmFpbHVyZUNvbnZlcnRlcmAgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgZnJvbSBwcm90byBgRmFpbHVyZWAgaW5zdGFuY2VzIHRvIEpTIGBFcnJvcnNgIGFuZCBiYWNrLlxuICpcbiAqIFdlIHJlY29tbWVuZGVkIHVzaW5nIHRoZSB7QGxpbmsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJ9IGluc3RlYWQgb2YgY3VzdG9taXppbmcgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4gb3JkZXJcbiAqIHRvIG1haW50YWluIGNyb3NzLWxhbmd1YWdlIEZhaWx1cmUgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmVDb252ZXJ0ZXIge1xuICAvKipcbiAgICogQ29udmVydHMgYSBjYXVnaHQgZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UuXG4gICAqL1xuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgZXJyb3IgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgVGVtcG9yYWxGYWlsdXJlYC5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9yKGVycjogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogRXJyb3I7XG59XG5cbi8qKlxuICogVGhlIFwic2hhcGVcIiBvZiB0aGUgYXR0cmlidXRlcyBzZXQgYXMgdGhlIHtAbGluayBQcm90b0ZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXN9IHBheWxvYWQgaW4gY2FzZVxuICoge0BsaW5rIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMuZW5jb2RlQ29tbW9uQXR0cmlidXRlc30gaXMgc2V0IHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzdGFja190cmFjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuY29kZSBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIChmb3IgZW5jcnlwdGluZyB0aGVzZSBhdHRyaWJ1dGVzIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9KS5cbiAgICovXG4gIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCwgY3Jvc3MtbGFuZ3VhZ2UtY29tcGF0aWJsZSBGYWlsdXJlIGNvbnZlcnRlci5cbiAqXG4gKiBCeSBkZWZhdWx0LCBpdCB3aWxsIGxlYXZlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgYXMgcGxhaW4gdGV4dC4gSW4gb3JkZXIgdG8gZW5jcnlwdCB0aGVtLCBzZXRcbiAqIGBlbmNvZGVDb21tb25BdHRyaWJ1dGVzYCB0byBgdHJ1ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9IHRoYXQgY2FuIGVuY3J5cHQgL1xuICogZGVjcnlwdCBQYXlsb2FkcyBpbiB5b3VyIHtAbGluayBXb3JrZXJPcHRpb25zLmRhdGFDb252ZXJ0ZXIgfCBXb3JrZXJ9IGFuZFxuICoge0BsaW5rIENsaWVudE9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IENsaWVudCBvcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRGYWlsdXJlQ29udmVydGVyIGltcGxlbWVudHMgRmFpbHVyZUNvbnZlcnRlciB7XG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IFBhcnRpYWw8RGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHsgZW5jb2RlQ29tbW9uQXR0cmlidXRlcyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBlbmNvZGVDb21tb25BdHRyaWJ1dGVzOiBlbmNvZGVDb21tb25BdHRyaWJ1dGVzID8/IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIERvZXMgbm90IHNldCBjb21tb24gcHJvcGVydGllcywgdGhhdCBpcyBkb25lIGluIHtAbGluayBmYWlsdXJlVG9FcnJvcn0uXG4gICAqL1xuICBmYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IEVycm9yIHtcbiAgICBpZiAoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLnR5cGUsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5jYXRlZ29yeSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFNlcnZlckZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRpbWVvdXRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tUGF5bG9hZHNBdEluZGV4KHBheWxvYWRDb252ZXJ0ZXIsIDAsIGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIGRlY29kZVRpbWVvdXRUeXBlKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLnRpbWVvdXRUeXBlKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGVybWluYXRlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm1pbmF0ZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgJ1Jlc2V0V29ya2Zsb3cnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIHdvcmtmbG93VHlwZSwgd29ya2Zsb3dFeGVjdXRpb24sIHJldHJ5U3RhdGUgfSA9IGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvO1xuICAgICAgaWYgKCEod29ya2Zsb3dUeXBlPy5uYW1lICYmIHdvcmtmbG93RXhlY3V0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgb24gY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENoaWxkV29ya2Zsb3dGYWlsdXJlKFxuICAgICAgICBuYW1lc3BhY2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgd29ya2Zsb3dUeXBlLm5hbWUsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUocmV0cnlTdGF0ZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvKSB7XG4gICAgICBpZiAoIWZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGU/Lm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3Rpdml0eVR5cGU/Lm5hbWUgb24gYWN0aXZpdHlGYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGUubmFtZSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5yZXRyeVN0YXRlKSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmlkZW50aXR5ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvKSB7XG4gICAgICBsZXQgcmV0cnlhYmxlT3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRyeUJlaGF2aW9yID0gZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8ucmV0cnlCZWhhdmlvcik7XG4gICAgICBzd2l0Y2ggKHJldHJ5QmVoYXZpb3IpIHtcbiAgICAgICAgY2FzZSAnUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05PTl9SRVRSWUFCTEUnOlxuICAgICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd0Vycm9yVHlwZSA9IGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZTogbmV4dXMuSGFuZGxlckVycm9yVHlwZSA9IE9iamVjdC5oYXNPd24obmV4dXMuSGFuZGxlckVycm9yVHlwZSwgcmF3RXJyb3JUeXBlKVxuICAgICAgICA/IG5leHVzLkhhbmRsZXJFcnJvclR5cGVbcmF3RXJyb3JUeXBlIGFzIGtleW9mIHR5cGVvZiBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlXVxuICAgICAgICA6ICdVTktOT1dOJztcblxuICAgICAgcmV0dXJuIG5ldyBuZXh1cy5IYW5kbGVyRXJyb3IocmVzb2x2ZWRUeXBlLCBmYWlsdXJlLm1lc3NhZ2UgPz8gJ05leHVzIGhhbmRsZXIgZXJyb3InLCB7XG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUsXG4gICAgICAgIHJhd0Vycm9yVHlwZSxcbiAgICAgICAgb3JpZ2luYWxGYWlsdXJlOiB0aGlzLnRlbXBvcmFsRmFpbHVyZVRvTmV4dXNGYWlsdXJlKGZhaWx1cmUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgTmV4dXNPcGVyYXRpb25GYWlsdXJlKFxuICAgICAgICAvLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgc2V0IGEgZGVmYXVsdCBtZXNzYWdlIGhlcmUsIG9uY2Ugd2UndmUgZGVjaWRlZCBvbiBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNjaGVkdWxlZEV2ZW50SWQ/LnRvTnVtYmVyKCksXG4gICAgICAgIC8vIFdlIGFzc3VtZSB0aGVzZSB3aWxsIGFsd2F5cyBiZSBzZXQgb3IgZ3JhY2VmdWxseSBzZXQgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLmVuZHBvaW50ID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uc2VydmljZSA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvbiA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvblRva2VuID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVtcG9yYWxGYWlsdXJlKFxuICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IEVycm9yIHtcbiAgICBpZiAoZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cnMgPSBwYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkPERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXM+KGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMpO1xuICAgICAgLy8gRG9uJ3QgYXBwbHkgZW5jb2RlZEF0dHJpYnV0ZXMgdW5sZXNzIHRoZXkgY29uZm9ybSB0byBhbiBleHBlY3RlZCBzY2hlbWFcbiAgICAgIGlmICh0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmIGF0dHJzICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgc3RhY2tfdHJhY2UgfSA9IGF0dHJzO1xuICAgICAgICAvLyBBdm9pZCBtdXRhdGluZyB0aGUgYXJndW1lbnRcbiAgICAgICAgZmFpbHVyZSA9IHsgLi4uZmFpbHVyZSB9O1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0YWNrX3RyYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZhaWx1cmUuc3RhY2tUcmFjZSA9IHN0YWNrX3RyYWNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3JJbm5lcihmYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyKTtcbiAgICBlcnIuc3RhY2sgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgICAgZXJyLmZhaWx1cmUgPSBmYWlsdXJlO1xuICAgIH1cbiAgICByZXR1cm4gZXJyO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlIHtcbiAgICBjb25zdCBmYWlsdXJlID0gdGhpcy5lcnJvclRvRmFpbHVyZUlubmVyKGVyciwgcGF5bG9hZENvbnZlcnRlcik7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrVHJhY2UgfSA9IGZhaWx1cmU7XG4gICAgICBmYWlsdXJlLm1lc3NhZ2UgPSAnRW5jb2RlZCBmYWlsdXJlJztcbiAgICAgIGZhaWx1cmUuc3RhY2tUcmFjZSA9ICcnO1xuICAgICAgZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcyA9IHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHsgbWVzc2FnZSwgc3RhY2tfdHJhY2U6IHN0YWNrVHJhY2UgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmUge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlICYmIGVyci5mYWlsdXJlKSByZXR1cm4gZXJyLmZhaWx1cmU7XG4gICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2aXR5RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgYWN0aXZpdHlUeXBlOiB7IG5hbWU6IGVyci5hY3Rpdml0eVR5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IGVyci5leGVjdXRpb24sXG4gICAgICAgICAgICB3b3JrZmxvd1R5cGU6IHsgbmFtZTogZXJyLndvcmtmbG93VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhcHBsaWNhdGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgIG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSxcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCAuLi5lcnIuZGV0YWlscykgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmV4dFJldHJ5RGVsYXk6IG1zT3B0aW9uYWxUb1RzKGVyci5uZXh0UmV0cnlEZWxheSksXG4gICAgICAgICAgICBjYXRlZ29yeTogZW5jb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkoZXJyLmNhdGVnb3J5KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGNhbmNlbGVkRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCAuLi5lcnIuZGV0YWlscykgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGltZW91dEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRpbWVvdXRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgdGltZW91dFR5cGU6IGVuY29kZVRpbWVvdXRUeXBlKGVyci50aW1lb3V0VHlwZSksXG4gICAgICAgICAgICBsYXN0SGVhcnRiZWF0RGV0YWlsczogZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXG4gICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBlcnIubGFzdEhlYXJ0YmVhdERldGFpbHMpIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBTZXJ2ZXJGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBzZXJ2ZXJGYWlsdXJlSW5mbzogeyBub25SZXRyeWFibGU6IGVyci5ub25SZXRyeWFibGUgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZXJtaW5hdGVkRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgdGVybWluYXRlZEZhaWx1cmVJbmZvOiB7fSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBuZXh1cy5IYW5kbGVyRXJyb3IpIHtcbiAgICAgICAgaWYgKGVyci5vcmlnaW5hbEZhaWx1cmUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZXh1c0ZhaWx1cmVUb1RlbXBvcmFsRmFpbHVyZShlcnIub3JpZ2luYWxGYWlsdXJlLCBlcnIucmV0cnlhYmxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgcmV0cnlCZWhhdmlvcjogdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBzd2l0Y2ggKGVyci5yZXRyeWFibGVPdmVycmlkZSkge1xuICAgICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgICByZXRyeUJlaGF2aW9yID0gZW5jb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKCdSRVRSWUFCTEUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICByZXRyeUJlaGF2aW9yID0gZW5jb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKCdOT05fUkVUUllBQkxFJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgbmV4dXNIYW5kbGVyRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgICAgdHlwZTogZXJyLnR5cGUsXG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOZXh1c09wZXJhdGlvbkZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIG5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHNjaGVkdWxlZEV2ZW50SWQ6IGVyci5zY2hlZHVsZWRFdmVudElkID8gTG9uZy5mcm9tTnVtYmVyKGVyci5zY2hlZHVsZWRFdmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVuZHBvaW50OiBlcnIuZW5kcG9pbnQsXG4gICAgICAgICAgICBzZXJ2aWNlOiBlcnIuc2VydmljZSxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogZXJyLm9wZXJhdGlvbixcbiAgICAgICAgICAgIG9wZXJhdGlvblRva2VuOiBlcnIub3BlcmF0aW9uVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIEp1c3QgYSBUZW1wb3JhbEZhaWx1cmVcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICBzb3VyY2U6IEZBSUxVUkVfU09VUkNFLFxuICAgIH07XG5cbiAgICBpZiAoaXNFcnJvcihlcnIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBtZXNzYWdlOiBTdHJpbmcoZXJyLm1lc3NhZ2UgPz8gJycpLFxuICAgICAgICBzdGFja1RyYWNlOiBjdXRvZmZTdGFja1RyYWNlKGVyci5zdGFjayksXG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZSgoZXJyIGFzIGFueSkuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGAgW0Egbm9uLUVycm9yIHZhbHVlIHdhcyB0aHJvd24gZnJvbSB5b3VyIGNvZGUuIFdlIHJlY29tbWVuZCB0aHJvd2luZyBFcnJvciBvYmplY3RzIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUgYSBzdGFjayB0cmFjZV1gO1xuXG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBlcnIgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgbWVzc2FnZSA9IFN0cmluZyhlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogbWVzc2FnZSArIHJlY29tbWVuZGF0aW9uIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogU3RyaW5nKGVycikgKyByZWNvbW1lbmRhdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0IGlmIGRlZmluZWQgb3IgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqL1xuICBvcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoXG4gICAgZmFpbHVyZTogUHJvdG9GYWlsdXJlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyXG4gICk6IEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmFpbHVyZSA/IHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZFxuICAgKi9cbiAgb3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGVyciA/IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZXJyLCBwYXlsb2FkQ29udmVydGVyKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUoZmFpbHVyZTogbmV4dXMuRmFpbHVyZSwgcmV0cnlhYmxlOiBib29sZWFuKTogUHJvdG9GYWlsdXJlIHtcbiAgICBpZiAoZmFpbHVyZS5tZXRhZGF0YT8udHlwZSA9PT0gJ3RlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLkZhaWx1cmUnKSB7XG4gICAgICBpZiAoZmFpbHVyZS5kZXRhaWxzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1pc3NpbmcgZGV0YWlscyBmb3IgTmV4dXMgRmFpbHVyZSBvZiB0eXBlICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJ1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWlsdXJlLmRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFsRmFpbHVyZTogUHJvdG9GYWlsdXJlID0ge307XG4gICAgICB0ZW1wb3JhbEZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mbyA9IHtcbiAgICAgICAgdHlwZTogJ05leHVzRmFpbHVyZScsXG4gICAgICAgIG5vblJldHJ5YWJsZTogIXJldHJ5YWJsZSxcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHBheWxvYWRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7IGVuY29kaW5nOiBlbmNvZGUoJ2pzb24vcGxhaW4nKSB9LFxuICAgICAgICAgICAgICBkYXRhOiBlbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyAuLi5mYWlsdXJlLCBtZXNzYWdlOiAnJyB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLm1lc3NhZ2UgPSBmYWlsdXJlLm1lc3NhZ2U7XG4gICAgICB0ZW1wb3JhbEZhaWx1cmUuc3RhY2tUcmFjZSA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICAgIHJldHVybiB0ZW1wb3JhbEZhaWx1cmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0ZW1wb3JhbEZhaWx1cmVUb05leHVzRmFpbHVyZShmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBuZXh1cy5GYWlsdXJlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZmFpbHVyZS5tZXNzYWdlID8/ICcnLFxuICAgICAgbWV0YWRhdGE6IHsgdHlwZTogJ3RlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLkZhaWx1cmUnIH0sXG4gICAgICAvLyBTdG9yZSB0aGUgZnVsbCBQcm90b0ZhaWx1cmUgYXMgdGhlIE5leHVzIGZhaWx1cmUgZGV0YWlscyBzbyBpdCBjYW4gYmUgcm91bmQtdHJpcHBlZFxuICAgICAgLy8gbG9zc2xlc3NseSBiYWNrIHRvIGEgUHJvdG9GYWlsdXJlIHZpYSBuZXh1c0ZhaWx1cmVUb1RlbXBvcmFsRmFpbHVyZS5cbiAgICAgIGRldGFpbHM6IHsgLi4uZmFpbHVyZSB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBgUGF5bG9hZENvZGVjYCBpcyBhbiBvcHRpb25hbCBzdGVwIHRoYXQgaGFwcGVucyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIFRlbXBvcmFsIFNlcnZlciA8LS0+IFdpcmUgPC0tPiBgUGF5bG9hZENvZGVjYCA8LS0+IGBQYXlsb2FkQ29udmVydGVyYCA8LS0+IFVzZXIgY29kZVxuICpcbiAqIEltcGxlbWVudCB0aGlzIHRvIHRyYW5zZm9ybSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHRvL2Zyb20gdGhlIGZvcm1hdCBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBDb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29kZWMge1xuICAvKipcbiAgICogRW5jb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgZm9yIHNlbmRpbmcgb3ZlciB0aGUgd2lyZS5cbiAgICogQHBhcmFtIHBheWxvYWRzIE1heSBoYXZlIGxlbmd0aCAwLlxuICAgKi9cbiAgZW5jb2RlKHBheWxvYWRzOiBQYXlsb2FkW10pOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSk6IFByb21pc2U8UGF5bG9hZFtdPjtcbn1cbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgUGF5bG9hZENvbnZlcnRlckVycm9yLCBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGVuY29kaW5nS2V5cywgZW5jb2RpbmdUeXBlcywgTUVUQURBVEFfRU5DT0RJTkdfS0VZIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIGxpa2UgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGlzIGNhbGxlZCBpbnNpZGUgdGhlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kZXRlcm1pbmlzbSB8IFdvcmtmbG93IGlzb2xhdGV9LlxuICogVG8gd3JpdGUgYXN5bmMgY29kZSBvciB1c2UgTm9kZSBBUElzIChvciB1c2UgcGFja2FnZXMgdGhhdCB1c2UgTm9kZSBBUElzKSwgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuIEV4YW1wbGUgdmFsdWVzIGluY2x1ZGUgdGhlIFdvcmtmbG93IGFyZ3Mgc2VudCBmcm9tIHRoZSBDbGllbnQgYW5kIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBXb3JrZmxvdyBvciBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogU2hvdWxkIHRocm93IHtAbGluayBWYWx1ZUVycm9yfSBpZiB1bmFibGUgdG8gY29udmVydC5cbiAgICovXG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB2YWx1ZXMgSlMgdmFsdWVzIHRvIGNvbnZlcnQgdG8gUGF5bG9hZHNcbiAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgUGF5bG9hZH1zXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIC4uLnZhbHVlczogdW5rbm93bltdKTogUGF5bG9hZFtdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBjb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlKSk7XG59XG5cbi8qKlxuICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZH0gb24gYW4gb3B0aW9uYWwgdmFsdWUsIGFuZCB0aGVuIGVuY29kZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgdmFsdWU6IHVua25vd25cbik6IFBheWxvYWQgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gcGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQodmFsdWUpO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci50b1BheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIG1hcC5cbiAqXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIGFueSB2YWx1ZSBpbiB0aGUgbWFwIGZhaWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1BheWxvYWRzPEsgZXh0ZW5kcyBzdHJpbmcsIFQgPSBhbnk+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIG1hcDogUmVjb3JkPEssIFQ+XG4pOiBSZWNvcmQ8SywgUGF5bG9hZD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcCkubWFwKChbaywgdl0pOiBbSywgUGF5bG9hZF0gPT4gW2sgYXMgSywgY29udmVydGVyLnRvUGF5bG9hZCh2KV0pXG4gICkgYXMgUmVjb3JkPEssIFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzLiBVc2VmdWwgZm9yIGRlc2VyaWFsaXppbmdcbiAqIGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBwYXlsb2Fkc1xuICogQHBhcmFtIHBheWxvYWRzIHNlcmlhbGl6ZWQgdmFsdWUgdG8gY29udmVydCB0byBKUyB2YWx1ZXMuXG4gKiBAcmV0dXJuIGNvbnZlcnRlZCBKUyB2YWx1ZVxuICogQHRocm93cyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlckVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSBkYXRhIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUGF5bG9hZHNBdEluZGV4PFQ+KGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgaW5kZXg6IG51bWJlciwgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsKTogVCB7XG4gIC8vIFRvIG1ha2UgYWRkaW5nIGFyZ3VtZW50cyBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIGNoYW5nZVxuICBpZiAocGF5bG9hZHMgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkcyA9PT0gbnVsbCB8fCBpbmRleCA+PSBwYXlsb2Fkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gcGF5bG9hZHM/LltpbmRleF07XG4gIGlmICghcGF5bG9hZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIHJldHVybiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG59XG5cbi8qKlxuICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkfSBvbiBlYWNoIHZhbHVlIGluIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RnJvbVBheWxvYWRzKGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsKTogdW5rbm93bltdIHtcbiAgaWYgKCFwYXlsb2Fkcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZHMubWFwKChwYXlsb2FkOiBQYXlsb2FkKSA9PiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRnJvbVBheWxvYWRzPEsgZXh0ZW5kcyBzdHJpbmcsIFQgPSB1bmtub3duPihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA/OiBSZWNvcmQ8SywgUGF5bG9hZD4gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8SywgVD4gfCB1bmRlZmluZWQge1xuICBpZiAobWFwID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCBwYXlsb2FkXSk6IFtLLCB1bmtub3duXSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkIGFzIFBheWxvYWQpO1xuICAgICAgcmV0dXJuIFtrIGFzIEssIHZhbHVlXTtcbiAgICB9KVxuICApIGFzIFJlY29yZDxLLCBUPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgY29uc3QgcmF3UGF5bG9hZFR5cGVCcmFuZDogdW5pcXVlIHN5bWJvbDtcbi8qKlxuICogUmF3VmFsdWUgaXMgYSB3cmFwcGVyIG92ZXIgYSBwYXlsb2FkLlxuICogQSBwYXlsb2FkIHRoYXQgYmVsb25ncyB0byBhIFJhd1ZhbHVlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBieXBhc3NlcyB1c2VyLWRlZmluZWQgcGF5bG9hZCBjb252ZXJ0ZXJzLFxuICogaW5zdGVhZCB1c2luZyB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlci4gVGhlIHBheWxvYWQgc3RpbGwgdW5kZXJnb2VzIGNvZGVjIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXdWYWx1ZTxUID0gdW5rbm93bj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXlsb2FkOiBQYXlsb2FkO1xuICBwcml2YXRlIHJlYWRvbmx5IFtyYXdQYXlsb2FkVHlwZUJyYW5kXTogVCA9IHVuZGVmaW5lZCBhcyBUO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIpIHtcbiAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQodmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIGZyb21QYXlsb2FkKHA6IFBheWxvYWQpOiBSYXdWYWx1ZSB7XG4gICAgcmV0dXJuIG5ldyBSYXdWYWx1ZShwLCBpZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIpO1xuICB9XG5cbiAgZ2V0IHBheWxvYWQoKTogUGF5bG9hZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LCBvciBgdW5kZWZpbmVkYCBpZiB1bmFibGUgdG8gY29udmVydC5cbiAgICovXG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUO1xuXG4gIHJlYWRvbmx5IGVuY29kaW5nVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGNvbnZlcnQgdmFsdWVzIHRvIHtAbGluayBQYXlsb2FkfXMgdXNpbmcgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nfXMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpbiB0aGUgb3JkZXIgcHJvdmlkZWQuXG4gKlxuICogQ29udmVydHMgUGF5bG9hZHMgdG8gdmFsdWVzIGJhc2VkIG9uIHRoZSBgUGF5bG9hZC5tZXRhZGF0YS5lbmNvZGluZ2AgZmllbGQsIHdoaWNoIG1hdGNoZXMgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmVuY29kaW5nVHlwZX1cbiAqIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBjcmVhdGVkIHRoZSBQYXlsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICByZWFkb25seSBjb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW107XG4gIHJlYWRvbmx5IGNvbnZlcnRlckJ5RW5jb2Rpbmc6IE1hcDxzdHJpbmcsIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXSkge1xuICAgIGlmIChjb252ZXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFBheWxvYWRDb252ZXJ0ZXJFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJ0ZXJzID0gY29udmVydGVycztcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlckJ5RW5jb2Rpbmcuc2V0KGNvbnZlcnRlci5lbmNvZGluZ1R5cGUsIGNvbnZlcnRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJ1biBgLnRvUGF5bG9hZCh2YWx1ZSlgIG9uIGVhY2ggY29udmVydGVyIGluIHRoZSBvcmRlciBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24uXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0LCB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciB0aGF0IGNhbiBoYW5kbGUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJhd1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUucGF5bG9hZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb252ZXJ0ZXIgb2YgdGhpcy5jb252ZXJ0ZXJzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbmFibGUgdG8gY29udmVydCAke3ZhbHVlfSB0byBwYXlsb2FkYCk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmZyb21QYXlsb2FkfSBiYXNlZCBvbiB0aGUgYGVuY29kaW5nYCBtZXRhZGF0YSBvZiB0aGUge0BsaW5rIFBheWxvYWR9LlxuICAgKi9cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWQubWV0YWRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGluZyA9IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhW01FVEFEQVRBX0VOQ09ESU5HX0tFWV0hKTtcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSB0aGlzLmNvbnZlcnRlckJ5RW5jb2RpbmcuZ2V0KGVuY29kaW5nKTtcbiAgICBpZiAoY29udmVydGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbmtub3duIGVuY29kaW5nOiAke2VuY29kaW5nfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBKUyB1bmRlZmluZWQgYW5kIE5VTEwgUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19OVUxMLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KF9jb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7IC8vIEp1c3QgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBiaW5hcnkgZGF0YSB0eXBlcyBhbmQgUkFXIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmFyeVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVyxcbiAgICAgIH0sXG4gICAgICBkYXRhOiB2YWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gKFxuICAgICAgLy8gV3JhcCB3aXRoIFVpbnQ4QXJyYXkgZnJvbSB0aGlzIGNvbnRleHQgdG8gZW5zdXJlIGBpbnN0YW5jZW9mYCB3b3Jrc1xuICAgICAgKFxuICAgICAgICBjb250ZW50LmRhdGEgPyBuZXcgVWludDhBcnJheShjb250ZW50LmRhdGEuYnVmZmVyLCBjb250ZW50LmRhdGEuYnl0ZU9mZnNldCwgY29udGVudC5kYXRhLmxlbmd0aCkgOiBjb250ZW50LmRhdGFcbiAgICAgICkgYXMgYW55XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gbm9uLXVuZGVmaW5lZCB2YWx1ZXMgYW5kIHNlcmlhbGl6ZWQgSlNPTiBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQganNvbjtcbiAgICB0cnkge1xuICAgICAganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT04sXG4gICAgICB9LFxuICAgICAgZGF0YTogZW5jb2RlKGpzb24pLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChjb250ZW50LmRhdGEgPT09IHVuZGVmaW5lZCB8fCBjb250ZW50LmRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdHb3QgcGF5bG9hZCB3aXRoIG5vIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlKGNvbnRlbnQuZGF0YSkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlciBleHRlbmRzIENvbXBvc2l0ZVBheWxvYWRDb252ZXJ0ZXIge1xuICAvLyBNYXRjaCB0aGUgb3JkZXIgdXNlZCBpbiBvdGhlciBTREtzLCBidXQgZXhjbHVkZSBQcm90b2J1ZiBjb252ZXJ0ZXJzIHNvIHRoYXQgdGhlIGNvZGUsIGluY2x1ZGluZ1xuICAvLyBgcHJvdG8zLWpzb24tc2VyaWFsaXplcmAsIGRvZXNuJ3QgdGFrZSBzcGFjZSBpbiBXb3JrZmxvdyBidW5kbGVzIHRoYXQgZG9uJ3QgdXNlIFByb3RvYnVmcy4gVG8gdXNlIFByb3RvYnVmcywgdXNlXG4gIC8vIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcldpdGhQcm90b2J1ZnN9LlxuICAvL1xuICAvLyBHbyBTREs6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW1wb3JhbGlvL3Nkay1nby9ibG9iLzVlNTY0NWYwYzU1MGRjZjcxN2MwOTVhZTMyYzc2YTcwODdkMmU5ODUvY29udmVydGVyL2RlZmF1bHRfZGF0YV9jb252ZXJ0ZXIuZ28jTDI4XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBVbmRlZmluZWRQYXlsb2FkQ29udmVydGVyKCksIG5ldyBCaW5hcnlQYXlsb2FkQ29udmVydGVyKCksIG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHtAbGluayBQYXlsb2FkQ29udmVydGVyfSB1c2VkIGJ5IHRoZSBTREsuIFN1cHBvcnRzIGBVaW50OEFycmF5YCBhbmQgSlNPTiBzZXJpYWxpemFibGVzIChzbyBpZlxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5I2Rlc2NyaXB0aW9uIHwgYEpTT04uc3RyaW5naWZ5KHlvdXJBcmdPclJldHZhbClgfVxuICogd29ya3MsIHRoZSBkZWZhdWx0IHBheWxvYWQgY29udmVydGVyIHdpbGwgd29yaykuXG4gKlxuICogVG8gYWxzbyBzdXBwb3J0IFByb3RvYnVmcywgY3JlYXRlIGEgY3VzdG9tIHBheWxvYWQgY29udmVydGVyIHdpdGgge0BsaW5rIERlZmF1bHRQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBgY29uc3QgbXlDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoeyBwcm90b2J1ZlJvb3QgfSlgXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciA9IG5ldyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcigpO1xuXG4vKipcbiAqIFRoZSBpZGVudGl0eSBwYXlsb2FkIGNvbnZlcnRlciByZXR1cm5zIHRoZSBpbnB1dHMgaXQgd2FzIGdpdmVuLlxuICovXG5jbGFzcyBJZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIFBheWxvYWQ7XG4gIH1cblxuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgVDtcbiAgfVxufVxuXG5jb25zdCBpZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgSWRlbnRpdHlQYXlsb2FkQ29udmVydGVyKCk7XG4iLCJpbXBvcnQgeyBkZWNvZGUsIGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBpc1ZhbGlkVmFsdWVGb3JUeXBlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlLFxufSBmcm9tICcuLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBQYXlsb2FkQ29udmVydGVyLCBKc29uUGF5bG9hZENvbnZlcnRlciwgbWFwRnJvbVBheWxvYWRzLCBtYXBUb1BheWxvYWRzIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8qKlxuICogQ29udmVydHMgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgdXNpbmcgSnNvblBheWxvYWRDb252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAganNvbkNvbnZlcnRlciA9IG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpO1xuICB2YWxpZE5vbkRhdGVUeXBlcyA9IFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ107XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZXM6IHVua25vd24pOiBQYXlsb2FkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgZmlyc3RUeXBlID0gdHlwZW9mIGZpcnN0VmFsdWU7XG4gICAgICBpZiAoZmlyc3RUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBTZWFyY2hBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYXJyYXlzIG9mIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBEYXRlcy4gVGhlIHZhbHVlICR7dmFsdWV9IGF0IGluZGV4ICR7aWR4fSBpcyBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWROb25EYXRlVHlwZXMuaW5jbHVkZXMoZmlyc3RUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gZmlyc3RUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYEFsbCBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGZpcnN0IHZhbHVlICR7Zmlyc3RWYWx1ZX0gb2YgdHlwZSAke2ZpcnN0VHlwZX0gZG9lc24ndCBtYXRjaCB2YWx1ZSAke3ZhbHVlfSBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfSBhdCBpbmRleCAke2lkeH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHJldCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQodmFsdWVzKTtcbiAgICBpZiAocmV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBzZWFyY2ggYXR0cmlidXRlcyB0byBwYXlsb2FkcycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGV0aW1lIFNlYXJjaCBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gYERhdGVgc1xuICAgKi9cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmpzb25Db252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gICAgbGV0IGFycmF5V3JhcHBlZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgY29uc3Qgc2VhcmNoQXR0cmlidXRlVHlwZSA9IHBheWxvYWQubWV0YWRhdGEudHlwZSA/IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWFyY2hBdHRyaWJ1dGVUeXBlID09PSAnRGF0ZXRpbWUnKSB7XG4gICAgICBhcnJheVdyYXBwZWRWYWx1ZSA9IGFycmF5V3JhcHBlZFZhbHVlLm1hcCgoZGF0ZVN0cmluZykgPT4gbmV3IERhdGUoZGF0ZVN0cmluZykpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlXcmFwcGVkVmFsdWUgYXMgdW5rbm93biBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyID0gbmV3IFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG5cbiAgcHVibGljIHRvUGF5bG9hZDxUPihhdHRyOiBUKTogUGF5bG9hZCB7XG4gICAgaWYgKCEoYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgfHwgYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEV4cGVjdCBpbnB1dCB0byBiZSBpbnN0YW5jZSBvZiBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlIG9yIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhdHRyXG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgZGVsZXRpb24gYXMgd2VsbCBhcyByZWd1bGFyIHR5cGVkIHNlYXJjaCBhdHRyaWJ1dGVzLlxuICAgIGlmIChhdHRyLnZhbHVlICE9PSBudWxsICYmICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHIudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgJHthdHRyLnZhbHVlfSBmb3IgZ2l2ZW4gdHlwZSAke2F0dHIudHlwZX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3Igc2VydmVyIHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHdvcmsgcHJvcGVybHksIHdlIGNhbm5vdCBzZXQgdGhlIG1ldGFkYXRhXG4gICAgLy8gdHlwZSB3aGVuIHdlIHNldCBudWxsXG4gICAgaWYgKGF0dHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG5cbiAgICAvLyBKU09OLnN0cmluZ2lmeSB0YWtlcyBjYXJlIG9mIGNvbnZlcnRpbmcgRGF0ZXMgdG8gSVNPIHN0cmluZ3NcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZChhdHRyLnZhbHVlKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgdGhlIGNhc2UgYnV0IHRoZSBjb21waWxlciBjb21wbGFpbnMgd2l0aG91dCB0aGlzIGNoZWNrLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG4gICAgLy8gQWRkIGVuY29kZWQgdHlwZSBvZiBzZWFyY2ggYXR0cmlidXRlIHRvIG1ldGF0ZGF0YVxuICAgIHBheWxvYWQubWV0YWRhdGFbJ3R5cGUnXSA9IGVuY29kZShUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9NZXRhZGF0YVR5cGUoYXR0ci50eXBlKSk7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvLyBOb3RlOiB0eXBlIGNhc3RpbmcgdW5kZWZpbmVkIHZhbHVlcyBpcyBub3QgY2xlYXIgdG8gY2FsbGVyLlxuICAvLyBXZSBjYW4ndCBjaGFuZ2UgdGhlIHR5cGluZyBvZiB0aGUgbWV0aG9kIHRvIHJldHVybiB1bmRlZmluZWQsIGl0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIGludGVyZmFjZS5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gJ3R5cGUnIG1ldGFkYXRhIGZpZWxkIG9yIG5vIGdpdmVuIHZhbHVlLCB3ZSBza2lwLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhLnR5cGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnRvU2VhcmNoQXR0cmlidXRlVHlwZShkZWNvZGUocGF5bG9hZC5tZXRhZGF0YS50eXBlKSk7XG4gICAgLy8gVW5yZWNvZ25pemVkIG1ldGFkYXRhIHR5cGUgKHNhbml0eSBjaGVjaykuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcblxuICAgIC8vIEhhbmRsZSBsZWdhY3kgdmFsdWVzIHdpdGhvdXQgS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgaWYgKHR5cGUgIT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBDYW5ub3QgaGF2ZSBhbiBhcnJheSB3aXRoIG11bHRpcGxlIHZhbHVlcyBmb3Igbm9uLUtFWVdPUkRfTElTVCB0eXBlLlxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgICAgfVxuICAgICAgLy8gVW5wYWNrIHNpbmdsZSB2YWx1ZSBhcnJheS5cbiAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FICYmIHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGZvciB0aGUgZ2l2ZW4gdHlwZS4gSWYgbm90LCBza2lwLlxuICAgIGlmICghaXNWYWxpZFZhbHVlRm9yVHlwZSh0eXBlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKHR5cGUsIHZhbHVlKSBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyKCk7XG5cbi8vIElmIGJvdGggcGFyYW1zIGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhcbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXMsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTZWFyY2hBdHRyaWJ1dGVzKGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbCk6IFNlYXJjaEF0dHJpYnV0ZXMge1xuICBpZiAoIWluZGV4ZWRGaWVsZHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICBPYmplY3QuZW50cmllcyhtYXBGcm9tUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgaW5kZXhlZEZpZWxkcykgYXMgU2VhcmNoQXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgKFtfLCB2XSkgPT4gdiAmJiB2Lmxlbmd0aCA+IDBcbiAgICApIC8vIEZpbHRlciBvdXQgZW1wdHkgYXJyYXlzIHJldHVybmVkIGJ5IHByZSAxLjE4IHNlcnZlcnNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgaW5kZXhlZEZpZWxkczogUmVjb3JkPHN0cmluZywgUGF5bG9hZD4gfCB1bmRlZmluZWQgfCBudWxsXG4pOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIG1hcEZyb21QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQ+KFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgIGluZGV4ZWRGaWVsZHNcbiAgICAgICkgPz8ge31cbiAgICApLnJlZHVjZTxTZWFyY2hBdHRyaWJ1dGVQYWlyW10+KChhY2MsIFtrLCBhdHRyXSkgPT4ge1xuICAgICAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgdmFsdWVzIGZyb20gY29udmVydGVyLlxuICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB7IG5hbWU6IGssIHR5cGU6IGF0dHIudHlwZSB9O1xuICAgICAgLy8gRW5zdXJlIGlzIHZhbGlkIHBhaXIuXG4gICAgICBpZiAoaXNWYWxpZFZhbHVlRm9yVHlwZShrZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgYWNjLnB1c2goeyBrZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKVxuICApO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfRU5DT0RJTkdfS0VZID0gJ2VuY29kaW5nJztcbmV4cG9ydCBjb25zdCBlbmNvZGluZ1R5cGVzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiAnYmluYXJ5L251bGwnLFxuICBNRVRBREFUQV9FTkNPRElOR19SQVc6ICdiaW5hcnkvcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiAnanNvbi9wbGFpbicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046ICdqc29uL3Byb3RvYnVmJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUY6ICdiaW5hcnkvcHJvdG9idWYnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEVuY29kaW5nVHlwZSA9ICh0eXBlb2YgZW5jb2RpbmdUeXBlcylba2V5b2YgdHlwZW9mIGVuY29kaW5nVHlwZXNdO1xuXG5leHBvcnQgY29uc3QgZW5jb2RpbmdLZXlzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVcpLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRiksXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfTUVTU0FHRV9UWVBFX0tFWSA9ICdtZXNzYWdlVHlwZSc7XG4iLCJpbXBvcnQgKiBhcyB0aW1lIGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyB0eXBlIFRpbWVzdGFtcCwgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkIHJldHVybnMgdW5kZWZpbmVkLlxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm9wdGlvbmFsVHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3dcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiB0aW1lLnRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zTnVtYmVyVG9UcyhtaWxsaXM6IG51bWJlcik6IFRpbWVzdGFtcCB7XG4gIHJldHVybiB0aW1lLm1zTnVtYmVyVG9UcyhtaWxsaXMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvVHMoc3RyOiBEdXJhdGlvbik6IFRpbWVzdGFtcCB7XG4gIHJldHVybiB0aW1lLm1zVG9UcyhzdHIpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9UcyhzdHI6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogVGltZXN0YW1wIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUubXNPcHRpb25hbFRvVHMoc3RyKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvTnVtYmVyKHZhbDogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5tc09wdGlvbmFsVG9OdW1iZXIodmFsKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb051bWJlcih2YWw6IER1cmF0aW9uKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUubXNUb051bWJlcih2YWwpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvRGF0ZSh0czogVGltZXN0YW1wKTogRGF0ZSB7XG4gIHJldHVybiB0aW1lLnRzVG9EYXRlKHRzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5vcHRpb25hbFRzVG9EYXRlKHRzKTtcbn1cbiIsIi8vIFBhc3RlZCB3aXRoIG1vZGlmaWNhdGlvbnMgZnJvbTogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fub255Y28vRmFzdGVzdFNtYWxsZXN0VGV4dEVuY29kZXJEZWNvZGVyL21hc3Rlci9FbmNvZGVyRGVjb2RlclRvZ2V0aGVyLnNyYy5qc1xuLyogZXNsaW50IG5vLWZhbGx0aHJvdWdoOiAwICovXG5cbmNvbnN0IGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5jb25zdCBlbmNvZGVyUmVnZXhwID0gL1tcXHg4MC1cXHVEN2ZmXFx1REMwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdPy9nO1xuY29uc3QgdG1wQnVmZmVyVTE2ID0gbmV3IFVpbnQxNkFycmF5KDMyKTtcblxuZXhwb3J0IGNsYXNzIFRleHREZWNvZGVyIHtcbiAgZGVjb2RlKGlucHV0QXJyYXlPckJ1ZmZlcjogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgU2hhcmVkQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlucHV0QXM4ID0gaW5wdXRBcnJheU9yQnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGlucHV0QXJyYXlPckJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGlucHV0QXJyYXlPckJ1ZmZlcik7XG5cbiAgICBsZXQgcmVzdWx0aW5nU3RyaW5nID0gJycsXG4gICAgICB0bXBTdHIgPSAnJyxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIG5leHRFbmQgPSAwLFxuICAgICAgY3AwID0gMCxcbiAgICAgIGNvZGVQb2ludCA9IDAsXG4gICAgICBtaW5CaXRzID0gMCxcbiAgICAgIGNwMSA9IDAsXG4gICAgICBwb3MgPSAwLFxuICAgICAgdG1wID0gLTE7XG4gICAgY29uc3QgbGVuID0gaW5wdXRBczgubGVuZ3RoIHwgMDtcbiAgICBjb25zdCBsZW5NaW51czMyID0gKGxlbiAtIDMyKSB8IDA7XG4gICAgLy8gTm90ZSB0aGF0IHRtcCByZXByZXNlbnRzIHRoZSAybmQgaGFsZiBvZiBhIHN1cnJvZ2F0ZSBwYWlyIGluY2FzZSBhIHN1cnJvZ2F0ZSBnZXRzIGRpdmlkZWQgYmV0d2VlbiBibG9ja3NcbiAgICBmb3IgKDsgaW5kZXggPCBsZW47ICkge1xuICAgICAgbmV4dEVuZCA9IGluZGV4IDw9IGxlbk1pbnVzMzIgPyAzMiA6IChsZW4gLSBpbmRleCkgfCAwO1xuICAgICAgZm9yICg7IHBvcyA8IG5leHRFbmQ7IGluZGV4ID0gKGluZGV4ICsgMSkgfCAwLCBwb3MgPSAocG9zICsgMSkgfCAwKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgIGNwMCA9IGlucHV0QXM4W2luZGV4XSAmIDB4ZmY7XG4gICAgICAgIHN3aXRjaCAoY3AwID4+IDQpIHtcbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGlmIChjcDEgPj4gNiAhPT0gMGIxMCB8fCAwYjExMTEwMTExIDwgY3AwKSB7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVQb2ludCA9ICgoY3AwICYgMGIxMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IDU7IC8vIDIwIGVuc3VyZXMgaXQgbmV2ZXIgcGFzc2VzIC0+IGFsbCBpbnZhbGlkIHJlcGxhY2VtZW50c1xuICAgICAgICAgICAgY3AwID0gMHgxMDA7IC8vICBrZWVwIHRyYWNrIG9mIHRoIGJpdCBzaXplXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IGNwMSA+PiA2ID09PSAwYjEwID8gKG1pbkJpdHMgKyA0KSB8IDAgOiAyNDsgLy8gMjQgZW5zdXJlcyBpdCBuZXZlciBwYXNzZXMgLT4gYWxsIGludmFsaWQgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjcDAgPSAoY3AwICsgMHgxMDApICYgMHgzMDA7IC8vIGtlZXAgdHJhY2sgb2YgdGggYml0IHNpemVcbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgY29kZVBvaW50IDw8PSA2O1xuICAgICAgICAgICAgY29kZVBvaW50IHw9ICgoY3AwICYgMGIxMTExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gKG1pbkJpdHMgKyA3KSB8IDA7XG5cbiAgICAgICAgICAgIC8vIE5vdywgcHJvY2VzcyB0aGUgY29kZSBwb2ludFxuICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuICYmIGNwMSA+PiA2ID09PSAwYjEwICYmIGNvZGVQb2ludCA+PiBtaW5CaXRzICYmIGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNwMCA9IGNvZGVQb2ludDtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gKGNvZGVQb2ludCAtIDB4MTAwMDApIHwgMDtcbiAgICAgICAgICAgICAgaWYgKDAgPD0gY29kZVBvaW50IC8qMHhmZmZmIDwgY29kZVBvaW50Ki8pIHtcbiAgICAgICAgICAgICAgICAvLyBCTVAgY29kZSBwb2ludFxuICAgICAgICAgICAgICAgIC8vbmV4dEVuZCA9IG5leHRFbmQgLSAxfDA7XG5cbiAgICAgICAgICAgICAgICB0bXAgPSAoKGNvZGVQb2ludCA+PiAxMCkgKyAweGQ4MDApIHwgMDsgLy8gaGlnaFN1cnJvZ2F0ZVxuICAgICAgICAgICAgICAgIGNwMCA9ICgoY29kZVBvaW50ICYgMHgzZmYpICsgMHhkYzAwKSB8IDA7IC8vIGxvd1N1cnJvZ2F0ZSAod2lsbCBiZSBpbnNlcnRlZCBsYXRlciBpbiB0aGUgc3dpdGNoLXN0YXRlbWVudClcblxuICAgICAgICAgICAgICAgIGlmIChwb3MgPCAzMSkge1xuICAgICAgICAgICAgICAgICAgLy8gbm90aWNlIDMxIGluc3RlYWQgb2YgMzJcbiAgICAgICAgICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gdG1wO1xuICAgICAgICAgICAgICAgICAgcG9zID0gKHBvcyArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICAgIHRtcCA9IC0xO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBlbHNlLCB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXRBczggYW5kIGxldCB0bXAwIGJlIGZpbGxlZCBpbiBsYXRlciBvblxuICAgICAgICAgICAgICAgICAgLy8gTk9URSB0aGF0IGNwMSBpcyBiZWluZyB1c2VkIGFzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciB0aGUgc3dhcHBpbmcgb2YgdG1wIHdpdGggY3AwXG4gICAgICAgICAgICAgICAgICBjcDEgPSB0bXA7XG4gICAgICAgICAgICAgICAgICB0bXAgPSBjcDA7XG4gICAgICAgICAgICAgICAgICBjcDAgPSBjcDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgbmV4dEVuZCA9IChuZXh0RW5kICsgMSkgfCAwOyAvLyBiZWNhdXNlIHdlIGFyZSBhZHZhbmNpbmcgaSB3aXRob3V0IGFkdmFuY2luZyBwb3NcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGludmFsaWQgY29kZSBwb2ludCBtZWFucyByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIHdpdGggbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgIGNwMCA+Pj0gODtcbiAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggLSBjcDAgLSAxKSB8IDA7IC8vIHJlc2V0IGluZGV4ICBiYWNrIHRvIHdoYXQgaXQgd2FzIGJlZm9yZVxuICAgICAgICAgICAgICBjcDAgPSAweGZmZmQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmFsbHksIHJlc2V0IHRoZSB2YXJpYWJsZXMgZm9yIHRoZSBuZXh0IGdvLWFyb3VuZFxuICAgICAgICAgICAgbWluQml0cyA9IDA7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSAwO1xuICAgICAgICAgICAgbmV4dEVuZCA9IGluZGV4IDw9IGxlbk1pbnVzMzIgPyAzMiA6IChsZW4gLSBpbmRleCkgfCAwO1xuICAgICAgICAgIC8qY2FzZSAxMTpcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY29kZVBvaW50ID8gY29kZVBvaW50ID0gMCA6IGNwMCA9IDB4ZmZmZDsgLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gY3AwO1xuICAgICAgICAgIGNvbnRpbnVlOyovXG4gICAgICAgICAgZGVmYXVsdDogLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IGNwMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICB9XG4gICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gMHhmZmZkOyAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgIH1cbiAgICAgIHRtcFN0ciArPSBmcm9tQ2hhckNvZGUoXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgIHRtcEJ1ZmZlclUxNlswXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls2XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls5XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzEwXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzExXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzEyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzEzXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE2XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzE5XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzIwXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzIxXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzIyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzIzXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI2XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzI5XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzMwXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzMxXVxuICAgICAgKTtcbiAgICAgIGlmIChwb3MgPCAzMikgdG1wU3RyID0gdG1wU3RyLnNsaWNlKDAsIChwb3MgLSAzMikgfCAwKTsgLy8tKDMyLXBvcykpO1xuICAgICAgaWYgKGluZGV4IDwgbGVuKSB7XG4gICAgICAgIC8vZnJvbUNoYXJDb2RlLmFwcGx5KDAsIHRtcEJ1ZmZlclUxNiA6IFVpbnQ4QXJyYXkgPyAgdG1wQnVmZmVyVTE2LnN1YmFycmF5KDAscG9zKSA6IHRtcEJ1ZmZlclUxNi5zbGljZSgwLHBvcykpO1xuICAgICAgICB0bXBCdWZmZXJVMTZbMF0gPSB0bXA7XG4gICAgICAgIHBvcyA9IH50bXAgPj4+IDMxOyAvL3RtcCAhPT0gLTEgPyAxIDogMDtcbiAgICAgICAgdG1wID0gLTE7XG5cbiAgICAgICAgaWYgKHRtcFN0ci5sZW5ndGggPCByZXN1bHRpbmdTdHJpbmcubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodG1wICE9PSAtMSkge1xuICAgICAgICB0bXBTdHIgKz0gZnJvbUNoYXJDb2RlKHRtcCk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdGluZ1N0cmluZyArPSB0bXBTdHI7XG4gICAgICB0bXBTdHIgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nU3RyaW5nO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBlbmNvZGVyUmVwbGFjZXIobm9uQXNjaWlDaGFyczogc3RyaW5nKSB7XG4gIC8vIG1ha2UgdGhlIFVURiBzdHJpbmcgaW50byBhIGJpbmFyeSBVVEYtOCBlbmNvZGVkIHN0cmluZ1xuICBsZXQgcG9pbnQgPSBub25Bc2NpaUNoYXJzLmNoYXJDb2RlQXQoMCkgfCAwO1xuICBpZiAoMHhkODAwIDw9IHBvaW50KSB7XG4gICAgaWYgKHBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgY29uc3QgbmV4dGNvZGUgPSBub25Bc2NpaUNoYXJzLmNoYXJDb2RlQXQoMSkgfCAwOyAvLyBkZWZhdWx0cyB0byAwIHdoZW4gTmFOLCBjYXVzaW5nIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cbiAgICAgIGlmICgweGRjMDAgPD0gbmV4dGNvZGUgJiYgbmV4dGNvZGUgPD0gMHhkZmZmKSB7XG4gICAgICAgIC8vcG9pbnQgPSAoKHBvaW50IC0gMHhEODAwKTw8MTApICsgbmV4dGNvZGUgLSAweERDMDAgKyAweDEwMDAwfDA7XG4gICAgICAgIHBvaW50ID0gKChwb2ludCA8PCAxMCkgKyBuZXh0Y29kZSAtIDB4MzVmZGMwMCkgfCAwO1xuICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpXG4gICAgICAgICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICgweDFlIC8qMGIxMTExMCovIDw8IDMpIHwgKHBvaW50ID4+IDE4KSxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDEyKSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqL1xuICAgICAgICAgICk7XG4gICAgICB9IGVsc2UgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4ZGZmZikge1xuICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICB9XG4gIH1cbiAgLyppZiAocG9pbnQgPD0gMHgwMDdmKSByZXR1cm4gbm9uQXNjaWlDaGFycztcbiAgZWxzZSAqLyBpZiAocG9pbnQgPD0gMHgwN2ZmKSB7XG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZSgoMHg2IDw8IDUpIHwgKHBvaW50ID4+IDYpLCAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZikpO1xuICB9IGVsc2VcbiAgICByZXR1cm4gZnJvbUNoYXJDb2RlKFxuICAgICAgKDB4ZSAvKjBiMTExMCovIDw8IDQpIHwgKHBvaW50ID4+IDEyKSxcbiAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi9cbiAgICApO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dEVuY29kZXIge1xuICBwdWJsaWMgZW5jb2RlKGlucHV0U3RyaW5nOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAvLyAweGMwID0+IDBiMTEwMDAwMDA7IDB4ZmYgPT4gMGIxMTExMTExMTsgMHhjMC0weGZmID0+IDBiMTF4eHh4eHhcbiAgICAvLyAweDgwID0+IDBiMTAwMDAwMDA7IDB4YmYgPT4gMGIxMDExMTExMTsgMHg4MC0weGJmID0+IDBiMTB4eHh4eHhcbiAgICBjb25zdCBlbmNvZGVkU3RyaW5nID0gaW5wdXRTdHJpbmcgPT09IHZvaWQgMCA/ICcnIDogJycgKyBpbnB1dFN0cmluZyxcbiAgICAgIGxlbiA9IGVuY29kZWRTdHJpbmcubGVuZ3RoIHwgMDtcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoKChsZW4gPDwgMSkgKyA4KSB8IDApO1xuICAgIGxldCB0bXBSZXN1bHQ6IFVpbnQ4QXJyYXk7XG4gICAgbGV0IGkgPSAwLFxuICAgICAgcG9zID0gMCxcbiAgICAgIHBvaW50ID0gMCxcbiAgICAgIG5leHRjb2RlID0gMDtcbiAgICBsZXQgdXBncmFkZWRlZEFycmF5U2l6ZSA9ICFVaW50OEFycmF5OyAvLyBub3JtYWwgYXJyYXlzIGFyZSBhdXRvLWV4cGFuZGluZ1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgPSAoaSArIDEpIHwgMCwgcG9zID0gKHBvcyArIDEpIHwgMCkge1xuICAgICAgcG9pbnQgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSkgfCAwO1xuICAgICAgaWYgKHBvaW50IDw9IDB4MDA3Zikge1xuICAgICAgICByZXN1bHRbcG9zXSA9IHBvaW50O1xuICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHg2IDw8IDUpIHwgKHBvaW50ID4+IDYpO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZGVuQ2hlY2s6IHtcbiAgICAgICAgICBpZiAoMHhkODAwIDw9IHBvaW50KSB7XG4gICAgICAgICAgICBpZiAocG9pbnQgPD0gMHhkYmZmKSB7XG4gICAgICAgICAgICAgIG5leHRjb2RlID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KChpID0gKGkgKyAxKSB8IDApKSB8IDA7IC8vIGRlZmF1bHRzIHRvIDAgd2hlbiBOYU4sIGNhdXNpbmcgbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblxuICAgICAgICAgICAgICBpZiAoMHhkYzAwIDw9IG5leHRjb2RlICYmIG5leHRjb2RlIDw9IDB4ZGZmZikge1xuICAgICAgICAgICAgICAgIC8vcG9pbnQgPSAoKHBvaW50IC0gMHhEODAwKTw8MTApICsgbmV4dGNvZGUgLSAweERDMDAgKyAweDEwMDAwfDA7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSAoKHBvaW50IDw8IDEwKSArIG5leHRjb2RlIC0gMHgzNWZkYzAwKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ID4gMHhmZmZmKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbcG9zXSA9ICgweDFlIC8qMGIxMTExMCovIDw8IDMpIHwgKHBvaW50ID4+IDE4KTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gMTIpICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhayB3aWRlbkNoZWNrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4ZGZmZikge1xuICAgICAgICAgICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXVwZ3JhZGVkZWRBcnJheVNpemUgJiYgaSA8PCAxIDwgcG9zICYmIGkgPDwgMSA8ICgocG9zIC0gNykgfCAwKSkge1xuICAgICAgICAgICAgdXBncmFkZWRlZEFycmF5U2l6ZSA9IHRydWU7XG4gICAgICAgICAgICB0bXBSZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4gKiAzKTtcbiAgICAgICAgICAgIHRtcFJlc3VsdC5zZXQocmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRtcFJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHhlIC8qMGIxMTEwKi8gPDwgNCkgfCAocG9pbnQgPj4gMTIpO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVWludDhBcnJheSA/IHJlc3VsdC5zdWJhcnJheSgwLCBwb3MpIDogcmVzdWx0LnNsaWNlKDAsIHBvcyk7XG4gIH1cblxuICBwdWJsaWMgZW5jb2RlSW50byhpbnB1dFN0cmluZzogc3RyaW5nLCB1OEFycjogVWludDhBcnJheSk6IHsgd3JpdHRlbjogbnVtYmVyOyByZWFkOiBudW1iZXIgfSB7XG4gICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGlucHV0U3RyaW5nID09PSB2b2lkIDAgPyAnJyA6ICgnJyArIGlucHV0U3RyaW5nKS5yZXBsYWNlKGVuY29kZXJSZWdleHAsIGVuY29kZXJSZXBsYWNlcik7XG4gICAgbGV0IGxlbiA9IGVuY29kZWRTdHJpbmcubGVuZ3RoIHwgMCxcbiAgICAgIGkgPSAwLFxuICAgICAgY2hhciA9IDAsXG4gICAgICByZWFkID0gMDtcbiAgICBjb25zdCB1OEFyckxlbiA9IHU4QXJyLmxlbmd0aCB8IDA7XG4gICAgY29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dFN0cmluZy5sZW5ndGggfCAwO1xuICAgIGlmICh1OEFyckxlbiA8IGxlbikgbGVuID0gdThBcnJMZW47XG4gICAgcHV0Q2hhcnM6IHtcbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpID0gKGkgKyAxKSB8IDApIHtcbiAgICAgICAgY2hhciA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKSB8IDA7XG4gICAgICAgIHN3aXRjaCAoY2hhciA+PiA0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAvLyBleHRlbnNpb24gcG9pbnRzOlxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgaWYgKCgoaSArIDEpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBpZiAoKChpICsgMikgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIC8vaWYgKCEoY2hhciA9PT0gMHhFRiAmJiBlbmNvZGVkU3RyaW5nLnN1YnN0cihpKzF8MCwyKSA9PT0gXCJcXHhCRlxceEJEXCIpKVxuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBpZiAoKChpICsgMykgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrIHB1dENoYXJzO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVhZCA9IHJlYWQgKyAoKGNoYXIgPj4gNikgIT09IDIpIHwwO1xuICAgICAgICB1OEFycltpXSA9IGNoYXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHdyaXR0ZW46IGksIHJlYWQ6IGlucHV0TGVuZ3RoIDwgcmVhZCA/IGlucHV0TGVuZ3RoIDogcmVhZCB9O1xuICB9XG59XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoczogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIHJldHVybiBUZXh0RW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICByZXR1cm4gVGV4dERlY29kZXIucHJvdG90eXBlLmRlY29kZShhKTtcbn1cbiIsImltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIFRocm93biBmcm9tIGNvZGUgdGhhdCByZWNlaXZlcyBhIHZhbHVlIHRoYXQgaXMgdW5leHBlY3RlZCBvciB0aGF0IGl0J3MgdW5hYmxlIHRvIGhhbmRsZS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdWYWx1ZUVycm9yJylcbmV4cG9ydCBjbGFzcyBWYWx1ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93blxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFBheWxvYWQgQ29udmVydGVyIGlzIG1pc2NvbmZpZ3VyZWQuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignUGF5bG9hZENvbnZlcnRlckVycm9yJylcbmV4cG9ydCBjbGFzcyBQYXlsb2FkQ29udmVydGVyRXJyb3IgZXh0ZW5kcyBWYWx1ZUVycm9yIHt9XG5cbi8qKlxuICogU2lnbmFscyB0aGF0IGEgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4ndCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBpdCBpcyBpbGxlZ2FsIGdpdmVuIHRoZVxuICogY3VycmVudCBzdGF0ZSBvZiB0aGUgb2JqZWN0OyBlLmcuIHRyeWluZyB0byB1c2UgYSByZXNvdXJjZSBhZnRlciBpdCBoYXMgYmVlbiBjbG9zZWQuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignSWxsZWdhbFN0YXRlRXJyb3InKVxuZXhwb3J0IGNsYXNzIElsbGVnYWxTdGF0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFdvcmtmbG93IHdpdGggdGhlIGdpdmVuIElkIGlzIG5vdCBrbm93biB0byBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBJdCBjb3VsZCBiZSBiZWNhdXNlOlxuICogLSBJZCBwYXNzZWQgaXMgaW5jb3JyZWN0XG4gKiAtIFdvcmtmbG93IGlzIGNsb3NlZCAoZm9yIHNvbWUgY2FsbHMsIGUuZy4gYHRlcm1pbmF0ZWApXG4gKiAtIFdvcmtmbG93IHdhcyBkZWxldGVkIGZyb20gdGhlIFNlcnZlciBhZnRlciByZWFjaGluZyBpdHMgcmV0ZW50aW9uIGxpbWl0XG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dOb3RGb3VuZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd05vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOYW1lc3BhY2VOb3RGb3VuZEVycm9yJylcbmV4cG9ydCBjbGFzcyBOYW1lc3BhY2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgTmFtZXNwYWNlIG5vdCBmb3VuZDogJyR7bmFtZXNwYWNlfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93IHRoaXMgZXJyb3IgZnJvbSBhbiBBY3Rpdml0eSBpbiBvcmRlciB0byBtYWtlIHRoZSBXb3JrZXIgZm9yZ2V0IGFib3V0IHRoaXMgQWN0aXZpdHkuXG4gKlxuICogVGhlIEFjdGl2aXR5IGNhbiB0aGVuIGJlIGNvbXBsZXRlZCBhc3luY2hyb25vdXNseSAoZnJvbSBhbnl3aGVyZeKAlHVzdWFsbHkgb3V0c2lkZSB0aGUgV29ya2VyKSB1c2luZ1xuICogdGhlIENsaWVudCdzIGFjdGl2aXR5IGhhbmRsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKmltcG9ydCB7IENvbXBsZXRlQXN5bmNFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2FjdGl2aXR5JztcbiAqXG4gKmV4cG9ydCBhc3luYyBmdW5jdGlvbiBteUFjdGl2aXR5KCk6IFByb21pc2U8bmV2ZXI+IHtcbiAqICAvLyAuLi5cbiAqICB0aHJvdyBuZXcgQ29tcGxldGVBc3luY0Vycm9yKCk7XG4gKn1cbiAqIGBgYFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NvbXBsZXRlQXN5bmNFcnJvcicpXG5leHBvcnQgY2xhc3MgQ29tcGxldGVBc3luY0Vycm9yIGV4dGVuZHMgRXJyb3Ige31cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UsIGlzUmVjb3JkLCBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbmV4cG9ydCBjb25zdCBGQUlMVVJFX1NPVVJDRSA9ICdUeXBlU2NyaXB0U0RLJztcbmV4cG9ydCB0eXBlIFByb3RvRmFpbHVyZSA9IHRlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLklGYWlsdXJlO1xuXG5leHBvcnQgY29uc3QgVGltZW91dFR5cGUgPSB7XG4gIFNUQVJUX1RPX0NMT1NFOiAnU1RBUlRfVE9fQ0xPU0UnLFxuICBTQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcbiAgU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG4gIEhFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU1RBUlRfVE9fQ0xPU0V9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19TVEFSVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNDSEVEVUxFX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSEVBUlRCRUFUfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfSEVBUlRCRUFUOiAnSEVBUlRCRUFUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRpbWVvdXRUeXBlID0gKHR5cGVvZiBUaW1lb3V0VHlwZSlba2V5b2YgdHlwZW9mIFRpbWVvdXRUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVUaW1lb3V0VHlwZSwgZGVjb2RlVGltZW91dFR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIFRpbWVvdXRUeXBlLFxuICAnVElNRU9VVF9UWVBFXydcbj4oXG4gIHtcbiAgICBbVGltZW91dFR5cGUuU1RBUlRfVE9fQ0xPU0VdOiAxLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19TVEFSVF06IDIsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX0NMT1NFXTogMyxcbiAgICBbVGltZW91dFR5cGUuSEVBUlRCRUFUXTogNCxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4pO1xuXG5leHBvcnQgY29uc3QgUmV0cnlTdGF0ZSA9IHtcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIE5PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsXG4gIFRJTUVPVVQ6ICdUSU1FT1VUJyxcbiAgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJyxcbiAgUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIENBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTl9QUk9HUkVTU30gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTk9OX1JFVFJZQUJMRV9GQUlMVVJFfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9OT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRJTUVPVVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1RJTUVPVVQ6ICdUSU1FT1VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVUUllfUE9MSUNZX05PVF9TRVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1JFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOVEVSTkFMX1NFUlZFUl9FUlJPUn0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDQU5DRUxfUkVRVUVTVEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9DQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJldHJ5U3RhdGUgPSAodHlwZW9mIFJldHJ5U3RhdGUpW2tleW9mIHR5cGVvZiBSZXRyeVN0YXRlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVSZXRyeVN0YXRlLCBkZWNvZGVSZXRyeVN0YXRlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiBSZXRyeVN0YXRlLFxuICAnUkVUUllfU1RBVEVfJ1xuPihcbiAge1xuICAgIFtSZXRyeVN0YXRlLklOX1BST0dSRVNTXTogMSxcbiAgICBbUmV0cnlTdGF0ZS5OT05fUkVUUllBQkxFX0ZBSUxVUkVdOiAyLFxuICAgIFtSZXRyeVN0YXRlLlRJTUVPVVRdOiAzLFxuICAgIFtSZXRyeVN0YXRlLk1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRF06IDQsXG4gICAgW1JldHJ5U3RhdGUuUkVUUllfUE9MSUNZX05PVF9TRVRdOiA1LFxuICAgIFtSZXRyeVN0YXRlLklOVEVSTkFMX1NFUlZFUl9FUlJPUl06IDYsXG4gICAgW1JldHJ5U3RhdGUuQ0FOQ0VMX1JFUVVFU1RFRF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdSRVRSWV9TVEFURV8nXG4pO1xuXG4vKipcbiAqIEEgY2F0ZWdvcnkgdG8gZGVzY3JpYmUgdGhlIHNldmVyaXR5IGFuZCBjaGFuZ2UgdGhlIG9ic2VydmFiaWxpdHkgYmVoYXZpb3Igb2YgYW4gYXBwbGljYXRpb24gZmFpbHVyZS5cbiAqXG4gKiBDdXJyZW50bHksIG9ic2VydmFiaWxpdHkgYmVoYXZpb3IgY2hhbmdlcyBhcmUgbGltaXRlZCB0bzpcbiAqIC0gYWN0aXZpdGllcyB0aGF0IGZhaWwgZHVlIHRvIGEgQkVOSUdOIGFwcGxpY2F0aW9uIGZhaWx1cmUgZW1pdCBERUJVRyBsZXZlbCBsb2dzIGFuZCBkbyBub3QgcmVjb3JkIG1ldHJpY3NcbiAqXG4gKiBAZXhwZXJpbWVudGFsIENhdGVnb3J5IGlzIGEgbmV3IGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0ge1xuICBCRU5JR046ICdCRU5JR04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0gKHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSlba2V5b2YgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSwgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuPihcbiAge1xuICAgIFtBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeS5CRU5JR05dOiAxLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuKTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dFeGVjdXRpb24gPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklXb3JrZmxvd0V4ZWN1dGlvbjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGZhaWx1cmVzIHRoYXQgY2FuIGNyb3NzIFdvcmtmbG93IGFuZCBBY3Rpdml0eSBib3VuZGFyaWVzLlxuICpcbiAqICoqTmV2ZXIgZXh0ZW5kIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBjaGlsZHJlbi4qKlxuICpcbiAqIFRoZSBvbmx5IGNoaWxkIGNsYXNzIHlvdSBzaG91bGQgZXZlciB0aHJvdyBmcm9tIHlvdXIgY29kZSBpcyB7QGxpbmsgQXBwbGljYXRpb25GYWlsdXJlfS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdUZW1wb3JhbEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlbXBvcmFsRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmYWlsdXJlIHRoYXQgY29uc3RydWN0ZWQgdGhpcyBlcnJvci5cbiAgICpcbiAgICogT25seSBwcmVzZW50IGlmIHRoaXMgZXJyb3Igd2FzIGdlbmVyYXRlZCBmcm9tIGFuIGV4dGVybmFsIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlPzogUHJvdG9GYWlsdXJlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKiogRXhjZXB0aW9ucyBvcmlnaW5hdGVkIGF0IHRoZSBUZW1wb3JhbCBzZXJ2aWNlLiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdTZXJ2ZXJGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU6IGJvb2xlYW4sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYHMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZmFpbHVyZXMgaW4gV29ya2Zsb3dzIGFuZCBBY3Rpdml0aWVzLlxuICpcbiAqIFRoZSB7QGxpbmsgdHlwZX0gcHJvcGVydHkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdGFuY2VcbiAqIG9mIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLiBBbm90aGVyIHdheSB0byBhdm9pZCByZXRyeWluZyBpcyBieSBzZXR0aW5nIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHRvIGB0cnVlYC5cbiAqXG4gKiBJbiBXb3JrZmxvd3MsIGlmIHlvdSB0aHJvdyBhIG5vbi1gQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IFRhc2sgd2lsbCBmYWlsIGFuZCBiZSByZXRyaWVkLiBJZiB5b3UgdGhyb3cgYW5cbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBJbiBBY3Rpdml0aWVzLCB5b3UgY2FuIGVpdGhlciB0aHJvdyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCBvciBhbm90aGVyIGBFcnJvcmAgdG8gZmFpbCB0aGUgQWN0aXZpdHkgVGFzay4gSW4gdGhlXG4gKiBsYXR0ZXIgY2FzZSwgdGhlIGBFcnJvcmAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYXMgZm9sbG93aW5nOlxuICpcbiAqIC0gYHR5cGVgIGlzIHNldCB0byBgZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZWBcbiAqIC0gYG1lc3NhZ2VgIGlzIHNldCB0byBgZXJyb3IubWVzc2FnZWBcbiAqIC0gYG5vblJldHJ5YWJsZWAgaXMgc2V0IHRvIGZhbHNlXG4gKiAtIGBkZXRhaWxzYCBhcmUgc2V0IHRvIG51bGxcbiAqIC0gc3RhY2sgdHJhY2UgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGVycm9yXG4gKlxuICogV2hlbiBhbiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYW4tYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwcmVjYXRlZC10aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFpbHVyZSc7XG5leHBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpb3JpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktcG9saWN5JztcbmV4cG9ydCB0eXBlIHsgVGltZXN0YW1wLCBEdXJhdGlvbiwgU3RyaW5nVmFsdWUgfSBmcm9tICcuL3RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuZXhwb3J0IHtcbiAgU2VhcmNoQXR0cmlidXRlcywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHsgQW55RnVuYywgT21pdExhc3RQYXJhbSB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IFBheWxvYWQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFR5cGUgb2YgdGhlIG5leHQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gaW50ZXJjZXB0b3IgZnVuY3Rpb25cbiAqXG4gKiBDYWxsZWQgZnJvbSBhbiBpbnRlcmNlcHRvciB0byBjb250aW51ZSB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbmV4cG9ydCB0eXBlIE5leHQ8SUYsIEZOIGV4dGVuZHMga2V5b2YgSUY+ID0gUmVxdWlyZWQ8SUY+W0ZOXSBleHRlbmRzIEFueUZ1bmMgPyBPbWl0TGFzdFBhcmFtPFJlcXVpcmVkPElGPltGTl0+IDogbmV2ZXI7XG5cbi8qKiBIZWFkZXJzIGFyZSBqdXN0IGEgbWFwcGluZyBvZiBoZWFkZXIgbmFtZSB0byBQYXlsb2FkICovXG5leHBvcnQgdHlwZSBIZWFkZXJzID0gUmVjb3JkPHN0cmluZywgUGF5bG9hZD47XG5cbi8qKlxuICogQ29tcG9zZSBhbGwgaW50ZXJjZXB0b3IgbWV0aG9kcyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIENhbGxpbmcgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uIHJlc3VsdHMgaW4gY2FsbGluZyBlYWNoIG9mIHRoZSBwcm92aWRlZCBpbnRlcmNlcHRvciwgaW4gb3JkZXIgKGZyb20gdGhlIGZpcnN0IHRvXG4gKiB0aGUgbGFzdCksIGZvbGxvd2VkIGJ5IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBwcm92aWRlZCBhcyBhcmd1bWVudCB0byBgY29tcG9zZUludGVyY2VwdG9ycygpYC5cbiAqXG4gKiBAcGFyYW0gaW50ZXJjZXB0b3JzIGEgbGlzdCBvZiBpbnRlcmNlcHRvcnNcbiAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIG1ldGhvZCB0byBjb21wb3NlXG4gKiBAcGFyYW0gbmV4dCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0IChpbXBvcnRlZCB2aWEgbGliL2ludGVyY2VwdG9ycylcbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIGZvciAobGV0IGkgPSBpbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICBjb25zdCBpbnRlcmNlcHRvciA9IGludGVyY2VwdG9yc1tpXTtcbiAgICBpZiAoaW50ZXJjZXB0b3I/LlttZXRob2RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBuZXh0O1xuICAgICAgLy8gV2UgbG9zZSB0eXBlIHNhZmV0eSBoZXJlIGJlY2F1c2UgVHlwZXNjcmlwdCBjYW4ndCBkZWR1Y2UgdGhhdCBpbnRlcmNlcHRvclttZXRob2RdIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICAvLyB0aGUgc2FtZSB0eXBlIGFzIE5leHQ8SSwgTT5cbiAgICAgIG5leHQgPSAoKGlucHV0OiBhbnkpID0+IChpbnRlcmNlcHRvclttZXRob2RdIGFzIGFueSkoaW5wdXQsIHByZXYpKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXh0O1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuZXhwb3J0IHR5cGUgUGF5bG9hZCA9IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVBheWxvYWQ7XG5cbi8qKiBUeXBlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSBXb3JrZmxvdyBgZXhlY3V0ZWAgZnVuY3Rpb24gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmV0dXJuVHlwZSA9IFByb21pc2U8YW55PjtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+IHwgYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1VwZGF0ZVR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICB2YWxpZGF0b3I/OiBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGU7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93U2lnbmFsVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUgPSB7XG4gIGhhbmRsZXI6IFdvcmtmbG93U2lnbmFsVHlwZTtcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93UXVlcnlUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSA9IHsgaGFuZGxlcjogV29ya2Zsb3dRdWVyeVR5cGU7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQnJvYWQgV29ya2Zsb3cgZnVuY3Rpb24gZGVmaW5pdGlvbiwgc3BlY2lmaWMgV29ya2Zsb3dzIHdpbGwgdHlwaWNhbGx5IHVzZSBhIG5hcnJvd2VyIHR5cGUgZGVmaW5pdGlvbiwgZS5nOlxuICogYGBgdHNcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBXb3JrZmxvd1JldHVyblR5cGU7XG5cbmRlY2xhcmUgY29uc3QgYXJnc0JyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCByZXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgdXBkYXRlIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVVwZGF0ZX1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHVwZGF0ZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAndXBkYXRlJztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IGFyZ3MuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbYXJnc0JyYW5kXTogQXJncztcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgc2lnbmFsIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHNpZ25hbCBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlZmluaXRpb248QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3NpZ25hbCc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBTaWduYWxEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHF1ZXJ5IGRlZmluaXRpb24gYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lUXVlcnl9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGFuZCBgUmV0YCBjYW4gYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHR5cGUgaW5mZXJlbmNlIGluIGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBXb3JrZmxvd0hhbmRsZSBtZXRob2RzLlxuICogYE5hbWVgIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSB0byBwcmVzZXJ2ZSB0eXBlLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgcXVlcnkgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAncXVlcnknO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBRdWVyeURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqIEdldCB0aGUgXCJ1bndyYXBwZWRcIiByZXR1cm4gdHlwZSAod2l0aG91dCBQcm9taXNlKSBvZiB0aGUgZXhlY3V0ZSBoYW5kbGVyIGZyb20gV29ya2Zsb3cgdHlwZSBgV2AgKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVzdWx0VHlwZTxXIGV4dGVuZHMgV29ya2Zsb3c+ID0gUmV0dXJuVHlwZTxXPiBleHRlbmRzIFByb21pc2U8aW5mZXIgUj4gPyBSIDogbmV2ZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlGdW5jdGlvbjxQIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUiA9IGFueT4ge1xuICAoLi4uYXJnczogUCk6IFByb21pc2U8Uj47XG59XG5cbi8qKlxuICogTWFwcGluZyBvZiBBY3Rpdml0eSBuYW1lIHRvIGZ1bmN0aW9uXG4gKiBAZGVwcmVjYXRlZCBub3QgcmVxdWlyZWQgYW55bW9yZSwgZm9yIHVudHlwZWQgYWN0aXZpdGllcyB1c2Uge0BsaW5rIFVudHlwZWRBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eUludGVyZmFjZSA9IFJlY29yZDxzdHJpbmcsIEFjdGl2aXR5RnVuY3Rpb24+O1xuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICovXG5leHBvcnQgdHlwZSBVbnR5cGVkQWN0aXZpdGllcyA9IFJlY29yZDxzdHJpbmcsIEFjdGl2aXR5RnVuY3Rpb24+O1xuXG4vKipcbiAqIEEgd29ya2Zsb3cncyBoaXN0b3J5IGFuZCBJRC4gVXNlZnVsIGZvciByZXBsYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUFuZFdvcmtmbG93SWQge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHRlbXBvcmFsLmFwaS5oaXN0b3J5LnYxLkhpc3RvcnkgfCB1bmtub3duIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBvbGljeSBkZWZpbmluZyBhY3Rpb25zIHRha2VuIHdoZW4gYSB3b3JrZmxvdyBleGl0cyB3aGlsZSB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXJzIGFyZSBydW5uaW5nLlxuICogVGhlIHdvcmtmbG93IGV4aXQgbWF5IGJlIGR1ZSB0byBzdWNjZXNzZnVsIHJldHVybiwgZmFpbHVyZSwgY2FuY2VsbGF0aW9uLCBvciBjb250aW51ZS1hcy1uZXcuXG4gKi9cbmV4cG9ydCBjb25zdCBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIElzc3VlIGEgd2FybmluZyBpbiBhZGRpdGlvbiB0byBhYmFuZG9uaW5nIHRoZSBoYW5kbGVyIGV4ZWN1dGlvbi4gVGhlIHdhcm5pbmcgd2lsbCBub3QgYmUgaXNzdWVkIGlmIHRoZSB3b3JrZmxvdyBmYWlscy5cbiAgICovXG4gIFdBUk5fQU5EX0FCQU5ET046ICdXQVJOX0FORF9BQkFORE9OJyxcblxuICAvKipcbiAgICogQWJhbmRvbiB0aGUgaGFuZGxlciBleGVjdXRpb24uXG4gICAqXG4gICAqIEluIHRoZSBjYXNlIG9mIGFuIHVwZGF0ZSBoYW5kbGVyIHRoaXMgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciByYXRoZXIgdGhhblxuICAgKiB0aGUgdXBkYXRlIHJlc3VsdC5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSA9ICh0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kpW2tleW9mIHR5cGVvZiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeV07XG4iLCJpbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnO1xuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcyBhcyBhIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0NvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgY291bnRlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZC5cbiAgICogQHBhcmFtIGV4dHJhVGFncyBFeHRyYSB0YWdzIGlmIGFueS5cbiAgICovXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyO1xuXG4gIGtpbmQ6ICdjb3VudGVyJztcbiAgdmFsdWVUeXBlOiAnaW50Jztcbn1cblxuLyoqXG4gKiBBIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMgb24gYSBoaXN0b2dyYW0uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0hpc3RvZ3JhbSBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBSZWNvcmQgdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBoaXN0b2dyYW0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byByZWNvcmQuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBWYWx1ZSB3aWxsIGJlIGNhc3RlZCB0byB0aGUgZ2l2ZW5cbiAgICogICAgICAgICAgICAgIHtAbGluayB2YWx1ZVR5cGV9LiBMb3NzIG9mIHByZWNpc2lvbiBtYXkgb2NjdXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBhbHJlYWR5IG9mIHRoZVxuICAgKiAgICAgICAgICAgICAgY29ycmVjdCB0eXBlLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgcmVjb3JkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGhpc3RvZ3JhbSwgd2l0aCBhZGRpdGlvbmFsIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIFRhZ3MgdG8gYXBwZW5kIHRvIGV4aXN0aW5nIHRhZ3MuXG4gICAqL1xuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtO1xuXG4gIGtpbmQ6ICdoaXN0b2dyYW0nO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgc2V0dGluZyB2YWx1ZXMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0dhdWdlIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFNldCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGdhdWdlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGdhdWdlLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNHYXVnZTtcblxuICBraW5kOiAnZ2F1Z2UnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHdpdGhUYWdzKF9leHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5vb3BNZXRyaWNNZXRlciA9IG5ldyBOb29wTWV0cmljTWV0ZXIoKTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgdHlwZSBNZXRyaWNUYWdzT3JGdW5jID0gTWV0cmljVGFncyB8ICgoKSA9PiBNZXRyaWNUYWdzKTtcblxuLyoqXG4gKiBBIG1ldGVyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogUmV0dXJuIGEge0BsaW5rIE1ldHJpY01ldGVyfSB0aGF0IGFkZHMgdGFncyBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBtZXRlci5cbiAgICpcbiAgICogTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKlxuICAgKiBTb21lIG9wdGltaXphdGlvbnMgYXJlIHBlcmZvcm1lZCB0byBhdm9pZCBjcmVhdGluZyB1bm5lY2Vzc2FyeSBvYmplY3RzIGFuZCB0byBrZWVwIHJ1bnRpbWVcbiAgICogb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoIHJlc29sdmluZyB0YWdzIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGVyIFRoZSBwYXJlbnQgbWV0ZXIgdG8gZGVsZWdhdGUgY2FsbHMgdG8uXG4gICAqIEBwYXJhbSB0YWdzT3JGdW5jIE5ldyB0YWdzIG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIHN0YXRpY2FsbHkgYXMgYSBkZWx0YSBvYmplY3QsIG9yIGFzIGEgZnVuY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkIGV2ZXJ5IHRpbWUgYSBtZXRyaWMgaXMgcmVjb3JkZWQgdGhhdCB3aWxsIHJldHVybiBhIGRlbHRhIG9iamVjdC5cbiAgICogQHBhcmFtIGZvcmNlIGlmIGB0cnVlYCwgdGhlbiBhIGBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3NgIHdpbGwgYmUgY3JlYXRlZCBldmVuIGlmIHRoZXJlXG4gICAqICAgICAgICAgICAgICBpcyBubyB0YWdzIHRvIGFkZC4gVGhpcyBpcyB1c2VmdWwgdG8gYWRkIHRhZ3Mgc3VwcG9ydCB0byBhbiB1bmRlcmx5aW5nIG1ldGVyXG4gICAqICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGFncyBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShtZXRlcjogTWV0cmljTWV0ZXIsIHRhZ3NPckZ1bmM6IE1ldHJpY1RhZ3NPckZ1bmMsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBNZXRyaWNNZXRlciB7XG4gICAgaWYgKG1ldGVyIGluc3RhbmNlb2YgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKG1ldGVyLmNvbnRyaWJ1dG9ycywgdGFnc09yRnVuYyk7XG4gICAgICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW4sIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIG5ldyBtZXRlclxuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIucGFyZW50TWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCB0YWdzT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCAmJiAhZm9yY2UpIHJldHVybiBtZXRlcjtcbiAgICAgIHJldHVybiBuZXcgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzKG1ldGVyLCBjb250cmlidXRvcnMgPz8gW10pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRNZXRlcjogTWV0cmljTWV0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgY3JlYXRlQ291bnRlcihuYW1lOiBzdHJpbmcsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljQ291bnRlciB7XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBwYXJlbnRIaXN0b2dyYW0gPSB0aGlzLnBhcmVudE1ldGVyLmNyZWF0ZUhpc3RvZ3JhbShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0hpc3RvZ3JhbVdpdGhDb21wb3NlZFRhZ3MocGFyZW50SGlzdG9ncmFtLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgY29uc3QgcGFyZW50R2F1Z2UgPSB0aGlzLnBhcmVudE1ldGVyLmNyZWF0ZUdhdWdlKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzKHBhcmVudEdhdWdlLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGFncyhjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IE1ldHJpY1RhZ3Mge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFUYWdzKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIHRhZ3MgY29udHJpYnV0b3IgdG8gdGhlIGNoYWluLCBtZXJnaW5nIGl0IHdpdGggdGhlIGZvcm1lciBsYXN0IGNvbnRyaWJ1dG9yIGlmIHBvc3NpYmxlLlxuICpcbiAqIElmIGFwcGVuZGluZyB0aGUgbmV3IGNvbnRyaWJ1dG9yIHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW4gb2YgY29udHJpYnV0b3JzLCByZXR1cm5cbiAqIGBleGlzdGluZ0NvbnRyaWJ1dG9yc2A7IGluIHRoYXQgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQgYXZvaWQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGlmIHBvc3NpYmxlLlxuICovXG5mdW5jdGlvbiBhcHBlbmRUb0NoYWluKFxuICBleGlzdGluZ0NvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdIHwgdW5kZWZpbmVkLFxuICBuZXdDb250cmlidXRvcjogTWV0cmljVGFnc09yRnVuY1xuKTogTWV0cmljVGFnc09yRnVuY1tdIHwgdW5kZWZpbmVkIHtcbiAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciBpcyBhbiBlbXB0eSBvYmplY3QsIHRoZW4gaXQgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpblxuICBpZiAodHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhuZXdDb250cmlidXRvcikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICB9XG5cbiAgLy8gSWYgZXhpc3RpbmcgY2hhaW4gaXMgZW1wdHksIHRoZW4gdGhlIG5ldyBjb250cmlidXRvciBpcyB0aGUgY2hhaW5cbiAgaWYgKGV4aXN0aW5nQ29udHJpYnV0b3JzID09IG51bGwgfHwgZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtuZXdDb250cmlidXRvcl07XG4gIH1cblxuICAvLyBJZiBib3RoIGxhc3QgY29udHJpYnV0b3IgYW5kIG5ldyBjb250cmlidXRvciBhcmUgcGxhaW4gb2JqZWN0cywgbWVyZ2UgdGhlbSB0byBhIHNpbmdsZSBvYmplY3QuXG4gIGNvbnN0IGxhc3QgPSBleGlzdGluZ0NvbnRyaWJ1dG9yc1tleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggLSAxXTtcbiAgaWYgKHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VPYmplY3RzKGxhc3QsIG5ld0NvbnRyaWJ1dG9yKTtcbiAgICBpZiAobWVyZ2VkID09PSBsYXN0KSByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gICAgcmV0dXJuIFsuLi5leGlzdGluZ0NvbnRyaWJ1dG9ycy5zbGljZSgwLCAtMSksIG1lcmdlZCFdO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFwcGVuZCB0aGUgbmV3IGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbi5cbiAgcmV0dXJuIFsuLi5leGlzdGluZ0NvbnRyaWJ1dG9ycywgbmV3Q29udHJpYnV0b3JdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBQcmlvcml0eSBjb250YWlucyBtZXRhZGF0YSB0aGF0IGNvbnRyb2xzIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHRhc2sgcHJvY2Vzc2luZyB3aGVuIHRhc2tzIGFyZVxuICogYmFja2xvZ2dlZCBpbiBhIHF1ZXVlLiBJbml0aWFsbHksIFByaW9yaXR5IHdpbGwgYmUgdXNlZCBpbiBhY3Rpdml0eSBhbmQgd29ya2Zsb3cgdGFzayBxdWV1ZXMsXG4gKiB3aGljaCBhcmUgdHlwaWNhbGx5IHdoZXJlIGJhY2tsb2dzIGV4aXN0LlxuICogUHJpb3JpdHkgaXMgKGZvciBub3cpIGF0dGFjaGVkIHRvIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy4gQWN0aXZpdGllcyBhbmQgY2hpbGQgd29ya2Zsb3dzXG4gKiBpbmhlcml0IFByaW9yaXR5IGZyb20gdGhlIHdvcmtmbG93IHRoYXQgY3JlYXRlZCB0aGVtLCBidXQgbWF5IG92ZXJyaWRlIGZpZWxkcyB3aGVuIHRoZXkgYXJlXG4gKiBzdGFydGVkIG9yIG1vZGlmaWVkLiBGb3IgZWFjaCBmaWVsZCBvZiBhIFByaW9yaXR5IG9uIGFuIGFjdGl2aXR5L3dvcmtmbG93LCBub3QgcHJlc2VudCBvciBlcXVhbFxuICogdG8gemVyby9lbXB0eSBzdHJpbmcgbWVhbnMgdG8gaW5oZXJpdCB0aGUgdmFsdWUgZnJvbSB0aGUgY2FsbGluZyB3b3JrZmxvdywgb3IgaWYgdGhlcmUgaXMgbm9cbiAqIGNhbGxpbmcgd29ya2Zsb3csIHRoZW4gdXNlIHRoZSBkZWZhdWx0IChkb2N1bWVudGVkIG9uIHRoZSBmaWVsZCkuXG4gKiBUaGUgb3ZlcmFsbCBzZW1hbnRpY3Mgb2YgUHJpb3JpdHkgYXJlOlxuICogMS4gRmlyc3QsIGNvbnNpZGVyIFwicHJpb3JpdHlfa2V5XCI6IGxvd2VyIG51bWJlciBnb2VzIGZpcnN0LlxuICogMi4gVGhlbiwgY29uc2lkZXIgZmFpcm5lc3M6IHRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gKiAgICBwcm9wb3J0aW9uIHRvIGl0cyB3ZWlnaHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpb3JpdHkge1xuICAvKipcbiAgICogUHJpb3JpdHkga2V5IGlzIGEgcG9zaXRpdmUgaW50ZWdlciBmcm9tIDEgdG8gbiwgd2hlcmUgc21hbGxlciBpbnRlZ2Vyc1xuICAgKiBjb3JyZXNwb25kIHRvIGhpZ2hlciBwcmlvcml0aWVzICh0YXNrcyBydW4gc29vbmVyKS4gSW4gZ2VuZXJhbCwgdGFza3MgaW5cbiAgICogYSBxdWV1ZSBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIGNsb3NlIHRvIHByaW9yaXR5IG9yZGVyLCBhbHRob3VnaCBzbWFsbFxuICAgKiBkZXZpYXRpb25zIGFyZSBwb3NzaWJsZS5cbiAgICpcbiAgICogVGhlIG1heGltdW0gcHJpb3JpdHkgdmFsdWUgKG1pbmltdW0gcHJpb3JpdHkpIGlzIGRldGVybWluZWQgYnkgc2VydmVyIGNvbmZpZ3VyYXRpb24sIGFuZFxuICAgKiBkZWZhdWx0cyB0byA1LlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyAobWluK21heCkvMi4gV2l0aCB0aGUgZGVmYXVsdCBtYXggb2YgNSBhbmQgbWluIG9mIDEsIHRoYXQgY29tZXMgb3V0IHRvIDMuXG4gICAqL1xuICBwcmlvcml0eUtleT86IG51bWJlcjtcblxuICAvKipcbiAgICogRmFpcm5lc3NLZXkgaXMgYSBzaG9ydCBzdHJpbmcgdGhhdCdzIHVzZWQgYXMgYSBrZXkgZm9yIGEgZmFpcm5lc3NcbiAgICogYmFsYW5jaW5nIG1lY2hhbmlzbS4gSXQgbWF5IGNvcnJlc3BvbmQgdG8gYSB0ZW5hbnQgaWQsIG9yIHRvIGEgZml4ZWRcbiAgICogc3RyaW5nIGxpa2UgXCJoaWdoXCIgb3IgXCJsb3dcIi4gVGhlIGRlZmF1bHQgaXMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogVGhlIGZhaXJuZXNzIG1lY2hhbmlzbSBhdHRlbXB0cyB0byBkaXNwYXRjaCB0YXNrcyBmb3IgYSBnaXZlbiBrZXkgaW5cbiAgICogcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LiBGb3IgZXhhbXBsZSwgdXNpbmcgYSB0aG91c2FuZCBkaXN0aW5jdCB0ZW5hbnRcbiAgICogaWRzLCBlYWNoIHdpdGggYSB3ZWlnaHQgb2YgMS4wICh0aGUgZGVmYXVsdCkgd2lsbCByZXN1bHQgaW4gZWFjaCB0ZW5hbnRcbiAgICogZ2V0dGluZyBhIHJvdWdobHkgZXF1YWwgc2hhcmUgb2YgdGFzayBkaXNwYXRjaCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBGYWlybmVzcyBrZXlzIGFyZSBsaW1pdGVkIHRvIDY0IGJ5dGVzLlxuICAgKi9cbiAgZmFpcm5lc3NLZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzV2VpZ2h0IGZvciBhIHRhc2sgY2FuIGNvbWUgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIGZvclxuICAgKiBmbGV4aWJpbGl0eS4gRnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBwcmVjZWRlbmNlOlxuICAgKiAxLiBXZWlnaHRzIGZvciBhIHNtYWxsIHNldCBvZiBrZXlzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRhc2sgcXVldWVcbiAgICogICAgY29uZmlndXJhdGlvbiB3aXRoIGFuIEFQSS5cbiAgICogMi4gSXQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSB3b3JrZmxvdy9hY3Rpdml0eSBpbiB0aGlzIGZpZWxkLlxuICAgKiAzLiBUaGUgZGVmYXVsdCB3ZWlnaHQgb2YgMS4wIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogV2VpZ2h0IHZhbHVlcyBhcmUgY2xhbXBlZCB0byB0aGUgcmFuZ2UgWzAuMDAxLCAxMDAwXS5cbiAgICovXG4gIGZhaXJuZXNzV2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFByaW9yaXR5IGludG8gYSBUUyBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHJpb3JpdHkocHJpb3JpdHk/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQcmlvcml0eSB8IG51bGwpOiBQcmlvcml0eSB7XG4gIHJldHVybiB7XG4gICAgcHJpb3JpdHlLZXk6IHByaW9yaXR5Py5wcmlvcml0eUtleSA/PyB1bmRlZmluZWQsXG4gICAgZmFpcm5lc3NLZXk6IHByaW9yaXR5Py5mYWlybmVzc0tleSA/PyB1bmRlZmluZWQsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5Py5mYWlybmVzc1dlaWdodCA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIFRTIFByaW9yaXR5IGludG8gYSBwcm90byBjb21wYXRpYmxlIFByaW9yaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlUHJpb3JpdHkocHJpb3JpdHk6IFByaW9yaXR5KTogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkge1xuICBpZiAocHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IHVuZGVmaW5lZCAmJiBwcmlvcml0eS5wcmlvcml0eUtleSAhPT0gbnVsbCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwcmlvcml0eS5wcmlvcml0eUtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkucHJpb3JpdHlLZXkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigncHJpb3JpdHlLZXkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eS5wcmlvcml0eUtleSA/PyAwLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eS5mYWlybmVzc0tleSA/PyAnJyxcbiAgICBmYWlybmVzc1dlaWdodDogcHJpb3JpdHkuZmFpcm5lc3NXZWlnaHQgPz8gMCxcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVggPSAnX190ZW1wb3JhbF8nO1xuZXhwb3J0IGNvbnN0IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19zdGFja190cmFjZSc7XG5leHBvcnQgY29uc3QgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSA9ICdfX2VuaGFuY2VkX3N0YWNrX3RyYWNlJztcblxuLyoqXG4gKiBWYWxpZCBlbnRpdHkgdHlwZXMgdGhhdCBjYW4gYmUgY2hlY2tlZCBmb3IgcmVzZXJ2ZWQgbmFtZSB2aW9sYXRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIFJlc2VydmVkTmFtZUVudGl0eVR5cGUgPSAncXVlcnknIHwgJ3NpZ25hbCcgfCAndXBkYXRlJyB8ICdhY3Rpdml0eScgfCAndGFzayBxdWV1ZScgfCAnc2luaycgfCAnd29ya2Zsb3cnO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBpZiB0aGUgcHJvdmlkZWQgbmFtZSBjb250YWlucyBhbnkgcmVzZXJ2ZWQgcHJlZml4ZXMgb3IgbWF0Y2hlcyBhbnkgcmVzZXJ2ZWQgbmFtZXMuXG4gKiBUaHJvd3MgYSBUeXBlRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscywgd2l0aCBhIHNwZWNpZmljIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpc3N1ZVxuICogaXMgd2l0aCBhIHJlc2VydmVkIHByZWZpeCBvciBhbiBleGFjdCBtYXRjaCB0byBhIHJlc2VydmVkIG5hbWUuXG4gKlxuICogQHBhcmFtIHR5cGUgVGhlIGVudGl0eSB0eXBlIGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGNoZWNrIGFnYWluc3QgcmVzZXJ2ZWQgcHJlZml4ZXMvbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZSZXNlcnZlZE5hbWUodHlwZTogUmVzZXJ2ZWROYW1lRW50aXR5VHlwZSwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgJHt0eXBlfSBuYW1lOiAnJHtuYW1lfScsIHdpdGggcmVzZXJ2ZWQgcHJlZml4OiAnJHtURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9J2ApO1xuICB9XG5cbiAgaWYgKG5hbWUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHwgbmFtZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgJHt0eXBlfSBuYW1lOiAnJHtuYW1lfScsIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgbmFtZWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IER1cmF0aW9uLCBtc09wdGlvbmFsVG9OdW1iZXIsIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIG9wdGlvbmFsVHNUb01zIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXRyeWluZyBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBDb2VmZmljaWVudCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV4dCByZXRyeSBpbnRlcnZhbC5cbiAgICogVGhlIG5leHQgcmV0cnkgaW50ZXJ2YWwgaXMgcHJldmlvdXMgaW50ZXJ2YWwgbXVsdGlwbGllZCBieSB0aGlzIGNvZWZmaWNpZW50LlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludGVydmFsIG9mIHRoZSBmaXJzdCByZXRyeS5cbiAgICogSWYgY29lZmZpY2llbnQgaXMgMSB0aGVuIGl0IGlzIHVzZWQgZm9yIGFsbCByZXRyaWVzXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiBAZGVmYXVsdCAxIHNlY29uZFxuICAgKi9cbiAgaW5pdGlhbEludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cy4gV2hlbiBleGNlZWRlZCwgcmV0cmllcyBzdG9wIChldmVuIGlmIHtAbGluayBBY3Rpdml0eU9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dH1cbiAgICogaGFzbid0IGJlZW4gcmVhY2hlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEluZmluaXR5XG4gICAqL1xuICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gcmV0cmllcy5cbiAgICogRXhwb25lbnRpYWwgYmFja29mZiBsZWFkcyB0byBpbnRlcnZhbCBpbmNyZWFzZS5cbiAgICogVGhpcyB2YWx1ZSBpcyB0aGUgY2FwIG9mIHRoZSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAweCBvZiB7QGxpbmsgaW5pdGlhbEludGVydmFsfVxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIG1heGltdW1JbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9uIGZhaWx1cmVzIHR5cGVzIHRvIG5vdCByZXRyeS5cbiAgICovXG4gIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgVFMgUmV0cnlQb2xpY3kgaW50byBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVSZXRyeVBvbGljeShyZXRyeVBvbGljeTogUmV0cnlQb2xpY3kpOiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB7XG4gIGlmIChyZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgIT0gbnVsbCAmJiByZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgLy8gZHJvcCBmaWVsZCAoSW5maW5pdHkgaXMgdGhlIGRlZmF1bHQpXG4gICAgICBjb25zdCB7IG1heGltdW1BdHRlbXB0czogXywgLi4ud2l0aG91dCB9ID0gcmV0cnlQb2xpY3k7XG4gICAgICByZXRyeVBvbGljeSA9IHdpdGhvdXQ7XG4gICAgfSBlbHNlIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIocmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF4aW11bUludGVydmFsID0gbXNPcHRpb25hbFRvTnVtYmVyKHJldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCk7XG4gIGNvbnN0IGluaXRpYWxJbnRlcnZhbCA9IG1zVG9OdW1iZXIocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsID8/IDEwMDApO1xuICBpZiAobWF4aW11bUludGVydmFsID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgMCcpO1xuICB9XG4gIGlmIChpbml0aWFsSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKG1heGltdW1JbnRlcnZhbCAhPSBudWxsICYmIG1heGltdW1JbnRlcnZhbCA8IGluaXRpYWxJbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwgY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgaW5pdGlhbEludGVydmFsJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG1zVG9Ucyhpbml0aWFsSW50ZXJ2YWwpLFxuICAgIG1heGltdW1JbnRlcnZhbDogbXNPcHRpb25hbFRvVHMobWF4aW11bUludGVydmFsKSxcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFJldHJ5UG9saWN5IGludG8gYSBUUyBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb21waWxlUmV0cnlQb2xpY3koXG4gIHJldHJ5UG9saWN5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUmV0cnlQb2xpY3kgfCBudWxsXG4pOiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmV0cnlQb2xpY3kpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUF0dGVtcHRzOiByZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPz8gdW5kZWZpbmVkLFxuICAgIG1heGltdW1JbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKSxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG9wdGlvbmFsVHNUb01zKHJldHJ5UG9saWN5LmluaXRpYWxJbnRlcnZhbCksXG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogcmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlcyA/PyB1bmRlZmluZWQsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5ID0gU2VhcmNoQXR0cmlidXRlVmFsdWUgfCBSZWFkb25seTxTZWFyY2hBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZXMgPSBSZWNvcmQ8c3RyaW5nLCBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHk+OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSA9IHN0cmluZ1tdIHwgbnVtYmVyW10gfCBib29sZWFuW10gfCBEYXRlW107XG5cbmV4cG9ydCBjb25zdCBTZWFyY2hBdHRyaWJ1dGVUeXBlID0ge1xuICBURVhUOiAnVEVYVCcsXG4gIEtFWVdPUkQ6ICdLRVlXT1JEJyxcbiAgSU5UOiAnSU5UJyxcbiAgRE9VQkxFOiAnRE9VQkxFJyxcbiAgQk9PTDogJ0JPT0wnLFxuICBEQVRFVElNRTogJ0RBVEVUSU1FJyxcbiAgS0VZV09SRF9MSVNUOiAnS0VZV09SRF9MSVNUJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVUeXBlID0gKHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlKVtrZXlvZiB0eXBlb2YgU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbi8vIE5vdGU6IGVuY29kZVNlYXJjaEF0dHJpYnV0ZUluZGV4ZWRWYWx1ZVR5cGUgZXhwb3J0ZWQgZm9yIHVzZSBpbiB0ZXN0cyB0byByZWdpc3RlciBzZWFyY2ggYXR0cmlidXRlc1xuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSwgX10gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICB0eXBlb2YgU2VhcmNoQXR0cmlidXRlVHlwZSxcbiAgJ0lOREVYRURfVkFMVUVfVFlQRV8nXG4+KFxuICB7XG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuVEVYVF06IDEsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF06IDIsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UXTogMyxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEVdOiA0LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0xdOiA1LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FXTogNixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1RdOiA3LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbik7XG5cbmludGVyZmFjZSBJbmRleGVkVmFsdWVUeXBlTWFwcGluZyB7XG4gIFRFWFQ6IHN0cmluZztcbiAgS0VZV09SRDogc3RyaW5nO1xuICBJTlQ6IG51bWJlcjtcbiAgRE9VQkxFOiBudW1iZXI7XG4gIEJPT0w6IGJvb2xlYW47XG4gIERBVEVUSU1FOiBEYXRlO1xuICBLRVlXT1JEX0xJU1Q6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFZhbHVlRm9yVHlwZTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4oXG4gIHR5cGU6IFQsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUOlxuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEOlxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVDpcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFOlxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0w6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FOlxuICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUOlxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lU2VhcmNoQXR0cmlidXRlS2V5PFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihuYW1lOiBzdHJpbmcsIHR5cGU6IFQpOiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD4ge1xuICByZXR1cm4geyBuYW1lLCB0eXBlIH07XG59XG5cbmNsYXNzIEJhc2VTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZSwgViA9IEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3R5cGU6IFQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlOiBWO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IFQsIHZhbHVlOiBWKSB7XG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCB0eXBlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFYge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxufVxuXG4vLyBJbnRlcm5hbCB0eXBlIGZvciBjbGFzcyBwcml2YXRlIGRhdGEuXG4vLyBFeHBvcnRlZCBmb3IgdXNlIGluIHBheWxvYWQgY29udmVyc2lvbi5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPiBleHRlbmRzIEJhc2VTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxUPiB7fVxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPiBleHRlbmRzIEJhc2VTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxcbiAgVCxcbiAgSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCBudWxsXG4+IHt9XG5cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVBhaXIgPSB7XG4gIFtUIGluIFNlYXJjaEF0dHJpYnV0ZVR5cGVdOiB7IGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+OyB2YWx1ZTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIgPSB7XG4gIFtUIGluIFNlYXJjaEF0dHJpYnV0ZVR5cGVdOiB7IGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+OyB2YWx1ZTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCBudWxsIH07XG59W1NlYXJjaEF0dHJpYnV0ZVR5cGVdO1xuXG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgcHJpdmF0ZSBzZWFyY2hBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFNlYXJjaEF0dHJpYnV0ZVR5cGU+PiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlUGFpcltdKSB7XG4gICAgaWYgKGluaXRpYWxBdHRyaWJ1dGVzID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgaW5pdGlhbEF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChwYWlyLmtleS5uYW1lIGluIHRoaXMuc2VhcmNoQXR0cmlidXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBzZWFyY2ggYXR0cmlidXRlIGtleTogJHtwYWlyLmtleS5uYW1lfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdID0gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUocGFpci5rZXkudHlwZSwgcGFpci52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0PFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihrZXk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPik6IEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW2tleS5uYW1lXTtcbiAgICAvLyBLZXkgbm90IGZvdW5kIG9yIHR5cGUgbWlzbWF0Y2guXG4gICAgaWYgKGF0dHIgPT09IHVuZGVmaW5lZCB8fCAhaXNWYWxpZFZhbHVlRm9yVHlwZShrZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhdHRyLnZhbHVlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIFR5cGVkU2VhcmNoQXR0cmlidXRlcyBpbnN0YW5jZSAqL1xuICBjb3B5KCk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgY29uc3Qgc3RhdGU6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGF0dHJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXNcbiAgICAgIGxldCB2YWx1ZSA9IGF0dHIudmFsdWU7XG4gICAgICAvLyBGb3Igbm9uLXByaW1pdGl2ZSB0eXBlcywgY3JlYXRlIGEgZGVlcCBjb3B5XG4gICAgICBpZiAoYXR0ci52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZShhdHRyLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhdHRyLnZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IFsuLi5hdHRyLnZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHN0YXRlW2tleV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShhdHRyLnR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcmV0dXJuIHZhbHVlIHdpdGggbWFudWFsbHkgYXNzaWduZWQgc3RhdGUuXG4gICAgY29uc3QgcmVzID0gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlcygpO1xuICAgIHJlcy5zZWFyY2hBdHRyaWJ1dGVzID0gc3RhdGU7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaGlkZGVuXG4gICAqIFJldHVybiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3MgYXMgU2VhcmNoQXR0cmlidXRlUGFpcltdXG4gICAqIERlZmF1bHQgdG9KU09OIG1ldGhvZCBpcyBub3QgdXNlZCBiZWNhdXNlIGl0J3MgSlNPTiByZXByZXNlbnRhdGlvbiBpbmNsdWRlcyBwcml2YXRlIHN0YXRlLlxuICAgKi9cbiAgdG9KU09OKCk6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlIHdpdGggdGhlIHVwZGF0ZWQgYXR0cmlidXRlcy4gKi9cbiAgdXBkYXRlQ29weSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICAgIC8vIENyZWF0ZSBhIGRlZXAgY29weSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICBjb25zdCByZXMgPSB0aGlzLmNvcHkoKTtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIHJlcy51cGRhdGUodXBkYXRlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIFBlcmZvcm1zIGRpcmVjdCBtdXRhdGlvbiBvbiB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgcHJpdmF0ZSB1cGRhdGUodXBkYXRlczogU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdKSB7XG4gICAgLy8gQXBwbHkgdXBkYXRlcy5cbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdXBkYXRlcykge1xuICAgICAgLy8gRGVsZXRlIGF0dHJpYnV0ZS5cbiAgICAgIGlmIChwYWlyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIC8vIERlbGV0ZSBvbmx5IGlmIHRoZSB1cGRhdGUgbWF0Y2hlcyBhIGtleSBhbmQgdHlwZS5cbiAgICAgICAgY29uc3QgYXR0clZhbCA9IHRoaXMuc2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXTtcbiAgICAgICAgaWYgKGF0dHJWYWwgJiYgYXR0clZhbC50eXBlID09PSBwYWlyLmtleS50eXBlKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBvciB1cGRhdGUgYXR0cmlidXRlLlxuICAgICAgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdID0gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUocGFpci5rZXkudHlwZSwgcGFpci52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWxsKCk6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB7XG4gICAgY29uc3QgcmVzOiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGF0dHJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnN0IGF0dHJLZXkgPSB7IG5hbWU6IGtleSwgdHlwZTogYXR0ci50eXBlIH07XG4gICAgICAvLyBTYW5pdHkgY2hlY2ssIHNob3VsZCBhbHdheXMgYmUgbGVnYWwuXG4gICAgICBpZiAoaXNWYWxpZFZhbHVlRm9yVHlwZShhdHRyS2V5LnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHJlcy5wdXNoKHsga2V5OiBhdHRyS2V5LCB2YWx1ZTogYXR0ci52YWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgc3RhdGljIGdldEtleUZyb21VbnR5cGVkKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICApOiBTZWFyY2hBdHRyaWJ1dGVLZXk8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5wYWNrIHNpbmdsZS1lbGVtZW50IGFycmF5cy5cbiAgICBjb25zdCB2YWwgPSB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgLy8gQ2hlY2sgaWYgdmFsIGlzIGFuIElTTyBzdHJpbmcsIGlmIHNvLCByZXR1cm4gYSBEQVRFVElNRSBrZXkuXG4gICAgICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZSh2YWwpKSAmJiBEYXRlLnBhcnNlKHZhbCkgPT09IG5ldyBEYXRlKHZhbCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQgfTtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHR5cGU6IE51bWJlci5pc0ludGVnZXIodmFsKSA/IFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UIDogU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEUsXG4gICAgICAgIH07XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0wgfTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b01ldGFkYXRhVHlwZSh0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICAgIHJldHVybiAnS2V5d29yZCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgICByZXR1cm4gJ0ludCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFOlxuICAgICAgICByZXR1cm4gJ0RvdWJsZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgICAgcmV0dXJuICdCb29sJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTpcbiAgICAgICAgcmV0dXJuICdEYXRldGltZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUOlxuICAgICAgICByZXR1cm4gJ0tleXdvcmRMaXN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggYXR0cmlidXRlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdG9TZWFyY2hBdHRyaWJ1dGVUeXBlKHR5cGU6IHN0cmluZyk6IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoZSB0eXBlIG1ldGFkYXRhIGlzIHVzdWFsbHkgaW4gUGFzY2FsQ2FzZSAoZS5nLiBcIktleXdvcmRMaXN0XCIpIGJ1dCBpblxuICAgIC8vIHJhcmUgY2FzZXMgbWF5IGJlIGluIFNDUkVBTUlOR19TTkFLRV9DQVNFIChlLmcuIFwiSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVFwiKS5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ1RleHQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX1RFWFQnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUO1xuICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ7XG4gICAgICBjYXNlICdJbnQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0lOVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVDtcbiAgICAgIGNhc2UgJ0RvdWJsZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfRE9VQkxFJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFO1xuICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfQk9PTCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0w7XG4gICAgICBjYXNlICdEYXRldGltZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfREFURVRJTUUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTtcbiAgICAgIGNhc2UgJ0tleXdvcmRMaXN0JzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEX0xJU1QnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCBtcywgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCB0eXBlIHsgZ29vZ2xlIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuLy8gTk9URTogdGhlc2UgYXJlIHRoZSBzYW1lIGludGVyZmFjZSBpbiBKU1xuLy8gZ29vZ2xlLnByb3RvYnVmLklEdXJhdGlvbjtcbi8vIGdvb2dsZS5wcm90b2J1Zi5JVGltZXN0YW1wO1xuLy8gVGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGJlbG93IHNob3VsZCB3b3JrIGZvciBib3RoXG5cbmV4cG9ydCB0eXBlIFRpbWVzdGFtcCA9IGdvb2dsZS5wcm90b2J1Zi5JVGltZXN0YW1wO1xuXG4vKipcbiAqIEEgZHVyYXRpb24sIGV4cHJlc3NlZCBlaXRoZXIgYXMgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBvciBhcyBhIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9LlxuICovXG5leHBvcnQgdHlwZSBEdXJhdGlvbiA9IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQsIHRocm93cyBhIFR5cGVFcnJvciwgd2l0aCBlcnJvciBtZXNzYWdlIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICR7ZmllbGROYW1lfSB0byBiZSBhIHRpbWVzdGFtcCwgZ290ICR7dHN9YCk7XG4gIH1cbiAgcmV0dXJuIHRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGltZXN0YW1wLCBnb3QgJHt0c31gKTtcbiAgfVxuICBjb25zdCB7IHNlY29uZHMsIG5hbm9zIH0gPSB0cztcbiAgcmV0dXJuIChzZWNvbmRzIHx8IExvbmcuVVpFUk8pXG4gICAgLm11bCgxMDAwKVxuICAgIC5hZGQoTWF0aC5mbG9vcigobmFub3MgfHwgMCkgLyAxMDAwMDAwKSlcbiAgICAudG9OdW1iZXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zTnVtYmVyVG9UcyhtaWxsaXM6IG51bWJlcik6IFRpbWVzdGFtcCB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpcyAvIDEwMDApO1xuICBjb25zdCBuYW5vcyA9IChtaWxsaXMgJSAxMDAwKSAqIDEwMDAwMDA7XG4gIGlmIChOdW1iZXIuaXNOYU4oc2Vjb25kcykgfHwgTnVtYmVyLmlzTmFOKG5hbm9zKSkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIG1pbGxpcyAke21pbGxpc31gKTtcbiAgfVxuICByZXR1cm4geyBzZWNvbmRzOiBMb25nLmZyb21OdW1iZXIoc2Vjb25kcyksIG5hbm9zIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc1RvVHMoc3RyOiBEdXJhdGlvbik6IFRpbWVzdGFtcCB7XG4gIHJldHVybiBtc051bWJlclRvVHMobXNUb051bWJlcihzdHIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb1RzKHN0cjogRHVyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsKTogVGltZXN0YW1wIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0ciA/IG1zVG9UcyhzdHIpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvTnVtYmVyKHZhbDogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtc1RvTnVtYmVyKHZhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc1RvTnVtYmVyKHZhbDogRHVyYXRpb24pOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBtc1dpdGhWYWxpZGF0aW9uKHZhbCk7XG59XG5cbmZ1bmN0aW9uIG1zV2l0aFZhbGlkYXRpb24oc3RyOiBTdHJpbmdWYWx1ZSk6IG51bWJlciB7XG4gIGNvbnN0IG1pbGxpcyA9IG1zKHN0cik7XG4gIGlmIChtaWxsaXMgPT0gbnVsbCB8fCBpc05hTihtaWxsaXMpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBkdXJhdGlvbiBzdHJpbmc6ICcke3N0cn0nYCk7XG4gIH1cbiAgcmV0dXJuIG1pbGxpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRzVG9EYXRlKHRzOiBUaW1lc3RhbXApOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHRzVG9Ncyh0cykpO1xufVxuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZShyZXF1aXJlZFRzVG9Ncyh0cywgZmllbGROYW1lKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUodHNUb01zKHRzKSk7XG59XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0IChpbXBvcnRlZCB2aWEgc2NoZWR1bGUtaGVscGVycy50cylcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbERhdGVUb1RzKGRhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogVGltZXN0YW1wIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbXNUb1RzKGRhdGUuZ2V0VGltZSgpKTtcbn1cbiIsImV4cG9ydCB0eXBlIE5vbk51bGxhYmxlT2JqZWN0PFQ+ID0geyBbUCBpbiBrZXlvZiBUXS0/OiBOb25OdWxsYWJsZTxUW1BdPiB9O1xuXG4vKiogU2hvcnRoYW5kIGFsaWFzICovXG5leHBvcnQgdHlwZSBBbnlGdW5jID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cbi8qKiBBIHR1cGxlIHdpdGhvdXQgaXRzIGxhc3QgZWxlbWVudCAqL1xuZXhwb3J0IHR5cGUgT21pdExhc3Q8VD4gPSBUIGV4dGVuZHMgWy4uLmluZmVyIFJFU1QsIGFueV0gPyBSRVNUIDogbmV2ZXI7XG5cbi8qKiBGIHdpdGggYWxsIGFyZ3VtZW50cyBidXQgdGhlIGxhc3QgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0UGFyYW08RiBleHRlbmRzIEFueUZ1bmM+ID0gKC4uLmFyZ3M6IE9taXRMYXN0PFBhcmFtZXRlcnM8Rj4+KSA9PiBSZXR1cm5UeXBlPEY+O1xuXG5leHBvcnQgdHlwZSBPbWl0Rmlyc3Q8VD4gPSBUIGV4dGVuZHMgW2FueSwgLi4uaW5mZXIgUkVTVF0gPyBSRVNUIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIE9taXRGaXJzdFBhcmFtPFQ+ID0gVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gID8gKC4uLmFyZ3M6IE9taXRGaXJzdDxQYXJhbWV0ZXJzPFQ+PikgPT4gUmV0dXJuVHlwZTxUPlxuICA6IG5ldmVyO1xuXG4vKiogUmVxdWlyZSB0aGF0IFQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgcHJvcGVydGllcyBkZWZpbmVkICovXG5leHBvcnQgdHlwZSBSZXF1aXJlQXRMZWFzdE9uZTxULCBLZXlzIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0gUGljazxULCBFeGNsdWRlPGtleW9mIFQsIEtleXM+PiAmXG4gIHtcbiAgICBbSyBpbiBLZXlzXS0/OiBSZXF1aXJlZDxQaWNrPFQsIEs+PiAmIFBhcnRpYWw8UGljazxULCBFeGNsdWRlPEtleXMsIEs+Pj47XG4gIH1bS2V5c107XG5cbi8qKiBWZXJpZnkgdGhhdCBhbiB0eXBlIF9Db3B5IGV4dGVuZHMgX09yaWcgKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0V4dGVuZHM8X09yaWcsIF9Db3B5IGV4dGVuZHMgX09yaWc+KCk6IHZvaWQge1xuICAvLyBub29wLCBqdXN0IHR5cGUgY2hlY2tcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGFjZTxCYXNlLCBOZXc+ID0gT21pdDxCYXNlLCBrZXlvZiBOZXc+ICYgTmV3O1xuXG4vLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcbi8vIE1JVCBvciBDQzAtMS4wIOKAlCBJdCBpcyBtZWFudCB0byBiZSBjb3BpZWQgaW50byB5b3VyIGNvZGViYXNlIHJhdGhlciB0aGFuIGJlaW5nIHVzZWQgYXMgYSBkZXBlbmRlbmN5LlxuZXhwb3J0IHR5cGUgVW5pb25Ub0ludGVyc2VjdGlvbjxVbmlvbj4gPVxuICAvLyBgZXh0ZW5kcyB1bmtub3duYCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGhlIGNhc2UgYW5kIGlzIHVzZWQgdG8gY29udmVydCB0aGUgYFVuaW9uYCBpbnRvIGFcbiAgLy8gW2Rpc3RyaWJ1dGl2ZSBjb25kaXRpb25hbCB0eXBlXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi04Lmh0bWwjZGlzdHJpYnV0aXZlLWNvbmRpdGlvbmFsLXR5cGVzKS5cbiAgKFxuICAgIFVuaW9uIGV4dGVuZHMgdW5rbm93blxuICAgICAgPyAvLyBUaGUgdW5pb24gdHlwZSBpcyB1c2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24gc2luY2UgdGhlIHVuaW9uXG4gICAgICAgIC8vIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBhbiBpbnRlcnNlY3Rpb24uXG4gICAgICAgIChkaXN0cmlidXRlZFVuaW9uOiBVbmlvbikgPT4gdm9pZFxuICAgICAgOiAvLyBUaGlzIHdvbid0IGhhcHBlbi5cbiAgICAgICAgbmV2ZXJcbiAgKSBleHRlbmRzIC8vIEluZmVyIHRoZSBgSW50ZXJzZWN0aW9uYCB0eXBlIHNpbmNlIFR5cGVTY3JpcHQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb25hbFxuICAvLyBhcmd1bWVudHMgb2YgdW5pb25zIG9mIGZ1bmN0aW9ucyBhcyBhbiBpbnRlcnNlY3Rpb24gb2YgdGhlIHVuaW9uLlxuICAobWVyZ2VkSW50ZXJzZWN0aW9uOiBpbmZlciBJbnRlcnNlY3Rpb24pID0+IHZvaWRcbiAgICA/IC8vIFRoZSBgJiBVbmlvbmAgaXMgdG8gYWxsb3cgaW5kZXhpbmcgYnkgdGhlIHJlc3VsdGluZyB0eXBlXG4gICAgICBJbnRlcnNlY3Rpb24gJiBVbmlvblxuICAgIDogbmV2ZXI7XG5cbnR5cGUgSXNFcXVhbDxBLCBCPiA9ICg8Rz4oKSA9PiBHIGV4dGVuZHMgQSA/IDEgOiAyKSBleHRlbmRzIDxHPigpID0+IEcgZXh0ZW5kcyBCID8gMSA6IDIgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzeW1ib2wgfCBiaWdpbnQ7XG5cbnR5cGUgSXNOdWxsPFQ+ID0gW1RdIGV4dGVuZHMgW251bGxdID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIElzVW5rbm93bjxUPiA9IHVua25vd24gZXh0ZW5kcyBUIC8vIGBUYCBjYW4gYmUgYHVua25vd25gIG9yIGBhbnlgXG4gID8gSXNOdWxsPFQ+IGV4dGVuZHMgZmFsc2UgLy8gYGFueWAgY2FuIGJlIGBudWxsYCwgYnV0IGB1bmtub3duYCBjYW4ndCBiZVxuICAgID8gdHJ1ZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxudHlwZSBPYmplY3RWYWx1ZTxULCBLPiA9IEsgZXh0ZW5kcyBrZXlvZiBUXG4gID8gVFtLXVxuICA6IFRvU3RyaW5nPEs+IGV4dGVuZHMga2V5b2YgVFxuICAgID8gVFtUb1N0cmluZzxLPl1cbiAgICA6IEsgZXh0ZW5kcyBgJHtpbmZlciBOdW1iZXJLIGV4dGVuZHMgbnVtYmVyfWBcbiAgICAgID8gTnVtYmVySyBleHRlbmRzIGtleW9mIFRcbiAgICAgICAgPyBUW051bWJlcktdXG4gICAgICAgIDogbmV2ZXJcbiAgICAgIDogbmV2ZXI7XG5cbnR5cGUgVG9TdHJpbmc8VD4gPSBUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyID8gYCR7VH1gIDogbmV2ZXI7XG5cbnR5cGUgS2V5c09mVW5pb248T2JqZWN0VHlwZT4gPSBPYmplY3RUeXBlIGV4dGVuZHMgdW5rbm93biA/IGtleW9mIE9iamVjdFR5cGUgOiBuZXZlcjtcblxudHlwZSBBcnJheUVsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdID8gVFswXSA6IG5ldmVyO1xuXG50eXBlIEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgUGFyYW1ldGVyVHlwZV06IEV4YWN0PFBhcmFtZXRlclR5cGVbS2V5XSwgT2JqZWN0VmFsdWU8SW5wdXRUeXBlLCBLZXk+Pjtcbn0gJiBSZWNvcmQ8RXhjbHVkZTxrZXlvZiBJbnB1dFR5cGUsIEtleXNPZlVuaW9uPFBhcmFtZXRlclR5cGU+PiwgbmV2ZXI+O1xuXG5leHBvcnQgdHlwZSBFeGFjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID1cbiAgLy8gQmVmb3JlIGRpc3RyaWJ1dGluZywgY2hlY2sgaWYgdGhlIHR3byB0eXBlcyBhcmUgZXF1YWwgYW5kIGlmIHNvLCByZXR1cm4gdGhlIHBhcmFtZXRlciB0eXBlIGltbWVkaWF0ZWx5XG4gIElzRXF1YWw8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFBhcmFtZXRlclR5cGVcbiAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBwcmltaXRpdmUsIHJldHVybiBpdCBhcyBpcyBpbW1lZGlhdGVseSB0byBhdm9pZCBpdCBiZWluZyBjb252ZXJ0ZWQgdG8gYSBjb21wbGV4IHR5cGVcbiAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBQcmltaXRpdmVcbiAgICAgID8gUGFyYW1ldGVyVHlwZVxuICAgICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGFuIHVua25vd24sIHJldHVybiBpdCBhcyBpcyBpbW1lZGlhdGVseSB0byBhdm9pZCBpdCBiZWluZyBjb252ZXJ0ZWQgdG8gYSBjb21wbGV4IHR5cGVcbiAgICAgICAgSXNVbmtub3duPFBhcmFtZXRlclR5cGU+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IHVua25vd25cbiAgICAgICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgRnVuY3Rpb24sIHJldHVybiBpdCBhcyBpcyBiZWNhdXNlIHRoaXMgdHlwZSBpcyBub3QgY2FwYWJsZSBvZiBoYW5kbGluZyBmdW5jdGlvbiwgbGVhdmUgaXQgdG8gVHlwZVNjcmlwdFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgRnVuY3Rpb25cbiAgICAgICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgICAgICA6IC8vIENvbnZlcnQgdW5pb24gb2YgYXJyYXkgdG8gYXJyYXkgb2YgdW5pb246IEFbXSAmIEJbXSA9PiAoQSAmIEIpW11cbiAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyB1bmtub3duW11cbiAgICAgICAgICAgID8gQXJyYXk8RXhhY3Q8QXJyYXlFbGVtZW50PFBhcmFtZXRlclR5cGU+LCBBcnJheUVsZW1lbnQ8SW5wdXRUeXBlPj4+XG4gICAgICAgICAgICA6IC8vIEluIFR5cGVTY3JpcHQsIEFycmF5IGlzIGEgc3VidHlwZSBvZiBSZWFkb25seUFycmF5LCBzbyBhbHdheXMgdGVzdCBBcnJheSBiZWZvcmUgUmVhZG9ubHlBcnJheS5cbiAgICAgICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXVxuICAgICAgICAgICAgICA/IFJlYWRvbmx5QXJyYXk8RXhhY3Q8QXJyYXlFbGVtZW50PFBhcmFtZXRlclR5cGU+LCBBcnJheUVsZW1lbnQ8SW5wdXRUeXBlPj4+XG4gICAgICAgICAgICAgIDogRXhhY3RPYmplY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPjtcbi8vIEVuZCBvZiBib3Jyb3cgZnJvbSAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS91bmlvbi10by1pbnRlcnNlY3Rpb24uZC50c1xuXG5leHBvcnQgdHlwZSBSZW1vdmVQcmVmaXg8UHJlZml4IGV4dGVuZHMgc3RyaW5nLCBLZXlzIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2sgaW4gS2V5c106IGsgZXh0ZW5kcyBgJHtQcmVmaXh9JHtpbmZlciBTdWZmaXh9YCA/IFN1ZmZpeCA6IG5ldmVyO1xufVtLZXlzXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5PFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wOiBZXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wIGluIHJlY29yZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnRpZXM8WCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICByZWNvcmQ6IFgsXG4gIHByb3BzOiBZW11cbik6IHJlY29yZCBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIHByb3BzLmV2ZXJ5KChwcm9wKSA9PiBwcm9wIGluIHJlY29yZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3Ige1xuICByZXR1cm4gKFxuICAgIGlzUmVjb3JkKGVycm9yKSAmJlxuICAgIHR5cGVvZiBlcnJvci5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgIChlcnJvci5zdGFjayA9PSBudWxsIHx8IHR5cGVvZiBlcnJvci5zdGFjayA9PT0gJ3N0cmluZycpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Fib3J0RXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciAmIHsgbmFtZTogJ0Fib3J0RXJyb3InIH0ge1xuICByZXR1cm4gaXNFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSB7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvcldpdGhDb2RlKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3JXaXRoQ29kZSB7XG4gIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgdHlwZW9mIGVycm9yLmNvZGUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JDb2RlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHNvbWUgdHlwZSBpcyB0aGUgbmV2ZXIgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIobXNnOiBzdHJpbmcsIHg6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyArICc6ICcgKyB4KTtcbn1cblxuZXhwb3J0IHR5cGUgQ2xhc3M8RSBleHRlbmRzIEVycm9yPiA9IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IEU7XG4gIHByb3RvdHlwZTogRTtcbn07XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdG8gYmUgdXNlZCBvbiBlcnJvciBjbGFzc2VzLiBJdCBhZGRzIHRoZSAnbmFtZScgcHJvcGVydHkgQU5EIHByb3ZpZGVzIGEgY3VzdG9tXG4gKiAnaW5zdGFuY2VvZicgaGFuZGxlciB0aGF0IHdvcmtzIGNvcnJlY3RseSBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLlxuICpcbiAqICMjIyBEZXRhaWxzICMjI1xuICpcbiAqIEFjY29yZGluZyB0byB0aGUgRWNtYVNjcmlwdCdzIHNwZWMsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEphdmFTY3JpcHQncyBgeCBpbnN0YW5jZW9mIFlgIG9wZXJhdG9yIGlzIHRvIHdhbGsgdXAgdGhlXG4gKiBwcm90b3R5cGUgY2hhaW4gb2Ygb2JqZWN0ICd4JywgY2hlY2tpbmcgaWYgYW55IGNvbnN0cnVjdG9yIGluIHRoYXQgaGllcmFyY2h5IGlzIF9leGFjdGx5IHRoZSBzYW1lIG9iamVjdF8gYXMgdGhlXG4gKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiAnWScuXG4gKlxuICogVW5mb3J0dW5hdGVseSwgaXQgaGFwcGVucyBpbiB2YXJpb3VzIHNpdHVhdGlvbnMgdGhhdCBkaWZmZXJlbnQgY29uc3RydWN0b3IgZnVuY3Rpb24gb2JqZWN0cyBnZXQgY3JlYXRlZCBmb3Igd2hhdFxuICogYXBwZWFycyB0byBiZSB0aGUgdmVyeSBzYW1lIGNsYXNzLiBUaGlzIGxlYWRzIHRvIHN1cnByaXNpbmcgYmVoYXZpb3Igd2hlcmUgYGluc3RhbmNlb2ZgIHJldHVybnMgZmFsc2UgdGhvdWdoIGl0IGlzXG4gKiBrbm93biB0aGF0IHRoZSBvYmplY3QgaXMgaW5kZWVkIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuIE9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgdGhpcyBoYXBwZW5zIGlzIHdoZW4gY29uc3RydWN0b3JcbiAqICdZJyBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHJlYWxtIHRoYW4gdGhlIGNvbnN0dWN0b3Igd2l0aCB3aGljaCAneCcgd2FzIGluc3RhbnRpYXRlZC4gQW5vdGhlciBjYXNlIGlzIHdoZW4gdHdvIGNvcGllc1xuICogb2YgdGhlIHNhbWUgbGlicmFyeSBnZXRzIGxvYWRlZCBpbiB0aGUgc2FtZSByZWFsbS5cbiAqXG4gKiBJbiBwcmFjdGljZSwgdGhpcyB0ZW5kcyB0byBjYXVzZSBpc3N1ZXMgd2hlbiBjcm9zc2luZyB0aGUgd29ya2Zsb3ctc2FuZGJveGluZyBib3VuZGFyeSAoc2luY2UgTm9kZSdzIHZtIG1vZHVsZVxuICogcmVhbGx5IGNyZWF0ZXMgbmV3IGV4ZWN1dGlvbiByZWFsbXMpLCBhcyB3ZWxsIGFzIHdoZW4gcnVubmluZyB0ZXN0cyB1c2luZyBKZXN0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2plc3Rqcy9qZXN0L2lzc3Vlcy8yNTQ5XG4gKiBmb3Igc29tZSBkZXRhaWxzIG9uIHRoYXQgb25lKS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGluamVjdHMgYSBjdXN0b20gJ2luc3RhbmNlb2YnIGhhbmRsZXIgaW50byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIHdoaWNoIGlzIGJvdGggY3Jvc3MtcmVhbG0gc2FmZSBhbmRcbiAqIGNyb3NzLWNvcGllcy1vZi10aGUtc2FtZS1saWIgc2FmZS4gSXQgd29ya3MgYnkgYWRkaW5nIGEgc3BlY2lhbCBzeW1ib2wgcHJvcGVydHkgdG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCBhbmQgdGhlblxuICogY2hlY2tpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGF0IHN5bWJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yPEUgZXh0ZW5kcyBFcnJvcj4obWFya2VyTmFtZTogc3RyaW5nKTogKGNsYXp6OiBDbGFzczxFPikgPT4gdm9pZCB7XG4gIHJldHVybiAoY2xheno6IENsYXNzPEU+KTogdm9pZCA9PiB7XG4gICAgY29uc3QgbWFya2VyID0gU3ltYm9sLmZvcihgX190ZW1wb3JhbF9pcyR7bWFya2VyTmFtZX1gKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsICduYW1lJywgeyB2YWx1ZTogbWFya2VyTmFtZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCBtYXJrZXIsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LXNob3J0aGFuZFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIGVycm9yOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMgPT09IGNsYXp6KSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVjb3JkKGVycm9yKSAmJiAoZXJyb3IgYXMgYW55KVttYXJrZXJdID09PSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICd0aGlzJyBtdXN0IGJlIGEgX3N1YmNsYXNzXyBvZiBjbGF6eiB0aGF0IGRvZXNuJ3QgcmVkZWZpbmVkIFtTeW1ib2wuaGFzSW5zdGFuY2VdLCBzbyB0aGF0IGl0IGluaGVyaXRlZFxuICAgICAgICAgIC8vIGZyb20gY2xhenoncyBbU3ltYm9sLmhhc0luc3RhbmNlXS4gSWYgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgcGFydGljdWxhciBzaXR1YXRpb24sIHRoZW5cbiAgICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZGVhbGx5LCBpdCdkIGJlIHByZWZlcmFibGUgdG8gYXZvaWQgdGhpcyBjYXNlIGVudGlyZWx5LCBieSBtYWtpbmcgc3VyZSB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mICdjbGF6eidcbiAgICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgICAvLyBiZWhhdmlvciAod2hpY2ggaXMgTk9UIGNyb3NzLXJlYWxtIHNhZmUpLlxuICAgICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGVycm9yKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQsIFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8qKlxuICogVXNlciBtZXRhZGF0YSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byB3b3JrZmxvdyBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyTWV0YWRhdGEge1xuICAvKiogQGV4cGVyaW1lbnRhbCBBIGZpeGVkLCBzaW5nbGUgbGluZSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kJ3MgcHVycG9zZSAqL1xuICBzdGF0aWNTdW1tYXJ5Pzogc3RyaW5nO1xuICAvKiogQGV4cGVyaW1lbnRhbCBGaXhlZCBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQgZm9yIGxvbmdlci10ZXh0IGRlc2NyaXB0aW9uLCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAqL1xuICBzdGF0aWNEZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlck1ldGFkYXRhVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBzdGF0aWNTdW1tYXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0YXRpY0RldGFpbHM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogdGVtcG9yYWwuYXBpLnNkay52MS5JVXNlck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN0YXRpY1N1bW1hcnkgPT0gbnVsbCAmJiBzdGF0aWNEZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3VtbWFyeSA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNTdW1tYXJ5KTtcbiAgY29uc3QgZGV0YWlscyA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNEZXRhaWxzKTtcblxuICBpZiAoc3VtbWFyeSA9PSBudWxsICYmIGRldGFpbHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzdW1tYXJ5LCBkZXRhaWxzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgYXMgVmVyc2lvbmluZ0ludGVudFN0cmluZyB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGNoZWNrRXh0ZW5kcyB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgKi9cblxuLy8gQXZvaWQgaW1wb3J0aW5nIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2Ugd29ya2Zsb3cgYnVuZGxlIHNpemVcbi8vIENvcGllZCBmcm9tIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnRcbi8qKlxuICogUHJvdG9idWYgZW51bSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgVmVyc2lvbmluZ0ludGVudFN0cmluZ30uXG4gKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25pbmdJbnRlbnQge1xuICBVTlNQRUNJRklFRCA9IDAsXG4gIENPTVBBVElCTEUgPSAxLFxuICBERUZBVUxUID0gMixcbn1cblxuY2hlY2tFeHRlbmRzPGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQsIFZlcnNpb25pbmdJbnRlbnQ+KCk7XG5jaGVja0V4dGVuZHM8VmVyc2lvbmluZ0ludGVudCwgY29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudD4oKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKGludGVudDogVmVyc2lvbmluZ0ludGVudFN0cmluZyB8IHVuZGVmaW5lZCk6IFZlcnNpb25pbmdJbnRlbnQge1xuICBzd2l0Y2ggKGludGVudCkge1xuICAgIGNhc2UgJ0RFRkFVTFQnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuREVGQVVMVDtcbiAgICBjYXNlICdDT01QQVRJQkxFJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkNPTVBBVElCTEU7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5VTlNQRUNJRklFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIoJ1VuZXhwZWN0ZWQgVmVyc2lvbmluZ0ludGVudCcsIGludGVudCk7XG4gIH1cbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaW50ZW5kcyBjZXJ0YWluIGNvbW1hbmRzIHRvIGJlIHJ1biBvbiBhIGNvbXBhdGlibGUgd29ya2VyIEJ1aWxkIElkIHZlcnNpb24gb3Igbm90LlxuICpcbiAqIGBDT01QQVRJQkxFYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIGEgd29ya2VyIHdpdGggY29tcGF0aWJsZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLiBJdCBtYXkgbm90IGJlXG4gKiBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUgZG9lcyBub3QgYWxzbyBoYXZlIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCB3b3JrZXIncyBCdWlsZCBJZC5cbiAqXG4gKiBgREVGQVVMVGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUncyBjdXJyZW50IG92ZXJhbGwtZGVmYXVsdCBCdWlsZCBJZC5cbiAqXG4gKiBXaGVyZSB0aGlzIHR5cGUgaXMgYWNjZXB0ZWQgb3B0aW9uYWxseSwgYW4gdW5zZXQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIFNESyBzaG91bGQgY2hvb3NlIHRoZSBtb3N0IHNlbnNpYmxlIGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGUgdHlwZSBvZiBjb21tYW5kLCBhY2NvdW50aW5nIGZvciB3aGV0aGVyIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgdGhlXG4gKiBjdXJyZW50IHdvcmtlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHN0YXJ0aW5nIFdvcmtmbG93cyBpcyBgREVGQVVMVGAuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBXb3JrZmxvd3Mgc3RhcnRpbmdcbiAqIEFjdGl2aXRpZXMsIHN0YXJ0aW5nIENoaWxkIFdvcmtmbG93cywgb3IgQ29udGludWluZyBBcyBOZXcgaXMgYENPTVBBVElCTEVgLlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nSW50ZW50ID0gJ0NPTVBBVElCTEUnIHwgJ0RFRkFVTFQnO1xuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBhIHNwZWNpZmljIHdvcmtlciBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICByZWFkb25seSBkZXBsb3ltZW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkZXBsb3ltZW50IHZlcnNpb24sIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXRcbiAqIGBkZXBsb3ltZW50TmFtZS5idWlsZElkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsU3RyaW5nKHZlcnNpb246IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3ZlcnNpb24uZGVwbG95bWVudE5hbWV9LiR7dmVyc2lvbi5idWlsZElkfWA7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZW4gYSB3b3JrZmxvdyBtaWdodCBtb3ZlIGZyb20gYSB3b3JrZXIgb2Ygb25lIEJ1aWxkIElkIHRvIGFub3RoZXIuXG4gKlxuICogKiAnUElOTkVEJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byB0aGUgY3VycmVudCBCdWlsZCBJRCB1bmxlc3MgbWFudWFsbHkgbW92ZWQuXG4gKiAqICdBVVRPX1VQR1JBREUnIC0gVGhlIHdvcmtmbG93IHdpbGwgYXV0b21hdGljYWxseSBtb3ZlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiAoZGVmYXVsdCBCdWlsZCBJRFxuICogICAgb2YgdGhlIHRhc2sgcXVldWUpIHdoZW4gdGhlIG5leHQgdGFzayBpcyBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBQSU5ORUQ6ICdQSU5ORUQnLFxuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yKVtrZXlvZiB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZVZlcnNpb25pbmdCZWhhdmlvcl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW1ZlcnNpb25pbmdCZWhhdmlvci5QSU5ORURdOiAxLFxuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHZlcnNpb25pbmcgb3ZlcnJpZGVzLiBGb3IgZXhhbXBsZSwgd2hlbiBzdGFydGluZyB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdPdmVycmlkZSA9IFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB8ICdBVVRPX1VQR1JBREUnO1xuXG4vKipcbiAqIFdvcmtmbG93IHdpbGwgYmUgcGlubmVkIHRvIGEgc3BlY2lmaWMgZGVwbG95bWVudCB2ZXJzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2VyIGRlcGxveW1lbnQgdmVyc2lvbiB0byBwaW4gdGhlIHdvcmtmbG93IHRvLlxuICAgKi9cbiAgcGlubmVkVG86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG8tdXBncmFkZSB0byB0aGUgY3VycmVudCBkZXBsb3ltZW50IHZlcnNpb24gb24gdGhlIG5leHQgd29ya2Zsb3cgdGFzay5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b1VwZ3JhZGVWZXJzaW9uaW5nT3ZlcnJpZGUgPSAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2ZXJzaW9uaW5nIGJlaGF2aW9yIHRvIGJlIHVzZWQgYnkgdGhlIGZpcnN0IHRhc2sgb2YgYSBuZXcgd29ya2Zsb3cgcnVuIGluIGEgY29udGludWUtYXMtbmV3IGNoYWluLlxuICpcbiAqIEFVVE9fVVBHUkFERSAtIFN0YXJ0IHRoZSBuZXcgcnVuIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IuIFVzZSB0aGUgVGFyZ2V0IFZlcnNpb24gb2YgdGhlIHdvcmtmbG93J3MgdGFzayBxdWV1ZSBhdFxuICogICBzdGFydC10aW1lLCBhcyBBdXRvVXBncmFkZSB3b3JrZmxvd3MgZG8uIEFmdGVyIHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGNvbXBsZXRlcywgdXNlIHdoYXRldmVyXG4gKiAgIFZlcnNpb25pbmcgQmVoYXZpb3IgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIGluIHRoZSB3b3JrZmxvdyBjb2RlLlxuICpcbiAqICAgTm90ZSB0aGF0IGlmIHRoZSBwcmV2aW91cyB3b3JrZmxvdyBoYWQgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBJZiBhIFBpbm5lZCBvdmVycmlkZSBpcyBpbmhlcml0ZWQgYnkgdGhlIG5ldyBydW4sIGFuZCB0aGUgbmV3IHJ1biBzdGFydHMgd2l0aCBBdXRvVXBncmFkZVxuICogICBiZWhhdmlvciwgdGhlIGJhc2UgdmVyc2lvbiBvZiB0aGUgbmV3IHJ1biB3aWxsIGJlIHRoZSBUYXJnZXQgVmVyc2lvbiBhcyBkZXNjcmliZWQgYWJvdmUsIGJ1dCB0aGVcbiAqICAgZWZmZWN0aXZlIHZlcnNpb24gd2lsbCBiZSB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIFZlcnNpb25pbmcgT3ZlcnJpZGUgdW50aWwgdGhlIG92ZXJyaWRlIGlzIHJlbW92ZWQuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IgPSAodHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpW2tleW9mIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLCBkZWNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnQ09OVElOVUVfQVNfTkVXX1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFtJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLkFVVE9fVVBHUkFERV06IDEsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4pO1xuIiwiaW1wb3J0IHsgVmVyc2lvbmluZ0JlaGF2aW9yIH0gZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGRlZmluaW5nIGEgd29ya2Zsb3cgdmlhIHtAbGluayBzZXRXb3JrZmxvd09wdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMge1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG5cbnR5cGUgQXN5bmNGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10sIFJldHVyblR5cGU+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmV0dXJuVHlwZT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXIgPSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIHwgKCgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMpO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICogQSB3b3JrZmxvdyBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuIGRlZmluZWQgd2l0aCBvcHRpb25zIGZyb20ge0BsaW5rIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9uczxBcmdzIGV4dGVuZHMgYW55W10sIFJldHVyblR5cGU+IGV4dGVuZHMgQXN5bmNGdW5jdGlvbjxBcmdzLCBSZXR1cm5UeXBlPiB7XG4gIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcjtcbn1cbiIsImltcG9ydCB7IFdvcmtmbG93LCBXb3JrZmxvd1Jlc3VsdFR5cGUsIFNpZ25hbERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEJhc2UgV29ya2Zsb3dIYW5kbGUgaW50ZXJmYWNlLCBleHRlbmRlZCBpbiB3b3JrZmxvdyBhbmQgY2xpZW50IGxpYnMuXG4gKlxuICogVHJhbnNmb3JtcyBhIHdvcmtmbG93IGludGVyZmFjZSBgVGAgaW50byBhIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVdvcmtmbG93SGFuZGxlPFQgZXh0ZW5kcyBXb3JrZmxvdz4ge1xuICAvKipcbiAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuICAvKipcbiAgICogU2lnbmFsIGEgcnVubmluZyBXb3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGRlZiBhIHNpZ25hbCBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgaGFuZGxlLnNpZ25hbChpbmNyZW1lbnRTaWduYWwsIDMpO1xuICAgKiBgYGBcbiAgICovXG4gIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IEFyZ3NcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHdvcmtmbG93SWQgb2YgdGhlIGN1cnJlbnQgV29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBXb3JrZmxvdyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vcmV0cnktcG9saWN5JztcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgeyBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVzLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgfSBmcm9tICcuL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5pbXBvcnQgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucyc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGFcbiAqIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogQ29uY2VwdDoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtd29ya2Zsb3ctaWQtcmV1c2UtcG9saWN5LyB8IFdvcmtmbG93IElkIFJldXNlIFBvbGljeX1cbiAqXG4gKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRSZXVzZVBvbGljeSA9IHtcbiAgLyoqXG4gICAqIFRoZSBXb3JrZmxvdyBjYW4gYmUgc3RhcnRlZCBpZiB0aGUgcHJldmlvdXMgV29ya2Zsb3cgaXMgaW4gYSBDbG9zZWQgc3RhdGUuXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBBTExPV19EVVBMSUNBVEU6ICdBTExPV19EVVBMSUNBVEUnLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlIHRoYXQgaXMgbm90IENvbXBsZXRlZC5cbiAgICovXG4gIEFMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWTogJ0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWScsXG5cbiAgLyoqXG4gICAqIFRoZSBXb3JrZmxvdyBjYW5ub3QgYmUgc3RhcnRlZC5cbiAgICovXG4gIFJFSkVDVF9EVVBMSUNBVEU6ICdSRUpFQ1RfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGVybWluYXRlIHRoZSBjdXJyZW50IFdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmc7IG90aGVyd2lzZSBhbGxvdyByZXVzaW5nIHRoZSBXb3JrZmxvdyBJRC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLCBhbmRcbiAgICogICAgICAgICAgICAgc2V0IGBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5YCB0b1xuICAgKiAgICAgICAgICAgICB7QGxpbmsgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LldPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9URVJNSU5BVEVfRVhJU1RJTkd9LlxuICAgKiAgICAgICAgICAgICBXaGVuIHVzaW5nIHRoaXMgb3B0aW9uLCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgbXVzdCBiZSBsZWZ0IHVuc3BlY2lmaWVkLlxuICAgKi9cbiAgVEVSTUlOQVRFX0lGX1JVTk5JTkc6ICdURVJNSU5BVEVfSUZfUlVOTklORycsXG5cbiAgLy8vIEFueXRoaW5nIGJlbG93IHRoaXMgbGluZSBoYXMgYmVlbiBkZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIE5vIG5lZWQgdG8gdXNlIHRoaXMuIElmIGEgYFdvcmtmbG93SWRSZXVzZVBvbGljeWAgaXMgc2V0IHRvIHRoaXMsIG9yIGlzIG5vdCBzZXQgYXQgYWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEVpdGhlciBsZWF2ZSBwcm9wZXJ0eSBgdW5kZWZpbmVkYCwgb3IgdXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuXG4gICAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEU6ICdBTExPV19EVVBMSUNBVEUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEFMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWTogJ0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVKRUNUX0RVUExJQ0FURX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEU6ICdSRUpFQ1RfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBURVJNSU5BVEVfSUZfUlVOTklOR30gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1RFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRSZXVzZVBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICAnV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LkFMTE9XX0RVUExJQ0FURV06IDEsXG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFldOiAyLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuUkVKRUNUX0RVUExJQ0FURV06IDMsXG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5URVJNSU5BVEVfSUZfUlVOTklOR106IDQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4pO1xuXG4vKipcbiAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAqXG4gKiBTZWUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkUmV1c2VQb2xpY3l9IGZvciB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvd1xuICogd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICpcbiAqICpOb3RlOiBJdCBpcyBuZXZlciBwb3NzaWJsZSB0byBoYXZlIHR3byBfYWN0aXZlbHkgcnVubmluZ18gV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5ID0ge1xuICAvKipcbiAgICogRG8gbm90IHN0YXJ0IGEgbmV3IFdvcmtmbG93LiBJbnN0ZWFkIHJhaXNlIGEgYFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcmAuXG4gICAqL1xuICBGQUlMOiAnRkFJTCcsXG5cbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByZXR1cm4gYSBXb3JrZmxvdyBIYW5kbGUgZm9yIHRoZSBhbHJlYWR5IFJ1bm5pbmcgV29ya2Zsb3cuXG4gICAqL1xuICBVU0VfRVhJU1RJTkc6ICdVU0VfRVhJU1RJTkcnLFxuXG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyBXb3JrZmxvdywgdGVybWluYXRpbmcgdGhlIGN1cnJlbnQgd29ya2Zsb3cgaWYgb25lIGlzIGFscmVhZHkgcnVubmluZy5cbiAgICovXG4gIFRFUk1JTkFURV9FWElTVElORzogJ1RFUk1JTkFURV9FWElTVElORycsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5ID0gKHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kpW2tleW9mIHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ldO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeSwgZGVjb2RlV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuRkFJTF06IDEsXG4gICAgW1dvcmtmbG93SWRDb25mbGljdFBvbGljeS5VU0VfRVhJU1RJTkddOiAyLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVEVSTUlOQVRFX0VYSVNUSU5HXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1dPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VXb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRSZXVzZVBvbGljeS5XT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFXG4gICAqL1xuICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k/OiBXb3JrZmxvd0lkUmV1c2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAgICpcbiAgICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAgICpcbiAgICogQGRlZmF1bHQgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LldPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9VTlNQRUNJRklFRFxuICAgKi9cbiAgd29ya2Zsb3dJZENvbmZsaWN0UG9saWN5PzogV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgYSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgcmV0cmllZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgV29ya2Zsb3cgRXhlY3V0aW9ucyBhcmUgbm90IHJldHJpZWQuIERvIG5vdCBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcmV0cnktcG9saWN5LyB8IE1vcmUgaW5mb3JtYXRpb259LlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY3JvbiBzY2hlZHVsZSBmb3IgV29ya2Zsb3cuIElmIGEgY3JvbiBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBXb3JrZmxvdyB3aWxsIHJ1biBhcyBhIGNyb24gYmFzZWQgb24gdGhlXG4gICAqIHNjaGVkdWxlLiBUaGUgc2NoZWR1bGluZyB3aWxsIGJlIGJhc2VkIG9uIFVUQyB0aW1lLiBUaGUgc2NoZWR1bGUgZm9yIHRoZSBuZXh0IHJ1biBvbmx5IGhhcHBlbnMgYWZ0ZXIgdGhlIGN1cnJlbnRcbiAgICogcnVuIGlzIGNvbXBsZXRlZC9mYWlsZWQvdGltZW91dC4gSWYgYSBSZXRyeVBvbGljeSBpcyBhbHNvIHN1cHBsaWVkLCBhbmQgdGhlIFdvcmtmbG93IGZhaWxlZCBvciB0aW1lZCBvdXQsIHRoZVxuICAgKiBXb3JrZmxvdyB3aWxsIGJlIHJldHJpZWQgYmFzZWQgb24gdGhlIHJldHJ5IHBvbGljeS4gV2hpbGUgdGhlIFdvcmtmbG93IGlzIHJldHJ5aW5nLCBpdCB3b24ndCBzY2hlZHVsZSBpdHMgbmV4dCBydW4uXG4gICAqIElmIHRoZSBuZXh0IHNjaGVkdWxlIGlzIGR1ZSB3aGlsZSB0aGUgV29ya2Zsb3cgaXMgcnVubmluZyAob3IgcmV0cnlpbmcpLCB0aGVuIGl0IHdpbGwgc2tpcCB0aGF0IHNjaGVkdWxlLiBDcm9uXG4gICAqIFdvcmtmbG93IHdpbGwgbm90IHN0b3AgdW50aWwgaXQgaXMgdGVybWluYXRlZCBvciBjYW5jZWxsZWQgKGJ5IHJldHVybmluZyB0ZW1wb3JhbC5DYW5jZWxlZEVycm9yKS5cbiAgICogaHR0cHM6Ly9jcm9udGFiLmd1cnUvIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyB5b3VyIGNyb24gZXhwcmVzc2lvbnMuXG4gICAqL1xuICBjcm9uU2NoZWR1bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIG5vbi1pbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBUaGUgdmFsdWVzIGNhbiBiZSBhbnl0aGluZyB0aGF0XG4gICAqIGlzIHNlcmlhbGl6YWJsZSBieSB7QGxpbmsgRGF0YUNvbnZlcnRlcn0uXG4gICAqL1xuICBtZW1vPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZC5cbiAgICovXG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgZml4ZWQgZGV0YWlscyBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0IGFuZCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2luZ2xlLWxpbmUgZml4ZWQgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgYSB3b3JrZmxvd1xuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuZXhwb3J0IHR5cGUgV2l0aFdvcmtmbG93QXJnczxXIGV4dGVuZHMgV29ya2Zsb3csIFQ+ID0gVCAmXG4gIChQYXJhbWV0ZXJzPFc+IGV4dGVuZHMgW2FueSwgLi4uYW55W11dXG4gICAgPyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M6IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJncz86IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IHJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90XG4gICAqIHJlbHkgb24gcnVuIHRpbWVvdXQgZm9yIGJ1c2luZXNzIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVyc1xuICAgKiBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBleGVjdXRpb24gKHdoaWNoIGluY2x1ZGVzIHJ1biByZXRyaWVzIGFuZCBjb250aW51ZSBhcyBuZXcpIGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3QgcmVseSBvbiBleGVjdXRpb24gdGltZW91dCBmb3IgYnVzaW5lc3NcbiAgICogbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBzaW5nbGUgd29ya2Zsb3cgdGFzay4gRGVmYXVsdCBpcyAxMCBzZWNvbmRzLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tbW9uV29ya2Zsb3dPcHRpb25zID0gQmFzZVdvcmtmbG93T3B0aW9ucyAmIFdvcmtmbG93RHVyYXRpb25PcHRpb25zO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93VHlwZTxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT5cbik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnc3RyaW5nJykgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYyBhcyBzdHJpbmc7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHdvcmtmbG93VHlwZU9yRnVuYz8ubmFtZSkgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYy5uYW1lO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd29ya2Zsb3cgdHlwZTogdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGFub255bW91cycpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYEludmFsaWQgd29ya2Zsb3cgdHlwZTogZXhwZWN0ZWQgZWl0aGVyIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24sIGdvdCAnJHt0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jfSdgXG4gICk7XG59XG4iLCIvLyBBIHBvcnQgb2YgYW4gYWxnb3JpdGhtIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxuLy8gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25xdWlubGFuL2JldHRlci1yYW5kb20tbnVtYmVycy1mb3ItamF2YXNjcmlwdC1taXJyb3Jcbi8vIE9yaWdpbmFsIHdvcmsgaXMgdW5kZXIgTUlUIGxpY2Vuc2UgLVxuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5vcmc+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkYmF1L3NlZWRyYW5kb20vYmxvYi9yZWxlYXNlZC9saWIvYWxlYS5qc1xuXG5jbGFzcyBBbGVhIHtcbiAgcHVibGljIGM6IG51bWJlcjtcbiAgcHVibGljIHMwOiBudW1iZXI7XG4gIHB1YmxpYyBzMTogbnVtYmVyO1xuICBwdWJsaWMgczI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZWVkOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG1hc2ggPSBuZXcgTWFzaCgpO1xuICAgIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgICB0aGlzLmMgPSAxO1xuICAgIHRoaXMuczAgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMSA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMyID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczAgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMwIDwgMCkge1xuICAgICAgdGhpcy5zMCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMxIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMSA8IDApIHtcbiAgICAgIHRoaXMuczEgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMiAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczIgPCAwKSB7XG4gICAgICB0aGlzLnMyICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIHRoaXMuczAgPSB0aGlzLnMxO1xuICAgIHRoaXMuczEgPSB0aGlzLnMyO1xuICAgIHJldHVybiAodGhpcy5zMiA9IHQgLSAodGhpcy5jID0gdCB8IDApKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSTkcgPSAoKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGVhKHNlZWQ6IG51bWJlcltdKTogUk5HIHtcbiAgY29uc3QgeGcgPSBuZXcgQWxlYShzZWVkKTtcbiAgcmV0dXJuIHhnLm5leHQuYmluZCh4Zyk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXNoIHtcbiAgcHJpdmF0ZSBuID0gMHhlZmM4MjQ5ZDtcblxuICBwdWJsaWMgbWFzaChkYXRhOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IHsgbiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YVtpXSE7XG4gICAgICBsZXQgaCA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBoICo9IG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXG4gICAgfVxuICAgIHRoaXMubiA9IG47XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgeyBDYW5jZWxsZWRGYWlsdXJlLCBEdXJhdGlvbiwgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvTnVtYmVyIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgU2RrRmxhZ3MgfSBmcm9tICcuL2ZsYWdzJztcblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbi8qKiBNYWdpYyBzeW1ib2wgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3Qgc2NvcGUgLSBpbnRlbnRpb25hbGx5IG5vdCBleHBvcnRlZCAqL1xuY29uc3QgTk9fUEFSRU5UID0gU3ltYm9sKCdOT19QQVJFTlQnKTtcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIENhbmNlbGxhdGlvblNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBwcmV2ZW50IG91dGVyIGNhbmNlbGxhdGlvbiBmcm9tIHByb3BhZ2F0aW5nIHRvIGlubmVyIHNjb3BlcywgQWN0aXZpdGllcywgdGltZXJzLCBhbmQgVHJpZ2dlcnMsIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIChTY29wZSBzdGlsbCBwcm9wYWdhdGVzIENhbmNlbGxlZEZhaWx1cmUgdGhyb3duIGZyb20gd2l0aGluKS5cbiAgICovXG4gIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgQ2FuY2VsbGF0aW9uU2NvcGUgKHVzZWZ1bCBmb3IgcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzKS5cbiAgICogVGhlIGBOT19QQVJFTlRgIHN5bWJvbCBpcyByZXNlcnZlZCBmb3IgdGhlIHJvb3Qgc2NvcGUuXG4gICAqL1xuICBwYXJlbnQ/OiBDYW5jZWxsYXRpb25TY29wZSB8IHR5cGVvZiBOT19QQVJFTlQ7XG59XG5cbi8qKlxuICogQ2FuY2VsbGF0aW9uIFNjb3BlcyBwcm92aWRlIHRoZSBtZWNoYW5pYyBieSB3aGljaCBhIFdvcmtmbG93IG1heSBncmFjZWZ1bGx5IGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBmb3IgY2FuY2VsbGF0aW9uXG4gKiAoZS5nLiBpbiByZXNwb25zZSB0byB7QGxpbmsgV29ya2Zsb3dIYW5kbGUuY2FuY2VsfSBvciB0aHJvdWdoIHRoZSBVSSBvciBDTEkpLCBhcyB3ZWxsIGFzIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mXG4gKiBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGl0IG93bnMgKGUuZy4gQWN0aXZpdGllcywgVGltZXJzLCBDaGlsZCBXb3JrZmxvd3MsIGV0YykuXG4gKlxuICogQ2FuY2VsbGF0aW9uIFNjb3BlcyBmb3JtIGEgdHJlZSwgd2l0aCB0aGUgV29ya2Zsb3cncyBtYWluIGZ1bmN0aW9uIHJ1bm5pbmcgaW4gdGhlIHJvb3Qgc2NvcGUgb2YgdGhhdCB0cmVlLlxuICogQnkgZGVmYXVsdCwgY2FuY2VsbGF0aW9uIHByb3BhZ2F0ZXMgZG93biBmcm9tIGEgcGFyZW50IHNjb3BlIHRvIGl0cyBjaGlsZHJlbiBhbmQgaXRzIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMuXG4gKiBBIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBjYW4gcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIGJ1dCBpcyBuZXZlciBlZmZlY3RpdmVseSBjb25zaWRlcmVkIGFzIGNhbmNlbGxlZCxcbiAqIHRodXMgc2hpZWxkZGluZyBpdHMgY2hpbGRyZW4gYW5kIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgZnJvbSBwcm9wYWdhdGlvbiBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogU2NvcGVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGNvbnN0cnVjdG9yIG9yIHRoZSBzdGF0aWMgaGVscGVyIG1ldGhvZHMge0BsaW5rIGNhbmNlbGxhYmxlfSxcbiAqIHtAbGluayBub25DYW5jZWxsYWJsZX0gYW5kIHtAbGluayB3aXRoVGltZW91dH0uIGB3aXRoVGltZW91dGAgY3JlYXRlcyBhIHNjb3BlIHRoYXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZiBhZnRlclxuICogc29tZSBkdXJhdGlvbi5cbiAqXG4gKiBDYW5jZWxsYXRpb24gb2YgYSBjYW5jZWxsYWJsZSBzY29wZSByZXN1bHRzIGluIGFsbCBvcGVyYXRpb25zIGNyZWF0ZWQgZGlyZWN0bHkgaW4gdGhhdCBzY29wZSB0byB0aHJvdyBhXG4gKiB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gKGVpdGhlciBkaXJlY3RseSwgb3IgYXMgdGhlIGBjYXVzZWAgb2YgYW4ge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gb3IgYVxuICoge0BsaW5rIENoaWxkV29ya2Zsb3dGYWlsdXJlfSkuIEZ1cnRoZXIgYXR0ZW1wdCB0byBjcmVhdGUgbmV3IGNhbmNlbGxhYmxlIHNjb3BlcyBvciBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIHdpdGhpbiBhXG4gKiBzY29wZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkIHdpbGwgYWxzbyBpbW1lZGlhdGVseSB0aHJvdyBhIHtAbGluayBDYW5jZWxsZWRGYWlsdXJlfSBleGNlcHRpb24uIEl0IGlzIGhvd2V2ZXJcbiAqIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBhdCB0aGF0IHBvaW50OyB0aGlzIGlzIG9mdGVuIHVzZWQgdG8gZXhlY3V0ZSByb2xsYmFjayBvciBjbGVhbnVwXG4gKiBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyguLi4pOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgdHJ5IHtcbiAqICAgICAvLyBUaGlzIGFjdGl2aXR5IHJ1bnMgaW4gdGhlIHJvb3QgY2FuY2VsbGF0aW9uIHNjb3BlLiBUaGVyZWZvcmUsIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3Qgb25cbiAqICAgICAvLyB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuIHRocm91Z2ggdGhlIFVJIG9yIENMSSkgYXV0b21hdGljYWxseSBwcm9wYWdhdGVzIHRvIHRoaXNcbiAqICAgICAvLyBhY3Rpdml0eS4gQXNzdW1pbmcgdGhhdCB0aGUgYWN0aXZpdHkgcHJvcGVybHkgaGFuZGxlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgdGhlbiB0aGVcbiAqICAgICAvLyBjYWxsIGJlbG93IHdpbGwgdGhyb3cgYW4gYEFjdGl2aXR5RmFpbHVyZWAgZXhjZXB0aW9uLCB3aXRoIGBjYXVzZWAgc2V0cyB0byBhblxuICogICAgIC8vIGluc3RhbmNlIG9mIGBDYW5jZWxsZWRGYWlsdXJlYC5cbiAqICAgICBhd2FpdCBzb21lQWN0aXZpdHkoKTtcbiAqICAgfSBjYXRjaCAoZSkge1xuICogICAgIGlmIChpc0NhbmNlbGxhdGlvbihlKSkge1xuICogICAgICAgLy8gUnVuIGNsZWFudXAgYWN0aXZpdHkgaW4gYSBub24tY2FuY2VsbGFibGUgc2NvcGVcbiAqICAgICAgIGF3YWl0IENhbmNlbGxhdGlvblNjb3BlLm5vbkNhbmNlbGxhYmxlKGFzeW5jICgpID0+IHtcbiAqICAgICAgICAgYXdhaXQgY2xlYW51cEFjdGl2aXR5KCk7XG4gKiAgICAgICB9XG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRocm93IGU7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIGNhbmNlbGxhYmxlIHNjb3BlIG1heSBiZSBwcm9ncmFtYXRpY2FsbHkgY2FuY2VsbGVkIGJ5IGNhbGxpbmcge0BsaW5rIGNhbmNlbHxgc2NvcGUuY2FuY2VsKClgfWAuIFRoaXMgbWF5IGJlIHVzZWQsXG4gKiBmb3IgZXhhbXBsZSwgdG8gZXhwbGljaXRseSByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBBY3Rpdml0eSBvciBDaGlsZCBXb3JrZmxvdzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gKiBjb25zdCBhY3Rpdml0eVByb21pc2UgPSBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUucnVuKCgpID0+IHNvbWVBY3Rpdml0eSgpKTtcbiAqIGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZS5jYW5jZWwoKTsgLy8gQ2FuY2VscyB0aGUgYWN0aXZpdHlcbiAqIGF3YWl0IGFjdGl2aXR5UHJvbWlzZTsgLy8gVGhyb3dzIGBBY3Rpdml0eUZhaWx1cmVgIHdpdGggYGNhdXNlYCBzZXQgdG8gYENhbmNlbGxlZEZhaWx1cmVgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvblNjb3BlIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHRoZW4gdGhpcyBzY29wZSB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLCBldmVuIGlmIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgcmVjZWl2ZWQgKGVpdGhlclxuICAgKiBkaXJlY3RseSBieSBjYWxsaW5nIGBzY29wZS5jYW5jZWwoKWAgb3IgaW5kaXJlY3RseSBieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS4gVGhpcyBlZmZlY3RpdmVseVxuICAgKiBzaGllbGRzIHRoZSBzY29wZSdzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIG1hZGUgb24gdGhlXG4gICAqIG5vbi1jYW5jZWxsYWJsZSBzY29wZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgcnVuYCBmdW5jdGlvbiBvZiBub24tY2FuY2VsbGFibGUgc2NvcGUgbWF5IHN0aWxsIHRocm93IGEgYENhbmNlbGxlZEZhaWx1cmVgXG4gICAqIGlmIHN1Y2ggYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIHdpdGhpbiB0aGF0IHNjb3BlIChlLmcuIGJ5IGRpcmVjdGx5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBjaGlsZCBzY29wZSkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsbGFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcyksIGRlZmF1bHRzIHRvIHtAbGluayBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50fSgpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGU7XG5cbiAgLyoqXG4gICAqIEEgUHJvbWlzZSB0aGF0IHRocm93cyB3aGVuIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVjZWl2ZXMgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgZWl0aGVyIGRpcmVjdGx5XG4gICAqIChpLmUuIGBzY29wZS5jYW5jZWwoKWApLCBvciBpbmRpcmVjdGx5IChieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgcmVzdWx0aW5nIGluIHRoZSBgY2FuY2VsUmVxdWVzdGVkYCBwcm9taXNlIGZvclxuICAgKiB0aGF0IHNjb3BlIHRvIHRocm93LCB0aG91Z2ggdGhlIHNjb3BlIHdpbGwgbm90IGVmZmVjdGl2ZWx5IGdldCBjYW5jZWxsZWQgKGkuZS4gYGNvbnNpZGVyZWRDYW5jZWxsZWRgIHdpbGwgc3RpbGxcbiAgICogcmV0dXJuIGBmYWxzZWAsIGFuZCBjYW5jZWxsYXRpb24gd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byBjaGlsZCBzY29wZXMgYW5kIGNvbnRhaW5lZCBvcGVyYXRpb25zKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5jZWxSZXF1ZXN0ZWQ6IFByb21pc2U8bmV2ZXI+O1xuXG4gICNjYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSBtc09wdGlvbmFsVG9OdW1iZXIob3B0aW9ucz8udGltZW91dCk7XG4gICAgdGhpcy5jYW5jZWxsYWJsZSA9IG9wdGlvbnM/LmNhbmNlbGxhYmxlID8/IHRydWU7XG4gICAgdGhpcy5jYW5jZWxSZXF1ZXN0ZWQgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTQyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHlcbiAgICAgIHRoaXMucmVqZWN0ID0gKGVycikgPT4ge1xuICAgICAgICB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQpO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gICAgaWYgKG9wdGlvbnM/LnBhcmVudCAhPT0gTk9fUEFSRU5UKSB7XG4gICAgICB0aGlzLnBhcmVudCA9IG9wdGlvbnM/LnBhcmVudCB8fCBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyZW50LmNhbmNlbGxhYmxlIHx8XG4gICAgICAgICh0aGlzLnBhcmVudC4jY2FuY2VsUmVxdWVzdGVkICYmXG4gICAgICAgICAgIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZDtcbiAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzY29wZSB3YXMgZWZmZWN0aXZlbHkgY2FuY2VsbGVkLiBBIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBjYW4gbmV2ZXIgYmUgY29uc2lkZXJlZCBjYW5jZWxsZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnNpZGVyZWRDYW5jZWxsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCAmJiB0aGlzLmNhbmNlbGxhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gIGBmbmBcbiAgICpcbiAgICogQW55IHRpbWVycywgQWN0aXZpdGllcywgVHJpZ2dlcnMgYW5kIENhbmNlbGxhdGlvblNjb3BlcyBjcmVhdGVkIGluIHRoZSBib2R5IG9mIGBmbmBcbiAgICogYXV0b21hdGljYWxseSBsaW5rIHRoZWlyIGNhbmNlbGxhdGlvbiB0byB0aGlzIHNjb3BlLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYGZuYFxuICAgKi9cbiAgcnVuPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHN0b3JhZ2UucnVuKHRoaXMsIHRoaXMucnVuSW5Db250ZXh0LmJpbmQodGhpcywgZm4pIGFzICgpID0+IFByb21pc2U8VD4pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0aGF0IHJ1bnMgYSBmdW5jdGlvbiBpbiBBc3luY0xvY2FsU3RvcmFnZSBjb250ZXh0LlxuICAgKlxuICAgKiBDb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhcyBhbm9ueW1vdXMgZnVuY3Rpb24sIG1hZGUgaW50byBhIG1ldGhvZCBmb3IgaW1wcm92ZWQgc3RhY2sgdHJhY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1bkluQ29udGV4dDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGxldCB0aW1lclNjb3BlOiBDYW5jZWxsYXRpb25TY29wZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgdGltZXJTY29wZVxuICAgICAgICAgIC5ydW4oKCkgPT4gc2xlZXAodGhpcy50aW1lb3V0IGFzIG51bWJlcikpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNhbmNlbCgpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBzY29wZSB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIGlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKFxuICAgICAgICB0aW1lclNjb3BlICYmXG4gICAgICAgICF0aW1lclNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQgJiZcbiAgICAgICAgZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRpbWVyU2NvcGUuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdG8gY2FuY2VsIHRoZSBzY29wZSBhbmQgbGlua2VkIGNoaWxkcmVuXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWplY3QobmV3IENhbmNlbGxlZEZhaWx1cmUoJ0NhbmNlbGxhdGlvbiBzY29wZSBjYW5jZWxsZWQnKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgc2NvcGVcbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IENhbmNlbGxhdGlvblNjb3BlIHtcbiAgICAvLyBVc2luZyBnbG9iYWxzIGRpcmVjdGx5IGluc3RlYWQgb2YgYSBoZWxwZXIgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0XG4gICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fVEVNUE9SQUxfQUNUSVZBVE9SX18ucm9vdFNjb3BlO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgY2FuY2VsbGFibGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogZmFsc2UgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIG5vbkNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbik7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlLCB0aW1lb3V0IH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB3aXRoVGltZW91dDxUPih0aW1lb3V0OiBEdXJhdGlvbiwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pO1xuICB9XG59XG5cbmNvbnN0IHN0b3JhZ2U6IEFMUzxDYW5jZWxsYXRpb25TY29wZT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuZXhwb3J0IGNsYXNzIFJvb3RDYW5jZWxsYXRpb25TY29wZSBleHRlbmRzIENhbmNlbGxhdGlvblNjb3BlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgcGFyZW50OiBOT19QQVJFTlQgfSk7XG4gIH1cblxuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWplY3QobmV3IENhbmNlbGxlZEZhaWx1cmUoJ1dvcmtmbG93IGNhbmNlbGxlZCcpKTtcbiAgfVxufVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoaXMgbW9kdWxlIGFuZCB3b3JrZmxvdy50cyAqL1xubGV0IHNsZWVwID0gKF86IER1cmF0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgaGFzIG5vdCBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKGZuOiB0eXBlb2Ygc2xlZXApOiB2b2lkIHtcbiAgc2xlZXAgPSBmbjtcbn1cbiIsImltcG9ydCB7IEFjdGl2aXR5RmFpbHVyZSwgQ2FuY2VsbGVkRmFpbHVyZSwgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsIE5leHVzT3BlcmF0aW9uRmFpbHVyZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHdvcmtmbG93IGVycm9yc1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93RXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biBpbiB3b3JrZmxvdyB3aGVuIGl0IHRyaWVzIHRvIGRvIHNvbWV0aGluZyB0aGF0IG5vbi1kZXRlcm1pbmlzdGljIHN1Y2ggYXMgY29uc3RydWN0IGEgV2Vha1JlZigpXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcicpXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige31cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgYWN0cyBhcyBhIG1hcmtlciBmb3IgdGhpcyBzcGVjaWFsIHJlc3VsdCB0eXBlXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignTG9jYWxBY3Rpdml0eURvQmFja29mZicpXG5leHBvcnQgY2xhc3MgTG9jYWxBY3Rpdml0eURvQmFja29mZiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGJhY2tvZmY6IGNvcmVzZGsuYWN0aXZpdHlfcmVzdWx0LklEb0JhY2tvZmYpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHByb3ZpZGVkIGBlcnJgIGlzIGNhdXNlZCBieSBjYW5jZWxsYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUgfHxcbiAgICAoKGVyciBpbnN0YW5jZW9mIEFjdGl2aXR5RmFpbHVyZSB8fCBlcnIgaW5zdGFuY2VvZiBDaGlsZFdvcmtmbG93RmFpbHVyZSB8fCBlcnIgaW5zdGFuY2VvZiBOZXh1c09wZXJhdGlvbkZhaWx1cmUpICYmXG4gICAgICBlcnIuY2F1c2UgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgdHlwZSBTZGtGbGFnID0ge1xuICBnZXQgaWQoKTogbnVtYmVyO1xuICBnZXQgZGVmYXVsdCgpOiBib29sZWFuO1xuICBnZXQgYWx0ZXJuYXRpdmVDb25kaXRpb25zKCk6IEFsdENvbmRpdGlvbkZuW10gfCB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBmbGFnc1JlZ2lzdHJ5OiBNYXA8bnVtYmVyLCBTZGtGbGFnPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGNvbnN0IFNka0ZsYWdzID0ge1xuICAvKipcbiAgICogVGhpcyBmbGFnIGdhdGVzIG11bHRpcGxlIGZpeGVzIHJlbGF0ZWQgdG8gY2FuY2VsbGF0aW9uIHNjb3BlcyBhbmQgdGltZXJzIGludHJvZHVjZWQgaW4gMS4xMC4yLzEuMTEuMDpcbiAgICogLSBDYW5jZWxsYXRpb24gb2YgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgbm8gbG9uZ2VyIHByb3BhZ2F0ZXMgdG8gY2hpbGRyZW4gc2NvcGVzXG4gICAqICAgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstdHlwZXNjcmlwdC9pc3N1ZXMvMTQyMykuXG4gICAqIC0gQ2FuY2VsbGF0aW9uU2NvcGUud2l0aFRpbWVvdXQoZm4pIG5vdyBjYW5jZWwgdGhlIHRpbWVyIGlmIGBmbmAgY29tcGxldGVzIGJlZm9yZSBleHBpcmF0aW9uXG4gICAqICAgb2YgdGhlIHRpbWVvdXQsIHNpbWlsYXIgdG8gaG93IGBjb25kaXRpb24oZm4sIHRpbWVvdXQpYCB3b3Jrcy5cbiAgICogLSBUaW1lcnMgY3JlYXRlZCB1c2luZyBzZXRUaW1lb3V0IGNhbiBub3cgYmUgaW50ZXJjZXB0ZWQuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjAuIEhvd2V2ZXIsIGR1ZSB0byBhbiBTREsgYnVnLCBTREtzIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3RcbiAgICogICAgICAgIHByb3Blcmx5IHdyaXRpbmcgYmFjayB0aGUgZmxhZ3MgdG8gaGlzdG9yeSwgcG9zc2libHkgcmVzdWx0aW5nIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZVxuICAgKiAgICAgICAgY29uc2lkZXIgdGhhdCBhIFdGVCBlbWl0dGVkIGJ5IFdvcmtlciB2MS4xMS4wIG9yIHYxLjExLjEgdG8gaW1wbGljaXRseSBoYXZlIHRoaXMgZmxhZyBvbi5cbiAgICovXG4gIE5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb246IGRlZmluZUZsYWcoMSwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG5cbiAgLyoqXG4gICAqIFByaW9yIHRvIDEuMTEuMCwgd2hlbiBwcm9jZXNzaW5nIGEgV29ya2Zsb3cgYWN0aXZhdGlvbiwgdGhlIFNESyB3b3VsZCBleGVjdXRlIGBub3RpZnlIYXNQYXRjaGBcbiAgICogYW5kIGBzaWduYWxXb3JrZmxvd2Agam9icyBpbiBkaXN0aW5jdCBwaGFzZXMsIGJlZm9yZSBvdGhlciB0eXBlcyBvZiBqb2JzLiBUaGUgcHJpbWFyeSByZWFzb25cbiAgICogYmVoaW5kIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdhcyB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIFdvcmtmbG93IGV4ZWN1dGlvbiBtaWdodFxuICAgKiBjb21wbGV0ZSBiZWZvcmUgYWxsIGluY29taW5nIHNpZ25hbHMgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgKGF0IGxlYXN0IHRvIHRoZSBwb2ludCB0aGF0IHRoZVxuICAgKiBfc3luY2hyb25vdXNfIHBhcnQgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQpLlxuICAgKlxuICAgKiBUaGlzIGZsYWcgcmVwbGFjZXMgdGhhdCBtdWx0aS1waGFzZSBhbGdvcml0aG0gd2l0aCBhIHNpbXBsZXIgb25lIHdoZXJlIGpvYnMgYXJlIHNpbXBseSBzb3J0ZWQgYXNcbiAgICogYChzaWduYWxzIGFuZCB1cGRhdGVzKSAtPiBvdGhlcnNgLCBidXQgd2l0aG91dCBwcm9jZXNzaW5nIHRoZW0gYXMgZGlzdGluY3QgYmF0Y2hlcyAoaS5lLiB3aXRob3V0XG4gICAqIGxlYXZpbmcvcmVlbnRlcmluZyB0aGUgVk0gY29udGV4dCBiZXR3ZWVuIGVhY2ggZ3JvdXAsIHdoaWNoIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcnMgdGhlIGV4ZWN1dGlvblxuICAgKiBvZiBhbGwgb3V0c3RhbmRpbmcgbWljcm90YXNrcykuIFRoYXQgc2luZ2xlLXBoYXNlIGFwcHJvYWNoIHJlc29sdmVzIGEgbnVtYmVyIG9mIHF1aXJrcyBvZiB0aGVcbiAgICogZm9ybWVyIGFsZ29yaXRobSwgYW5kIHlldCBzdGlsbCBzYXRpc2ZpZXMgdG8gdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50IG9mIGVuc3VyaW5nIHRoYXQgZXZlcnlcbiAgICogYHNpZ25hbFdvcmtmbG93YCBqb2JzIC0gYW5kIG5vdyBgZG9VcGRhdGVgIGpvYnMgYXMgd2VsbCAtIGhhdmUgYmVlbiBnaXZlbiBhIHByb3BlciBjaGFuY2UgdG9cbiAgICogZXhlY3V0ZSBiZWZvcmUgdGhlIFdvcmtmbG93IG1haW4gZnVuY3Rpb24gbWlnaHQgY29tcGxldGVzLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjExLjAuIFRoaXMgY2hhbmdlIGlzIG5vdCByb2xsYmFjay1zYWZlLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLc1xuICAgKiAgICAgICAgdjEuMTEuMCBhbmQgdjEuMTEuMSB3ZXJlIG5vdCBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZ1xuICAgKiAgICAgICAgaW4gTkRFIG9uIHJlcGxheS4gV2UgdGhlcmVmb3JlIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xXG4gICAqICAgICAgICB0byBpbXBsaWNpdGVseSBoYXZlIHRoaXMgZmxhZyBvbi5cbiAgICovXG4gIFByb2Nlc3NXb3JrZmxvd0FjdGl2YXRpb25Kb2JzQXNTaW5nbGVCYXRjaDogZGVmaW5lRmxhZygyLCB0cnVlLCBbYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKC8xXFwuMTFcXC5bMDFdLyldKSxcblxuICAvKipcbiAgICogSW4gMS4xMS41IHRoZSBgaGFuZGxlU2lnbmFsYCBpbnRlcmNlcHRvciB3YXMgYWRkZWQgdG8gQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnlcbiAgICogd2hpY2ggYWRkZWQgYSB5aWVsZCBwb2ludC4gVGhlIGFkZGVkIHlpZWxkIHBvaW50IGNhbiBjYXVzZSBOREUgaWYgdGhlcmUgd2FzIGEgc2lnbmFsIGhhbmRsZXIgYW5kXG4gICAqIHRoZSB3b3JrZmxvdyB3YXMgc3RhcnRlZCB3aXRoIGEgc2lnbmFsLlxuICAgKlxuICAgKiBUaGlzIHlpZWxkIHBvaW50IHdhcyByZW1vdmVkIGluIDEuMTMuMiwgYnV0IGluIG9yZGVyIHRvIHByZXZlbnQgd29ya2Zsb3dzIGZyb20gdGhlXG4gICAqIGFmZmVjdGVkIHZlcnNpb25zIHJlc3VsdGluZyBpbiBOREUsIHdlIGhhdmUgdG8gaW5qZWN0IHRoZSB5aWVsZCBwb2ludCBvbiByZXBsYXkuXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuMi5cbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcHRvcnNUcmFjZXNJbmJvdW5kU2lnbmFsczogZGVmaW5lRmxhZygzLCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMSwgcGF0Y2g6IDUgfSldKSxcblxuICAvKipcbiAgICogSW4gMS4xMS42LCB0aGUgYHNjaGVkdWxlTG9jYWxBY3Rpdml0eWAgaW50ZXJjZXB0b3Igd2FzIGFkZGVkIHRvXG4gICAqIGBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeWAgd2hpY2ggYWRkZWQgYSB5aWVsZCBwb2ludCB0byB0aGVcbiAgICogb3V0Ym91bmQgaW50ZXJjZXB0b3IuIFRoaXMgeWllbGQgcG9pbnQgd2FzIHJlbW92ZWQgaW4gMS4xMy4yLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjJcbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcHRvcnNUcmFjZXNMb2NhbEFjdGl2aXRpZXM6IGRlZmluZUZsYWcoNCwgdHJ1ZSwgW2lzQXRMZWFzdCh7IG1ham9yOiAxLCBtaW5vcjogMTEsIHBhdGNoOiA2IH0pXSksXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcmNlcHRvcnMgcHJvdmlkZWQgYnkgQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnkgaW5pdGlhbGx5IGhhZCB1bm5lY2Vzc2FyeVxuICAgKiB5aWVsZCBwb2ludHMgb24gY2FsbGluZyB0byBgZXh0cmFjdENvbnRleHRGcm9tSGVhZGVyc2AuXG4gICAqIElmIHJlcGxheWluZyBhIHdvcmtmbG93IGNyZWF0ZWQgZnJvbSB0aGVzZSB2ZXJzaW9ucyBhIHlpZWxkIHBvaW50IGlzIGluamVjdGVkIHRvIHByZXZlbnQgYW55IE5ERS5cbiAgICpcbiAgICogSWYgdGhlIGhpc3RvcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgU0RLIHZlcnNpb24sIGRlZmF1bHQgdG8gZXh0cmEgeWllbGRzIHNpbmNlIHRoZSB5aWVsZHMgd2VyZSBwcmVzZW50IHNpbmNlIHRoZSBPVEVMXG4gICAqIHBhY2thZ2Ugd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuMlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2Vwb3JzQXZvaWRzRXh0cmFZaWVsZHM6IGRlZmluZUZsYWcoNSwgdHJ1ZSwgW2lzQXRMZWFzdCh7IG1ham9yOiAxLCBtaW5vcjogMTMsIHBhdGNoOiAyIH0pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTMuMywgYWxsIHJlbWFpbmluZyBpbnRlcmNlcHRvciBtZXRob2RzIHdlcmUgaW1wbGVtZW50ZWQgaW4gQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnlcbiAgICogaW5jbHVkaW5nIGBoYW5kbGVVcGRhdGVgLCBgdmFsaWRhdGVVcGRhdGVgLCBgaGFuZGxlUXVlcnlgLCBgc3RhcnRUaW1lcmAsIGFuZCBgc3RhcnROZXh1c09wZXJhdGlvbmAuXG4gICAqIFRoZXNlIGFkZCBpbnN0cnVtZW50YXRpb24gYW5kIHlpZWxkIHBvaW50cyB0aGF0IHdlcmUgbm90IHByZXNlbnQgaW4gZWFybGllciB2ZXJzaW9ucy5cbiAgICogVGhpcyBmbGFnIGdhdGVzIHRoZXNlIG5ldyBpbnRlcmNlcHRvciBtZXRob2RzIHRvIHByZXZlbnQgTkRFIG9uIHJlcGxheSBvZiB3b3JrZmxvd3MgZnJvbSBlYXJsaWVyIHZlcnNpb25zLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjNcbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcHRvcnNJbnN0cnVtZW50c0FsbE1ldGhvZHM6IGRlZmluZUZsYWcoNiwgdHJ1ZSksXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBkZWZpbmVGbGFnKGlkOiBudW1iZXIsIGRlZjogYm9vbGVhbiwgYWx0ZXJuYXRpdmVDb25kaXRpb25zPzogQWx0Q29uZGl0aW9uRm5bXSk6IFNka0ZsYWcge1xuICBjb25zdCBmbGFnID0geyBpZCwgZGVmYXVsdDogZGVmLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnMgfTtcbiAgZmxhZ3NSZWdpc3RyeS5zZXQoaWQsIGZsYWcpO1xuICByZXR1cm4gZmxhZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkRmxhZyhpZDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghZmxhZ3NSZWdpc3RyeS5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIFNESyBmbGFnOiAke2lkfWApO1xufVxuXG4vKipcbiAqIEFuIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnXG4gKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXRlQ7IGUuZy4gYnkgbG9va2luZyBhdCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLXG4gKiB0aGF0IGVtaXR0ZWQgYSBXRlQuIFRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJldHJvYWN0aXZlbHkgdHVybiBvbiBzb21lIGZsYWdzIGZvciBXRlRcbiAqIGVtaXR0ZWQgYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy5cbiAqXG4gKiBOb3RlIHRoYXQgY29uZGl0aW9ucyBhcmUgb25seSBldmFsdWF0ZWQgd2hpbGUgcmVwbGF5aW5nLCBhbmQgb25seSBpZiB0aGUgY29ycmVzcG9uaW5nIGZsYWcgaXNcbiAqIG5vdCBhbHJlYWR5IHNldC4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3QgY2F1c2UgdGhlIGZsYWcgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZVxuICogXCJ1c2VkIGZsYWdzXCIgc2V0LCB3aGljaCBtZWFucyB0aGF0IGZ1cnRoZXIgV29ya2Zsb3cgVGFza3MgbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGVcbiAqIGNvbmRpdGlvbiBubyBsb25nZXIgaG9sZHMuIFRoaXMgaXMgc28gdG8gYXZvaWQgaW5jb3JyZWN0IGJlaGF2aW9ycyBpbiBjYXNlIHdoZXJlIGEgV29ya2Zsb3dcbiAqIEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpbiB0aHJvdWdoIGFuIG9sZGVyIG9uZS5cbiAqL1xudHlwZSBBbHRDb25kaXRpb25GbiA9IChjdHg6IHsgaW5mbzogV29ya2Zsb3dJbmZvOyBzZGtWZXJzaW9uPzogc3RyaW5nIH0pID0+IGJvb2xlYW47XG5cbmZ1bmN0aW9uIGJ1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcyh2ZXJzaW9uOiBSZWdFeHApOiBBbHRDb25kaXRpb25GbiB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXkB0ZW1wb3JhbGlvL3dvcmtlckAoJHt2ZXJzaW9uLnNvdXJjZX0pWytdYCk7XG4gIHJldHVybiAoeyBpbmZvIH0pID0+IGluZm8uY3VycmVudEJ1aWxkSWQgIT0gbnVsbCAmJiByZWdleC50ZXN0KGluZm8uY3VycmVudEJ1aWxkSWQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG59XG5cbnR5cGUgU2VtVmVyID0ge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGBBbHRDb25kaXRpb25GbmAgdGhhdCBjaGVja3MgaWYgdGhlIFNESyB2ZXJzaW9uIGlzIGVxdWFsIHRvIG9yIGFmdGVyIHRoZSBwcm92aWRlZCB2ZXJzaW9uLlxuICogQW4gb3B0aW9uYWwgZGVmYXVsdCBjYW4gYmUgcHJvdmlkZWQgaW4gY2FzZSB0aGUgU0RLIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNBdExlYXN0KGNvbXBhcmU6IFNlbVZlciwgbWlzc2luZ0RlZmF1bHQ/OiBib29sZWFuKTogQWx0Q29uZGl0aW9uRm4ge1xuICByZXR1cm4gKGN0eCkgPT4ge1xuICAgIHJldHVybiBpc0NvbXBhcmVkKGNvbXBhcmUsIC0xLCBtaXNzaW5nRGVmYXVsdCkoY3R4KSB8fCBpc0NvbXBhcmVkKGNvbXBhcmUsIDAsIG1pc3NpbmdEZWZhdWx0KShjdHgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0NvbXBhcmVkKGNvbXBhcmU6IFNlbVZlciwgY29tcGFyaXNvbjogLTEgfCAwIHwgMSwgbWlzc2luZ0RlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuICh7IHNka1ZlcnNpb24gfSkgPT4ge1xuICAgIGlmICghc2RrVmVyc2lvbikgcmV0dXJuIG1pc3NpbmdEZWZhdWx0O1xuICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZVNlbXZlcihzZGtWZXJzaW9uKTtcbiAgICBpZiAoIXZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICByZXR1cm4gY29tcGFyZVNlbXZlcihjb21wYXJlLCB2ZXJzaW9uKSA9PT0gY29tcGFyaXNvbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZW12ZXIodmVyc2lvbjogc3RyaW5nKTogU2VtVmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbXywgbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uLm1hdGNoKC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKSE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBOdW1iZXIucGFyc2VJbnQobWFqb3IhKSxcbiAgICAgIG1pbm9yOiBOdW1iZXIucGFyc2VJbnQobWlub3IhKSxcbiAgICAgIHBhdGNoOiBOdW1iZXIucGFyc2VJbnQocGF0Y2ghKSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogU2VtVmVyLCBiOiBTZW1WZXIpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEubWFqb3IgPCBiLm1ham9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1ham9yID4gYi5tYWpvcikgcmV0dXJuICsxO1xuICBpZiAoYS5taW5vciA8IGIubWlub3IpIHJldHVybiAtMTtcbiAgaWYgKGEubWlub3IgPiBiLm1pbm9yKSByZXR1cm4gKzE7XG4gIGlmIChhLnBhdGNoIDwgYi5wYXRjaCkgcmV0dXJuIC0xO1xuICBpZiAoYS5wYXRjaCA+IGIucGF0Y2gpIHJldHVybiArMTtcbiAgcmV0dXJuIDA7XG59XG4iLCJpbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciwgdHlwZSBXb3JrZmxvdyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoZSBfX1RFTVBPUkFMX18gb2JqZWN0IHdpbGwgYmUgYXNzaWduZWQgYnkgV2VicGFjayB0byB0aGUgZXhwb3J0cyBvZiB0aGUgZW50cnlwb2ludCBtb2R1bGVcbiAgLy8gZmlsZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGJ1bmRsZXIgKHNlZSB3b3JrZmxvdy9idW5kbGVyLnRzI2dlbkVudHJ5cG9pbnQoKSkuXG4gIC8vXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLiBJIHByZXNlcnZlZCB0aGUgdXBwZXJjYXNlIG5hbWUgZm9yIGJhY2t3YXJkXG4gIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBidW5kbGVzIGdlbmVyYXRlZCBieSAxLjE0LjAuIFdlIGdlbmVyYWxseSBkbyBub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgb2ZcbiAgLy8gYnVuZGxlcyB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgU0RLLCBidXQgaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCB0aGVyZSdzIHJlYWxseSBub1xuICAvLyB1c2VyLXNpZGUgdmFsdWUgaW4gcmVuYW1pbmcgdGhpcywgc28gbWFraW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciB0aGF0IHdvdWxkIG5vdCBiZSBqdXN0aWZpZWQuXG4gIC8vXG5cbiAgdmFyIF9fVEVNUE9SQUxfXzoge1xuICAgIGFwaTogdHlwZW9mIGltcG9ydCgnLi93b3JrZXItaW50ZXJmYWNlLnRzJyk7XG4gICAgcHJlbG9hZE1vZHVsZXM/OiAoKSA9PiB2b2lkO1xuICAgIGltcG9ydFdvcmtmbG93czogKCkgPT4gUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+O1xuICAgIGltcG9ydEludGVyY2VwdG9yczogKCkgPT4gW3sgaW50ZXJjZXB0b3JzOiBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfV07XG4gIH07XG5cbiAgLy8gRGVzdHJ1Y3RvcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNoYXJlZCBzYW5kYm94IGlzIGRlc3Ryb3llZC5cblxuICB2YXIgX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLlxuXG4gIHZhciBfX1RFTVBPUkFMX0FDVElWQVRPUl9fOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX0FDVElWQVRPUl9fID0gYWN0aXZhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF5YmVHZXRBY3RpdmF0b3IoKTogQWN0aXZhdG9yIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyk6IEFjdGl2YXRvciB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICByZXR1cm4gYWN0aXZhdG9yO1xufVxuXG4vLyBUaGlzIGlzIHJlYWxseSBqdXN0IGFuIGFsaWFzIGZvciBgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHRgIHdpdGggYSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UsXG4vLyBiZWNhdXNlIHRoYXQgbmFtZSBiZXR0ZXIgY29udmV5cyB0aGUgaW50ZW50IGluIHNvbWUgdmVyeSBjb21tb24gdXNlIGNhc2VzLlxuZXhwb3J0IGNvbnN0IGdldEFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LmJpbmQobnVsbCwgJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiIsIi8qKlxuICogT3ZlcnJpZGVzIHNvbWUgZ2xvYmFsIG9iamVjdHMgdG8gbWFrZSB0aGVtIGRldGVybWluaXN0aWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtc1RvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBPcmlnaW5hbERhdGUgPSBnbG9iYWxUaGlzLkRhdGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUdsb2JhbHMoKTogdm9pZCB7XG4gIC8vIE1vY2sgYW55IHdlYWsgcmVmZXJlbmNlIGJlY2F1c2UgR0MgaXMgbm9uLWRldGVybWluaXN0aWMgYW5kIHRoZSBlZmZlY3QgaXMgb2JzZXJ2YWJsZSBmcm9tIHRoZSBXb3JrZmxvdy5cbiAgLy8gV29ya2Zsb3cgZGV2ZWxvcGVyIHdpbGwgZ2V0IGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaWYgdGhleSB0cnkgdG8gdXNlIHRoZXNlLlxuICBnbG9iYWwuV2Vha1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignV2Vha1JlZiBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYycpO1xuICB9O1xuICBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoXG4gICAgICAnRmluYWxpemF0aW9uUmVnaXN0cnkgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnXG4gICAgKTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IChPcmlnaW5hbERhdGUgYXMgYW55KSguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5hbERhdGUoZ2V0QWN0aXZhdG9yKCkubm93KTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEFjdGl2YXRvcigpLm5vdztcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5wYXJzZSA9IE9yaWdpbmFsRGF0ZS5wYXJzZS5iaW5kKE9yaWdpbmFsRGF0ZSk7XG4gIGdsb2JhbC5EYXRlLlVUQyA9IE9yaWdpbmFsRGF0ZS5VVEMuYmluZChPcmlnaW5hbERhdGUpO1xuXG4gIGdsb2JhbC5EYXRlLnByb3RvdHlwZSA9IE9yaWdpbmFsRGF0ZS5wcm90b3R5cGU7XG5cbiAgY29uc3QgdGltZW91dENhbmNlbGxhdGlvblNjb3BlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW5jZWxsYXRpb25TY29wZT4oKTtcblxuICAvKipcbiAgICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICAgKi9cbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtczogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IG51bWJlciB7XG4gICAgbXMgPSBNYXRoLm1heCgxLCBtcyk7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgaWYgKGFjdGl2YXRvci5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAvLyBDYXB0dXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBzbGVlcCB3aWxsIGFsbG9jYXRlXG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXI7XG4gICAgICBjb25zdCB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSk7XG4gICAgICBjb25zdCBzbGVlcFByb21pc2UgPSB0aW1lclNjb3BlLnJ1bigoKSA9PiBzbGVlcChtcykpO1xuICAgICAgc2xlZXBQcm9taXNlLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIGNiKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNsZWVwUHJvbWlzZSk7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLnNldChzZXEsIHRpbWVyU2NvcGUpO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG4gICAgICAvLyBDcmVhdGUgYSBQcm9taXNlIGZvciBBc3luY0xvY2FsU3RvcmFnZSB0byBiZSBhYmxlIHRvIHRyYWNrIHRoaXMgY29tcGxldGlvbiB1c2luZyBwcm9taXNlIGhvb2tzLlxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgc3RhcnRUb0ZpcmVUaW1lb3V0OiBtc1RvVHMobXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudGhlbihcbiAgICAgICAgKCkgPT4gY2IoLi4uYXJncyksXG4gICAgICAgICgpID0+IHVuZGVmaW5lZCAvKiBpZ25vcmUgY2FuY2VsbGF0aW9uICovXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gIH07XG5cbiAgZ2xvYmFsLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIChoYW5kbGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGNvbnN0IHRpbWVyU2NvcGUgPSB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmdldChoYW5kbGUpO1xuICAgIGlmICh0aW1lclNjb3BlKSB7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7IC8vIFNob3VsZG4ndCBpbmNyZWFzZSBzZXEgbnVtYmVyLCBidXQgdGhhdCdzIHRoZSBsZWdhY3kgYmVoYXZpb3JcbiAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaGFuZGxlKTtcbiAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgc2VxOiBoYW5kbGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYWN0aXZhdG9yLnJhbmRvbSBpcyBtdXRhYmxlLCBkb24ndCBoYXJkY29kZSBpdHMgcmVmZXJlbmNlXG4gIE1hdGgucmFuZG9tID0gKCkgPT4gZ2V0QWN0aXZhdG9yKCkucmFuZG9tKCk7XG59XG4iLCIvKipcbiAqIFRoaXMgbGlicmFyeSBwcm92aWRlcyB0b29scyByZXF1aXJlZCBmb3IgYXV0aG9yaW5nIHdvcmtmbG93cy5cbiAqXG4gKiAjIyBVc2FnZVxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvaGVsbG8td29ybGQjd29ya2Zsb3dzIHwgdHV0b3JpYWx9IGZvciB3cml0aW5nIHlvdXIgZmlyc3Qgd29ya2Zsb3cuXG4gKlxuICogIyMjIFRpbWVyc1xuICpcbiAqIFRoZSByZWNvbW1lbmRlZCB3YXkgb2Ygc2NoZWR1bGluZyB0aW1lcnMgaXMgYnkgdXNpbmcgdGhlIHtAbGluayBzbGVlcH0gZnVuY3Rpb24uIFdlJ3ZlIHJlcGxhY2VkIGBzZXRUaW1lb3V0YCBhbmRcbiAqIGBjbGVhclRpbWVvdXRgIHdpdGggZGV0ZXJtaW5pc3RpYyB2ZXJzaW9ucyBzbyB0aGVzZSBhcmUgYWxzbyB1c2FibGUgYnV0IGhhdmUgYSBsaW1pdGF0aW9uIHRoYXQgdGhleSBkb24ndCBwbGF5IHdlbGxcbiAqIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2NhbmNlbGxhdGlvbi1zY29wZXMgfCBjYW5jZWxsYXRpb24gc2NvcGVzfS5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwZXIobXMgPSAxMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgYXdhaXQgc2xlZXAobXMpO1xuICogICBjb25zb2xlLmxvZygnc2xlcHQnKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBBY3Rpdml0aWVzXG4gKlxuICogVG8gc2NoZWR1bGUgQWN0aXZpdGllcywgdXNlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9IHRvIG9idGFpbiBhbiBBY3Rpdml0eSBmdW5jdGlvbiBhbmQgY2FsbC5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlBY3Rpdml0aWVzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICogaW1wb3J0IHR5cGUgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4vYWN0aXZpdGllcyc7XG4gKlxuICogY29uc3QgeyBzZW5kRW1haWwgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMSBtaW51dGUnLFxuICogfSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYW1wbGVXb3JrZmxvdygpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBzZW5kRW1haWwoXCJ0b0BleGFtcGxlLmNvbVwiLFwiSGVsbG8sIFRlbXBvcmFsIVwiKTtcbn1cblxuICogYGBgXG4gKiBcbiAqICMjIyBVcGRhdGVzLCBTaWduYWxzIGFuZCBRdWVyaWVzXG4gKlxuICogVXNlIHtAbGluayBzZXRIYW5kbGVyfSB0byBzZXQgaGFuZGxlcnMgZm9yIFVwZGF0ZXMsIFNpZ25hbHMsIGFuZCBRdWVyaWVzLlxuICpcbiAqIFVwZGF0ZSBhbmQgU2lnbmFsIGhhbmRsZXJzIGNhbiBiZSBlaXRoZXIgYXN5bmMgb3Igbm9uLWFzeW5jIGZ1bmN0aW9ucy4gVXBkYXRlIGhhbmRsZXJzIG1heSByZXR1cm4gYSB2YWx1ZSwgYnV0IHNpZ25hbFxuICogaGFuZGxlcnMgbWF5IG5vdCAocmV0dXJuIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmApLiBZb3UgbWF5IHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsIGNoaWxkIFdvcmtmbG93cywgZXRjIGluIFVwZGF0ZVxuICogYW5kIFNpZ25hbCBoYW5kbGVycywgYnV0IHRoaXMgc2hvdWxkIGJlIGRvbmUgY2F1dGlvdXNseTogZm9yIGV4YW1wbGUsIG5vdGUgdGhhdCBpZiB5b3UgYXdhaXQgYXN5bmMgb3BlcmF0aW9ucyBzdWNoIGFzXG4gKiB0aGVzZSBpbiBhbiBVcGRhdGUgb3IgU2lnbmFsIGhhbmRsZXIsIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgd29ya2Zsb3cgZG9lcyBub3QgY29tcGxldGUgZmlyc3QuXG4gKlxuICogUXVlcnkgaGFuZGxlcnMgbWF5ICoqbm90KiogYmUgYXN5bmMgZnVuY3Rpb25zLCBhbmQgbWF5ICoqbm90KiogbXV0YXRlIGFueSB2YXJpYWJsZXMgb3IgdXNlIEFjdGl2aXRpZXMsIFRpbWVycyxcbiAqIGNoaWxkIFdvcmtmbG93cywgZXRjLlxuICpcbiAqICMjIyMgSW1wbGVtZW50YXRpb25cbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGNvbnN0IGluY3JlbWVudFNpZ25hbCA9IHdmLmRlZmluZVNpZ25hbDxbbnVtYmVyXT4oJ2luY3JlbWVudCcpO1xuICogZXhwb3J0IGNvbnN0IGdldFZhbHVlUXVlcnkgPSB3Zi5kZWZpbmVRdWVyeTxudW1iZXI+KCdnZXRWYWx1ZScpO1xuICogZXhwb3J0IGNvbnN0IGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlID0gd2YuZGVmaW5lVXBkYXRlPG51bWJlciwgW251bWJlcl0+KCdpbmNyZW1lbnRBbmRHZXRWYWx1ZScpO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudGVyV29ya2Zsb3coaW5pdGlhbFZhbHVlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgbGV0IGNvdW50ID0gaW5pdGlhbFZhbHVlO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudFNpZ25hbCwgKGFyZzogbnVtYmVyKSA9PiB7XG4gKiAgICAgY291bnQgKz0gYXJnO1xuICogICB9KTtcbiAqICAgd2Yuc2V0SGFuZGxlcihnZXRWYWx1ZVF1ZXJ5LCAoKSA9PiBjb3VudCk7XG4gKiAgIHdmLnNldEhhbmRsZXIoaW5jcmVtZW50QW5kR2V0VmFsdWVVcGRhdGUsIChhcmc6IG51bWJlcik6IG51bWJlciA9PiB7XG4gKiAgICAgY291bnQgKz0gYXJnO1xuICogICAgIHJldHVybiBjb3VudDtcbiAqICAgfSk7XG4gKiAgIGF3YWl0IHdmLmNvbmRpdGlvbigoKSA9PiBmYWxzZSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgTW9yZVxuICpcbiAqIC0gW0RldGVybWluaXN0aWMgYnVpbHQtaW5zXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kZXRlcm1pbmlzbSNzb3VyY2VzLW9mLW5vbi1kZXRlcm1pbmlzbSlcbiAqIC0gW0NhbmNlbGxhdGlvbiBhbmQgc2NvcGVzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzKVxuICogICAtIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1cbiAqICAgLSB7QGxpbmsgVHJpZ2dlcn1cbiAqIC0gW1NpbmtzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vYXBwbGljYXRpb24tZGV2ZWxvcG1lbnQvb2JzZXJ2YWJpbGl0eS8/bGFuZz10cyNsb2dnaW5nKVxuICogICAtIHtAbGluayBTaW5rc31cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuZXhwb3J0IHtcbiAgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBBY3Rpdml0eUZhaWx1cmUsXG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIFBheWxvYWRDb252ZXJ0ZXIsXG4gIFJldHJ5UG9saWN5LFxuICByb290Q2F1c2UsXG4gIFNlYXJjaEF0dHJpYnV0ZXMsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgU2VhcmNoQXR0cmlidXRlVmFsdWUsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2Vycm9ycyc7XG5leHBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eUludGVyZmFjZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBQYXlsb2FkLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVudHlwZWRBY3Rpdml0aWVzLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dRdWVyeVR5cGUsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1NpZ25hbFR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LW9wdGlvbnMnO1xuZXhwb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UsIENhbmNlbGxhdGlvblNjb3BlLCBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5leHBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENvbnRpbnVlQXNOZXcsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFBhcmVudENsb3NlUG9saWN5LFxuICBQYXJlbnRXb3JrZmxvd0luZm8sXG4gIFJvb3RXb3JrZmxvd0luZm8sXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlLFxuICBVbnNhZmVXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93SW5mbyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7IHByb3h5U2lua3MsIFNpbmssIFNpbmtDYWxsLCBTaW5rRnVuY3Rpb24sIFNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5leHBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ3MnO1xuZXhwb3J0IHsgVHJpZ2dlciB9IGZyb20gJy4vdHJpZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3dvcmtmbG93JztcbmV4cG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgeyBtZXRyaWNNZXRlciB9IGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQge1xuICBjcmVhdGVOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzU2VydmljZUNsaWVudE9wdGlvbnMsXG4gIE5leHVzU2VydmljZUNsaWVudCxcbiAgTmV4dXNPcGVyYXRpb25IYW5kbGUsXG4gIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9uZXh1cyc7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRGVwcmVjYXRlZCBBUElzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cblxuICBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgYXMgTG9nZ2VyU2lua3MsXG59IGZyb20gJy4vbG9ncyc7XG4iLCIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIFdvcmtmbG93IGludGVyY2VwdG9ycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQWN0aXZpdHlPcHRpb25zLFxuICBEdXJhdGlvbixcbiAgSGVhZGVycyxcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIE1ldHJpY1RhZ3MsXG4gIE5leHQsXG4gIFRpbWVzdGFtcCxcbiAgV29ya2Zsb3dFeGVjdXRpb24sXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLCBDb250aW51ZUFzTmV3T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSB9IGZyb20gJy4vbmV4dXMnO1xuXG5leHBvcnQgeyBOZXh0LCBIZWFkZXJzIH07XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGluc3RhbnRpYXRlcyB7QGxpbmsgV29ya2Zsb3dJbnRlcmNlcHRvcnN9LlxuICpcbiAqIFdvcmtmbG93IGludGVyY2VwdG9yIG1vZHVsZXMgc2hvdWxkIGV4cG9ydCBhbiBgaW50ZXJjZXB0b3JzYCBmdW5jdGlvbiBvZiB0aGlzIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGZ1bmN0aW9uIGludGVyY2VwdG9ycygpOiBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgaW5ib3VuZDogW10sICAgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGluYm91bmQgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgb3V0Ym91bmQ6IFtdLCAgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIG91dGJvdW5kIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIGludGVybmFsczogW10sIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbnRlcm5hbHMgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgIH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gKCkgPT4gV29ya2Zsb3dJbnRlcmNlcHRvcnM7XG5cbi8qKlxuICogQSBtYXBwaW5nIGZyb20gaW50ZXJjZXB0b3IgdHlwZSB0byBhbiBvcHRpb25hbCBsaXN0IG9mIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW50ZXJjZXB0b3JzIHtcbiAgaW5ib3VuZD86IFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgb3V0Ym91bmQ/OiBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvcltdO1xuICBpbnRlcm5hbHM/OiBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yW107XG59XG5cbi8vIFdvcmtmbG93IEluYm91bmQgQ2FsbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEltcGxlbWVudCBhbnkgb2YgdGhlc2UgbWV0aG9kcyB0byBpbnRlcmNlcHQgV29ya2Zsb3cgaW5ib3VuZCBjYWxscyBsaWtlIGV4ZWN1dGlvbiwgYW5kIHNpZ25hbCBhbmQgcXVlcnkgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBleGVjdXRlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIFdvcmtmbG93IGV4ZWN1dGlvblxuICAgKi9cbiAgZXhlY3V0ZT86IChpbnB1dDogV29ya2Zsb3dFeGVjdXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2V4ZWN1dGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gVXBkYXRlIGhhbmRsZXIgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBVcGRhdGVcbiAgICovXG4gIGhhbmRsZVVwZGF0ZT86IChpbnB1dDogVXBkYXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVVwZGF0ZSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB1cGRhdGUgdmFsaWRhdG9yIGNhbGxlZFxuICAgKi9cbiAgdmFsaWRhdGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICd2YWxpZGF0ZVVwZGF0ZSc+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIGEgV29ya2Zsb3cgZXhlY3V0aW9uXG4gICAqL1xuICBoYW5kbGVTaWduYWw/OiAoaW5wdXQ6IFNpZ25hbElucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVTaWduYWwnPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBXb3JrZmxvdyBpcyBxdWVyaWVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBxdWVyeVxuICAgKi9cbiAgaGFuZGxlUXVlcnk/OiAoaW5wdXQ6IFF1ZXJ5SW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVF1ZXJ5Jz4pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmV4ZWN1dGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXhlY3V0ZUlucHV0IHtcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVVcGRhdGV9IGFuZCB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci52YWxpZGF0ZVVwZGF0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5wdXQge1xuICByZWFkb25seSB1cGRhdGVJZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlU2lnbmFsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxJbnB1dCB7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVRdWVyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlJbnB1dCB7XG4gIHJlYWRvbmx5IHF1ZXJ5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLy8gV29ya2Zsb3cgT3V0Ym91bmQgQ2FsbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEltcGxlbWVudCBhbnkgb2YgdGhlc2UgbWV0aG9kcyB0byBpbnRlcmNlcHQgV29ya2Zsb3cgY29kZSBjYWxscyB0byB0aGUgVGVtcG9yYWwgQVBJcywgbGlrZSBzY2hlZHVsaW5nIGFuIGFjdGl2aXR5XG4gKiBhbmQgc3RhcnRpbmcgYSB0aW1lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSB0aW1lci5cbiAgICovXG4gIHN0YXJ0VGltZXI/OiAoaW5wdXQ6IFRpbWVySW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydFRpbWVyJz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhbiBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGFjdGl2aXR5IGV4ZWN1dGlvblxuICAgKi9cbiAgc2NoZWR1bGVBY3Rpdml0eT86IChcbiAgICBpbnB1dDogQWN0aXZpdHlJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2NoZWR1bGVBY3Rpdml0eSc+XG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGEgbG9jYWwgQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlTG9jYWxBY3Rpdml0eT86IChcbiAgICBpbnB1dDogTG9jYWxBY3Rpdml0eUlucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzY2hlZHVsZUxvY2FsQWN0aXZpdHknPlxuICApID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE5leHVzT3BlcmF0aW9uPzogKFxuICAgIGlucHV0OiBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nPlxuICApID0+IFByb21pc2U8U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIGNoaWxkIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogVGhlIGludGVyY2VwdG9yIGZ1bmN0aW9uIHJldHVybnMgMiBwcm9taXNlczpcbiAgICogLSBUaGUgZmlyc3QgcmVzb2x2ZXMgd2l0aCB0aGUgYHJ1bklkYCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBoYXMgc3RhcnRlZCBvciByZWplY3RzIGlmIGZhaWxlZCB0byBzdGFydC5cbiAgICogLSBUaGUgc2Vjb25kIHJlc29sdmVzIHdpdGggdGhlIHdvcmtmbG93IHJlc3VsdCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBjb21wbGV0ZXMgb3IgcmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uPzogKFxuICAgIGlucHV0OiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2lnbmFscyBhIGNoaWxkIG9yIGV4dGVybmFsIFdvcmtmbG93LlxuICAgKi9cbiAgc2lnbmFsV29ya2Zsb3c/OiAoXG4gICAgaW5wdXQ6IFNpZ25hbFdvcmtmbG93SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NpZ25hbFdvcmtmbG93Jz5cbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBjYWxscyBjb250aW51ZUFzTmV3LlxuICAgKi9cbiAgY29udGludWVBc05ldz86IChcbiAgICBpbnB1dDogQ29udGludWVBc05ld0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdjb250aW51ZUFzTmV3Jz5cbiAgKSA9PiBQcm9taXNlPG5ldmVyPjtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgYHdvcmtmbG93LmxvZ2AgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgaW4gdGhpcyBjYWxsIGFyZSBhdHRhY2hlZCB0byBldmVyeSBsb2cgbWVzc2FnZS5cbiAgICovXG4gIGdldExvZ0F0dHJpYnV0ZXM/OiAoXG4gICAgaW5wdXQ6IEdldExvZ0F0dHJpYnV0ZXNJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnZ2V0TG9nQXR0cmlidXRlcyc+XG4gICkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgYSBtZXRyaWMgaXMgZW1pdHRlZCBmcm9tIGEgV29ya2Zsb3cgbWV0cmljIChpZS4gYSBtZXRyaWMgY3JlYXRlZFxuICAgKiBmcm9tIHtAbGluayB3b3JrZmxvdy5tZXRyaWNNZXRlcn0pLlxuICAgKlxuICAgKiBUYWdzIHJldHVybmVkIGJ5IHRoaXMgaG9vayBhcmUgX3ByZXBlbmRlZF8gdG8gdGFncyBkZWZpbmVkIGF0IHRoZSBtZXRyaWMgbGV2ZWwgYW5kIHRhZ3NcbiAgICogZGVmaW5lZCBvbiB0aGUgZW1pdHRlciBmdW5jdGlvbiBpdHNlbGYuXG4gICAqL1xuICBnZXRNZXRyaWNUYWdzPzogKFxuICAgIGlucHV0OiBHZXRNZXRyaWNUYWdzSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2dldE1ldHJpY1RhZ3MnPlxuICApID0+IE1ldHJpY1RhZ3M7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydFRpbWVyfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVySW5wdXQge1xuICByZWFkb25seSBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBvcHRpb25zPzogVGltZXJPcHRpb25zO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgdGltZXIgKGkuZS4gc2xlZXApXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZSBsaW5lIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQncyBwdXJwb3NlXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUFjdGl2aXR5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNjaGVkdWxlTG9jYWxBY3Rpdml0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBvcmlnaW5hbFNjaGVkdWxlVGltZT86IFRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnROZXh1c09wZXJhdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbklucHV0IHtcbiAgcmVhZG9ubHkgaW5wdXQ6IHVua25vd247XG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIE5leHVzIE9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZW5kIHRvIGVuZCB0aW1lb3V0IGZvciB0aGUgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgVGVtcG9yYWwgc2VydmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG1heSB3YWl0IGJlZm9yZSBpdCBiZWdpbnMgZXhlY3V0aW5nLiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBub3Qgc3RhcnRlZFxuICAgKiB3aXRoaW4gdGhpcyB3aW5kb3csIGEgdGltZW91dCBlcnJvciB3aXRoIHR5cGUgU0NIRURVTEVfVE9fU1RBUlQgaXMgcmFpc2VkLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gbm8gdGltZW91dC5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IGxvbmcgYW4gYXN5bmMgb3BlcmF0aW9uIG1heSB0YWtlIHRvIGNvbXBsZXRlIGFmdGVyIGl0IGhhcyBzdGFydGVkLiBJZiB0aGUgb3BlcmF0aW9uIGRvZXNcbiAgICogbm90IGNvbXBsZXRlIHdpdGhpbiB0aGlzIHdpbmRvdywgYSB0aW1lb3V0IGVycm9yIHdpdGggdHlwZSBTVEFSVF9UT19DTE9TRSBpcyByYWlzZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byBubyB0aW1lb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBOZXh1cyBPcGVyYXRpb25cbiAgICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgT3BlcmF0aW9uJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFdvcmtmbG93XG4gICAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gICAqICAgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICAgKiBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBPcGVyYXRpb24gY2FsbCB3YXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIHJlYWRvbmx5IGNhbmNlbGxhdGlvblR5cGU/OiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgTmV4dXMgT3BlcmF0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3V0cHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnROZXh1c09wZXJhdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbk91dHB1dCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gZm9yIHRoZSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIFVuZGVmaW5lZCBpZiB0aGUgTmV4dXMgT3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5LCBpbiB3aGljaCBjYXNlIHRoZSB7QGxpbmsgcmVzdWx0fVxuICAgKiB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlc29sdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBOZXh1cyBPcGVyYXRpb24gY29tcGxldGVzLCBlaXRoZXIgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxuICAgKiBPcGVyYXRpb24gaWYgaXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3IgYSBmYWlsdXJlIGlmIHRoZSBOZXh1cyBPcGVyYXRpb24gZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0OiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zaWduYWxXb3JrZmxvd30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsV29ya2Zsb3dJbnB1dCB7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgdGFyZ2V0OlxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnZXh0ZXJuYWwnO1xuICAgICAgICByZWFkb25seSB3b3JrZmxvd0V4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdjaGlsZCc7XG4gICAgICAgIHJlYWRvbmx5IGNoaWxkV29ya2Zsb3dJZDogc3RyaW5nO1xuICAgICAgfTtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmNvbnRpbnVlQXNOZXd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVlQXNOZXdJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ29udGludWVBc05ld0lucHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmNvbnRpbnVlQXNOZXd9LlxuICovXG5leHBvcnQgdHlwZSBDb250aW51ZUFzTmV3SW5wdXRPcHRpb25zID0gQ29udGludWVBc05ld09wdGlvbnMgJiBSZXF1aXJlZDxQaWNrPENvbnRpbnVlQXNOZXdPcHRpb25zLCAnd29ya2Zsb3dUeXBlJz4+O1xuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuZ2V0TG9nQXR0cmlidXRlc30uXG4gKi9cbmV4cG9ydCB0eXBlIEdldExvZ0F0dHJpYnV0ZXNJbnB1dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuZ2V0TWV0cmljVGFnc30uXG4gKi9cbmV4cG9ydCB0eXBlIEdldE1ldHJpY1RhZ3NJbnB1dCA9IE1ldHJpY1RhZ3M7XG5cbi8vIFdvcmtmbG93IEludGVybmFscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEludGVyY2VwdG9yIGZvciB0aGUgaW50ZXJuYWxzIG9mIHRoZSBXb3JrZmxvdyBydW50aW1lLlxuICpcbiAqIFVzZSB0byBtYW5pcHVsYXRlIG9yIHRyYWNlIFdvcmtmbG93IGFjdGl2YXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcyBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIFdvcmtmbG93IHJ1bnRpbWUgcnVucyBhIFdvcmtmbG93QWN0aXZhdGlvbkpvYi5cbiAgICovXG4gIGFjdGl2YXRlPyhpbnB1dDogQWN0aXZhdGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnYWN0aXZhdGUnPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBhbGwgYFdvcmtmbG93QWN0aXZhdGlvbkpvYmBzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGFuIGFjdGl2YXRpb24uXG4gICAqXG4gICAqIENhbiBtYW5pcHVsYXRlIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYnkgdGhlIFdvcmtmbG93XG4gICAqL1xuICBjb25jbHVkZUFjdGl2YXRpb24/KGlucHV0OiBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnY29uY2x1ZGVBY3RpdmF0aW9uJz4pOiBDb25jbHVkZUFjdGl2YXRpb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBiZWZvcmUgZGlzcG9zaW5nIHRoZSBXb3JrZmxvdyBpc29sYXRlIGNvbnRleHQuXG4gICAqXG4gICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFueSByZXNvdXJjZSBjbGVhbnVwLlxuICAgKi9cbiAgZGlzcG9zZT8oaW5wdXQ6IERpc3Bvc2VJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnZGlzcG9zZSc+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuYWN0aXZhdGV9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uO1xuICByZWFkb25seSBiYXRjaEluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmRpc3Bvc2V9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zZUlucHV0IHt9XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbn1cblxuLyoqXG4gKiBPdXRwdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbn1cbiAqL1xuZXhwb3J0IHR5cGUgQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0ID0gQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQ7XG4iLCJpbXBvcnQgdHlwZSB7IFJhd1NvdXJjZU1hcCB9IGZyb20gJ3NvdXJjZS1tYXAnO1xuaW1wb3J0IHtcbiAgUmV0cnlQb2xpY3ksXG4gIENvbW1vbldvcmtmbG93T3B0aW9ucyxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgRHVyYXRpb24sXG4gIFZlcnNpb25pbmdJbnRlbnQsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlUGFpcixcbiAgUHJpb3JpdHksXG4gIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogV29ya2Zsb3cgRXhlY3V0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBXb3JrZmxvdywgdGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQgZHVyaW5nIFdvcmtmbG93IGNyZWF0aW9uLlxuICAgKiBBIHNpbmdsZSBXb3JrZmxvdyBtYXkgcnVuIG11bHRpcGxlIHRpbWVzIGUuZy4gd2hlbiBzY2hlZHVsZWQgd2l0aCBjcm9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBhIHNpbmdsZSBXb3JrZmxvdyBydW5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdvcmtmbG93IGZ1bmN0aW9uJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBJbmRleGVkIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24sIGV4cG9zZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVkU2VhcmNoQXR0cmlidXRlczogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBOb24taW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBtZW1vPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpbmZvIChwcmVzZW50IGlmIHRoaXMgaXMgYSBDaGlsZCBXb3JrZmxvdylcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudD86IFBhcmVudFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogVGhlIHJvb3Qgd29ya2Zsb3cgZXhlY3V0aW9uLCBkZWZpbmVkIGFzIGZvbGxvd3M6XG4gICAqIDEuIEEgd29ya2Zsb3cgd2l0aG91dCBhIHBhcmVudCB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3cuXG4gICAqIDIuIEEgd29ya2Zsb3cgd2l0aCBhIHBhcmVudCB3b3JrZmxvdyBoYXMgdGhlIHNhbWUgcm9vdCB3b3JrZmxvdyBhc1xuICAgKiBpdHMgcGFyZW50LlxuICAgKlxuICAgKiBXaGVuIHRoZXJlIGlzIG5vIHBhcmVudCB3b3JrZmxvdywgaS5lLiwgdGhlIHdvcmtmbG93IGlzIGl0cyBvd24gcm9vdCB3b3JrZmxvdyxcbiAgICogdGhpcyBmaWVsZCBpcyBgdW5kZWZpbmVkYC5cbiAgICpcbiAgICogTm90ZSB0aGF0IENvbnRpbnVlLWFzLU5ldyAob3IgcmVzZXQpIHByb3BhZ2F0ZXMgdGhlIHdvcmtmbG93IHBhcmVudGFnZSByZWxhdGlvbnNoaXAsXG4gICAqIGFuZCB0aGVyZWZvcmUsIHdoZXRoZXIgdGhlIG5ldyB3b3JrZmxvdyBoYXMgdGhlIHNhbWUgcm9vdCB3b3JrZmxvdyBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAqIGRlcGVuZHMgb24gd2hldGhlciBpdCBoYWQgYSBwYXJlbnQuXG4gICAqXG4gICAqL1xuICByZWFkb25seSByb290PzogUm9vdFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogUmVzdWx0IGZyb20gdGhlIHByZXZpb3VzIFJ1biAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ3JvbiBXb3JrZmxvdyBvciB3YXMgQ29udGludWVkIEFzIE5ldykuXG4gICAqXG4gICAqIEFuIGFycmF5IG9mIHZhbHVlcywgc2luY2Ugb3RoZXIgU0RLcyBtYXkgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgV29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBsYXN0UmVzdWx0PzogdW5rbm93bjtcblxuICAvKipcbiAgICogRmFpbHVyZSBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgd2hlbiB0aGlzIFJ1biBpcyBhIHJldHJ5LCBvciB0aGUgbGFzdCBSdW4gb2YgYSBDcm9uIFdvcmtmbG93IGZhaWxlZClcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RGYWlsdXJlPzogRXJyb3I7XG5cbiAgLyoqXG4gICAqIExlbmd0aCBvZiBXb3JrZmxvdyBoaXN0b3J5IHVwIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogWW91IG1heSBzYWZlbHkgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGVjaWRlIHdoZW4gdG8ge0BsaW5rIGNvbnRpbnVlQXNOZXd9LlxuICAgKi9cbiAgcmVhZG9ubHkgaGlzdG9yeUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIFdvcmtmbG93IGhpc3RvcnkgaW4gYnl0ZXMgdW50aWwgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyB6ZXJvIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlTaXplOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgaGludCBwcm92aWRlZCBieSB0aGUgY3VycmVudCBXb3JrZmxvd1Rhc2tTdGFydGVkIGV2ZW50IHJlY29tbWVuZGluZyB3aGV0aGVyIHRvXG4gICAqIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyBgZmFsc2VgIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqL1xuICByZWFkb25seSBjb250aW51ZUFzTmV3U3VnZ2VzdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdydzIFRhcmdldCBXb3JrZXIgRGVwbG95bWVudCBWZXJzaW9uIGhhcyBjaGFuZ2VkIGZyb20gaXRzIFBpbm5lZCBWZXJzaW9uLlxuICAgKiBXaGVuIHRydWUsIHRoZSB3b3JrZmxvdyBzaG91bGQgY29uc2lkZXIgY29udGludWluZy1hcy1uZXcgd2l0aFxuICAgKiBgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogJ0FVVE9fVVBHUkFERSdgIHRvIG1vdmUgdG8gdGhlIG5ldyB2ZXJzaW9uLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXBncmFkZS1vbi1Db250aW51ZS1hcy1OZXcgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0V29ya2VyRGVwbG95bWVudFZlcnNpb25DaGFuZ2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZENvbnRpbnVlQXNOZXdSZWFzb25zPzogU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb25bXTtcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBvblxuICAgKi9cbiAgcmVhZG9ubHkgdGFza1F1ZXVlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzcGFjZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBpblxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1biBJZCBvZiB0aGUgZmlyc3QgUnVuIGluIHRoaXMgRXhlY3V0aW9uIENoYWluXG4gICAqL1xuICByZWFkb25seSBmaXJzdEV4ZWN1dGlvblJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IFJ1biBJZCBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVkRnJvbUV4ZWN1dGlvblJ1bklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoaXMgW1dvcmtmbG93IEV4ZWN1dGlvbiBDaGFpbl0oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtmbG93cyN3b3JrZmxvdy1leGVjdXRpb24tY2hhaW4pIHdhcyBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBzdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIGN1cnJlbnQgV29ya2Zsb3cgUnVuIHN0YXJ0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1blN0YXJ0VGltZTogRGF0ZTtcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIFNlcnZlci4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25UaW1lb3V0TXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiBleHBpcmVzXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25FeHBpcmF0aW9uVGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgUnVuIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgV29ya2Zsb3cgVGFzayBpbiBtaWxsaXNlY29uZHMuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1Rhc2tUaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tUaW1lb3V0TXM6IG51bWJlcjtcblxuICAvKipcbiAgICogUmV0cnkgUG9saWN5IGZvciB0aGlzIEV4ZWN1dGlvbi4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLnJldHJ5fS5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5UG9saWN5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhdCAxIGFuZCBpbmNyZW1lbnRzIGZvciBldmVyeSByZXRyeSBpZiB0aGVyZSBpcyBhIGByZXRyeVBvbGljeWBcbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JvbiBTY2hlZHVsZSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5jcm9uU2NoZWR1bGV9LlxuICAgKi9cbiAgcmVhZG9ubHkgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYmV0d2VlbiBDcm9uIFJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZVRvU2NoZWR1bGVJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEJ1aWxkIElEIG9mIHRoZSB3b3JrZXIgd2hpY2ggZXhlY3V0ZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay4gTWF5IGJlIHVuZGVmaW5lZCBpZiB0aGVcbiAgICogdGFzayB3YXMgY29tcGxldGVkIGJ5IGEgd29ya2VyIHdpdGhvdXQgYSBCdWlsZCBJRC4gSWYgdGhpcyB3b3JrZXIgaXMgdGhlIG9uZSBleGVjdXRpbmcgdGhpc1xuICAgKiB0YXNrIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgaGFzIGEgQnVpbGQgSUQgc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZVxuICAgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBjdXJyZW50RGVwbG95bWVudFZlcnNpb25gIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRCdWlsZElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGVwbG95bWVudCBWZXJzaW9uIG9mIHRoZSB3b3JrZXIgd2hpY2ggZXhlY3V0ZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay4gTWF5IGJlIHVuZGVmaW5lZFxuICAgKiBpZiB0aGUgdGFzayB3YXMgY29tcGxldGVkIGJ5IGEgd29ya2VyIHdpdGhvdXQgYSBEZXBsb3ltZW50IFZlcnNpb24uIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmVcbiAgICogZXhlY3V0aW5nIHRoaXMgdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIERlcGxveW1lbnQgVmVyc2lvbiBzZXQsIHRoZW4gaXRzIElEIHdpbGwgYmVcbiAgICogdXNlZC4gVGhpcyB2YWx1ZSBtYXkgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSB3b3JrZmxvdyBydW4sIGJ1dCBpcyBkZXRlcm1pbmlzdGljIGFuZFxuICAgKiBzYWZlIHRvIHVzZSBmb3IgYnJhbmNoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudERlcGxveW1lbnRWZXJzaW9uPzogV29ya2VyRGVwbG95bWVudFZlcnNpb247XG5cbiAgcmVhZG9ubHkgdW5zYWZlOiBVbnNhZmVXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgd29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogVW5zYWZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbi5cbiAqXG4gKiBOZXZlciByZWx5IG9uIHRoaXMgaW5mb3JtYXRpb24gaW4gV29ya2Zsb3cgbG9naWMgYXMgaXQgd2lsbCBjYXVzZSBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNhZmVXb3JrZmxvd0luZm8ge1xuICAvKipcbiAgICogQ3VycmVudCBzeXN0ZW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICpcbiAgICogVGhlIHNhZmUgdmVyc2lvbiBvZiB0aW1lIGlzIGBuZXcgRGF0ZSgpYCBhbmQgYERhdGUubm93KClgLCB3aGljaCBhcmUgc2V0IG9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIGEgV29ya2Zsb3dcbiAgICogVGFzayBhbmQgc3RheSBjb25zdGFudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBUYXNrIGFuZCBkdXJpbmcgcmVwbGF5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcuXG4gICAqL1xuICByZWFkb25seSBpc1JlcGxheWluZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cgaXMgY3VycmVudGx5IHJlcGxheWluZyBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHtAbGluayBpc1JlcGxheWluZ30sIGJ1dCByZXR1cm5zIGBmYWxzZWAgZHVyaW5nIHF1ZXJ5IGhhbmRsZXJzIGFuZCB1cGRhdGVcbiAgICogdmFsaWRhdG9ycywgd2hpY2ggYXJlIGxpdmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXMgcmVwbGF5aW5nXG4gICAqIGhpc3RvcnkgZXZlbnRzLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgdHJ1ZSwgd29ya2Zsb3cgbG9nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkIGFuZCBzaW5rcyBkZWZpbmVkIHdpdGhcbiAgICogY2FsbER1cmluZ1JlcGxheT1mYWxzZSB3b24ndCBnZXQgcHJvY2Vzc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgd29ya2Zsb3cgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUluZm8ge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFdvcmtmbG93SW5mbyB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFdvcmtmbG93SW5mbyB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3QgYW4gYWN0dWFsIGVycm9yLCB1c2VkIGJ5IHRoZSBXb3JrZmxvdyBydW50aW1lIHRvIGFib3J0IGV4ZWN1dGlvbiB3aGVuIHtAbGluayBjb250aW51ZUFzTmV3fSBpcyBjYWxsZWRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb250aW51ZUFzTmV3JylcbmV4cG9ydCBjbGFzcyBDb250aW51ZUFzTmV3IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JQ29udGludWVBc05ld1dvcmtmbG93RXhlY3V0aW9uKSB7XG4gICAgc3VwZXIoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnRpbnVpbmcgYSBXb3JrZmxvdyBhcyBuZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFdvcmtmbG93IHR5cGUgbmFtZSwgZS5nLiB0aGUgZmlsZW5hbWUgaW4gdGhlIE5vZGUuanMgU0RLIG9yIGNsYXNzIG5hbWUgaW4gSmF2YVxuICAgKi9cbiAgd29ya2Zsb3dUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byBjb250aW51ZSB0aGUgV29ya2Zsb3cgaW5cbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIHRoZSBlbnRpcmUgV29ya2Zsb3cgcnVuXG4gICAqIEBmb3JtYXQge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgYSBzaW5nbGUgV29ya2Zsb3cgdGFza1xuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBOb24tc2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogU2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZC5cbiAgICovXG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICogTm90ZSB0aGF0IHNlYXJjaCBhdHRyaWJ1dGVzIGFyZSBub3QgZW5jb2RlZCwgYXMgc3VjaCwgZG8gbm90IGluY2x1ZGUgYW55IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogSWYgYm90aCB7QGxpbmsgc2VhcmNoQXR0cmlidXRlc30gYW5kIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuXG4gICAqIGJ5IHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9LlxuICAgKi9cbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlUGFpcltdIHwgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzO1xuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBXb3JrZmxvdyBzaG91bGRcbiAgICogQ29udGludWUtYXMtTmV3IG9udG8gYSB3b3JrZXIgd2l0aCBhIGNvbXBhdGlibGUgQnVpbGQgSWQgb3Igbm90LiBTZWUge0BsaW5rIFZlcnNpb25pbmdJbnRlbnR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ09NUEFUSUJMRSdcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICBpbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yPzogSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCBhbmRcbiAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICogICBwcm9taXNlIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAqXG4gKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYENoaWxkV29ya2Zsb3dPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgQ2hpbGQsIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uXG4gICAqIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFBhcmVudC1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGF0b21pY2FsbHkgYWRkZWQgdG8gdGhlIENoaWxkIHdvcmtmbG93J3MgaGlzdG9yeS5cbiAgICogSW4gcGFydGljdWxhciwgdGhlIENoaWxkIG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIFBhcmVudCB3b3JrZmxvdyB0aGlua3MgaXRzIGNoaWxkXG4gICAqIHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgY2hpbGQgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZ3VhcmFudGVlIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIENoaWxkIFdvcmtmbG93IGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyByZWNvcmRlZCBpbiBpdHMgaGlzdG9yeS5cbiAgICpcbiAgICogVGhpcyBjYW5jZWxsYXRpb24gdHlwZSBndWFyYW50ZWVzIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgKHRoYXQgaXMsIHVubGVzcyB0aGUgQ2hpbGQgdGVybWluYXRlcyBpbmJldHdlZW4gZHVlIHRvIHVuZXhwZWN0ZWQgY2F1c2VzKS5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIENoaWxkIFdvcmtmbG93LlxuICAgKlxuICAgKiBUaGUgQ2hpbGQgbWF5IHJlc3BlY3QgY2FuY2VsbGF0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBQYXJlbnQncyBgZXhlY3V0ZUNoaWxkYCBvclxuICAgKiBgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHRgIHByb21pc2Ugd2lsbCBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWBcbiAgICogc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIENoaWxkIG1heSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Ugd2lsbCBlaXRoZXIgcmVzb2x2ZSB3aXRoIGEgcmVzdWx0IChpZiBDaGlsZCBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5KSBvciByZWplY3Qgd2l0aCBhIGRpZmZlcmVudCBjYXVzZSAoaWYgQ2hpbGQgY29tcGxldGVkIHVuY2Vzc2Z1bGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMCxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDEsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDIsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIEhvdyBhIENoaWxkIFdvcmtmbG93IHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcGFyZW50LWNsb3NlLXBvbGljeS8gfCBQYXJlbnQgQ2xvc2UgUG9saWN5fVxuICovXG5leHBvcnQgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqL1xuICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcblxuICAvLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGhhcyBiZWVuIGRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSWYgYSBgUGFyZW50Q2xvc2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRWl0aGVyIGxlYXZlIHByb3BlcnR5IGB1bmRlZmluZWRgLCBvciBzZXQgYW4gZXhwbGljaXQgcG9saWN5IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEVdOiAxLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkV29ya2Zsb3dPcHRpb25zIGV4dGVuZHMgT21pdDxDb21tb25Xb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3knPiB7XG4gIC8qKlxuICAgKiBXb3JrZmxvdyBpZCB0byB1c2Ugd2hlbiBzdGFydGluZy4gSWYgbm90IHNwZWNpZmllZCBhIFVVSUQgaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgaXQgaXNcbiAgICogZGFuZ2Vyb3VzIGFzIGluIGNhc2Ugb2YgY2xpZW50IHNpZGUgcmV0cmllcyBubyBkZWR1cGxpY2F0aW9uIHdpbGwgaGFwcGVuIGJhc2VkIG9uIHRoZVxuICAgKiBnZW5lcmF0ZWQgaWQuIFNvIHByZWZlciBhc3NpZ25pbmcgYnVzaW5lc3MgbWVhbmluZ2Z1bCBpZHMgaWYgcG9zc2libGUuXG4gICAqL1xuICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRvIHVzZSBmb3IgV29ya2Zsb3cgdGFza3MuIEl0IHNob3VsZCBtYXRjaCBhIHRhc2sgcXVldWUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYVxuICAgKiBgV29ya2VyYCB0aGF0IGhvc3RzIHRoZSBXb3JrZmxvdyBjb2RlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIGNoaWxkIGlzIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBUYXNrIFF1ZXVlIGFzIHRoZSBwYXJlbnQuXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIHtAbGluayBleGVjdXRlQ2hpbGR9J3Mgb3Ige0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fSdzXG4gICAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXMgY29udHJvbGxlZCBieSB0aGUge0BsaW5rIFBhcmVudENsb3NlUG9saWN5fSBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdGhlIENoaWxkIHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJlbnRDbG9zZVBvbGljeS5QQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVxuICAgKi9cbiAgcGFyZW50Q2xvc2VQb2xpY3k/OiBQYXJlbnRDbG9zZVBvbGljeTtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBDaGlsZCBXb3JrZmxvdyBzaG91bGQgcnVuIG9uXG4gICAqIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbn1cblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucyA9IFJlcXVpcmVkPFBpY2s8Q2hpbGRXb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkJyB8ICdjYW5jZWxsYXRpb25UeXBlJz4+ICYge1xuICBhcmdzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyA9IENoaWxkV29ya2Zsb3dPcHRpb25zICYgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlU0RLSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzbGljZSBvZiBhIGZpbGUgc3RhcnRpbmcgYXQgbGluZU9mZnNldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlU2xpY2Uge1xuICAvKipcbiAgICogT25seSB1c2VkIHBvc3NpYmxlIHRvIHRyaW0gdGhlIGZpbGUgd2l0aG91dCBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLlxuICAgKi9cbiAgbGluZV9vZmZzZXQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIHNsaWNlIG9mIGEgZmlsZSB3aXRoIGBcXG5gIChuZXdsaW5lKSBsaW5lIHRlcm1pbmF0b3IuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gYSBmaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHNvdXJjZSBmaWxlIChhYnNvbHV0ZSBvciByZWxhdGl2ZSkuXG4gICAqIFdoZW4gdXNpbmcgYSByZWxhdGl2ZSBwYXRoLCBtYWtlIHN1cmUgYWxsIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2FtZSByb290LlxuICAgKi9cbiAgZmlsZV9wYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLCByZXF1aXJlZCBmb3IgZGlzcGxheWluZyB0aGUgY29kZSBsb2NhdGlvbi5cbiAgICovXG4gIGxpbmU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBwb3NzaWJsZSwgU0RLIHNob3VsZCBzZW5kIHRoaXMuXG4gICAqL1xuICBjb2x1bW4/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBuYW1lIHRoaXMgbGluZSBiZWxvbmdzIHRvIChpZiBhcHBsaWNhYmxlKS5cbiAgICogVXNlZCBmb3IgZmFsbGluZyBiYWNrIHRvIHN0YWNrIHRyYWNlIHZpZXcuXG4gICAqL1xuICBmdW5jdGlvbl9uYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogRmxhZyB0byBtYXJrIHRoaXMgYXMgaW50ZXJuYWwgU0RLIGNvZGUgYW5kIGhpZGUgYnkgZGVmYXVsdCBpbiB0aGUgVUkuXG4gICAqL1xuICBpbnRlcm5hbF9jb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2Uge1xuICBsb2NhdGlvbnM6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBVc2VkIGFzIHRoZSByZXN1bHQgZm9yIHRoZSBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VkU3RhY2tUcmFjZSB7XG4gIHNkazogU3RhY2tUcmFjZVNES0luZm87XG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZpbGUgcGF0aCB0byBmaWxlIGNvbnRlbnRzLlxuICAgKiBTREsgbWF5IGNob29zZSB0byBzZW5kIG5vLCBzb21lIG9yIGFsbCBzb3VyY2VzLlxuICAgKiBTb3VyY2VzIG1pZ2h0IGJlIHRyaW1tZWQsIGFuZCBzb21lIHRpbWUgb25seSB0aGUgZmlsZShzKSBvZiB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIHRyYWNlIHdpbGwgYmUgc2VudC5cbiAgICovXG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFN0YWNrVHJhY2VGaWxlU2xpY2VbXT47XG4gIHN0YWNrczogU3RhY2tUcmFjZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9ucyB7XG4gIGluZm86IFdvcmtmbG93SW5mbztcbiAgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuICBub3c6IG51bWJlcjtcbiAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIGV4dGVuZHMgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG4gIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcbiAgZ2V0VGltZU9mRGF5KCk6IGJpZ2ludDtcbiAgc3RhY2tUcmFjZXNFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24sIFNpZ25hbERlZmluaXRpb24gb3IgUXVlcnlEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4gPSBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICA/ICguLi5hcmdzOiBBKSA9PiBSIHwgUHJvbWlzZTxSPlxuICA6IFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPGluZmVyIEE+XG4gICAgPyAoLi4uYXJnczogQSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAgICA6IFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBzaWduYWwgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgdXBkYXRlIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRVcGRhdGVIYW5kbGVyID0gKHVwZGF0ZU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5SGFuZGxlciA9IChxdWVyeU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuXG4vKipcbiAqIEEgdmFsaWRhdGlvbiBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZVZhbGlkYXRvcjxBcmdzIGV4dGVuZHMgYW55W10+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHF1ZXJ5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5SGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpZ25hbCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBTaWduYWxIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSB9O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGFuZCBkZXNjcmlwdGlvbiBvZiBhbiB1cGRhdGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdPiA9IHtcbiAgdmFsaWRhdG9yPzogVXBkYXRlVmFsaWRhdG9yPEFyZ3M+O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbiAgdXNlZEludGVybmFsRmxhZ3M6IG51bWJlcltdO1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJhd1NvdXJjZU1hcCB9IGZyb20gJ3NvdXJjZS1tYXAnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIsXG4gIEZhaWx1cmVDb252ZXJ0ZXIsXG4gIFBheWxvYWRDb252ZXJ0ZXIsXG4gIGFycmF5RnJvbVBheWxvYWRzLFxuICBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcixcbiAgZW5zdXJlVGVtcG9yYWxGYWlsdXJlLFxuICBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSxcbiAgSWxsZWdhbFN0YXRlRXJyb3IsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcixcbiAgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93U2lnbmFsQW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlLFxuICBQcm90b0ZhaWx1cmUsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgV29ya2Zsb3dVcGRhdGVUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIG1hcEZyb21QYXlsb2FkcyxcbiAgZnJvbVBheWxvYWRzQXRJbmRleCxcbiAgUmF3VmFsdWUsXG4gIFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyxcbiAgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHtcbiAgZGVjb2RlU2VhcmNoQXR0cmlidXRlcyxcbiAgZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7XG4gIFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCxcbiAgU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgeyBhbGVhLCBSTkcgfSBmcm9tICcuL2FsZWEnO1xuaW1wb3J0IHsgUm9vdENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgVXBkYXRlU2NvcGUgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yLCBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmLCBpc0NhbmNlbGxhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIFF1ZXJ5SW5wdXQsXG4gIFNpZ25hbElucHV0LFxuICBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LFxuICBVcGRhdGVJbnB1dCxcbiAgV29ya2Zsb3dFeGVjdXRlSW5wdXQsXG4gIFdvcmtmbG93SW50ZXJjZXB0b3JzLFxufSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQge1xuICBDb250aW51ZUFzTmV3LFxuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgU3RhY2tUcmFjZVNES0luZm8sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwsXG4gIEFjdGl2YXRpb25Db21wbGV0aW9uLFxuICBEZWZhdWx0VXBkYXRlSGFuZGxlcixcbiAgRGVmYXVsdFF1ZXJ5SGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHlwZSBTaW5rQ2FsbCB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHBrZyBmcm9tICcuL3BrZyc7XG5pbXBvcnQgeyBTZGtGbGFnLCBhc3NlcnRWYWxpZEZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZywgbG9nIH0gZnJvbSAnLi9sb2dzJztcblxuY29uc3QgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPSB7XG4gIFdPUktGTE9XX0FMUkVBRFlfRVhJU1RTOiAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnLFxufSBhcyBjb25zdDtcbnR5cGUgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPVxuICAodHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKVtrZXlvZiB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdO1xuXG5jb25zdCBbX2VuY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLCBkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV0gPVxuICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gID4oXG4gICAge1xuICAgICAgW1N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLldPUktGTE9XX0FMUkVBRFlfRVhJU1RTXTogMSxcbiAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIH0gYXMgY29uc3QsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgZm9ybWF0dGVkOiBzdHJpbmc7XG4gIHN0cnVjdHVyZWQ6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgc3RvcmUgdG8gdHJhY2sgcHJvbWlzZSBzdGFja3MgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVN0YWNrU3RvcmUge1xuICBjaGlsZFRvUGFyZW50OiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU2V0PFByb21pc2U8dW5rbm93bj4+PjtcbiAgcHJvbWlzZVRvU3RhY2s6IE1hcDxQcm9taXNlPHVua25vd24+LCBTdGFjaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbjxTdWNjZXNzPiB7XG4gIHJlc29sdmUodmFsOiBTdWNjZXNzKTogdm9pZDtcbiAgcmVqZWN0KHJlYXNvbjogRXJyb3IpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbiB7XG4gIGZuKCk6IGJvb2xlYW47XG5cbiAgcmVzb2x2ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPEsgZXh0ZW5kcyBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYj4gPSAoXG4gIGFjdGl2YXRpb246IE5vbk51bGxhYmxlPGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iW0tdPlxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIFZlcmlmaWVzIGFsbCBhY3RpdmF0aW9uIGpvYiBoYW5kbGluZyBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZFxuICovXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlciA9IHtcbiAgW1AgaW4ga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JdOiBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPFA+O1xufTtcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9uLlxuICovXG5pbnRlcmZhY2UgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBpZD86IHN0cmluZztcbn1cblxudHlwZSBJbmZlck1hcFZhbHVlPFQ+ID0gVCBleHRlbmRzIE1hcDxudW1iZXIsIGluZmVyIFY+ID8gViA6IG5ldmVyO1xuXG4vKipcbiAqIEtlZXBzIGFsbCBvZiB0aGUgV29ya2Zsb3cgcnVudGltZSBzdGF0ZSBsaWtlIHBlbmRpbmcgY29tcGxldGlvbnMgZm9yIGFjdGl2aXRpZXMgYW5kIHRpbWVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIGhhbmRsZXJzIGZvciBhbGwgd29ya2Zsb3cgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGUgdGhhdCBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gdGhlIFZNLlxuICpcbiAqIEhvd2V2ZXIsIGEgZmV3IG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhlIFZNIChlc3NlbnRpYWxseSBmcm9tIGB2bS1zaGFyZWQudHNgKS5cbiAqIFRoZXNlIG1ldGhvZHMgYXJlIHNwZWNpZmljYWxseSBtYXJrZWQgd2l0aCBhIGNvbW1lbnQgYW5kIHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLCBhcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0IG1heSBub3QgcHJvcGVybHkgcmVmbGVjdCB0aGF0IG9mIHRoZSB0YXJnZXQgd29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuOiB3aXRoIFJldXNhYmxlXG4gKiBWTXMsIHRoZSBgZ2xvYmFsYCBtYXkgbm90IGhhdmUgYmVlbiBzd2FwcGVkIHRvIHRob3NlIG9mIHRoYXQgd29ya2Zsb3cgZXhlY3V0aW9uOyB0aGUgYWN0aXZlIG1pY3JvdGFza1xuICogcXVldWUgbWF5IGJlIHRoYXQgb2YgdGhlIHRocmVhZC9wcm9jZXNzLCByYXRoZXIgdGhhbiB0aGUgcXVldWUgb2YgdGhhdCBWTSBjb250ZXh0OyBldGMpLiBDb25zZXF1ZW50bHksXG4gKiBtZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFZNIG11c3Qgbm90IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gQWNjZXNzIGFueSBnbG9iYWwgdmFyaWFibGU7XG4gKiAtIENyZWF0ZSBQcm9taXNlIG9iamVjdHMsIHVzZSBhc3luYy9hd2FpdCwgb3Igb3RoZXJ3aXNlIHNjaGVkdWxlIG1pY3JvdGFza3M7XG4gKiAtIENhbGwgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGFueSBmb3JtIG9mIGludGVyY2VwdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQWN0aXZhdGlvbkhhbmRsZXIge1xuICAvKipcbiAgICogQ2FjaGUgZm9yIG1vZHVsZXMgLSByZWZlcmVuY2VkIGluIHJldXNhYmxlLXZtLnRzXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdGFzayBzZXF1ZW5jZSB0byBhIENvbXBsZXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXRpb25zID0ge1xuICAgIHRpbWVyOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBhY3Rpdml0eTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25TdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25Db21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgY2hpbGRXb3JrZmxvd1N0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjxzdHJpbmc+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dDb21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgc2lnbmFsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQ+PigpLFxuICAgIGNhbmNlbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgfTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgVXBkYXRlIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFVwZGF0ZXMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlPigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBzaWduYWwgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkU2lnbmFscyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3c+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgdXBkYXRlIG5hbWUgdG8gaGFuZGxlciBhbmQgdmFsaWRhdG9yXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2Ygc2lnbmFsIG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHVwZGF0ZXMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyBzaWduYWxzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1NpZ25hbHMgPSBuZXcgTWFwPG51bWJlciwgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIEEgc2VxdWVuY2UgbnVtYmVyIHByb3ZpZGluZyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2lnbmFsSGFuZGxlckV4ZWN1dGlvblNlcSA9IDA7XG5cbiAgLyoqXG4gICAqIEEgc2lnbmFsIGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0U2lnbmFsSGFuZGxlcj86IERlZmF1bHRTaWduYWxIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBBIHVwZGF0ZSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFVwZGF0ZUhhbmRsZXI/OiBEZWZhdWx0VXBkYXRlSGFuZGxlcjtcblxuICAvKipcbiAgICogQSBxdWVyeSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnlIYW5kbGVyPzogRGVmYXVsdFF1ZXJ5SGFuZGxlcjtcblxuICAvKipcbiAgICogU291cmNlIG1hcCBmaWxlIGZvciBsb29raW5nIHVwIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVzcG9uc2UgdG8gX19lbmhhbmNlZF9zdGFja190cmFjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzb3VyY2VzIGluIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5IHJlc3BvbnNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTdGFja1RyYWNlU291cmNlcztcblxuICByZWFkb25seSBwcm9taXNlU3RhY2tTdG9yZTogUHJvbWlzZVN0YWNrU3RvcmUgPSB7XG4gICAgcHJvbWlzZVRvU3RhY2s6IG5ldyBNYXAoKSxcbiAgICBjaGlsZFRvUGFyZW50OiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrIHRvIGZhaWwuIFNldHMgaWYgYSBub24tYFRlbXBvcmFsRmFpbHVyZWBcbiAgICogZXJyb3IgYnViYmxlcyB1cCBvdXQgb2YgdGhlIFdvcmtmbG93IGZ1bmN0aW9uLCBvciBvdXQgb2YgYSBTaWduYWwgb3IgVXBkYXRlIGhhbmRsZXIuIFdlXG4gICAqIGNhcHR1cmUgZXJyb3JzIHRoaXMgd2F5IGJlY2F1c2UgdGhvc2UgZnVuY3Rpb25zIGFyZSBub3QgdGVjaG5pY2FsbHkgYXdhaXRlZCB3aGVuIHN0YXJ0ZWQsXG4gICAqIGJ1dCBsZWZ0IHRvIHJ1biBhc3luY2hyb25vdXNseS4gVGhlcmUgaXMgdGhlcmVmb3JlIG5vIHJlYWwgXCJwYXJlbnRcIiBmdW5jdGlvbiB0aGF0IGNhblxuICAgKiBkaXJlY3RseSBoYW5kbGUgdGhvc2UgZXJyb3JzLCBhbmQgbm90IGNhcHR1cmluZyBpdCB3b3VsZCByZXN1bHQgaW4gYW4gVW5oYW5kbGVkIFByb21pc2VcbiAgICogUmVqZWN0aW9uLiBTbyBpbnN0ZWFkLCB3ZSBidWZmZXIgdGhlIGVycm9yIGhlcmUsIHRvIHRoZW4gYmUgcHJvY2Vzc2VkIGluIHRoZSBjb250ZXh0XG4gICAqIG9mIG91ciBvd24gc3luY2hyb25vdXMgQWN0aXZhdGlvbiBoYW5kbGluZyBldmVudCBsb29wLlxuICAgKlxuICAgKiBPdXIgY29kZSBkb2VzIGEgYmVzdCBlZmZvcnQgdG8gc3RvcCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGFjdGl2YXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgKiBhZnRlciB0aGlzIGZpZWxkIGlzIHNldDpcbiAgICogIC0gSWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoaWxlIGV4ZWN1dGluZyBjb2RlIHN5bmNocm9ub3VzbHkgKGUuZy4gYW55dGhpbmcgYmVmb3JlIHRoZVxuICAgKiAgICBmaXJzdCBgYXdhaXRgIHN0YXRlbWVudCBpbiBhIFdvcmtmbG93IGZ1bmN0aW9uIG9yIGEgc2lnbmFsL3VwZGF0ZSBoYW5kbGVyKSwgdGhlIGVycm9yXG4gICAqICAgIHdpbGwgYmUgX2ltbWVkaWF0ZWx5XyByZXRocm93biwgd2hpY2ggd2lsbCBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBmdXJ0aGVyIGpvYnMgaW4gdGhlXG4gICAqICAgIGN1cnJlbnQgYWN0aXZhdGlvbi4gV2Uga25vdyB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBjb2RlIHN5bmNocm9ub3VzbHkgdGhhbmtzIHRvIHRoZVxuICAgKiAgICBgcmV0aHJvd1N5bmNocm9ub3VzbHlgIGZsYWcgYmVsb3cuXG4gICAqICAtIEl0IGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgbWljcm90YXNrcywgdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBvblxuICAgKiAgICB0aGUgbmV4dCBjYWxsIHRvIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYC5cbiAgICpcbiAgICogVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgZm9yIHVzIHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb24gb2YgbWljcm90YXNrcyB0aGF0IGhhdmVcbiAgICogYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCwgbm9yIHRob3NlIHRoYXQgd2lsbCBiZSByZWN1cnNpdmVseSBzY2hlZHVsZWQgZnJvbSB0aG9zZSBtaWNyb3Rhc2tzLlxuICAgKiBTaG91bGQgbW9yZSBlcnJvcnMgZ2V0IHRocm93biB3aGlsZSBzZXR0bGluZyBtaWNyb3Rhc2tzLCB0aG9zZSB3aWxsIGJlIGlnbm9yZWQgKGkuZS4gb25seVxuICAgKiB0aGUgZmlyc3QgY2FwdHVyZWQgZXJyb3IgaXMgcHJlc2VydmVkKS5cbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvd1Rhc2tFcnJvcjogdW5rbm93bjtcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgd2hlbiBydW5uaW5nIHN5bmNocm9ub3VzIGNvZGUgKGUuZy4gd2hpbGUgcHJvY2Vzc2luZyBhY3RpdmF0aW9uIGpvYnMgYW5kIHdoZW4gY2FsbGluZ1xuICAgKiBgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKWApLiBXaGlsZSB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpcyBzYWZlIHRvIGxldCBlcnJvcnMgYnViYmxlIHVwLlxuICAgKi9cbiAgcHVibGljIHJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJvb3RTY29wZSA9IG5ldyBSb290Q2FuY2VsbGF0aW9uU2NvcGUoKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBxdWVyeSBuYW1lIHRvIGhhbmRsZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBxdWVyeUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlPihbXG4gICAgW1xuICAgICAgU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgUmF3VmFsdWU8c3RyaW5nPihcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhY2tUcmFjZXMoKVxuICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmZvcm1hdHRlZClcbiAgICAgICAgICAgICAgLmpvaW4oJ1xcblxcbicpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGEgc2Vuc2libGUgc3RhY2sgdHJhY2UuJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKTogUmF3VmFsdWUgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc291cmNlTWFwIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHNkazogU3RhY2tUcmFjZVNES0luZm8gPSB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdmVyc2lvbjogcGtnLnZlcnNpb24gfTtcbiAgICAgICAgICBjb25zdCBzdGFja3MgPSB0aGlzLmdldFN0YWNrVHJhY2VzKCkubWFwKCh7IHN0cnVjdHVyZWQ6IGxvY2F0aW9ucyB9KSA9PiAoeyBsb2NhdGlvbnMgfSkpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFN0YWNrVHJhY2VGaWxlU2xpY2VbXT4gPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBsb2NhdGlvbnMgfSBvZiBzdGFja3MpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB7IGZpbGVfcGF0aCB9IG9mIGxvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICghZmlsZV9wYXRoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gc291cmNlTWFwPy5zb3VyY2VzQ29udGVudD8uW3NvdXJjZU1hcD8uc291cmNlcy5pbmRleE9mKGZpbGVfcGF0aCldO1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgc291cmNlc1tmaWxlX3BhdGhdID0gW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsaW5lX29mZnNldDogMCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPEVuaGFuY2VkU3RhY2tUcmFjZT4oeyBzZGssIHN0YWNrcywgc291cmNlcyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGEgc3RhY2sgdHJhY2UgYW5ub3RhdGVkIHdpdGggc291cmNlIGluZm9ybWF0aW9uLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgJ19fdGVtcG9yYWxfd29ya2Zsb3dfbWV0YWRhdGEnLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKTogUmF3VmFsdWUgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtmbG93VHlwZSA9IHRoaXMuaW5mby53b3JrZmxvd1R5cGU7XG4gICAgICAgICAgY29uc3QgcXVlcnlEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5xdWVyeUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgY29uc3Qgc2lnbmFsRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuc2lnbmFsSGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy51cGRhdGVIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmF3VmFsdWU8dGVtcG9yYWwuYXBpLnNkay52MS5JV29ya2Zsb3dNZXRhZGF0YT4oe1xuICAgICAgICAgICAgZGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiB3b3JrZmxvd1R5cGUsXG4gICAgICAgICAgICAgIHF1ZXJ5RGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgIHNpZ25hbERlZmluaXRpb25zLFxuICAgICAgICAgICAgICB1cGRhdGVEZWZpbml0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXJyZW50RGV0YWlsczogdGhpcy5jdXJyZW50RGV0YWlscyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdvcmtmbG93LicsXG4gICAgICB9LFxuICAgIF0sXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBMb2FkZWQgaW4ge0BsaW5rIGluaXRSdW50aW1lfVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVyY2VwdG9yczogUmVxdWlyZWQ8V29ya2Zsb3dJbnRlcmNlcHRvcnM+ID0ge1xuICAgIGluYm91bmQ6IFtdLFxuICAgIG91dGJvdW5kOiBbXSxcbiAgICBpbnRlcm5hbHM6IFtdLFxuICB9O1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgdGhhdCBzdG9yZXMgYWxsIGdlbmVyYXRlZCBjb21tYW5kcywgcmVzZXQgYWZ0ZXIgZWFjaCBhY3RpdmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tbWFuZHM6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZFtdID0gW107XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhbGwge0BsaW5rIGNvbmRpdGlvbn1zIHRoYXQgaGF2ZW4ndCBiZWVuIHVuYmxvY2tlZCB5ZXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9ja2VkQ29uZGl0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBDb25kaXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIElzIHRoaXMgV29ya2Zsb3cgY29tcGxldGVkP1xuICAgKlxuICAgKiBBIFdvcmtmbG93IHdpbGwgYmUgY29uc2lkZXJlZCBjb21wbGV0ZWQgaWYgaXQgZ2VuZXJhdGVzIGEgY29tbWFuZCB0aGF0IHRoZVxuICAgKiBzeXN0ZW0gY29uc2lkZXJzIGFzIGEgZmluYWwgV29ya2Zsb3cgY29tbWFuZCAoZS5nLlxuICAgKiBjb21wbGV0ZVdvcmtmbG93RXhlY3V0aW9uIG9yIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbikuXG4gICAqL1xuICBwdWJsaWMgY29tcGxldGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdhcyB0aGlzIFdvcmtmbG93IGNhbmNlbGxlZD9cbiAgICovXG4gIHByb3RlY3RlZCBjYW5jZWxsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIG5leHQgKGluY3JlbWVudGFsKSBzZXF1ZW5jZSB0byBhc3NpZ24gd2hlbiBnZW5lcmF0aW5nIGNvbXBsZXRhYmxlIGNvbW1hbmRzXG4gICAqL1xuICBwdWJsaWMgbmV4dFNlcXMgPSB7XG4gICAgdGltZXI6IDEsXG4gICAgYWN0aXZpdHk6IDEsXG4gICAgY2hpbGRXb3JrZmxvdzogMSxcbiAgICBzaWduYWxXb3JrZmxvdzogMSxcbiAgICBjYW5jZWxXb3JrZmxvdzogMSxcbiAgICBjb25kaXRpb246IDEsXG4gICAgbmV4dXNPcGVyYXRpb246IDEsXG4gICAgLy8gVXNlZCBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2YgYWN0aXZlIHN0YWNrIHRyYWNlc1xuICAgIHN0YWNrOiAxLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHNldCBldmVyeSB0aW1lIHRoZSB3b3JrZmxvdyBleGVjdXRlcyBhbiBhY3RpdmF0aW9uXG4gICAqIE1heSBiZSBhY2Nlc3NlZCBhbmQgbW9kaWZpZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIG5vdzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgV29ya2Zsb3csIGluaXRpYWxpemVkIHdoZW4gYSBXb3JrZmxvdyBpcyBzdGFydGVkXG4gICAqL1xuICBwdWJsaWMgd29ya2Zsb3c/OiBXb3JrZmxvdyB8IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9uczxhbnlbXSwgYW55PjtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgV29ya2Zsb3dcbiAgICogTWF5IGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgaW5mbzogV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBBIGRldGVybWluaXN0aWMgUk5HLCB1c2VkIGJ5IHRoZSBpc29sYXRlJ3Mgb3ZlcnJpZGRlbiBNYXRoLnJhbmRvbVxuICAgKi9cbiAgcHVibGljIHJhbmRvbTogUk5HO1xuXG4gIHB1YmxpYyBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXI7XG4gIHB1YmxpYyBmYWlsdXJlQ29udmVydGVyOiBGYWlsdXJlQ29udmVydGVyID0gZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI7XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgd2Uga25vdyB0aGUgc3RhdHVzIG9mIGZvciB0aGlzIHdvcmtmbG93LCBhcyBpbiB7QGxpbmsgcGF0Y2hlZH1cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25QcmVzZW50UGF0Y2hlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIHNlbnQgdG8gY29yZSB7QGxpbmsgcGF0Y2hlZH1cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGtub3duRmxhZ3MgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBzZGtWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdWZmZXJlZCBzaW5rIGNhbGxzIHBlciBhY3RpdmF0aW9uXG4gICAqL1xuICBzaW5rQ2FsbHMgPSBBcnJheTxTaW5rQ2FsbD4oKTtcblxuICAvKipcbiAgICogQSBuYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSBmdW5jdGlvbiwgZXh0ZXJuYWxseSBpbmplY3RlZC4gVGhpcyBpcyB1c2VkIHRvXG4gICAqIHByZWNpc2VseSBzb3J0IGxvZ3MgZW50cmllcyBlbWl0dGVkIGZyb20gdGhlIFdvcmtmbG93IENvbnRleHQgdnMgdGhvc2UgZW1pdHRlZFxuICAgKiBmcm9tIG90aGVyIHNvdXJjZXMgKGUuZy4gbWFpbiB0aHJlYWQsIENvcmUsIGV0YykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2V0VGltZU9mRGF5OiAoKSA9PiBiaWdpbnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcblxuICBwdWJsaWMgY3VycmVudERldGFpbHM6IHN0cmluZyA9ICcnO1xuXG4gIHB1YmxpYyB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG4gIHB1YmxpYyB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyPzogKCkgPT4gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucztcblxuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0YWNrVHJhY2VzRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5mbyxcbiAgICBub3csXG4gICAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzLFxuICAgIHNvdXJjZU1hcCxcbiAgICBnZXRUaW1lT2ZEYXksXG4gICAgcmFuZG9tbmVzc1NlZWQsXG4gICAgcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMsXG4gICAgc3RhY2tUcmFjZXNFbmFibGVkLFxuICB9OiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCkge1xuICAgIHRoaXMuZ2V0VGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gICAgdGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMgPSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG4gICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXA7XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHJhbmRvbW5lc3NTZWVkKTtcbiAgICB0aGlzLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzID0gcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXM7XG4gICAgdGhpcy5zdGFja1RyYWNlc0VuYWJsZWQgPSBzdGFja1RyYWNlc0VuYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIG11dGF0ZVdvcmtmbG93SW5mbyhmbjogKGluZm86IFdvcmtmbG93SW5mbykgPT4gV29ya2Zsb3dJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5pbmZvID0gZm4odGhpcy5pbmZvKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTdGFja1RyYWNlcygpOiBTdGFja1tdIHtcbiAgICBpZiAoIXRoaXMuc3RhY2tUcmFjZXNFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHN0YWNrIHRyYWNlcyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyB3b3JrZXInKTtcbiAgICB9XG4gICAgY29uc3QgeyBjaGlsZFRvUGFyZW50LCBwcm9taXNlVG9TdGFjayB9ID0gdGhpcy5wcm9taXNlU3RhY2tTdG9yZTtcbiAgICBjb25zdCBpbnRlcm5hbE5vZGVzID0gWy4uLmNoaWxkVG9QYXJlbnQudmFsdWVzKCldLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgY3Vycikge1xuICAgICAgICBhY2MuYWRkKHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBuZXcgU2V0KCkpO1xuICAgIGNvbnN0IHN0YWNrcyA9IG5ldyBNYXA8c3RyaW5nLCBTdGFjaz4oKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkVG9QYXJlbnQua2V5cygpKSB7XG4gICAgICBpZiAoIWludGVybmFsTm9kZXMuaGFzKGNoaWxkKSkge1xuICAgICAgICBjb25zdCBzdGFjayA9IHByb21pc2VUb1N0YWNrLmdldChjaGlsZCk7XG4gICAgICAgIGlmICghc3RhY2sgfHwgIXN0YWNrLmZvcm1hdHRlZCkgY29udGludWU7XG4gICAgICAgIHN0YWNrcy5zZXQoc3RhY2suZm9ybWF0dGVkLCBzdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vdCAxMDAlIHN1cmUgd2hlcmUgdGhpcyBjb21lcyBmcm9tLCBqdXN0IGZpbHRlciBpdCBvdXRcbiAgICBzdGFja3MuZGVsZXRlKCcgICAgYXQgUHJvbWlzZS50aGVuICg8YW5vbnltb3VzPiknKTtcbiAgICBzdGFja3MuZGVsZXRlKCcgICAgYXQgUHJvbWlzZS50aGVuICg8YW5vbnltb3VzPilcXG4nKTtcbiAgICByZXR1cm4gWy4uLnN0YWNrc10ubWFwKChbXywgc3RhY2tdKSA9PiBzdGFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIGdldEFuZFJlc2V0U2lua0NhbGxzKCk6IFNpbmtDYWxsW10ge1xuICAgIGNvbnN0IHsgc2lua0NhbGxzIH0gPSB0aGlzO1xuICAgIHRoaXMuc2lua0NhbGxzID0gW107XG4gICAgcmV0dXJuIHNpbmtDYWxscztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBXb3JrZmxvdyBjb21tYW5kIHRvIGJlIGNvbGxlY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGFjdGl2YXRpb24uXG4gICAqXG4gICAqIFByZXZlbnRzIGNvbW1hbmRzIGZyb20gYmVpbmcgYWRkZWQgYWZ0ZXIgV29ya2Zsb3cgY29tcGxldGlvbi5cbiAgICovXG4gIHB1c2hDb21tYW5kKGNtZDogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kLCBjb21wbGV0ZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKGNtZCk7XG4gICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICB0aGlzLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uY2x1ZGVBY3RpdmF0aW9uKCk6IEFjdGl2YXRpb25Db21wbGV0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IHRoaXMuY29tbWFuZHMuc3BsaWNlKDApLFxuICAgICAgdXNlZEludGVybmFsRmxhZ3M6IFsuLi50aGlzLmtub3duRmxhZ3NdLFxuICAgICAgdmVyc2lvbmluZ0JlaGF2aW9yOiB0aGlzLnZlcnNpb25pbmdCZWhhdmlvcixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0V29ya2Zsb3dOZXh0SGFuZGxlcih7IGFyZ3MgfTogV29ya2Zsb3dFeGVjdXRlSW5wdXQpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgd29ya2Zsb3cgfSA9IHRoaXM7XG4gICAgaWYgKHdvcmtmbG93ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgdW5pbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgd29ya2Zsb3coLi4uYXJncyk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnRXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsICdleGVjdXRlJywgdGhpcy5zdGFydFdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cbiAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgIGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZygoKSA9PlxuICAgICAgICBleGVjdXRlKHtcbiAgICAgICAgICBoZWFkZXJzOiBhY3RpdmF0aW9uLmhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmFyZ3VtZW50cyksXG4gICAgICAgIH0pXG4gICAgICApLnRoZW4odGhpcy5jb21wbGV0ZVdvcmtmbG93LmJpbmQodGhpcyksIHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRpbnVlZEZhaWx1cmUsIGxhc3RDb21wbGV0aW9uUmVzdWx0LCBtZW1vLCBzZWFyY2hBdHRyaWJ1dGVzIH0gPSBhY3RpdmF0aW9uO1xuXG4gICAgLy8gTW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpbml0aWFsaXphdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgLi4uaW5mbyxcblxuICAgICAgc2VhcmNoQXR0cmlidXRlczogZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcbiAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlczogZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpLFxuXG4gICAgICBtZW1vOiBtYXBGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBtZW1vPy5maWVsZHMpLFxuICAgICAgbGFzdFJlc3VsdDogZnJvbVBheWxvYWRzQXRJbmRleCh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIDAsIGxhc3RDb21wbGV0aW9uUmVzdWx0Py5wYXlsb2FkcyksXG4gICAgICBsYXN0RmFpbHVyZTpcbiAgICAgICAgY29udGludWVkRmFpbHVyZSAhPSBudWxsXG4gICAgICAgICAgPyB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoY29udGludWVkRmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgICBpZiAodGhpcy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyKSB7XG4gICAgICB0aGlzLnZlcnNpb25pbmdCZWhhdmlvciA9IHRoaXMud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcigpLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsV29ya2Zsb3coX2FjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JQ2FuY2VsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5yb290U2NvcGUuY2FuY2VsKCk7XG4gIH1cblxuICBwdWJsaWMgZmlyZVRpbWVyKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRmlyZVRpbWVyKTogdm9pZCB7XG4gICAgLy8gVGltZXJzIGFyZSBhIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVpciBjb21wbGV0aW9uIG1pZ2h0IG5vdCBiZSBpbiBXb3JrZmxvdyBzdGF0ZSxcbiAgICAvLyB0aGlzIGlzIGR1ZSB0byBpbW1lZGlhdGUgdGltZXIgY2FuY2VsbGF0aW9uIHRoYXQgZG9lc24ndCBnbyB3YWl0IGZvciBDb3JlLlxuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ3RpbWVyJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBjb21wbGV0aW9uPy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUFjdGl2aXR5KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUFjdGl2aXR5KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVBY3Rpdml0eSBhY3RpdmF0aW9uIHdpdGggbm8gcmVzdWx0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdhY3Rpdml0eScsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVkID0gYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxldGVkLnJlc3VsdCA/IHRoaXMucGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZChjb21wbGV0ZWQucmVzdWx0KSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBmYWlsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBjYW5jZWxsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpIHtcbiAgICAgIHJlamVjdChuZXcgTG9jYWxBY3Rpdml0eURvQmFja29mZihhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQoXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93U3RhcnQnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnN1Y2NlZWRlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydCB3aXRoIG5vIHJ1bklkJyk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGFjdGl2YXRpb24uc3VjY2VlZGVkLnJ1bklkKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uZmFpbGVkKSB7XG4gICAgICBpZiAoZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UoYWN0aXZhdGlvbi5mYWlsZWQuY2F1c2UpICE9PSAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignR290IHVua25vd24gU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGFjdGl2YXRpb24uc2VxICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgaW4gYWN0aXZhdGlvbiBqb2InKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChcbiAgICAgICAgbmV3IFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcihcbiAgICAgICAgICAnV29ya2Zsb3cgZXhlY3V0aW9uIGFscmVhZHkgc3RhcnRlZCcsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoIWFjdGl2YXRpb24uY2FuY2VsbGVkLmZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IG5vIGZhaWx1cmUgaW4gY2FuY2VsbGVkIHZhcmlhbnQnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uY2FuY2VsbGVkLmZhaWx1cmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQgd2l0aCBubyBzdGF0dXMnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24oYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbik6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbiBhY3RpdmF0aW9uIHdpdGggbm8gcmVzdWx0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93Q29tcGxldGUnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgY2FuY2VsbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuXG4gICAgaWYgKCFhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdW50cmFja1Byb21pc2UoY29tcGxldGVQcm9taXNlKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgcmVzb2x2ZSh7IHRva2VuOiBhY3RpdmF0aW9uLm9wZXJhdGlvblRva2VuISwgcmVzdWx0OiBjb21wbGV0ZVByb21pc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbGVkKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvbihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHNlcSA9IGdldFNlcShhY3RpdmF0aW9uKTtcblxuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY29tcGxldGVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKTtcblxuICAgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIFJlc29sdmVOZXh1c09wZXJhdGlvbiB0byBiZSByZWNlaXZlZCB3aXRob3V0IGEgcHJpb3IgUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQsXG4gICAgICAvLyBlLmcuIGJlY2F1c2UgdGhlIGhhbmRsZXIgY29tcGxldGVkIHRoZSBPcGVyYXRpb24gc3luY2hyb25vdXNseS5cbiAgICAgIGNvbnN0IHN0YXJ0Q29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbignbmV4dXNPcGVyYXRpb25TdGFydCcsIHNlcSk7XG4gICAgICBpZiAoc3RhcnRDb21wbGV0aW9uKSB7XG4gICAgICAgIHN0YXJ0Q29tcGxldGlvbi5yZXNvbHZlKHsgcmVzdWx0OiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uQ29tcGxldGUnLCBzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVycjogRXJyb3I7XG4gICAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmZhaWxlZCkge1xuICAgICAgICBlcnIgPSB0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5jYW5jZWxsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8udGltZWRPdXQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC50aW1lZE91dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRpb24gPVxuICAgICAgICB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpID8/XG4gICAgICAgIHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uQ29tcGxldGUnLCBzZXEpO1xuICAgICAgY29tcGxldGlvbi5yZWplY3QoZXJyISk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW50ZW50aW9uYWxseSBub24tYXN5bmMgZnVuY3Rpb24gc28gdGhpcyBoYW5kbGVyIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgc3RhY2sgdHJhY2VcbiAgcHJvdGVjdGVkIHF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlcih7IHF1ZXJ5TmFtZSwgYXJncyB9OiBRdWVyeUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgbGV0IGZuID0gdGhpcy5xdWVyeUhhbmRsZXJzLmdldChxdWVyeU5hbWUpPy5oYW5kbGVyO1xuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmbiA9IHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgcXVlcnlOYW1lKTtcbiAgICB9XG4gICAgLy8gTm8gaGFuZGxlciBvciBkZWZhdWx0IHJlZ2lzdGVyZWQsIGZhaWwuXG4gICAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGtub3duUXVlcnlUeXBlcyA9IFsuLi50aGlzLnF1ZXJ5SGFuZGxlcnMua2V5cygpXS5qb2luKCcgJyk7XG4gICAgICAvLyBGYWlsIHRoZSBxdWVyeVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgYFdvcmtmbG93IGRpZCBub3QgcmVnaXN0ZXIgYSBoYW5kbGVyIGZvciAke3F1ZXJ5TmFtZX0uIFJlZ2lzdGVyZWQgcXVlcmllczogWyR7a25vd25RdWVyeVR5cGVzfV1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEV4ZWN1dGUgaGFuZGxlci5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4oLi4uYXJncyk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoJ1F1ZXJ5IGhhbmRsZXJzIHNob3VsZCBub3QgcmV0dXJuIGEgUHJvbWlzZScpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBxdWVyeVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUXVlcnlXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgcXVlcnlUeXBlLCBxdWVyeUlkLCBoZWFkZXJzIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghKHF1ZXJ5VHlwZSAmJiBxdWVyeUlkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBxdWVyeSBhY3RpdmF0aW9uIGF0dHJpYnV0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBxdWVyeSBoYXMgX190ZW1wb3JhbF8gcHJlZml4IGJ1dCBubyBoYW5kbGVyIGV4aXN0cywgdGhyb3cgZXJyb3JcbiAgICBpZiAocXVlcnlUeXBlLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJiAhdGhpcy5xdWVyeUhhbmRsZXJzLmhhcyhxdWVyeVR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHF1ZXJ5IG5hbWU6ICcke3F1ZXJ5VHlwZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHF1ZXJ5LlxuICAgIGNvbnN0IGlzSW50ZXJuYWxRdWVyeSA9XG4gICAgICBxdWVyeVR5cGUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHF1ZXJ5VHlwZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsUXVlcnkgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlUXVlcnknLCB0aGlzLnF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIHF1ZXJ5TmFtZTogcXVlcnlUeXBlLFxuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmFyZ3VtZW50cyksXG4gICAgICBxdWVyeUlkLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQsIHJlc3VsdCksXG4gICAgICAocmVhc29uKSA9PiB0aGlzLmZhaWxRdWVyeShxdWVyeUlkLCByZWFzb24pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkb1VwZGF0ZShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlKTogdm9pZCB7XG4gICAgY29uc3QgeyBpZDogdXBkYXRlSWQsIHByb3RvY29sSW5zdGFuY2VJZCwgbmFtZSwgaGVhZGVycywgcnVuVmFsaWRhdG9yIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghdXBkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgaWQnKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFwcm90b2NvbEluc3RhbmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgcHJvdG9jb2xJbnN0YW5jZUlkJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdXBkYXRlIGhhcyBfX3RlbXBvcmFsXyBwcmVmaXggYnV0IG5vIGhhbmRsZXIgZXhpc3RzLCB0aHJvdyBlcnJvclxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJiAhdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgdXBkYXRlIG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCB1cGRhdGUuXG4gICAgY29uc3QgaXNJbnRlcm5hbFVwZGF0ZSA9XG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgbmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fFxuICAgICAgbmFtZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsVXBkYXRlID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuXG4gICAgY29uc3QgZW50cnkgPVxuICAgICAgdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSkgPz9cbiAgICAgICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgbmFtZSksXG4gICAgICAgICAgICB2YWxpZGF0b3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gYSB3YXJuaW5nIHBvbGljeS5cbiAgICAgICAgICAgIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET04sXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmcm9tIGVpdGhlciBzb3VyY2UsIGJ1ZmZlciBhbmQgcmV0dXJuXG4gICAgaWYgKGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRVcGRhdGVzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFrZUlucHV0ID0gKCk6IFVwZGF0ZUlucHV0ID0+ICh7XG4gICAgICB1cGRhdGVJZCxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCksXG4gICAgICBuYW1lLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KTtcblxuICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgdXBob2xkaW5nLCBhbmQgY29uc3RyYWluZWRcbiAgICAvLyBieSwgdGhlIGZvbGxvd2luZyBjb250cmFjdDpcbiAgICAvL1xuICAgIC8vIDEuIElmIG5vIHZhbGlkYXRvciBpcyBwcmVzZW50IHRoZW4gdmFsaWRhdGlvbiBpbnRlcmNlcHRvcnMgd2lsbCBub3QgYmUgcnVuLlxuICAgIC8vXG4gICAgLy8gMi4gRHVyaW5nIHZhbGlkYXRpb24sIGFueSBlcnJvciBtdXN0IGZhaWwgdGhlIFVwZGF0ZTsgZHVyaW5nIHRoZSBVcGRhdGVcbiAgICAvLyAgICBpdHNlbGYsIFRlbXBvcmFsIGVycm9ycyBmYWlsIHRoZSBVcGRhdGUgd2hlcmVhcyBvdGhlciBlcnJvcnMgZmFpbCB0aGVcbiAgICAvLyAgICBhY3RpdmF0aW9uLlxuICAgIC8vXG4gICAgLy8gMy4gVGhlIGhhbmRsZXIgbXVzdCBub3Qgc2VlIGFueSBtdXRhdGlvbnMgb2YgdGhlIGFyZ3VtZW50cyBtYWRlIGJ5IHRoZVxuICAgIC8vICAgIHZhbGlkYXRvci5cbiAgICAvL1xuICAgIC8vIDQuIEFueSBlcnJvciB3aGVuIGRlY29kaW5nL2Rlc2VyaWFsaXppbmcgaW5wdXQgbXVzdCBiZSBjYXVnaHQgYW5kIHJlc3VsdFxuICAgIC8vICAgIGluIHJlamVjdGlvbiBvZiB0aGUgVXBkYXRlIGJlZm9yZSBpdCBpcyBhY2NlcHRlZCwgZXZlbiBpZiB0aGVyZSBpcyBub1xuICAgIC8vICAgIHZhbGlkYXRvci5cbiAgICAvL1xuICAgIC8vIDUuIFRoZSBpbml0aWFsIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgdGhlIChhc3luYykgVXBkYXRlIGhhbmRsZXIgc2hvdWxkXG4gICAgLy8gICAgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIChzeW5jKSB2YWxpZGF0b3IgY29tcGxldGVzIHN1Y2ggdGhhdCB0aGVyZSBpc1xuICAgIC8vICAgIG1pbmltYWwgb3Bwb3J0dW5pdHkgZm9yIGEgZGlmZmVyZW50IGNvbmN1cnJlbnQgdGFzayB0byBiZSBzY2hlZHVsZWRcbiAgICAvLyAgICBiZXR3ZWVuIHRoZW0uXG4gICAgLy9cbiAgICAvLyA2LiBUaGUgc3RhY2sgdHJhY2UgdmlldyBwcm92aWRlZCBpbiB0aGUgVGVtcG9yYWwgVUkgbXVzdCBub3QgYmUgcG9sbHV0ZWRcbiAgICAvLyAgICBieSBwcm9taXNlcyB0aGF0IGRvIG5vdCBkZXJpdmUgZnJvbSB1c2VyIGNvZGUuIFRoaXMgaW1wbGllcyB0aGF0XG4gICAgLy8gICAgYXN5bmMvYXdhaXQgc3ludGF4IG1heSBub3QgYmUgdXNlZC5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGRlbGliZXJhdGVseSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gYmVsb3cuXG4gICAgLy8gVGhlc2UgYXJlIGNhdWdodCBlbHNld2hlcmUgYW5kIGZhaWwgdGhlIGNvcnJlc3BvbmRpbmcgYWN0aXZhdGlvbi5cbiAgICBjb25zdCBkb1VwZGF0ZUltcGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgaW5wdXQ6IFVwZGF0ZUlucHV0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJ1blZhbGlkYXRvciAmJiBlbnRyeS52YWxpZGF0b3IpIHtcbiAgICAgICAgICAvLyBUZW1wb3JhcmlseSBtYXJrIGFzIG5vdCByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMgZHVyaW5nIHZhbGlkYXRvciBleGVjdXRpb25cbiAgICAgICAgICAvLyBzbyB0aGF0IGxvZ2dpbmcgaXMgcGVybWl0dGVkLiBWYWxpZGF0b3JzIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zLlxuICAgICAgICAgIGNvbnN0IHdhc1JlcGxheWluZ0hpc3RvcnlFdmVudHMgPSB0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cztcbiAgICAgICAgICB0aGlzLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbykgPT4gKHtcbiAgICAgICAgICAgIC4uLmluZm8sXG4gICAgICAgICAgICB1bnNhZmU6IHsgLi4uaW5mby51bnNhZmUsIGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogZmFsc2UgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgICAgICAgaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgICAndmFsaWRhdGVVcGRhdGUnLFxuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVXBkYXRlTmV4dEhhbmRsZXIuYmluZCh0aGlzLCBlbnRyeS52YWxpZGF0b3IpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdmFsaWRhdGUobWFrZUlucHV0KCkpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbykgPT4gKHtcbiAgICAgICAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgICAgICAgdW5zYWZlOiB7IC4uLmluZm8udW5zYWZlLCBpc1JlcGxheWluZ0hpc3RvcnlFdmVudHM6IHdhc1JlcGxheWluZ0hpc3RvcnlFdmVudHMgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBtYWtlSW5wdXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQpO1xuICAgICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGludGVyY2VwdG9ycyxcbiAgICAgICAgJ2hhbmRsZVVwZGF0ZScsXG4gICAgICAgIHRoaXMudXBkYXRlTmV4dEhhbmRsZXIuYmluZCh0aGlzLCBlbnRyeS5oYW5kbGVyKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgdW5maW5pc2hlZFBvbGljeSB9ID0gZW50cnk7XG4gICAgICB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnNldCh1cGRhdGVJZCwgeyBuYW1lLCB1bmZpbmlzaGVkUG9saWN5LCBpZDogdXBkYXRlSWQgfSk7XG4gICAgICBjb25zdCByZXMgPSBleGVjdXRlKGlucHV0KVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB0aGlzLmNvbXBsZXRlVXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgcmVzdWx0KSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgICAgICAgICAgdGhpcy5yZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuZGVsZXRlKHVwZGF0ZUlkKSk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShyZXMpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIHVudHJhY2tQcm9taXNlKFVwZGF0ZVNjb3BlLnVwZGF0ZVdpdGhJbmZvKHVwZGF0ZUlkLCBuYW1lLCBkb1VwZGF0ZUltcGwpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVOZXh0SGFuZGxlcihoYW5kbGVyOiBXb3JrZmxvd1VwZGF0ZVR5cGUsIHsgYXJncyB9OiBVcGRhdGVJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVXBkYXRlTmV4dEhhbmRsZXIodmFsaWRhdG9yOiBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUgfCB1bmRlZmluZWQsIHsgYXJncyB9OiBVcGRhdGVJbnB1dCk6IHZvaWQge1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIHZhbGlkYXRvciguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcGF0Y2hCdWZmZXJlZFVwZGF0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyZWRVcGRhdGVzID0gdGhpcy5idWZmZXJlZFVwZGF0ZXM7XG4gICAgd2hpbGUgKGJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBkZWZhdWx0IHVwZGF0ZSBoYW5kbGVyLCBzbyBhbGwgdXBkYXRlcyBhcmUgZGlzcGF0Y2hhYmxlLlxuICAgICAgaWYgKHRoaXMuZGVmYXVsdFVwZGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gYnVmZmVyZWRVcGRhdGVzLnNoaWZ0KCk7XG4gICAgICAgIC8vIExvZ2ljYWxseSwgdGhpcyBtdXN0IGJlIGRlZmluZWQgYXMgd2UncmUgaW4gdGhlIGxvb3AuXG4gICAgICAgIC8vIEJ1dCBUeXBlc2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IHNvIHdlIHVzZSBhIG5vbi1udWxsIGFzc2VydGlvbiAoISkuXG4gICAgICAgIHRoaXMuZG9VcGRhdGUodXBkYXRlISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRVcGRhdGVzLmZpbmRJbmRleCgodXBkYXRlKSA9PiB0aGlzLnVwZGF0ZUhhbmRsZXJzLmhhcyh1cGRhdGUubmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgLy8gTm8gYnVmZmVyZWQgVXBkYXRlcyBoYXZlIGEgaGFuZGxlciB5ZXQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3VwZGF0ZV0gPSBidWZmZXJlZFVwZGF0ZXMuc3BsaWNlKGZvdW5kSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmRvVXBkYXRlKHVwZGF0ZSEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3RCdWZmZXJlZFVwZGF0ZXMoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyZWRVcGRhdGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdXBkYXRlID0gdGhpcy5idWZmZXJlZFVwZGF0ZXMuc2hpZnQoKTtcbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5yZWplY3RVcGRhdGUoXG4gICAgICAgICAgdXBkYXRlLnByb3RvY29sSW5zdGFuY2VJZCEsXG4gICAgICAgICAgQXBwbGljYXRpb25GYWlsdXJlLm5vblJldHJ5YWJsZShgTm8gcmVnaXN0ZXJlZCBoYW5kbGVyIGZvciB1cGRhdGU6ICR7dXBkYXRlLm5hbWV9YClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlcih7IHNpZ25hbE5hbWUsIGFyZ3MgfTogU2lnbmFsSW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuc2lnbmFsSGFuZGxlcnMuZ2V0KHNpZ25hbE5hbWUpPy5oYW5kbGVyO1xuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIoc2lnbmFsTmFtZSwgLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcihgTm8gcmVnaXN0ZXJlZCBzaWduYWwgaGFuZGxlciBmb3Igc2lnbmFsOiAke3NpZ25hbE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNpZ25hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNpZ25hbE5hbWUsIGhlYWRlcnMgfSA9IGFjdGl2YXRpb247XG4gICAgaWYgKCFzaWduYWxOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gc2lnbmFsTmFtZScpO1xuICAgIH1cblxuICAgIC8vIElmIHNpZ25hbCBoYXMgX190ZW1wb3JhbF8gcHJlZml4IGJ1dCBubyBoYW5kbGVyIGV4aXN0cywgdGhyb3cgZXJyb3JcbiAgICBpZiAoc2lnbmFsTmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgQ2Fubm90IHVzZSBzaWduYWwgbmFtZTogJyR7c2lnbmFsTmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNraXAgaW50ZXJjZXB0b3JzIGlmIGl0J3MgYW4gaW50ZXJuYWwgc2lnbmFsLlxuICAgIGNvbnN0IGlzSW50ZXJuYWxTaWduYWwgPVxuICAgICAgc2lnbmFsTmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgfHxcbiAgICAgIHNpZ25hbE5hbWUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHNpZ25hbE5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFNpZ25hbCA/IFtdIDogdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZDtcblxuICAgIGlmICghdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiYgIXRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRTaWduYWxzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyIHRoZW4gdGhlIHVuZmluaXNoZWRcbiAgICAvLyBwb2xpY3kgaXMgV0FSTl9BTkRfQUJBTkRPTjsgdXNlcnMgY3VycmVudGx5IGhhdmUgbm8gd2F5IHRvIHNpbGVuY2UgYW55XG4gICAgLy8gZW5zdWluZyB3YXJuaW5ncy5cbiAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID1cbiAgICAgIHRoaXMuc2lnbmFsSGFuZGxlcnMuZ2V0KHNpZ25hbE5hbWUpPy51bmZpbmlzaGVkUG9saWN5ID8/IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET047XG5cbiAgICBjb25zdCBzaWduYWxFeGVjdXRpb25OdW0gPSB0aGlzLnNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXErKztcbiAgICB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnNldChzaWduYWxFeGVjdXRpb25OdW0sIHsgbmFtZTogc2lnbmFsTmFtZSwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcnMsICdoYW5kbGVTaWduYWwnLCB0aGlzLnNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQpLFxuICAgICAgc2lnbmFsTmFtZSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSlcbiAgICAgIC5jYXRjaCh0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZS5iaW5kKHRoaXMpKVxuICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5pblByb2dyZXNzU2lnbmFscy5kZWxldGUoc2lnbmFsRXhlY3V0aW9uTnVtKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyZWRTaWduYWxzID0gdGhpcy5idWZmZXJlZFNpZ25hbHM7XG4gICAgd2hpbGUgKGJ1ZmZlcmVkU2lnbmFscy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyLCBzbyBhbGwgc2lnbmFscyBhcmUgZGlzcGF0Y2hhYmxlXG5cbiAgICAgICAgdGhpcy5zaWduYWxXb3JrZmxvdyhidWZmZXJlZFNpZ25hbHMuc2hpZnQoKSEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGJ1ZmZlcmVkU2lnbmFscy5maW5kSW5kZXgoKHNpZ25hbCkgPT4gdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsLnNpZ25hbE5hbWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IFtzaWduYWxdID0gYnVmZmVyZWRTaWduYWxzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5zaWduYWxXb3JrZmxvdyhzaWduYWwhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVNpZ25hbEV4dGVybmFsV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlU2lnbmFsRXh0ZXJuYWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdzaWduYWxXb3JrZmxvdycsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uZmFpbHVyZSkge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5mYWlsdXJlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjYW5jZWxXb3JrZmxvdycsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uZmFpbHVyZSkge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5mYWlsdXJlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2FybklmVW5maW5pc2hlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yKSByZXR1cm47XG5cbiAgICBjb25zdCBnZXRXYXJuYWJsZSA9IChoYW5kbGVyRXhlY3V0aW9uczogSXRlcmFibGU8TWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KTogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSA9PiB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShoYW5kbGVyRXhlY3V0aW9ucykuZmlsdGVyKFxuICAgICAgICAoZXgpID0+IGV4LnVuZmluaXNoZWRQb2xpY3kgPT09IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET05cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdhcm5hYmxlVXBkYXRlcyA9IGdldFdhcm5hYmxlKHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMudmFsdWVzKCkpO1xuICAgIGlmICh3YXJuYWJsZVVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLndhcm4obWFrZVVuZmluaXNoZWRVcGRhdGVIYW5kbGVyTWVzc2FnZSh3YXJuYWJsZVVwZGF0ZXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuYWJsZVNpZ25hbHMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVTaWduYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2Uod2FybmFibGVTaWduYWxzKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJhbmRvbVNlZWQoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklVcGRhdGVSYW5kb21TZWVkKTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJhbmRvbW5lc3NTZWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhY3RpdmF0aW9uIHdpdGggcmFuZG9tbmVzc1NlZWQgYXR0cmlidXRlJyk7XG4gICAgfVxuICAgIHRoaXMucmFuZG9tID0gYWxlYShhY3RpdmF0aW9uLnJhbmRvbW5lc3NTZWVkLnRvQnl0ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgbm90aWZ5SGFzUGF0Y2goYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklOb3RpZnlIYXNQYXRjaCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZylcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignVW5leHBlY3RlZCBub3RpZnlIYXNQYXRjaCBqb2Igb24gbm9uLXJlcGxheSBhY3RpdmF0aW9uJyk7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnBhdGNoSWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdGlmeUhhc1BhdGNoIG1pc3NpbmcgcGF0Y2ggaWQnKTtcbiAgICB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuYWRkKGFjdGl2YXRpb24ucGF0Y2hJZCk7XG4gIH1cblxuICBwdWJsaWMgcGF0Y2hJbnRlcm5hbChwYXRjaElkOiBzdHJpbmcsIGRlcHJlY2F0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53b3JrZmxvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1BhdGNoZXMgY2Fubm90IGJlIHVzZWQgYmVmb3JlIFdvcmtmbG93IHN0YXJ0cycpO1xuICAgIH1cbiAgICBjb25zdCB1c2VQYXRjaCA9ICF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nIHx8IHRoaXMua25vd25QcmVzZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCk7XG4gICAgLy8gQXZvaWQgc2VuZGluZyBjb21tYW5kcyBmb3IgcGF0Y2hlcyBjb3JlIGFscmVhZHkga25vd3MgYWJvdXQuXG4gICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gZW5hYmxlcyBkZXZlbG9wbWVudCBvZiBhdXRvbWF0aWMgcGF0Y2hpbmcgdG9vbHMuXG4gICAgaWYgKHVzZVBhdGNoICYmICF0aGlzLnNlbnRQYXRjaGVzLmhhcyhwYXRjaElkKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICAgIHNldFBhdGNoTWFya2VyOiB7IHBhdGNoSWQsIGRlcHJlY2F0ZWQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZW50UGF0Y2hlcy5hZGQocGF0Y2hJZCk7XG4gICAgfVxuICAgIHJldHVybiB1c2VQYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZWFybHkgd2hpbGUgaGFuZGxpbmcgYW4gYWN0aXZhdGlvbiB0byByZWdpc3RlciBrbm93biBmbGFncy5cbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBhZGRLbm93bkZsYWdzKGZsYWdzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBmbGFncykge1xuICAgICAgYXNzZXJ0VmFsaWRGbGFnKGZsYWcpO1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gU0RLIEZsYWcgbWF5IGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogU0RLIGZsYWdzIHBsYXkgYSByb2xlIHNpbWlsYXIgdG8gdGhlIGBwYXRjaGVkKClgIEFQSSwgYnV0IGFyZSBtZWFudCBmb3IgaW50ZXJuYWwgdXNhZ2UgYnkgdGhlXG4gICAqIFNESyBpdHNlbGYuIFRoZXkgbWFrZSBpdCBwb3NzaWJsZSBmb3IgdGhlIFNESyB0byBldm9sdmUgaXRzIGJlaGF2aW9ycyBvdmVyIHRpbWUsIHdoaWxlIHN0aWxsXG4gICAqIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBXb3JrZmxvdyBoaXN0b3JpZXMgcHJvZHVjZWQgYnkgb2xkZXIgU0RLcywgd2l0aG91dCBjYXVzaW5nXG4gICAqIGRldGVybWluaXNtIHZpb2xhdGlvbnMuXG4gICAqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgaGFzRmxhZyhmbGFnOiBTZGtGbGFnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMua25vd25GbGFncy5oYXMoZmxhZy5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gSWYgbm90IHJlcGxheWluZywgZW5hYmxlIHRoZSBmbGFnIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgZW5hYmxlZCBieSBkZWZhdWx0LiBTZXR0aW5nIGFcbiAgICAvLyBmbGFnJ3MgZGVmYXVsdCB0byBmYWxzZSBhbGxvd3MgcHJvZ3Jlc3NpdmUgcm9sbG91dCBvZiBuZXcgZmVhdHVyZSBmbGFncywgd2l0aCB0aGUgcG9zc2liaWxpdHlcbiAgICAvLyBvZiByZXZlcnRpbmcgYmFjayB0byBhIHZlcnNpb24gb2YgdGhlIFNESyB3aGVyZSB0aGUgZmxhZyBpcyBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgLy8gSXQgaXMgYWxzbyB1c2VmdWwgZm9yIHRlc3RpbmcgcHVycG9zZS5cbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgZmxhZy5kZWZhdWx0KSB7XG4gICAgICB0aGlzLmtub3duRmxhZ3MuYWRkKGZsYWcuaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiByZXBsYXlpbmcsIGEgZmxhZyBpcyBjb25zaWRlcmVkIGVuYWJsZWQgaWYgaXQgd2FzIGVuYWJsZWQgZHVyaW5nIHRoZSBvcmlnaW5hbCBleGVjdXRpb24gb2ZcbiAgICAvLyB0aGF0IFdvcmtmbG93IFRhc2s7IHRoaXMgaXMgbm9ybWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGZsYWcgSUQgaW4gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBXRlQgQ29tcGxldGVkJ3MgYHNka01ldGFkYXRhLmxhbmdVc2VkRmxhZ3NgLlxuICAgIC8vXG4gICAgLy8gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWcgc2hvdWxkXG4gICAgLy8gYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXRlQ7IGUuZy4gYnkgbG9va2luZyBhdCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHRoYXRcbiAgICAvLyBlbWl0dGVkIGEgV0ZULiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXRyb2FjdGl2ZWx5IHR1cm4gb24gc29tZSBmbGFncyBmb3IgV0ZUIGVtaXR0ZWRcbiAgICAvLyBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLiBBbHQgQ29uZGl0aW9ucyBzaG91bGQgb25seSBiZSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgY29uZGl0aW9ucyBhcmUgb25seSBldmFsdWF0ZWQgd2hpbGUgcmVwbGF5aW5nLiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdFxuICAgIC8vIGNhdXNlIHRoZSBmbGFnIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgXCJ1c2VkIGZsYWdzXCIgc2V0LCB3aGljaCBtZWFucyB0aGF0IGZ1cnRoZXIgV29ya2Zsb3cgVGFza3NcbiAgICAvLyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZSBjb25kaXRpb24gbm8gbG9uZ2VyIGhvbGRzLiBUaGlzIGlzIHNvIHRvIGF2b2lkIGluY29ycmVjdFxuICAgIC8vIGJlaGF2aW9ycyBpbiBjYXNlIHdoZXJlIGEgV29ya2Zsb3cgRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluXG4gICAgLy8gdGhyb3VnaCBhbiBvbGRlciBvbmUuXG4gICAgaWYgKHRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZCBvZiBmbGFnLmFsdGVybmF0aXZlQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoY29uZCh7IGluZm86IHRoaXMuaW5mbywgc2RrVmVyc2lvbjogdGhpcy5zZGtWZXJzaW9uIH0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRnJvbUNhY2hlKCk6IHZvaWQge1xuICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcigncmVtb3ZlRnJvbUNhY2hlIGFjdGl2YXRpb24gam9iIHNob3VsZCBub3QgcmVhY2ggd29ya2Zsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGZhaWx1cmVzIGludG8gYSBjb21tYW5kIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci5cbiAgICogVXNlZCB0byBoYW5kbGUgYW55IGZhaWx1cmUgZW1pdHRlZCBieSB0aGUgV29ya2Zsb3cuXG4gICAqL1xuICBoYW5kbGVXb3JrZmxvd0ZhaWx1cmUoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQgJiYgaXNDYW5jZWxsYXRpb24oZXJyb3IpKSB7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKHsgY2FuY2VsV29ya2Zsb3dFeGVjdXRpb246IHt9IH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250aW51ZUFzTmV3KSB7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKHsgY29udGludWVBc05ld1dvcmtmbG93RXhlY3V0aW9uOiBlcnJvci5jb21tYW5kIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93LiBXZSBkbyBub3Qgd2FudCB0byBpc3N1ZSB1bmZpbmlzaGVkSGFuZGxlcnMgd2FybmluZ3MuIFRvIGFjaGlldmUgdGhhdCwgd2VcbiAgICAgIC8vIG1hcmsgYWxsIGhhbmRsZXJzIGFzIGNvbXBsZXRlZCBub3cuXG4gICAgICB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmNsZWFyKCk7XG4gICAgICB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmNsZWFyKCk7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgZmFpbFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICBmYWlsdXJlOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVycm9yKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY29yZFdvcmtmbG93VGFza0Vycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICByZWNvcmRXb3JrZmxvd1Rhc2tFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIE9ubHkga2VlcCB0aGUgZmlyc3QgZXJyb3IgdGhhdCBidWJibGVzIHVwOyBzdWJzZXF1ZW50IGVycm9ycyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgaWYgKHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPT09IHVuZGVmaW5lZCkgdGhpcy53b3JrZmxvd1Rhc2tFcnJvciA9IGVycm9yO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgcmV0aHJvdyB0aGUgZXJyb3IgaWYgd2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIHNvIChpLmUuIHdlIGFyZSBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIG1pY3JvdGFza3MpLiBPdGhlcndpc2UsIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIHdoZW5ldmVyIHdlIGdldCBhbiBvcHBvcnR1bml0eSB0byBkbyBzbyxcbiAgICAvLyBlLmcuIHRoZSBuZXh0IHRpbWUgYHRyeVVuYmxvY2tDb25kaXRpb25zKClgIGlzIGNhbGxlZC5cbiAgICBpZiAodGhpcy5yZXRocm93U3luY2hyb25vdXNseSkgdGhpcy5tYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgV29ya2Zsb3cgVGFzayBlcnJvciB3YXMgY2FwdHVyZWQsIGFuZCB3ZSBhcmUgcnVubmluZyBpbiBzeW5jaHJvbm91cyBtb2RlLFxuICAgKiB0aGVuIGJ1YmJsZSBpdCB1cCBub3cuIFRoaXMgaXMgc2FmZSB0byBjYWxsIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZXJyb3IgdG8gcmV0aHJvdy5cbiAgICovXG4gIG1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yKSB0aHJvdyB0aGlzLndvcmtmbG93VGFza0Vycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICByZXNwb25kVG9RdWVyeTogeyBxdWVyeUlkLCBzdWNjZWVkZWQ6IHsgcmVzcG9uc2U6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0KSB9IH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZhaWxRdWVyeShxdWVyeUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICByZXNwb25kVG9RdWVyeToge1xuICAgICAgICBxdWVyeUlkLFxuICAgICAgICBmYWlsZWQ6IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycm9yKSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHsgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBhY2NlcHRlZDoge30gfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBjb21wbGV0ZWQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0KSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZToge1xuICAgICAgICBwcm90b2NvbEluc3RhbmNlSWQsXG4gICAgICAgIHJlamVjdGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUgKi9cbiAgcHJpdmF0ZSBtYXliZUNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZ2V0KHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZGVsZXRlKHRhc2tTZXEpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbiBhcyBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlLCB0aHJvd3MgaWYgaXQgZG9lc24ndCAqL1xuICBwcml2YXRlIGNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbih0eXBlLCB0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIGNvbXBsZXRpb24gZm9yIHRhc2tTZXEgJHt0YXNrU2VxfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVXb3JrZmxvdyhyZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKFxuICAgICAge1xuICAgICAgICBjb21wbGV0ZVdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgcmVzdWx0OiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24pOiBQcm90b0ZhaWx1cmUge1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZXJyb3JUb0ZhaWx1cmUoZXJyLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIpO1xuICB9XG5cbiAgZmFpbHVyZVRvRXJyb3IoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZXE8VCBleHRlbmRzIHsgc2VxPzogbnVtYmVyIHwgbnVsbCB9PihhY3RpdmF0aW9uOiBUKTogbnVtYmVyIHtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdGlvbi5zZXE7XG4gIGlmIChzZXEgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEdvdCBhY3RpdmF0aW9uIHdpdGggbm8gc2VxIGF0dHJpYnV0ZWApO1xuICB9XG4gIHJldHVybiBzZXE7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYW4gdXBkYXRlIGhhbmRsZXIgd2FzIHN0aWxsIHJ1bm5pbmcuIFRoaXMgbWF5IGhhdmUgaW50ZXJydXB0ZWQgd29yayB0aGF0IHRoZVxudXBkYXRlIGhhbmRsZXIgd2FzIGRvaW5nLCBhbmQgdGhlIGNsaWVudCB0aGF0IHNlbnQgdGhlIHVwZGF0ZSB3aWxsIHJlY2VpdmUgYSAnd29ya2Zsb3cgZXhlY3V0aW9uXG5hbHJlYWR5IGNvbXBsZXRlZCcgUlBDRXJyb3IgaW5zdGVhZCBvZiB0aGUgdXBkYXRlIHJlc3VsdC4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWxcbmhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nIFxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC5cbkFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGUgY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVyc1xud2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsIGFuZCBjYXVzaW5nIGNsaWVudHMgdG8gcmVjZWl2ZSBlcnJvcnMsIHRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieVxucGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVVwZGF0ZSwgbXlVcGRhdGVIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnICcpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyB1cGRhdGVzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBoYW5kbGVyRXhlY3V0aW9ucy5tYXAoKGV4KSA9PiAoeyBuYW1lOiBleC5uYW1lLCBpZDogZXguaWQgfSkpXG4gICl9YDtcbn1cblxuZnVuY3Rpb24gbWFrZVVuZmluaXNoZWRTaWduYWxIYW5kbGVyTWVzc2FnZShoYW5kbGVyRXhlY3V0aW9uczogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgXG5bVE1QUkwxMTAyXSBXb3JrZmxvdyBmaW5pc2hlZCB3aGlsZSBhIHNpZ25hbCBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnNpZ25hbCBoYW5kbGVyIHdhcyBkb2luZy4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWwgaGFuZGxlcnMgdG8gY29tcGxldGUgYnkgdXNpbmdcblxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC4gQWx0ZXJuYXRpdmVseSwgaWYgYm90aCB5b3UgYW5kIHRoZVxuY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVycyB3aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcyxcbnRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieSBwYXNzaW5nIGFuIG9wdGlvbiB3aGVuIHNldHRpbmcgdGhlIGhhbmRsZXI6XG5cXGB3b3JrZmxvdy5zZXRIYW5kbGVyKG15U2lnbmFsLCBteVNpZ25hbEhhbmRsZXIsIHt1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5BQkFORE9OfSk7XFxgLmBcblxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGV4IG9mIGhhbmRsZXJFeGVjdXRpb25zKSB7XG4gICAgY29uc3QgY291bnQgPSBuYW1lcy5nZXQoZXgubmFtZSkgfHwgMDtcbiAgICBuYW1lcy5zZXQoZXgubmFtZSwgY291bnQgKyAxKTtcbiAgfVxuXG4gIHJldHVybiBgJHttZXNzYWdlfSBUaGUgZm9sbG93aW5nIHNpZ25hbHMgd2VyZSB1bmZpbmlzaGVkIChhbmQgd2FybmluZ3Mgd2VyZSBub3QgZGlzYWJsZWQgZm9yIHRoZWlyIGhhbmRsZXIpOiAke0pTT04uc3RyaW5naWZ5KFxuICAgIEFycmF5LmZyb20obmFtZXMuZW50cmllcygpKS5tYXAoKFtuYW1lLCBjb3VudF0pID0+ICh7IG5hbWUsIGNvdW50IH0pKVxuICApfWA7XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgU2RrQ29tcG9uZW50IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IHR5cGUgU2luaywgdHlwZSBTaW5rcywgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBXb3JrZmxvd0luZm8sIENvbnRpbnVlQXNOZXcgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGN1cnJlbnRVcGRhdGVJbmZvLCBpbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vd29ya2Zsb3cnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TG9nZ2VyIGV4dGVuZHMgU2luayB7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKlxuICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgZXh0ZW5kcyBTaW5rcyB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICAgKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gICAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAgICovXG4gIGRlZmF1bHRXb3JrZXJMb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NJbnRlcm5hbCBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9sb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG5jb25zdCBsb2dnZXJTaW5rID0gcHJveHlTaW5rczxMb2dnZXJTaW5rc0ludGVybmFsPigpLl9fdGVtcG9yYWxfbG9nZ2VyO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGJ5IHRoZSBTREsgbG9nZ2VyIHRvIGV4dHJhY3QgYSB0aW1lc3RhbXAgZnJvbSBsb2cgYXR0cmlidXRlcy5cbiAqIEFsc28gZGVmaW5lZCBpbiBgd29ya2VyL2xvZ2dlci50c2AgLSBpbnRlbnRpb25hbGx5IG5vdCBzaGFyZWQuXG4gKi9cbmNvbnN0IExvZ1RpbWVzdGFtcCA9IFN5bWJvbC5mb3IoJ2xvZ190aW1lc3RhbXAnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHdvcmtmbG93IGxvZ2dlci5cbiAqXG4gKiBUaGlzIGxvZ2dlciBpcyByZXBsYXktYXdhcmUgYW5kIHdpbGwgb21pdCBsb2cgbWVzc2FnZXMgb24gd29ya2Zsb3cgcmVwbGF5LiBNZXNzYWdlcyBlbWl0dGVkIGJ5IHRoaXMgbG9nZ2VyIGFyZVxuICogZnVubmVsbGVkIHRocm91Z2ggYSBzaW5rIHRoYXQgZm9yd2FyZHMgdGhlbSB0byB0aGUgbG9nZ2VyIHJlZ2lzdGVyZWQgb24ge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfS5cbiAqXG4gKiBBdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgRXhlY3V0aW9uIGNvbnRleHQgYXJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYXMgbWV0YWRhdGEgb24gZXZlcnkgbG9nXG4gKiBlbnRyaWVzLiBBbiBleHRyYSBgc2RrQ29tcG9uZW50YCBtZXRhZGF0YSBhdHRyaWJ1dGUgaXMgYWxzbyBhZGRlZCwgd2l0aCB2YWx1ZSBgd29ya2Zsb3dgOyB0aGlzIGNhbiBiZSB1c2VkIGZvclxuICogZmluZS1ncmFpbmVkIGZpbHRlcmluZyBvZiBsb2cgZW50cmllcyBmdXJ0aGVyIGRvd25zdHJlYW0uXG4gKlxuICogVG8gY3VzdG9taXplIGxvZyBhdHRyaWJ1dGVzLCByZWdpc3RlciBhIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvcn0gdGhhdCBpbnRlcmNlcHRzIHRoZVxuICogYGdldExvZ0F0dHJpYnV0ZXMoKWAgbWV0aG9kLlxuICpcbiAqIE5vdGljZSB0aGF0IHNpbmNlIHNpbmtzIGFyZSB1c2VkIHRvIHBvd2VyIHRoaXMgbG9nZ2VyLCBhbnkgbG9nIGF0dHJpYnV0ZXMgbXVzdCBiZSB0cmFuc2ZlcmFibGUgdmlhIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfVxuICogQVBJLlxuICpcbiAqIE5PVEU6IFNwZWNpZnlpbmcgYSBjdXN0b20gbG9nZ2VyIHRocm91Z2gge0BsaW5rIGRlZmF1bHRTaW5rfSBvciBieSBtYW51YWxseSByZWdpc3RlcmluZyBhIHNpbmsgbmFtZWRcbiAqIGBkZWZhdWx0V29ya2VyTG9nZ2VyYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZzogV29ya2Zsb3dMb2dnZXIgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIChbJ3RyYWNlJywgJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddIGFzIEFycmF5PGtleW9mIFdvcmtmbG93TG9nZ2VyPikubWFwKChsZXZlbCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBsZXZlbCxcbiAgICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmxvZyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgICAgICBjb25zdCBnZXRMb2dBdHRyaWJ1dGVzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TG9nQXR0cmlidXRlcycsIChhKSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGxvZ2dlclNpbmtbbGV2ZWxdIShtZXNzYWdlLCB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBjYWxsIHRpbWUgaW4gbmFub3NlY29uZCByZXNvbHV0aW9uIGFzIGV4cGVjdGVkIGJ5IHRoZSB3b3JrZXIgbG9nZ2VyLlxuICAgICAgICAgIFtMb2dUaW1lc3RhbXBdOiBhY3RpdmF0b3IuZ2V0VGltZU9mRGF5KCksXG4gICAgICAgICAgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2Zsb3csXG4gICAgICAgICAgLi4uZ2V0TG9nQXR0cmlidXRlcyh3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoYWN0aXZhdG9yLmluZm8pKSxcbiAgICAgICAgICAuLi5hdHRycyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIF07XG4gIH0pXG4pIGFzIGFueTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZyhmbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICBsb2cuZGVidWcoJ1dvcmtmbG93IHN0YXJ0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgY29uc3QgcCA9IGZuKCkudGhlbihcbiAgICAocmVzKSA9PiB7XG4gICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgLy8gQXZvaWQgdXNpbmcgaW5zdGFuY2VvZiBjaGVja3MgaW4gY2FzZSB0aGUgbW9kdWxlcyB0aGV5J3JlIGRlZmluZWQgaW4gbG9hZGVkIG1vcmUgdGhhbiBvbmNlLFxuICAgICAgLy8gZS5nLiBieSBqZXN0IG9yIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgYXJlIGluc3RhbGxlZC5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkIGFzIGNhbmNlbGxlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29udGludWVkIGFzIG5ldycsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2cud2FybignV29ya2Zsb3cgZmFpbGVkJywgeyBlcnJvciwgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICApO1xuICAvLyBBdm9pZCBzaG93aW5nIHRoaXMgaW50ZXJjZXB0b3IgaW4gc3RhY2sgdHJhY2UgcXVlcnlcbiAgdW50cmFja1Byb21pc2UocCk7XG4gIHJldHVybiBwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYXR0cmlidXRlcyB0byBiZSBzZXQgX2J5IGRlZmF1bHRfIG9uIGxvZyBtZXNzYWdlcyBmb3IgYSBnaXZlbiBXb3JrZmxvdy5cbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBXb3JrZmxvdyBjb250ZXh0IChlZy4gYnkgdGhlIHdvcmtlciBpdHNlbGYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGluZm86IFdvcmtmbG93SW5mbyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgYXR0cmlidXRlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHRhc2tRdWV1ZTogaW5mby50YXNrUXVldWUsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIHJ1bklkOiBpbmZvLnJ1bklkLFxuICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gIH07XG4gIGlmIChpbldvcmtmbG93Q29udGV4dCgpKSB7XG4gICAgY29uc3QgdXBkYXRlSW5mbyA9IGN1cnJlbnRVcGRhdGVJbmZvKCk7XG4gICAgaWYgKHVwZGF0ZUluZm8pIHtcbiAgICAgIC8vIEFkZCB1cGRhdGUgaW5mbyBpZiBpdCBleGlzdHNcbiAgICAgIGF0dHJpYnV0ZXNbJ3VwZGF0ZUlkJ10gPSB1cGRhdGVJbmZvLmlkO1xuICAgICAgYXR0cmlidXRlc1sndXBkYXRlTmFtZSddID0gdXBkYXRlSW5mby5uYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXR0cmlidXRlcztcbn1cbiIsImltcG9ydCB7XG4gIE1ldHJpY0NvdW50ZXIsXG4gIE1ldHJpY0dhdWdlLFxuICBNZXRyaWNIaXN0b2dyYW0sXG4gIE1ldHJpY01ldGVyLFxuICBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MsXG4gIE1ldHJpY1RhZ3MsXG4gIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgcHJveHlTaW5rcywgU2luaywgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHdvcmtmbG93SW5mbyB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuY2xhc3MgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0NvdW50ZXIobmFtZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW0obmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNHYXVnZShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljTWV0ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0NvdW50ZXIgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljQ291bnRlciB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5hZGRNZXRyaWNDb3VudGVyVmFsdWUodGhpcy5uYW1lLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCBleHRyYVRhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljQ291bnRlciB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0NvdW50ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbSBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljSGlzdG9ncmFtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLnJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW1gKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0dhdWdlIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHNldCh2YWx1ZTogbnVtYmVyLCB0YWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljR2F1Z2UgdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1Npbmsuc2V0TWV0cmljR2F1Z2VWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCB0YWdzID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljR2F1Z2VgKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIE5vdGU6IGdpdmVuIHRoYXQgZm9yd2FyZGluZyBtZXRyaWNzIG91dHNpZGUgb2YgdGhlIHNhbmJveCBjYW4gYmUgcXVpdGUgY2hhdHR5IGFuZCBhZGQgbm9uXG4vLyBuZWdsaWdlYWJsZSBvdmVyaGVhZCwgd2UgZWFnZXJseSBjaGVjayBmb3IgYGlzUmVwbGF5aW5nYCBhbmQgY29tcGxldGVseSBza2lwIGRvaW5nIHNpbmtcbi8vIGNhbGxzIGlmIHdlIGFyZSByZXBsYXlpbmcuXG5jb25zdCBtZXRyaWNTaW5rID0gcHJveHlTaW5rczxNZXRyaWNTaW5rcz4oKS5fX3RlbXBvcmFsX21ldHJpY3M7XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbWV0cmljcyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXIuXG4gKlxuICogVGhlc2Ugc2luayBmdW5jdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB3b3JrZmxvdyBjb2RlOyBpbnN0ZWFkLFxuICogZGV2ZWxvcGVycyBzaG91bGQgdXNlIHRoZSBgbWV0cmljTWV0ZXJgIG9iamVjdCBleHBvc2VkIHRvIHdvcmtmbG93IGNvZGUgYnkgdGhlIFNESywgd2hpY2hcbiAqIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGVhc2llciB0byB3b3JrIHdpdGguXG4gKlxuICogVGhpcyBzaW5rIGludGVyZmFjZSBpcyBhbHNvIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB1c2VyLlxuICpcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9tZXRyaWNzOiBXb3JrZmxvd01ldHJpY01ldGVyO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd01ldHJpY01ldGVyIGV4dGVuZHMgU2luayB7XG4gIGFkZE1ldHJpY0NvdW50ZXJWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHNldE1ldHJpY0dhdWdlVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBNZXRyaWNNZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGVtaXQgbWV0cmljcyBmcm9tIHdpdGhpbiBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ldHJpY01ldGVyOiBNZXRyaWNNZXRlciA9IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncy5jb21wb3NlKFxuICBuZXcgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwoKSxcbiAgKCkgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5tZXRyaWNNZXRlciBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICBjb25zdCBnZXRNZXRyaWNUYWdzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TWV0cmljVGFncycsIChhKSA9PiBhKTtcblxuICAgIGNvbnN0IGluZm8gPSBhY3RpdmF0b3IuaW5mbztcbiAgICByZXR1cm4gZ2V0TWV0cmljVGFncyh7XG4gICAgICAvLyBuYW1lc3BhY2UgYW5kIHRhc2tRdWV1ZSB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBXb3JrZXJcbiAgICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gICAgfSk7XG4gIH0sXG4gIHRydWVcbik7XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgdXNlck1ldGFkYXRhVG9QYXlsb2FkIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi91c2VyLW1ldGFkYXRhJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWQgPVxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvblN0YXJ0LmhhcyhzZXEpICYmXG4gICAgICAgICAgICAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbmNlbE5leHVzT3BlcmF0aW9uOiB7IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZU5leHVzT3BlcmF0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbmV4dXNIZWFkZXI6IGhlYWRlcnMsXG4gICAgICAgIGlucHV0OiBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQoaW5wdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUob3B0aW9ucz8uY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN1bW1hcnksIHVuZGVmaW5lZCksXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRcbmV4cG9ydCBjb25zdCBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciB0aGUgTmV4dXMgb3BlcmF0aW9uIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvXG4gICAqIHRoZSBjYWxsZXIuIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiBpZlxuICAgKiBjYWxsaW5nIHdvcmtmbG93IGV4aXRzIGJlZm9yZSB0aGUgZGVsaXZlcnkgaXMgZG9uZS4gSWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgY2FuY2VsbGF0aW9uIGlzXG4gICAqIGRlbGl2ZXJlZCB0byB0aGUgb3BlcmF0aW9uLCB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci4gSW4gcGFydGljdWxhciwgZWl0aGVyIHRoZVxuICAgKiBPcGVyYXRpb24gb3IgdGhlIFdvcmtmbG93IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgT3BlcmF0aW9uIGNvbXBsZXRlZFxuICAgKiBzdWNjZXNzZnVsbHksIGJ1dCB0aGUgV29ya2Zsb3cgdGhpbmtzIGl0IHdhcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBPcGVyYXRpb24gd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgdGhlbiB3YWl0IGZvciB0aGUgc2VydmVyXG4gICAqIHRvIGNvbmZpcm0gdGhhdCB0aGUgT3BlcmF0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyBkZWxpdmVyZWQgdG8gdGhlIE9wZXJhdGlvbiBIYW5kbGVyLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvblxuICAgKiBvZiB0aGUgT3BlcmF0aW9uLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZV07XG5cbmNvbnN0IFtlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsIF9dID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDAsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMSxcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAyLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG4iLCIvLyAuLi9wYWNrYWdlLmpzb24gaXMgb3V0c2lkZSBvZiB0aGUgVFMgcHJvamVjdCByb290RGlyIHdoaWNoIGNhdXNlcyBUUyB0byBjb21wbGFpbiBhYm91dCB0aGlzIGltcG9ydC5cbi8vIFdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgcm9vdERpciBiZWNhdXNlIGl0IG1lc3NlcyB1cCB0aGUgb3V0cHV0IHN0cnVjdHVyZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgcGtnIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFdvcmtmbG93IGVuZCBvZiB0aGUgc2lua3MgbWVjaGFuaXNtLlxuICpcbiAqIFNpbmtzIGFyZSBhIG1lY2hhbmlzbSBmb3IgZXhwb3J0aW5nIGRhdGEgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGVcbiAqIE5vZGUuanMgZW52aXJvbm1lbnQsIHRoZXkgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXb3JrZmxvdyBoYXMgbm8gd2F5IHRvXG4gKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBvdXRzaWRlIFdvcmxkLlxuICpcbiAqIFNpbmtzIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgZXhwb3J0aW5nIGxvZ3MsIG1ldHJpY3MgYW5kIHRyYWNlcyBvdXQgZnJvbSB0aGVcbiAqIFdvcmtmbG93LlxuICpcbiAqIFNpbmsgZnVuY3Rpb25zIG1heSBub3QgcmV0dXJuIHZhbHVlcyB0byB0aGUgV29ya2Zsb3cgaW4gb3JkZXIgdG8gcHJldmVudFxuICogYnJlYWtpbmcgZGV0ZXJtaW5pc20uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIEFueSBmdW5jdGlvbiBzaWduYXR1cmUgY2FuIGJlIHVzZWQgZm9yIFNpbmsgZnVuY3Rpb25zIGFzIGxvbmcgYXMgdGhlIHJldHVybiB0eXBlIGlzIGB2b2lkYC5cbiAqXG4gKiBXaGVuIGNhbGxpbmcgYSBTaW5rIGZ1bmN0aW9uLCBhcmd1bWVudHMgYXJlIGNvcGllZCBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZSBOb2RlLmpzIGVudmlyb25tZW50IHVzaW5nXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS93b3JrZXJfdGhyZWFkcy5odG1sI3dvcmtlcl90aHJlYWRzX3BvcnRfcG9zdG1lc3NhZ2VfdmFsdWVfdHJhbnNmZXJsaXN0IHwgcG9zdE1lc3NhZ2V9LlxuXG4gKiBUaGlzIGNvbnN0cmFpbnMgdGhlIGFyZ3VtZW50IHR5cGVzIHRvIHByaW1pdGl2ZXMgKGV4Y2x1ZGluZyBTeW1ib2xzKS5cbiAqL1xuZXhwb3J0IHR5cGUgU2lua0Z1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuXG4vKiogQSBtYXBwaW5nIG9mIG5hbWUgdG8gZnVuY3Rpb24sIGRlZmluZXMgYSBzaW5nbGUgc2luayAoZS5nLiBsb2dnZXIpICovXG5leHBvcnQgdHlwZSBTaW5rID0gUmVjb3JkPHN0cmluZywgU2lua0Z1bmN0aW9uPjtcbi8qKlxuICogV29ya2Zsb3cgU2luayBhcmUgYSBtYXBwaW5nIG9mIG5hbWUgdG8ge0BsaW5rIFNpbmt9XG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtzID0gUmVjb3JkPHN0cmluZywgU2luaz47XG5cbi8qKlxuICogQ2FsbCBpbmZvcm1hdGlvbiBmb3IgYSBTaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua0NhbGwge1xuICBpZmFjZU5hbWU6IHN0cmluZztcbiAgZm5OYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IGFueVtdO1xuICB3b3JrZmxvd0luZm86IFdvcmtmbG93SW5mbztcbn1cblxuLyoqXG4gKiBHZXQgYSByZWZlcmVuY2UgdG8gU2lua3MgZm9yIGV4cG9ydGluZyBkYXRhIG91dCBvZiB0aGUgV29ya2Zsb3cuXG4gKlxuICogVGhlc2UgU2lua3MgKiptdXN0KiogYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBXb3JrZXIgaW4gb3JkZXIgZm9yIHRoaXNcbiAqIG1lY2hhbmlzbSB0byB3b3JrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlTaW5rcywgU2lua3MgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogaW50ZXJmYWNlIE15U2lua3MgZXh0ZW5kcyBTaW5rcyB7XG4gKiAgIGxvZ2dlcjoge1xuICogICAgIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICB9O1xuICogfVxuICpcbiAqIGNvbnN0IHsgbG9nZ2VyIH0gPSBwcm94eVNpbmtzPE15RGVwZW5kZW5jaWVzPigpO1xuICogbG9nZ2VyLmluZm8oJ3NldHRpbmcgdXAnKTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBhc3luYyBleGVjdXRlKCkge1xuICogICAgICAgbG9nZ2VyLmluZm8oXCJoZXkgaG9cIik7XG4gKiAgICAgICBsb2dnZXIuZXJyb3IoXCJsZXRzIGdvXCIpO1xuICogICAgIH1cbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlTaW5rczxUIGV4dGVuZHMgU2lua3M+KCk6IFQge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIHt9LFxuICAgIHtcbiAgICAgIGdldChfLCBpZmFjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQoXywgZm5OYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAgICAgICAgICAgICAgICdQcm94aWVkIHNpbmtzIGZ1bmN0aW9ucyBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYWN0aXZhdG9yLnNpbmtDYWxscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlmYWNlTmFtZTogaWZhY2VOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGZuTmFtZTogZm5OYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIGltbWVkaWF0ZWx5LiBNYWtlIGEgY2xvbmUgb2YgdGhlIHNpbmsncyBhcmdzLCBzbyB0aGF0IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGVzZSBvYmplY3RzIGRvbid0IGNvcnJ1cHQgdGhlIGFyZ3MgdGhhdCB0aGUgc2luayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUuIE9ubHkgYXZhaWxhYmxlIGZyb20gbm9kZSAxNy5cbiAgICAgICAgICAgICAgICAgIGFyZ3M6IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lID8gKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUoYXJncykgOiBhcmdzLFxuICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdG9yLmluZm8gaXMgaW50ZXJuYWxseSBjb3B5LW9uLXdyaXRlLiBUaGlzIGVuc3VyZSB0aGF0IGFueSBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHdvcmtmbG93IHN0YXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmVzZW50IGFjdGl2YXRpb24gd2lsbCBub3QgY29ycnVwdCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93SW5mbyBzdGF0ZSB0aGF0IGdldHMgcGFzc2VkIHdoZW4gdGhlIHNpbmsgZnVuY3Rpb24gYWN0dWFsbHkgZ2V0cyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0luZm86IGFjdGl2YXRvci5pbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH1cbiAgKSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgYSBwcm9taXNlIGZyb20gYmVpbmcgdHJhY2tlZCBmb3Igc3RhY2sgdHJhY2UgcXVlcnkgcHVycG9zZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVudHJhY2tQcm9taXNlKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3Qgc3RvcmUgPSBtYXliZUdldEFjdGl2YXRvcigpPy5wcm9taXNlU3RhY2tTdG9yZTtcbiAgaWYgKCFzdG9yZSkgcmV0dXJuO1xuICBzdG9yZS5jaGlsZFRvUGFyZW50LmRlbGV0ZShwcm9taXNlKTtcbiAgc3RvcmUucHJvbWlzZVRvU3RhY2suZGVsZXRlKHByb21pc2UpO1xufVxuIiwiaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5cbi8qKlxuICogQSBgUHJvbWlzZUxpa2VgIGhlbHBlciB3aGljaCBleHBvc2VzIGl0cyBgcmVzb2x2ZWAgYW5kIGByZWplY3RgIG1ldGhvZHMuXG4gKlxuICogVHJpZ2dlciBpcyBDYW5jZWxsYXRpb25TY29wZS1hd2FyZTogaXQgaXMgbGlua2VkIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uXG4gKiBjb25zdHJ1Y3Rpb24gYW5kIHRocm93cyB3aGVuIHRoYXQgc2NvcGUgaXMgY2FuY2VsbGVkLlxuICpcbiAqIFVzZWZ1bCBmb3IgZS5nLiB3YWl0aW5nIGZvciB1bmJsb2NraW5nIGEgV29ya2Zsb3cgZnJvbSBhIFNpZ25hbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGRlZmluZVNpZ25hbCwgc2V0SGFuZGxlciwgc2xlZXAsIFRyaWdnZXIgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogY29uc3QgY29tcGxldGVVc2VySW50ZXJhY3Rpb24gPSBkZWZpbmVTaWduYWwoJ2NvbXBsZXRlVXNlckludGVyYWN0aW9uJyk7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRPblVzZXIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgY29uc3QgdXNlckludGVyYWN0aW9uID0gbmV3IFRyaWdnZXI8Ym9vbGVhbj4oKTtcbiAqXG4gKiAgIC8vIHByb2dyYW1tYXRpY2FsbHkgcmVzb2x2ZSBUcmlnZ2VyXG4gKiAgIHNldEhhbmRsZXIoY29tcGxldGVVc2VySW50ZXJhY3Rpb24sICgpID0+IHVzZXJJbnRlcmFjdGlvbi5yZXNvbHZlKHRydWUpKTtcbiAqXG4gKiAgIGNvbnN0IHVzZXJJbnRlcmFjdGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFt1c2VySW50ZXJhY3Rpb24sIHNsZWVwKCczMCBkYXlzJyldKTtcbiAqICAgaWYgKCF1c2VySW50ZXJhY3RlZCkge1xuICogICAgIGF3YWl0IHNlbmRSZW1pbmRlckVtYWlsKHVzZXJJZCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVHJpZ2dlcjxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+IHtcbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCByZWFsaXplIHRoYXQgdGhlIHByb21pc2UgZXhlY3V0b3IgaXMgcnVuIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x2ZTogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgcmVhZG9ubHkgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxUPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gICAgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbnNcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLnByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsXG4gICk6IFByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG4vKipcbiAqIE9wdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgVXBkYXRlU2NvcGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVTY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vLyBBc3luY0xvY2FsU3RvcmFnZSBpcyBpbmplY3RlZCB2aWEgdm0gbW9kdWxlIGludG8gZ2xvYmFsIHNjb3BlLlxuLy8gSW4gY2FzZSBXb3JrZmxvdyBjb2RlIGlzIGltcG9ydGVkIGluIE5vZGUuanMgY29udGV4dCwgcmVwbGFjZSB3aXRoIGFuIGVtcHR5IGNsYXNzLlxuZXhwb3J0IGNvbnN0IEFzeW5jTG9jYWxTdG9yYWdlOiBuZXcgPFQ+KCkgPT4gQUxTPFQ+ID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Bc3luY0xvY2FsU3RvcmFnZSA/PyBjbGFzcyB7fTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZVNjb3BlIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFVwZGF0ZVNjb3BlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuIHRoZSB1cGRhdGUgaGFuZGxlciBgZm5gLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYGZuYFxuICAgKi9cbiAgcnVuPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHN0b3JhZ2UucnVuKHRoaXMsIGZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgXCJhY3RpdmVcIiB1cGRhdGUgc2NvcGUuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBVcGRhdGVTY29wZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IFVwZGF0ZVNjb3BlKHsgaWQsIG5hbWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIHVwZGF0ZVdpdGhJbmZvPFQ+KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBpZCwgbmFtZSB9KS5ydW4oZm4pO1xuICB9XG59XG5cbmNvbnN0IHN0b3JhZ2U6IEFMUzxVcGRhdGVTY29wZT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiIsIi8qKlxuICogRXhwb3J0ZWQgZnVuY3Rpb25zIGZvciB0aGUgV29ya2VyIHRvIGludGVyYWN0IHdpdGggdGhlIFdvcmtmbG93IGlzb2xhdGVcbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGVuY29kZVZlcnNpb25pbmdCZWhhdmlvciwgSWxsZWdhbFN0YXRlRXJyb3IsIFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBzZXRBY3RpdmF0b3IsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLy8gRXhwb3J0IHRoZSB0eXBlIGZvciB1c2Ugb24gdGhlIFwid29ya2VyXCIgc2lkZVxuZXhwb3J0IHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBpc29sYXRlIHJ1bnRpbWUuXG4gKlxuICogU2V0cyByZXF1aXJlZCBpbnRlcm5hbCBzdGF0ZSBhbmQgaW5zdGFudGlhdGVzIHRoZSB3b3JrZmxvdyBhbmQgaW50ZXJjZXB0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFJ1bnRpbWUob3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbmV3IEFjdGl2YXRvcih7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpbmZvOiBmaXhQcm90b3R5cGVzKHtcbiAgICAgIC4uLm9wdGlvbnMuaW5mbyxcbiAgICAgIHVuc2FmZTogeyAuLi5vcHRpb25zLmluZm8udW5zYWZlLCBub3c6IE9yaWdpbmFsRGF0ZS5ub3cgfSxcbiAgICB9KSxcbiAgfSk7XG4gIC8vIFRoZXJlJ3Mgb25lIGFjdGl2YXRvciBwZXIgd29ya2Zsb3cgaW5zdGFuY2UsIHNldCBpdCBnbG9iYWxseSBvbiB0aGUgY29udGV4dC5cbiAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgaW1wb3J0aW5nIGFueSB1c2VyIGNvZGUgc28gdXNlciBjb2RlIGNhbiBzdGF0aWNhbGx5IHJlZmVyZW5jZSBAdGVtcG9yYWxpby93b3JrZmxvdyBmdW5jdGlvbnNcbiAgLy8gYXMgd2VsbCBhcyBEYXRlIGFuZCBNYXRoLnJhbmRvbS5cbiAgc2V0QWN0aXZhdG9yKGFjdGl2YXRvcik7XG5cbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIHBheWxvYWRDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21QYXlsb2FkQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXInKS5wYXlsb2FkQ29udmVydGVyO1xuICAgIC8vIFRoZSBgcGF5bG9hZENvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIgPSBjdXN0b21QYXlsb2FkQ29udmVydGVyO1xuICAgIH1cbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIGZhaWx1cmVDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21GYWlsdXJlQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXInKS5mYWlsdXJlQ29udmVydGVyO1xuICAgIC8vIFRoZSBgZmFpbHVyZUNvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLmZhaWx1cmVDb252ZXJ0ZXIgPSBjdXN0b21GYWlsdXJlQ29udmVydGVyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW1wb3J0V29ya2Zsb3dzLCBpbXBvcnRJbnRlcmNlcHRvcnMgfSA9IGdsb2JhbFRoaXMuX19URU1QT1JBTF9fO1xuICAgIGlmIChpbXBvcnRXb3JrZmxvd3MgPT09IHVuZGVmaW5lZCB8fCBpbXBvcnRJbnRlcmNlcHRvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBidW5kbGUgZGlkIG5vdCByZWdpc3RlciBpbXBvcnQgaG9va3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbXBvcnRJbnRlcmNlcHRvcnMoKTtcbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGZhY3Rvcnk6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9IG1vZC5pbnRlcmNlcHRvcnM7XG4gICAgICBpZiAoZmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3dzIGludGVyY2VwdG9yczogZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7ZmFjdG9yeX0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gZmFjdG9yeSgpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmluYm91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLmluYm91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMub3V0Ym91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMucHVzaCguLi4oaW50ZXJjZXB0b3JzLmludGVybmFscyA/PyBbXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9IGltcG9ydFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHdvcmtmbG93Rm4gPSBtb2RbYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlXTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2Zsb3dGbiA9IG1vZFsnZGVmYXVsdCddO1xuXG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSB3b3JrZmxvd0ZuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRXb3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSBkZWZhdWx0V29ya2Zsb3dGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlscyA9XG4gICAgICAgIHdvcmtmbG93Rm4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gJ25vIHN1Y2ggZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZSdcbiAgICAgICAgICA6IGBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHt0eXBlb2Ygd29ya2Zsb3dGbn0nYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93IG9mIHR5cGUgJyR7YWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlfSc6ICR7ZGV0YWlsc31gKTtcbiAgICB9XG4gICAgaWYgKGlzV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zKGFjdGl2YXRvci53b3JrZmxvdykpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFjdGl2YXRvci52ZXJzaW9uaW5nQmVoYXZpb3IgPSBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0b3Iud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlciA9IGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDb3JlIHdvbid0IHNlbmQgYW4gZXZpY3Rpb24gam9iIGFmdGVyIGFuIGVhcmx5IGVycm9yLCBzbyB3ZSBhcmUgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmdcbiAgICAgIC8vIGRpc3Bvc2FsIG9mIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gY29udGV4dC4gT3RoZXJ3aXNlLCB0aGVyZSBtaWdodCBiZSByZXNvdXJjZSBsZWFrcy5cbiAgICAgIGRpc3Bvc2UoKTtcbiAgICB9IGNhdGNoIChfaW5uZXJFcnJvcikge1xuICAgICAgLy8gSWdub3JlIGVycm9yIGRpc3Bvc2luZyBvZiBhY3RpdmF0b3IsIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgfVxuICAgIHRocm93IGU7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPYmplY3RzIHRyYW5zZmVyZWQgdG8gdGhlIFZNIGZyb20gb3V0c2lkZSBoYXZlIHByb3RvdHlwZXMgYmVsb25naW5nIHRvIHRoZVxuICogb3V0ZXIgY29udGV4dCwgd2hpY2ggbWVhbnMgdGhhdCBpbnN0YW5jZW9mIHdvbid0IHdvcmsgaW5zaWRlIHRoZSBWTS4gVGhpc1xuICogZnVuY3Rpb24gcmVjdXJzaXZlbHkgd2Fsa3Mgb3ZlciB0aGUgY29udGVudCBvZiBhbiBvYmplY3QsIGFuZCByZWNyZWF0ZSBzb21lXG4gKiBvZiB0aGVzZSBvYmplY3RzIChub3RhYmx5IEFycmF5LCBEYXRlIGFuZCBPYmplY3RzKS5cbiAqL1xuZnVuY3Rpb24gZml4UHJvdG90eXBlczxYPihvYmo6IFgpOiBYIHtcbiAgaWYgKG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKT8uY29uc3RydWN0b3I/Lm5hbWUpIHtcbiAgICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oKG9iaiBhcyBBcnJheTx1bmtub3duPikubWFwKGZpeFByb3RvdHlwZXMpKSBhcyBYO1xuICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmogYXMgdW5rbm93biBhcyBEYXRlKSBhcyBYO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2ssIHZdKTogW3N0cmluZywgYW55XSA9PiBbaywgZml4UHJvdG90eXBlcyh2KV0pKSBhcyBYO1xuICAgIH1cbiAgfSBlbHNlIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgd29ya2Zsb3cuIE9yIHRvIGJlIGV4YWN0LCBfY29tcGxldGVfIGluaXRpYWxpemF0aW9uLCBhcyBtb3N0IHBhcnQgaGFzIGJlZW4gZG9uZSBpbiBjb25zdHJ1Y3RvcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplKGluaXRpYWxpemVXb3JrZmxvd0pvYjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgYWN0aXZhdG9yLmluaXRpYWxpemVXb3JrZmxvdyhpbml0aWFsaXplV29ya2Zsb3dKb2IpO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUnVuIGEgY2h1bmsgb2YgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGljZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGFzeW5jIGFuZCBydW5zIF9pbnNpZGVfIHRoZSBWTSBjb250ZXh0LiBUaGVyZWZvcmUsIG5vIG1pY3JvdGFza1xuICogd2lsbCBnZXQgZXhlY3V0ZWQgX3doaWxlXyB0aGlzIGZ1bmN0aW9uIGlzIGFjdGl2ZTsgdGhleSB3aWxsIGhvd2V2ZXIgZ2V0IGV4ZWN1dGVkIF9hZnRlcl8gdGhpc1xuICogZnVuY3Rpb24gcmV0dXJucyAoaS5lLiBhbGwgb3V0c3RhbmRpbmcgbWljcm90YXNrcyBpbiB0aGUgVk0gd2lsbCBnZXQgZXhlY3V0ZWQgYmVmb3JlIGV4ZWN1dGlvblxuICogcmVzdW1lcyBvdXQgb2YgdGhlIFZNLCBpbiBgdm0tc2hhcmVkLnRzOmFjdGl2YXRlKClgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGl2YXRlKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uLCBiYXRjaEluZGV4ID0gMCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbnRlcmNlcHQgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW50ZXJuYWxzLCAnYWN0aXZhdGUnLCAoeyBhY3RpdmF0aW9uIH0pID0+IHtcbiAgICAgIC8vIENhc3QgZnJvbSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBjbGFzcyB3aGljaCBoYXMgdGhlIGB2YXJpYW50YCBhdHRyaWJ1dGUuXG4gICAgICAvLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgYWN0aXZhdGlvbiBpcyBhIHByb3RvIGNsYXNzLlxuICAgICAgY29uc3Qgam9icyA9IGFjdGl2YXRpb24uam9icyBhcyBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iW107XG5cbiAgICAgIC8vIEluaXRpYWxpemF0aW9uIHdpbGwgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeSwgYnV0IHdlIG1pZ2h0IHN0aWxsIG5lZWQgdG8gc3RhcnQgdGhlIHdvcmtmbG93IGZ1bmN0aW9uXG4gICAgICBjb25zdCBzdGFydFdvcmtmbG93Sm9iID0gam9ic1swXT8udmFyaWFudCA9PT0gJ2luaXRpYWxpemVXb3JrZmxvdycgPyBqb2JzLnNoaWZ0KCk/LmluaXRpYWxpemVXb3JrZmxvdyA6IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICBpZiAoam9iLnZhcmlhbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgam9iLnZhcmlhbnQgdG8gYmUgZGVmaW5lZCcpO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqb2Jbam9iLnZhcmlhbnRdO1xuICAgICAgICBpZiAoIXZhcmlhbnQpIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGpvYi4ke2pvYi52YXJpYW50fSB0byBiZSBzZXRgKTtcblxuICAgICAgICBhY3RpdmF0b3Jbam9iLnZhcmlhbnRdKHZhcmlhbnQgYXMgYW55IC8qIFRTIGNhbid0IGluZmVyIHRoaXMgdHlwZSAqLyk7XG5cbiAgICAgICAgaWYgKGpvYi52YXJpYW50ICE9PSAncXVlcnlXb3JrZmxvdycpIHRyeVVuYmxvY2tDb25kaXRpb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydFdvcmtmbG93Sm9iKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JUeXBlczogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLldvcmtmbG93QWN0aXZhdGlvbkpvYlsndmFyaWFudCddW10gPSBbXG4gICAgICAgICAgJ2luaXRpYWxpemVXb3JrZmxvdycsXG4gICAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgICAnZG9VcGRhdGUnLFxuICAgICAgICAgICdjYW5jZWxXb3JrZmxvdycsXG4gICAgICAgICAgJ3VwZGF0ZVJhbmRvbVNlZWQnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoam9icy5zb21lKChqb2IpID0+ICFzYWZlSm9iVHlwZXMuaW5jbHVkZXMoam9iLnZhcmlhbnQpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAnUmVjZWl2ZWQgYm90aCBpbml0aWFsaXplV29ya2Zsb3cgYW5kIG5vbi1zaWduYWwvbm9uLXVwZGF0ZSBqb2JzIGluIHRoZSBzYW1lIGFjdGl2YXRpb246ICcgK1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShqb2JzLm1hcCgoam9iKSA9PiBqb2IudmFyaWFudCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjdGl2YXRvci5zdGFydFdvcmtmbG93KHN0YXJ0V29ya2Zsb3dKb2IpO1xuXG4gICAgICAgIHRyeVVuYmxvY2tDb25kaXRpb25zKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW50ZXJjZXB0KHsgYWN0aXZhdGlvbiwgYmF0Y2hJbmRleCB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmNsdWRlIGEgc2luZ2xlIGFjdGl2YXRpb24uXG4gKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGFjdGl2YXRpb24gam9icyBhbmQgcXVldWVkIG1pY3JvdGFza3MuXG4gKlxuICogQWN0aXZhdGlvbiBmYWlsdXJlcyBhcmUgaGFuZGxlZCBpbiB0aGUgbWFpbiBOb2RlLmpzIGlzb2xhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jbHVkZUFjdGl2YXRpb24oKTogY29yZXNkay53b3JrZmxvd19jb21wbGV0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Db21wbGV0aW9uIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgYWN0aXZhdG9yLnJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdjb25jbHVkZUFjdGl2YXRpb24nLCAoaW5wdXQpID0+IGlucHV0KTtcbiAgICBjb25zdCBhY3RpdmF0aW9uQ29tcGxldGlvbiA9IGFjdGl2YXRvci5jb25jbHVkZUFjdGl2YXRpb24oKTtcbiAgICBjb25zdCB7IGNvbW1hbmRzIH0gPSBpbnRlcmNlcHQoeyBjb21tYW5kczogYWN0aXZhdGlvbkNvbXBsZXRpb24uY29tbWFuZHMgfSk7XG4gICAgaWYgKGFjdGl2YXRvci5jb21wbGV0ZWQpIHtcbiAgICAgIGFjdGl2YXRvci53YXJuSWZVbmZpbmlzaGVkSGFuZGxlcnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bklkOiBhY3RpdmF0b3IuaW5mby5ydW5JZCxcbiAgICAgIHN1Y2Nlc3NmdWw6IHtcbiAgICAgICAgLi4uYWN0aXZhdGlvbkNvbXBsZXRpb24sXG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICB2ZXJzaW9uaW5nQmVoYXZpb3I6IGVuY29kZVZlcnNpb25pbmdCZWhhdmlvcihhY3RpdmF0aW9uQ29tcGxldGlvbi52ZXJzaW9uaW5nQmVoYXZpb3IpLFxuICAgICAgfSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTG9vcCB0aHJvdWdoIGFsbCBibG9ja2VkIGNvbmRpdGlvbnMsIGV2YWx1YXRlIGFuZCB1bmJsb2NrIGlmIHBvc3NpYmxlLlxuICpcbiAqIEByZXR1cm5zIG51bWJlciBvZiB1bmJsb2NrZWQgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVVuYmxvY2tDb25kaXRpb25zKCk6IG51bWJlciB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGxldCBudW1VbmJsb2NrZWQgPSAwO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGFjdGl2YXRvci5tYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpO1xuICAgICAgY29uc3QgcHJldlVuYmxvY2tlZCA9IG51bVVuYmxvY2tlZDtcbiAgICAgIGZvciAoY29uc3QgW3NlcSwgY29uZF0gb2YgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoY29uZC5mbigpKSB7XG4gICAgICAgICAgY29uZC5yZXNvbHZlKCk7XG4gICAgICAgICAgbnVtVW5ibG9ja2VkKys7XG4gICAgICAgICAgLy8gSXQgaXMgc2FmZSB0byBkZWxldGUgZWxlbWVudHMgZHVyaW5nIG1hcCBpdGVyYXRpb25cbiAgICAgICAgICBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZGVsZXRlKHNlcSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcmV2VW5ibG9ja2VkID09PSBudW1VbmJsb2NrZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW1VbmJsb2NrZWQ7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gSGFuZGxlIGRpc3Bvc2FsIG9mIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gY29udGV4dCAobm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZGVzdHJveWluZ1xuLy8gdGhlIHNhbmRib3ggdm0sIHdoaWNoIG1heSBwb3NzaWJseSBiZSByZXVzZWQgaWYgYHJldXNlVjhDb250ZXh0YCBpcyB0cnVlKS5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlKCk6IHZvaWQge1xuICBsZXQgZXJyb3I6IHVua25vd24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpc3Bvc2UgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW50ZXJuYWxzLCAnZGlzcG9zZScsIGFzeW5jICgpID0+IHt9KTtcbiAgICAgIGRpc3Bvc2Uoe30pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cnVjdG9ycyBhcmUgcnVuIG91dHNpZGUgb2YgaW50ZXJjZXB0b3JzLCBiZWNhdXNlIGludGVyY2VwdG9ycyB0aGVtc2VsdmVzIG9mdGVuIHJlbHlcbiAgICAvLyBvbiBvYmplY3RzIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWQgKG5vdGFibHkgQXN5bmNMb2NhbFN0b3JhZ2UgaW5zdGFuY2VzKSwgYW5kIGJlY2F1c2Ugd2VcbiAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHJlc291cmNlcyBnZXQgY2xlYW5lZCB1cCBldmVuIGlmIGFuIGludGVyY2VwdG9yIHRocm93cyBhbiBlcnJvci5cbiAgICAvLyBPbmx5IHRoZSBmaXJzdCBlcnJvciAoaWYgYW55KSBpcyByZXRocm93bi5cbiAgICBmb3IgKGNvbnN0IGRlc3RydWN0b3Igb2YgYWN0aXZhdG9yLndvcmtmbG93U2FuZGJveERlc3RydWN0b3JzLnNwbGljZSgwKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvciAhPSBudWxsKSB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcblxuICAgIC8vIFRoZSBhY3RpdmF0b3IgaXMgbm8gbG9uZ2VyIHZhbGlkIHBhc3QgdGhpcyBwb2ludC5cbiAgICBzZXRBY3RpdmF0b3IodW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vLyBEZXN0cm95IHRoZSBzYW5kYm94IFZNIChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkaXNwb3Npbmcgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0KS5cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95KCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICBpZiAoYWN0aXZhdG9yKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IHNob3VsZCBoYXZlIGJlZW4gZGlzcG9zZWQgZmlyc3QnKTtcblxuICBsZXQgZXJyb3I6IHVua25vd24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBnbG9iYWxUaGlzLl9fdGVtcG9yYWxfZ2xvYmFsU2FuZGJveERlc3RydWN0b3JzPy5zcGxpY2UoMCkgPz8gW10pIHtcbiAgICB0cnkge1xuICAgICAgZGVzdHJ1Y3RvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yID0gZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMob2JqOiBhbnkpOiBvYmogaXMgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+IHtcbiAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKG9iaiwgJ3dvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMnKTtcbn1cbiIsImltcG9ydCB7XG4gIEFjdGl2aXR5RnVuY3Rpb24sXG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgY29tcGlsZVJldHJ5UG9saWN5LFxuICBjb21waWxlUHJpb3JpdHksXG4gIGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBleHRyYWN0V29ya2Zsb3dUeXBlLFxuICBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSxcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIG1hcFRvUGF5bG9hZHMsXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlVmFsdWUsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIHRvUGF5bG9hZHMsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgVW50eXBlZEFjdGl2aXRpZXMsXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFdpdGhXb3JrZmxvd0FyZ3MsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd1Jlc3VsdFR5cGUsXG4gIFdvcmtmbG93UmV0dXJuVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXIsXG4gIGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB1c2VyTWV0YWRhdGFUb1BheWxvYWQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3VzZXItbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvY29udmVydGVyL3BheWxvYWQtc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdmVyc2lvbmluZ0ludGVudFRvUHJvdG8gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3ZlcnNpb25pbmctaW50ZW50LWVudW0nO1xuaW1wb3J0IHsgRHVyYXRpb24sIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIHJlcXVpcmVkVHNUb01zIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgdGhyb3dJZlJlc2VydmVkTmFtZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUsIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHtcbiAgQWN0aXZpdHlJbnB1dCxcbiAgTG9jYWxBY3Rpdml0eUlucHV0LFxuICBTaWduYWxXb3JrZmxvd0lucHV0LFxuICBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCxcbiAgVGltZXJJbnB1dCxcbiAgVGltZXJPcHRpb25zLFxufSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLFxuICBDb250aW51ZUFzTmV3LFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgSGFuZGxlcixcbiAgUXVlcnlIYW5kbGVyT3B0aW9ucyxcbiAgU2lnbmFsSGFuZGxlck9wdGlvbnMsXG4gIFVwZGF0ZUhhbmRsZXJPcHRpb25zLFxuICBXb3JrZmxvd0luZm8sXG4gIFVwZGF0ZUluZm8sXG4gIGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSxcbiAgRGVmYXVsdFVwZGF0ZUhhbmRsZXIsXG4gIERlZmF1bHRRdWVyeUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuLyoqXG4gKiBBZGRzIGRlZmF1bHQgdmFsdWVzIG9mIGB3b3JrZmxvd0lkYCBhbmQgYGNhbmNlbGxhdGlvblR5cGVgIHRvIGdpdmVuIHdvcmtmbG93IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdHM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyB7XG4gIGNvbnN0IHsgYXJncywgd29ya2Zsb3dJZCwgLi4ucmVzdCB9ID0gb3B0cztcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkOiB3b3JrZmxvd0lkID8/IHV1aWQ0KCksXG4gICAgYXJnczogKGFyZ3MgPz8gW10pIGFzIHVua25vd25bXSxcbiAgICBjYW5jZWxsYXRpb25UeXBlOiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc3RhcnRUaW1lciBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gdGltZXJOZXh0SGFuZGxlcih7IHNlcSwgZHVyYXRpb25Ncywgb3B0aW9ucyB9OiBUaW1lcklucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKGR1cmF0aW9uTXMpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgc2xlZXAuXG4gKlxuICogU2NoZWR1bGVzIGEgdGltZXIgb24gdGhlIFRlbXBvcmFsIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyIG9yIDAsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCB0aW1lciBvcHRpb25zIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBEdXJhdGlvbiwgb3B0aW9ucz86IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuc2xlZXAoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nKTtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG5cbiAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDEsIG1zVG9OdW1iZXIobXMpKTtcblxuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc3RhcnRUaW1lcicsIHRpbWVyTmV4dEhhbmRsZXIpO1xuXG4gIHJldHVybiBleGVjdXRlKHtcbiAgICBkdXJhdGlvbk1zLFxuICAgIHNlcSxcbiAgICBvcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVpcmVkIGVpdGhlciBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IG9yIHN0YXJ0VG9DbG9zZVRpbWVvdXQnKTtcbiAgfVxufVxuXG4vLyBVc2Ugc2FtZSB2YWxpZGF0aW9uIHdlIHVzZSBmb3Igbm9ybWFsIGFjdGl2aXRpZXNcbmNvbnN0IHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMgPSB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucztcblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gYWN0aXZhdG9yIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcih7IG9wdGlvbnMsIGFyZ3MsIGhlYWRlcnMsIHNlcSwgYWN0aXZpdHlUeXBlIH06IEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhY3Rpdml0eUlkOiBvcHRpb25zLmFjdGl2aXR5SWQgPz8gYCR7c2VxfWAsXG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICBoZWFydGJlYXRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgICAgZG9Ob3RFYWdlcmx5RXhlY3V0ZTogIShvcHRpb25zLmFsbG93RWFnZXJEaXNwYXRjaCA/PyB0cnVlKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgICBwcmlvcml0eTogb3B0aW9ucy5wcmlvcml0eSA/IGNvbXBpbGVQcmlvcml0eShvcHRpb25zLnByaW9yaXR5KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIC8vIEVhZ2VybHkgZmFpbCB0aGUgbG9jYWwgYWN0aXZpdHkgKHdoaWNoIHdpbGwgaW4gdHVybiBmYWlsIHRoZSB3b3JrZmxvdyB0YXNrLlxuICAvLyBEbyBub3QgZmFpbCBvbiByZXBsYXkgd2hlcmUgdGhlIGxvY2FsIGFjdGl2aXRpZXMgbWF5IG5vdCBiZSByZWdpc3RlcmVkIG9uIHRoZSByZXBsYXkgd29ya2VyLlxuICBpZiAoIWFjdGl2YXRvci5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiAhYWN0aXZhdG9yLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLmhhcyhhY3Rpdml0eVR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBMb2NhbCBhY3Rpdml0eSBvZiB0eXBlICcke2FjdGl2aXR5VHlwZX0nIG5vdCByZWdpc3RlcmVkIG9uIHdvcmtlcmApO1xuICB9XG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsTG9jYWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eToge1xuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCBleHBvc2luZyBhY3Rpdml0eUlkIGFzIGFuIG9wdGlvblxuICAgICAgICBhY3Rpdml0eUlkOiBgJHtzZXF9YCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICByZXRyeVBvbGljeTogb3B0aW9ucy5yZXRyeSA/IGNvbXBpbGVSZXRyeVBvbGljeShvcHRpb25zLnJldHJ5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgbG9jYWxSZXRyeVRocmVzaG9sZDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5sb2NhbFJldHJ5VGhyZXNob2xkKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc3VtbWFyeSwgdW5kZWZpbmVkKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGUgPSAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dDb21wbGV0ZS5oYXMoc2VxKTtcblxuICAgICAgICAgIGlmICghY29tcGxldGUpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGNhbmNlbENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHsgY2hpbGRXb3JrZmxvd1NlcTogc2VxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgd29ya2Zsb3dUeXBlLFxuICAgICAgICBpbnB1dDogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4ub3B0aW9ucy5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLCAvLyBOb3QgY29uZmlndXJhYmxlXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIHdvcmtmbG93SWRSZXVzZVBvbGljeTogZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5KG9wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5KSxcbiAgICAgICAgcGFyZW50Q2xvc2VQb2xpY3k6IGVuY29kZVBhcmVudENsb3NlUG9saWN5KG9wdGlvbnMucGFyZW50Q2xvc2VQb2xpY3kpLFxuICAgICAgICBjcm9uU2NoZWR1bGU6IG9wdGlvbnMuY3JvblNjaGVkdWxlLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbyksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgPyBjb21waWxlUHJpb3JpdHkob3B0aW9ucy5wcmlvcml0eSkgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN0YXRpY1N1bW1hcnksIG9wdGlvbnM/LnN0YXRpY0RldGFpbHMpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93U3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gV2UgY29uc3RydWN0IGEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNoaWxkIFdvcmtmbG93IGJlZm9yZSB3ZSBrbm93XG4gIC8vIGlmIHRoZSBXb3JrZmxvdyBjb2RlIHdpbGwgYXdhaXQgaXQgdG8gY2FwdHVyZSB0aGUgcmVzdWx0IGluIGNhc2UgaXQgZG9lcy5cbiAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIENoYWluIHN0YXJ0IFByb21pc2UgcmVqZWN0aW9uIHRvIHRoZSBjb21wbGV0ZSBQcm9taXNlLlxuICAgIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZS5jYXRjaChyZWplY3QpKTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7IGNhbmNlbFNpZ25hbFdvcmtmbG93OiB7IHNlcSB9IH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNpZ25hbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhcmdzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2lnbmFsTmFtZSxcbiAgICAgICAgLi4uKHRhcmdldC50eXBlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0LndvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaGlsZFdvcmtmbG93SWQ6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGluIHRoZSByZXR1cm4gdHlwZSBvZiBwcm94eSBtZXRob2RzIHRvIG1hcmsgdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNvdXJjZSB0eXBlIGlzIG5vdCBhIG1ldGhvZC5cbiAqXG4gKiBAc2VlIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc31cbiAqIEBzZWUge0BsaW5rIHByb3h5TG9jYWxBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgY29uc3QgTm90QW5BY3Rpdml0eU1ldGhvZCA9IFN5bWJvbC5mb3IoJ19fVEVNUE9SQUxfTk9UX0FOX0FDVElWSVRZX01FVEhPRCcpO1xuXG4vKipcbiAqIFR5cGUgaGVscGVyIHRoYXQgdGFrZXMgYSB0eXBlIGBUYCBhbmQgdHJhbnNmb3JtcyBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCB7QGxpbmsgQWN0aXZpdHlGdW5jdGlvbn0gdG9cbiAqIHtAbGluayBOb3RBbkFjdGl2aXR5TWV0aG9kfS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFVzZWQgYnkge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gZ2V0IHRoaXMgY29tcGlsZS10aW1lIGVycm9yOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgTXlBY3Rpdml0aWVzIHtcbiAqICAgdmFsaWQoaW5wdXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAqICAgaW52YWxpZChpbnB1dDogbnVtYmVyKTogbnVtYmVyO1xuICogfVxuICpcbiAqIGNvbnN0IGFjdCA9IHByb3h5QWN0aXZpdGllczxNeUFjdGl2aXRpZXM+KHsgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyB9KTtcbiAqXG4gKiBhd2FpdCBhY3QudmFsaWQodHJ1ZSk7XG4gKiBhd2FpdCBhY3QuaW52YWxpZCgpO1xuICogLy8gXiBUUyBjb21wbGFpbnMgd2l0aDpcbiAqIC8vIChwcm9wZXJ0eSkgaW52YWxpZERlZmluaXRpb246IHR5cGVvZiBOb3RBbkFjdGl2aXR5TWV0aG9kXG4gKiAvLyBUaGlzIGV4cHJlc3Npb24gaXMgbm90IGNhbGxhYmxlLlxuICogLy8gVHlwZSAnU3ltYm9sJyBoYXMgbm8gY2FsbCBzaWduYXR1cmVzLigyMzQ5KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlRm9yPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24gPyBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VFtLXT4gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aXZpdHksIG92ZXJyaWRpbmcgaXRzIGV4aXN0aW5nIG9wdGlvbnMgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgQWN0aXZpdHlPcHRpb25zXG4gICAqIEBwYXJhbSBhcmdzOiBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJnczogbGlzdCBvZiBhcmd1bWVudHNcbiAgICogQHJldHVybnMgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpdml0eVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIGV4ZWN1dGVXaXRoT3B0aW9ucyBpcyBhIG5ldyBtZXRob2QgdG8gcHJvdmlkZSBjYWxsLXNpdGUgb3B0aW9ucyBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2VcbiAgICovXG4gIGV4ZWN1dGVXaXRoT3B0aW9ucyhvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9IGZvclxuICogICAgICAgICB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eUFjdGl2aXRpZXMgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKiBpbXBvcnQgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4uL2FjdGl2aXRpZXMnO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBtb2R1bGUgZXhwb3J0c1xuICogY29uc3QgeyBodHRwR2V0LCBvdGhlckFjdGl2aXR5IH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzMwIG1pbnV0ZXMnLFxuICogfSk7XG4gKlxuICogLy8gVXNlIGFjdGl2aXRpZXMgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAqIGNvbnN0IHJlc3VsdDEgPSBhd2FpdCBodHRwR2V0KCdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqXG4gKiAvLyBPdmVycmlkZSBvcHRpb25zIGZvciBzcGVjaWZpYyBhY3Rpdml0eSBjYWxsc1xuICogY29uc3QgcmVzdWx0MiA9IGF3YWl0IGh0dHBHZXQuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgc3RhdGljU3VtbWFyeTogJ0ZldGNoZXMgZGF0YSBmcm9tIGV4dGVybmFsIEFQSScsXG4gKiAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6ICc1bSdcbiAqIH0sIFsnaHR0cDovL2FwaS5leGFtcGxlLmNvbSddKTtcbiAqXG4gKiBjb25zdCByZXN1bHQzID0gYXdhaXQgb3RoZXJBY3Rpdml0eS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnUHJvY2Vzc2VzIHRoZSBmZXRjaGVkIGRhdGEnLFxuICogICB0YXNrUXVldWU6ICdzcGVjaWFsLXRhc2stcXVldWUnXG4gKiB9LCBbZGF0YV0pO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBhbiBleHBsaWNpdCBpbnRlcmZhY2UgKGUuZy4gd2hlbiBkZWZpbmVkIGJ5IGFub3RoZXIgU0RLKVxuICogaW50ZXJmYWNlIEphdmFBY3Rpdml0aWVzIHtcbiAqICAgaHR0cEdldEZyb21KYXZhKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG4gKiAgIHNvbWVPdGhlckphdmFBY3Rpdml0eShhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIH1cbiAqXG4gKiBjb25zdCB7XG4gKiAgIGh0dHBHZXRGcm9tSmF2YSxcbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5XG4gKiB9ID0gcHJveHlBY3Rpdml0aWVzPEphdmFBY3Rpdml0aWVzPih7XG4gKiAgIHRhc2tRdWV1ZTogJ2phdmEtd29ya2VyLXRhc2tRdWV1ZScsXG4gKiAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScsXG4gKiB9KTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwR2V0KFwiaHR0cDovL2V4YW1wbGUuY29tXCIpO1xuICogICAvLyBPciB3aXRoIGN1c3RvbSBvcHRpb25zOlxuICogICBjb25zdCByZXNwb25zZTIgPSBhd2FpdCBodHRwR2V0RnJvbUphdmEuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgICBzdGF0aWNTdW1tYXJ5OiAnSmF2YSBIVFRQIGNhbGwgd2l0aCB0aW1lb3V0IG92ZXJyaWRlJyxcbiAqICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMm0nXG4gKiAgIH0sIFtcImh0dHA6Ly9mYXN0LWFwaS5leGFtcGxlLmNvbVwiXSk7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSBhcyBzdHJpbmcsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIGRlZXBNZXJnZShvcHRpb25zLCBvdmVycmlkZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlIExvY2FsIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBMb2NhbEFjdGl2aXR5T3B0aW9uc30uXG4gKlxuICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBzZXR1cCBBY3Rpdml0aWVzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMuXG4gKlxuICogQHJldHVybiBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSB8IFByb3h5fVxuICogICAgICAgICBmb3Igd2hpY2ggZWFjaCBhdHRyaWJ1dGUgaXMgYSBjYWxsYWJsZSBBY3Rpdml0eSBmdW5jdGlvblxuICpcbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc30gZm9yIGV4YW1wbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUxvY2FsQWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KFxuICBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuKTogTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiwge1xuICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZpdHlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgQWN0aXZpdHkgdHlwZXMsIGdvdDogJHtTdHJpbmcoYWN0aXZpdHlUeXBlKX1gKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uLmV4ZWN1dGVXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChcbiAgICAgICAgb3ZlcnJpZGVPcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVMb2NhbEFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBwYXRjaCBhZnRlciBcImVub3VnaFwiIHRpbWUgaGFzIHBhc3NlZFxuY29uc3QgRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIID0gJ19fdGVtcG9yYWxfaW50ZXJuYWxfY29ubmVjdF9leHRlcm5hbF9oYW5kbGVfY2FuY2VsX3RvX3Njb3BlJztcbi8vIFRoZSBuYW1lIG9mIHRoaXMgcGF0Y2ggY29tZXMgZnJvbSBhbiBhdHRlbXB0IHRvIGJ1aWxkIGEgZ2VuZXJpYyBpbnRlcm5hbCBwYXRjaGluZyBtZWNoYW5pc20uXG4vLyBUaGF0IGVmZm9ydCBoYXMgYmVlbiBhYmFuZG9uZWQgaW4gZmF2b3Igb2YgYSBuZXdlciBXb3JrZmxvd1Rhc2tDb21wbGV0ZWRNZXRhZGF0YSBiYXNlZCBtZWNoYW5pc20uXG5jb25zdCBDT05ESVRJT05fMF9QQVRDSCA9ICdfX3Nka19pbnRlcm5hbF9wYXRjaF9udW1iZXI6MSc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBhbmQgY2FuY2VsIGFuIGV4aXN0aW5nIFdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqIEl0IHRha2VzIGEgV29ya2Zsb3cgSUQgYW5kIG9wdGlvbmFsIHJ1biBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUod29ya2Zsb3dJZDogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IEV4dGVybmFsV29ya2Zsb3dIYW5kbGUge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4gQ29uc2lkZXIgdXNpbmcgQ2xpZW50LndvcmtmbG93LmdldEhhbmRsZSguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkLFxuICAgIHJ1bklkLFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIENvbm5lY3QgdGhpcyBjYW5jZWwgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBzY29wZS5cbiAgICAgICAgLy8gVGhpcyBpcyBiZWhhdmlvciB3YXMgaW50cm9kdWNlZCBhZnRlciB2MC4yMi4wIGFuZCBpcyBpbmNvbXBhdGlibGVcbiAgICAgICAgLy8gd2l0aCBoaXN0b3JpZXMgZ2VuZXJhdGVkIHdpdGggcHJldmlvdXMgU0RLIHZlcnNpb25zIGFuZCB0aHVzIHJlcXVpcmVzXG4gICAgICAgIC8vIHBhdGNoaW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSB0cnkgdG8gZGVsYXkgcGF0Y2hpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBhdm9pZCBwb2xsdXRpbmdcbiAgICAgICAgLy8gaGlzdG9yaWVzIHVubGVzcyBzdHJpY3RseSByZXF1aXJlZC5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmNhbmNlbFdvcmtmbG93Kys7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgcmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jYW5jZWxXb3JrZmxvdy5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdleHRlcm5hbCcsXG4gICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHsgd29ya2Zsb3dJZCwgcnVuSWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqICoqT3ZlcnJpZGUgZm9yIFdvcmtmbG93cyB0aGF0IGFjY2VwdCBubyBhcmd1bWVudHMqKi5cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd1R5cGU6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoZSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGFueT4+KHdvcmtmbG93RnVuYzogVCk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnN0YXJ0Q2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5zdGFydCguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IGFkZERlZmF1bHRXb3JrZmxvd09wdGlvbnMob3B0aW9ucyA/PyAoe30gYXMgYW55KSk7XG4gIGNvbnN0IHdvcmtmbG93VHlwZSA9IGV4dHJhY3RXb3JrZmxvd1R5cGUod29ya2Zsb3dUeXBlT3JGdW5jKTtcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJyxcbiAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlclxuICApO1xuICBjb25zdCBbc3RhcnRlZCwgY29tcGxldGVkXSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLmNoaWxkV29ya2Zsb3crKyxcbiAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHdvcmtmbG93VHlwZSxcbiAgfSk7XG4gIGNvbnN0IGZpcnN0RXhlY3V0aW9uUnVuSWQgPSBhd2FpdCBzdGFydGVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgIGZpcnN0RXhlY3V0aW9uUnVuSWQsXG4gICAgYXN5bmMgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNvbXBsZXRlZCkgYXMgYW55O1xuICAgIH0sXG4gICAgYXN5bmMgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdjaGlsZCcsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiBvcHRpb25zV2l0aERlZmF1bHRzLndvcmtmbG93SWQsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyAoKSA9PiBXb3JrZmxvd1JldHVyblR5cGU+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBULFxuICBvcHRpb25zPzogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5leGVjdXRlQ2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5leGVjdXRlKC4uLikgaW5zdGVhZC4nXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgZXhlY1Byb21pc2UgPSBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShleGVjUHJvbWlzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFByb21pc2UgPSBleGVjUHJvbWlzZS50aGVuKChbX3N0YXJ0ZWQsIGNvbXBsZXRlZF0pID0+IGNvbXBsZXRlZCk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlZFByb21pc2UpO1xuICByZXR1cm4gY29tcGxldGVkUHJvbWlzZSBhcyBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyb3plbiBjb3B5IG9mIFdvcmtmbG93SW5mbywgYXQgdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAqIENoYW5nZXMgaGFwcGVuaW5nIGF0IGxhdGVyIHBvaW50IGluIHdvcmtmbG93IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBGb3IgdGhpcyByZWFzb24sIHdlIHJlY29tbWVuZCBjYWxsaW5nIGB3b3JrZmxvd0luZm8oKWAgb24gZXZlcnkgYWNjZXNzIHRvIHtAbGluayBXb3JrZmxvd0luZm99J3MgZmllbGRzLFxuICogcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgYFdvcmtmbG93SW5mb2Agb2JqZWN0IChvciBwYXJ0IG9mIGl0KSBpbiBhIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogLy8gR09PRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgZG9Tb21ldGhpbmcod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZSh3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKlxuICogdnNcbiAqXG4gKiBgYGB0c1xuICogLy8gQkFEXG4gKiBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICBjb25zdCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlc1xuICogICBkb1NvbWV0aGluZyhhdHRyaWJ1dGVzKVxuICogICAuLi5cbiAqICAgZG9Tb21ldGhpbmdFbHNlKGF0dHJpYnV0ZXMpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93SW5mbygpOiBXb3JrZmxvd0luZm8ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dJbmZvKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluZm87XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVwZGF0ZSBpZiBhbnkuXG4gKlxuICogQHJldHVybiBJbmZvIGZvciB0aGUgY3VycmVudCB1cGRhdGUgaGFuZGxlciB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgZXhlY3V0aW5nXG4gKiB3aXRoaW4gaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFVwZGF0ZUluZm8oKTogVXBkYXRlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jdXJyZW50VXBkYXRlSW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIFVwZGF0ZVNjb3BlLmN1cnJlbnQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvZGUgaXMgZXhlY3V0aW5nIGluIHdvcmtmbG93IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluV29ya2Zsb3dDb250ZXh0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3IoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBgZmAgdGhhdCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIENvbnRpbnVlQXNOZXcgd2hlbiBjYWxsZWQuXG4gKlxuICogYGZgIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgV29ya2Zsb3cgZnVuY3Rpb24gc3VwcGxpZWQgdG8gdHlwZXBhcmFtIGBGYC5cbiAqXG4gKiBPbmNlIGBmYCBpcyBjYWxsZWQsIFdvcmtmbG93IEV4ZWN1dGlvbiBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29udGludWVBc05ld0Z1bmM8RiBleHRlbmRzIFdvcmtmbG93PihcbiAgb3B0aW9ucz86IENvbnRpbnVlQXNOZXdPcHRpb25zXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4gUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuY29udGludWVBc05ldyguLi4pIGFuZCBXb3JrZmxvdy5tYWtlQ29udGludWVBc05ld0Z1bmMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBjb25zdCBpbmZvID0gYWN0aXZhdG9yLmluZm87XG4gIGNvbnN0IHsgd29ya2Zsb3dUeXBlLCB0YXNrUXVldWUsIC4uLnJlc3QgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJlcXVpcmVkT3B0aW9ucyA9IHtcbiAgICB3b3JrZmxvd1R5cGU6IHdvcmtmbG93VHlwZSA/PyBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB0YXNrUXVldWU6IHRhc2tRdWV1ZSA/PyBpbmZvLnRhc2tRdWV1ZSxcbiAgICAuLi5yZXN0LFxuICB9O1xuXG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICBjb25zdCBmbiA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2NvbnRpbnVlQXNOZXcnLCBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVhZGVycywgYXJncywgb3B0aW9ucyB9ID0gaW5wdXQ7XG4gICAgICB0aHJvdyBuZXcgQ29udGludWVBc05ldyh7XG4gICAgICAgIHdvcmtmbG93VHlwZTogb3B0aW9ucy53b3JrZmxvd1R5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4uYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUsXG4gICAgICAgIG1lbW86IG9wdGlvbnMubWVtbyAmJiBtYXBUb1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLm1lbW8pLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcihvcHRpb25zLmluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZuKHtcbiAgICAgIGFyZ3MsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIG9wdGlvbnM6IHJlcXVpcmVkT3B0aW9ucyxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtY29udGludWUtYXMtbmV3LyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgLy8gUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciBgbmAsIHBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBvZiBsZW5ndGggYHBgXG4gIGNvbnN0IGhvID0gKG46IG51bWJlciwgcDogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydChwLCAnMCcpO1xuICAvLyBDcmVhdGUgYSB2aWV3IGJhY2tlZCBieSBhIDE2LWJ5dGUgYnVmZmVyXG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIC8vIEZpbGwgYnVmZmVyIHdpdGggcmFuZG9tIHZhbHVlc1xuICB2aWV3LnNldFVpbnQzMigwLCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoOCwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQzMigxMiwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICAvLyBQYXRjaCB0aGUgNnRoIGJ5dGUgdG8gcmVmbGVjdCBhIHZlcnNpb24gNCBVVUlEXG4gIHZpZXcuc2V0VWludDgoNiwgKHZpZXcuZ2V0VWludDgoNikgJiAweGYpIHwgMHg0MCk7XG4gIC8vIFBhdGNoIHRoZSA4dGggYnl0ZSB0byByZWZsZWN0IGEgdmFyaWFudCAxIFVVSUQgKHZlcnNpb24gNCBVVUlEcyBhcmUpXG4gIHZpZXcuc2V0VWludDgoOCwgKHZpZXcuZ2V0VWludDgoOCkgJiAweDNmKSB8IDB4ODApO1xuICAvLyBDb21waWxlIHRoZSBjYW5vbmljYWwgdGV4dHVhbCBmb3JtIGZyb20gdGhlIGFycmF5IGRhdGFcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyB8IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cudXBzZXJ0U2VhcmNoQXR0cmlidXRlcyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG5cbiAgaWYgKHNlYXJjaEF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoQXR0cmlidXRlcyBtdXN0IGJlIGEgbm9uLW51bGwgU2VhcmNoQXR0cmlidXRlcycpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAvLyBUeXBlZCBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKHVuZGVmaW5lZCwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBjb25zdCBuZXdTZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzID0geyAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHNlYXJjaEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHBhaXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgbXV0YXRlIHRoZSBleGlzdGluZyBzdGF0ZSAoanVzdCB0aGUgbmV3IG1hcCkgc28gdGhpcyBpcyBzYWZlLlxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBBcnJheS5pc0FycmF5KHBhaXIudmFsdWUpXG4gICAgICAgICAgICA/IHBhaXIudmFsdWVcbiAgICAgICAgICAgIDogKFtwYWlyLnZhbHVlXSBhcyBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAgICAgLy8gVXBzZXJ0IGxlZ2FjeSBzZWFyY2ggYXR0cmlidXRlcyBpbnRvIHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvciB1bmRlZmluZWQsIGdvdCAke3Z9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGFuIGVtcHR5IGxpc3QsIHRoaXMgc2lnbmlmaWVzIGRlbGV0aW9uLlxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBib3RoIHVudHlwZWQgJiB0eXBlZCBzZWFyY2ggYXR0cmlidXRlcy5cbiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAvLyBXZSBjYW5ub3QgZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgZnJvbSB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAgLy8gSW5zdGVhZCwgd2UgZG8gYSBcImJlc3QgZWZmb3J0XCIgZGVsZXRpb24gZnJvbSB0eXBlZCBzZWFyY2ggYXR0cmlidXRlczpcbiAgICAgICAgICAvLyAtIGNoZWNrIGlmIGEgbWF0Y2hpbmcga2V5IG5hbWUgZXhpc3RzLCBpZiBzbywgcmVtb3ZlIGl0LlxuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSBrKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgICAgIHsga2V5OiBtYXRjaGluZ1BhaXIua2V5LCB2YWx1ZTogbnVsbCB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNba107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZvciB0aGUgdXBkYXRlLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IFR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRLZXlGcm9tVW50eXBlZChrLCB2KTtcblxuICAgICAgICAvLyBVbmFibGUgdG8gZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgKG5vIHZhbGlkIHR5cGUgZm9yIGRlZmluZWQgdmFsdWUpLlxuICAgICAgICAvLyBTa2lwIGFwcGx5aW5nIHRoaXMgdXBkYXRlIChuby1vcCkuXG4gICAgICAgIGlmICh0eXBlZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBURVhUIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSBhIHN0cmluZyB2YWx1ZSwgYnV0IGl0IGNvdWxkIGFsc28gYmUgS0VZV09SRC5cbiAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBwYWlyIGV4aXN0cyB3aXRoIEtFWVdPUkQgdHlwZSwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdURVhUJykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSB0eXBlZEtleS5uYW1lKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZEtleS50eXBlID0gbWF0Y2hpbmdQYWlyLmtleS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZTogdW5rbm93biA9IHY7XG4gICAgICAgIC8vIFVucGFjayB2YWx1ZSBpZiBpdCBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5LlxuICAgICAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHZbMF07XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSBiYWNrIHRvIERhdGUuXG4gICAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdEQVRFVElNRScpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3IERhdGUobmV3VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSB3aXRoIHZhbGlkIHR5cGUuIEFwcGx5IHRoZSB1cGRhdGUuXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFtcbiAgICAgICAgICB7IGtleTogdHlwZWRLZXksIHZhbHVlOiBuZXdWYWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgIF0pO1xuICAgICAgICBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluZm8sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IG5ld1NlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoaXMgV29ya2Zsb3cncyBNZW1vcyBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBgbWVtb2Agd2l0aCBleGlzdGluZ1xuICogTWVtb3MgKGFzIHJldHVybmVkIGJ5IGB3b3JrZmxvd0luZm8oKS5tZW1vYCkuXG4gKlxuICogTmV3IG1lbW8gaXMgbWVyZ2VkIGJ5IHJlcGxhY2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIG5hbWUgX2F0IHRoZSBmaXJzdFxuICogbGV2ZWwgb25seV8uIFNldHRpbmcgYSBwcm9wZXJ0eSB0byB2YWx1ZSBgdW5kZWZpbmVkYCBvciBgbnVsbGAgY2xlYXJzIHRoYXRcbiAqIGtleSBmcm9tIHRoZSBNZW1vLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiB1cHNlcnRNZW1vKHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTM6IHsgc3Via2V5MTogdmFsdWUgfVxuICogICBrZXk0OiB2YWx1ZSxcbiAqIH0pO1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTI6IHZhbHVlXG4gKiAgIGtleTM6IHsgc3Via2V5MjogdmFsdWUgfVxuICogICBrZXk0OiB1bmRlZmluZWQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIE1lbW86XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTI6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH0gIC8vIE5vdGUgdGhpcyBvYmplY3Qgd2FzIGNvbXBsZXRlbHkgcmVwbGFjZWRcbiAqICAgLy8gTm90ZSB0aGF0IGtleTQgd2FzIGNvbXBsZXRlbHkgcmVtb3ZlZFxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG1lbW8gVGhlIFJlY29yZCB0byBtZXJnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydE1lbW8obWVtbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnVwc2VydE1lbW8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG5cbiAgaWYgKG1lbW8gPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVtbyBtdXN0IGJlIGEgbm9uLW51bGwgUmVjb3JkJyk7XG4gIH1cblxuICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgIG1vZGlmeVdvcmtmbG93UHJvcGVydGllczoge1xuICAgICAgdXBzZXJ0ZWRNZW1vOiB7XG4gICAgICAgIGZpZWxkczogbWFwVG9QYXlsb2FkcyhcbiAgICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICAvLyBDb252ZXJ0IG51bGwgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG1lbW8pLm1hcCgoW2ssIHZdKSA9PiBbaywgdiA/PyB1bmRlZmluZWRdKSlcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHsgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyB9LCBteVdvcmtmbG93KTtcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFRvIGFubm90YXRlIGEgZGVmYXVsdCBvciBkeW5hbWljIHdvcmtmbG93OlxuICogYGBgdHNcbiAqIGV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICogICAvLyBXb3JrZmxvdyBjb2RlIGhlcmVcbiAqICAgcmV0dXJuIFwiaGlcIjtcbiAqIH1cbiAqIHNldFdvcmtmbG93T3B0aW9ucyh7IHZlcnNpb25pbmdCZWhhdmlvcjogJ1BJTk5FRCcgfSwgbW9kdWxlLmV4cG9ydHMuZGVmYXVsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgZGVmaW50aW9uLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBvcHRpb25zLiBJZiBhXG4gKiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgb25jZSBqdXN0IGJlZm9yZSB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGVcbiAqIGZpcnN0IHRpbWUuIEl0IGlzIHNhZmUgdG8gY2FsbCB7QGxpbmsgd29ya2Zsb3dJbmZvfSBpbnNpZGUgc3VjaCBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIFRoZSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdvcmtmbG93T3B0aW9uczxBIGV4dGVuZHMgYW55W10sIFJUPihcbiAgb3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyLFxuICBmbjogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8UlQ+XG4pOiB2b2lkIHtcbiAgT2JqZWN0LmFzc2lnbihmbiwge1xuICAgIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IG9wdGlvbnMsXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8c3RyaW5nPignX19zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IGVuaGFuY2VkU3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8RW5oYW5jZWRTdGFja1RyYWNlPignX19lbmhhbmNlZF9zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93TWV0YWRhdGFRdWVyeSA9IGRlZmluZVF1ZXJ5PHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KCdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RGV0YWlscygpOiBzdHJpbmcge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnZ2V0Q3VycmVudERldGFpbHMoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuY3VycmVudERldGFpbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50RGV0YWlscyhkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBhY3RpdmF0b3IuY3VycmVudERldGFpbHMgPSBkZXRhaWxzO1xufVxuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBoYW5kbGVyIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgY2xhc3MgcmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGFuZGxpbmcgb2YgYVxuICogTmV4dXMgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgYXMgYSBoYW5kbGVyIGVycm9yLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqICAgICBpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgYmFkIHJlcXVlc3QgZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgcmV0cnlhYmxlIGludGVybmFsIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIklOVEVSTkFMXCIsIFwiRGF0YWJhc2UgdW5hdmFpbGFibGVcIiwgeyByZXRyeWFibGVPdmVycmlkZTogdHJ1ZSB9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBIYW5kbGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgdHlwZXMuXG4gICAqXG4gICAqIElmIHRoZSBjb25zdHJ1Y3RvciByZWNlaXZlZCBhbiB1bmtub3duIHN0cmluZywgdGhpcyB3aWxsIGJlIGBcIlVOS05PV05cImAuXG4gICAqIFVzZSB7QGxpbmsgcmF3RXJyb3JUeXBlfSB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIHN0cmluZy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBIYW5kbGVyRXJyb3JUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGVycm9yIHR5cGUgc3RyaW5nLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgZXF1YWxzIHtAbGluayB0eXBlfS4gRm9yIHVua25vd24gdHlwZXMsIHRoaXMgcHJlc2VydmVzXG4gICAqIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZyB3aGlsZSB7QGxpbmsgdHlwZX0gaXMgc2V0IHRvIGBcIlVOS05PV05cImAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3RXJyb3JUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBzaG91bGQgYmUgY29uc2lkZXJlZCByZXRyeWFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSByZXRyeSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGVycm9yIHR5cGUuXG4gICAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBgSU5URVJOQUxgIGlzIHJldHJ5YWJsZSwgYnV0IGBVTkFWQUlMQUJMRWAgaXMgbm9uLXJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgc3BlY2lmaWVkLCBgcmV0cnlhYmxlT3ZlcnJpZGVgIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZXRyeSBiZWhhdmlvciBkZXRlcm1pbmVkIGJhc2VkIG9uXG4gICAqIHRoZSBlcnJvciB0eXBlLiBVc2Uge0BsaW5rIHJldHJ5YWJsZX0gdG8gZGV0ZXJtaW5lIHRoZSBlZmZlY3RpdmUgcmV0cnkgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZX0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IuIE11c3QgYmUgYSBrbm93biB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX0uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgaW5jbHVkaW5nIHRoZSBjYXVzZSBhbmQgcmV0cnlhYmxlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBIYW5kbGVyRXJyb3JUeXBlLCBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogSGFuZGxlckVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbE1lc3NhZ2UgPSBtZXNzYWdlIHx8IGBIYW5kbGVyIGVycm9yOiAke3R5cGV9YDtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKEhhbmRsZXJFcnJvclR5cGUsIHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIEhhbmRsZXJFcnJvclR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnJhd0Vycm9yVHlwZSA9IHR5cGUgPT09IFwiVU5LTk9XTlwiID8gKG9wdGlvbnM/LnJhd0Vycm9yVHlwZSA/PyB0eXBlKSA6IHR5cGU7XG4gICAgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9IG9wdGlvbnM/LnJldHJ5YWJsZU92ZXJyaWRlO1xuICAgIHRoaXMub3JpZ2luYWxGYWlsdXJlID0gb3B0aW9ucz8ub3JpZ2luYWxGYWlsdXJlO1xuICAgIGlmIChvcHRpb25zPy5zdGFja1RyYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBvcHRpb25zLnN0YWNrVHJhY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyByZXRyeWFibGUuXG4gICAqXG4gICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9IHByb3BlcnR5IGluIHRoYXQgYHJldHJ5YWJsZWAgdGFrZXMgaW50b1xuICAgKiBhY2NvdW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlc3VsdGluZyBmcm9tIHRoZSBlcnJvciB0eXBlLCBpZiBubyBvdmVycmlkZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9LlxuICAgKi9cbiAgcHVibGljIGdldCByZXRyeWFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGU7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBcIkJBRF9SRVFVRVNUXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIRU5USUNBVEVEXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIT1JJWkVEXCI6XG4gICAgICBjYXNlIFwiTk9UX0ZPVU5EXCI6XG4gICAgICBjYXNlIFwiTk9UX0lNUExFTUVOVEVEXCI6XG4gICAgICBjYXNlIFwiQ09ORkxJQ1RcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwiVU5BVkFJTEFCTEVcIjpcbiAgICAgIGNhc2UgXCJVUFNUUkVBTV9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCI6XG4gICAgICBjYXNlIFwiSU5URVJOQUxcIjpcbiAgICAgIGNhc2UgXCJSRVFVRVNUX1RJTUVPVVRcIjpcbiAgICAgIGNhc2UgXCJVTktOT1dOXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZvcmNlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG1pc3NpbmcgYSBjYXNlXG4gICAgICAgIGNvbnN0IF9ub01pc3NpbmdDYXNlOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZihIYW5kbGVyRXJyb3IsIFwiSGFuZGxlckVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBIYW5kbGVyRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgY2F1c2U/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBJZiBub3Qgc2V0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqL1xuICByZXRyeWFibGVPdmVycmlkZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBlcnJvciB0eXBlIHN0cmluZywgcHJlc2VydmluZyB0aGUgcmF3IHdpcmUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBrbm93biB0eXBlcywgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cbiAgICogV2hlbiB0aGUgZXJyb3IncyB0eXBlIGlzIHNldCB0byBgXCJVTktOT1dOXCJgLCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZy5cbiAgICovXG4gIHJhd0Vycm9yVHlwZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBIYW5kbGVyRXJyb3J9LCBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgTmV4dXMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJFcnJvclR5cGUgPSAodHlwZW9mIEhhbmRsZXJFcnJvclR5cGUpW2tleW9mIHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlXTtcbmV4cG9ydCBjb25zdCBIYW5kbGVyRXJyb3JUeXBlID0ge1xuICAvKipcbiAgICogVGhlIGVycm9yIHR5cGUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciBjYW5ub3Qgb3Igd2lsbCBub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYW4gYXBwYXJlbnQgY2xpZW50IGVycm9yLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIEJBRF9SRVFVRVNUOiBcIkJBRF9SRVFVRVNUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZGlkIG5vdCBzdXBwbHkgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBVTkFVVEhFTlRJQ0FURUQ6IFwiVU5BVVRIRU5USUNBVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIT1JJWkVEOiBcIlVOQVVUSE9SSVpFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCBidXQgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgTk9UX0ZPVU5EOiBcIk5PVF9GT1VORFwiLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gaXQgaGFzIGdpdmVuIHVwIGhhbmRsaW5nIGEgcmVxdWVzdC4gVGhpcyBtYXkgb2NjdXIgYnkgZW5mb3JjaW5nXG4gICAqIGEgY2xpZW50IHByb3ZpZGVkIGBSZXF1ZXN0LVRpbWVvdXRgIG9yIGZvciBhbnkgYXJiaXRyYXJ5IHJlYXNvbiBzdWNoIGFzIGVuZm9yY2luZyBzb21lXG4gICAqIGNvbmZpZ3VyYWJsZSBsaW1pdC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFJFUVVFU1RfVElNRU9VVDogXCJSRVFVRVNUX1RJTUVPVVRcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIG1hZGUgZHVlIHRvIGEgY29uZmxpY3QuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRyeWluZyB0byBjcmVhdGUgYW5cbiAgICogb3BlcmF0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIENPTkZMSUNUOiBcIkNPTkZMSUNUXCIsXG5cbiAgLyoqXG4gICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlIGVudGlyZSBmaWxlIHN5c3RlbVxuICAgKiBpcyBvdXQgb2Ygc3BhY2UuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsXG5cbiAgLyoqXG4gICAqIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgSU5URVJOQUw6IFwiSU5URVJOQUxcIixcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBlaXRoZXIgZG9lcyBub3QgcmVjb2duaXplIHRoZSByZXF1ZXN0IG1ldGhvZCwgb3IgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8gZnVsZmlsbCB0aGVcbiAgICogcmVxdWVzdC4gQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBOT1RfSU1QTEVNRU5URUQ6IFwiTk9UX0lNUExFTUVOVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOQVZBSUxBQkxFOiBcIlVOQVZBSUxBQkxFXCIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZ2F0ZXdheXMgdG8gcmVwb3J0IHRoYXQgYSByZXF1ZXN0IHRvIGFuIHVwc3RyZWFtIHNlcnZlciBoYXMgdGltZWQgb3V0LlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgVVBTVFJFQU1fVElNRU9VVDogXCJVUFNUUkVBTV9USU1FT1VUXCIsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IHsgdHlwZSBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuZXhwb3J0IHsgSGFuZGxlckVycm9yLCBIYW5kbGVyRXJyb3JUeXBlLCB0eXBlIEhhbmRsZXJFcnJvck9wdGlvbnMgfSBmcm9tIFwiLi9oYW5kbGVyLWVycm9yXCI7XG5leHBvcnQgeyB0eXBlIExpbmsgfSBmcm9tIFwiLi9saW5rXCI7XG5leHBvcnQge1xuICBPcGVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVyYXRpb25FcnJvclN0YXRlLFxuICB0eXBlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWVycm9yXCI7XG4iLCJpbXBvcnQgeyBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3ltYm9sLWluc3RhbmNlb2ZcIjtcbmltcG9ydCB0eXBlIHsgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcblxuLyoqXG4gKiBBIE5leHVzIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgdGhlIGFibm9ybWFsIGNvbXBsZXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24sXG4gKiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGFuIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgZmFpbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3IsIHdpdGggYSBjYXVzZVxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgY2FuY2VsZWQgb3BlcmF0aW9uIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiY2FuY2VsZWRcIiwgXCJVc2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb25cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IHJlc3VsdGVkIGluIHRoaXMgb3BlcmF0aW9uIGVycm9yLlxuICAgKi9cbiAgZGVjbGFyZSBwdWJsaWMgcmVhZG9ubHkgY2F1c2U6IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXh0cmEgb3B0aW9ucyBmb3IgdGhlIGVycm9yLCBlLmcuIHRoZSBjYXVzZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGUsXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogT3BlcmF0aW9uRXJyb3JPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IHN0YXRlID09PSBcImNhbmNlbGVkXCIgPyBgT3BlcmF0aW9uIGNhbmNlbGVkYCA6IGBPcGVyYXRpb24gZmFpbGVkYDtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZTtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoT3BlcmF0aW9uRXJyb3IsIFwiT3BlcmF0aW9uRXJyb3JcIik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBPcGVyYXRpb25FcnJvcn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQGlubGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHN0YXRlIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSA9IFwiZmFpbGVkXCIgfCBcImNhbmNlbGVkXCI7XG4iLCJleHBvcnQge1xuICB0eXBlIE9wZXJhdGlvbkNvbnRleHQsXG4gIHR5cGUgU3RhcnRPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIENhbmNlbE9wZXJhdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5cbmV4cG9ydCB7XG4gIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jLFxuICB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jLFxufSBmcm9tIFwiLi9zdGFydC1vcGVyYXRpb24tcmVzdWx0XCI7XG5cbmV4cG9ydCB7XG4gIC8vXG4gIHR5cGUgT3BlcmF0aW9uSGFuZGxlcixcbiAgdHlwZSBTeW5jT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWhhbmRsZXJcIjtcblxuZXhwb3J0IHtcbiAgU2VydmljZUhhbmRsZXIsXG4gIHNlcnZpY2VIYW5kbGVyLFxuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3IsXG4gIHR5cGUgU2VydmljZUhhbmRsZXJGb3IsXG59IGZyb20gXCIuL3NlcnZpY2UtaGFuZGxlclwiO1xuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHsgQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgU3RhcnRPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vb3BlcmF0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIE9wZXJhdGlvbklucHV0LFxuICBPcGVyYXRpb25LZXksXG4gIE9wZXJhdGlvbk1hcCxcbiAgT3BlcmF0aW9uT3V0cHV0LFxufSBmcm9tIFwiLi4vc2VydmljZVwiO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgYSBOZXh1cyBvcGVyYXRpb24uXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgTmV4dXMgc2VydmljZSBpbXBsZW1lbnRvcnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICAvKipcbiAgICogSGFuZGxlIHJlcXVlc3RzIHRvIHN0YXJ0IGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogUmV0dXJuIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfSB0byByZXNwb25kIHN1Y2Nlc3NmdWxseSBpbmxpbmUsIG9yXG4gICAqIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luY30gdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdhcyBzdGFydGVkLlxuICAgKiBUaHJvdyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9IHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBhcyBmYWlsZWQgb3IgY2FuY2VsZWQuXG4gICAqL1xuICBzdGFydChjdHg6IFN0YXJ0T3BlcmF0aW9uQ29udGV4dCwgaW5wdXQ6IEkpOiBQcm9taXNlPEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxPPj47XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBjYW5jZWwgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQ2FuY2VsYXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24gaXM6XG4gICAqIDEuIF9hc3luY2hyb25vdXNfIC0gcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2Qgb25seSBjb25maXJtcyB0aGF0IGNhbmNlbGF0aW9uIHdhcyBub3RpZmllZDtcbiAgICogICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBob3dldmVyIGNob29zZSB0byBwcm9jZXNzIHRoZSBjYW5jZWxsYXRpb24gYXQgYSBsYXRlciB0aW1lLCBvciB0b1xuICAgKiAgICBpZ25vcmUgaXQgZW50aXJlbHkuXG4gICAqIDIuIF9pZGVtcG90ZW50XyAtIGltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBkdXBsaWNhdGUgY2FuY2VsYXRpb25zIGZvciB0aGUgc2FtZSBvcGVyYXRpb24uXG4gICAqL1xuICBjYW5jZWwoY3R4OiBDYW5jZWxPcGVyYXRpb25Db250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHNob3J0Y3V0IGZvciBkZWZpbmluZyBhbiBvcGVyYXRpb24gaGFuZGxlciB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9XG4gKiBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm5zIGEge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmN9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gPSAoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKSA9PiBQcm9taXNlPE8+O1xuXG4vKipcbiAqIENvbXBpbGVzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGludG8gYSB7QGxpbmsgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyfS4gQSBjb21waWxlZCBvcGVyYXRpb25cbiAqIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYSBmdWxsLWZsZWRnZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVPcGVyYXRpb25IYW5kbGVyPEksIE8+KFxuICBkZWZpbml0aW9uOiBPcGVyYXRpb25EZWZpbml0aW9uPEksIE8+LFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCB1bmRlZmluZWQsXG4pOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBObyBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyAoZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSAnJHtkZWZpbml0aW9uLm5hbWV9JylgLFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9wZXJhdGlvbiBoYW5kbGVyIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBzaG9ydGN1dCBzeW50YXguIFdyYXAgaXQgaW50byBhIGZ1bGwtZmxlZGdlZCBoYW5kbGVyLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZpbml0aW9uLFxuXG4gICAgICBzdGFydDogYXN5bmMgKGN0eCwgaW5wdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKGF3YWl0IGhhbmRsZXIoY3R4LCBpbnB1dCkpO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogbm90SW1wbGVtZW50ZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5zdGFydCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSGFuZGxlciBmb3Igb3BlcmF0aW9uICcke2RlZmluaXRpb24ubmFtZX0nIGhhcyBubyBzdGFydCBtZXRob2RgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGVmaW5pdGlvbixcblxuICAgIC8vIERlZmVuc2l2ZWx5IGVuc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhbGwgdGhlIHJlcXVpcmVkIG1ldGhvZHMsXG4gICAgLy8gZGVmYXVsdGluZyB0byB0aHJvd2luZyBhIG5vdCBpbXBsZW1lbnRlZCBlcnJvciBpZiBzb21lIG1ldGhvZHMgYXJlIG1pc3NpbmcuXG4gICAgc3RhcnQ6IGhhbmRsZXIuc3RhcnQuYmluZChoYW5kbGVyKSxcbiAgICBjYW5jZWw6IGhhbmRsZXIuY2FuY2VsPy5iaW5kKGhhbmRsZXIpID8/IG5vdEltcGxlbWVudGVkLFxuICB9O1xufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgb3BlcmF0aW9uIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYVxuICogZnVsbC1mbGVkZ2VkIG9wZXJhdGlvbiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiAmIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz47XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+ID0gQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPFxuICBPcGVyYXRpb25JbnB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPixcbiAgT3BlcmF0aW9uT3V0cHV0PE9wc1tPcGVyYXRpb25LZXk8T3BzPl0+XG4+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBub3RJbXBsZW1lbnRlZCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIiwgXCJOb3QgaW1wbGVtZW50ZWRcIik7XG59XG4iLCJpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBPcGVyYXRpb25LZXksIE9wZXJhdGlvbk1hcCwgU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi4vc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yLFxuICBjb21waWxlT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbi8qKlxuICogQSBOZXh1cyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLCB0aGF0IHByb3ZpZGVzIGhhbmRsZXJzIGZvciBlYWNoIG9mIGl0cyBvcGVyYXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VIYW5kbGVyPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICAvKipcbiAgICogQnVpbGQgYSBgU2VydmljZUhhbmRsZXJgIGZyb20gYSBzZXJ2aWNlIGRlZmluaXRpb24gYW5kIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaGFuZGxlcnMuXG4gICAqXG4gICAqIFRoZXJlIG11c3QgYmUgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGV2ZXJ5IG9wZXJhdGlvbiBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVycyBUaGUgY29sbGVjdGlvbiBvZiBoYW5kbGVyc1xuICAgKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBoYW5kbGVyXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIGhhbmRsZXJzOiBTZXJ2aWNlSGFuZGxlckZvcjxPcHM+LFxuICApOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gbmV3IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgICAgY29uc3QgY29tcGlsZWRPcEhhbmRsZXIgPSBjb21waWxlT3BlcmF0aW9uSGFuZGxlcihkZWZpbml0aW9uLCBoYW5kbGVyc1twcm9wTmFtZV0pO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IGNvbXBpbGVkT3BIYW5kbGVyLm5hbWUgYXMgT3BlcmF0aW9uS2V5PE9wcz47XG5cbiAgICAgIGlmIChvcGVyYXRpb25zLmhhcyhvcGVyYXRpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBPcGVyYXRpb24gd2l0aCBuYW1lICcke29wZXJhdGlvbk5hbWV9JyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcGVyYXRpb25zLnNldChvcGVyYXRpb25OYW1lLCBjb21waWxlZE9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcihzZXJ2aWNlLCBoYW5kbGVycywgb3BlcmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIHB1YmxpYyByZWFkb25seSBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbnNNYXA6IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gYW5kIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZVxuICAgKi9cbiAgcHVibGljIGdldE9wZXJhdGlvbkhhbmRsZXI8SyBleHRlbmRzIE9wZXJhdGlvbktleTxPcHM+PihcbiAgICBvcGVyYXRpb25OYW1lOiBLLFxuICApOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLm9wZXJhdGlvbnNNYXAuZ2V0KG9wZXJhdGlvbk5hbWUpO1xuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFxuICAgICAgICBcIk5PVF9GT1VORFwiLFxuICAgICAgICBgT3BlcmF0aW9uIGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaW4gc2VydmljZSAnJHt0aGlzLmRlZmluaXRpb24ubmFtZX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBzZXJ2aWNlIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+KFxuICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbik6IFNlcnZpY2VIYW5kbGVyPE9wcz4ge1xuICByZXR1cm4gU2VydmljZUhhbmRsZXIuYnVpbGQoc2VydmljZSwgaGFuZGxlcnMpO1xufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IGRlZmluZXMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3I8VD4gPVxuICBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+XG4gICAgOiBuZXZlcjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbiBpbnRlcmZhY2VzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZUhhbmRsZXJGb3I8VCBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBPcGVyYXRpb25IYW5kbGVyRm9yPFRbS10+O1xufTtcbiIsIi8qKiBAaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCIgKi9cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBzeW1ib2wsIHVzZWQgdG8gcHJldmVudCBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlcy5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2wgPSBTeW1ib2woXCJfX25leHVzX2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0XCIpO1xuXG4vKipcbiAqIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSB7QGxpbmsgT3BlcmF0aW9uSGFuZGxlci5zdGFydH0gbWV0aG9kLlxuICpcbiAqIFVzZSBlaXRoZXIge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSBvciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jfVxuICogdG8gY3JlYXRlIGEgcmVzdWx0IG9iamVjdC4gRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmM8VD5cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYztcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0ID0ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGFuZCB3aWxsIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgYXN5bmModG9rZW46IHN0cmluZyk6IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogdHJ1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN5bmM8VD4odmFsdWU6IFQpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICBbU3ltYm9sLmhhc0luc3RhbmNlXTogZnVuY3Rpb24gKHRoaXM6IGFueSwgdmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgYW55KVtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF0gPT09IHRydWVcbiAgICApO1xuICB9LFxufTtcblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFVzZSB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IHRvIGNyZWF0ZSBhIHN5bmMgcmVzdWx0IG9iamVjdC5cbiAqIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKDQyKTtcbiAqIGBgYFxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQgPSB1bmtub3duPiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkgKGZhbHNlKSBvciB3aWxsIGNvbXBsZXRlXG4gICAqIGFzeW5jaHJvbm91c2x5ICh0cnVlKS5cbiAgICovXG4gIGlzQXN5bmM6IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICB2YWx1ZTogVDtcblxuICAvKipcbiAgICogUHJldmVudHMgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY30gdG8gY3JlYXRlIGFuIGFzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmMoXCJ1bmlxdWUgdG9rZW5cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmMge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBBIHRva2VuIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gaW4gZm9sbG93dXAgaGFuZGxlciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuZ2V0UmVzdWx0fVxuICAgKiBhbmQge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuY2FuY2VsfS5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb21tb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hhbmRsZXJcIjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgYnkgbWFwcGluZyBhbGwgc3RyaW5nIHByb3BlcnRpZXMgKGtleXMgYW5kIHZhbHVlcykgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0XG4gKiB0aHJvdWdoIGEgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgc291cmNlIG9iamVjdCwgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBmbiAtIFRoZSBtYXBwZXIgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXMgbWFwcGVkIHRvIHRoZSBuZXcgdHlwZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEtleVZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVT4oXG4gIG9iajogVCxcbiAgZm46IChrZXk6IGtleW9mIFQgJiBzdHJpbmcsIHZhbHVlOiBUW2tleW9mIFQgJiBzdHJpbmddKSA9PiBVLFxuKTogUmVjb3JkPGtleW9mIFQsIFU+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBmbihrZXksIHZhbHVlKV0pLFxuICApIGFzIFJlY29yZDxrZXlvZiBULCBVPjtcbn1cbiIsIi8qKlxuICogSW5qZWN0IGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIG9uIHRoZSBnaXZlbiBjbGFzcywgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2Y8RT4oY2xheno6IENsYXNzPEU+LCBtYXJrZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gSXQgbWF5IHNlZW0gcmVkdW5kYW50IHRvIGhhdmUgYW4gZXhwbGljaXQgbWFya2VyTmFtZSBhcmd1bWVudCBoZXJlLiBDYW4ndCB3ZSBzaW1wbHkgdXNlIHRoZSBjbGFzc1xuICAvLyBmdW5jdGlvbiBuYW1lIGZvciB0aGF0PyBVbmZvcnR1bmF0ZWx5LCBubywgYXMgdGhlIGNsYXNzIG5hbWUgbWF5IGdldCBtYW5nbGVkIGlmIHRoZSBmaWxlIGdldHMgbWluaWZpZWQuXG4gIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fbmV4dXNfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodmFsdWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBjbGFzcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzczxFPiB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59XG4iLCJpbXBvcnQgeyBtYXBLZXlWYWx1ZXMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQgeyBTaW1wbGlmeSB9IGZyb20gXCIuLi9pbnRlcm5hbC90eXBlc1wiO1xuaW1wb3J0IHsgaW5wdXRCcmFuZCwgb3V0cHV0QnJhbmQsIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkRlZmluaXRpb24sIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc2VydmljZSBkZWZpbml0aW9uIGZvciBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlPE9wcyBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+KFxuICBuYW1lOiBzdHJpbmcsXG4gIG9wZXJhdGlvbnM6IE9wcyxcbik6IFNlcnZpY2VEZWZpbml0aW9uPFNpbXBsaWZ5PE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+PiB7XG4gIGNvbnN0IHNlcnZpY2UgPSB7XG4gICAgbmFtZSxcbiAgICBvcGVyYXRpb25zOiBtYXBLZXlWYWx1ZXMob3BlcmF0aW9ucywgKGtleSwgb3A6IFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+KSA9PiAoe1xuICAgICAgLi4ub3AsXG4gICAgICBuYW1lOiBvcC5uYW1lIHx8IGtleSxcbiAgICB9KSksXG4gIH0gYXMgU2VydmljZURlZmluaXRpb248T3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8T3BzPj47XG5cbiAgdmFsaWRhdGVTZXJ2aWNlRGVmaW5pdGlvbihzZXJ2aWNlKTtcbiAgcmV0dXJuIHNlcnZpY2U7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIG9wZXJhdGlvbiBkZWZpbml0aW9uIGFzIHBhcnQgb2YgYSBzZXJ2aWNlIGNvbnRyYWN0LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxJLCBPPihvcD86IE9wZXJhdGlvbk9wdGlvbnM8SSwgTz4pOiBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgcmV0dXJuIHsgLi4ub3AgfSBhcyBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgb3BlcmF0aW9ufSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uT3B0aW9uczxfSSwgX08+IHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2YgcGFydGlhbCBvcGVyYXRpb24gaGFuZGxlcnMuIElucHV0IGZvciB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCB0cmFuc2Zvcm1zIGEge0BsaW5rIFBhcnRpYWxPcGVyYXRpb25NYXB9IGludG8gYW4ge0BsaW5rIE9wZXJhdGlvbk1hcH0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxUIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBUW0tdIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPlxuICAgIDogbmV2ZXI7XG59O1xuXG4vKipcbiAqIEEgcGFydGlhbCB7QGxpbmsgT3BlcmF0aW9uRGVmaW5pdGlvbn0gdGhhdCBpcyB1c2VkIHRvIGRlZmluZSBhbiBvcGVyYXRpb24gaW4gYSB7QGxpbmsgU2VydmljZURlZmluaXRpb259LlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IGlzIHRoYXQgdGhlIG5hbWUgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpYWxPcGVyYXRpb248SSwgTz4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBbaW5wdXRCcmFuZF06IEk7XG4gIFtvdXRwdXRCcmFuZF06IE87XG59XG4iLCJleHBvcnQge1xuICB0eXBlIFNlcnZpY2VEZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbklucHV0LFxuICB0eXBlIE9wZXJhdGlvbk91dHB1dCxcbiAgdHlwZSBPcGVyYXRpb25LZXksXG59IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG5leHBvcnQge1xuICBzZXJ2aWNlLFxuICBvcGVyYXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uT3B0aW9ucyxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsLFxuICB0eXBlIFBhcnRpYWxPcGVyYXRpb24sXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbiIsImV4cG9ydCBkZWNsYXJlIGNvbnN0IGlucHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBvdXRwdXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgTmV4dXMgc2VydmljZSBjb250cmFjdCwgaW5jbHVkaW5nIGl0cyBuYW1lIGFuZCBvcGVyYXRpb25zLlxuICpcbiAqIENhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IHRoZSB7QGxpbmsgc2VydmljZX0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VEZWZpbml0aW9uPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IE9wcztcbn1cblxuLyoqXG4gKiBBbiBvcGVyYXRpb24gY29udHJhY3QgdGhhdCBkZXNjcmliZXMgdGhlIG5hbWUsIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgY29sbGVjdGlvbiBvZiBvcGVyYXRpb25zLCBhcyBkZWZpbmVkIGJ5IGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIGlucHV0IHR5cGUgZnJvbSBhbiBvcGVyYXRpb24gaW4gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uSW5wdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBhbnk+ID8gSSA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIG91dHB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk91dHB1dDxUPiA9IFQgZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgaW5mZXIgTz4gPyBPIDogYW55O1xuXG4vKipcbiAqIEEgbWFwcGVkIHR5cGUgdGhhdCBleHRyYWN0cyBhbGwgb3BlcmF0aW9uIG5hbWVzIGZyb20gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uS2V5PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+ID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBDb25maXJtIHRoYXQgYSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgc2VydmljZSBkZWZpbml0aW9uIHRvIHZhbGlkYXRlLlxuICpcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZTogU2VydmljZURlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBzZXJ2aWNlLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIXNlcnZpY2UubmFtZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZXJ2aWNlIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gIH1cblxuICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgb3BlcmF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLm9wZXJhdGlvbnMpKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5uYW1lO1xuICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhb3BlcmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT3BlcmF0aW9uIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGZvciBwcm9wZXJ0eSAnJHtwcm9wTmFtZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25OYW1lcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYER1cGxpY2F0ZSBvcGVyYXRpb24gZGVmaW5pdGlvbiBmb3IgbmFtZTogJyR7b3BlcmF0aW9uTmFtZX0nYCk7XG4gICAgfVxuICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb25OYW1lKTtcbiAgfVxufVxuIiwiLyogKGlnbm9yZWQpICovIiwiLyogKGlnbm9yZWQpICovIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyBIZWxwZXJzLlxuY29uc3QgcyA9IDEwMDA7XG5jb25zdCBtID0gcyAqIDYwO1xuY29uc3QgaCA9IG0gKiA2MDtcbmNvbnN0IGQgPSBoICogMjQ7XG5jb25zdCB3ID0gZCAqIDc7XG5jb25zdCB5ID0gZCAqIDM2NS4yNTtcbmZ1bmN0aW9uIG1zKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM/LmxvbmcgPyBmbXRMb25nKHZhbHVlKSA6IGZtdFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGlzIG5vdCBhIHN0cmluZyBvciBudW1iZXIuJyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNFcnJvcihlcnJvcilcbiAgICAgICAgICAgID8gYCR7ZXJyb3IubWVzc2FnZX0uIHZhbHVlPSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWBcbiAgICAgICAgICAgIDogJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn1cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLicpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIGNvbnN0IHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdW5pdCAke3R5cGV9IHdhcyBtYXRjaGVkLCBidXQgbm8gbWF0Y2hpbmcgY2FzZSBleGlzdHMuYCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gbXM7XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGQpfWRgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGgpfWhgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG0pfW1gO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIHMpfXNgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9bXNgO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9IG1zYDtcbn1cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICBjb25zdCBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBuKX0gJHtuYW1lfSR7aXNQbHVyYWwgPyAncycgOiAnJ31gO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGVycm9ycy5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdtZXNzYWdlJyBpbiBlcnJvcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdDtcbiIsIi8vIEdFTkVSQVRFRCBGSUxFLiBETyBOT1QgRURJVC5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGZ1bmN0aW9uIHByZWZlckRlZmF1bHQoZXhwb3J0cykge1xuICAgIHJldHVybiBleHBvcnRzLmRlZmF1bHQgfHwgZXhwb3J0cztcbiAgfVxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBvcnRzID0ge307XG4gICAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgICAgcmV0dXJuIHByZWZlckRlZmF1bHQoZXhwb3J0cyk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiKSBtb2R1bGUuZXhwb3J0cyA9IHByZWZlckRlZmF1bHQoZXhwb3J0cyk7XG4gIH0gZWxzZSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBvcnRzID0ge307XG4gICAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgICAgZ2xvYmFsLkxvbmcgPSBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpO1xuICAgIH0pKCk7XG4gIH1cbn0pKFxuICB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIlxuICAgID8gZ2xvYmFsVGhpc1xuICAgIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgID8gc2VsZlxuICAgICAgOiB0aGlzLFxuICBmdW5jdGlvbiAoX2V4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgIH0pO1xuICAgIF9leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAwOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnNcbiAgICAgKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLlxuICAgICAqXG4gICAgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgICpcbiAgICAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgICpcbiAgICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgICAgKlxuICAgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gICAgICovXG5cbiAgICAvLyBXZWJBc3NlbWJseSBvcHRpbWl6YXRpb25zIHRvIGRvIG5hdGl2ZSBpNjQgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlkZVxuICAgIHZhciB3YXNtID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgd2FzbSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShcbiAgICAgICAgbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShcbiAgICAgICAgICBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAvLyBcXDBhc21cbiAgICAgICAgICAgIDAsIDk3LCAxMTUsIDEwOSxcbiAgICAgICAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgICAgICAgMSwgMCwgMCwgMCxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJ0eXBlXCJcbiAgICAgICAgICAgIDEsIDEzLCAyLFxuICAgICAgICAgICAgLy8gMCwgKCkgPT4gaTMyXG4gICAgICAgICAgICA5NiwgMCwgMSwgMTI3LFxuICAgICAgICAgICAgLy8gMSwgKGkzMiwgaTMyLCBpMzIsIGkzMikgPT4gaTMyXG4gICAgICAgICAgICA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgMywgNywgNixcbiAgICAgICAgICAgIC8vIDAsIHR5cGUgMFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIC8vIDEsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDIsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDMsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDQsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDUsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJnbG9iYWxcIlxuICAgICAgICAgICAgNiwgNiwgMSxcbiAgICAgICAgICAgIC8vIDAsIFwiaGlnaFwiLCBtdXRhYmxlIGkzMlxuICAgICAgICAgICAgMTI3LCAxLCA2NSwgMCwgMTEsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZXhwb3J0XCJcbiAgICAgICAgICAgIDcsIDUwLCA2LFxuICAgICAgICAgICAgLy8gMCwgXCJtdWxcIlxuICAgICAgICAgICAgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSxcbiAgICAgICAgICAgIC8vIDEsIFwiZGl2X3NcIlxuICAgICAgICAgICAgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMixcbiAgICAgICAgICAgIC8vIDIsIFwiZGl2X3VcIlxuICAgICAgICAgICAgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMyxcbiAgICAgICAgICAgIC8vIDMsIFwicmVtX3NcIlxuICAgICAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCxcbiAgICAgICAgICAgIC8vIDQsIFwicmVtX3VcIlxuICAgICAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSxcbiAgICAgICAgICAgIC8vIDUsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICAgICAgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJjb2RlXCJcbiAgICAgICAgICAgIDEwLCAxOTEsIDEsIDYsXG4gICAgICAgICAgICAvLyAwLCBcImdldF9oaWdoXCJcbiAgICAgICAgICAgIDQsIDAsIDM1LCAwLCAxMSxcbiAgICAgICAgICAgIC8vIDEsIFwibXVsXCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gMiwgXCJkaXZfc1wiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI3LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDMsIFwiZGl2X3VcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyA0LCBcInJlbV9zXCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gNSwgXCJyZW1fdVwiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTMwLCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICAge30sXG4gICAgICApLmV4cG9ydHM7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBubyB3YXNtIHN1cHBvcnQgOihcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciwgZ2l2ZW4gaXRzIGxvdyBhbmQgaGlnaCAzMiBiaXQgdmFsdWVzIGFzICpzaWduZWQqIGludGVnZXJzLlxuICAgICAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxuICAgICAqIEBleHBvcnRzIExvbmdcbiAgICAgKiBAY2xhc3MgQSBMb25nIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggVGhlIGhpZ2ggKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICovXG4gICAgICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdC5cbiAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICovXG4gICAgICB0aGlzLnVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIGlzIHRoZSB0d28gZ2l2ZW4gc2lnbmVkLCAzMi1iaXQgdmFsdWVzLlxuICAgIC8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXG4gICAgLy8gSmF2YXNjcmlwdCBwZXJmb3JtcyBiaXQtb3BlcmF0aW9ucy4gIEZvciBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kXG4gICAgLy8gbXVsdGlwbGljYXRpb24sIHdlIHNwbGl0IGVhY2ggbnVtYmVyIGludG8gMTYgYml0IHBpZWNlcywgd2hpY2ggY2FuIGVhc2lseSBiZVxuICAgIC8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XG4gICAgLy8gb3IgY2hhbmdlIGluIHNpZ24uXG4gICAgLy9cbiAgICAvLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXG4gICAgLy8gcG9zaXRpdmUgY2FzZSBieSBuZWdhdGluZyB0aGUgaW5wdXQocykgYW5kIHRoZW4gcG9zdC1wcm9jZXNzaW5nIHRoZSByZXN1bHQuXG4gICAgLy8gTm90ZSB0aGF0IHdlIG11c3QgQUxXQVlTIGNoZWNrIHNwZWNpYWxseSB3aGV0aGVyIHRob3NlIHZhbHVlcyBhcmUgTUlOX1ZBTFVFXG4gICAgLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xuICAgIC8vIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBvdmVyZmxvd3MgYmFjayBpbnRvIGEgbmVnYXRpdmUpLiAgTm90IGhhbmRsaW5nIHRoaXNcbiAgICAvLyBjYXNlIHdvdWxkIG9mdGVuIHJlc3VsdCBpbiBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgLy9cbiAgICAvLyBDb21tb24gY29uc3RhbnQgdmFsdWVzIFpFUk8sIE9ORSwgTkVHX09ORSwgZXRjLiBhcmUgZGVmaW5lZCBiZWxvdyB0aGUgZnJvbSpcbiAgICAvLyBtZXRob2RzIG9uIHdoaWNoIHRoZXkgZGVwZW5kLlxuXG4gICAgLyoqXG4gICAgICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBjb25zdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgTG9uZy5wcm90b3R5cGUuX19pc0xvbmdfXztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZy5wcm90b3R5cGUsIFwiX19pc0xvbmdfX1wiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcbiAgICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgbnVtYmVyXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdHozMih2YWx1ZSkge1xuICAgICAgdmFyIGMgPSBNYXRoLmNsejMyKHZhbHVlICYgLXZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZSA/IDMxIC0gYyA6IGM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmcuaXNMb25nID0gaXNMb25nO1xuXG4gICAgLyoqXG4gICAgICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUgeyFPYmplY3R9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIElOVF9DQUNIRSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUgeyFPYmplY3R9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFVJTlRfQ0FDSEUgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xuICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgIHZhbHVlID4+Pj0gMDtcbiAgICAgICAgaWYgKChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpKSB7XG4gICAgICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRVt2YWx1ZV07XG4gICAgICAgICAgaWYgKGNhY2hlZE9iaikgcmV0dXJuIGNhY2hlZE9iajtcbiAgICAgICAgfVxuICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgMCwgdHJ1ZSk7XG4gICAgICAgIGlmIChjYWNoZSkgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSB8PSAwO1xuICAgICAgICBpZiAoKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcbiAgICAgICAgICBjYWNoZWRPYmogPSBJTlRfQ0FDSEVbdmFsdWVdO1xuICAgICAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgICAgIH1cbiAgICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsIHZhbHVlIDwgMCA/IC0xIDogMCwgZmFsc2UpO1xuICAgICAgICBpZiAoY2FjaGUpIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiAzMiBiaXQgaW50ZWdlciB2YWx1ZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUludCA9IGZyb21JbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiBVWkVSTztcbiAgICAgICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKSByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1BWF9WQUxVRTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiBmcm9tTnVtYmVyKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB2YWx1ZSAlIFRXT19QV1JfMzJfREJMIHwgMCxcbiAgICAgICAgKHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmFsdWUsIHByb3ZpZGVkIHRoYXQgaXQgaXMgYSBmaW5pdGUgbnVtYmVyLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tTnVtYmVyID0gZnJvbU51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIDY0IGJpdCBpbnRlZ2VyIHRoYXQgY29tZXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gbG93IGFuZCBoaWdoIGJpdHMuIEVhY2ggaXNcbiAgICAgKiAgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0cyBUaGUgbG93IDMyIGJpdHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIHBvd19kYmwgPSBNYXRoLnBvdzsgLy8gVXNlZCA0IHRpbWVzICg0KjggdG8gMTUrNClcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICAgKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIHVuc2lnbmVkLCByYWRpeCkge1xuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHRocm93IEVycm9yKFwiZW1wdHkgc3RyaW5nXCIpO1xuICAgICAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAvLyBGb3IgZ29vZy5tYXRoLmxvbmcgY29tcGF0aWJpbGl0eVxuICAgICAgICByYWRpeCA9IHVuc2lnbmVkO1xuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzdHIgPT09IFwiTmFOXCIgfHxcbiAgICAgICAgc3RyID09PSBcIkluZmluaXR5XCIgfHxcbiAgICAgICAgc3RyID09PSBcIitJbmZpbml0eVwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCItSW5maW5pdHlcIlxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICAgICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG4gICAgICB2YXIgcDtcbiAgICAgIGlmICgocCA9IHN0ci5pbmRleE9mKFwiLVwiKSkgPiAwKSB0aHJvdyBFcnJvcihcImludGVyaW9yIGh5cGhlblwiKTtcbiAgICAgIGVsc2UgaWYgKHAgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gc2V2ZXJhbCAoOCkgZGlnaXRzIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLCBzbyBhcyB0b1xuICAgICAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gICAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XG4gICAgICB2YXIgcmVzdWx0ID0gWkVSTztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oOCwgc3RyLmxlbmd0aCAtIGkpLFxuICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLCBpICsgc2l6ZSksIHJhZGl4KTtcbiAgICAgICAgaWYgKHNpemUgPCA4KSB7XG4gICAgICAgICAgdmFyIHBvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCBzaXplKSk7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9uZ1xuICAgICAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfCF7bG93OiBudW1iZXIsIGhpZ2g6IG51bWJlciwgdW5zaWduZWQ6IGJvb2xlYW59fSB2YWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tVmFsdWUodmFsLCB1bnNpZ25lZCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHJldHVybiBmcm9tTnVtYmVyKHZhbCwgdW5zaWduZWQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBmcm9tU3RyaW5nKHZhbCwgdW5zaWduZWQpO1xuICAgICAgLy8gVGhyb3dzIGZvciBub24tb2JqZWN0cywgY29udmVydHMgbm9uLWluc3RhbmNlb2YgTG9uZzpcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdmFsLmxvdyxcbiAgICAgICAgdmFsLmhpZ2gsXG4gICAgICAgIHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJib29sZWFuXCIgPyB1bnNpZ25lZCA6IHZhbC51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfCF7bG93OiBudW1iZXIsIGhpZ2g6IG51bWJlciwgdW5zaWduZWQ6IGJvb2xlYW59fSB2YWwgVmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlO1xuXG4gICAgLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxuICAgIC8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzE2X0RCTCA9IDEgPDwgMTY7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzI0X0RCTCA9IDEgPDwgMjQ7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzY0X0RCTCA9IFRXT19QV1JfMzJfREJMICogVFdPX1BXUl8zMl9EQkw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzYzX0RCTCA9IFRXT19QV1JfNjRfREJMIC8gMjtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBaRVJPID0gZnJvbUludCgwKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25lZCB6ZXJvLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlpFUk8gPSBaRVJPO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBVbnNpZ25lZCB6ZXJvLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlVaRVJPID0gVVpFUk87XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE9ORSA9IGZyb21JbnQoMSk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk9ORSA9IE9ORTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBVbnNpZ25lZCBvbmUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuVU9ORSA9IFVPTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25lZCBuZWdhdGl2ZSBvbmUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTkVHX09ORSA9IE5FR19PTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDB4ZmZmZmZmZmYgfCAwLCAweDdmZmZmZmZmIHwgMCwgZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBzaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHhmZmZmZmZmZiB8IDAsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE1JTl9WQUxVRSA9IGZyb21CaXRzKDAsIDB4ODAwMDAwMDAgfCAwLCBmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XG5cbiAgICAvKipcbiAgICAgKiBAYWxpYXMgTG9uZy5wcm90b3R5cGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSAzMiBiaXQgaW50ZWdlciwgYXNzdW1pbmcgaXQgaXMgYSAzMiBiaXQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gdG9JbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlcigpIHtcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKVxuICAgICAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHN0cmluZyB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcocmFkaXgpIHtcbiAgICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gICAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpIHRocm93IFJhbmdlRXJyb3IoXCJyYWRpeFwiKTtcbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gXCIwXCI7XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTG9uZyB2YWx1ZSBiZWZvcmUgaXQgY2FuIGJlIG5lZ2F0ZWQsIHNvIHdlIHJlbW92ZVxuICAgICAgICAgIC8vIHRoZSBib3R0b20tbW9zdCBkaWdpdCBpbiB0aGlzIGJhc2UgYW5kIHRoZW4gcmVjdXJzZSB0byBkbyB0aGUgcmVzdC5cbiAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXG4gICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxuICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkgKyByZW0xLnRvSW50KCkudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFwiLVwiICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICAgICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxuICAgICAgICByZW0gPSB0aGlzO1xuICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxuICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxuICAgICAgICAgIGRpZ2l0cyA9IGludHZhbC50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJlbSA9IHJlbURpdjtcbiAgICAgICAgaWYgKHJlbS5pc1plcm8oKSkgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KSBkaWdpdHMgPSBcIjBcIiArIGRpZ2l0cztcbiAgICAgICAgICByZXN1bHQgPSBcIlwiICsgZGlnaXRzICsgcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgaGlnaCBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzVW5zaWduZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldExvd0JpdHMgPSBmdW5jdGlvbiBnZXRMb3dCaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBVbnNpZ25lZCBsb3cgYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXROdW1CaXRzQWJzID0gZnVuY3Rpb24gZ2V0TnVtQml0c0FicygpIHtcbiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSlcbiAgICAgICAgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gICAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pIGlmICgodmFsICYgKDEgPDwgYml0KSkgIT0gMCkgYnJlYWs7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoICE9IDAgPyBiaXQgKyAzMyA6IGJpdCArIDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZyBjYW4gYmUgc2FmZWx5IHJlcHJlc2VudGVkIGFzIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNTYWZlSW50ZWdlciA9IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIoKSB7XG4gICAgICAvLyAyXjUzLTEgaXMgdGhlIG1heGltdW0gc2FmZSB2YWx1ZVxuICAgICAgdmFyIHRvcDExQml0cyA9IHRoaXMuaGlnaCA+PiAyMTtcbiAgICAgIC8vIFswLCAyXjUzLTFdXG4gICAgICBpZiAoIXRvcDExQml0cykgcmV0dXJuIHRydWU7XG4gICAgICAvLyA+IDJeNTMtMVxuICAgICAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFstMl41MywgLTFdIGV4Y2VwdCAtMl41M1xuICAgICAgcmV0dXJuIHRvcDExQml0cyA9PT0gLTEgJiYgISh0aGlzLmxvdyA9PT0gMCAmJiB0aGlzLmhpZ2ggPT09IC0weDIwMDAwMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2lzWmVyb30uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5lcXogPSBMb25nUHJvdG90eXBlLmlzWmVybztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzTmVnYXRpdmUgPSBmdW5jdGlvbiBpc05lZ2F0aXZlKCkge1xuICAgICAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIHBvc2l0aXZlIG9yIHplcm8uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCB8fCB0aGlzLmhpZ2ggPj0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7XG4gICAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy51bnNpZ25lZCAhPT0gb3RoZXIudW5zaWduZWQgJiZcbiAgICAgICAgdGhpcy5oaWdoID4+PiAzMSA9PT0gMSAmJlxuICAgICAgICBvdGhlci5oaWdoID4+PiAzMSA9PT0gMVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcbiAgICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW59LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sdCA9IExvbmdQcm90b3R5cGUubGVzc1RoYW47XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPD0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3QgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID49IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gICAgICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgaWYgKHRoaXMuZXEob3RoZXIpKSByZXR1cm4gMDtcbiAgICAgIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXG4gICAgICAgIG90aGVyTmVnID0gb3RoZXIuaXNOZWdhdGl2ZSgpO1xuICAgICAgaWYgKHRoaXNOZWcgJiYgIW90aGVyTmVnKSByZXR1cm4gLTE7XG4gICAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpIHJldHVybiAxO1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc2lnbiBiaXRzIGFyZSB0aGUgc2FtZVxuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcy5zdWIob3RoZXIpLmlzTmVnYXRpdmUoKSA/IC0xIDogMTtcbiAgICAgIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxuICAgICAgcmV0dXJuIG90aGVyLmhpZ2ggPj4+IDAgPiB0aGlzLmhpZ2ggPj4+IDAgfHxcbiAgICAgICAgKG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiBvdGhlci5sb3cgPj4+IDAgPiB0aGlzLmxvdyA+Pj4gMClcbiAgICAgICAgPyAtMVxuICAgICAgICA6IDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvbXBhcmV9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxuICAgICAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvbXAgPSBMb25nUHJvdG90eXBlLmNvbXBhcmU7XG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gYWRkZW5kIEFkZGVuZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XG4gICAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKSBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcblxuICAgICAgLy8gRGl2aWRlIGVhY2ggbnVtYmVyIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gc3VtIHRoZSBjaHVua3MuXG5cbiAgICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYjQ4ID0gYWRkZW5kLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGIwMCA9IGFkZGVuZC5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYzQ4ID0gMCxcbiAgICAgICAgYzMyID0gMCxcbiAgICAgICAgYzE2ID0gMCxcbiAgICAgICAgYzAwID0gMDtcbiAgICAgIGMwMCArPSBhMDAgKyBiMDA7XG4gICAgICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgICAgIGMwMCAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTE2ICsgYjE2O1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEzMiArIGIzMjtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGM0OCArPSBhNDggKyBiNDg7XG4gICAgICBjNDggJj0gMHhmZmZmO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xuICAgICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gICAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3N1YnRyYWN0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHtcbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghaXNMb25nKG11bHRpcGxpZXIpKSBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIHZhciBsb3cgPSB3YXNtW1wibXVsXCJdKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBtdWx0aXBsaWVyLmxvdyxcbiAgICAgICAgICBtdWx0aXBsaWVyLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBtdWx0aXBsaWVyLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuICAgICAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllci5uZWcoKSk7XG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xuICAgICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsKG11bHRpcGxpZXIubmVnKCkpLm5lZygpO1xuXG4gICAgICAvLyBJZiBib3RoIGxvbmdzIGFyZSBzbWFsbCwgdXNlIGZsb2F0IG11bHRpcGxpY2F0aW9uXG4gICAgICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcihcbiAgICAgICAgICB0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcblxuICAgICAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gICAgICAvLyBXZSBjYW4gc2tpcCBwcm9kdWN0cyB0aGF0IHdvdWxkIG92ZXJmbG93LlxuXG4gICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGI0OCA9IG11bHRpcGxpZXIuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgICAgIHZhciBiMDAgPSBtdWx0aXBsaWVyLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBjNDggPSAwLFxuICAgICAgICBjMzIgPSAwLFxuICAgICAgICBjMTYgPSAwLFxuICAgICAgICBjMDAgPSAwO1xuICAgICAgYzAwICs9IGEwMCAqIGIwMDtcbiAgICAgIGMxNiArPSBjMDAgPj4+IDE2O1xuICAgICAgYzAwICY9IDB4ZmZmZjtcbiAgICAgIGMxNiArPSBhMTYgKiBiMDA7XG4gICAgICBjMzIgKz0gYzE2ID4+PiAxNjtcbiAgICAgIGMxNiAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTAwICogYjE2O1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEzMiAqIGIwMDtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMTYgKiBiMTY7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTAwICogYjMyO1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzQ4ICs9IGE0OCAqIGIwMCArIGEzMiAqIGIxNiArIGExNiAqIGIzMiArIGEwMCAqIGI0ODtcbiAgICAgIGM0OCAmPSAweGZmZmY7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxuICAgICAqICB1bnNpZ25lZCBpZiB0aGlzIExvbmcgaXMgdW5zaWduZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XG4gICAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcbiAgICAgIGlmIChkaXZpc29yLmlzWmVybygpKSB0aHJvdyBFcnJvcihcImRpdmlzaW9uIGJ5IHplcm9cIik7XG5cbiAgICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICAgICAgaWYgKHdhc20pIHtcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgICAgIC8vIG5lZ2F0aXZlIG51bWJlciAvIC0xIHdvdWxkIGJlIDEgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3RcbiAgICAgICAgLy8gcG9zaXRpdmUgbnVtYmVyLCBkdWUgdG8gdHdvJ3MgY29tcGxlbWVudC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLnVuc2lnbmVkICYmXG4gICAgICAgICAgdGhpcy5oaWdoID09PSAtMHg4MDAwMDAwMCAmJlxuICAgICAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJlxuICAgICAgICAgIGRpdmlzb3IuaGlnaCA9PT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICAgICAgdGhpcy5sb3csXG4gICAgICAgICAgdGhpcy5oaWdoLFxuICAgICAgICAgIGRpdmlzb3IubG93LFxuICAgICAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcbiAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICAgICAgICAvLyBjbG9zdXJlIGxpYnJhcnkgYXMgYSB3aG9sZS5cbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xuICAgICAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcbiAgICAgICAgICAgIHJldHVybiBNSU5fVkFMVUU7IC8vIHJlY2FsbCB0aGF0IC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFXG4gICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKSByZXR1cm4gT05FO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB8b3RoZXJ8ID49IDIsIHNvIHx0aGlzL290aGVyfCA8IHxNSU5fVkFMVUV8LlxuICAgICAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7XG4gICAgICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xuICAgICAgICAgICAgaWYgKGFwcHJveC5lcShaRVJPKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XG4gICAgICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpO1xuICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpO1xuICAgICAgICByZXMgPSBaRVJPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXG4gICAgICAgIC8vIHJlcXVpcmVkIHRvIHRha2Ugc3BlY2lhbCBjYXJlIG9mIHRoZSBNU0IgcHJpb3IgdG8gcnVubmluZyBpdC5cbiAgICAgICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKSBkaXZpc29yID0gZGl2aXNvci50b1Vuc2lnbmVkKCk7XG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKSByZXR1cm4gVVpFUk87XG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpXG4gICAgICAgICAgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcbiAgICAgICAgICByZXR1cm4gVU9ORTtcbiAgICAgICAgcmVzID0gVVpFUk87XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGVhdCB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSByZW1haW5kZXIgaXMgbGVzcyB0aGFuIG90aGVyOiAgZmluZCBhXG4gICAgICAvLyBmbG9hdGluZy1wb2ludCB0aGF0IGFwcHJveGltYXRlcyByZW1haW5kZXIgLyBvdGhlciAqZnJvbSBiZWxvdyosIGFkZCB0aGlzXG4gICAgICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XG4gICAgICAvLyB0aGUgYXBwcm94aW1hdGUgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSByZWFsIHZhbHVlIHNvIHRoYXQgdGhlXG4gICAgICAvLyByZW1haW5kZXIgbmV2ZXIgYmVjb21lcyBuZWdhdGl2ZS5cbiAgICAgIHJlbSA9IHRoaXM7XG4gICAgICB3aGlsZSAocmVtLmd0ZShkaXZpc29yKSkge1xuICAgICAgICAvLyBBcHByb3hpbWF0ZSB0aGUgcmVzdWx0IG9mIGRpdmlzaW9uLiBUaGlzIG1heSBiZSBhIGxpdHRsZSBncmVhdGVyIG9yXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxuICAgICAgICBhcHByb3ggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHJlbS50b051bWJlcigpIC8gZGl2aXNvci50b051bWJlcigpKSk7XG5cbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxuICAgICAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXG4gICAgICAgIHZhciBsb2cyID0gTWF0aC5jZWlsKE1hdGgubG9nKGFwcHJveCkgLyBNYXRoLkxOMiksXG4gICAgICAgICAgZGVsdGEgPSBsb2cyIDw9IDQ4ID8gMSA6IHBvd19kYmwoMiwgbG9nMiAtIDQ4KSxcbiAgICAgICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgICAgICAvLyB0aGF0IGlmIGl0IGlzIHRvbyBsYXJnZSwgdGhlIHByb2R1Y3Qgb3ZlcmZsb3dzIGFuZCBpcyBuZWdhdGl2ZS5cbiAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXG4gICAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcbiAgICAgICAgICBhcHByb3ggLT0gZGVsdGE7XG4gICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAgICAgLy8gaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHdlIHdvdWxkIG1ha2Ugbm8gcHJvZ3Jlc3MuXG4gICAgICAgIGlmIChhcHByb3hSZXMuaXNaZXJvKCkpIGFwcHJveFJlcyA9IE9ORTtcbiAgICAgICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpO1xuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZGl2aWRlfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcbiAgICAgIGlmICghaXNMb25nKGRpdmlzb3IpKSBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJyZW1fdVwiXSA6IHdhc21bXCJyZW1fc1wiXSkoXG4gICAgICAgICAgdGhpcy5sb3csXG4gICAgICAgICAgdGhpcy5oaWdoLFxuICAgICAgICAgIGRpdmlzb3IubG93LFxuICAgICAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm1vZCA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucmVtID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE5PVCBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHtcbiAgICAgIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRMZWFkaW5nWmVyb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID8gTWF0aC5jbHozMih0aGlzLmhpZ2gpIDogTWF0aC5jbHozMih0aGlzLmxvdykgKyAzMjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvdW50TGVhZGluZ1plcm9zfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY2x6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50VHJhaWxpbmdaZXJvcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdyA/IGN0ejMyKHRoaXMubG93KSA6IGN0ejMyKHRoaXMuaGlnaCkgKyAzMjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCB0cmFpbGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudFRyYWlsaW5nWmVyb3N9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jdHogPSBMb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHRoaXMubG93ICYgb3RoZXIubG93LFxuICAgICAgICB0aGlzLmhpZ2ggJiBvdGhlci5oaWdoLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdGhpcy5sb3cgfCBvdGhlci5sb3csXG4gICAgICAgIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIFhPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBnaXZlbiBvbmUuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB0aGlzLmxvdyBeIG90aGVyLmxvdyxcbiAgICAgICAgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIHNoaWZ0TGVmdChudW1CaXRzKSB7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICB0aGlzLmxvdyA8PCBudW1CaXRzLFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgZWxzZSByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0TGVmdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hsID0gTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLFxuICAgICAgICAgIHRoaXMuaGlnaCA+PiBudW1CaXRzLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4gKG51bUJpdHMgLSAzMiksXG4gICAgICAgICAgdGhpcy5oaWdoID49IDAgPyAwIDogLTEsXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgaWYgKG51bUJpdHMgPCAzMilcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4+IG51bUJpdHMsXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgMCwgdGhpcy51bnNpZ25lZCk7XG4gICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+PiAobnVtQml0cyAtIDMyKSwgMCwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7XG4gICAgICB2YXIgYjtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpO1xuICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xuICAgICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG51bUJpdHMgLT0gMzI7XG4gICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiBiKSxcbiAgICAgICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVMZWZ0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RsID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gcm90YXRlUmlnaHQobnVtQml0cykge1xuICAgICAgdmFyIGI7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBudW1CaXRzIC09IDMyO1xuICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZVJpZ2h0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RyID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodDtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2lnbmVkIGxvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7XG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFVuc2lnbmVkIGxvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvVW5zaWduZWQgPSBmdW5jdGlvbiB0b1Vuc2lnbmVkKCkge1xuICAgICAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkge1xuICAgICAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcbiAgICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGxvICYgMHhmZixcbiAgICAgICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgbG8gPj4+IDI0LFxuICAgICAgICBoaSAmIDB4ZmYsXG4gICAgICAgIChoaSA+Pj4gOCkgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIGhpID4+PiAyNCxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcbiAgICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGhpID4+PiAyNCxcbiAgICAgICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICAgICAgaGkgJiAweGZmLFxuICAgICAgICBsbyA+Pj4gMjQsXG4gICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIGxvICYgMHhmZixcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICAgICAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIHVuc2lnbmVkLCBsZSkge1xuICAgICAgcmV0dXJuIGxlXG4gICAgICAgID8gTG9uZy5mcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpXG4gICAgICAgIDogTG9uZy5mcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcbiAgICAgIHJldHVybiBuZXcgTG9uZyhcbiAgICAgICAgYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkgfCAoYnl0ZXNbMl0gPDwgMTYpIHwgKGJ5dGVzWzNdIDw8IDI0KSxcbiAgICAgICAgYnl0ZXNbNF0gfCAoYnl0ZXNbNV0gPDwgOCkgfCAoYnl0ZXNbNl0gPDwgMTYpIHwgKGJ5dGVzWzddIDw8IDI0KSxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzQkUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpIHtcbiAgICAgIHJldHVybiBuZXcgTG9uZyhcbiAgICAgICAgKGJ5dGVzWzRdIDw8IDI0KSB8IChieXRlc1s1XSA8PCAxNikgfCAoYnl0ZXNbNl0gPDwgOCkgfCBieXRlc1s3XSxcbiAgICAgICAgKGJ5dGVzWzBdIDw8IDI0KSB8IChieXRlc1sxXSA8PCAxNikgfCAoYnl0ZXNbMl0gPDwgOCkgfCBieXRlc1szXSxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBTdXBwb3J0IGNvbnZlcnNpb24gdG8vZnJvbSBCaWdJbnQgd2hlcmUgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBCaWdJbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpZyBpbnRlZ2VyLlxuICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIGJpZyBpbnRlZ2VyIHZhbHVlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgICAqL1xuICAgICAgTG9uZy5mcm9tQmlnSW50ID0gZnVuY3Rpb24gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgICAgdmFyIGxvd0JpdHMgPSBOdW1iZXIoQmlnSW50LmFzSW50TigzMiwgdmFsdWUpKTtcbiAgICAgICAgdmFyIGhpZ2hCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlID4+IEJpZ0ludCgzMikpKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgTG9uZy5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWVXaXRoQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gTG9uZy5mcm9tQmlnSW50KHZhbHVlLCB1bnNpZ25lZCk7XG4gICAgICAgIHJldHVybiBmcm9tVmFsdWUodmFsdWUsIHVuc2lnbmVkKTtcbiAgICAgIH07XG5cbiAgICAgIC8qKlxuICAgICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gaXRzIGJpZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICogQHRoaXMgeyFMb25nfVxuICAgICAgICogQHJldHVybnMge2JpZ2ludH1cbiAgICAgICAqL1xuICAgICAgTG9uZ1Byb3RvdHlwZS50b0JpZ0ludCA9IGZ1bmN0aW9uIHRvQmlnSW50KCkge1xuICAgICAgICB2YXIgbG93QmlnSW50ID0gQmlnSW50KHRoaXMubG93ID4+PiAwKTtcbiAgICAgICAgdmFyIGhpZ2hCaWdJbnQgPSBCaWdJbnQodGhpcy51bnNpZ25lZCA/IHRoaXMuaGlnaCA+Pj4gMCA6IHRoaXMuaGlnaCk7XG4gICAgICAgIHJldHVybiAoaGlnaEJpZ0ludCA8PCBCaWdJbnQoMzIpKSB8IGxvd0JpZ0ludDtcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGVmYXVsdCA9IChfZXhwb3J0cy5kZWZhdWx0ID0gTG9uZyk7XG4gIH0sXG4pO1xuIiwiLyoqXG4gKiBTY2hlZHVsZS1jbG9jayBUZW1wb3JhbCB3aXJlIGlkZW50aWZpZXJzIGFuZCB0aGUgdGljaydzIG91dGNvbWVcbiAqIHZvY2FidWxhcnkg4oCUIHBvcnRzIHRoZSBjb25zdGFudHMgb2YgcGtnL2RvbWFpbi9zY2hlZHVsZS90ZW1wb3JhbFxuICogKGFydGlmYWN0LmdvLCB0aWNrX2FjdGl2aXRpZXMuZ28pLlxuICpcbiAqIEV2ZXJ5IHZhbHVlIGhlcmUgaXMgYSBieXRlLXBpbm5lZCBjcm9zcy1yZXBvIHdpcmUgY29uc3RhbnQ6IHRoZSBjbG91ZFxuICogSmF2YSBTY2hlZHVsZUFydGlmYWN0LCB0aGUgaW50ZWdyYXRpb24gaGFybmVzcydzIFNjaGVkdWxlSW5zcGVjdG9yLCBhbmRcbiAqIGJvdGggc2VydmVyIGVkaXRpb25zIGFkZHJlc3MgYXJ0aWZhY3RzLCB3b3JrZmxvd3MsIGFuZCBhY3Rpdml0aWVzIGJ5XG4gKiB0aGVzZSBleGFjdCBzdHJpbmdzIOKAlCBjaGFuZ2luZyBvbmUgb24gYW55IHNpZGUgc3RyYW5kcyBldmVyeSBleGlzdGluZ1xuICogYXJ0aWZhY3QuIFRoZSBvdXRjb21lIHZvY2FidWxhcnkgcmlkZXMgVGVtcG9yYWwncyBKU09OIGRhdGEgY29udmVydGVyXG4gKiBpbnRvIHJlY29yZGVkIGhpc3Rvcmllcywgc28gdGhlIFNUUklORyBWQUxVRVMgYW5kIHRoZSBSdW5TdGFydCAvXG4gKiBGYWlsdXJlUmVjb3JkZWQgRklFTEQgTkFNRVMgYXJlIHJlcGxheSBjb250cmFjdCB0b28uXG4gKlxuICogSW1wb3J0ZWQgYnkgQk9USCB0aGUgd29ya2Zsb3cgYnVuZGxlIGFuZCBob3N0IGNvZGUg4oCUIG5vIG5vZGUgYnVpbHQtaW5zLFxuICogbm8gZnJhbWV3b3JrIGltcG9ydHMgKHRoZSB3b3JrZmxvdy1idW5kbGUgaW1wb3J0IGRpc2NpcGxpbmUpLlxuICovXG5cbi8qKlxuICogVGhlIHRpY2sgd29ya2Zsb3cncyByZWdpc3RlcmVkIHR5cGUgYW5kIHRoZSBhcnRpZmFjdC1pZCBwcmVmaXgncyBzdGVtXG4gKiAoR28gVGlja1dvcmtmbG93VHlwZSkuIFRoZSBhcnRpZmFjdCdzIGJha2VkIGFjdGlvbiBzdGFydHMgdGhpcyBleGFjdFxuICogdHlwZSBuYW1lIOKAlCBhIHJlbmFtZSB3b3VsZCBmYWlsIGV2ZXJ5IGZpcmUgd2l0aCBcIndvcmtmbG93IHR5cGUgbm90XG4gKiBmb3VuZFwiLlxuICovXG5leHBvcnQgY29uc3QgVElDS19XT1JLRkxPV19UWVBFID0gXCJzY2hlZHVsZS90aWNrXCI7XG5cbi8qKlxuICogUHJlZml4ZXMgZWFjaCBTY2hlZHVsZSByZXNvdXJjZSdzIFRlbXBvcmFsIFNjaGVkdWxlIGFydGlmYWN0IGlkOlxuICogc2NoZWR1bGUvdGljay97c2NoZWR1bGVSZXNvdXJjZUlkfSAoR28gVGlja0lEUHJlZml4KS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRJQ0tfSURfUFJFRklYID0gYCR7VElDS19XT1JLRkxPV19UWVBFfS9gO1xuXG4vKipcbiAqIFRoZSBjbG91ZCB3cml0ZS1wYXRoJ3MgdGhyb3dhd2F5IGZpcmUtdGltZSBwcm9iZXMgKEdvIHByb2JlSURQcmVmaXgpLlxuICogT1NTIG5ldmVyIGNyZWF0ZXMgcHJvYmVzIChubyBwcmUtcGVyc2lzdCBwcm9iZSDigJQgREQtMDE1IEQtQSksIGJ1dCB0aGVcbiAqIHJlY29uY2lsZXIgc2tpcHMgdGhlIHByZWZpeCBkZWZlbnNpdmVseSBzbyBhIHNoYXJlZC9kZXYgbmFtZXNwYWNlIG5ldmVyXG4gKiBnZXRzIGl0cyBwcm9iZXMgdHJlYXRlZCBhcyB0aWNrIG9ycGhhbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQUk9CRV9JRF9QUkVGSVggPSBcInNjaGVkdWxlL3Byb2JlL1wiO1xuXG4vKiogVGhlIFRlbXBvcmFsIFNjaGVkdWxlIGFydGlmYWN0IGlkIGZvciBhIFNjaGVkdWxlIHJlc291cmNlIGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFydGlmYWN0SWQoc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVElDS19JRF9QUkVGSVggKyBzY2hlZHVsZVJlc291cmNlSWQ7XG59XG5cbi8qKiBJbnZlcnRzIGFydGlmYWN0SWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VJZE9mKGFydGlmYWN0SWRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFydGlmYWN0SWRWYWx1ZS5zdGFydHNXaXRoKFRJQ0tfSURfUFJFRklYKVxuICAgID8gYXJ0aWZhY3RJZFZhbHVlLnNsaWNlKFRJQ0tfSURfUFJFRklYLmxlbmd0aClcbiAgICA6IGFydGlmYWN0SWRWYWx1ZTtcbn1cblxuLy8g4pSA4pSA4pSAIEFjdGl2aXR5IG5hbWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2xhc2gtbmFtZXNwYWNlZCBsaWtlIHRoZSBwbGF0Zm9ybSdzIG90aGVyIEdvLW93bmVkIHN5c3RlbSBhY3Rpdml0aWVzLFxuLy8gcmVnaXN0ZXJlZCBieSB0aGUgc2NoZWR1bGUgd29ya2VyIHVuZGVyIHRoZXNlIGV4YWN0IG5hbWVzLlxuXG5leHBvcnQgY29uc3QgUkVDT1JEX1RJQ0tfQUNUSVZJVFlfTkFNRSA9IFwic3RpZ21lci9zY2hlZHVsZS9yZWNvcmQtdGlja1wiO1xuZXhwb3J0IGNvbnN0IFNUQVJUX1NDSEVEVUxFRF9SVU5fQUNUSVZJVFlfTkFNRSA9IFwic3RpZ21lci9zY2hlZHVsZS9zdGFydC1ydW5cIjtcbmV4cG9ydCBjb25zdCBQT0xMX0VYRUNVVElPTl9QSEFTRV9BQ1RJVklUWV9OQU1FID1cbiAgXCJzdGlnbWVyL3NjaGVkdWxlL3BvbGwtcGhhc2VcIjtcbmV4cG9ydCBjb25zdCBSRUNPUkRfU1VDQ0VTU0ZVTF9SVU5fQUNUSVZJVFlfTkFNRSA9XG4gIFwic3RpZ21lci9zY2hlZHVsZS9yZWNvcmQtc3VjY2Vzc1wiO1xuZXhwb3J0IGNvbnN0IFJFQ09SRF9GQUlMRURfUlVOX0FDVElWSVRZX05BTUUgPVxuICBcInN0aWdtZXIvc2NoZWR1bGUvcmVjb3JkLWZhaWx1cmVcIjtcblxuLy8g4pSA4pSA4pSAIFRoZSB0aWNrJ3Mgb3V0Y29tZSB2b2NhYnVsYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3RyaW5nLXR5cGVkIHNvIHRoZSBKU09OIGRhdGEgY29udmVydGVyIHNlcmlhbGl6ZXMgdGhlbSBzdGFibHkgYWNyb3NzXG4vLyByZWxlYXNlczsgdGhlIFZBTFVFUyBtaXJyb3IgdGhlIGNsb3VkIGVkaXRpb24ncyBlbnVtcyBuYW1lLWZvci1uYW1lXG4vLyAob25lIHJ1bmJvb2ssIHR3byBlZGl0aW9ucykg4oCUIEdvIHRpY2tfYWN0aXZpdGllcy5nby5cblxuLyoqIHJlY29yZFRpY2sncyB2ZXJkaWN0IG9uIHdoZXRoZXIgdGhpcyBmaXJlIHByb2NlZWRzIChHbyBUaWNrT3V0Y29tZSkuICovXG5leHBvcnQgdHlwZSBUaWNrT3V0Y29tZSA9XG4gIHwgXCJGSVJFRFwiXG4gIHwgXCJTS0lQUEVEX0RFTEVURURcIlxuICB8IFwiU0tJUFBFRF9ESVNBQkxFRFwiXG4gIHwgXCJTS0lQUEVEX0FVVE9fUEFVU0VEXCI7XG5cbmV4cG9ydCBjb25zdCBUSUNLX0ZJUkVEID0gXCJGSVJFRFwiIHNhdGlzZmllcyBUaWNrT3V0Y29tZTtcbmV4cG9ydCBjb25zdCBUSUNLX1NLSVBQRURfREVMRVRFRCA9IFwiU0tJUFBFRF9ERUxFVEVEXCIgc2F0aXNmaWVzIFRpY2tPdXRjb21lO1xuZXhwb3J0IGNvbnN0IFRJQ0tfU0tJUFBFRF9ESVNBQkxFRCA9IFwiU0tJUFBFRF9ESVNBQkxFRFwiIHNhdGlzZmllcyBUaWNrT3V0Y29tZTtcbmV4cG9ydCBjb25zdCBUSUNLX1NLSVBQRURfQVVUT19QQVVTRUQgPSBcIlNLSVBQRURfQVVUT19QQVVTRURcIiBzYXRpc2ZpZXMgVGlja091dGNvbWU7XG5cbi8qKiBzdGFydFNjaGVkdWxlZFJ1bidzIHZlcmRpY3Qgb24gdGhlIHJ1biBzdGFydCAoR28gUnVuT3V0Y29tZSkuICovXG5leHBvcnQgdHlwZSBSdW5PdXRjb21lID1cbiAgfCBcIlNUQVJURURcIlxuICB8IFwiQUxSRUFEWV9TVEFSVEVEXCJcbiAgfCBcIlNLSVBQRURcIlxuICB8IFwiVEFSR0VUX01JU1NJTkdcIlxuICB8IFwiUkVGVVNFRFwiO1xuXG5leHBvcnQgY29uc3QgUlVOX1NUQVJURUQgPSBcIlNUQVJURURcIiBzYXRpc2ZpZXMgUnVuT3V0Y29tZTtcbmV4cG9ydCBjb25zdCBSVU5fQUxSRUFEWV9TVEFSVEVEID0gXCJBTFJFQURZX1NUQVJURURcIiBzYXRpc2ZpZXMgUnVuT3V0Y29tZTtcbmV4cG9ydCBjb25zdCBSVU5fU0tJUFBFRCA9IFwiU0tJUFBFRFwiIHNhdGlzZmllcyBSdW5PdXRjb21lO1xuZXhwb3J0IGNvbnN0IFJVTl9UQVJHRVRfTUlTU0lORyA9IFwiVEFSR0VUX01JU1NJTkdcIiBzYXRpc2ZpZXMgUnVuT3V0Y29tZTtcbmV4cG9ydCBjb25zdCBSVU5fUkVGVVNFRCA9IFwiUkVGVVNFRFwiIHNhdGlzZmllcyBSdW5PdXRjb21lO1xuXG4vKiogVGhlIHRyYWNrZWQgZXhlY3V0aW9uJ3Mgb2JzZXJ2ZWQgcGhhc2UgY2xhc3MgKEdvIFJ1blBoYXNlKS4gKi9cbmV4cG9ydCB0eXBlIFJ1blBoYXNlID1cbiAgfCBcIlJVTk5JTkdcIlxuICB8IFwiQ09NUExFVEVEXCJcbiAgfCBcIkZBSUxFRFwiXG4gIHwgXCJDQU5DRUxMRURcIlxuICB8IFwiVEVSTUlOQVRFRFwiXG4gIHwgXCJHT05FXCI7XG5cbmV4cG9ydCBjb25zdCBQSEFTRV9SVU5OSU5HID0gXCJSVU5OSU5HXCIgc2F0aXNmaWVzIFJ1blBoYXNlO1xuZXhwb3J0IGNvbnN0IFBIQVNFX0NPTVBMRVRFRCA9IFwiQ09NUExFVEVEXCIgc2F0aXNmaWVzIFJ1blBoYXNlO1xuZXhwb3J0IGNvbnN0IFBIQVNFX0ZBSUxFRCA9IFwiRkFJTEVEXCIgc2F0aXNmaWVzIFJ1blBoYXNlO1xuZXhwb3J0IGNvbnN0IFBIQVNFX0NBTkNFTExFRCA9IFwiQ0FOQ0VMTEVEXCIgc2F0aXNmaWVzIFJ1blBoYXNlO1xuZXhwb3J0IGNvbnN0IFBIQVNFX1RFUk1JTkFURUQgPSBcIlRFUk1JTkFURURcIiBzYXRpc2ZpZXMgUnVuUGhhc2U7XG5leHBvcnQgY29uc3QgUEhBU0VfR09ORSA9IFwiR09ORVwiIHNhdGlzZmllcyBSdW5QaGFzZTtcblxuLyoqIFdoaWNoIHBhdGggZmVkIHRoZSBzdHJlYWssIGZvciB0aGUgbG9nIGxpbmUgKEdvIEZhaWx1cmVLaW5kKS4gKi9cbmV4cG9ydCB0eXBlIEZhaWx1cmVLaW5kID0gXCJTVEFSVF9GQUlMRURcIiB8IFwiUlVOX0ZBSUxFRFwiIHwgXCJSVU5fVElNRURfT1VUXCI7XG5cbmV4cG9ydCBjb25zdCBGQUlMVVJFX1NUQVJUX0ZBSUxFRCA9IFwiU1RBUlRfRkFJTEVEXCIgc2F0aXNmaWVzIEZhaWx1cmVLaW5kO1xuZXhwb3J0IGNvbnN0IEZBSUxVUkVfUlVOX0ZBSUxFRCA9IFwiUlVOX0ZBSUxFRFwiIHNhdGlzZmllcyBGYWlsdXJlS2luZDtcbmV4cG9ydCBjb25zdCBGQUlMVVJFX1JVTl9USU1FRF9PVVQgPSBcIlJVTl9USU1FRF9PVVRcIiBzYXRpc2ZpZXMgRmFpbHVyZUtpbmQ7XG5cbi8qKlxuICogc3RhcnRTY2hlZHVsZWRSdW4ncyBmdWxsIGFuc3dlciAoR28gUnVuU3RhcnQpLiBUaGUgdHJhY2tpbmcgYnVkZ2V0IHJpZGVzXG4gKiB0aGUgYWN0aXZpdHkgUkVTVUxUIHNvIHdvcmtmbG93IHRpbWluZyBkZXJpdmVzIGZyb20gcmVjb3JkZWQgaGlzdG9yeSDigJQgYVxuICogY29uZmlnIGZsaXAgY2FuIG5ldmVyIGNvbmZ1c2UgYW4gaW4tZmxpZ2h0IHJlcGxheS4gRmllbGQgbmFtZXMgYXJlIHRoZVxuICogcmVjb3JkZWQtaGlzdG9yeSBKU09OIGNvbnRyYWN0IChHbydzIGpzb24gdGFncyksIG5ldmVyIHJlbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGFydCB7XG4gIG91dGNvbWU6IFJ1bk91dGNvbWU7XG4gIC8qKiBTZXQgZXhhY3RseSB3aGVuIG91dGNvbWUg4oiIIHtTVEFSVEVELCBBTFJFQURZX1NUQVJURUR9LiAqL1xuICBleGVjdXRpb25JZDogc3RyaW5nO1xuICAvKiogVGhpcyBmaXJlJ3MgdHJhY2tpbmcgYnVkZ2V0LCBhbHJlYWR5IGNsYW1wZWQuICovXG4gIHRyYWNraW5nVGltZW91dE1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBkZXRlcm1pbmlzdGljIHN0YXJ0LWZhaWx1cmUgY29weSB3aGVuIG91dGNvbWUg4oiIIHtUQVJHRVRfTUlTU0lORyxcbiAgICogUkVGVVNFRH0uXG4gICAqL1xuICBmYWlsdXJlUmVhc29uOiBzdHJpbmc7XG59XG5cbi8qKiByZWNvcmRGYWlsZWRSdW4ncyBwb3N0LWltYWdlIHN1bW1hcnkgKEdvIEZhaWx1cmVSZWNvcmRlZCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmVSZWNvcmRlZCB7XG4gIGNvbnNlY3V0aXZlRmFpbHVyZXM6IG51bWJlcjtcbiAgcGF1c2VkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpdml0eSBzdXJmYWNlIHRoZSB0aWNrIHdvcmtmbG93IHByb3hpZXMsIGtleWVkIGJ5IHRoZSBwaW5uZWRcbiAqIHNsYXNoIG5hbWVzICh0aGUgVFMgU0RLIHJlZ2lzdGVycyBhbmQgaW52b2tlcyBhY3Rpdml0aWVzIGJ5IG9iamVjdCBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlVGlja0FjdGl2aXRpZXMge1xuICBbUkVDT1JEX1RJQ0tfQUNUSVZJVFlfTkFNRV06IChcbiAgICBzY2hlZHVsZVJlc291cmNlSWQ6IHN0cmluZyxcbiAgICBub21pbmFsRmlyZVRpbWVSZmMzMzM5OiBzdHJpbmcsXG4gICkgPT4gUHJvbWlzZTxUaWNrT3V0Y29tZT47XG4gIFtTVEFSVF9TQ0hFRFVMRURfUlVOX0FDVElWSVRZX05BTUVdOiAoXG4gICAgc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbm9taW5hbEZpcmVUaW1lUmZjMzMzOTogc3RyaW5nLFxuICApID0+IFByb21pc2U8UnVuU3RhcnQ+O1xuICBbUE9MTF9FWEVDVVRJT05fUEhBU0VfQUNUSVZJVFlfTkFNRV06IChcbiAgICBleGVjdXRpb25JZDogc3RyaW5nLFxuICApID0+IFByb21pc2U8UnVuUGhhc2U+O1xuICBbUkVDT1JEX1NVQ0NFU1NGVUxfUlVOX0FDVElWSVRZX05BTUVdOiAoXG4gICAgc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgW1JFQ09SRF9GQUlMRURfUlVOX0FDVElWSVRZX05BTUVdOiAoXG4gICAgc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAga2luZDogRmFpbHVyZUtpbmQsXG4gICkgPT4gUHJvbWlzZTxGYWlsdXJlUmVjb3JkZWQ+O1xufVxuIiwiLyoqXG4gKiBXb3JrZmxvdyBiYXJyZWwg4oCUIHRoZSBlbnRyeSBwb2ludCBmb3IgVGVtcG9yYWwncyB3b3JrZmxvdyBidW5kbGVyICh0aGVcbiAqIGFnZW50ZXhlY3V0aW9uIHByZWNlZGVudCkuIEVTMjAyMiBhcmJpdHJhcnkgbW9kdWxlIGV4cG9ydCBuYW1lcyBtYXAgdGhlXG4gKiBUeXBlU2NyaXB0IGZ1bmN0aW9uIHRvIHRoZSBzbGFzaC1kZWxpbWl0ZWQsIGJ5dGUtcGlubmVkIHdvcmtmbG93IHR5cGVcbiAqIHRoZSBhcnRpZmFjdCdzIGJha2VkIGFjdGlvbiBzdGFydHMgKFwic2NoZWR1bGUvdGlja1wiLCAuLi9uYW1lcy50cykuXG4gKlxuICogV09SS0ZMT1ctQlVORExFIElNUE9SVCBESVNDSVBMSU5FOiBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIHRoaXMgbW9kdWxlXG4gKiBydW5zIGluIHRoZSBkZXRlcm1pbmlzdGljIHNhbmRib3gg4oCUIG5vIG5vZGUgYnVpbHQtaW5zLCBub1xuICogc3RvcmUvdHJhbnNwb3J0IGltcG9ydHMgKHNlZSB0aWNrLnRzJ3MgaGVhZGVyKS5cbiAqL1xuZXhwb3J0IHsgdGljayBhcyBcInNjaGVkdWxlL3RpY2tcIiB9IGZyb20gXCIuL3RpY2suanNcIjtcbiIsIi8qKlxuICogVGhlIHRpY2sgd29ya2Zsb3cg4oCUIHBvcnRzIHBrZy9kb21haW4vc2NoZWR1bGUvdGVtcG9yYWwvdGlja193b3JrZmxvdy5nbzpcbiAqIG9uZSBzY2hlZHVsZSBmaXJlLCBzcGFubmluZyBpdHMgcnVuIChERC0wMTMgdmlhIERELTAxNSk6IHJlY29yZCB0aGVcbiAqIGZpcmUsIHN0YXJ0IHRoZSBydW4sIHBvbGwgaXQgdG8gYSB0ZXJtaW5hbCBwaGFzZSwgcmVjb3JkIHRoZSB2ZXJkaWN0LlxuICogU3Bhbm5pbmcgaXMgd2hhdCBtYWtlcyB0aGUgYXJ0aWZhY3QncyBvdmVybGFwIFNLSVAgZ2VudWluZWx5IG1lYW4gXCJuZXZlclxuICogc3RhcnQgYSBydW4gd2hpbGUgdGhlIGxhc3QgaXMgYWN0aXZlXCIsIGFuZCB0aGUgdmVyZGljdCBpcyB3aGF0IGZlZWRzIHRoZVxuICogZmFpbHVyZSBzdHJlYWsgYmVoaW5kIHRoZSBwbGF0Zm9ybSBhdXRvLXBhdXNlLlxuICpcbiAqIFdIWSBBIFRJTUVSLURSSVZFTiBQT0xMIEFORCBOT1QgVEhFIENBTExCQUNLIFRPS0VOIOKAlCByZWFkIGJlZm9yZVxuICogXCJmaXhpbmdcIiB0aGlzLiBUaGUgcGxhdGZvcm0gYWxyZWFkeSB1c2VzIGFzeW5jIGFjdGl2aXR5IGNvbXBsZXRpb24gZm9yXG4gKiBjYWxsOmFnZW50LCBzbyB0aGUgdG9rZW4gaXMgdGhlIHRlbXB0aW5nIHNoYXBlIGhlcmUgdG9vLiBJdCBsb3NlcyBvblxuICogZ3JvdW5kcyB0aGF0IGFyZSBlZGl0aW9uLW5ldXRyYWwgKERELTAxNSBELUUpOiB0aGUgdG9rZW4gY2Fubm90IGJlXG4gKiByZS1hcm1lZCBhZnRlciBhIGNyZWF0ZS10aGVuLWNyYXNoLCBhbmQgaXRzIGNvbXBsZXRpb24gZmlyZSBpc1xuICogYmVzdC1lZmZvcnQg4oCUIHR3byBzaWxlbnQtaGFuZyBtb2RlcyBvbiBhIHN1cmZhY2Ugd2hlcmUgYSBoYW5nIGlzIGFcbiAqIHNpbGVuY2VkIHJlbWluZGVyLiBUaGUgcG9sbCBob2xkcyBubyB3b3JrZXIgdGhyZWFkICh0aGUgd29ya2Zsb3cgaXNcbiAqIGRvcm1hbnQgYmV0d2VlbiBwb2xsczsgZWFjaCBwb2xsIGlzIGEgbWlsbGlzZWNvbmQgYWN0aXZpdHkpLCBpcyBib3VuZGVkXG4gKiB0d2ljZSAoYnVkZ2V0ICsgTUFYX1RSQUNLSU5HX0NZQ0xFUyksIGFuZCBrZWVwcyBPTkUgdmVyZGljdCBtYXRyaXhcbiAqIGFjcm9zcyBib3RoIGVkaXRpb25zLlxuICpcbiAqIEZPUldBUkQgQ09OU1RSQUlOVDogdGlja3MgbGl2ZSBmb3IgbWludXRlcy10by1hbi1ob3VyIG9uY2UgdHJhY2tpbmcgaXNcbiAqIHJlYWwsIGFuZCBPU1MgcmVsZWFzZXMgY3V0IGV2ZXJ5IDEtMyBkYXlzIOKAlCBhbiBpbi1mbGlnaHQgdGljayBXSUxMXG4gKiBzdHJhZGRsZSBhIGJpbmFyeSB1cGdyYWRlLiBBbnkgYmVoYXZpb3JhbCBjaGFuZ2UgdG8gdGhpcyB3b3JrZmxvdyBib2R5XG4gKiBtdXN0IGJlIGdhdGVkIHdpdGggcGF0Y2hlZCgpL2RlcHJlY2F0ZVBhdGNoKCkgKE9ELTYgZGlzY2lwbGluZSksIGFuZCB0aGVcbiAqIHJlcGxheSBnYXRlIChfX3Rlc3RzX18vcmVwbGF5LnRlc3QudHMpIG11c3Qgc3RheSBncmVlbiBhZ2FpbnN0IHRoZVxuICogY29tbWl0dGVkIGhpc3Rvcmllcy5cbiAqXG4gKiBFUlJPUiBQT1NUVVJFICh0aGUgIzE4IHBhbmVsIGxlc3NvbiwgYXBwbGllZCBmcm9tIGRheSBvbmUpOiBHbydzXG4gKiBgcmV0dXJuIGVycmAgZmFpbHMgdGhlIFdPUktGTE9XIEVYRUNVVElPTjsgYSBwbGFpbiB0aHJvd24gRXJyb3IgaW4gdGhlXG4gKiBUUyBzYW5kYm94IGZhaWxzIG9ubHkgdGhlIHdvcmtmbG93IFRBU0sgYW5kIHJldHJpZXMgZm9yZXZlci4gRXZlcnkgR29cbiAqIGVycm9yIHJldHVybiBpcyB0aGVyZWZvcmUgYW4gQXBwbGljYXRpb25GYWlsdXJlIGhlcmUuIENhbmNlbGxhdGlvblxuICogKHNsZWVwIHRocm93aW5nIENhbmNlbGxlZEZhaWx1cmUpIHByb3BhZ2F0ZXMgdW50b3VjaGVkIOKAlCBHbydzXG4gKiB3b3JrZmxvdy5TbGVlcCBlcnJvciByZXR1cm4sIHNhbWUgdGVybWluYWwgb3V0Y29tZS5cbiAqXG4gKiBXT1JLRkxPVy1CVU5ETEUgSU1QT1JUIERJU0NJUExJTkU6IHRoaXMgbW9kdWxlIHJ1bnMgaW4gdGhlIGRldGVybWluaXN0aWNcbiAqIHNhbmRib3gg4oCUIGltcG9ydHMgYXJlIGxpbWl0ZWQgdG8gQHRlbXBvcmFsaW8vd29ya2Zsb3csIEB0ZW1wb3JhbGlvL2NvbW1vbixcbiAqIGFuZCB0aGUgcHVyZSBuYW1lcyBtb2R1bGUuXG4gKi9cbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgaXNDYW5jZWxsYXRpb24sXG4gIHByb3h5QWN0aXZpdGllcyxcbiAgc2xlZXAsXG4gIHdvcmtmbG93SW5mbyxcbiAgbG9nLFxufSBmcm9tIFwiQHRlbXBvcmFsaW8vd29ya2Zsb3dcIjtcbmltcG9ydCB7XG4gIFNlYXJjaEF0dHJpYnV0ZVR5cGUsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSBcIkB0ZW1wb3JhbGlvL2NvbW1vblwiO1xuXG5pbXBvcnQge1xuICBGQUlMVVJFX1JVTl9GQUlMRUQsXG4gIEZBSUxVUkVfUlVOX1RJTUVEX09VVCxcbiAgRkFJTFVSRV9TVEFSVF9GQUlMRUQsXG4gIFBIQVNFX0NPTVBMRVRFRCxcbiAgUEhBU0VfR09ORSxcbiAgUEhBU0VfUlVOTklORyxcbiAgUkVDT1JEX0ZBSUxFRF9SVU5fQUNUSVZJVFlfTkFNRSxcbiAgUkVDT1JEX1NVQ0NFU1NGVUxfUlVOX0FDVElWSVRZX05BTUUsXG4gIFJFQ09SRF9USUNLX0FDVElWSVRZX05BTUUsXG4gIFBPTExfRVhFQ1VUSU9OX1BIQVNFX0FDVElWSVRZX05BTUUsXG4gIFJVTl9BTFJFQURZX1NUQVJURUQsXG4gIFJVTl9SRUZVU0VELFxuICBSVU5fU0tJUFBFRCxcbiAgUlVOX1NUQVJURUQsXG4gIFJVTl9UQVJHRVRfTUlTU0lORyxcbiAgU1RBUlRfU0NIRURVTEVEX1JVTl9BQ1RJVklUWV9OQU1FLFxuICBUSUNLX0ZJUkVELFxuICBhcnRpZmFjdElkLFxuICB0eXBlIEZhaWx1cmVSZWNvcmRlZCxcbiAgdHlwZSBSdW5QaGFzZSxcbiAgdHlwZSBSdW5TdGFydCxcbiAgdHlwZSBTY2hlZHVsZVRpY2tBY3Rpdml0aWVzLFxufSBmcm9tIFwiLi4vbmFtZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHJhY2tpbmcgbG9vcCdzIGNvZGUtbGV2ZWwgYmFja3N0b3AsIG9uIHRvcCBvZiB0aGUgcGVyLWZpcmUgYnVkZ2V0OlxuICogMjQwIHBvbGxzIGF0IHRoZSBjYXBwZWQgYmFja29mZiBpcyB+My45IGhvdXJzIGFuZCB+MSwyMDAgaGlzdG9yeVxuICogZXZlbnRzIOKAlCB0aGUgbG9vcCBjYW4gbmV2ZXIgb3V0Z3JvdyBhIHdvcmtmbG93IGhpc3RvcnkgZXZlbiBpZiBhIGJ1ZGdldFxuICogaXMgbWlzY29uZmlndXJlZCAoR28gTWF4VHJhY2tpbmdDeWNsZXM7IGV4cG9ydGVkIHNvIHRoZSBib3VuZCB0ZXN0IGNhblxuICogYXNzZXJ0IGl0KS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UUkFDS0lOR19DWUNMRVMgPSAyNDA7XG5cbi8qKlxuICogVGhlIG5vbWluYWwgZmlyZSB0aW1lIFRlbXBvcmFsIHN0YW1wcyBvbiBldmVyeSBzY2hlZHVsZS1zdGFydGVkXG4gKiB3b3JrZmxvdyDigJQgdGllciBvbmUgb2YgdGhlIG5vbWluYWwtdGltZSBkZXJpdmF0aW9uIChwcmVzZW50IG9uIGNyb25cbiAqIGZpcmVzIEFORCBtYW51YWwgdHJpZ2dlcnMgYWxpa2U7IEdvIHNjaGVkdWxlZFN0YXJ0VGltZUtleSkuXG4gKi9cbmNvbnN0IFNDSEVEVUxFRF9TVEFSVF9USU1FX0tFWSA9IGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleShcbiAgXCJUZW1wb3JhbFNjaGVkdWxlZFN0YXJ0VGltZVwiLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FLFxuKTtcblxuLy8gVGhlIHRocmVlIGFjdGl2aXR5LW9wdGlvbiBjb250ZXh0cyAoR28gdGlja193b3JrZmxvdy5nbykuIFJlY29yZCBzdHViOlxuLy8gc2hvcnQgaWRlbXBvdGVudCBzdGF0dXMgd3JpdGVzLCByZXRyaWVkIGZyZWVseS5cbmNvbnN0IHJlY29yZEFjdGl2aXRpZXMgPSBwcm94eUFjdGl2aXRpZXM8U2NoZWR1bGVUaWNrQWN0aXZpdGllcz4oe1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBcIjMwIHNlY29uZHNcIixcbiAgcmV0cnk6IHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IDMsXG4gICAgaW5pdGlhbEludGVydmFsOiBcIjUgc2Vjb25kc1wiLFxuICAgIGJhY2tvZmZDb2VmZmljaWVudDogMi4wLFxuICB9LFxufSk7XG4vLyBSdW4tc3RhcnQgc3R1YjogZW50ZXJzIHRoZSBmdWxsIGNyZWF0ZSBwaXBlbGluZSAoc2Vzc2lvbiwgY29udGV4dCxcbi8vIHdvcmtmbG93IHN0YXJ0KSDigJQgbWludXRlcy1zY2FsZSB0aW1lb3V0LCBzdGlsbCByZXRyaWVkICh0aGVcbi8vIGRldGVybWluaXN0aWMgZXhlY3V0aW9uIG5hbWUgYWJzb3JicyByZXRyaWVzKS5cbmNvbnN0IHN0YXJ0QWN0aXZpdGllcyA9IHByb3h5QWN0aXZpdGllczxTY2hlZHVsZVRpY2tBY3Rpdml0aWVzPih7XG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IFwiMyBtaW51dGVzXCIsXG4gIHJldHJ5OiB7XG4gICAgbWF4aW11bUF0dGVtcHRzOiAzLFxuICAgIGluaXRpYWxJbnRlcnZhbDogXCI1IHNlY29uZHNcIixcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IDIuMCxcbiAgfSxcbn0pO1xuLy8gRmFpbHVyZS1yZWNvcmQgc3R1YjogRVhBQ1RMWSBPTkUgYXR0ZW1wdCDigJQgdGhlIHN0cmVhayBpbmNyZW1lbnQgaXMgdGhlXG4vLyBjbG9jaydzIHNpbmdsZSBub24taWRlbXBvdGVudCB3cml0ZS4gQSByZXRyeSBhZnRlciBhIHN1Y2Nlc3NmdWwgd3JpdGVcbi8vIG92ZXItY291bnRzIGFuZCBwYXVzZXMgYSBoZWFsdGh5IHNjaGVkdWxlIGVhcmx5OyBhIGxvc3Qgd3JpdGVcbi8vIHVuZGVyLWNvdW50cywgd2hpY2ggZmFpbHMgc2FmZS5cbmNvbnN0IGZhaWx1cmVBY3Rpdml0aWVzID0gcHJveHlBY3Rpdml0aWVzPFNjaGVkdWxlVGlja0FjdGl2aXRpZXM+KHtcbiAgc3RhcnRUb0Nsb3NlVGltZW91dDogXCIzMCBzZWNvbmRzXCIsXG4gIHJldHJ5OiB7IG1heGltdW1BdHRlbXB0czogMSB9LFxufSk7XG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIHRpY2sgKEdvIFRpY2tXb3JrZmxvdy5SdW47IHJlZ2lzdGVyZWQgYXMgXCJzY2hlZHVsZS90aWNrXCJcbiAqIHZpYSB0aGUgYmFycmVsKS4gVGhlIHNpbmdsZSBhcmd1bWVudCBpcyB0aGUgc2NoZWR1bGUgcmVzb3VyY2UgaWRcbiAqIChUZW1wb3JhbCBiYWtlcyBhY3Rpb24gYXJncyBvbmNlIOKAlCB0aGUgbm9taW5hbCBmaXJlIHRpbWUgaXMgZGVyaXZlZCxcbiAqIG5ldmVyIGNhcnJpZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGljayhzY2hlZHVsZVJlc291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub21pbmFsID0gbm9taW5hbEZpcmVUaW1lKHNjaGVkdWxlUmVzb3VyY2VJZCk7XG4gIGNvbnN0IG5vbWluYWxSZmMzMzM5ID0gcmZjMzMzOVNlY29uZHMobm9taW5hbCk7XG5cbiAgY29uc3QgdGlja091dGNvbWUgPSBhd2FpdCBmYWlsaW5nKFxuICAgIFwicmVjb3JkIHRpY2tcIixcbiAgICByZWNvcmRBY3Rpdml0aWVzW1JFQ09SRF9USUNLX0FDVElWSVRZX05BTUVdKFxuICAgICAgc2NoZWR1bGVSZXNvdXJjZUlkLFxuICAgICAgbm9taW5hbFJmYzMzMzksXG4gICAgKSxcbiAgKTtcbiAgaWYgKHRpY2tPdXRjb21lICE9PSBUSUNLX0ZJUkVEKSB7XG4gICAgbG9nLmluZm8oXCJTY2hlZHVsZSB0aWNrIGNvbXBsZXRlXCIsIHtcbiAgICAgIHNjaGVkdWxlX2lkOiBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICBub21pbmFsX2ZpcmVfdGltZTogbm9taW5hbFJmYzMzMzksXG4gICAgICBvdXRjb21lOiB0aWNrT3V0Y29tZSxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBydW5TdGFydCA9IGF3YWl0IGZhaWxpbmcoXG4gICAgXCJzdGFydCBzY2hlZHVsZWQgcnVuXCIsXG4gICAgc3RhcnRBY3Rpdml0aWVzW1NUQVJUX1NDSEVEVUxFRF9SVU5fQUNUSVZJVFlfTkFNRV0oXG4gICAgICBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICBub21pbmFsUmZjMzMzOSxcbiAgICApLFxuICApO1xuXG4gIHN3aXRjaCAocnVuU3RhcnQub3V0Y29tZSkge1xuICAgIGNhc2UgUlVOX1NLSVBQRUQ6XG4gICAgICBsb2cuaW5mbyhcIlNjaGVkdWxlIHRpY2sgY29tcGxldGVcIiwge1xuICAgICAgICBzY2hlZHVsZV9pZDogc2NoZWR1bGVSZXNvdXJjZUlkLFxuICAgICAgICBub21pbmFsX2ZpcmVfdGltZTogbm9taW5hbFJmYzMzMzksXG4gICAgICAgIHJ1bl9vdXRjb21lOiBydW5TdGFydC5vdXRjb21lLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBSVU5fVEFSR0VUX01JU1NJTkc6XG4gICAgY2FzZSBSVU5fUkVGVVNFRDoge1xuICAgICAgLy8gVGhlIHJ1biBuZXZlciBleGlzdGVkOiB0aGUgc3RyZWFrIGNvdW50cyB0aGUgZmlyZSwgdGhlIGNvbXBsZXRpb25cbiAgICAgIC8vIHZlcmRpY3RzIGRvIG5vdC5cbiAgICAgIGNvbnN0IHJlY29yZGVkID0gYXdhaXQgZmFpbGluZyhcbiAgICAgICAgXCJyZWNvcmQgc3RhcnQgZmFpbHVyZVwiLFxuICAgICAgICBmYWlsdXJlQWN0aXZpdGllc1tSRUNPUkRfRkFJTEVEX1JVTl9BQ1RJVklUWV9OQU1FXShcbiAgICAgICAgICBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICAgICAgcnVuU3RhcnQuZmFpbHVyZVJlYXNvbixcbiAgICAgICAgICBGQUlMVVJFX1NUQVJUX0ZBSUxFRCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcIlNjaGVkdWxlIHRpY2sgY29tcGxldGVcIiwge1xuICAgICAgICBzY2hlZHVsZV9pZDogc2NoZWR1bGVSZXNvdXJjZUlkLFxuICAgICAgICBub21pbmFsX2ZpcmVfdGltZTogbm9taW5hbFJmYzMzMzksXG4gICAgICAgIHJ1bl9vdXRjb21lOiBydW5TdGFydC5vdXRjb21lLFxuICAgICAgICB2ZXJkaWN0OiBcInN0YXJ0X2ZhaWxlZFwiLFxuICAgICAgICBjb25zZWN1dGl2ZV9mYWlsdXJlczogcmVjb3JkZWQuY29uc2VjdXRpdmVGYWlsdXJlcyxcbiAgICAgICAgcGF1c2VkOiByZWNvcmRlZC5wYXVzZWQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FzZSBSVU5fU1RBUlRFRDpcbiAgICBjYXNlIFJVTl9BTFJFQURZX1NUQVJURUQ6XG4gICAgICBhd2FpdCB0cmFja1J1bihzY2hlZHVsZVJlc291cmNlSWQsIG5vbWluYWxSZmMzMzM5LCBydW5TdGFydCk7XG4gICAgICByZXR1cm47XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQ29tcGlsZS10aW1lIGV4aGF1c3RpdmVuZXNzOyB0aGUgcnVudGltZSB0aHJvdyBzdGFuZHMgZm9yXG4gICAgICAvLyBkZXNlcmlhbGl6ZWQgaGlzdG9yeSBkYXRhIG91dHNpZGUgdGhlIHVuaW9uLlxuICAgICAgY29uc3QgZXhoYXVzdGl2ZTogbmV2ZXIgPSBydW5TdGFydC5vdXRjb21lO1xuICAgICAgdGhyb3cgQXBwbGljYXRpb25GYWlsdXJlLm5vblJldHJ5YWJsZShcbiAgICAgICAgYHVua25vd24gcnVuIG91dGNvbWUgXCIke1N0cmluZyhleGhhdXN0aXZlKX1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBydW4gdG8gYSB0ZXJtaW5hbCBwaGFzZSB3aXRoaW4gdGhpcyBmaXJlJ3MgYnVkZ2V0IGFuZCByZWNvcmRzXG4gKiB0aGUgdmVyZGljdCAoR28gdHJhY2tSdW4pLlxuICovXG5hc3luYyBmdW5jdGlvbiB0cmFja1J1bihcbiAgc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcsXG4gIG5vbWluYWxSZmMzMzM5OiBzdHJpbmcsXG4gIHJ1blN0YXJ0OiBSdW5TdGFydCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBydW5TdGFydC50cmFja2luZ1RpbWVvdXRNaW51dGVzICogNjBfMDAwO1xuXG4gIGxldCBwaGFzZTogUnVuUGhhc2UgPSBQSEFTRV9SVU5OSU5HO1xuICBsZXQgYnVkZ2V0RXhoYXVzdGVkID0gZmFsc2U7XG4gIC8vIFBvbGwtZmlyc3QsIGRlYWRsaW5lIGNoZWNrZWQgYWZ0ZXIgZWFjaCBwb2xsIGFuZCBiZWZvcmUgZWFjaCBzbGVlcDogYW5cbiAgLy8gQUxSRUFEWV9TVEFSVEVEIHJldHJ5IG1heSBhbHJlYWR5IGJlIHRlcm1pbmFsLCBhbmQgdGhlIGxvb3AgbXVzdCBuZXZlclxuICAvLyBzbGVlcCBwYXN0IGl0cyBvd24gZGVhZGxpbmUuXG4gIGZvciAobGV0IGN5Y2xlID0gMTsgOyBjeWNsZSsrKSB7XG4gICAgaWYgKGN5Y2xlID4gTUFYX1RSQUNLSU5HX0NZQ0xFUykge1xuICAgICAgYnVkZ2V0RXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBEQiB1bnJlYWNoYWJsZSBwYXN0IHRoZSBhY3Rpdml0eSdzIG93biByZXRyaWVzOiBmYWlsIHRoZSB0aWNrIHdpdGhcbiAgICAvLyBOTyB2ZXJkaWN0IOKAlCBndWVzc2luZyBcImZhaWxlZFwiIGR1cmluZyBhbiBvdXRhZ2UgY291bGQgcGF1c2UgYVxuICAgIC8vIGhlYWx0aHkgc2NoZWR1bGUuIFRoZSBhcnRpZmFjdCBzdGF5cyBhcm1lZCAoUGF1c2VPbkZhaWx1cmU9ZmFsc2UpO1xuICAgIC8vIHRoZSBuZXh0IGZpcmUgaXMgdW5hZmZlY3RlZC5cbiAgICBwaGFzZSA9IGF3YWl0IGZhaWxpbmcoXG4gICAgICBcInBvbGwgZXhlY3V0aW9uIHBoYXNlXCIsXG4gICAgICByZWNvcmRBY3Rpdml0aWVzW1BPTExfRVhFQ1VUSU9OX1BIQVNFX0FDVElWSVRZX05BTUVdKHJ1blN0YXJ0LmV4ZWN1dGlvbklkKSxcbiAgICApO1xuICAgIGlmIChwaGFzZSAhPT0gUEhBU0VfUlVOTklORykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICBidWRnZXRFeGhhdXN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGF3YWl0IHNsZWVwKHRyYWNraW5nQmFja29mZk1zKGN5Y2xlKSk7XG4gIH1cblxuICBpZiAoYnVkZ2V0RXhoYXVzdGVkKSB7XG4gICAgLy8gVGhlIHJ1biBpcyBOT1QgY2FuY2VsbGVkOiBpdHMgb3duIGV4ZWN1dGlvbiBwcm9maWxlIGJvdW5kcyBzcGVuZCxcbiAgICAvLyBhbmQgYSBkZXN0cnVjdGl2ZSBhY3QgYnV5cyBub3RoaW5nLiBVbmRlciBTS0lQIHRoaXMgYnVkZ2V0IGlzXG4gICAgLy8gbGl0ZXJhbGx5IHRoZSBtYXhpbXVtIHRpbWUgb25lIGh1bmcgcnVuIG1heSBzaWxlbmNlIHRoZSBzY2hlZHVsZS5cbiAgICBjb25zdCByZWFzb24gPSBgcnVuICR7cnVuU3RhcnQuZXhlY3V0aW9uSWR9IGRpZCBub3QgZmluaXNoIHdpdGhpbiAke3J1blN0YXJ0LnRyYWNraW5nVGltZW91dE1pbnV0ZXN9IG1pbnV0ZXNgO1xuICAgIGNvbnN0IHJlY29yZGVkID0gYXdhaXQgZmFpbGluZyhcbiAgICAgIFwicmVjb3JkIHRyYWNraW5nIHRpbWVvdXRcIixcbiAgICAgIGZhaWx1cmVBY3Rpdml0aWVzW1JFQ09SRF9GQUlMRURfUlVOX0FDVElWSVRZX05BTUVdKFxuICAgICAgICBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgRkFJTFVSRV9SVU5fVElNRURfT1VULFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ1ZlcmRpY3Qoc2NoZWR1bGVSZXNvdXJjZUlkLCBub21pbmFsUmZjMzMzOSwgcnVuU3RhcnQsIFwidGltZWRfb3V0XCIsIHJlY29yZGVkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBoYXNlID09PSBQSEFTRV9DT01QTEVURUQpIHtcbiAgICBhd2FpdCBmYWlsaW5nKFxuICAgICAgXCJyZWNvcmQgc3VjY2Vzc2Z1bCBydW5cIixcbiAgICAgIHJlY29yZEFjdGl2aXRpZXNbUkVDT1JEX1NVQ0NFU1NGVUxfUlVOX0FDVElWSVRZX05BTUVdKHNjaGVkdWxlUmVzb3VyY2VJZCksXG4gICAgKTtcbiAgICBsb2dWZXJkaWN0KHNjaGVkdWxlUmVzb3VyY2VJZCwgbm9taW5hbFJmYzMzMzksIHJ1blN0YXJ0LCBcImNvbXBsZXRlZFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBoYXNlID09PSBQSEFTRV9HT05FKSB7XG4gICAgLy8gRGVsZXRpbmcgYSBydW4gbXVzdCBub3QgYnJpY2sgaXRzIHNjaGVkdWxlOiBubyB2ZXJkaWN0LlxuICAgIGxvZ1ZlcmRpY3Qoc2NoZWR1bGVSZXNvdXJjZUlkLCBub21pbmFsUmZjMzMzOSwgcnVuU3RhcnQsIFwiZ29uZVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRkFJTEVELCBDQU5DRUxMRUQsIFRFUk1JTkFURUQuXG4gIGNvbnN0IHJlYXNvbiA9IGBydW4gJHtydW5TdGFydC5leGVjdXRpb25JZH0gZW5kZWQgJHtwaGFzZS50b0xvd2VyQ2FzZSgpfWA7XG4gIGNvbnN0IHJlY29yZGVkID0gYXdhaXQgZmFpbGluZyhcbiAgICBcInJlY29yZCBmYWlsZWQgcnVuXCIsXG4gICAgZmFpbHVyZUFjdGl2aXRpZXNbUkVDT1JEX0ZBSUxFRF9SVU5fQUNUSVZJVFlfTkFNRV0oXG4gICAgICBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICByZWFzb24sXG4gICAgICBGQUlMVVJFX1JVTl9GQUlMRUQsXG4gICAgKSxcbiAgKTtcbiAgbG9nVmVyZGljdChcbiAgICBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgbm9taW5hbFJmYzMzMzksXG4gICAgcnVuU3RhcnQsXG4gICAgcGhhc2UudG9Mb3dlckNhc2UoKSxcbiAgICByZWNvcmRlZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVsYXkgYmVmb3JlIHRoZSBuZXh0IHBoYXNlIHBvbGw6IGxpbmVhciBjeWNsZcOXNXMgY2FwcGVkIGF0IDYwcyDigJRcbiAqIHJlY292ZXJ5QmFja29mZidzIGV4YWN0IHNoYXBlLCB0aGUgb25seSBiYWNrb2ZmIGN1cnZlIHRoaXMgcGxhdGZvcm0gcnVuc1xuICogaW4gcHJvZHVjdGlvbiB3b3JrZmxvdyBjb2RlLiBJdCBub3RpY2VzIGEgMzAtMTIwcyBydW4gKHRoZSBjb21tb24gY2FzZSlcbiAqIHdpdGhpbiBzZWNvbmRzIGFuZCByZWFjaGVzIGl0cyBjYXAgYnkgY3ljbGUgdHdlbHZlLCBib3VuZGluZyBwb2xsIHZvbHVtZVxuICogb24gbG9uZyBydW5zIChHbyB0cmFja2luZ0JhY2tvZmYpLiBFeHBvcnRlZCBmb3IgdGhlIGN1cnZlJ3MgdW5pdCBwaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja2luZ0JhY2tvZmZNcyhjeWNsZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbXMgPSBjeWNsZSAqIDVfMDAwO1xuICByZXR1cm4gbXMgPiA2MF8wMDAgPyA2MF8wMDAgOiBtcztcbn1cblxuLyoqXG4gKiBEZXJpdmVzIFRIRSBmaXJlJ3Mgbm9taW5hbCB0aW1lLCB0aHJlZSB0aWVycyAoR28gbm9taW5hbEZpcmVUaW1lKTpcbiAqICAxLiBUaGUgVGVtcG9yYWxTY2hlZHVsZWRTdGFydFRpbWUgc2VhcmNoIGF0dHJpYnV0ZSAoY3JvbiBmaXJlcyBhbmRcbiAqICAgICBtYW51YWwgdHJpZ2dlcnMgYm90aCBjYXJyeSBpdCDigJQgc3Bpa2UtdmVyaWZpZWQgb24gdGhlIEdvIHNpZGUpLlxuICogIDIuIFRoZSB3b3JrZmxvdy1pZCBzdWZmaXggVGVtcG9yYWwgYXBwZW5kcyB0byB0aGUgYXJ0aWZhY3QncyBiYXNlIGlkLlxuICogIDMuIFdvcmtmbG93IHRpbWUgdHJ1bmNhdGVkIHRvIHdob2xlIHNlY29uZHMgKGEgaGFuZC1zdGFydGVkIHRpY2spLlxuICpcbiAqIFRoZSBub21pbmFsIHRpbWUgaXMgdGhlIGZpcmUncyBpZGVudGl0eTogbGFzdF9maXJlX2F0IHJlY29yZHMgaXQgYW5kIHRoZVxuICogZXhlY3V0aW9uIG5hbWUgZGVyaXZlcyBmcm9tIGl0LCBzbyBib3RoIGlkZW1wb3RlbmN5IGtleXMgYWdyZWUgb24gZXZlcnlcbiAqIHJldHJ5LlxuICovXG5mdW5jdGlvbiBub21pbmFsRmlyZVRpbWUoc2NoZWR1bGVSZXNvdXJjZUlkOiBzdHJpbmcpOiBEYXRlIHtcbiAgY29uc3QgYXR0cmlidXRlID0gd29ya2Zsb3dJbmZvKCkudHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldChcbiAgICBTQ0hFRFVMRURfU1RBUlRfVElNRV9LRVksXG4gICk7XG4gIGlmIChhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gIH1cbiAgY29uc3QgYmFzZSA9IGAke2FydGlmYWN0SWQoc2NoZWR1bGVSZXNvdXJjZUlkKX0tYDtcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IHdvcmtmbG93SW5mbygpLndvcmtmbG93SWQ7XG4gIGlmICh3b3JrZmxvd0lkLnN0YXJ0c1dpdGgoYmFzZSkpIHtcbiAgICBjb25zdCBzdWZmaXggPSB3b3JrZmxvd0lkLnNsaWNlKGJhc2UubGVuZ3RoKTtcbiAgICAvLyBHbyB0aW1lLlBhcnNlKHRpbWUuUkZDMzMzOSkgaXMgc3RyaWN0OyBEYXRlKCkgaXMgbGVuaWVudCDigJQgdGhlXG4gICAgLy8gcGF0dGVybiBndWFyZCBrZWVwcyBhIG5vbi1SRkMzMzM5IHN1ZmZpeCBmYWxsaW5nIHRvIHRpZXIgMyBleGFjdGx5XG4gICAgLy8gYXMgR28ncyBwYXJzZSBlcnJvciBkb2VzLlxuICAgIGlmIChSRkMzMzM5X1BBVFRFUk4udGVzdChzdWZmaXgpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZShzdWZmaXgpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkLmdldFRpbWUoKSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gRGF0ZS5ub3coKSBpcyBkZXRlcm1pbmlzdGljIHdvcmtmbG93IHRpbWUgaW5zaWRlIHRoZSBzYW5kYm94IOKAlCBHbydzXG4gIC8vIHdvcmtmbG93Lk5vdyB0d2luLlxuICByZXR1cm4gbmV3IERhdGUoTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKiAxMDAwKTtcbn1cblxuLyoqXG4gKiBNYXBzIGEgZmFpbGVkIGFjdGl2aXR5IHRvIEdvJ3MgYHJldHVybiBmbXQuRXJyb3JmKFwiPGxhYmVsPjogJXdcIiwgZXJyKWAg4oCUXG4gKiBhIFdPUktGTE9XIGZhaWx1cmUgKHNlZSB0aGUgbW9kdWxlIGhlYWRlcidzIGVycm9yIHBvc3R1cmUpLiBDYW5jZWxsYXRpb25cbiAqIGZhaWx1cmVzIHByb3BhZ2F0ZSB1bnRvdWNoZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZhaWxpbmc8VD4obGFiZWw6IHN0cmluZywgcHJvbWlzZTogUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSB8fCBpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aHJvdyBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHtcbiAgICAgIG1lc3NhZ2U6IGAke2xhYmVsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEFuY2hvcmVkIFJGQy0zMzM5IHNoYXBlIChaIG9yIG51bWVyaWMgb2Zmc2V0LCBvcHRpb25hbCBmcmFjdGlvbikuICovXG5jb25zdCBSRkMzMzM5X1BBVFRFUk4gPVxuICAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KFxcLlxcZCspPyhafFsrLV1cXGR7Mn06XFxkezJ9KSQvO1xuXG4vKiogR28gdGltZS5SRkMzMzM5LCBVVEMgd2hvbGUgc2Vjb25kcyAodGhlIHdpcmUgc2hhcGUgdGhlIGFjdGl2aXRpZXMgcGluKS4gKi9cbmZ1bmN0aW9uIHJmYzMzMzlTZWNvbmRzKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZHszfVokLywgXCJaXCIpO1xufVxuXG5mdW5jdGlvbiBsb2dWZXJkaWN0KFxuICBzY2hlZHVsZVJlc291cmNlSWQ6IHN0cmluZyxcbiAgbm9taW5hbFJmYzMzMzk6IHN0cmluZyxcbiAgcnVuU3RhcnQ6IFJ1blN0YXJ0LFxuICB2ZXJkaWN0OiBzdHJpbmcsXG4gIHJlY29yZGVkPzogRmFpbHVyZVJlY29yZGVkLFxuKTogdm9pZCB7XG4gIGlmIChyZWNvcmRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9nLmluZm8oXCJTY2hlZHVsZSB0aWNrIGNvbXBsZXRlXCIsIHtcbiAgICAgIHNjaGVkdWxlX2lkOiBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgICBub21pbmFsX2ZpcmVfdGltZTogbm9taW5hbFJmYzMzMzksXG4gICAgICBydW5fb3V0Y29tZTogcnVuU3RhcnQub3V0Y29tZSxcbiAgICAgIGV4ZWN1dGlvbl9pZDogcnVuU3RhcnQuZXhlY3V0aW9uSWQsXG4gICAgICB2ZXJkaWN0LFxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuaW5mbyhcIlNjaGVkdWxlIHRpY2sgY29tcGxldGVcIiwge1xuICAgIHNjaGVkdWxlX2lkOiBzY2hlZHVsZVJlc291cmNlSWQsXG4gICAgbm9taW5hbF9maXJlX3RpbWU6IG5vbWluYWxSZmMzMzM5LFxuICAgIHJ1bl9vdXRjb21lOiBydW5TdGFydC5vdXRjb21lLFxuICAgIGV4ZWN1dGlvbl9pZDogcnVuU3RhcnQuZXhlY3V0aW9uSWQsXG4gICAgdmVyZGljdCxcbiAgICBjb25zZWN1dGl2ZV9mYWlsdXJlczogcmVjb3JkZWQuY29uc2VjdXRpdmVGYWlsdXJlcyxcbiAgICBwYXVzZWQ6IHJlY29yZGVkLnBhdXNlZCxcbiAgfSk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG5jb25zdCBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdGNvbnN0IGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHRjb25zdCBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0Y29uc3QgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIvdmFsdWUgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGlmKEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0d2hpbGUoaSA8IGRlZmluaXRpb24ubGVuZ3RoKSB7XG5cdFx0XHR2YXIga2V5ID0gZGVmaW5pdGlvbltpKytdO1xuXHRcdFx0dmFyIGJpbmRpbmcgPSBkZWZpbml0aW9uW2krK107XG5cdFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdFx0aWYoYmluZGluZyA9PT0gMCkge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IGRlZmluaXRpb25baSsrXSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogYmluZGluZyB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmKGJpbmRpbmcgPT09IDApIHsgaSsrOyB9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYoU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiXG5jb25zdCBhcGkgPSByZXF1aXJlKCdAdGVtcG9yYWxpby93b3JrZmxvdy9saWIvd29ya2VyLWludGVyZmFjZS5qcycpO1xuZXhwb3J0cy5hcGkgPSBhcGk7XG5cbmNvbnN0IHsgb3ZlcnJpZGVHbG9iYWxzIH0gPSByZXF1aXJlKCdAdGVtcG9yYWxpby93b3JrZmxvdy9saWIvZ2xvYmFsLW92ZXJyaWRlcy5qcycpO1xub3ZlcnJpZGVHbG9iYWxzKCk7XG5cbmV4cG9ydHMucHJlbG9hZE1vZHVsZXMgPSBmdW5jdGlvbiBwcmVsb2FkTW9kdWxlcygpIHtcblxufVxuXG5leHBvcnRzLmltcG9ydFdvcmtmbG93cyA9IGZ1bmN0aW9uIGltcG9ydFdvcmtmbG93cygpIHtcbiAgcmV0dXJuIHJlcXVpcmUoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9ob21lL3J1bm5lci93b3JrL3N0aWdtZXIvc3RpZ21lci9iYWNrZW5kL3NlcnZpY2VzL3N0aWdtZXItc2VydmVyL2Rpc3QvdGVtcG9yYWwvc2NoZWR1bGUvd29ya2Zsb3dzL2luZGV4LmpzXCIpO1xufVxuXG5leHBvcnRzLmltcG9ydEludGVyY2VwdG9ycyA9IGZ1bmN0aW9uIGltcG9ydEludGVyY2VwdG9ycygpIHtcbiAgcmV0dXJuIFtcbiAgICBcbiAgXTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|