(() => { const AGENT_META = { rose: { emoji: "\u{1F339}", name: "Rose", tier: 1 }, lotus: { emoji: "\u{1FAB7}", name: "Lotus", tier: 2 }, "forget-me-not": { emoji: "\u{1F33C}", name: "Forget-me-not", tier: 2 }, sunflower: { emoji: "\u{1F33B}", name: "Sunflower", tier: 2 }, iris: { emoji: "\u269C\uFE0F", name: "Iris", tier: 2 }, ivy: { emoji: "\u{1F33F}", name: "Ivy", tier: 2 }, dandelion: { emoji: "\u{1F6E1}", name: "Dandelion", tier: 2 }, root: { emoji: "\u{1F333}", name: "Root", tier: 2 } }; let _nodeCounter = 0; function _nextNodeId(agentId) { return `${agentId}-${++_nodeCounter}`; } function initActivityTree() { const tree = { version: 1, rootId: "rose", nodes: { rose: { id: "rose", parentId: null, agentId: "rose", agentEmoji: "\u{1F339}", agentName: "Rose", tier: 1, status: "running", task: "Orchestrating", toolCalls: [], startedAt: Date.now(), endedAt: null, duration: null, children: [], collapsed: false, metadata: {} } }, stats: _emptyStats() }; S.activityTree = tree; S.mcFilter = {}; S.mcSort = "runtime"; return tree; } function _emptyStats() { return { totalAgents: 0, runningAgents: 0, pendingAgents: 0, doneAgents: 0, errorAgents: 0, totalTools: 0, doneTools: 0, runningTools: 0, avgResponseTime: 0, totalElapsed: 0 }; } function atAddNode(opts) { const tree = S.activityTree; if (!tree) return null; const parentId = opts.parentId || tree.rootId; const parent = tree.nodes[parentId]; if (!parent) return null; const meta = AGENT_META[opts.agentId]; const tier = opts.tier || (meta ? meta.tier : 3); const id = _nextNodeId(opts.agentId); const node = { id, parentId, agentId: opts.agentId, agentEmoji: meta?.emoji || "\u2699\uFE0F", agentName: meta?.name || opts.agentId, tier, status: opts.status || "pending", task: opts.task, toolCalls: [], startedAt: opts.status === "running" ? Date.now() : null, endedAt: null, duration: null, children: [], collapsed: false, metadata: {} }; tree.nodes[id] = node; parent.children.push(id); _recalcStats(tree); return node; } function atUpdateNode(nodeId, updates) { const tree = S.activityTree; if (!tree) return; const node = tree.nodes[nodeId]; if (!node) return; Object.assign(node, updates); _recalcStats(tree); } function atGetNode(nodeId) { return S.activityTree?.nodes[nodeId] || null; } function atAddToolCall(nodeId, tc) { const tree = S.activityTree; if (!tree) return null; const node = tree.nodes[nodeId]; if (!node) return null; if (node.status === "pending") { node.status = "running"; node.startedAt = node.startedAt || Date.now(); } const toolCall = { id: `tc-${++_nodeCounter}`, name: tc.name, status: tc.status || "running", args: tc.args || {}, startedAt: Date.now(), endedAt: null }; node.toolCalls.push(toolCall); _recalcStats(tree); return toolCall; } function atUpdateToolCall(nodeId, toolId, updates) { const tree = S.activityTree; if (!tree) return; const node = tree.nodes[nodeId]; if (!node) return; const tc = node.toolCalls.find((t) => t.id === toolId); if (!tc) return; Object.assign(tc, updates); if (updates.status === "done" || updates.status === "error") { tc.endedAt = tc.endedAt || Date.now(); tc.duration = tc.startedAt ? (tc.endedAt - tc.startedAt) / 1e3 : null; } _recalcStats(tree); } function atFinalizeNode(nodeId, status) { const tree = S.activityTree; if (!tree) return; const node = tree.nodes[nodeId]; if (!node) return; node.status = status; node.endedAt = Date.now(); node.duration = node.startedAt ? (node.endedAt - node.startedAt) / 1e3 : null; for (const tc of node.toolCalls) { if (tc.status === "running" || tc.status === "pending") { tc.status = status === "error" ? "error" : "done"; tc.endedAt = node.endedAt; tc.duration = tc.startedAt ? (tc.endedAt - tc.startedAt) / 1e3 : null; } } for (const childId of node.children) { const child = tree.nodes[childId]; if (child && (child.status === "running" || child.status === "thinking" || child.status === "pending")) { atFinalizeNode(childId, status); } } _recalcStats(tree); } function _recalcStats(tree) { const nodes = Object.values(tree.nodes).filter((n) => n.id !== tree.rootId); const tools = nodes.flatMap((n) => n.toolCalls); const doneDurations = nodes.filter((n) => n.duration !== null).map((n) => n.duration); const runningNodes = nodes.filter((n) => n.status === "running" || n.status === "thinking"); const maxElapsed = runningNodes.reduce((max, n) => { const elapsed = n.startedAt ? (Date.now() - n.startedAt) / 1e3 : 0; return Math.max(max, elapsed); }, 0); tree.stats = { totalAgents: nodes.length, runningAgents: runningNodes.length, pendingAgents: nodes.filter((n) => n.status === "pending").length, doneAgents: nodes.filter((n) => n.status === "done").length, errorAgents: nodes.filter((n) => n.status === "error").length, totalTools: tools.length, doneTools: tools.filter((t) => t.status === "done").length, runningTools: tools.filter((t) => t.status === "running").length, avgResponseTime: doneDurations.length ? doneDurations.reduce((a, b) => a + b, 0) / doneDurations.length : 0, totalElapsed: maxElapsed }; } function atGetStats() { return S.activityTree?.stats || _emptyStats(); } function atReset() { _nodeCounter = 0; initActivityTree(); } function formatElapsed(ms) { if (ms < 1e3) return `${Math.round(ms)}ms`; const s = Math.floor(ms / 1e3); if (s < 60) return `${s}s`; const m = Math.floor(s / 60); const rs = s % 60; if (m < 60) return `${m}m ${rs}s`; const h = Math.floor(m / 60); const rm = m % 60; return `${h}h ${rm}m`; } function formatDuration(seconds) { if (seconds === null) return "\u2014"; if (seconds < 0.01) return "<0.01s"; if (seconds < 1) return `${seconds.toFixed(2)}s`; if (seconds < 60) return `${seconds.toFixed(1)}s`; const m = Math.floor(seconds / 60); const rs = Math.round(seconds % 60); return `${m}m ${rs}s`; } function createMockActivityTree() { initActivityTree(); const tree = S.activityTree; const now = Date.now(); const lotus = atAddNode({ agentId: "lotus", task: "Analysiere Gesundheitsdaten", status: "running" }); lotus.startedAt = now - 12e3; atAddToolCall(lotus.id, { name: "search_files", args: { pattern: "health*", path: "/data" } }); atUpdateToolCall(lotus.id, lotus.toolCalls[0].id, { status: "done", result: "12 matches", duration: 0.3 }); lotus.toolCalls[0].startedAt = now - 11e3; lotus.toolCalls[0].endedAt = now - 10997; atAddToolCall(lotus.id, { name: "read_file", args: { path: "/data/health-log.md" } }); const sunflower = atAddNode({ agentId: "sunflower", task: "Portfolio-Analyse Q1 2026", status: "running" }); sunflower.startedAt = now - 8e3; atAddToolCall(sunflower.id, { name: "browser_navigate", args: { url: "https://finance.example.com" } }); atUpdateToolCall(sunflower.id, sunflower.toolCalls[0].id, { status: "done", result: "Page loaded", duration: 2.1 }); sunflower.toolCalls[0].startedAt = now - 7500; sunflower.toolCalls[0].endedAt = now - 5400; atAddToolCall(sunflower.id, { name: "terminal", args: { command: "python3 analyse.py" } }); const dandelion = atAddNode({ agentId: "dandelion", task: "Triaging unread messages", status: "pending" }); const researcher = atAddNode({ parentId: lotus.id, agentId: "researcher", task: "Looking up nutrition data", status: "running", tier: 3 }); researcher.agentEmoji = "\u{1F50D}"; researcher.agentName = "Researcher"; researcher.startedAt = now - 3e3; atAddToolCall(researcher.id, { name: "web_search", args: { query: "nutrition database API" } }); _recalcStats(tree); return tree; } window.initActivityTree = initActivityTree; window.createMockActivityTree = createMockActivityTree; window.formatElapsed = formatElapsed; window.formatDuration = formatDuration; window.atAddNode = atAddNode; window.atUpdateNode = atUpdateNode; window.atGetNode = atGetNode; window.atAddToolCall = atAddToolCall; window.atUpdateToolCall = atUpdateToolCall; window.atFinalizeNode = atFinalizeNode; window.atGetStats = atGetStats; window.atReset = atReset; window._atTrackTool = _atTrackTool; window._atTrackToolComplete = _atTrackToolComplete; window._atTrackDone = _atTrackDone; window._atTrackSubagent = _atTrackSubagent; window._at = { init: initActivityTree, addNode: atAddNode, updateNode: atUpdateNode, getNode: atGetNode, addToolCall: atAddToolCall, updateToolCall: atUpdateToolCall, finalize: atFinalizeNode, stats: atGetStats, reset: atReset, mock: createMockActivityTree, formatElapsed, formatDuration, AGENT_META, trackSubagent: _atTrackSubagent, }; let _activeAgentNodeId = null; let _lastToolId = null; function _atTrackTool(d) { if (!S.activityTree) initActivityTree(); const tree = S.activityTree; if (d.name === "delegate_task") { const agentId = d.args?.agentId || d.args?.agent || d.args?.name || "unknown"; const task = d.args?.goal || d.args?.prompt || d.args?.task || d.preview || "Delegated task"; const node = atAddNode({ agentId, task, status: "running" }); if (node) { _activeAgentNodeId = node.id; } return; } let targetNodeId = _activeAgentNodeId || tree.rootId; const inflight = window.INFLIGHT?.[S.session?.session_id]; if (inflight?.thisTurnAgent) { const agentKey = inflight.thisTurnAgent; const existingNode = Object.values(tree.nodes).find( (n) => n.agentId === agentKey && (n.status === "running" || n.status === "thinking") ); if (existingNode) { targetNodeId = existingNode.id; _activeAgentNodeId = existingNode.id; } else if (AGENT_META[agentKey]) { const task = inflight.thisTurnModel ? `${inflight.thisTurnModel}` : "Working..."; const node = atAddNode({ agentId: agentKey, task, status: "running" }); if (node) { _activeAgentNodeId = node.id; targetNodeId = node.id; } } } const tc = atAddToolCall(targetNodeId, { name: d.name, args: d.args || {}, status: "running" }); if (tc) { _lastToolId = tc.id; } } function _atTrackToolComplete(d) { if (!S.activityTree) return; const tree = S.activityTree; const activeNodes = Object.values(tree.nodes).filter( (n) => n.status === "running" || n.status === "thinking" ); for (const node of activeNodes) { for (const tc of node.toolCalls) { if (tc.status === "running" && tc.name === d.name) { atUpdateToolCall(node.id, tc.id, { status: d.is_error ? "error" : "done", result: d.preview || d.result, duration: d.duration }); return; } } } } function _atTrackSubagent(d) { if (!S.activityTree) initActivityTree(); const tree = S.activityTree; if (d.event_type === 'subagent.start') { // Derive agentId from subagent_id if available, otherwise from goal hint. // subagent_id format: "lotus-1" → agentId = "lotus" let agentId = 'unknown'; if (d.subagent_id) { // Strip numeric suffix e.g. "lotus-1" → "lotus" agentId = d.subagent_id.replace(/-\d+$/, ''); } const task = d.goal || d.preview || `Subagent ${d.task_index ?? ''}`.trim(); const node = atAddNode({ agentId, task, status: 'running' }); if (node) { _activeAgentNodeId = node.id; } return; } if (d.event_type === 'subagent.complete' || d.event_type === 'subagent.done') { // Find the running node for this subagent and finalize it. // Use subagent_id to locate the right node. let targetNodeId = null; if (d.subagent_id) { const agentId = d.subagent_id.replace(/-\d+$/, ''); const found = Object.values(tree.nodes).find( (n) => n.agentId === agentId && n.status === 'running' ); if (found) targetNodeId = found.id; } // Fall back to _activeAgentNodeId if no subagent_id match if (!targetNodeId) targetNodeId = _activeAgentNodeId; if (targetNodeId && tree.nodes[targetNodeId]) { const status = d.status === 'timeout' || d.status === 'error' ? 'error' : 'done'; atFinalizeNode(targetNodeId, status); } } } function _atTrackDone() { if (!S.activityTree) return; if (_activeAgentNodeId) { atFinalizeNode(_activeAgentNodeId, "done"); _activeAgentNodeId = null; } const root = S.activityTree.nodes[S.activityTree.rootId]; if (root) { root.status = "running"; } } })(); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYWN0aXZpdHktdHJlZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFnZW50IEFjdGl2aXR5IFRyZWUgKE1pc3Npb24gQ29udHJvbCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBGdWxsLWRlcHRoIHBhcmFsbGVsIGFnZW50IGFjdGl2aXR5IHRyYWNraW5nIGZvciB0aGUgMy1UaWVyIHN5c3RlbS5cbi8vIFByb3ZpZGVzOiBpbml0QWN0aXZpdHlUcmVlLCBhZGROb2RlLCBhZGRUb29sQ2FsbCwgdXBkYXRlVG9vbENhbGwsXG4vLyAgICAgICAgICAgZmluYWxpemVOb2RlLCBnZXRTdGF0cywgY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSwgZm9ybWF0RWxhcHNlZFxuXG4vLyBBZ2VudCBtZXRhZGF0YSBcdTIwMTQgbWFwcyBhZ2VudCBJRHMgdG8gZGlzcGxheSBpbmZvXG5jb25zdCBBR0VOVF9NRVRBOiBSZWNvcmQ8c3RyaW5nLCB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdGllcjogMXwyfDMgfT4gPSB7XG4gIHJvc2U6ICAgICAgICAgICB7IGVtb2ppOiAnXHVEODNDXHVERjM5JywgbmFtZTogJ1Jvc2UnLCAgICAgICAgICAgdGllcjogMSB9LFxuICBsb3R1czogICAgICAgICAgeyBlbW9qaTogJ1x1RDgzRVx1REVCNycsIG5hbWU6ICdMb3R1cycsICAgICAgICAgIHRpZXI6IDIgfSxcbiAgJ2ZvcmdldC1tZS1ub3QnOnsgZW1vamk6ICdcdUQ4M0NcdURGM0MnLCBuYW1lOiAnRm9yZ2V0LW1lLW5vdCcsICB0aWVyOiAyIH0sXG4gIHN1bmZsb3dlcjogICAgICB7IGVtb2ppOiAnXHVEODNDXHVERjNCJywgbmFtZTogJ1N1bmZsb3dlcicsICAgICAgdGllcjogMiB9LFxuICBpcmlzOiAgICAgICAgICAgeyBlbW9qaTogJ1x1MjY5Q1x1RkUwRicsIG5hbWU6ICdJcmlzJywgICAgICAgICAgIHRpZXI6IDIgfSxcbiAgaXZ5OiAgICAgICAgICAgIHsgZW1vamk6ICdcdUQ4M0NcdURGM0YnLCBuYW1lOiAnSXZ5JywgICAgICAgICAgICB0aWVyOiAyIH0sXG4gIGRhbmRlbGlvbjogICAgICB7IGVtb2ppOiAnXHVEODNEXHVERUUxJywgbmFtZTogJ0RhbmRlbGlvbicsICAgICAgdGllcjogMiB9LFxuICByb290OiAgICAgICAgICAgeyBlbW9qaTogJ1x1RDgzQ1x1REYzMycsIG5hbWU6ICdSb290JywgICAgICAgICAgIHRpZXI6IDIgfSxcbn07XG5cbi8vIFRpZXItMyBzdWItYWdlbnQgZGV0ZWN0aW9uIFx1MjAxNCB0b29sIG5hbWVzIHRoYXQgaW5kaWNhdGUgc3ViLWFnZW50IHdvcmtcbmNvbnN0IFRJRVIzX1RPT0xfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ3NlYXJjaF9maWxlcycsICdyZWFkX2ZpbGUnLCAnd3JpdGVfZmlsZScsICd0ZXJtaW5hbCcsICdicm93c2VyX25hdmlnYXRlJyxcbiAgJ2Jyb3dzZXJfc25hcHNob3QnLCAnYnJvd3Nlcl9jbGljaycsICdicm93c2VyX3R5cGUnLCAnYnJvd3Nlcl9wcmVzcycsXG4gICd3ZWJfc2VhcmNoJywgJ2RlbGVnYXRlX3Rhc2snLCAnZXhlY3V0ZV9jb2RlJywgJ3BhdGNoJyxcbl0pO1xuXG5sZXQgX25vZGVDb3VudGVyID0gMDtcbmZ1bmN0aW9uIF9uZXh0Tm9kZUlkKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHthZ2VudElkfS0keysrX25vZGVDb3VudGVyfWA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb3JlIEZ1bmN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gaW5pdEFjdGl2aXR5VHJlZSgpOiBBY3Rpdml0eVRyZWUge1xuICBjb25zdCB0cmVlOiBBY3Rpdml0eVRyZWUgPSB7XG4gICAgdmVyc2lvbjogMSxcbiAgICByb290SWQ6ICdyb3NlJyxcbiAgICBub2Rlczoge1xuICAgICAgcm9zZToge1xuICAgICAgICBpZDogJ3Jvc2UnLFxuICAgICAgICBwYXJlbnRJZDogbnVsbCxcbiAgICAgICAgYWdlbnRJZDogJ3Jvc2UnLFxuICAgICAgICBhZ2VudEVtb2ppOiAnXHVEODNDXHVERjM5JyxcbiAgICAgICAgYWdlbnROYW1lOiAnUm9zZScsXG4gICAgICAgIHRpZXI6IDEsXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICB0YXNrOiAnT3JjaGVzdHJhdGluZycsXG4gICAgICAgIHRvb2xDYWxsczogW10sXG4gICAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgZW5kZWRBdDogbnVsbCxcbiAgICAgICAgZHVyYXRpb246IG51bGwsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgfVxuICAgIH0sXG4gICAgc3RhdHM6IF9lbXB0eVN0YXRzKCksXG4gIH07XG4gIFMuYWN0aXZpdHlUcmVlID0gdHJlZTtcbiAgUy5tY0ZpbHRlciA9IHt9O1xuICBTLm1jU29ydCA9ICdydW50aW1lJztcbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIF9lbXB0eVN0YXRzKCk6IE1DU3RhdHMge1xuICByZXR1cm4ge1xuICAgIHRvdGFsQWdlbnRzOiAwLFxuICAgIHJ1bm5pbmdBZ2VudHM6IDAsXG4gICAgcGVuZGluZ0FnZW50czogMCxcbiAgICBkb25lQWdlbnRzOiAwLFxuICAgIGVycm9yQWdlbnRzOiAwLFxuICAgIHRvdGFsVG9vbHM6IDAsXG4gICAgZG9uZVRvb2xzOiAwLFxuICAgIHJ1bm5pbmdUb29sczogMCxcbiAgICBhdmdSZXNwb25zZVRpbWU6IDAsXG4gICAgdG90YWxFbGFwc2VkOiAwLFxuICB9O1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTm9kZSBPcGVyYXRpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhdEFkZE5vZGUob3B0czoge1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgYWdlbnRJZDogc3RyaW5nO1xuICB0YXNrOiBzdHJpbmc7XG4gIHN0YXR1cz86IEFjdGl2aXR5Tm9kZVsnc3RhdHVzJ107XG4gIHRpZXI/OiAxfDJ8Mztcbn0pOiBBY3Rpdml0eU5vZGUgfCBudWxsIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHBhcmVudElkID0gb3B0cy5wYXJlbnRJZCB8fCB0cmVlLnJvb3RJZDtcbiAgY29uc3QgcGFyZW50ID0gdHJlZS5ub2Rlc1twYXJlbnRJZF07XG4gIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBtZXRhID0gQUdFTlRfTUVUQVtvcHRzLmFnZW50SWRdO1xuICBjb25zdCB0aWVyID0gb3B0cy50aWVyIHx8IChtZXRhID8gbWV0YS50aWVyIDogMyk7XG4gIGNvbnN0IGlkID0gX25leHROb2RlSWQob3B0cy5hZ2VudElkKTtcblxuICBjb25zdCBub2RlOiBBY3Rpdml0eU5vZGUgPSB7XG4gICAgaWQsXG4gICAgcGFyZW50SWQsXG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudElkLFxuICAgIGFnZW50RW1vamk6IG1ldGE/LmVtb2ppIHx8ICdcdTI2OTlcdUZFMEYnLFxuICAgIGFnZW50TmFtZTogbWV0YT8ubmFtZSB8fCBvcHRzLmFnZW50SWQsXG4gICAgdGllcixcbiAgICBzdGF0dXM6IG9wdHMuc3RhdHVzIHx8ICdwZW5kaW5nJyxcbiAgICB0YXNrOiBvcHRzLnRhc2ssXG4gICAgdG9vbENhbGxzOiBbXSxcbiAgICBzdGFydGVkQXQ6IG9wdHMuc3RhdHVzID09PSAncnVubmluZycgPyBEYXRlLm5vdygpIDogbnVsbCxcbiAgICBlbmRlZEF0OiBudWxsLFxuICAgIGR1cmF0aW9uOiBudWxsLFxuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIG1ldGFkYXRhOiB7fSxcbiAgfTtcblxuICB0cmVlLm5vZGVzW2lkXSA9IG5vZGU7XG4gIHBhcmVudC5jaGlsZHJlbi5wdXNoKGlkKTtcbiAgX3JlY2FsY1N0YXRzKHRyZWUpO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gYXRVcGRhdGVOb2RlKG5vZGVJZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPEFjdGl2aXR5Tm9kZT4pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG4gIE9iamVjdC5hc3NpZ24obm9kZSwgdXBkYXRlcyk7XG4gIF9yZWNhbGNTdGF0cyh0cmVlKTtcbn1cblxuZnVuY3Rpb24gYXRHZXROb2RlKG5vZGVJZDogc3RyaW5nKTogQWN0aXZpdHlOb2RlIHwgbnVsbCB7XG4gIHJldHVybiBTLmFjdGl2aXR5VHJlZT8ubm9kZXNbbm9kZUlkXSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBhdEdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogQWN0aXZpdHlOb2RlW10ge1xuICBjb25zdCB0cmVlID0gUy5hY3Rpdml0eVRyZWU7XG4gIGlmICghdHJlZSkgcmV0dXJuIFtdO1xuICBjb25zdCBub2RlID0gdHJlZS5ub2Rlc1tub2RlSWRdO1xuICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKGlkID0+IHRyZWUubm9kZXNbaWRdKS5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmZ1bmN0aW9uIGF0R2V0UnVubmluZ05vZGVzKCk6IEFjdGl2aXR5Tm9kZVtdIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJlZS5ub2RlcykuZmlsdGVyKFxuICAgIG4gPT4gbi5zdGF0dXMgPT09ICdydW5uaW5nJyB8fCBuLnN0YXR1cyA9PT0gJ3RoaW5raW5nJ1xuICApO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgVG9vbCBDYWxsIE9wZXJhdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGF0QWRkVG9vbENhbGwobm9kZUlkOiBzdHJpbmcsIHRjOiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJncz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHN0YXR1cz86IEFjdGl2aXR5VG9vbENhbGxbJ3N0YXR1cyddO1xufSk6IEFjdGl2aXR5VG9vbENhbGwgfCBudWxsIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybiBudWxsO1xuICBjb25zdCBub2RlID0gdHJlZS5ub2Rlc1tub2RlSWRdO1xuICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gIC8vIElmIG5vZGUgd2FzIHBlbmRpbmcsIGl0J3Mgbm93IHJ1bm5pbmdcbiAgaWYgKG5vZGUuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICBub2RlLnN0YXR1cyA9ICdydW5uaW5nJztcbiAgICBub2RlLnN0YXJ0ZWRBdCA9IG5vZGUuc3RhcnRlZEF0IHx8IERhdGUubm93KCk7XG4gIH1cblxuICBjb25zdCB0b29sQ2FsbDogQWN0aXZpdHlUb29sQ2FsbCA9IHtcbiAgICBpZDogYHRjLSR7Kytfbm9kZUNvdW50ZXJ9YCxcbiAgICBuYW1lOiB0Yy5uYW1lLFxuICAgIHN0YXR1czogdGMuc3RhdHVzIHx8ICdydW5uaW5nJyxcbiAgICBhcmdzOiB0Yy5hcmdzIHx8IHt9LFxuICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICBlbmRlZEF0OiBudWxsLFxuICB9O1xuXG4gIG5vZGUudG9vbENhbGxzLnB1c2godG9vbENhbGwpO1xuICBfcmVjYWxjU3RhdHModHJlZSk7XG4gIHJldHVybiB0b29sQ2FsbDtcbn1cblxuZnVuY3Rpb24gYXRVcGRhdGVUb29sQ2FsbChub2RlSWQ6IHN0cmluZywgdG9vbElkOiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8QWN0aXZpdHlUb29sQ2FsbD4pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgY29uc3QgdGMgPSBub2RlLnRvb2xDYWxscy5maW5kKHQgPT4gdC5pZCA9PT0gdG9vbElkKTtcbiAgaWYgKCF0YykgcmV0dXJuO1xuXG4gIE9iamVjdC5hc3NpZ24odGMsIHVwZGF0ZXMpO1xuICBpZiAodXBkYXRlcy5zdGF0dXMgPT09ICdkb25lJyB8fCB1cGRhdGVzLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgIHRjLmVuZGVkQXQgPSB0Yy5lbmRlZEF0IHx8IERhdGUubm93KCk7XG4gICAgdGMuZHVyYXRpb24gPSB0Yy5zdGFydGVkQXQgPyAodGMuZW5kZWRBdCAtIHRjLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcbiAgfVxuICBfcmVjYWxjU3RhdHModHJlZSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGaW5hbGl6YXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGF0RmluYWxpemVOb2RlKG5vZGVJZDogc3RyaW5nLCBzdGF0dXM6IEFjdGl2aXR5Tm9kZVsnc3RhdHVzJ10pOiB2b2lkIHtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlO1xuICBpZiAoIXRyZWUpIHJldHVybjtcbiAgY29uc3Qgbm9kZSA9IHRyZWUubm9kZXNbbm9kZUlkXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgbm9kZS5zdGF0dXMgPSBzdGF0dXM7XG4gIG5vZGUuZW5kZWRBdCA9IERhdGUubm93KCk7XG4gIG5vZGUuZHVyYXRpb24gPSBub2RlLnN0YXJ0ZWRBdCA/IChub2RlLmVuZGVkQXQgLSBub2RlLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcblxuICAvLyBGaW5hbGl6ZSBhbnkgc3RpbGwtcnVubmluZyB0b29sIGNhbGxzXG4gIGZvciAoY29uc3QgdGMgb2Ygbm9kZS50b29sQ2FsbHMpIHtcbiAgICBpZiAodGMuc3RhdHVzID09PSAncnVubmluZycgfHwgdGMuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgIHRjLnN0YXR1cyA9IHN0YXR1cyA9PT0gJ2Vycm9yJyA/ICdlcnJvcicgOiAnZG9uZSc7XG4gICAgICB0Yy5lbmRlZEF0ID0gbm9kZS5lbmRlZEF0O1xuICAgICAgdGMuZHVyYXRpb24gPSB0Yy5zdGFydGVkQXQgPyAodGMuZW5kZWRBdCAtIHRjLnN0YXJ0ZWRBdCkgLyAxMDAwIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBSZWN1cnNpdmVseSBmaW5hbGl6ZSBjaGlsZHJlbiB0aGF0IGFyZSBzdGlsbCBhY3RpdmVcbiAgZm9yIChjb25zdCBjaGlsZElkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBjb25zdCBjaGlsZCA9IHRyZWUubm9kZXNbY2hpbGRJZF07XG4gICAgaWYgKGNoaWxkICYmIChjaGlsZC5zdGF0dXMgPT09ICdydW5uaW5nJyB8fCBjaGlsZC5zdGF0dXMgPT09ICd0aGlua2luZycgfHwgY2hpbGQuc3RhdHVzID09PSAncGVuZGluZycpKSB7XG4gICAgICBhdEZpbmFsaXplTm9kZShjaGlsZElkLCBzdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIF9yZWNhbGNTdGF0cyh0cmVlKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0YXRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBfcmVjYWxjU3RhdHModHJlZTogQWN0aXZpdHlUcmVlKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVzID0gT2JqZWN0LnZhbHVlcyh0cmVlLm5vZGVzKS5maWx0ZXIobiA9PiBuLmlkICE9PSB0cmVlLnJvb3RJZCk7XG4gIGNvbnN0IHRvb2xzID0gbm9kZXMuZmxhdE1hcChuID0+IG4udG9vbENhbGxzKTtcblxuICBjb25zdCBkb25lRHVyYXRpb25zID0gbm9kZXNcbiAgICAuZmlsdGVyKG4gPT4gbi5kdXJhdGlvbiAhPT0gbnVsbClcbiAgICAubWFwKG4gPT4gbi5kdXJhdGlvbiEpO1xuXG4gIGNvbnN0IHJ1bm5pbmdOb2RlcyA9IG5vZGVzLmZpbHRlcihuID0+IG4uc3RhdHVzID09PSAncnVubmluZycgfHwgbi5zdGF0dXMgPT09ICd0aGlua2luZycpO1xuICBjb25zdCBtYXhFbGFwc2VkID0gcnVubmluZ05vZGVzLnJlZHVjZSgobWF4LCBuKSA9PiB7XG4gICAgY29uc3QgZWxhcHNlZCA9IG4uc3RhcnRlZEF0ID8gKERhdGUubm93KCkgLSBuLnN0YXJ0ZWRBdCkgLyAxMDAwIDogMDtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBlbGFwc2VkKTtcbiAgfSwgMCk7XG5cbiAgdHJlZS5zdGF0cyA9IHtcbiAgICB0b3RhbEFnZW50czogbm9kZXMubGVuZ3RoLFxuICAgIHJ1bm5pbmdBZ2VudHM6IHJ1bm5pbmdOb2Rlcy5sZW5ndGgsXG4gICAgcGVuZGluZ0FnZW50czogbm9kZXMuZmlsdGVyKG4gPT4gbi5zdGF0dXMgPT09ICdwZW5kaW5nJykubGVuZ3RoLFxuICAgIGRvbmVBZ2VudHM6IG5vZGVzLmZpbHRlcihuID0+IG4uc3RhdHVzID09PSAnZG9uZScpLmxlbmd0aCxcbiAgICBlcnJvckFnZW50czogbm9kZXMuZmlsdGVyKG4gPT4gbi5zdGF0dXMgPT09ICdlcnJvcicpLmxlbmd0aCxcbiAgICB0b3RhbFRvb2xzOiB0b29scy5sZW5ndGgsXG4gICAgZG9uZVRvb2xzOiB0b29scy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ2RvbmUnKS5sZW5ndGgsXG4gICAgcnVubmluZ1Rvb2xzOiB0b29scy5maWx0ZXIodCA9PiB0LnN0YXR1cyA9PT0gJ3J1bm5pbmcnKS5sZW5ndGgsXG4gICAgYXZnUmVzcG9uc2VUaW1lOiBkb25lRHVyYXRpb25zLmxlbmd0aFxuICAgICAgPyBkb25lRHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gZG9uZUR1cmF0aW9ucy5sZW5ndGhcbiAgICAgIDogMCxcbiAgICB0b3RhbEVsYXBzZWQ6IG1heEVsYXBzZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0R2V0U3RhdHMoKTogTUNTdGF0cyB7XG4gIHJldHVybiBTLmFjdGl2aXR5VHJlZT8uc3RhdHMgfHwgX2VtcHR5U3RhdHMoKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJlc2V0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBhdFJlc2V0KCk6IHZvaWQge1xuICBfbm9kZUNvdW50ZXIgPSAwO1xuICBpbml0QWN0aXZpdHlUcmVlKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGb3JtYXR0aW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPCAxMDAwKSByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICBjb25zdCBzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBpZiAocyA8IDYwKSByZXR1cm4gYCR7c31zYDtcbiAgY29uc3QgbSA9IE1hdGguZmxvb3IocyAvIDYwKTtcbiAgY29uc3QgcnMgPSBzICUgNjA7XG4gIGlmIChtIDwgNjApIHJldHVybiBgJHttfW0gJHtyc31zYDtcbiAgY29uc3QgaCA9IE1hdGguZmxvb3IobSAvIDYwKTtcbiAgY29uc3Qgcm0gPSBtICUgNjA7XG4gIHJldHVybiBgJHtofWggJHtybX1tYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oc2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmIChzZWNvbmRzID09PSBudWxsKSByZXR1cm4gJ1x1MjAxNCc7XG4gIGlmIChzZWNvbmRzIDwgMC4wMSkgcmV0dXJuICc8MC4wMXMnO1xuICBpZiAoc2Vjb25kcyA8IDEpIHJldHVybiBgJHtzZWNvbmRzLnRvRml4ZWQoMil9c2A7XG4gIGlmIChzZWNvbmRzIDwgNjApIHJldHVybiBgJHtzZWNvbmRzLnRvRml4ZWQoMSl9c2A7XG4gIGNvbnN0IG0gPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IHJzID0gTWF0aC5yb3VuZChzZWNvbmRzICUgNjApO1xuICByZXR1cm4gYCR7bX1tICR7cnN9c2A7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNb2NrIERhdGEgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGNyZWF0ZU1vY2tBY3Rpdml0eVRyZWUoKTogQWN0aXZpdHlUcmVlIHtcbiAgaW5pdEFjdGl2aXR5VHJlZSgpO1xuICBjb25zdCB0cmVlID0gUy5hY3Rpdml0eVRyZWUhO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIC8vIExvdHVzIFx1MjAxNCBydW5uaW5nIHdpdGggMiB0b29sIGNhbGxzXG4gIGNvbnN0IGxvdHVzID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ2xvdHVzJywgdGFzazogJ0FuYWx5c2llcmUgR2VzdW5kaGVpdHNkYXRlbicsIHN0YXR1czogJ3J1bm5pbmcnIH0pITtcbiAgbG90dXMuc3RhcnRlZEF0ID0gbm93IC0gMTIwMDA7XG4gIGF0QWRkVG9vbENhbGwobG90dXMuaWQsIHsgbmFtZTogJ3NlYXJjaF9maWxlcycsIGFyZ3M6IHsgcGF0dGVybjogJ2hlYWx0aConLCBwYXRoOiAnL2RhdGEnIH0gfSk7XG4gIGF0VXBkYXRlVG9vbENhbGwobG90dXMuaWQsIGxvdHVzLnRvb2xDYWxsc1swXS5pZCwgeyBzdGF0dXM6ICdkb25lJywgcmVzdWx0OiAnMTIgbWF0Y2hlcycsIGR1cmF0aW9uOiAwLjMgfSk7XG4gIGxvdHVzLnRvb2xDYWxsc1swXS5zdGFydGVkQXQgPSBub3cgLSAxMTAwMDtcbiAgbG90dXMudG9vbENhbGxzWzBdLmVuZGVkQXQgPSBub3cgLSAxMDk5NztcblxuICBhdEFkZFRvb2xDYWxsKGxvdHVzLmlkLCB7IG5hbWU6ICdyZWFkX2ZpbGUnLCBhcmdzOiB7IHBhdGg6ICcvZGF0YS9oZWFsdGgtbG9nLm1kJyB9IH0pO1xuXG4gIC8vIFN1bmZsb3dlciBcdTIwMTQgcnVubmluZyB3aXRoIDEgZG9uZSwgMSBydW5uaW5nIHRvb2xcbiAgY29uc3Qgc3VuZmxvd2VyID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ3N1bmZsb3dlcicsIHRhc2s6ICdQb3J0Zm9saW8tQW5hbHlzZSBRMSAyMDI2Jywgc3RhdHVzOiAncnVubmluZycgfSkhO1xuICBzdW5mbG93ZXIuc3RhcnRlZEF0ID0gbm93IC0gODAwMDtcbiAgYXRBZGRUb29sQ2FsbChzdW5mbG93ZXIuaWQsIHsgbmFtZTogJ2Jyb3dzZXJfbmF2aWdhdGUnLCBhcmdzOiB7IHVybDogJ2h0dHBzOi8vZmluYW5jZS5leGFtcGxlLmNvbScgfSB9KTtcbiAgYXRVcGRhdGVUb29sQ2FsbChzdW5mbG93ZXIuaWQsIHN1bmZsb3dlci50b29sQ2FsbHNbMF0uaWQsIHsgc3RhdHVzOiAnZG9uZScsIHJlc3VsdDogJ1BhZ2UgbG9hZGVkJywgZHVyYXRpb246IDIuMSB9KTtcbiAgc3VuZmxvd2VyLnRvb2xDYWxsc1swXS5zdGFydGVkQXQgPSBub3cgLSA3NTAwO1xuICBzdW5mbG93ZXIudG9vbENhbGxzWzBdLmVuZGVkQXQgPSBub3cgLSA1NDAwO1xuXG4gIGF0QWRkVG9vbENhbGwoc3VuZmxvd2VyLmlkLCB7IG5hbWU6ICd0ZXJtaW5hbCcsIGFyZ3M6IHsgY29tbWFuZDogJ3B5dGhvbjMgYW5hbHlzZS5weScgfSB9KTtcblxuICAvLyBEYW5kZWxpb24gXHUyMDE0IHBlbmRpbmdcbiAgY29uc3QgZGFuZGVsaW9uID0gYXRBZGROb2RlKHsgYWdlbnRJZDogJ2RhbmRlbGlvbicsIHRhc2s6ICdUcmlhZ2luZyB1bnJlYWQgbWVzc2FnZXMnLCBzdGF0dXM6ICdwZW5kaW5nJyB9KSE7XG5cbiAgLy8gQWRkIGEgdGllci0zIHN1Yi1hZ2VudCB1bmRlciBMb3R1c1xuICBjb25zdCByZXNlYXJjaGVyID0gYXRBZGROb2RlKHsgcGFyZW50SWQ6IGxvdHVzLmlkLCBhZ2VudElkOiAncmVzZWFyY2hlcicsIHRhc2s6ICdMb29raW5nIHVwIG51dHJpdGlvbiBkYXRhJywgc3RhdHVzOiAncnVubmluZycsIHRpZXI6IDMgfSkhO1xuICByZXNlYXJjaGVyLmFnZW50RW1vamkgPSAnXHVEODNEXHVERDBEJztcbiAgcmVzZWFyY2hlci5hZ2VudE5hbWUgPSAnUmVzZWFyY2hlcic7XG4gIHJlc2VhcmNoZXIuc3RhcnRlZEF0ID0gbm93IC0gMzAwMDtcblxuICBhdEFkZFRvb2xDYWxsKHJlc2VhcmNoZXIuaWQsIHsgbmFtZTogJ3dlYl9zZWFyY2gnLCBhcmdzOiB7IHF1ZXJ5OiAnbnV0cml0aW9uIGRhdGFiYXNlIEFQSScgfSB9KTtcblxuICBfcmVjYWxjU3RhdHModHJlZSk7XG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTWFrZSBjb3JlIGZ1bmN0aW9ucyBnbG9iYWwgKElJRkUtc2FmZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG53aW5kb3cuaW5pdEFjdGl2aXR5VHJlZSA9IGluaXRBY3Rpdml0eVRyZWU7XG53aW5kb3cuY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSA9IGNyZWF0ZU1vY2tBY3Rpdml0eVRyZWU7XG53aW5kb3cuZm9ybWF0RWxhcHNlZCA9IGZvcm1hdEVsYXBzZWQ7XG53aW5kb3cuZm9ybWF0RHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbjtcbndpbmRvdy5hdEFkZE5vZGUgPSBhdEFkZE5vZGU7XG53aW5kb3cuYXRVcGRhdGVOb2RlID0gYXRVcGRhdGVOb2RlO1xud2luZG93LmF0R2V0Tm9kZSA9IGF0R2V0Tm9kZTtcbndpbmRvdy5hdEFkZFRvb2xDYWxsID0gYXRBZGRUb29sQ2FsbDtcbndpbmRvdy5hdFVwZGF0ZVRvb2xDYWxsID0gYXRVcGRhdGVUb29sQ2FsbDtcbndpbmRvdy5hdEZpbmFsaXplTm9kZSA9IGF0RmluYWxpemVOb2RlO1xud2luZG93LmF0R2V0U3RhdHMgPSBhdEdldFN0YXRzO1xud2luZG93LmF0UmVzZXQgPSBhdFJlc2V0O1xud2luZG93Ll9hdFRyYWNrVG9vbCA9IF9hdFRyYWNrVG9vbDtcbndpbmRvdy5fYXRUcmFja1Rvb2xDb21wbGV0ZSA9IF9hdFRyYWNrVG9vbENvbXBsZXRlO1xud2luZG93Ll9hdFRyYWNrRG9uZSA9IF9hdFRyYWNrRG9uZTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV4cG9ydCBmb3IgY29uc29sZSB0ZXN0aW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuKHdpbmRvdyBhcyBhbnkpLl9hdCA9IHtcbiAgaW5pdDogaW5pdEFjdGl2aXR5VHJlZSxcbiAgYWRkTm9kZTogYXRBZGROb2RlLFxuICB1cGRhdGVOb2RlOiBhdFVwZGF0ZU5vZGUsXG4gIGdldE5vZGU6IGF0R2V0Tm9kZSxcbiAgYWRkVG9vbENhbGw6IGF0QWRkVG9vbENhbGwsXG4gIHVwZGF0ZVRvb2xDYWxsOiBhdFVwZGF0ZVRvb2xDYWxsLFxuICBmaW5hbGl6ZTogYXRGaW5hbGl6ZU5vZGUsXG4gIHN0YXRzOiBhdEdldFN0YXRzLFxuICByZXNldDogYXRSZXNldCxcbiAgbW9jazogY3JlYXRlTW9ja0FjdGl2aXR5VHJlZSxcbiAgZm9ybWF0RWxhcHNlZCxcbiAgZm9ybWF0RHVyYXRpb24sXG4gIEFHRU5UX01FVEEsXG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU1NFIEV2ZW50IEJyaWRnZSAoY2FsbGVkIGZyb20gbWVzc2FnZXMudHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gVHJhY2tzIHdoaWNoIGFnZW50IGlzIGN1cnJlbnRseSBhY3RpdmUgYmFzZWQgb24gdG9vbCBjYWxscy5cbi8vIFdoZW4gZGVsZWdhdGVfdGFzayBpcyBkZXRlY3RlZCwgY3JlYXRlcyBhIG5ldyBhZ2VudCBub2RlLlxuLy8gT3RoZXJ3aXNlLCBhdHRhY2hlcyB0b29sIGNhbGxzIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBhZ2VudCBub2RlLlxuXG5sZXQgX2FjdGl2ZUFnZW50Tm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgIC8vIEN1cnJlbnQgYWdlbnQgbm9kZSByZWNlaXZpbmcgdG9vbCBjYWxsc1xubGV0IF9sYXN0VG9vbElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgICAgICAgICAgLy8gTGFzdCB0b29sIGNhbGwgSUQgKGZvciBjb21wbGV0ZSBtYXRjaGluZylcblxuZnVuY3Rpb24gX2F0VHJhY2tUb29sKGQ6IGFueSk6IHZvaWQge1xuICBpZiAoIVMuYWN0aXZpdHlUcmVlKSBpbml0QWN0aXZpdHlUcmVlKCk7XG4gIGNvbnN0IHRyZWUgPSBTLmFjdGl2aXR5VHJlZSE7XG5cbiAgLy8gRGV0ZWN0IGRlbGVnYXRpb24gXHUyMDE0IHdoZW4gdG9vbCBuYW1lIGlzICdkZWxlZ2F0ZV90YXNrJ1xuICBpZiAoZC5uYW1lID09PSAnZGVsZWdhdGVfdGFzaycpIHtcbiAgICBjb25zdCBhZ2VudElkID0gZC5hcmdzPy5hZ2VudElkIHx8IGQuYXJncz8uYWdlbnQgfHwgZC5hcmdzPy5uYW1lIHx8ICd1bmtub3duJztcbiAgICBjb25zdCB0YXNrID0gZC5hcmdzPy5nb2FsIHx8IGQuYXJncz8ucHJvbXB0IHx8IGQuYXJncz8udGFzayB8fCBkLnByZXZpZXcgfHwgJ0RlbGVnYXRlZCB0YXNrJztcbiAgICBjb25zdCBub2RlID0gYXRBZGROb2RlKHsgYWdlbnRJZCwgdGFzaywgc3RhdHVzOiAncnVubmluZycgfSk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIF9hY3RpdmVBZ2VudE5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGljaCBub2RlIHRvIGF0dGFjaCB0aGUgdG9vbCBjYWxsIHRvXG4gIGxldCB0YXJnZXROb2RlSWQgPSBfYWN0aXZlQWdlbnROb2RlSWQgfHwgdHJlZS5yb290SWQ7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIGlzIGZyb20gYSBzcGVjaWZpYyBhZ2VudCAoZnJvbSBpbmZsaWdodCBtZXRhZGF0YSlcbiAgY29uc3QgaW5mbGlnaHQgPSAod2luZG93IGFzIGFueSkuSU5GTElHSFQ/LltTLnNlc3Npb24/LnNlc3Npb25faWRdO1xuICBpZiAoaW5mbGlnaHQ/LnRoaXNUdXJuQWdlbnQpIHtcbiAgICBjb25zdCBhZ2VudEtleSA9IGluZmxpZ2h0LnRoaXNUdXJuQWdlbnQ7XG4gICAgLy8gRmluZCBvciBjcmVhdGUgbm9kZSBmb3IgdGhpcyBhZ2VudFxuICAgIGNvbnN0IGV4aXN0aW5nTm9kZSA9IE9iamVjdC52YWx1ZXModHJlZS5ub2RlcykuZmluZChcbiAgICAgIChuOiBBY3Rpdml0eU5vZGUpID0+IG4uYWdlbnRJZCA9PT0gYWdlbnRLZXkgJiYgKG4uc3RhdHVzID09PSAncnVubmluZycgfHwgbi5zdGF0dXMgPT09ICd0aGlua2luZycpXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdOb2RlKSB7XG4gICAgICB0YXJnZXROb2RlSWQgPSBleGlzdGluZ05vZGUuaWQ7XG4gICAgICBfYWN0aXZlQWdlbnROb2RlSWQgPSBleGlzdGluZ05vZGUuaWQ7XG4gICAgfSBlbHNlIGlmIChBR0VOVF9NRVRBW2FnZW50S2V5XSkge1xuICAgICAgLy8gTmV3IGFnZW50IGFwcGVhcmVkIFx1MjAxNCBjcmVhdGUgbm9kZVxuICAgICAgY29uc3QgdGFzayA9IGluZmxpZ2h0LnRoaXNUdXJuTW9kZWwgPyBgJHtpbmZsaWdodC50aGlzVHVybk1vZGVsfWAgOiAnV29ya2luZy4uLic7XG4gICAgICBjb25zdCBub2RlID0gYXRBZGROb2RlKHsgYWdlbnRJZDogYWdlbnRLZXksIHRhc2ssIHN0YXR1czogJ3J1bm5pbmcnIH0pO1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbm9kZS5pZDtcbiAgICAgICAgdGFyZ2V0Tm9kZUlkID0gbm9kZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB0YyA9IGF0QWRkVG9vbENhbGwodGFyZ2V0Tm9kZUlkLCB7XG4gICAgbmFtZTogZC5uYW1lLFxuICAgIGFyZ3M6IGQuYXJncyB8fCB7fSxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgfSk7XG4gIGlmICh0Yykge1xuICAgIF9sYXN0VG9vbElkID0gdGMuaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2F0VHJhY2tUb29sQ29tcGxldGUoZDogYW55KTogdm9pZCB7XG4gIGlmICghUy5hY3Rpdml0eVRyZWUpIHJldHVybjtcbiAgY29uc3QgdHJlZSA9IFMuYWN0aXZpdHlUcmVlITtcblxuICAvLyBUcnkgdG8gZmluZCB0aGUgbWF0Y2hpbmcgcnVubmluZyB0b29sIGNhbGwgYWNyb3NzIGFsbCBhY3RpdmUgbm9kZXNcbiAgY29uc3QgYWN0aXZlTm9kZXMgPSBPYmplY3QudmFsdWVzKHRyZWUubm9kZXMpLmZpbHRlcihcbiAgICAobjogQWN0aXZpdHlOb2RlKSA9PiBuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnIHx8IG4uc3RhdHVzID09PSAndGhpbmtpbmcnXG4gICk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgZm9yIChjb25zdCB0YyBvZiBub2RlLnRvb2xDYWxscykge1xuICAgICAgaWYgKHRjLnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIHRjLm5hbWUgPT09IGQubmFtZSkge1xuICAgICAgICBhdFVwZGF0ZVRvb2xDYWxsKG5vZGUuaWQsIHRjLmlkLCB7XG4gICAgICAgICAgc3RhdHVzOiBkLmlzX2Vycm9yID8gJ2Vycm9yJyA6ICdkb25lJyxcbiAgICAgICAgICByZXN1bHQ6IGQucHJldmlldyB8fCBkLnJlc3VsdCxcbiAgICAgICAgICBkdXJhdGlvbjogZC5kdXJhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2F0VHJhY2tEb25lKCk6IHZvaWQge1xuICBpZiAoIVMuYWN0aXZpdHlUcmVlKSByZXR1cm47XG5cbiAgLy8gRmluYWxpemUgdGhlIGFjdGl2ZSBhZ2VudCBub2RlXG4gIGlmIChfYWN0aXZlQWdlbnROb2RlSWQpIHtcbiAgICBhdEZpbmFsaXplTm9kZShfYWN0aXZlQWdlbnROb2RlSWQsICdkb25lJyk7XG4gICAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc2V0IHJvb3Qgc3RhdHVzXG4gIGNvbnN0IHJvb3QgPSBTLmFjdGl2aXR5VHJlZS5ub2Rlc1tTLmFjdGl2aXR5VHJlZS5yb290SWRdO1xuICBpZiAocm9vdCkge1xuICAgIHJvb3Quc3RhdHVzID0gJ3J1bm5pbmcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hdFRyYWNrTmV3U2Vzc2lvbigpOiB2b2lkIHtcbiAgX2FjdGl2ZUFnZW50Tm9kZUlkID0gbnVsbDtcbiAgX2xhc3RUb29sSWQgPSBudWxsO1xuICBpZiAoUy5hY3Rpdml0eVRyZWUpIHtcbiAgICBhdFJlc2V0KCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFNQSxRQUFNLGFBQTJFO0FBQUEsSUFDL0UsTUFBZ0IsRUFBRSxPQUFPLGFBQU0sTUFBTSxRQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMvRCxPQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLFNBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELGlCQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLGlCQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMvRCxXQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLGFBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELE1BQWdCLEVBQUUsT0FBTyxnQkFBTSxNQUFNLFFBQWtCLE1BQU0sRUFBRTtBQUFBLElBQy9ELEtBQWdCLEVBQUUsT0FBTyxhQUFNLE1BQU0sT0FBa0IsTUFBTSxFQUFFO0FBQUEsSUFDL0QsV0FBZ0IsRUFBRSxPQUFPLGFBQU0sTUFBTSxhQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMvRCxNQUFnQixFQUFFLE9BQU8sYUFBTSxNQUFNLFFBQWtCLE1BQU0sRUFBRTtBQUFBLEVBQ2pFO0FBU0EsTUFBSSxlQUFlO0FBQ25CLFdBQVMsWUFBWSxTQUF5QjtBQUM1QyxXQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsWUFBWTtBQUFBLEVBQ3JDO0FBSUEsV0FBUyxtQkFBaUM7QUFDeEMsVUFBTSxPQUFxQjtBQUFBLE1BQ3pCLFNBQVM7QUFBQSxNQUNULFFBQVE7QUFBQSxNQUNSLE9BQU87QUFBQSxRQUNMLE1BQU07QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFdBQVc7QUFBQSxVQUNYLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLFdBQVcsQ0FBQztBQUFBLFVBQ1osV0FBVyxLQUFLLElBQUk7QUFBQSxVQUNwQixTQUFTO0FBQUEsVUFDVCxVQUFVO0FBQUEsVUFDVixVQUFVLENBQUM7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFVBQVUsQ0FBQztBQUFBLFFBQ2I7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPLFlBQVk7QUFBQSxJQUNyQjtBQUNBLE1BQUUsZUFBZTtBQUNqQixNQUFFLFdBQVcsQ0FBQztBQUNkLE1BQUUsU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxjQUF1QjtBQUM5QixXQUFPO0FBQUEsTUFDTCxhQUFhO0FBQUEsTUFDYixlQUFlO0FBQUEsTUFDZixlQUFlO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixXQUFXO0FBQUEsTUFDWCxjQUFjO0FBQUEsTUFDZCxpQkFBaUI7QUFBQSxNQUNqQixjQUFjO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBSUEsV0FBUyxVQUFVLE1BTUs7QUFDdEIsVUFBTSxPQUFPLEVBQUU7QUFDZixRQUFJLENBQUMsS0FBTSxRQUFPO0FBRWxCLFVBQU0sV0FBVyxLQUFLLFlBQVksS0FBSztBQUN2QyxVQUFNLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFDbEMsUUFBSSxDQUFDLE9BQVEsUUFBTztBQUVwQixVQUFNLE9BQU8sV0FBVyxLQUFLLE9BQU87QUFDcEMsVUFBTSxPQUFPLEtBQUssU0FBUyxPQUFPLEtBQUssT0FBTztBQUM5QyxVQUFNLEtBQUssWUFBWSxLQUFLLE9BQU87QUFFbkMsVUFBTSxPQUFxQjtBQUFBLE1BQ3pCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUyxLQUFLO0FBQUEsTUFDZCxZQUFZLE1BQU0sU0FBUztBQUFBLE1BQzNCLFdBQVcsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUM5QjtBQUFBLE1BQ0EsUUFBUSxLQUFLLFVBQVU7QUFBQSxNQUN2QixNQUFNLEtBQUs7QUFBQSxNQUNYLFdBQVcsQ0FBQztBQUFBLE1BQ1osV0FBVyxLQUFLLFdBQVcsWUFBWSxLQUFLLElBQUksSUFBSTtBQUFBLE1BQ3BELFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWLFVBQVUsQ0FBQztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsVUFBVSxDQUFDO0FBQUEsSUFDYjtBQUVBLFNBQUssTUFBTSxFQUFFLElBQUk7QUFDakIsV0FBTyxTQUFTLEtBQUssRUFBRTtBQUN2QixpQkFBYSxJQUFJO0FBQ2pCLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyxhQUFhLFFBQWdCLFNBQXNDO0FBQzFFLFVBQU0sT0FBTyxFQUFFO0FBQ2YsUUFBSSxDQUFDLEtBQU07QUFDWCxVQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDOUIsUUFBSSxDQUFDLEtBQU07QUFDWCxXQUFPLE9BQU8sTUFBTSxPQUFPO0FBQzNCLGlCQUFhLElBQUk7QUFBQSxFQUNuQjtBQUVBLFdBQVMsVUFBVSxRQUFxQztBQUN0RCxXQUFPLEVBQUUsY0FBYyxNQUFNLE1BQU0sS0FBSztBQUFBLEVBQzFDO0FBb0JBLFdBQVMsY0FBYyxRQUFnQixJQUlYO0FBQzFCLFVBQU0sT0FBTyxFQUFFO0FBQ2YsUUFBSSxDQUFDLEtBQU0sUUFBTztBQUNsQixVQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDOUIsUUFBSSxDQUFDLEtBQU0sUUFBTztBQUdsQixRQUFJLEtBQUssV0FBVyxXQUFXO0FBQzdCLFdBQUssU0FBUztBQUNkLFdBQUssWUFBWSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQUEsSUFDOUM7QUFFQSxVQUFNLFdBQTZCO0FBQUEsTUFDakMsSUFBSSxNQUFNLEVBQUUsWUFBWTtBQUFBLE1BQ3hCLE1BQU0sR0FBRztBQUFBLE1BQ1QsUUFBUSxHQUFHLFVBQVU7QUFBQSxNQUNyQixNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQUEsTUFDbEIsV0FBVyxLQUFLLElBQUk7QUFBQSxNQUNwQixTQUFTO0FBQUEsSUFDWDtBQUVBLFNBQUssVUFBVSxLQUFLLFFBQVE7QUFDNUIsaUJBQWEsSUFBSTtBQUNqQixXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsaUJBQWlCLFFBQWdCLFFBQWdCLFNBQTBDO0FBQ2xHLFVBQU0sT0FBTyxFQUFFO0FBQ2YsUUFBSSxDQUFDLEtBQU07QUFDWCxVQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDOUIsUUFBSSxDQUFDLEtBQU07QUFFWCxVQUFNLEtBQUssS0FBSyxVQUFVLEtBQUssT0FBSyxFQUFFLE9BQU8sTUFBTTtBQUNuRCxRQUFJLENBQUMsR0FBSTtBQUVULFdBQU8sT0FBTyxJQUFJLE9BQU87QUFDekIsUUFBSSxRQUFRLFdBQVcsVUFBVSxRQUFRLFdBQVcsU0FBUztBQUMzRCxTQUFHLFVBQVUsR0FBRyxXQUFXLEtBQUssSUFBSTtBQUNwQyxTQUFHLFdBQVcsR0FBRyxhQUFhLEdBQUcsVUFBVSxHQUFHLGFBQWEsTUFBTztBQUFBLElBQ3BFO0FBQ0EsaUJBQWEsSUFBSTtBQUFBLEVBQ25CO0FBSUEsV0FBUyxlQUFlLFFBQWdCLFFBQXNDO0FBQzVFLFVBQU0sT0FBTyxFQUFFO0FBQ2YsUUFBSSxDQUFDLEtBQU07QUFDWCxVQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDOUIsUUFBSSxDQUFDLEtBQU07QUFFWCxTQUFLLFNBQVM7QUFDZCxTQUFLLFVBQVUsS0FBSyxJQUFJO0FBQ3hCLFNBQUssV0FBVyxLQUFLLGFBQWEsS0FBSyxVQUFVLEtBQUssYUFBYSxNQUFPO0FBRzFFLGVBQVcsTUFBTSxLQUFLLFdBQVc7QUFDL0IsVUFBSSxHQUFHLFdBQVcsYUFBYSxHQUFHLFdBQVcsV0FBVztBQUN0RCxXQUFHLFNBQVMsV0FBVyxVQUFVLFVBQVU7QUFDM0MsV0FBRyxVQUFVLEtBQUs7QUFDbEIsV0FBRyxXQUFXLEdBQUcsYUFBYSxHQUFHLFVBQVUsR0FBRyxhQUFhLE1BQU87QUFBQSxNQUNwRTtBQUFBLElBQ0Y7QUFHQSxlQUFXLFdBQVcsS0FBSyxVQUFVO0FBQ25DLFlBQU0sUUFBUSxLQUFLLE1BQU0sT0FBTztBQUNoQyxVQUFJLFVBQVUsTUFBTSxXQUFXLGFBQWEsTUFBTSxXQUFXLGNBQWMsTUFBTSxXQUFXLFlBQVk7QUFDdEcsdUJBQWUsU0FBUyxNQUFNO0FBQUEsTUFDaEM7QUFBQSxJQUNGO0FBRUEsaUJBQWEsSUFBSTtBQUFBLEVBQ25CO0FBSUEsV0FBUyxhQUFhLE1BQTBCO0FBQzlDLFVBQU0sUUFBUSxPQUFPLE9BQU8sS0FBSyxLQUFLLEVBQUUsT0FBTyxPQUFLLEVBQUUsT0FBTyxLQUFLLE1BQU07QUFDeEUsVUFBTSxRQUFRLE1BQU0sUUFBUSxPQUFLLEVBQUUsU0FBUztBQUU1QyxVQUFNLGdCQUFnQixNQUNuQixPQUFPLE9BQUssRUFBRSxhQUFhLElBQUksRUFDL0IsSUFBSSxPQUFLLEVBQUUsUUFBUztBQUV2QixVQUFNLGVBQWUsTUFBTSxPQUFPLE9BQUssRUFBRSxXQUFXLGFBQWEsRUFBRSxXQUFXLFVBQVU7QUFDeEYsVUFBTSxhQUFhLGFBQWEsT0FBTyxDQUFDLEtBQUssTUFBTTtBQUNqRCxZQUFNLFVBQVUsRUFBRSxhQUFhLEtBQUssSUFBSSxJQUFJLEVBQUUsYUFBYSxNQUFPO0FBQ2xFLGFBQU8sS0FBSyxJQUFJLEtBQUssT0FBTztBQUFBLElBQzlCLEdBQUcsQ0FBQztBQUVKLFNBQUssUUFBUTtBQUFBLE1BQ1gsYUFBYSxNQUFNO0FBQUEsTUFDbkIsZUFBZSxhQUFhO0FBQUEsTUFDNUIsZUFBZSxNQUFNLE9BQU8sT0FBSyxFQUFFLFdBQVcsU0FBUyxFQUFFO0FBQUEsTUFDekQsWUFBWSxNQUFNLE9BQU8sT0FBSyxFQUFFLFdBQVcsTUFBTSxFQUFFO0FBQUEsTUFDbkQsYUFBYSxNQUFNLE9BQU8sT0FBSyxFQUFFLFdBQVcsT0FBTyxFQUFFO0FBQUEsTUFDckQsWUFBWSxNQUFNO0FBQUEsTUFDbEIsV0FBVyxNQUFNLE9BQU8sT0FBSyxFQUFFLFdBQVcsTUFBTSxFQUFFO0FBQUEsTUFDbEQsY0FBYyxNQUFNLE9BQU8sT0FBSyxFQUFFLFdBQVcsU0FBUyxFQUFFO0FBQUEsTUFDeEQsaUJBQWlCLGNBQWMsU0FDM0IsY0FBYyxPQUFPLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksY0FBYyxTQUN6RDtBQUFBLE1BQ0osY0FBYztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFdBQVMsYUFBc0I7QUFDN0IsV0FBTyxFQUFFLGNBQWMsU0FBUyxZQUFZO0FBQUEsRUFDOUM7QUFJQSxXQUFTLFVBQWdCO0FBQ3ZCLG1CQUFlO0FBQ2YscUJBQWlCO0FBQUEsRUFDbkI7QUFJQSxXQUFTLGNBQWMsSUFBb0I7QUFDekMsUUFBSSxLQUFLLElBQU0sUUFBTyxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUM7QUFDdkMsVUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLLEdBQUk7QUFDOUIsUUFBSSxJQUFJLEdBQUksUUFBTyxHQUFHLENBQUM7QUFDdkIsVUFBTSxJQUFJLEtBQUssTUFBTSxJQUFJLEVBQUU7QUFDM0IsVUFBTSxLQUFLLElBQUk7QUFDZixRQUFJLElBQUksR0FBSSxRQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUU7QUFDOUIsVUFBTSxJQUFJLEtBQUssTUFBTSxJQUFJLEVBQUU7QUFDM0IsVUFBTSxLQUFLLElBQUk7QUFDZixXQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUU7QUFBQSxFQUNwQjtBQUVBLFdBQVMsZUFBZSxTQUFnQztBQUN0RCxRQUFJLFlBQVksS0FBTSxRQUFPO0FBQzdCLFFBQUksVUFBVSxLQUFNLFFBQU87QUFDM0IsUUFBSSxVQUFVLEVBQUcsUUFBTyxHQUFHLFFBQVEsUUFBUSxDQUFDLENBQUM7QUFDN0MsUUFBSSxVQUFVLEdBQUksUUFBTyxHQUFHLFFBQVEsUUFBUSxDQUFDLENBQUM7QUFDOUMsVUFBTSxJQUFJLEtBQUssTUFBTSxVQUFVLEVBQUU7QUFDakMsVUFBTSxLQUFLLEtBQUssTUFBTSxVQUFVLEVBQUU7QUFDbEMsV0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFO0FBQUEsRUFDcEI7QUFJQSxXQUFTLHlCQUF1QztBQUM5QyxxQkFBaUI7QUFDakIsVUFBTSxPQUFPLEVBQUU7QUFDZixVQUFNLE1BQU0sS0FBSyxJQUFJO0FBR3JCLFVBQU0sUUFBUSxVQUFVLEVBQUUsU0FBUyxTQUFTLE1BQU0sK0JBQStCLFFBQVEsVUFBVSxDQUFDO0FBQ3BHLFVBQU0sWUFBWSxNQUFNO0FBQ3hCLGtCQUFjLE1BQU0sSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLE1BQU0sRUFBRSxTQUFTLFdBQVcsTUFBTSxRQUFRLEVBQUUsQ0FBQztBQUM3RixxQkFBaUIsTUFBTSxJQUFJLE1BQU0sVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsUUFBUSxRQUFRLGNBQWMsVUFBVSxJQUFJLENBQUM7QUFDekcsVUFBTSxVQUFVLENBQUMsRUFBRSxZQUFZLE1BQU07QUFDckMsVUFBTSxVQUFVLENBQUMsRUFBRSxVQUFVLE1BQU07QUFFbkMsa0JBQWMsTUFBTSxJQUFJLEVBQUUsTUFBTSxhQUFhLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixFQUFFLENBQUM7QUFHcEYsVUFBTSxZQUFZLFVBQVUsRUFBRSxTQUFTLGFBQWEsTUFBTSw2QkFBNkIsUUFBUSxVQUFVLENBQUM7QUFDMUcsY0FBVSxZQUFZLE1BQU07QUFDNUIsa0JBQWMsVUFBVSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsTUFBTSxFQUFFLEtBQUssOEJBQThCLEVBQUUsQ0FBQztBQUN0RyxxQkFBaUIsVUFBVSxJQUFJLFVBQVUsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsUUFBUSxRQUFRLGVBQWUsVUFBVSxJQUFJLENBQUM7QUFDbEgsY0FBVSxVQUFVLENBQUMsRUFBRSxZQUFZLE1BQU07QUFDekMsY0FBVSxVQUFVLENBQUMsRUFBRSxVQUFVLE1BQU07QUFFdkMsa0JBQWMsVUFBVSxJQUFJLEVBQUUsTUFBTSxZQUFZLE1BQU0sRUFBRSxTQUFTLHFCQUFxQixFQUFFLENBQUM7QUFHekYsVUFBTSxZQUFZLFVBQVUsRUFBRSxTQUFTLGFBQWEsTUFBTSw0QkFBNEIsUUFBUSxVQUFVLENBQUM7QUFHekcsVUFBTSxhQUFhLFVBQVUsRUFBRSxVQUFVLE1BQU0sSUFBSSxTQUFTLGNBQWMsTUFBTSw2QkFBNkIsUUFBUSxXQUFXLE1BQU0sRUFBRSxDQUFDO0FBQ3pJLGVBQVcsYUFBYTtBQUN4QixlQUFXLFlBQVk7QUFDdkIsZUFBVyxZQUFZLE1BQU07QUFFN0Isa0JBQWMsV0FBVyxJQUFJLEVBQUUsTUFBTSxjQUFjLE1BQU0sRUFBRSxPQUFPLHlCQUF5QixFQUFFLENBQUM7QUFFOUYsaUJBQWEsSUFBSTtBQUNqQixXQUFPO0FBQUEsRUFDVDtBQUdBLFNBQU8sbUJBQW1CO0FBQzFCLFNBQU8seUJBQXlCO0FBQ2hDLFNBQU8sZ0JBQWdCO0FBQ3ZCLFNBQU8saUJBQWlCO0FBQ3hCLFNBQU8sWUFBWTtBQUNuQixTQUFPLGVBQWU7QUFDdEIsU0FBTyxZQUFZO0FBQ25CLFNBQU8sZ0JBQWdCO0FBQ3ZCLFNBQU8sbUJBQW1CO0FBQzFCLFNBQU8saUJBQWlCO0FBQ3hCLFNBQU8sYUFBYTtBQUNwQixTQUFPLFVBQVU7QUFDakIsU0FBTyxlQUFlO0FBQ3RCLFNBQU8sdUJBQXVCO0FBQzlCLFNBQU8sZUFBZTtBQUd0QixFQUFDLE9BQWUsTUFBTTtBQUFBLElBQ3BCLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULFlBQVk7QUFBQSxJQUNaLFNBQVM7QUFBQSxJQUNULGFBQWE7QUFBQSxJQUNiLGdCQUFnQjtBQUFBLElBQ2hCLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBT0EsTUFBSSxxQkFBb0M7QUFDeEMsTUFBSSxjQUE2QjtBQUVqQyxXQUFTLGFBQWEsR0FBYztBQUNsQyxRQUFJLENBQUMsRUFBRSxhQUFjLGtCQUFpQjtBQUN0QyxVQUFNLE9BQU8sRUFBRTtBQUdmLFFBQUksRUFBRSxTQUFTLGlCQUFpQjtBQUM5QixZQUFNLFVBQVUsRUFBRSxNQUFNLFdBQVcsRUFBRSxNQUFNLFNBQVMsRUFBRSxNQUFNLFFBQVE7QUFDcEUsWUFBTSxPQUFPLEVBQUUsTUFBTSxRQUFRLEVBQUUsTUFBTSxVQUFVLEVBQUUsTUFBTSxRQUFRLEVBQUUsV0FBVztBQUM1RSxZQUFNLE9BQU8sVUFBVSxFQUFFLFNBQVMsTUFBTSxRQUFRLFVBQVUsQ0FBQztBQUMzRCxVQUFJLE1BQU07QUFDUiw2QkFBcUIsS0FBSztBQUFBLE1BQzVCO0FBQ0E7QUFBQSxJQUNGO0FBR0EsUUFBSSxlQUFlLHNCQUFzQixLQUFLO0FBRzlDLFVBQU0sV0FBWSxPQUFlLFdBQVcsRUFBRSxTQUFTLFVBQVU7QUFDakUsUUFBSSxVQUFVLGVBQWU7QUFDM0IsWUFBTSxXQUFXLFNBQVM7QUFFMUIsWUFBTSxlQUFlLE9BQU8sT0FBTyxLQUFLLEtBQUssRUFBRTtBQUFBLFFBQzdDLENBQUMsTUFBb0IsRUFBRSxZQUFZLGFBQWEsRUFBRSxXQUFXLGFBQWEsRUFBRSxXQUFXO0FBQUEsTUFDekY7QUFDQSxVQUFJLGNBQWM7QUFDaEIsdUJBQWUsYUFBYTtBQUM1Qiw2QkFBcUIsYUFBYTtBQUFBLE1BQ3BDLFdBQVcsV0FBVyxRQUFRLEdBQUc7QUFFL0IsY0FBTSxPQUFPLFNBQVMsZ0JBQWdCLEdBQUcsU0FBUyxhQUFhLEtBQUs7QUFDcEUsY0FBTSxPQUFPLFVBQVUsRUFBRSxTQUFTLFVBQVUsTUFBTSxRQUFRLFVBQVUsQ0FBQztBQUNyRSxZQUFJLE1BQU07QUFDUiwrQkFBcUIsS0FBSztBQUMxQix5QkFBZSxLQUFLO0FBQUEsUUFDdEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFVBQU0sS0FBSyxjQUFjLGNBQWM7QUFBQSxNQUNyQyxNQUFNLEVBQUU7QUFBQSxNQUNSLE1BQU0sRUFBRSxRQUFRLENBQUM7QUFBQSxNQUNqQixRQUFRO0FBQUEsSUFDVixDQUFDO0FBQ0QsUUFBSSxJQUFJO0FBQ04sb0JBQWMsR0FBRztBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLFdBQVMscUJBQXFCLEdBQWM7QUFDMUMsUUFBSSxDQUFDLEVBQUUsYUFBYztBQUNyQixVQUFNLE9BQU8sRUFBRTtBQUdmLFVBQU0sY0FBYyxPQUFPLE9BQU8sS0FBSyxLQUFLLEVBQUU7QUFBQSxNQUM1QyxDQUFDLE1BQW9CLEVBQUUsV0FBVyxhQUFhLEVBQUUsV0FBVztBQUFBLElBQzlEO0FBRUEsZUFBVyxRQUFRLGFBQWE7QUFDOUIsaUJBQVcsTUFBTSxLQUFLLFdBQVc7QUFDL0IsWUFBSSxHQUFHLFdBQVcsYUFBYSxHQUFHLFNBQVMsRUFBRSxNQUFNO0FBQ2pELDJCQUFpQixLQUFLLElBQUksR0FBRyxJQUFJO0FBQUEsWUFDL0IsUUFBUSxFQUFFLFdBQVcsVUFBVTtBQUFBLFlBQy9CLFFBQVEsRUFBRSxXQUFXLEVBQUU7QUFBQSxZQUN2QixVQUFVLEVBQUU7QUFBQSxVQUNkLENBQUM7QUFDRDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGVBQXFCO0FBQzVCLFFBQUksQ0FBQyxFQUFFLGFBQWM7QUFHckIsUUFBSSxvQkFBb0I7QUFDdEIscUJBQWUsb0JBQW9CLE1BQU07QUFDekMsMkJBQXFCO0FBQUEsSUFDdkI7QUFHQSxVQUFNLE9BQU8sRUFBRSxhQUFhLE1BQU0sRUFBRSxhQUFhLE1BQU07QUFDdkQsUUFBSSxNQUFNO0FBQ1IsV0FBSyxTQUFTO0FBQUEsSUFDaEI7QUFBQSxFQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=