Mission Control Dashboard Plugin

linkPlugin settings

name

Mission Control Dashboard

Information

description

Multifunctional, highly configurable account dashboard


icon

dashboard


setting

Tag to apply to planning notes

Default is "planning/quarterly"

setting

Console logging

Default is false, only for debugging

setting

debug_console

Default is false, only for debugging

instructions

This plugin allows you to get a high-level glimpse of what's going on in your world. Here is the help page on how to install it.



We call the different components "widgets," and these widgets can be reordered by clicking "Layout" in the top-left, or by clicking for two seconds on the title bar of a widget. You can add a background image under "Settings."

Prerequisites: Ensure you have created at least one Task Domain to use the dashboard. All notes and tasks are picked from the selected domain. Task Domain setup instructions.

Current widgets offered by the Amplenote Dashboard include:

1. Quarterly planning. The starting point for the "Dreamtask" widget, and for your day in general. The dashboard ensures that you keep what matters top-of-mind. By default, it allows the quarterly plan to be augmented with a monthly plan. If you make it 2-tall, it also has room to present your weekly plan.
2. Victory Value. How much is getting done each day, and how do you feel while doing it? Hover on a day to remember the specific tasks you finished.
3. Dreamtask. Use your preferred LLM to synthesize your quarterly/monthly/weekly plan with the tasks in your task domain. Get 2-4 tasks recommended each day, with a record of past recommendations to ensure that you get new tasks every day of the week.
4. Day Sketcher. Sketch out what to focus on today in a tab-navigable per-hour breakdown.
5. Revisit candidates. Notes with tasks that have been languishing. When you get distracted from a project, this widget helps you re-engage with long-term ideas.
6. Mood tracker. Display your daily mood ratings in either "cycle" or "wave" form. Even though nobody wants to hear about your crappy day, Amplenote Dashboard wants to help you feel "seen" by letting you leave a record of each day's highs & lows, as recommended by the experts.
7. Peak hours. Which hours were most productive during the currently selected month: both for originating ideas that ended up being high in Victory Value, or for completing said ideas?
8. Calendar. The control center for the date-based modules, allows you to see which dates have events scheduled along with specifying which date you want to see featured in the rest of the dashboard.
9. Task Agenda. What's on the docket in the coming days? Uses the Task Domain selected atop the dashboard, combined with the date selected in Calendar.
10. Inspiration quotes. Take a wild guess.
11. Quick actions. Jump to your daily jot, calendar, or a random note 🎲

Drop a comment if there's another widget you'd like to see added?



linkUpdates

August 3, 2026

Add Note Peek module for rendering portion of a note in a dashboard component

Add additional Quick Action options: cycle background, leave feedback

Update Proposed Tasks & Goal Coach to use improved, shared context building

When focusing a module (clicking its icon) on desktop, grow its size when the component allows it

July 18, 2026

Add Energy Delta per Habit component

Optimize mobile to load components on scroll (vs slowly loading everything all at once)

Standardize font to Roboto

June 27, 2026

Add Shared Notes component

Add Proposed Agenda component

Fix "Layout" popup not fitting within mobile screen

May 10, 2026

Add Task Retirement Center to suggest tasks that could be dismissed, and get progressively rewarded for acting on old tasks

Add widget layout profiles to allow users to customize which widgets are shown for different personas

Fix Goal Coach consistently taking 10s+ to render

Implement "Component Spotlight": Click the icon of a component to have it swoop into center stage (as means to savor the day's background image)

April 29, 2026.

Intersperse events & tasks in agenda

Fix events not showing on mobile Dashboard

Use data cached note for "Recent Notes" component to expedite rendering across devices

Add link to schedule Dream Tasks

April 16, 2026. Incorporate calendar events & Ample Agent Pro

Calendar events now shown in Agenda

Calendar events now shown in Day Sketch

Dream Task uses Ample Agent Pro to generate suggested tasks, when available

Update global "Settings" to allow specifying "Week" and "Hour" format, using defaults that accord with the user's locale. The date/time settings chosen are now applied to all components that renders dates & times (currently Agenda, Calendar, Dream Task, Day Sketch, and Peak Hours)

Update Day Sketch component to allow up/down arrows to switch between hours of day

April 5, 2026. Dream Task v2

Add tests for suggester with all the AI providers

More descriptive Dream Task error messages

March 24, 2026

Fixed background image uploads not being processed.

Set up default background to be used when none has been uploaded

Don't show hidden tasks in agenda

Ensure recommended tasks are synced between devices

Mood rating notes now recorded to the same data store as in-app mood ratings


linkCodes

(() => {
// lib/dashboard/layout-profiles.js
var WIDGET_REGISTRY = [
{
widgetId: "layout-picker",
name: "Layout Picker",
description: "One-click presets that rearrange your entire dashboard into a curated profile",
icon: "\u{1F5C2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "dream-task",
name: "Goal Coach",
description: "Get task suggestions that blend quarterly/monthly goals with day-of-week preferences",
icon: "\u{1F52E}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2,
visibleSubtitle: "What if you did it today?"
},
{
widgetId: "day-sketch",
name: "Day Sketcher",
description: "Notebook-paper day planner with hour-by-hour entries saved to a note",
icon: "\u{1F5D2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "proposed-agenda",
name: "Proposed Agenda",
description: "AI-proposed hour-by-hour schedule built from your recent tasks and quarterly plan",
icon: "\u{1F5D3}\uFE0F",
defaultGridWidthSize: 2,
introducedAt: "2026-06-27",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Inspiration Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "graveyard",
name: "Task Retirement Center",
description: "Surface neglected tasks and retire them to an archived note",
icon: "\u{1F475}\uFE0F",
defaultGridWidthSize: 2,
introducedAt: "2026-05-09",
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "recent-notes",
name: "Revisit Candidate",
description: "Notes with open tasks that have not had a new task in over a week",
icon: "\u{1F4DD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "shared-notes",
name: "Shared Notes",
description: "Shared notes recently updated by a collaborator after your own changes",
icon: "\u{1F91D}",
defaultGridWidthSize: 2,
introducedAt: "2026-06-26",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "note-peek",
name: "Note Peek",
description: "Display the contents of any note you choose, clipped to the widget's size",
icon: "\u{1F4D8}",
defaultGridWidthSize: 2,
introducedAt: "2026-08-03",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Energy (Mood) Tracker",
visibleTitle: "How goes it?",
description: "Log your daily energy level and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "peak-hours",
name: "Peak Hours",
description: "Hourly distribution of task creation and completion activity",
icon: "\u23F0",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "energy-per-habit",
name: "Energy Per Habit",
visibleTitle: "Energy delta per habit",
description: "Correlate each recurring-task habit with how you felt: average energy on days you do it vs. don't",
icon: "\u{1F50B}",
defaultGridWidthSize: 2,
introducedAt: "2026-07-17",
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "debug-console",
name: "Debug Console",
description: "Scrollable log viewer showing all logIfEnabled messages (developer tool)",
icon: "\u{1F41B}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2,
debugOnly: true
}
];
 
// lib/constants/settings.js
var SETTING_KEYS = {
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode",
CONSOLE_LOGGING: "Console logging",
DASHBOARD_COMPONENTS: "dashboard_elements",
DEBUG_CONSOLE: "debug_console",
LLM_API_KEY_ANTHROPIC: "Anthropic API Key",
LLM_API_KEY_GEMINI: "Gemini API Key",
LLM_API_KEY_GROK: "Grok API Key",
LLM_API_KEY_OPENAI: "OpenAI API Key",
LLM_PROVIDER_MODEL: "LLM Provider",
FIRST_INSTALLED_AT: "dashboard_first_installed_at",
RENDER_BREADCRUMB: "dashboard_render_breadcrumb",
SELECTED_LAYOUT_PROFILE: "dashboard_selected_layout_profile",
TASK_DOMAINS: "dashboard_task_domains",
PLANNING_NOTE_TAG: "Tag to apply to planning notes",
PROPOSED_AGENDA_PRIORITY: "dashboard_proposed_agenda_priority",
PROPOSED_AGENDA_LLM: "dashboard_proposed_agenda_llm"
};
var API_KEY_FROM_PROVIDER = {
anthropic: SETTING_KEYS.LLM_API_KEY_ANTHROPIC,
gemini: SETTING_KEYS.LLM_API_KEY_GEMINI,
grok: SETTING_KEYS.LLM_API_KEY_GROK,
openai: SETTING_KEYS.LLM_API_KEY_OPENAI
};
function widgetConfigKey(widgetId) {
return `dashboard_${widgetId}_config`;
}
var DASHBOARD_COMPONENTS = SETTING_KEYS.DASHBOARD_COMPONENTS;
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.filter((w) => !w.debugOnly).map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
 
// lib/constants/quarters.js
var FULL_MONTH_NAMES = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
function getCurrentQuarter() {
const now = /* @__PURE__ */ new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return { year, quarter, label: `Q${quarter} ${year}` };
}
function getNextQuarter() {
let { year, quarter } = getCurrentQuarter();
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return { year, quarter, label: `Q${quarter} ${year}` };
}
 
// lib/util/log.js
var _enabled = false;
var _entryId = 0;
var MAX_LOG_BUFFER = 200;
var _logBuffer = [];
var _listeners = /* @__PURE__ */ new Set();
function setLoggingEnabled(settingValue) {
if (typeof settingValue === "boolean") {
_enabled = settingValue;
return;
}
const normalized = String(settingValue || "").trim().toLowerCase();
_enabled = ["true", "yes", "1", "on", "enabled"].includes(normalized);
}
function logIfEnabled(...args) {
if (_enabled) {
console.log(...args);
const entry = { id: ++_entryId, ts: Date.now(), args };
_logBuffer.push(entry);
if (_logBuffer.length > MAX_LOG_BUFFER)
_logBuffer.shift();
setTimeout(() => _listeners.forEach((fn) => fn(entry)), 0);
}
}
 
// lib/util/all-notes-tasks.js
var MAX_ALL_NOTES_TO_SCAN = 250;
function fetchDomainOrAllNotesTasks(app, domainUuid, { includeDone = false, maxNotes = MAX_ALL_NOTES_TO_SCAN } = {}) {
if (domainUuid) {
return app.getTaskDomainTasks(domainUuid);
} else {
return _allNotesTasks(app, includeDone, maxNotes);
}
}
async function _allNotesTasks(app, includeDone, maxNotes) {
const seen = /* @__PURE__ */ new Set();
const noteHandles = [];
for await (const handle of await app.filterNotes({ group: "taskLists" }, "changed")) {
if (!handle?.uuid || seen.has(handle.uuid))
continue;
seen.add(handle.uuid);
noteHandles.push(handle);
if (noteHandles.length >= maxNotes)
break;
}
logIfEnabled(`[all-notes-tasks] No task domain \u2014 scanning ${noteHandles.length} task-list notes for tasks`);
const settled = await Promise.allSettled(noteHandles.map((handle) => app.getNoteTasks({ uuid: handle.uuid }, { includeDone })));
const allTasks = [];
for (let index = 0; index < settled.length; index += 1) {
const outcome = settled[index];
const handle = noteHandles[index];
if (!outcome || outcome.status === "rejected") {
logIfEnabled("[all-notes-tasks] getNoteTasks failed:", outcome?.reason);
continue;
}
const tasks = Array.isArray(outcome.value) ? outcome.value : [];
for (const task of tasks) {
if (!task?.uuid)
continue;
allTasks.push({
...task,
noteName: task.noteName || task.noteTitle || task.note?.name || handle.name || null,
noteUUID: task.noteUUID || handle.uuid
});
}
}
logIfEnabled(`[all-notes-tasks] Gathered ${allTasks.length} tasks across all notes (no task domain)`);
return allTasks;
}
 
// lib/util/date-utility.js
function dateFromDateInput(dateInput, { throwOnInvalid = true } = {}) {
const fail = () => {
if (!throwOnInvalid)
return null;
throw new TypeError(`Invalid date input: ${String(dateInput)}`);
};
if (dateInput == null || dateInput === "")
return fail();
if (dateInput instanceof Date) {
const date = new Date(dateInput);
return Number.isNaN(date.getTime()) ? fail() : date;
}
if (typeof dateInput === "number") {
if (!Number.isFinite(dateInput))
return fail();
const millis = Math.abs(dateInput) < 1e10 ? dateInput * 1e3 : dateInput;
const parsed2 = new Date(millis);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
if (typeof dateInput === "string") {
const trimmed = dateInput.trim();
if (!trimmed)
return fail();
if (/^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const numericValue = Number(trimmed);
if (!Number.isNaN(numericValue))
return dateFromDateInput(numericValue, { throwOnInvalid });
const parsed2 = new Date(trimmed);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
const parsed = new Date(dateInput);
return Number.isNaN(parsed.getTime()) ? fail() : parsed;
}
function weekStartFromDateInput(dateInput, weekStartDay = 1) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const delta = (dayOfWeek - weekStartDay + 7) % 7;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - delta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput, weekStartDay = 1) {
const weekStart = weekStartFromDateInput(dateInput, weekStartDay);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
 
// lib/util/note-handles.js
async function arrayFromFilterNotesResult(result) {
const resolved = await result;
if (Array.isArray(resolved))
return resolved;
if (resolved && typeof resolved[Symbol.asyncIterator] === "function") {
const notes = [];
for await (const note of resolved)
notes.push(note);
return notes;
}
return [];
}
 
// lib/util/quarterly-plan-notes.js
function legacyQuarterlyPlanNoteName(quarterLabel) {
return `${quarterLabel} Plan`;
}
function quarterlyPlanNoteName(domainName, quarterLabel) {
const trimmedDomainName = typeof domainName === "string" ? domainName.trim() : "";
if (!trimmedDomainName)
return legacyQuarterlyPlanNoteName(quarterLabel);
return `${quarterLabel} ${trimmedDomainName} Plan`;
}
async function resolveQuarterlyPlanNote(app, allowLegacyMigration, domainName, quarterLabel) {
const domainPlanName = quarterlyPlanNoteName(domainName, quarterLabel);
const domainNotes = await arrayFromFilterNotesResult(app.filterNotes({ query: domainPlanName }));
const domainMatch = domainNotes.find((note) => note.name === domainPlanName);
if (domainMatch)
return domainMatch;
const legacyName = legacyQuarterlyPlanNoteName(quarterLabel);
if (domainPlanName === legacyName) {
const legacyNotes2 = await arrayFromFilterNotesResult(app.filterNotes({ query: legacyName }));
return legacyNotes2.find((note) => note.name === legacyName) || null;
}
if (!allowLegacyMigration || !domainName)
return null;
const legacyNotes = await arrayFromFilterNotesResult(app.filterNotes({ query: legacyName }));
const legacyMatch = legacyNotes.find((note) => note.name === legacyName);
if (!legacyMatch?.uuid)
return null;
try {
const renamed = await app.setNoteName(legacyMatch, domainPlanName);
if (renamed === false) {
logIfEnabled(`[quarterly-plan-notes] setNoteName refused rename of "${legacyName}" \u2192 "${domainPlanName}"`);
return legacyMatch;
}
logIfEnabled(`[quarterly-plan-notes] Migrated legacy plan "${legacyName}" \u2192 "${domainPlanName}"`);
return { ...legacyMatch, name: domainPlanName };
} catch (error) {
logIfEnabled(`[quarterly-plan-notes] Failed to rename legacy plan "${legacyName}"`, error?.message || error);
return legacyMatch;
}
}
 
// lib/util/task-domain-utility.js
function defaultDomainUuid(domains) {
if (!Array.isArray(domains) || domains.length === 0)
return null;
const work = domains.find((domain) => domain.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
function migrationDomainNameFromDomains(domains) {
if (!Array.isArray(domains) || domains.length === 0)
return null;
const work = domains.find((domain) => domain.name === "Work");
return (work || domains[0])?.name || null;
}
 
// lib/data-service.js
function _initFailureRecord(error, source) {
return { message: error?.message || String(error) || source, source, stack: error?.stack || null };
}
async function fetchDashboardData(app) {
setLoggingEnabled(app.settings?.[SETTING_KEYS.CONSOLE_LOGGING]);
const t0 = Date.now();
const initFailures = [];
logIfEnabled("[fetchDashboardData] starting \u2014 launching domain + mood/plans/settings in parallel");
const now = /* @__PURE__ */ new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const domainPromise = _resolveTaskDomains(app).catch((err) => {
logIfEnabled("[fetchDashboardData] _resolveTaskDomains failed:", err);
initFailures.push(_initFailureRecord(err, "init-domains"));
return { domains: [], selectedDomainUuid: null };
});
const tasksPromise = domainPromise.then((info) => {
logIfEnabled(`[fetchDashboardData] domain resolved in ${Date.now() - t0}ms, uuid=${info.selectedDomainUuid} \u2014 fetching tasks`);
return _fetchTasksForDomain(app, info.selectedDomainUuid).catch((err) => {
logIfEnabled("[fetchDashboardData] _fetchTasksForDomain failed:", err);
initFailures.push(_initFailureRecord(err, "init-tasks"));
return [];
});
});
const plansPromise = domainPromise.then((info) => _findQuarterlyPlans(app, info).catch((err) => {
logIfEnabled("[fetchDashboardData] _findQuarterlyPlans failed:", err);
initFailures.push(_initFailureRecord(err, "init-plans"));
return _emptyQuarterlyPlans(info);
}));
const [taskDomainInfo, moodRatings, quarterlyPlans, settings, domainTasks] = await Promise.all([
domainPromise,
_safeMoodRatings(app, twoWeeksAgoUnixSeconds, initFailures),
plansPromise,
_readDashboardSettings(app).catch((err) => {
logIfEnabled("[fetchDashboardData] _readDashboardSettings failed:", err);
initFailures.push(_initFailureRecord(err, "init-settings"));
return {};
}),
tasksPromise
]);
logIfEnabled(`[fetchDashboardData] all resolved in ${Date.now() - t0}ms \u2014 ${domainTasks.length} tasks, ${moodRatings?.length ?? 0} mood ratings`);
return {
activeTaskDomain: taskDomainInfo.selectedDomainUuid,
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
context: { noteUUID: app.context?.noteUUID || null, pluginUUID: app.context?.pluginUUID || null },
currentDate: now.toISOString(),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
initFailures,
moodRatings,
pluginNoteUUID: app.context?.noteUUID || null,
quarterlyPlans,
settings,
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
taskDomains: taskDomainInfo.domains,
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd)
};
}
function _logTaskDomainsResponse(prefix, response) {
const isArray = Array.isArray(response);
const count = isArray ? response.length : 0;
const type = response === null ? "null" : Array.isArray(response) ? "array" : typeof response;
const keys = response && typeof response === "object" && !isArray ? Object.keys(response) : null;
let serialized;
try {
serialized = JSON.stringify(response);
} catch {
serialized = String(response);
}
logIfEnabled(
`${prefix} getTaskDomains() returned ${count} domains (type=${type}${keys ? `, keys=[${keys.join(",")}]` : ""})`,
{ raw: response, serialized }
);
}
async function _resolveTaskDomains(app) {
const raw = app.settings[SETTING_KEYS.TASK_DOMAINS];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
logIfEnabled(`[_resolveTaskDomains] cache ${hasDomains ? "stale" : "empty"} \u2014 calling getTaskDomains()`);
const t0 = Date.now();
const freshDomains = await app.getTaskDomains();
_logTaskDomainsResponse(`[_resolveTaskDomains] (${Date.now() - t0}ms)`, freshDomains);
stored.domains = (Array.isArray(freshDomains) ? freshDomains : []).filter((d) => d && d.uuid).map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = defaultDomainUuid(stored.domains);
}
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = defaultDomainUuid(stored.domains);
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
return stored;
}
async function _fetchTasksForDomain(app, domainUuid, includeDone = false) {
const t0 = Date.now();
const list = await fetchDomainOrAllNotesTasks(app, domainUuid, { includeDone });
logIfEnabled(`[_fetchTasksForDomain] ${domainUuid ? `getTaskDomainTasks(${domainUuid})` : "all-notes fallback"} returned ${list.length} tasks in ${Date.now() - t0}ms`);
return list;
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds, initFailures) {
try {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
logIfEnabled("Mood ratings", moodRatings, "from", fromUnixSeconds);
return Array.isArray(moodRatings) ? moodRatings : [];
} catch (error) {
logIfEnabled("[fetchDashboardData] getMoodRatings failed:", error);
initFailures.push(_initFailureRecord(error, "init-mood"));
return [];
}
}
function _emptyQuarterlyPlans(domainInfo) {
const current = getCurrentQuarter();
const next = getNextQuarter();
const domains = Array.isArray(domainInfo?.domains) ? domainInfo.domains : [];
const selectedDomainUuid = domainInfo?.selectedDomainUuid || null;
const domainName = domains.find((domain) => domain.uuid === selectedDomainUuid)?.name || null;
return {
current: { ...current, domainName, hasAllMonthlyDetails: false, noteUUID: null },
next: { ...next, domainName, hasAllMonthlyDetails: false, noteUUID: null }
};
}
async function _findQuarterlyPlans(app, domainInfo) {
const t0 = Date.now();
const current = getCurrentQuarter();
const next = getNextQuarter();
const domains = Array.isArray(domainInfo?.domains) ? domainInfo.domains : [];
const selectedDomainUuid = domainInfo?.selectedDomainUuid || null;
const domainName = domains.find((domain) => domain.uuid === selectedDomainUuid)?.name || null;
const migrationDomainName = migrationDomainNameFromDomains(domains);
const allowLegacyMigration = domainName && migrationDomainName && domainName === migrationDomainName;
const currentPlanName = quarterlyPlanNoteName(domainName, current.label);
const nextPlanName = quarterlyPlanNoteName(domainName, next.label);
logIfEnabled(`[_findQuarterlyPlans] querying: "${currentPlanName}", "${nextPlanName}" (legacyMigration=${allowLegacyMigration})`);
const [currentNote, nextNote] = await Promise.all([
resolveQuarterlyPlanNote(app, allowLegacyMigration, domainName, current.label),
resolveQuarterlyPlanNote(app, allowLegacyMigration, domainName, next.label)
]);
const currentNoteUUID = currentNote?.uuid || null;
const nextNoteUUID = nextNote?.uuid || null;
logIfEnabled(`[_findQuarterlyPlans] resolved UUIDs \u2014 current: ${currentNoteUUID}, next: ${nextNoteUUID}`);
const currentMonths = _quarterMonthNames(current.quarter);
const nextMonths = _quarterMonthNames(next.quarter);
const [currentHasAll, nextHasAll] = await Promise.all([
currentNoteUUID ? _hasAllMonthSections(app, currentNoteUUID, currentMonths) : Promise.resolve(false),
nextNoteUUID ? _hasAllMonthSections(app, nextNoteUUID, nextMonths) : Promise.resolve(false)
]);
logIfEnabled(`[_findQuarterlyPlans] hasAllMonthlyDetails \u2014 current: ${currentHasAll}, next: ${nextHasAll} (${Date.now() - t0}ms total)`);
return {
current: { ...current, domainName, noteUUID: currentNoteUUID, hasAllMonthlyDetails: currentHasAll },
next: { ...next, domainName, noteUUID: nextNoteUUID, hasAllMonthlyDetails: nextHasAll }
};
}
function _quarterMonthNames(quarter) {
const start = (quarter - 1) * 3;
return [0, 1, 2].map((i) => FULL_MONTH_NAMES[(start + i) % 12]);
}
async function _hasAllMonthSections(app, noteUUID, monthNames) {
try {
const sections = await app.getNoteSections({ uuid: noteUUID });
return monthNames.every(
(name) => sections.some((s) => s.heading?.text?.trim().toLowerCase() === name.toLowerCase())
);
} catch {
return false;
}
}
async function _readDashboardSettings(app) {
const keys = [
widgetConfigKey("victory-value"),
widgetConfigKey("calendar"),
widgetConfigKey("quotes"),
widgetConfigKey("mood"),
widgetConfigKey("note-peek"),
widgetConfigKey("recent-notes")
];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] || "";
settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] || "cover";
settings[SETTING_KEYS.CONSOLE_LOGGING] = app.settings[SETTING_KEYS.CONSOLE_LOGGING] || "";
settings[SETTING_KEYS.LLM_PROVIDER_MODEL] = app.settings[SETTING_KEYS.LLM_PROVIDER_MODEL] || "";
settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] = app.settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] || "";
settings[SETTING_KEYS.LLM_API_KEY_GEMINI] = app.settings[SETTING_KEYS.LLM_API_KEY_GEMINI] || "";
settings[SETTING_KEYS.LLM_API_KEY_GROK] = app.settings[SETTING_KEYS.LLM_API_KEY_GROK] || "";
settings[SETTING_KEYS.LLM_API_KEY_OPENAI] = app.settings[SETTING_KEYS.LLM_API_KEY_OPENAI] || "";
let componentLayout = null;
try {
componentLayout = app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(SETTING_KEYS.DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[SETTING_KEYS.DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
 
// client-bundle:client-bundle
var clientBase64 = "KCgpPT57dmFyIGxFPU9iamVjdC5jcmVhdGU7dmFyIGlnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZEU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgY0U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIHVFPU9iamVjdC5nZXRQcm90b3R5cGVPZixwRT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBQbz0oZSx0KT0+KCk9Pih0fHxlKCh0PXtleHBvcnRzOnt9fSkuZXhwb3J0cyx0KSx0LmV4cG9ydHMpO3ZhciBmRT0oZSx0LG4sbyk9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiBjRSh0KSkhcEUuY2FsbChlLHIpJiZyIT09biYmaWcoZSxyLHtnZXQ6KCk9PnRbcl0sZW51bWVyYWJsZTohKG89ZEUodCxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgTD0oZSx0LG4pPT4obj1lIT1udWxsP2xFKHVFKGUpKTp7fSxmRSh0fHwhZXx8IWUuX19lc01vZHVsZT9pZyhuLCJkZWZhdWx0Iix7dmFsdWU6ZSxlbnVtZXJhYmxlOiEwfSk6bixlKSk7dmFyIHZnPVBvKHhlPT57InVzZSBzdHJpY3QiO3ZhciBEaT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksbUU9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksaEU9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxnRT1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLHlFPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksdkU9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxiRT1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0Iiksd0U9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxrRT1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLHhFPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxTRT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iiksc2c9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEVFKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9c2cmJmVbc2ddfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgY2c9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LHVnPU9iamVjdC5hc3NpZ24scGc9e307ZnVuY3Rpb24gU2EoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9cGcsdGhpcy51cGRhdGVyPW58fGNnfVNhLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O1NhLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O1NhLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gZmcoKXt9ZmcucHJvdG90eXBlPVNhLnByb3RvdHlwZTtmdW5jdGlvbiBudShlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1wZyx0aGlzLnVwZGF0ZXI9bnx8Y2d9dmFyIG91PW51LnByb3RvdHlwZT1uZXcgZmc7b3UuY29uc3RydWN0b3I9bnU7dWcob3UsU2EucHJvdG90eXBlKTtvdS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgbGc9QXJyYXkuaXNBcnJheSxtZz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHJ1PXtjdXJyZW50Om51bGx9LGhnPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gZ2coZSx0LG4pe3ZhciBvLHI9e30sYT1udWxsLGk9bnVsbDtpZih0IT1udWxsKWZvcihvIGluIHQucmVmIT09dm9pZCAwJiYoaT10LnJlZiksdC5rZXkhPT12b2lkIDAmJihhPSIiK3Qua2V5KSx0KW1nLmNhbGwodCxvKSYmIWhnLmhhc093blByb3BlcnR5KG8pJiYocltvXT10W29dKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGw9QXJyYXkocyksZD0wO2Q8cztkKyspbFtkXT1hcmd1bWVudHNbZCsyXTtyLmNoaWxkcmVuPWx9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKG8gaW4gcz1lLmRlZmF1bHRQcm9wcyxzKXJbb109PT12b2lkIDAmJihyW29dPXNbb10pO3JldHVybnskJHR5cGVvZjpEaSx0eXBlOmUsa2V5OmEscmVmOmkscHJvcHM6cixfb3duZXI6cnUuY3VycmVudH19ZnVuY3Rpb24gTkUoZSx0KXtyZXR1cm57JCR0eXBlb2Y6RGksdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBhdShlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PURpfWZ1bmN0aW9uIFRFKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIGRnPS9cLysvZztmdW5jdGlvbiB0dShlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9URSgiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gbWwoZSx0LG4sbyxyKXt2YXIgYT10eXBlb2YgZTsoYT09PSJ1bmRlZmluZWQifHxhPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGk9ITE7aWYoZT09PW51bGwpaT0hMDtlbHNlIHN3aXRjaChhKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmk9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIERpOmNhc2UgbUU6aT0hMH19aWYoaSlyZXR1cm4gaT1lLHI9cihpKSxlPW89PT0iIj8iLiIrdHUoaSwwKTpvLGxnKHIpPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShkZywiJCYvIikrIi8iKSxtbChyLHQsbiwiIixmdW5jdGlvbihkKXtyZXR1cm4gZH0pKTpyIT1udWxsJiYoYXUocikmJihyPU5FKHIsbisoIXIua2V5fHxpJiZpLmtleT09PXIua2V5PyIiOigiIityLmtleSkucmVwbGFjZShkZywiJCYvIikrIi8iKStlKSksdC5wdXNoKHIpKSwxO2lmKGk9MCxvPW89PT0iIj8iLiI6bysiOiIsbGcoZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2E9ZVtzXTt2YXIgbD1vK3R1KGEscyk7aSs9bWwoYSx0LG4sbCxyKX1lbHNlIGlmKGw9RUUoZSksdHlwZW9mIGw9PSJmdW5jdGlvbiIpZm9yKGU9bC5jYWxsKGUpLHM9MDshKGE9ZS5uZXh0KCkpLmRvbmU7KWE9YS52YWx1ZSxsPW8rdHUoYSxzKyspLGkrPW1sKGEsdCxuLGwscik7ZWxzZSBpZihhPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGl9ZnVuY3Rpb24gZmwoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIG89W10scj0wO3JldHVybiBtbChlLG8sIiIsIiIsZnVuY3Rpb24oYSl7cmV0dXJuIHQuY2FsbChuLGEscisrKX0pLG99ZnVuY3Rpb24gREUoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgZW49e2N1cnJlbnQ6bnVsbH0saGw9e3RyYW5zaXRpb246bnVsbH0sQUU9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6ZW4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6aGwsUmVhY3RDdXJyZW50T3duZXI6cnV9O2Z1bmN0aW9uIHlnKCl7dGhyb3cgRXJyb3IoImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuIil9eGUuQ2hpbGRyZW49e21hcDpmbCxmb3JFYWNoOmZ1bmN0aW9uKGUsdCxuKXtmbChlLGZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4pfSxjb3VudDpmdW5jdGlvbihlKXt2YXIgdD0wO3JldHVybiBmbChlLGZ1bmN0aW9uKCl7dCsrfSksdH0sdG9BcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gZmwoZSxmdW5jdGlvbih0KXtyZXR1cm4gdH0pfHxbXX0sb25seTpmdW5jdGlvbihlKXtpZighYXUoZSkpdGhyb3cgRXJyb3IoIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLiIpO3JldHVybiBlfX07eGUuQ29tcG9uZW50PVNhO3hlLkZyYWdtZW50PWhFO3hlLlByb2ZpbGVyPXlFO3hlLlB1cmVDb21wb25lbnQ9bnU7eGUuU3RyaWN0TW9kZT1nRTt4ZS5TdXNwZW5zZT1rRTt4ZS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1BRTt4ZS5hY3Q9eWc7eGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgbz11Zyh7fSxlLnByb3BzKSxyPWUua2V5LGE9ZS5yZWYsaT1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGE9dC5yZWYsaT1ydS5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKHI9IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihsIGluIHQpbWcuY2FsbCh0LGwpJiYhaGcuaGFzT3duUHJvcGVydHkobCkmJihvW2xdPXRbbF09PT12b2lkIDAmJnMhPT12b2lkIDA/c1tsXTp0W2xdKX12YXIgbD1hcmd1bWVudHMubGVuZ3RoLTI7aWYobD09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxsKXtzPUFycmF5KGwpO2Zvcih2YXIgZD0wO2Q8bDtkKyspc1tkXT1hcmd1bWVudHNbZCsyXTtvLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOkRpLHR5cGU6ZS50eXBlLGtleTpyLHJlZjphLHByb3BzOm8sX293bmVyOml9fTt4ZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpiRSxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOnZFLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07eGUuY3JlYXRlRWxlbWVudD1nZzt4ZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PWdnLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07eGUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O3hlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOndFLHJlbmRlcjplfX07eGUuaXNWYWxpZEVsZW1lbnQ9YXU7eGUubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6U0UsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpERX19O3hlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6eEUsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTt4ZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9aGwudHJhbnNpdGlvbjtobC50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtobC50cmFuc2l0aW9uPXR9fTt4ZS51bnN0YWJsZV9hY3Q9eWc7eGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZW4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTt4ZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlbi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O3hlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O3hlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGVuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07eGUudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O3hlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIGVuLmN1cnJlbnQudXNlSWQoKX07eGUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O3hlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBlbi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTt4ZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZW4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07eGUudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBlbi5jdXJyZW50LnVzZU1lbW8oZSx0KX07eGUudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O3hlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gZW4uY3VycmVudC51c2VSZWYoZSl9O3hlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBlbi5jdXJyZW50LnVzZVN0YXRlKGUpfTt4ZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTt4ZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGVuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTt4ZS52ZXJzaW9uPSIxOC4zLjEifSk7dmFyIG1lPVBvKChiVSxiZyk9PnsidXNlIHN0cmljdCI7YmcuZXhwb3J0cz12ZygpfSk7dmFyIENnPVBvKFZlPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGR1KGUsdCl7dmFyIG49ZS5sZW5ndGg7ZS5wdXNoKHQpO2U6Zm9yKDswPG47KXt2YXIgbz1uLTE+Pj4xLHI9ZVtvXTtpZigwPGdsKHIsdCkpZVtvXT10LGVbbl09cixuPW87ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBKbihlKXtyZXR1cm4gZS5sZW5ndGg9PT0wP251bGw6ZVswXX1mdW5jdGlvbiB2bChlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIG51bGw7dmFyIHQ9ZVswXSxuPWUucG9wKCk7aWYobiE9PXQpe2VbMF09bjtlOmZvcih2YXIgbz0wLHI9ZS5sZW5ndGgsYT1yPj4+MTtvPGE7KXt2YXIgaT0yKihvKzEpLTEscz1lW2ldLGw9aSsxLGQ9ZVtsXTtpZigwPmdsKHMsbikpbDxyJiYwPmdsKGQscyk/KGVbb109ZCxlW2xdPW4sbz1sKTooZVtvXT1zLGVbaV09bixvPWkpO2Vsc2UgaWYobDxyJiYwPmdsKGQsbikpZVtvXT1kLGVbbF09bixvPWw7ZWxzZSBicmVhayBlfX1yZXR1cm4gdH1mdW5jdGlvbiBnbChlLHQpe3ZhciBuPWUuc29ydEluZGV4LXQuc29ydEluZGV4O3JldHVybiBuIT09MD9uOmUuaWQtdC5pZH10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iPyh3Zz1wZXJmb3JtYW5jZSxWZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gd2cubm93KCl9KTooaXU9RGF0ZSxrZz1pdS5ub3coKSxWZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gaXUubm93KCkta2d9KTt2YXIgd2csaXUsa2csdm89W10sc3I9W10sQ0U9MSxDbj1udWxsLEd0PTMsYmw9ITEsRnI9ITEsQ2k9ITEsRWc9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDpudWxsLE5nPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0Om51bGwseGc9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gY3UoZSl7Zm9yKHZhciB0PUpuKHNyKTt0IT09bnVsbDspe2lmKHQuY2FsbGJhY2s9PT1udWxsKXZsKHNyKTtlbHNlIGlmKHQuc3RhcnRUaW1lPD1lKXZsKHNyKSx0LnNvcnRJbmRleD10LmV4cGlyYXRpb25UaW1lLGR1KHZvLHQpO2Vsc2UgYnJlYWs7dD1Kbihzcil9fWZ1bmN0aW9uIHV1KGUpe2lmKENpPSExLGN1KGUpLCFGcilpZihKbih2bykhPT1udWxsKUZyPSEwLGZ1KHB1KTtlbHNle3ZhciB0PUpuKHNyKTt0IT09bnVsbCYmbXUodXUsdC5zdGFydFRpbWUtZSl9fWZ1bmN0aW9uIHB1KGUsdCl7RnI9ITEsQ2kmJihDaT0hMSxOZyhNaSksTWk9LTEpLGJsPSEwO3ZhciBuPUd0O3RyeXtmb3IoY3UodCksQ249Sm4odm8pO0NuIT09bnVsbCYmKCEoQ24uZXhwaXJhdGlvblRpbWU+dCl8fGUmJiFBZygpKTspe3ZhciBvPUNuLmNhbGxiYWNrO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKXtDbi5jYWxsYmFjaz1udWxsLEd0PUNuLnByaW9yaXR5TGV2ZWw7dmFyIHI9byhDbi5leHBpcmF0aW9uVGltZTw9dCk7dD1WZS51bnN0YWJsZV9ub3coKSx0eXBlb2Ygcj09ImZ1bmN0aW9uIj9Dbi5jYWxsYmFjaz1yOkNuPT09Sm4odm8pJiZ2bCh2byksY3UodCl9ZWxzZSB2bCh2byk7Q249Sm4odm8pfWlmKENuIT09bnVsbCl2YXIgYT0hMDtlbHNle3ZhciBpPUpuKHNyKTtpIT09bnVsbCYmbXUodXUsaS5zdGFydFRpbWUtdCksYT0hMX1yZXR1cm4gYX1maW5hbGx5e0NuPW51bGwsR3Q9bixibD0hMX19dmFyIHdsPSExLHlsPW51bGwsTWk9LTEsVGc9NSxEZz0tMTtmdW5jdGlvbiBBZygpe3JldHVybiEoVmUudW5zdGFibGVfbm93KCktRGc8VGcpfWZ1bmN0aW9uIHN1KCl7aWYoeWwhPT1udWxsKXt2YXIgZT1WZS51bnN0YWJsZV9ub3coKTtEZz1lO3ZhciB0PSEwO3RyeXt0PXlsKCEwLGUpfWZpbmFsbHl7dD9BaSgpOih3bD0hMSx5bD1udWxsKX19ZWxzZSB3bD0hMX12YXIgQWk7dHlwZW9mIHhnPT0iZnVuY3Rpb24iP0FpPWZ1bmN0aW9uKCl7eGcoc3UpfTp0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiPyhsdT1uZXcgTWVzc2FnZUNoYW5uZWwsU2c9bHUucG9ydDIsbHUucG9ydDEub25tZXNzYWdlPXN1LEFpPWZ1bmN0aW9uKCl7U2cucG9zdE1lc3NhZ2UobnVsbCl9KTpBaT1mdW5jdGlvbigpe0VnKHN1LDApfTt2YXIgbHUsU2c7ZnVuY3Rpb24gZnUoZSl7eWw9ZSx3bHx8KHdsPSEwLEFpKCkpfWZ1bmN0aW9uIG11KGUsdCl7TWk9RWcoZnVuY3Rpb24oKXtlKFZlLnVuc3RhYmxlX25vdygpKX0sdCl9VmUudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7VmUudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MTtWZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00O1ZlLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7VmUudW5zdGFibGVfUHJvZmlsaW5nPW51bGw7VmUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtWZS51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihlKXtlLmNhbGxiYWNrPW51bGx9O1ZlLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7RnJ8fGJsfHwoRnI9ITAsZnUocHUpKX07VmUudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oZSl7MD5lfHwxMjU8ZT9jb25zb2xlLmVycm9yKCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQiKTpUZz0wPGU/TWF0aC5mbG9vcigxZTMvZSk6NX07VmUudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gR3R9O1ZlLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIEpuKHZvKX07VmUudW5zdGFibGVfbmV4dD1mdW5jdGlvbihlKXtzd2l0Y2goR3Qpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciB0PTM7YnJlYWs7ZGVmYXVsdDp0PUd0fXZhciBuPUd0O0d0PXQ7dHJ5e3JldHVybiBlKCl9ZmluYWxseXtHdD1ufX07VmUudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9O1ZlLnVuc3RhYmxlX3JlcXVlc3RQYWludD1mdW5jdGlvbigpe307VmUudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDplPTN9dmFyIG49R3Q7R3Q9ZTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e0d0PW59fTtWZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1WZS51bnN0YWJsZV9ub3coKTtzd2l0Y2godHlwZW9mIG49PSJvYmplY3QiJiZuIT09bnVsbD8obj1uLmRlbGF5LG49dHlwZW9mIG49PSJudW1iZXIiJiYwPG4/bytuOm8pOm49byxlKXtjYXNlIDE6dmFyIHI9LTE7YnJlYWs7Y2FzZSAyOnI9MjUwO2JyZWFrO2Nhc2UgNTpyPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0OnI9MWU0O2JyZWFrO2RlZmF1bHQ6cj01ZTN9cmV0dXJuIHI9bityLGU9e2lkOkNFKyssY2FsbGJhY2s6dCxwcmlvcml0eUxldmVsOmUsc3RhcnRUaW1lOm4sZXhwaXJhdGlvblRpbWU6cixzb3J0SW5kZXg6LTF9LG4+bz8oZS5zb3J0SW5kZXg9bixkdShzcixlKSxKbih2byk9PT1udWxsJiZlPT09Sm4oc3IpJiYoQ2k/KE5nKE1pKSxNaT0tMSk6Q2k9ITAsbXUodXUsbi1vKSkpOihlLnNvcnRJbmRleD1yLGR1KHZvLGUpLEZyfHxibHx8KEZyPSEwLGZ1KHB1KSkpLGV9O1ZlLnVuc3RhYmxlX3Nob3VsZFlpZWxkPUFnO1ZlLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihlKXt2YXIgdD1HdDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1HdDtHdD10O3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtHdD1ufX19fSk7dmFyIE9nPVBvKChrVSxNZyk9PnsidXNlIHN0cmljdCI7TWcuZXhwb3J0cz1DZygpfSk7dmFyIExiPVBvKE5uPT57InVzZSBzdHJpY3QiO3ZhciBNRT1tZSgpLFNuPU9nKCk7ZnVuY3Rpb24geihlKXtmb3IodmFyIHQ9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbbl0pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciBGeT1uZXcgU2V0LFFpPXt9O2Z1bmN0aW9uIEpyKGUsdCl7R2EoZSx0KSxHYShlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiBHYShlLHQpe2ZvcihRaVtlXT10LGU9MDtlPHQubGVuZ3RoO2UrKylGeS5hZGQodFtlXSl9dmFyIFdvPSEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ+InUiKSxVdT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LE9FPS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sSWc9e30sUmc9e307ZnVuY3Rpb24gSUUoZSl7cmV0dXJuIFV1LmNhbGwoUmcsZSk/ITA6VXUuY2FsbChJZyxlKT8hMTpPRS50ZXN0KGUpP1JnW2VdPSEwOihJZ1tlXT0hMCwhMSl9ZnVuY3Rpb24gUkUoZSx0LG4sbyl7aWYobiE9PW51bGwmJm4udHlwZT09PTApcmV0dXJuITE7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4gbz8hMTpuIT09bnVsbD8hbi5hY2NlcHRzQm9vbGVhbnM6KGU9ZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSksZSE9PSJkYXRhLSImJmUhPT0iYXJpYS0iKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBQRShlLHQsbixvKXtpZih0PT09bnVsbHx8dHlwZW9mIHQ+InUifHxSRShlLHQsbixvKSlyZXR1cm4hMDtpZihvKXJldHVybiExO2lmKG4hPT1udWxsKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuIHQ9PT0hMTtjYXNlIDU6cmV0dXJuIGlzTmFOKHQpO2Nhc2UgNjpyZXR1cm4gaXNOYU4odCl8fDE+dH1yZXR1cm4hMX1mdW5jdGlvbiBvbihlLHQsbixvLHIsYSxpKXt0aGlzLmFjY2VwdHNCb29sZWFucz10PT09Mnx8dD09PTN8fHQ9PT00LHRoaXMuYXR0cmlidXRlTmFtZT1vLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPXIsdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9YSx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWl9dmFyIFd0PXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXtXdFtlXT1uZXcgb24oZSwwLCExLGUsbnVsbCwhMSwhMSl9KTtbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtXdFt0XT1uZXcgb24odCwxLCExLGVbMV0sbnVsbCwhMSwhMSl9KTtbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7V3RbZV09bmV3IG9uKGUsMiwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1d0W2VdPW5ldyBvbihlLDIsITEsZSxudWxsLCExLCExKX0pOyJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7V3RbZV09bmV3IG9uKGUsMywhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1d0W2VdPW5ldyBvbihlLDMsITAsZSxudWxsLCExLCExKX0pO1siY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtXdFtlXT1uZXcgb24oZSw0LCExLGUsbnVsbCwhMSwhMSl9KTtbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1d0W2VdPW5ldyBvbihlLDYsITEsZSxudWxsLCExLCExKX0pO1sicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaChmdW5jdGlvbihlKXtXdFtlXT1uZXcgb24oZSw1LCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBDcD0vW1wtOl0oW2Etel0pL2c7ZnVuY3Rpb24gTXAoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQ3AsTXApO1d0W3RdPW5ldyBvbih0LDEsITEsZSxudWxsLCExLCExKX0pOyJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQ3AsTXApO1d0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITEsITEpfSk7WyJ4bWw6YmFzZSIsInhtbDpsYW5nIiwieG1sOnNwYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQ3AsTXApO1d0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KTtbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1d0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7V3QueGxpbmtIcmVmPW5ldyBvbigieGxpbmtIcmVmIiwxLCExLCJ4bGluazpocmVmIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITAsITEpO1sic3JjIiwiaHJlZiIsImFjdGlvbiIsImZvcm1BY3Rpb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1d0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7ZnVuY3Rpb24gT3AoZSx0LG4sbyl7dmFyIHI9V3QuaGFzT3duUHJvcGVydHkodCk/V3RbdF06bnVsbDsociE9PW51bGw/ci50eXBlIT09MDpvfHwhKDI8dC5sZW5ndGgpfHx0WzBdIT09Im8iJiZ0WzBdIT09Ik8ifHx0WzFdIT09Im4iJiZ0WzFdIT09Ik4iKSYmKFBFKHQsbixyLG8pJiYobj1udWxsKSxvfHxyPT09bnVsbD9JRSh0KSYmKG49PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpOnIubXVzdFVzZVByb3BlcnR5P2Vbci5wcm9wZXJ0eU5hbWVdPW49PT1udWxsP3IudHlwZT09PTM/ITE6IiI6bjoodD1yLmF0dHJpYnV0ZU5hbWUsbz1yLmF0dHJpYnV0ZU5hbWVzcGFjZSxuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KToocj1yLnR5cGUsbj1yPT09M3x8cj09PTQmJm49PT0hMD8iIjoiIituLG8/ZS5zZXRBdHRyaWJ1dGVOUyhvLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX12YXIgR289TUUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsa2w9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFRhPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLERhPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksSXA9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxGdT1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLHp5PVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksV3k9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLFJwPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksenU9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxXdT1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksUHA9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLGRyPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKTtTeW1ib2wuZm9yKCJyZWFjdC5zY29wZSIpO1N5bWJvbC5mb3IoInJlYWN0LmRlYnVnX3RyYWNlX21vZGUiKTt2YXIgQnk9U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIik7U3ltYm9sLmZvcigicmVhY3QubGVnYWN5X2hpZGRlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmNhY2hlIik7U3ltYm9sLmZvcigicmVhY3QudHJhY2luZ19tYXJrZXIiKTt2YXIgUGc9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIE9pKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9UGcmJmVbUGddfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgc3Q9T2JqZWN0LmFzc2lnbixodTtmdW5jdGlvbiB6aShlKXtpZihodT09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgdD1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7aHU9dCYmdFsxXXx8IiJ9cmV0dXJuYApgK2h1K2V9dmFyIGd1PSExO2Z1bmN0aW9uIHl1KGUsdCl7aWYoIWV8fGd1KXJldHVybiIiO2d1PSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKGQpe3ZhciBvPWR9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaChkKXtvPWR9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKGQpe289ZH1lKCl9fWNhdGNoKGQpe2lmKGQmJm8mJnR5cGVvZiBkLnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciByPWQuc3RhY2suc3BsaXQoYApgKSxhPW8uc3RhY2suc3BsaXQoYApgKSxpPXIubGVuZ3RoLTEscz1hLmxlbmd0aC0xOzE8PWkmJjA8PXMmJnJbaV0hPT1hW3NdOylzLS07Zm9yKDsxPD1pJiYwPD1zO2ktLSxzLS0paWYocltpXSE9PWFbc10pe2lmKGkhPT0xfHxzIT09MSlkbyBpZihpLS0scy0tLDA+c3x8cltpXSE9PWFbc10pe3ZhciBsPWAKYCtyW2ldLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZsLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYobD1sLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksbH13aGlsZSgxPD1pJiYwPD1zKTticmVha319fWZpbmFsbHl7Z3U9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/emkoZSk6IiJ9ZnVuY3Rpb24gTEUoZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIHppKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gemkoIkxhenkiKTtjYXNlIDEzOnJldHVybiB6aSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiB6aSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPXl1KGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPXl1KGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPXl1KGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBCdShlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIERhOnJldHVybiJGcmFnbWVudCI7Y2FzZSBUYTpyZXR1cm4iUG9ydGFsIjtjYXNlIEZ1OnJldHVybiJQcm9maWxlciI7Y2FzZSBJcDpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSB6dTpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgV3U6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIFd5OnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2Ugenk6cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBScDp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBQcDpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6QnUoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgZHI6dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIEJ1KGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gX0UoZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gQnUodCk7Y2FzZSA4OnJldHVybiB0PT09SXA/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gU3IoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBIeShlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIFVFKGUpe3ZhciB0PUh5KGUpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxvPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciByPW4uZ2V0LGE9bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oaSl7bz0iIitpLGEuY2FsbCh0aGlzLGkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG99LHNldFZhbHVlOmZ1bmN0aW9uKGkpe289IiIraX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24geGwoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPVVFKGUpKX1mdW5jdGlvbiBLeShlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLG89IiI7cmV0dXJuIGUmJihvPUh5KGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPW8sZSE9PW4/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIFhsKGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBIdShlLHQpe3ZhciBuPXQuY2hlY2tlZDtyZXR1cm4gc3Qoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gTGcoZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxvPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPVNyKHQudmFsdWUhPW51bGw/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOm8saW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBHeShlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJk9wKGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIEt1KGUsdCl7R3koZSx0KTt2YXIgbj1Tcih0LnZhbHVlKSxvPXQudHlwZTtpZihuIT1udWxsKW89PT0ibnVtYmVyIj8obj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9bikmJihlLnZhbHVlPSIiK24pOmUudmFsdWUhPT0iIituJiYoZS52YWx1ZT0iIituKTtlbHNlIGlmKG89PT0ic3VibWl0Inx8bz09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP0d1KGUsdC50eXBlLG4pOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZHdShlLHQudHlwZSxTcih0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBfZyhlLHQsbil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciBvPXQudHlwZTtpZighKG8hPT0ic3VibWl0IiYmbyE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fW49ZS5uYW1lLG4hPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJihlLm5hbWU9bil9ZnVuY3Rpb24gR3UoZSx0LG4peyh0IT09Im51bWJlciJ8fFhsKGUub3duZXJEb2N1bWVudCkhPT1lKSYmKG49PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK24mJihlLmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIFdpPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gRmEoZSx0LG4sbyl7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl0WyIkIituW3JdXT0hMDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXI9dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtuXS52YWx1ZSksZVtuXS5zZWxlY3RlZCE9PXImJihlW25dLnNlbGVjdGVkPXIpLHImJm8mJihlW25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIitTcihuKSx0PW51bGwscj0wO3I8ZS5sZW5ndGg7cisrKXtpZihlW3JdLnZhbHVlPT09bil7ZVtyXS5zZWxlY3RlZD0hMCxvJiYoZVtyXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtyXS5kaXNhYmxlZHx8KHQ9ZVtyXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gVnUoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKHooOTEpKTtyZXR1cm4gc3Qoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIFVnKGUsdCl7dmFyIG49dC52YWx1ZTtpZihuPT1udWxsKXtpZihuPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKHooOTIpKTtpZihXaShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcih6KDkzKSk7bj1uWzBdfXQ9bn10PT1udWxsJiYodD0iIiksbj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOlNyKG4pfX1mdW5jdGlvbiBWeShlLHQpe3ZhciBuPVNyKHQudmFsdWUpLG89U3IodC5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PWUudmFsdWUmJihlLnZhbHVlPW4pLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PW4mJihlLmRlZmF1bHRWYWx1ZT1uKSksbyE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK28pfWZ1bmN0aW9uIEZnKGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uIGp5KGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24ganUoZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9qeSh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgU2wsWXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixvLHIpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLG8scil9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKFNsPVNsfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxTbC5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9U2wuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIFppKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIEtpPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxGRT1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKEtpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0ZFLmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSksS2lbdF09S2lbZV19KX0pO2Z1bmN0aW9uIHF5KGUsdCxuKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOm58fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fEtpLmhhc093blByb3BlcnR5KGUpJiZLaVtlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiAkeShlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1uLmluZGV4T2YoIi0tIik9PT0wLHI9cXkobix0W25dLG8pO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxvP2Uuc2V0UHJvcGVydHkobixyKTplW25dPXJ9fXZhciB6RT1zdCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBZdShlLHQpe2lmKHQpe2lmKHpFW2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoeigxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3Ioeig2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHooNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3Ioeig2MikpfX1mdW5jdGlvbiBxdShlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgJHU9bnVsbDtmdW5jdGlvbiBMcChlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIFh1PW51bGwsemE9bnVsbCxXYT1udWxsO2Z1bmN0aW9uIHpnKGUpe2lmKGU9eXMoZSkpe2lmKHR5cGVvZiBYdSE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcih6KDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PUVkKHQpLFh1KGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIFh5KGUpe3phP1dhP1dhLnB1c2goZSk6V2E9W2VdOnphPWV9ZnVuY3Rpb24gSnkoKXtpZih6YSl7dmFyIGU9emEsdD1XYTtpZihXYT16YT1udWxsLHpnKGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl6Zyh0W2VdKX19ZnVuY3Rpb24gUXkoZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBaeSgpe312YXIgdnU9ITE7ZnVuY3Rpb24gZXYoZSx0LG4pe2lmKHZ1KXJldHVybiBlKHQsbik7dnU9ITA7dHJ5e3JldHVybiBReShlLHQsbil9ZmluYWxseXt2dT0hMSwoemEhPT1udWxsfHxXYSE9PW51bGwpJiYoWnkoKSxKeSgpKX19ZnVuY3Rpb24gZXMoZSx0KXt2YXIgbj1lLnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgbz1FZChuKTtpZihvPT09bnVsbClyZXR1cm4gbnVsbDtuPW9bdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihvPSFvLmRpc2FibGVkKXx8KGU9ZS50eXBlLG89IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hbzticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKHooMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgSnU9ITE7aWYoV28pdHJ5e0VhPXt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFYSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe0p1PSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixFYSxFYSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLEVhLEVhKX1jYXRjaHtKdT0hMX12YXIgRWE7ZnVuY3Rpb24gV0UoZSx0LG4sbyxyLGEsaSxzLGwpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShuLGQpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIEdpPSExLEpsPW51bGwsUWw9ITEsUXU9bnVsbCxCRT17b25FcnJvcjpmdW5jdGlvbihlKXtHaT0hMCxKbD1lfX07ZnVuY3Rpb24gSEUoZSx0LG4sbyxyLGEsaSxzLGwpe0dpPSExLEpsPW51bGwsV0UuYXBwbHkoQkUsYXJndW1lbnRzKX1mdW5jdGlvbiBLRShlLHQsbixvLHIsYSxpLHMsbCl7aWYoSEUuYXBwbHkodGhpcyxhcmd1bWVudHMpLEdpKXtpZihHaSl7dmFyIGQ9Smw7R2k9ITEsSmw9bnVsbH1lbHNlIHRocm93IEVycm9yKHooMTk4KSk7UWx8fChRbD0hMCxRdT1kKX19ZnVuY3Rpb24gUXIoZSl7dmFyIHQ9ZSxuPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP246bnVsbH1mdW5jdGlvbiB0dihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIFdnKGUpe2lmKFFyKGUpIT09ZSl0aHJvdyBFcnJvcih6KDE4OCkpfWZ1bmN0aW9uIEdFKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PVFyKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKHooMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxvPXQ7Oyl7dmFyIHI9bi5yZXR1cm47aWYocj09PW51bGwpYnJlYWs7dmFyIGE9ci5hbHRlcm5hdGU7aWYoYT09PW51bGwpe2lmKG89ci5yZXR1cm4sbyE9PW51bGwpe249bztjb250aW51ZX1icmVha31pZihyLmNoaWxkPT09YS5jaGlsZCl7Zm9yKGE9ci5jaGlsZDthOyl7aWYoYT09PW4pcmV0dXJuIFdnKHIpLGU7aWYoYT09PW8pcmV0dXJuIFdnKHIpLHQ7YT1hLnNpYmxpbmd9dGhyb3cgRXJyb3IoeigxODgpKX1pZihuLnJldHVybiE9PW8ucmV0dXJuKW49cixvPWE7ZWxzZXtmb3IodmFyIGk9ITEscz1yLmNoaWxkO3M7KXtpZihzPT09bil7aT0hMCxuPXIsbz1hO2JyZWFrfWlmKHM9PT1vKXtpPSEwLG89cixuPWE7YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWkpe2ZvcihzPWEuY2hpbGQ7czspe2lmKHM9PT1uKXtpPSEwLG49YSxvPXI7YnJlYWt9aWYocz09PW8pe2k9ITAsbz1hLG49cjticmVha31zPXMuc2libGluZ31pZighaSl0aHJvdyBFcnJvcih6KDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PW8pdGhyb3cgRXJyb3IoeigxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoeigxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fWZ1bmN0aW9uIG52KGUpe3JldHVybiBlPUdFKGUpLGUhPT1udWxsP292KGUpOm51bGx9ZnVuY3Rpb24gb3YoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PW92KGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciBydj1Tbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLEJnPVNuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFZFPVNuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLGpFPVNuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxtdD1Tbi51bnN0YWJsZV9ub3csWUU9U24udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsX3A9U24udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksYXY9U24udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksWmw9U24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscUU9U24udW5zdGFibGVfTG93UHJpb3JpdHksaXY9U24udW5zdGFibGVfSWRsZVByaW9yaXR5LHdkPW51bGwseG89bnVsbDtmdW5jdGlvbiAkRShlKXtpZih4byYmdHlwZW9mIHhvLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt4by5vbkNvbW1pdEZpYmVyUm9vdCh3ZCxlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIG5vPU1hdGguY2x6MzI/TWF0aC5jbHozMjpRRSxYRT1NYXRoLmxvZyxKRT1NYXRoLkxOMjtmdW5jdGlvbiBRRShlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLShYRShlKS9KRXwwKXwwfXZhciBFbD02NCxObD00MTk0MzA0O2Z1bmN0aW9uIEJpKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBlZChlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciBvPTAscj1lLnN1c3BlbmRlZExhbmVzLGE9ZS5waW5nZWRMYW5lcyxpPW4mMjY4NDM1NDU1O2lmKGkhPT0wKXt2YXIgcz1pJn5yO3MhPT0wP289Qmkocyk6KGEmPWksYSE9PTAmJihvPUJpKGEpKSl9ZWxzZSBpPW4mfnIsaSE9PTA/bz1CaShpKTphIT09MCYmKG89QmkoYSkpO2lmKG89PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09byYmISh0JnIpJiYocj1vJi1vLGE9dCYtdCxyPj1hfHxyPT09MTYmJihhJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYobyY0JiYob3w9biYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1vOzA8dDspbj0zMS1ubyh0KSxyPTE8PG4sb3w9ZVtuXSx0Jj1+cjtyZXR1cm4gb31mdW5jdGlvbiBaRShlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBlTihlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLG89ZS5waW5nZWRMYW5lcyxyPWUuZXhwaXJhdGlvblRpbWVzLGE9ZS5wZW5kaW5nTGFuZXM7MDxhOyl7dmFyIGk9MzEtbm8oYSkscz0xPDxpLGw9cltpXTtsPT09LTE/KCEocyZuKXx8cyZvKSYmKHJbaV09WkUocyx0KSk6bDw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxhJj1+c319ZnVuY3Rpb24gWnUoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIHN2KCl7dmFyIGU9RWw7cmV0dXJuIEVsPDw9MSwhKEVsJjQxOTQyNDApJiYoRWw9NjQpLGV9ZnVuY3Rpb24gYnUoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gaHMoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLW5vKHQpLGVbdF09bn1mdW5jdGlvbiB0TihlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgbz1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIHI9MzEtbm8obiksYT0xPDxyO3Rbcl09MCxvW3JdPS0xLGVbcl09LTEsbiY9fmF9fWZ1bmN0aW9uIFVwKGUsdCl7dmFyIG49ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7bjspe3ZhciBvPTMxLW5vKG4pLHI9MTw8bztyJnR8ZVtvXSZ0JiYoZVtvXXw9dCksbiY9fnJ9fXZhciBXZT0wO2Z1bmN0aW9uIGx2KGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIGR2LEZwLGN2LHV2LHB2LGVwPSExLFRsPVtdLGhyPW51bGwsZ3I9bnVsbCx5cj1udWxsLHRzPW5ldyBNYXAsbnM9bmV3IE1hcCx1cj1bXSxuTj0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBIZyhlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmhyPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpncj1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0Ijp5cj1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6dHMuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6bnMuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gSWkoZSx0LG4sbyxyLGEpe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PWE/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6byxuYXRpdmVFdmVudDphLHRhcmdldENvbnRhaW5lcnM6W3JdfSx0IT09bnVsbCYmKHQ9eXModCksdCE9PW51bGwmJkZwKHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1vLHQ9ZS50YXJnZXRDb250YWluZXJzLHIhPT1udWxsJiZ0LmluZGV4T2Yocik9PT0tMSYmdC5wdXNoKHIpLGUpfWZ1bmN0aW9uIG9OKGUsdCxuLG8scil7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIGhyPUlpKGhyLGUsdCxuLG8sciksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBncj1JaShncixlLHQsbixvLHIpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4geXI9SWkoeXIsZSx0LG4sbyxyKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgYT1yLnBvaW50ZXJJZDtyZXR1cm4gdHMuc2V0KGEsSWkodHMuZ2V0KGEpfHxudWxsLGUsdCxuLG8scikpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBhPXIucG9pbnRlcklkLG5zLnNldChhLElpKG5zLmdldChhKXx8bnVsbCxlLHQsbixvLHIpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBmdihlKXt2YXIgdD1CcihlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciBuPVFyKHQpO2lmKG4hPT1udWxsKXtpZih0PW4udGFnLHQ9PT0xMyl7aWYodD10dihuKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxwdihlLnByaW9yaXR5LGZ1bmN0aW9uKCl7Y3Yobil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBXbChlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIG49dHAoZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249ZS5uYXRpdmVFdmVudDt2YXIgbz1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7JHU9byxuLnRhcmdldC5kaXNwYXRjaEV2ZW50KG8pLCR1PW51bGx9ZWxzZSByZXR1cm4gdD15cyhuKSx0IT09bnVsbCYmRnAodCksZS5ibG9ja2VkT249biwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gS2coZSx0LG4pe1dsKGUpJiZuLmRlbGV0ZSh0KX1mdW5jdGlvbiByTigpe2VwPSExLGhyIT09bnVsbCYmV2woaHIpJiYoaHI9bnVsbCksZ3IhPT1udWxsJiZXbChncikmJihncj1udWxsKSx5ciE9PW51bGwmJldsKHlyKSYmKHlyPW51bGwpLHRzLmZvckVhY2goS2cpLG5zLmZvckVhY2goS2cpfWZ1bmN0aW9uIFJpKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxlcHx8KGVwPSEwLFNuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksck4pKSl9ZnVuY3Rpb24gb3MoZSl7ZnVuY3Rpb24gdChyKXtyZXR1cm4gUmkocixlKX1pZigwPFRsLmxlbmd0aCl7UmkoVGxbMF0sZSk7Zm9yKHZhciBuPTE7bjxUbC5sZW5ndGg7bisrKXt2YXIgbz1UbFtuXTtvLmJsb2NrZWRPbj09PWUmJihvLmJsb2NrZWRPbj1udWxsKX19Zm9yKGhyIT09bnVsbCYmUmkoaHIsZSksZ3IhPT1udWxsJiZSaShncixlKSx5ciE9PW51bGwmJlJpKHlyLGUpLHRzLmZvckVhY2godCksbnMuZm9yRWFjaCh0KSxuPTA7bjx1ci5sZW5ndGg7bisrKW89dXJbbl0sby5ibG9ja2VkT249PT1lJiYoby5ibG9ja2VkT249bnVsbCk7Zm9yKDswPHVyLmxlbmd0aCYmKG49dXJbMF0sbi5ibG9ja2VkT249PT1udWxsKTspZnYobiksbi5ibG9ja2VkT249PT1udWxsJiZ1ci5zaGlmdCgpfXZhciBCYT1Hby5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyx0ZD0hMDtmdW5jdGlvbiBhTihlLHQsbixvKXt2YXIgcj1XZSxhPUJhLnRyYW5zaXRpb247QmEudHJhbnNpdGlvbj1udWxsO3RyeXtXZT0xLHpwKGUsdCxuLG8pfWZpbmFsbHl7V2U9cixCYS50cmFuc2l0aW9uPWF9fWZ1bmN0aW9uIGlOKGUsdCxuLG8pe3ZhciByPVdlLGE9QmEudHJhbnNpdGlvbjtCYS50cmFuc2l0aW9uPW51bGw7dHJ5e1dlPTQsenAoZSx0LG4sbyl9ZmluYWxseXtXZT1yLEJhLnRyYW5zaXRpb249YX19ZnVuY3Rpb24genAoZSx0LG4sbyl7aWYodGQpe3ZhciByPXRwKGUsdCxuLG8pO2lmKHI9PT1udWxsKVR1KGUsdCxvLG5kLG4pLEhnKGUsbyk7ZWxzZSBpZihvTihyLGUsdCxuLG8pKW8uc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihIZyhlLG8pLHQmNCYmLTE8bk4uaW5kZXhPZihlKSl7Zm9yKDtyIT09bnVsbDspe3ZhciBhPXlzKHIpO2lmKGEhPT1udWxsJiZkdihhKSxhPXRwKGUsdCxuLG8pLGE9PT1udWxsJiZUdShlLHQsbyxuZCxuKSxhPT09cilicmVhaztyPWF9ciE9PW51bGwmJm8uc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBUdShlLHQsbyxudWxsLG4pfX12YXIgbmQ9bnVsbDtmdW5jdGlvbiB0cChlLHQsbixvKXtpZihuZD1udWxsLGU9THAobyksZT1CcihlKSxlIT09bnVsbClpZih0PVFyKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKG49dC50YWcsbj09PTEzKXtpZihlPXR2KHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKG49PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4gbmQ9ZSxudWxsfWZ1bmN0aW9uIG12KGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChZRSgpKXtjYXNlIF9wOnJldHVybiAxO2Nhc2UgYXY6cmV0dXJuIDQ7Y2FzZSBabDpjYXNlIHFFOnJldHVybiAxNjtjYXNlIGl2OnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBmcj1udWxsLFdwPW51bGwsQmw9bnVsbDtmdW5jdGlvbiBodigpe2lmKEJsKXJldHVybiBCbDt2YXIgZSx0PVdwLG49dC5sZW5ndGgsbyxyPSJ2YWx1ZSJpbiBmcj9mci52YWx1ZTpmci50ZXh0Q29udGVudCxhPXIubGVuZ3RoO2ZvcihlPTA7ZTxuJiZ0W2VdPT09cltlXTtlKyspO3ZhciBpPW4tZTtmb3Iobz0xO288PWkmJnRbbi1vXT09PXJbYS1vXTtvKyspO3JldHVybiBCbD1yLnNsaWNlKGUsMTxvPzEtbzp2b2lkIDApfWZ1bmN0aW9uIEhsKGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIERsKCl7cmV0dXJuITB9ZnVuY3Rpb24gR2coKXtyZXR1cm4hMX1mdW5jdGlvbiBFbihlKXtmdW5jdGlvbiB0KG4sbyxyLGEsaSl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1yLHRoaXMudHlwZT1vLHRoaXMubmF0aXZlRXZlbnQ9YSx0aGlzLnRhcmdldD1pLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihuPWVbc10sdGhpc1tzXT1uP24oYSk6YVtzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShhLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/YS5kZWZhdWx0UHJldmVudGVkOmEucmV0dXJuVmFsdWU9PT0hMSk/RGw6R2csdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1HZyx0aGlzfXJldHVybiBzdCh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPURsKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPURsKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OkRsfSksdH12YXIgSmE9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sQnA9RW4oSmEpLGdzPXN0KHt9LEphLHt2aWV3OjAsZGV0YWlsOjB9KSxzTj1Fbihncyksd3Usa3UsUGksa2Q9c3Qoe30sZ3Mse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6SHAsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09UGkmJihQaSYmZS50eXBlPT09Im1vdXNlbW92ZSI/KHd1PWUuc2NyZWVuWC1QaS5zY3JlZW5YLGt1PWUuc2NyZWVuWS1QaS5zY3JlZW5ZKTprdT13dT0wLFBpPWUpLHd1KX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTprdX19KSxWZz1FbihrZCksbE49c3Qoe30sa2Qse2RhdGFUcmFuc2ZlcjowfSksZE49RW4obE4pLGNOPXN0KHt9LGdzLHtyZWxhdGVkVGFyZ2V0OjB9KSx4dT1FbihjTiksdU49c3Qoe30sSmEse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHBOPUVuKHVOKSxmTj1zdCh7fSxKYSx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxtTj1FbihmTiksaE49c3Qoe30sSmEse2RhdGE6MH0pLGpnPUVuKGhOKSxnTj17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0seU49ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSx2Tj17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIGJOKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9dk5bZV0pPyEhdFtlXTohMX1mdW5jdGlvbiBIcCgpe3JldHVybiBiTn12YXIgd049c3Qoe30sZ3Mse2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9Z05bZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9SGwoZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP3lOW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpIcCxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9IbChlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP0hsKGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSxrTj1Fbih3TikseE49c3Qoe30sa2Qse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksWWc9RW4oeE4pLFNOPXN0KHt9LGdzLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6SHB9KSxFTj1FbihTTiksTk49c3Qoe30sSmEse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksVE49RW4oTk4pLEROPXN0KHt9LGtkLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksQU49RW4oRE4pLENOPVs5LDEzLDI3LDMyXSxLcD1XbyYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LFZpPW51bGw7V28mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihWaT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBNTj1XbyYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFWaSxndj1XbyYmKCFLcHx8VmkmJjg8VmkmJjExPj1WaSkscWc9IiAiLCRnPSExO2Z1bmN0aW9uIHl2KGUsdCl7c3dpdGNoKGUpe2Nhc2Uia2V5dXAiOnJldHVybiBDTi5pbmRleE9mKHQua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiB0LmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHZ2KGUpe3JldHVybiBlPWUuZGV0YWlsLHR5cGVvZiBlPT0ib2JqZWN0IiYmImRhdGEiaW4gZT9lLmRhdGE6bnVsbH12YXIgQWE9ITE7ZnVuY3Rpb24gT04oZSx0KXtzd2l0Y2goZSl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHZ2KHQpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiB0LndoaWNoIT09MzI/bnVsbDooJGc9ITAscWcpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gZT10LmRhdGEsZT09PXFnJiYkZz9udWxsOmU7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gSU4oZSx0KXtpZihBYSlyZXR1cm4gZT09PSJjb21wb3NpdGlvbmVuZCJ8fCFLcCYmeXYoZSx0KT8oZT1odigpLEJsPVdwPWZyPW51bGwsQWE9ITEsZSk6bnVsbDtzd2l0Y2goZSl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoISh0LmN0cmxLZXl8fHQuYWx0S2V5fHx0Lm1ldGFLZXkpfHx0LmN0cmxLZXkmJnQuYWx0S2V5KXtpZih0LmNoYXImJjE8dC5jaGFyLmxlbmd0aClyZXR1cm4gdC5jaGFyO2lmKHQud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIGd2JiZ0LmxvY2FsZSE9PSJrbyI/bnVsbDp0LmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIFJOPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBYZyhlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiPyEhUk5bZS50eXBlXTp0PT09InRleHRhcmVhIn1mdW5jdGlvbiBidihlLHQsbixvKXtYeShvKSx0PW9kKHQsIm9uQ2hhbmdlIiksMDx0Lmxlbmd0aCYmKG49bmV3IEJwKCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLG8pLGUucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6dH0pKX12YXIgamk9bnVsbCxycz1udWxsO2Z1bmN0aW9uIFBOKGUpe012KGUsMCl9ZnVuY3Rpb24geGQoZSl7dmFyIHQ9T2EoZSk7aWYoS3kodCkpcmV0dXJuIGV9ZnVuY3Rpb24gTE4oZSx0KXtpZihlPT09ImNoYW5nZSIpcmV0dXJuIHR9dmFyIHd2PSExO1dvJiYoV28/KENsPSJvbmlucHV0ImluIGRvY3VtZW50LENsfHwoU3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksU3Uuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLENsPXR5cGVvZiBTdS5vbmlucHV0PT0iZnVuY3Rpb24iKSxBbD1DbCk6QWw9ITEsd3Y9QWwmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSkpO3ZhciBBbCxDbCxTdTtmdW5jdGlvbiBKZygpe2ppJiYoamkuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGt2KSxycz1qaT1udWxsKX1mdW5jdGlvbiBrdihlKXtpZihlLnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJnhkKHJzKSl7dmFyIHQ9W107YnYodCxycyxlLExwKGUpKSxldihQTix0KX19ZnVuY3Rpb24gX04oZSx0LG4pe2U9PT0iZm9jdXNpbiI/KEpnKCksamk9dCxycz1uLGppLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixrdikpOmU9PT0iZm9jdXNvdXQiJiZKZygpfWZ1bmN0aW9uIFVOKGUpe2lmKGU9PT0ic2VsZWN0aW9uY2hhbmdlInx8ZT09PSJrZXl1cCJ8fGU9PT0ia2V5ZG93biIpcmV0dXJuIHhkKHJzKX1mdW5jdGlvbiBGTihlLHQpe2lmKGU9PT0iY2xpY2siKXJldHVybiB4ZCh0KX1mdW5jdGlvbiB6TihlLHQpe2lmKGU9PT0iaW5wdXQifHxlPT09ImNoYW5nZSIpcmV0dXJuIHhkKHQpfWZ1bmN0aW9uIFdOKGUsdCl7cmV0dXJuIGU9PT10JiYoZSE9PTB8fDEvZT09PTEvdCl8fGUhPT1lJiZ0IT09dH12YXIgcm89dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6V047ZnVuY3Rpb24gYXMoZSx0KXtpZihybyhlLHQpKXJldHVybiEwO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSksbz1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciByPW5bb107aWYoIVV1LmNhbGwodCxyKXx8IXJvKGVbcl0sdFtyXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gUWcoZSl7Zm9yKDtlJiZlLmZpcnN0Q2hpbGQ7KWU9ZS5maXJzdENoaWxkO3JldHVybiBlfWZ1bmN0aW9uIFpnKGUsdCl7dmFyIG49UWcoZSk7ZT0wO2Zvcih2YXIgbztuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKG89ZStuLnRleHRDb250ZW50Lmxlbmd0aCxlPD10JiZvPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtZX07ZT1vfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49UWcobil9fWZ1bmN0aW9uIHh2KGUsdCl7cmV0dXJuIGUmJnQ/ZT09PXQ/ITA6ZSYmZS5ub2RlVHlwZT09PTM/ITE6dCYmdC5ub2RlVHlwZT09PTM/eHYoZSx0LnBhcmVudE5vZGUpOiJjb250YWlucyJpbiBlP2UuY29udGFpbnModCk6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KTohMTohMX1mdW5jdGlvbiBTdigpe2Zvcih2YXIgZT13aW5kb3csdD1YbCgpO3QgaW5zdGFuY2VvZiBlLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiB0LmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKWU9dC5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7dD1YbChlLmRvY3VtZW50KX1yZXR1cm4gdH1mdW5jdGlvbiBHcChlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJih0PT09ImlucHV0IiYmKGUudHlwZT09PSJ0ZXh0Inx8ZS50eXBlPT09InNlYXJjaCJ8fGUudHlwZT09PSJ0ZWwifHxlLnR5cGU9PT0idXJsInx8ZS50eXBlPT09InBhc3N3b3JkIil8fHQ9PT0idGV4dGFyZWEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gQk4oZSl7dmFyIHQ9U3YoKSxuPWUuZm9jdXNlZEVsZW0sbz1lLnNlbGVjdGlvblJhbmdlO2lmKHQhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJnh2KG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKG8hPT1udWxsJiZHcChuKSl7aWYodD1vLnN0YXJ0LGU9by5lbmQsZT09PXZvaWQgMCYmKGU9dCksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD10LG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKGUsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoZT0odD1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmdC5kZWZhdWx0Vmlld3x8d2luZG93LGUuZ2V0U2VsZWN0aW9uKXtlPWUuZ2V0U2VsZWN0aW9uKCk7dmFyIHI9bi50ZXh0Q29udGVudC5sZW5ndGgsYT1NYXRoLm1pbihvLnN0YXJ0LHIpO289by5lbmQ9PT12b2lkIDA/YTpNYXRoLm1pbihvLmVuZCxyKSwhZS5leHRlbmQmJmE+byYmKHI9byxvPWEsYT1yKSxyPVpnKG4sYSk7dmFyIGk9WmcobixvKTtyJiZpJiYoZS5yYW5nZUNvdW50IT09MXx8ZS5hbmNob3JOb2RlIT09ci5ub2RlfHxlLmFuY2hvck9mZnNldCE9PXIub2Zmc2V0fHxlLmZvY3VzTm9kZSE9PWkubm9kZXx8ZS5mb2N1c09mZnNldCE9PWkub2Zmc2V0KSYmKHQ9dC5jcmVhdGVSYW5nZSgpLHQuc2V0U3RhcnQoci5ub2RlLHIub2Zmc2V0KSxlLnJlbW92ZUFsbFJhbmdlcygpLGE+bz8oZS5hZGRSYW5nZSh0KSxlLmV4dGVuZChpLm5vZGUsaS5vZmZzZXQpKToodC5zZXRFbmQoaS5ub2RlLGkub2Zmc2V0KSxlLmFkZFJhbmdlKHQpKSl9fWZvcih0PVtdLGU9bjtlPWUucGFyZW50Tm9kZTspZS5ub2RlVHlwZT09PTEmJnQucHVzaCh7ZWxlbWVudDplLGxlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0sZS5lbGVtZW50LnNjcm9sbExlZnQ9ZS5sZWZ0LGUuZWxlbWVudC5zY3JvbGxUb3A9ZS50b3B9fXZhciBITj1XbyYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxDYT1udWxsLG5wPW51bGwsWWk9bnVsbCxvcD0hMTtmdW5jdGlvbiBleShlLHQsbil7dmFyIG89bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7b3B8fENhPT1udWxsfHxDYSE9PVhsKG8pfHwobz1DYSwic2VsZWN0aW9uU3RhcnQiaW4gbyYmR3Aobyk/bz17c3RhcnQ6by5zZWxlY3Rpb25TdGFydCxlbmQ6by5zZWxlY3Rpb25FbmR9OihvPShvLm93bmVyRG9jdW1lbnQmJm8ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxvPXthbmNob3JOb2RlOm8uYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6by5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOm8uZm9jdXNOb2RlLGZvY3VzT2Zmc2V0Om8uZm9jdXNPZmZzZXR9KSxZaSYmYXMoWWksbyl8fChZaT1vLG89b2QobnAsIm9uU2VsZWN0IiksMDxvLmxlbmd0aCYmKHQ9bmV3IEJwKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCx0LG4pLGUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6b30pLHQudGFyZ2V0PUNhKSkpfWZ1bmN0aW9uIE1sKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxufXZhciBNYT17YW5pbWF0aW9uZW5kOk1sKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246TWwoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0Ok1sKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6TWwoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LEV1PXt9LEV2PXt9O1dvJiYoRXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBNYS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBNYS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBNYS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgTWEudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBTZChlKXtpZihFdVtlXSlyZXR1cm4gRXVbZV07aWYoIU1hW2VdKXJldHVybiBlO3ZhciB0PU1hW2VdLG47Zm9yKG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIEV2KXJldHVybiBFdVtlXT10W25dO3JldHVybiBlfXZhciBOdj1TZCgiYW5pbWF0aW9uZW5kIiksVHY9U2QoImFuaW1hdGlvbml0ZXJhdGlvbiIpLER2PVNkKCJhbmltYXRpb25zdGFydCIpLEF2PVNkKCJ0cmFuc2l0aW9uZW5kIiksQ3Y9bmV3IE1hcCx0eT0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gTnIoZSx0KXtDdi5zZXQoZSx0KSxKcih0LFtlXSl9Zm9yKE9sPTA7T2w8dHkubGVuZ3RoO09sKyspSWw9dHlbT2xdLG55PUlsLnRvTG93ZXJDYXNlKCksb3k9SWxbMF0udG9VcHBlckNhc2UoKStJbC5zbGljZSgxKSxOcihueSwib24iK295KTt2YXIgSWwsbnksb3ksT2w7TnIoTnYsIm9uQW5pbWF0aW9uRW5kIik7TnIoVHYsIm9uQW5pbWF0aW9uSXRlcmF0aW9uIik7TnIoRHYsIm9uQW5pbWF0aW9uU3RhcnQiKTtOcigiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIik7TnIoImZvY3VzaW4iLCJvbkZvY3VzIik7TnIoImZvY3Vzb3V0Iiwib25CbHVyIik7TnIoQXYsIm9uVHJhbnNpdGlvbkVuZCIpO0dhKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7R2EoIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtHYSgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO0dhKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7SnIoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO0pyKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7SnIoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pO0pyKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO0pyKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTtKcigib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgSGk9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLEtOPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQoSGkpKTtmdW5jdGlvbiByeShlLHQsbil7dmFyIG89ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sS0Uobyx0LHZvaWQgMCxlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBNdihlLHQpe3Q9KHQmNCkhPT0wO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dLHI9by5ldmVudDtvPW8ubGlzdGVuZXJzO2U6e3ZhciBhPXZvaWQgMDtpZih0KWZvcih2YXIgaT1vLmxlbmd0aC0xOzA8PWk7aS0tKXt2YXIgcz1vW2ldLGw9cy5pbnN0YW5jZSxkPXMuY3VycmVudFRhcmdldDtpZihzPXMubGlzdGVuZXIsbCE9PWEmJnIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO3J5KHIscyxkKSxhPWx9ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihzPW9baV0sbD1zLmluc3RhbmNlLGQ9cy5jdXJyZW50VGFyZ2V0LHM9cy5saXN0ZW5lcixsIT09YSYmci5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7cnkocixzLGQpLGE9bH19fWlmKFFsKXRocm93IGU9UXUsUWw9ITEsUXU9bnVsbCxlfWZ1bmN0aW9uICRlKGUsdCl7dmFyIG49dFtscF07bj09PXZvaWQgMCYmKG49dFtscF09bmV3IFNldCk7dmFyIG89ZSsiX19idWJibGUiO24uaGFzKG8pfHwoT3YodCxlLDIsITEpLG4uYWRkKG8pKX1mdW5jdGlvbiBOdShlLHQsbil7dmFyIG89MDt0JiYob3w9NCksT3YobixlLG8sdCl9dmFyIFJsPSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIGlzKGUpe2lmKCFlW1JsXSl7ZVtSbF09ITAsRnkuZm9yRWFjaChmdW5jdGlvbihuKXtuIT09InNlbGVjdGlvbmNoYW5nZSImJihLTi5oYXMobil8fE51KG4sITEsZSksTnUobiwhMCxlKSl9KTt2YXIgdD1lLm5vZGVUeXBlPT09OT9lOmUub3duZXJEb2N1bWVudDt0PT09bnVsbHx8dFtSbF18fCh0W1JsXT0hMCxOdSgic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIE92KGUsdCxuLG8pe3N3aXRjaChtdih0KSl7Y2FzZSAxOnZhciByPWFOO2JyZWFrO2Nhc2UgNDpyPWlOO2JyZWFrO2RlZmF1bHQ6cj16cH1uPXIuYmluZChudWxsLHQsbixlKSxyPXZvaWQgMCwhSnV8fHQhPT0idG91Y2hzdGFydCImJnQhPT0idG91Y2htb3ZlIiYmdCE9PSJ3aGVlbCJ8fChyPSEwKSxvP3IhPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7Y2FwdHVyZTohMCxwYXNzaXZlOnJ9KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKTpyIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se3Bhc3NpdmU6cn0pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIFR1KGUsdCxuLG8scil7dmFyIGE9bztpZighKHQmMSkmJiEodCYyKSYmbyE9PW51bGwpZTpmb3IoOzspe2lmKG89PT1udWxsKXJldHVybjt2YXIgaT1vLnRhZztpZihpPT09M3x8aT09PTQpe3ZhciBzPW8uc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYocz09PXJ8fHMubm9kZVR5cGU9PT04JiZzLnBhcmVudE5vZGU9PT1yKWJyZWFrO2lmKGk9PT00KWZvcihpPW8ucmV0dXJuO2khPT1udWxsOyl7dmFyIGw9aS50YWc7aWYoKGw9PT0zfHxsPT09NCkmJihsPWkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sbD09PXJ8fGwubm9kZVR5cGU9PT04JiZsLnBhcmVudE5vZGU9PT1yKSlyZXR1cm47aT1pLnJldHVybn1mb3IoO3MhPT1udWxsOyl7aWYoaT1CcihzKSxpPT09bnVsbClyZXR1cm47aWYobD1pLnRhZyxsPT09NXx8bD09PTYpe289YT1pO2NvbnRpbnVlIGV9cz1zLnBhcmVudE5vZGV9fW89by5yZXR1cm59ZXYoZnVuY3Rpb24oKXt2YXIgZD1hLGM9THAobiksdT1bXTtlOnt2YXIgcD1Ddi5nZXQoZSk7aWYocCE9PXZvaWQgMCl7dmFyIGY9QnAsbT1lO3N3aXRjaChlKXtjYXNlImtleXByZXNzIjppZihIbChuKT09PTApYnJlYWsgZTtjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmY9a047YnJlYWs7Y2FzZSJmb2N1c2luIjptPSJmb2N1cyIsZj14dTticmVhaztjYXNlImZvY3Vzb3V0IjptPSJibHVyIixmPXh1O2JyZWFrO2Nhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmY9eHU7YnJlYWs7Y2FzZSJjbGljayI6aWYobi5idXR0b249PT0yKWJyZWFrIGU7Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNldXAiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlImNvbnRleHRtZW51IjpmPVZnO2JyZWFrO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmY9ZE47YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2UidG91Y2hzdGFydCI6Zj1FTjticmVhaztjYXNlIE52OmNhc2UgVHY6Y2FzZSBEdjpmPXBOO2JyZWFrO2Nhc2UgQXY6Zj1UTjticmVhaztjYXNlInNjcm9sbCI6Zj1zTjticmVhaztjYXNlIndoZWVsIjpmPUFOO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UicGFzdGUiOmY9bU47YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJ1cCI6Zj1ZZ312YXIgZz0odCY0KSE9PTAsdz0hZyYmZT09PSJzY3JvbGwiLHY9Zz9wIT09bnVsbD9wKyJDYXB0dXJlIjpudWxsOnA7Zz1bXTtmb3IodmFyIHk9ZCxiO3khPT1udWxsOyl7Yj15O3ZhciBoPWIuc3RhdGVOb2RlO2lmKGIudGFnPT09NSYmaCE9PW51bGwmJihiPWgsdiE9PW51bGwmJihoPWVzKHksdiksaCE9bnVsbCYmZy5wdXNoKHNzKHksaCxiKSkpKSx3KWJyZWFrO3k9eS5yZXR1cm59MDxnLmxlbmd0aCYmKHA9bmV3IGYocCxtLG51bGwsbixjKSx1LnB1c2goe2V2ZW50OnAsbGlzdGVuZXJzOmd9KSl9fWlmKCEodCY3KSl7ZTp7aWYocD1lPT09Im1vdXNlb3ZlciJ8fGU9PT0icG9pbnRlcm92ZXIiLGY9ZT09PSJtb3VzZW91dCJ8fGU9PT0icG9pbnRlcm91dCIscCYmbiE9PSR1JiYobT1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYoQnIobSl8fG1bQm9dKSlicmVhayBlO2lmKChmfHxwKSYmKHA9Yy53aW5kb3c9PT1jP2M6KHA9Yy5vd25lckRvY3VtZW50KT9wLmRlZmF1bHRWaWV3fHxwLnBhcmVudFdpbmRvdzp3aW5kb3csZj8obT1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LGY9ZCxtPW0/QnIobSk6bnVsbCxtIT09bnVsbCYmKHc9UXIobSksbSE9PXd8fG0udGFnIT09NSYmbS50YWchPT02KSYmKG09bnVsbCkpOihmPW51bGwsbT1kKSxmIT09bSkpe2lmKGc9VmcsaD0ib25Nb3VzZUxlYXZlIix2PSJvbk1vdXNlRW50ZXIiLHk9Im1vdXNlIiwoZT09PSJwb2ludGVyb3V0Inx8ZT09PSJwb2ludGVyb3ZlciIpJiYoZz1ZZyxoPSJvblBvaW50ZXJMZWF2ZSIsdj0ib25Qb2ludGVyRW50ZXIiLHk9InBvaW50ZXIiKSx3PWY9PW51bGw/cDpPYShmKSxiPW09PW51bGw/cDpPYShtKSxwPW5ldyBnKGgseSsibGVhdmUiLGYsbixjKSxwLnRhcmdldD13LHAucmVsYXRlZFRhcmdldD1iLGg9bnVsbCxCcihjKT09PWQmJihnPW5ldyBnKHYseSsiZW50ZXIiLG0sbixjKSxnLnRhcmdldD1iLGcucmVsYXRlZFRhcmdldD13LGg9Zyksdz1oLGYmJm0pdDp7Zm9yKGc9Zix2PW0seT0wLGI9ZztiO2I9TmEoYikpeSsrO2ZvcihiPTAsaD12O2g7aD1OYShoKSliKys7Zm9yKDswPHktYjspZz1OYShnKSx5LS07Zm9yKDswPGIteTspdj1OYSh2KSxiLS07Zm9yKDt5LS07KXtpZihnPT09dnx8diE9PW51bGwmJmc9PT12LmFsdGVybmF0ZSlicmVhayB0O2c9TmEoZyksdj1OYSh2KX1nPW51bGx9ZWxzZSBnPW51bGw7ZiE9PW51bGwmJmF5KHUscCxmLGcsITEpLG0hPT1udWxsJiZ3IT09bnVsbCYmYXkodSx3LG0sZywhMCl9fWU6e2lmKHA9ZD9PYShkKTp3aW5kb3csZj1wLm5vZGVOYW1lJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZj09PSJzZWxlY3QifHxmPT09ImlucHV0IiYmcC50eXBlPT09ImZpbGUiKXZhciBTPUxOO2Vsc2UgaWYoWGcocCkpaWYod3YpUz16TjtlbHNle1M9VU47dmFyIHg9X059ZWxzZShmPXAubm9kZU5hbWUpJiZmLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYocC50eXBlPT09ImNoZWNrYm94Inx8cC50eXBlPT09InJhZGlvIikmJihTPUZOKTtpZihTJiYoUz1TKGUsZCkpKXtidih1LFMsbixjKTticmVhayBlfXgmJngoZSxwLGQpLGU9PT0iZm9jdXNvdXQiJiYoeD1wLl93cmFwcGVyU3RhdGUpJiZ4LmNvbnRyb2xsZWQmJnAudHlwZT09PSJudW1iZXIiJiZHdShwLCJudW1iZXIiLHAudmFsdWUpfXN3aXRjaCh4PWQ/T2EoZCk6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KFhnKHgpfHx4LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJihDYT14LG5wPWQsWWk9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6WWk9bnA9Q2E9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6b3A9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOm9wPSExLGV5KHUsbixjKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYoSE4pYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpleSh1LG4sYyl9dmFyIEU7aWYoS3ApZTp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIFQ9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9uZW5kIjpUPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOlQ9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGV9VD12b2lkIDB9ZWxzZSBBYT95dihlLG4pJiYoVD0ib25Db21wb3NpdGlvbkVuZCIpOmU9PT0ia2V5ZG93biImJm4ua2V5Q29kZT09PTIyOSYmKFQ9Im9uQ29tcG9zaXRpb25TdGFydCIpO1QmJihndiYmbi5sb2NhbGUhPT0ia28iJiYoQWF8fFQhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9UPT09Im9uQ29tcG9zaXRpb25FbmQiJiZBYSYmKEU9aHYoKSk6KGZyPWMsV3A9InZhbHVlImluIGZyP2ZyLnZhbHVlOmZyLnRleHRDb250ZW50LEFhPSEwKSkseD1vZChkLFQpLDA8eC5sZW5ndGgmJihUPW5ldyBqZyhULGUsbnVsbCxuLGMpLHUucHVzaCh7ZXZlbnQ6VCxsaXN0ZW5lcnM6eH0pLEU/VC5kYXRhPUU6KEU9dnYobiksRSE9PW51bGwmJihULmRhdGE9RSkpKSksKEU9TU4/T04oZSxuKTpJTihlLG4pKSYmKGQ9b2QoZCwib25CZWZvcmVJbnB1dCIpLDA8ZC5sZW5ndGgmJihjPW5ldyBqZygib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLG4sYyksdS5wdXNoKHtldmVudDpjLGxpc3RlbmVyczpkfSksYy5kYXRhPUUpKX1Ndih1LHQpfSl9ZnVuY3Rpb24gc3MoZSx0LG4pe3JldHVybntpbnN0YW5jZTplLGxpc3RlbmVyOnQsY3VycmVudFRhcmdldDpufX1mdW5jdGlvbiBvZChlLHQpe2Zvcih2YXIgbj10KyJDYXB0dXJlIixvPVtdO2UhPT1udWxsOyl7dmFyIHI9ZSxhPXIuc3RhdGVOb2RlO3IudGFnPT09NSYmYSE9PW51bGwmJihyPWEsYT1lcyhlLG4pLGEhPW51bGwmJm8udW5zaGlmdChzcyhlLGEscikpLGE9ZXMoZSx0KSxhIT1udWxsJiZvLnB1c2goc3MoZSxhLHIpKSksZT1lLnJldHVybn1yZXR1cm4gb31mdW5jdGlvbiBOYShlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtkbyBlPWUucmV0dXJuO3doaWxlKGUmJmUudGFnIT09NSk7cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gYXkoZSx0LG4sbyxyKXtmb3IodmFyIGE9dC5fcmVhY3ROYW1lLGk9W107biE9PW51bGwmJm4hPT1vOyl7dmFyIHM9bixsPXMuYWx0ZXJuYXRlLGQ9cy5zdGF0ZU5vZGU7aWYobCE9PW51bGwmJmw9PT1vKWJyZWFrO3MudGFnPT09NSYmZCE9PW51bGwmJihzPWQscj8obD1lcyhuLGEpLGwhPW51bGwmJmkudW5zaGlmdChzcyhuLGwscykpKTpyfHwobD1lcyhuLGEpLGwhPW51bGwmJmkucHVzaChzcyhuLGwscykpKSksbj1uLnJldHVybn1pLmxlbmd0aCE9PTAmJmUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6aX0pfXZhciBHTj0vXHJcbj8vZyxWTj0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIGl5KGUpe3JldHVybih0eXBlb2YgZT09InN0cmluZyI/ZToiIitlKS5yZXBsYWNlKEdOLGAKYCkucmVwbGFjZShWTiwiIil9ZnVuY3Rpb24gUGwoZSx0LG4pe2lmKHQ9aXkodCksaXkoZSkhPT10JiZuKXRocm93IEVycm9yKHooNDI1KSl9ZnVuY3Rpb24gcmQoKXt9dmFyIHJwPW51bGwsYXA9bnVsbDtmdW5jdGlvbiBpcChlLHQpe3JldHVybiBlPT09InRleHRhcmVhInx8ZT09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTD09Im9iamVjdCImJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPT1udWxsJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCE9bnVsbH12YXIgc3A9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDp2b2lkIDAsak49dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6dm9pZCAwLHN5PXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6dm9pZCAwLFlOPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazp0eXBlb2Ygc3k8InUiP2Z1bmN0aW9uKGUpe3JldHVybiBzeS5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2gocU4pfTpzcDtmdW5jdGlvbiBxTihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIER1KGUsdCl7dmFyIG49dCxvPTA7ZG97dmFyIHI9bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLHImJnIubm9kZVR5cGU9PT04KWlmKG49ci5kYXRhLG49PT0iLyQiKXtpZihvPT09MCl7ZS5yZW1vdmVDaGlsZChyKSxvcyh0KTtyZXR1cm59by0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkPyImJm4hPT0iJCEifHxvKys7bj1yfXdoaWxlKG4pO29zKHQpfWZ1bmN0aW9uIHZyKGUpe2Zvcig7ZSE9bnVsbDtlPWUubmV4dFNpYmxpbmcpe3ZhciB0PWUubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWUuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyIpYnJlYWs7aWYodD09PSIvJCIpcmV0dXJuIG51bGx9fXJldHVybiBlfWZ1bmN0aW9uIGx5KGUpe2U9ZS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIkInx8bj09PSIkISJ8fG49PT0iJD8iKXtpZih0PT09MClyZXR1cm4gZTt0LS19ZWxzZSBuPT09Ii8kIiYmdCsrfWU9ZS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIFFhPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLGtvPSJfX3JlYWN0RmliZXIkIitRYSxscz0iX19yZWFjdFByb3BzJCIrUWEsQm89Il9fcmVhY3RDb250YWluZXIkIitRYSxscD0iX19yZWFjdEV2ZW50cyQiK1FhLCROPSJfX3JlYWN0TGlzdGVuZXJzJCIrUWEsWE49Il9fcmVhY3RIYW5kbGVzJCIrUWE7ZnVuY3Rpb24gQnIoZSl7dmFyIHQ9ZVtrb107aWYodClyZXR1cm4gdDtmb3IodmFyIG49ZS5wYXJlbnROb2RlO247KXtpZih0PW5bQm9dfHxuW2tvXSl7aWYobj10LmFsdGVybmF0ZSx0LmNoaWxkIT09bnVsbHx8biE9PW51bGwmJm4uY2hpbGQhPT1udWxsKWZvcihlPWx5KGUpO2UhPT1udWxsOyl7aWYobj1lW2tvXSlyZXR1cm4gbjtlPWx5KGUpfXJldHVybiB0fWU9bixuPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5cyhlKXtyZXR1cm4gZT1lW2tvXXx8ZVtCb10sIWV8fGUudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTEzJiZlLnRhZyE9PTM/bnVsbDplfWZ1bmN0aW9uIE9hKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlLnN0YXRlTm9kZTt0aHJvdyBFcnJvcih6KDMzKSl9ZnVuY3Rpb24gRWQoZSl7cmV0dXJuIGVbbHNdfHxudWxsfXZhciBkcD1bXSxJYT0tMTtmdW5jdGlvbiBUcihlKXtyZXR1cm57Y3VycmVudDplfX1mdW5jdGlvbiBYZShlKXswPklhfHwoZS5jdXJyZW50PWRwW0lhXSxkcFtJYV09bnVsbCxJYS0tKX1mdW5jdGlvbiBqZShlLHQpe0lhKyssZHBbSWFdPWUuY3VycmVudCxlLmN1cnJlbnQ9dH12YXIgRXI9e30scXQ9VHIoRXIpLHVuPVRyKCExKSxqcj1FcjtmdW5jdGlvbiBWYShlLHQpe3ZhciBuPWUudHlwZS5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIEVyO3ZhciBvPWUuc3RhdGVOb2RlO2lmKG8mJm8uX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PXQpcmV0dXJuIG8uX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIHI9e30sYTtmb3IoYSBpbiBuKXJbYV09dFthXTtyZXR1cm4gbyYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXQsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1yKSxyfWZ1bmN0aW9uIHBuKGUpe3JldHVybiBlPWUuY2hpbGRDb250ZXh0VHlwZXMsZSE9bnVsbH1mdW5jdGlvbiBhZCgpe1hlKHVuKSxYZShxdCl9ZnVuY3Rpb24gZHkoZSx0LG4pe2lmKHF0LmN1cnJlbnQhPT1Fcil0aHJvdyBFcnJvcih6KDE2OCkpO2plKHF0LHQpLGplKHVuLG4pfWZ1bmN0aW9uIEl2KGUsdCxuKXt2YXIgbz1lLnN0YXRlTm9kZTtpZih0PXQuY2hpbGRDb250ZXh0VHlwZXMsdHlwZW9mIG8uZ2V0Q2hpbGRDb250ZXh0IT0iZnVuY3Rpb24iKXJldHVybiBuO289by5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIHIgaW4gbylpZighKHIgaW4gdCkpdGhyb3cgRXJyb3IoeigxMDgsX0UoZSl8fCJVbmtub3duIixyKSk7cmV0dXJuIHN0KHt9LG4sbyl9ZnVuY3Rpb24gaWQoZSl7cmV0dXJuIGU9KGU9ZS5zdGF0ZU5vZGUpJiZlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxFcixqcj1xdC5jdXJyZW50LGplKHF0LGUpLGplKHVuLHVuLmN1cnJlbnQpLCEwfWZ1bmN0aW9uIGN5KGUsdCxuKXt2YXIgbz1lLnN0YXRlTm9kZTtpZighbyl0aHJvdyBFcnJvcih6KDE2OSkpO24/KGU9SXYoZSx0LGpyKSxvLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWUsWGUodW4pLFhlKHF0KSxqZShxdCxlKSk6WGUodW4pLGplKHVuLG4pfXZhciBfbz1udWxsLE5kPSExLEF1PSExO2Z1bmN0aW9uIFJ2KGUpe19vPT09bnVsbD9fbz1bZV06X28ucHVzaChlKX1mdW5jdGlvbiBKTihlKXtOZD0hMCxSdihlKX1mdW5jdGlvbiBEcigpe2lmKCFBdSYmX28hPT1udWxsKXtBdT0hMDt2YXIgZT0wLHQ9V2U7dHJ5e3ZhciBuPV9vO2ZvcihXZT0xO2U8bi5sZW5ndGg7ZSsrKXt2YXIgbz1uW2VdO2RvIG89byghMCk7d2hpbGUobyE9PW51bGwpfV9vPW51bGwsTmQ9ITF9Y2F0Y2gocil7dGhyb3cgX28hPT1udWxsJiYoX289X28uc2xpY2UoZSsxKSkscnYoX3AsRHIpLHJ9ZmluYWxseXtXZT10LEF1PSExfX1yZXR1cm4gbnVsbH12YXIgUmE9W10sUGE9MCxzZD1udWxsLGxkPTAsTW49W10sT249MCxZcj1udWxsLFVvPTEsRm89IiI7ZnVuY3Rpb24genIoZSx0KXtSYVtQYSsrXT1sZCxSYVtQYSsrXT1zZCxzZD1lLGxkPXR9ZnVuY3Rpb24gUHYoZSx0LG4pe01uW09uKytdPVVvLE1uW09uKytdPUZvLE1uW09uKytdPVlyLFlyPWU7dmFyIG89VW87ZT1Gbzt2YXIgcj0zMi1ubyhvKS0xO28mPX4oMTw8ciksbis9MTt2YXIgYT0zMi1ubyh0KStyO2lmKDMwPGEpe3ZhciBpPXItciU1O2E9KG8mKDE8PGkpLTEpLnRvU3RyaW5nKDMyKSxvPj49aSxyLT1pLFVvPTE8PDMyLW5vKHQpK3J8bjw8cnxvLEZvPWErZX1lbHNlIFVvPTE8PGF8bjw8cnxvLEZvPWV9ZnVuY3Rpb24gVnAoZSl7ZS5yZXR1cm4hPT1udWxsJiYoenIoZSwxKSxQdihlLDEsMCkpfWZ1bmN0aW9uIGpwKGUpe2Zvcig7ZT09PXNkOylzZD1SYVstLVBhXSxSYVtQYV09bnVsbCxsZD1SYVstLVBhXSxSYVtQYV09bnVsbDtmb3IoO2U9PT1ZcjspWXI9TW5bLS1Pbl0sTW5bT25dPW51bGwsRm89TW5bLS1Pbl0sTW5bT25dPW51bGwsVW89TW5bLS1Pbl0sTW5bT25dPW51bGx9dmFyIHhuPW51bGwsa249bnVsbCxldD0hMSx0bz1udWxsO2Z1bmN0aW9uIEx2KGUsdCl7dmFyIG49SW4oNSxudWxsLG51bGwsMCk7bi5lbGVtZW50VHlwZT0iREVMRVRFRCIsbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLHQ9ZS5kZWxldGlvbnMsdD09PW51bGw/KGUuZGVsZXRpb25zPVtuXSxlLmZsYWdzfD0xNik6dC5wdXNoKG4pfWZ1bmN0aW9uIHV5KGUsdCl7c3dpdGNoKGUudGFnKXtjYXNlIDU6dmFyIG49ZS50eXBlO3JldHVybiB0PXQubm9kZVR5cGUhPT0xfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LHhuPWUsa249dnIodC5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiB0PWUucGVuZGluZ1Byb3BzPT09IiJ8fHQubm9kZVR5cGUhPT0zP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCx4bj1lLGtuPW51bGwsITApOiExO2Nhc2UgMTM6cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTg/bnVsbDp0LHQhPT1udWxsPyhuPVlyIT09bnVsbD97aWQ6VW8sb3ZlcmZsb3c6Rm99Om51bGwsZS5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOnQsdHJlZUNvbnRleHQ6bixyZXRyeUxhbmU6MTA3Mzc0MTgyNH0sbj1JbigxOCxudWxsLG51bGwsMCksbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLGUuY2hpbGQ9bix4bj1lLGtuPW51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGNwKGUpe3JldHVybihlLm1vZGUmMSkhPT0wJiYoZS5mbGFncyYxMjgpPT09MH1mdW5jdGlvbiB1cChlKXtpZihldCl7dmFyIHQ9a247aWYodCl7dmFyIG49dDtpZighdXkoZSx0KSl7aWYoY3AoZSkpdGhyb3cgRXJyb3Ioeig0MTgpKTt0PXZyKG4ubmV4dFNpYmxpbmcpO3ZhciBvPXhuO3QmJnV5KGUsdCk/THYobyxuKTooZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsZXQ9ITEseG49ZSl9fWVsc2V7aWYoY3AoZSkpdGhyb3cgRXJyb3Ioeig0MTgpKTtlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixldD0hMSx4bj1lfX19ZnVuY3Rpb24gcHkoZSl7Zm9yKGU9ZS5yZXR1cm47ZSE9PW51bGwmJmUudGFnIT09NSYmZS50YWchPT0zJiZlLnRhZyE9PTEzOyllPWUucmV0dXJuO3huPWV9ZnVuY3Rpb24gTGwoZSl7aWYoZSE9PXhuKXJldHVybiExO2lmKCFldClyZXR1cm4gcHkoZSksZXQ9ITAsITE7dmFyIHQ7aWYoKHQ9ZS50YWchPT0zKSYmISh0PWUudGFnIT09NSkmJih0PWUudHlwZSx0PXQhPT0iaGVhZCImJnQhPT0iYm9keSImJiFpcChlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9a24pKXtpZihjcChlKSl0aHJvdyBfdigpLEVycm9yKHooNDE4KSk7Zm9yKDt0OylMdihlLHQpLHQ9dnIodC5uZXh0U2libGluZyl9aWYocHkoZSksZS50YWc9PT0xMyl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcih6KDMxNykpO2U6e2ZvcihlPWUubmV4dFNpYmxpbmcsdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iLyQiKXtpZih0PT09MCl7a249dnIoZS5uZXh0U2libGluZyk7YnJlYWsgZX10LS19ZWxzZSBuIT09IiQiJiZuIT09IiQhIiYmbiE9PSIkPyJ8fHQrK31lPWUubmV4dFNpYmxpbmd9a249bnVsbH19ZWxzZSBrbj14bj92cihlLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBfdigpe2Zvcih2YXIgZT1rbjtlOyllPXZyKGUubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIGphKCl7a249eG49bnVsbCxldD0hMX1mdW5jdGlvbiBZcChlKXt0bz09PW51bGw/dG89W2VdOnRvLnB1c2goZSl9dmFyIFFOPUdvLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIExpKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoeigzMDkpKTt2YXIgbz1uLnN0YXRlTm9kZX1pZighbyl0aHJvdyBFcnJvcih6KDE0NyxlKSk7dmFyIHI9byxhPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PWE/dC5yZWY6KHQ9ZnVuY3Rpb24oaSl7dmFyIHM9ci5yZWZzO2k9PT1udWxsP2RlbGV0ZSBzW2FdOnNbYV09aX0sdC5fc3RyaW5nUmVmPWEsdCl9aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IEVycm9yKHooMjg0KSk7aWYoIW4uX293bmVyKXRocm93IEVycm9yKHooMjkwLGUpKX1yZXR1cm4gZX1mdW5jdGlvbiBfbChlLHQpe3Rocm93IGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLEVycm9yKHooMzEsZT09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQpLmpvaW4oIiwgIikrIn0iOmUpKX1mdW5jdGlvbiBmeShlKXt2YXIgdD1lLl9pbml0O3JldHVybiB0KGUuX3BheWxvYWQpfWZ1bmN0aW9uIFV2KGUpe2Z1bmN0aW9uIHQodix5KXtpZihlKXt2YXIgYj12LmRlbGV0aW9ucztiPT09bnVsbD8odi5kZWxldGlvbnM9W3ldLHYuZmxhZ3N8PTE2KTpiLnB1c2goeSl9fWZ1bmN0aW9uIG4odix5KXtpZighZSlyZXR1cm4gbnVsbDtmb3IoO3khPT1udWxsOyl0KHYseSkseT15LnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbyh2LHkpe2Zvcih2PW5ldyBNYXA7eSE9PW51bGw7KXkua2V5IT09bnVsbD92LnNldCh5LmtleSx5KTp2LnNldCh5LmluZGV4LHkpLHk9eS5zaWJsaW5nO3JldHVybiB2fWZ1bmN0aW9uIHIodix5KXtyZXR1cm4gdj14cih2LHkpLHYuaW5kZXg9MCx2LnNpYmxpbmc9bnVsbCx2fWZ1bmN0aW9uIGEodix5LGIpe3JldHVybiB2LmluZGV4PWIsZT8oYj12LmFsdGVybmF0ZSxiIT09bnVsbD8oYj1iLmluZGV4LGI8eT8odi5mbGFnc3w9Mix5KTpiKToodi5mbGFnc3w9Mix5KSk6KHYuZmxhZ3N8PTEwNDg1NzYseSl9ZnVuY3Rpb24gaSh2KXtyZXR1cm4gZSYmdi5hbHRlcm5hdGU9PT1udWxsJiYodi5mbGFnc3w9Miksdn1mdW5jdGlvbiBzKHYseSxiLGgpe3JldHVybiB5PT09bnVsbHx8eS50YWchPT02Pyh5PUx1KGIsdi5tb2RlLGgpLHkucmV0dXJuPXYseSk6KHk9cih5LGIpLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gbCh2LHksYixoKXt2YXIgUz1iLnR5cGU7cmV0dXJuIFM9PT1EYT9jKHYseSxiLnByb3BzLmNoaWxkcmVuLGgsYi5rZXkpOnkhPT1udWxsJiYoeS5lbGVtZW50VHlwZT09PVN8fHR5cGVvZiBTPT0ib2JqZWN0IiYmUyE9PW51bGwmJlMuJCR0eXBlb2Y9PT1kciYmZnkoUyk9PT15LnR5cGUpPyhoPXIoeSxiLnByb3BzKSxoLnJlZj1MaSh2LHksYiksaC5yZXR1cm49dixoKTooaD0kbChiLnR5cGUsYi5rZXksYi5wcm9wcyxudWxsLHYubW9kZSxoKSxoLnJlZj1MaSh2LHksYiksaC5yZXR1cm49dixoKX1mdW5jdGlvbiBkKHYseSxiLGgpe3JldHVybiB5PT09bnVsbHx8eS50YWchPT00fHx5LnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09Yi5jb250YWluZXJJbmZvfHx5LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PWIuaW1wbGVtZW50YXRpb24/KHk9X3UoYix2Lm1vZGUsaCkseS5yZXR1cm49dix5KTooeT1yKHksYi5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gYyh2LHksYixoLFMpe3JldHVybiB5PT09bnVsbHx8eS50YWchPT03Pyh5PVZyKGIsdi5tb2RlLGgsUykseS5yZXR1cm49dix5KTooeT1yKHksYikseS5yZXR1cm49dix5KX1mdW5jdGlvbiB1KHYseSxiKXtpZih0eXBlb2YgeT09InN0cmluZyImJnkhPT0iInx8dHlwZW9mIHk9PSJudW1iZXIiKXJldHVybiB5PUx1KCIiK3ksdi5tb2RlLGIpLHkucmV0dXJuPXYseTtpZih0eXBlb2YgeT09Im9iamVjdCImJnkhPT1udWxsKXtzd2l0Y2goeS4kJHR5cGVvZil7Y2FzZSBrbDpyZXR1cm4gYj0kbCh5LnR5cGUseS5rZXkseS5wcm9wcyxudWxsLHYubW9kZSxiKSxiLnJlZj1MaSh2LG51bGwseSksYi5yZXR1cm49dixiO2Nhc2UgVGE6cmV0dXJuIHk9X3UoeSx2Lm1vZGUsYikseS5yZXR1cm49dix5O2Nhc2UgZHI6dmFyIGg9eS5faW5pdDtyZXR1cm4gdSh2LGgoeS5fcGF5bG9hZCksYil9aWYoV2koeSl8fE9pKHkpKXJldHVybiB5PVZyKHksdi5tb2RlLGIsbnVsbCkseS5yZXR1cm49dix5O19sKHYseSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcCh2LHksYixoKXt2YXIgUz15IT09bnVsbD95LmtleTpudWxsO2lmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSIifHx0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIFMhPT1udWxsP251bGw6cyh2LHksIiIrYixoKTtpZih0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsKXtzd2l0Y2goYi4kJHR5cGVvZil7Y2FzZSBrbDpyZXR1cm4gYi5rZXk9PT1TP2wodix5LGIsaCk6bnVsbDtjYXNlIFRhOnJldHVybiBiLmtleT09PVM/ZCh2LHksYixoKTpudWxsO2Nhc2UgZHI6cmV0dXJuIFM9Yi5faW5pdCxwKHYseSxTKGIuX3BheWxvYWQpLGgpfWlmKFdpKGIpfHxPaShiKSlyZXR1cm4gUyE9PW51bGw/bnVsbDpjKHYseSxiLGgsbnVsbCk7X2wodixiKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmKHYseSxiLGgsUyl7aWYodHlwZW9mIGg9PSJzdHJpbmciJiZoIT09IiJ8fHR5cGVvZiBoPT0ibnVtYmVyIilyZXR1cm4gdj12LmdldChiKXx8bnVsbCxzKHksdiwiIitoLFMpO2lmKHR5cGVvZiBoPT0ib2JqZWN0IiYmaCE9PW51bGwpe3N3aXRjaChoLiQkdHlwZW9mKXtjYXNlIGtsOnJldHVybiB2PXYuZ2V0KGgua2V5PT09bnVsbD9iOmgua2V5KXx8bnVsbCxsKHksdixoLFMpO2Nhc2UgVGE6cmV0dXJuIHY9di5nZXQoaC5rZXk9PT1udWxsP2I6aC5rZXkpfHxudWxsLGQoeSx2LGgsUyk7Y2FzZSBkcjp2YXIgeD1oLl9pbml0O3JldHVybiBmKHYseSxiLHgoaC5fcGF5bG9hZCksUyl9aWYoV2koaCl8fE9pKGgpKXJldHVybiB2PXYuZ2V0KGIpfHxudWxsLGMoeSx2LGgsUyxudWxsKTtfbCh5LGgpfXJldHVybiBudWxsfWZ1bmN0aW9uIG0odix5LGIsaCl7Zm9yKHZhciBTPW51bGwseD1udWxsLEU9eSxUPXk9MCxBPW51bGw7RSE9PW51bGwmJlQ8Yi5sZW5ndGg7VCsrKXtFLmluZGV4PlQ/KEE9RSxFPW51bGwpOkE9RS5zaWJsaW5nO3ZhciBDPXAodixFLGJbVF0saCk7aWYoQz09PW51bGwpe0U9PT1udWxsJiYoRT1BKTticmVha31lJiZFJiZDLmFsdGVybmF0ZT09PW51bGwmJnQodixFKSx5PWEoQyx5LFQpLHg9PT1udWxsP1M9Qzp4LnNpYmxpbmc9Qyx4PUMsRT1BfWlmKFQ9PT1iLmxlbmd0aClyZXR1cm4gbih2LEUpLGV0JiZ6cih2LFQpLFM7aWYoRT09PW51bGwpe2Zvcig7VDxiLmxlbmd0aDtUKyspRT11KHYsYltUXSxoKSxFIT09bnVsbCYmKHk9YShFLHksVCkseD09PW51bGw/Uz1FOnguc2libGluZz1FLHg9RSk7cmV0dXJuIGV0JiZ6cih2LFQpLFN9Zm9yKEU9byh2LEUpO1Q8Yi5sZW5ndGg7VCsrKUE9ZihFLHYsVCxiW1RdLGgpLEEhPT1udWxsJiYoZSYmQS5hbHRlcm5hdGUhPT1udWxsJiZFLmRlbGV0ZShBLmtleT09PW51bGw/VDpBLmtleSkseT1hKEEseSxUKSx4PT09bnVsbD9TPUE6eC5zaWJsaW5nPUEseD1BKTtyZXR1cm4gZSYmRS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3JldHVybiB0KHYsTyl9KSxldCYmenIodixUKSxTfWZ1bmN0aW9uIGcodix5LGIsaCl7dmFyIFM9T2koYik7aWYodHlwZW9mIFMhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoeigxNTApKTtpZihiPVMuY2FsbChiKSxiPT1udWxsKXRocm93IEVycm9yKHooMTUxKSk7Zm9yKHZhciB4PVM9bnVsbCxFPXksVD15PTAsQT1udWxsLEM9Yi5uZXh0KCk7RSE9PW51bGwmJiFDLmRvbmU7VCsrLEM9Yi5uZXh0KCkpe0UuaW5kZXg+VD8oQT1FLEU9bnVsbCk6QT1FLnNpYmxpbmc7dmFyIE89cCh2LEUsQy52YWx1ZSxoKTtpZihPPT09bnVsbCl7RT09PW51bGwmJihFPUEpO2JyZWFrfWUmJkUmJk8uYWx0ZXJuYXRlPT09bnVsbCYmdCh2LEUpLHk9YShPLHksVCkseD09PW51bGw/Uz1POnguc2libGluZz1PLHg9TyxFPUF9aWYoQy5kb25lKXJldHVybiBuKHYsRSksZXQmJnpyKHYsVCksUztpZihFPT09bnVsbCl7Zm9yKDshQy5kb25lO1QrKyxDPWIubmV4dCgpKUM9dSh2LEMudmFsdWUsaCksQyE9PW51bGwmJih5PWEoQyx5LFQpLHg9PT1udWxsP1M9Qzp4LnNpYmxpbmc9Qyx4PUMpO3JldHVybiBldCYmenIodixUKSxTfWZvcihFPW8odixFKTshQy5kb25lO1QrKyxDPWIubmV4dCgpKUM9ZihFLHYsVCxDLnZhbHVlLGgpLEMhPT1udWxsJiYoZSYmQy5hbHRlcm5hdGUhPT1udWxsJiZFLmRlbGV0ZShDLmtleT09PW51bGw/VDpDLmtleSkseT1hKEMseSxUKSx4PT09bnVsbD9TPUM6eC5zaWJsaW5nPUMseD1DKTtyZXR1cm4gZSYmRS5mb3JFYWNoKGZ1bmN0aW9uKFApe3JldHVybiB0KHYsUCl9KSxldCYmenIodixUKSxTfWZ1bmN0aW9uIHcodix5LGIsaCl7aWYodHlwZW9mIGI9PSJvYmplY3QiJiZiIT09bnVsbCYmYi50eXBlPT09RGEmJmIua2V5PT09bnVsbCYmKGI9Yi5wcm9wcy5jaGlsZHJlbiksdHlwZW9mIGI9PSJvYmplY3QiJiZiIT09bnVsbCl7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2Uga2w6ZTp7Zm9yKHZhciBTPWIua2V5LHg9eTt4IT09bnVsbDspe2lmKHgua2V5PT09Uyl7aWYoUz1iLnR5cGUsUz09PURhKXtpZih4LnRhZz09PTcpe24odix4LnNpYmxpbmcpLHk9cih4LGIucHJvcHMuY2hpbGRyZW4pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9fWVsc2UgaWYoeC5lbGVtZW50VHlwZT09PVN8fHR5cGVvZiBTPT0ib2JqZWN0IiYmUyE9PW51bGwmJlMuJCR0eXBlb2Y9PT1kciYmZnkoUyk9PT14LnR5cGUpe24odix4LnNpYmxpbmcpLHk9cih4LGIucHJvcHMpLHkucmVmPUxpKHYseCxiKSx5LnJldHVybj12LHY9eTticmVhayBlfW4odix4KTticmVha31lbHNlIHQodix4KTt4PXguc2libGluZ31iLnR5cGU9PT1EYT8oeT1WcihiLnByb3BzLmNoaWxkcmVuLHYubW9kZSxoLGIua2V5KSx5LnJldHVybj12LHY9eSk6KGg9JGwoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCx2Lm1vZGUsaCksaC5yZWY9TGkodix5LGIpLGgucmV0dXJuPXYsdj1oKX1yZXR1cm4gaSh2KTtjYXNlIFRhOmU6e2Zvcih4PWIua2V5O3khPT1udWxsOyl7aWYoeS5rZXk9PT14KWlmKHkudGFnPT09NCYmeS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PWIuY29udGFpbmVySW5mbyYmeS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1iLmltcGxlbWVudGF0aW9uKXtuKHYseS5zaWJsaW5nKSx5PXIoeSxiLmNoaWxkcmVufHxbXSkseS5yZXR1cm49dix2PXk7YnJlYWsgZX1lbHNle24odix5KTticmVha31lbHNlIHQodix5KTt5PXkuc2libGluZ315PV91KGIsdi5tb2RlLGgpLHkucmV0dXJuPXYsdj15fXJldHVybiBpKHYpO2Nhc2UgZHI6cmV0dXJuIHg9Yi5faW5pdCx3KHYseSx4KGIuX3BheWxvYWQpLGgpfWlmKFdpKGIpKXJldHVybiBtKHYseSxiLGgpO2lmKE9pKGIpKXJldHVybiBnKHYseSxiLGgpO19sKHYsYil9cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSIifHx0eXBlb2YgYj09Im51bWJlciI/KGI9IiIrYix5IT09bnVsbCYmeS50YWc9PT02PyhuKHYseS5zaWJsaW5nKSx5PXIoeSxiKSx5LnJldHVybj12LHY9eSk6KG4odix5KSx5PUx1KGIsdi5tb2RlLGgpLHkucmV0dXJuPXYsdj15KSxpKHYpKTpuKHYseSl9cmV0dXJuIHd9dmFyIFlhPVV2KCEwKSxGdj1VdighMSksZGQ9VHIobnVsbCksY2Q9bnVsbCxMYT1udWxsLHFwPW51bGw7ZnVuY3Rpb24gJHAoKXtxcD1MYT1jZD1udWxsfWZ1bmN0aW9uIFhwKGUpe3ZhciB0PWRkLmN1cnJlbnQ7WGUoZGQpLGUuX2N1cnJlbnRWYWx1ZT10fWZ1bmN0aW9uIHBwKGUsdCxuKXtmb3IoO2UhPT1udWxsOyl7dmFyIG89ZS5hbHRlcm5hdGU7aWYoKGUuY2hpbGRMYW5lcyZ0KSE9PXQ/KGUuY2hpbGRMYW5lc3w9dCxvIT09bnVsbCYmKG8uY2hpbGRMYW5lc3w9dCkpOm8hPT1udWxsJiYoby5jaGlsZExhbmVzJnQpIT09dCYmKG8uY2hpbGRMYW5lc3w9dCksZT09PW4pYnJlYWs7ZT1lLnJldHVybn19ZnVuY3Rpb24gSGEoZSx0KXtjZD1lLHFwPUxhPW51bGwsZT1lLmRlcGVuZGVuY2llcyxlIT09bnVsbCYmZS5maXJzdENvbnRleHQhPT1udWxsJiYoZS5sYW5lcyZ0JiYoY249ITApLGUuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIFBuKGUpe3ZhciB0PWUuX2N1cnJlbnRWYWx1ZTtpZihxcCE9PWUpaWYoZT17Y29udGV4dDplLG1lbW9pemVkVmFsdWU6dCxuZXh0Om51bGx9LExhPT09bnVsbCl7aWYoY2Q9PT1udWxsKXRocm93IEVycm9yKHooMzA4KSk7TGE9ZSxjZC5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmV9fWVsc2UgTGE9TGEubmV4dD1lO3JldHVybiB0fXZhciBIcj1udWxsO2Z1bmN0aW9uIEpwKGUpe0hyPT09bnVsbD9Icj1bZV06SHIucHVzaChlKX1mdW5jdGlvbiB6dihlLHQsbixvKXt2YXIgcj10LmludGVybGVhdmVkO3JldHVybiByPT09bnVsbD8obi5uZXh0PW4sSnAodCkpOihuLm5leHQ9ci5uZXh0LHIubmV4dD1uKSx0LmludGVybGVhdmVkPW4sSG8oZSxvKX1mdW5jdGlvbiBIbyhlLHQpe2UubGFuZXN8PXQ7dmFyIG49ZS5hbHRlcm5hdGU7Zm9yKG4hPT1udWxsJiYobi5sYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47ZSE9PW51bGw7KWUuY2hpbGRMYW5lc3w9dCxuPWUuYWx0ZXJuYXRlLG4hPT1udWxsJiYobi5jaGlsZExhbmVzfD10KSxuPWUsZT1lLnJldHVybjtyZXR1cm4gbi50YWc9PT0zP24uc3RhdGVOb2RlOm51bGx9dmFyIGNyPSExO2Z1bmN0aW9uIFFwKGUpe2UudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19ZnVuY3Rpb24gV3YoZSx0KXtlPWUudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT09PWUmJih0LnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmUubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmUuc2hhcmVkLGVmZmVjdHM6ZS5lZmZlY3RzfSl9ZnVuY3Rpb24gem8oZSx0KXtyZXR1cm57ZXZlbnRUaW1lOmUsbGFuZTp0LHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gYnIoZSx0LG4pe3ZhciBvPWUudXBkYXRlUXVldWU7aWYobz09PW51bGwpcmV0dXJuIG51bGw7aWYobz1vLnNoYXJlZCxPZSYyKXt2YXIgcj1vLnBlbmRpbmc7cmV0dXJuIHI9PT1udWxsP3QubmV4dD10Oih0Lm5leHQ9ci5uZXh0LHIubmV4dD10KSxvLnBlbmRpbmc9dCxIbyhlLG4pfXJldHVybiByPW8uaW50ZXJsZWF2ZWQscj09PW51bGw/KHQubmV4dD10LEpwKG8pKToodC5uZXh0PXIubmV4dCxyLm5leHQ9dCksby5pbnRlcmxlYXZlZD10LEhvKGUsbil9ZnVuY3Rpb24gS2woZSx0LG4pe2lmKHQ9dC51cGRhdGVRdWV1ZSx0IT09bnVsbCYmKHQ9dC5zaGFyZWQsKG4mNDE5NDI0MCkhPT0wKSl7dmFyIG89dC5sYW5lcztvJj1lLnBlbmRpbmdMYW5lcyxufD1vLHQubGFuZXM9bixVcChlLG4pfX1mdW5jdGlvbiBteShlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUsbz1lLmFsdGVybmF0ZTtpZihvIT09bnVsbCYmKG89by51cGRhdGVRdWV1ZSxuPT09bykpe3ZhciByPW51bGwsYT1udWxsO2lmKG49bi5maXJzdEJhc2VVcGRhdGUsbiE9PW51bGwpe2Rve3ZhciBpPXtldmVudFRpbWU6bi5ldmVudFRpbWUsbGFuZTpuLmxhbmUsdGFnOm4udGFnLHBheWxvYWQ6bi5wYXlsb2FkLGNhbGxiYWNrOm4uY2FsbGJhY2ssbmV4dDpudWxsfTthPT09bnVsbD9yPWE9aTphPWEubmV4dD1pLG49bi5uZXh0fXdoaWxlKG4hPT1udWxsKTthPT09bnVsbD9yPWE9dDphPWEubmV4dD10fWVsc2Ugcj1hPXQ7bj17YmFzZVN0YXRlOm8uYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpyLGxhc3RCYXNlVXBkYXRlOmEsc2hhcmVkOm8uc2hhcmVkLGVmZmVjdHM6by5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufWU9bi5sYXN0QmFzZVVwZGF0ZSxlPT09bnVsbD9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiB1ZChlLHQsbixvKXt2YXIgcj1lLnVwZGF0ZVF1ZXVlO2NyPSExO3ZhciBhPXIuZmlyc3RCYXNlVXBkYXRlLGk9ci5sYXN0QmFzZVVwZGF0ZSxzPXIuc2hhcmVkLnBlbmRpbmc7aWYocyE9PW51bGwpe3Iuc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgbD1zLGQ9bC5uZXh0O2wubmV4dD1udWxsLGk9PT1udWxsP2E9ZDppLm5leHQ9ZCxpPWw7dmFyIGM9ZS5hbHRlcm5hdGU7YyE9PW51bGwmJihjPWMudXBkYXRlUXVldWUscz1jLmxhc3RCYXNlVXBkYXRlLHMhPT1pJiYocz09PW51bGw/Yy5maXJzdEJhc2VVcGRhdGU9ZDpzLm5leHQ9ZCxjLmxhc3RCYXNlVXBkYXRlPWwpKX1pZihhIT09bnVsbCl7dmFyIHU9ci5iYXNlU3RhdGU7aT0wLGM9ZD1sPW51bGwscz1hO2Rve3ZhciBwPXMubGFuZSxmPXMuZXZlbnRUaW1lO2lmKChvJnApPT09cCl7YyE9PW51bGwmJihjPWMubmV4dD17ZXZlbnRUaW1lOmYsbGFuZTowLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0pO2U6e3ZhciBtPWUsZz1zO3N3aXRjaChwPXQsZj1uLGcudGFnKXtjYXNlIDE6aWYobT1nLnBheWxvYWQsdHlwZW9mIG09PSJmdW5jdGlvbiIpe3U9bS5jYWxsKGYsdSxwKTticmVhayBlfXU9bTticmVhayBlO2Nhc2UgMzptLmZsYWdzPW0uZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYobT1nLnBheWxvYWQscD10eXBlb2YgbT09ImZ1bmN0aW9uIj9tLmNhbGwoZix1LHApOm0scD09bnVsbClicmVhayBlO3U9c3Qoe30sdSxwKTticmVhayBlO2Nhc2UgMjpjcj0hMH19cy5jYWxsYmFjayE9PW51bGwmJnMubGFuZSE9PTAmJihlLmZsYWdzfD02NCxwPXIuZWZmZWN0cyxwPT09bnVsbD9yLmVmZmVjdHM9W3NdOnAucHVzaChzKSl9ZWxzZSBmPXtldmVudFRpbWU6ZixsYW5lOnAsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSxjPT09bnVsbD8oZD1jPWYsbD11KTpjPWMubmV4dD1mLGl8PXA7aWYocz1zLm5leHQscz09PW51bGwpe2lmKHM9ci5zaGFyZWQucGVuZGluZyxzPT09bnVsbClicmVhaztwPXMscz1wLm5leHQscC5uZXh0PW51bGwsci5sYXN0QmFzZVVwZGF0ZT1wLHIuc2hhcmVkLnBlbmRpbmc9bnVsbH19d2hpbGUoITApO2lmKGM9PT1udWxsJiYobD11KSxyLmJhc2VTdGF0ZT1sLHIuZmlyc3RCYXNlVXBkYXRlPWQsci5sYXN0QmFzZVVwZGF0ZT1jLHQ9ci5zaGFyZWQuaW50ZXJsZWF2ZWQsdCE9PW51bGwpe3I9dDtkbyBpfD1yLmxhbmUscj1yLm5leHQ7d2hpbGUociE9PXQpfWVsc2UgYT09PW51bGwmJihyLnNoYXJlZC5sYW5lcz0wKTskcnw9aSxlLmxhbmVzPWksZS5tZW1vaXplZFN0YXRlPXV9fWZ1bmN0aW9uIGh5KGUsdCxuKXtpZihlPXQuZWZmZWN0cyx0LmVmZmVjdHM9bnVsbCxlIT09bnVsbClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbz1lW3RdLHI9by5jYWxsYmFjaztpZihyIT09bnVsbCl7aWYoby5jYWxsYmFjaz1udWxsLG89bix0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcih6KDE5MSxyKSk7ci5jYWxsKG8pfX19dmFyIHZzPXt9LFNvPVRyKHZzKSxkcz1Ucih2cyksY3M9VHIodnMpO2Z1bmN0aW9uIEtyKGUpe2lmKGU9PT12cyl0aHJvdyBFcnJvcih6KDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIFpwKGUsdCl7c3dpdGNoKGplKGNzLHQpLGplKGRzLGUpLGplKFNvLHZzKSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6anUobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1qdSh0LGUpfVhlKFNvKSxqZShTbyx0KX1mdW5jdGlvbiBxYSgpe1hlKFNvKSxYZShkcyksWGUoY3MpfWZ1bmN0aW9uIEJ2KGUpe0tyKGNzLmN1cnJlbnQpO3ZhciB0PUtyKFNvLmN1cnJlbnQpLG49anUodCxlLnR5cGUpO3QhPT1uJiYoamUoZHMsZSksamUoU28sbikpfWZ1bmN0aW9uIGVmKGUpe2RzLmN1cnJlbnQ9PT1lJiYoWGUoU28pLFhlKGRzKSl9dmFyIGF0PVRyKDApO2Z1bmN0aW9uIHBkKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIEN1PVtdO2Z1bmN0aW9uIHRmKCl7Zm9yKHZhciBlPTA7ZTxDdS5sZW5ndGg7ZSsrKUN1W2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7Q3UubGVuZ3RoPTB9dmFyIEdsPUdvLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTXU9R28uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcscXI9MCxpdD1udWxsLHh0PW51bGwsQXQ9bnVsbCxmZD0hMSxxaT0hMSx1cz0wLFpOPTA7ZnVuY3Rpb24gVnQoKXt0aHJvdyBFcnJvcih6KDMyMSkpfWZ1bmN0aW9uIG5mKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIXJvKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb2YoZSx0LG4sbyxyLGEpe2lmKHFyPWEsaXQ9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLEdsLmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/b1Q6clQsZT1uKG8scikscWkpe2E9MDtkb3tpZihxaT0hMSx1cz0wLDI1PD1hKXRocm93IEVycm9yKHooMzAxKSk7YSs9MSxBdD14dD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxHbC5jdXJyZW50PWFULGU9bihvLHIpfXdoaWxlKHFpKX1pZihHbC5jdXJyZW50PW1kLHQ9eHQhPT1udWxsJiZ4dC5uZXh0IT09bnVsbCxxcj0wLEF0PXh0PWl0PW51bGwsZmQ9ITEsdCl0aHJvdyBFcnJvcih6KDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIHJmKCl7dmFyIGU9dXMhPT0wO3JldHVybiB1cz0wLGV9ZnVuY3Rpb24gd28oKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gQXQ9PT1udWxsP2l0Lm1lbW9pemVkU3RhdGU9QXQ9ZTpBdD1BdC5uZXh0PWUsQXR9ZnVuY3Rpb24gTG4oKXtpZih4dD09PW51bGwpe3ZhciBlPWl0LmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT14dC5uZXh0O3ZhciB0PUF0PT09bnVsbD9pdC5tZW1vaXplZFN0YXRlOkF0Lm5leHQ7aWYodCE9PW51bGwpQXQ9dCx4dD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoeigzMTApKTt4dD1lLGU9e21lbW9pemVkU3RhdGU6eHQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6eHQuYmFzZVN0YXRlLGJhc2VRdWV1ZTp4dC5iYXNlUXVldWUscXVldWU6eHQucXVldWUsbmV4dDpudWxsfSxBdD09PW51bGw/aXQubWVtb2l6ZWRTdGF0ZT1BdD1lOkF0PUF0Lm5leHQ9ZX1yZXR1cm4gQXR9ZnVuY3Rpb24gcHMoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIE91KGUpe3ZhciB0PUxuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKHooMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIG89eHQscj1vLmJhc2VRdWV1ZSxhPW4ucGVuZGluZztpZihhIT09bnVsbCl7aWYociE9PW51bGwpe3ZhciBpPXIubmV4dDtyLm5leHQ9YS5uZXh0LGEubmV4dD1pfW8uYmFzZVF1ZXVlPXI9YSxuLnBlbmRpbmc9bnVsbH1pZihyIT09bnVsbCl7YT1yLm5leHQsbz1vLmJhc2VTdGF0ZTt2YXIgcz1pPW51bGwsbD1udWxsLGQ9YTtkb3t2YXIgYz1kLmxhbmU7aWYoKHFyJmMpPT09YylsIT09bnVsbCYmKGw9bC5uZXh0PXtsYW5lOjAsYWN0aW9uOmQuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6ZC5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6ZC5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLG89ZC5oYXNFYWdlclN0YXRlP2QuZWFnZXJTdGF0ZTplKG8sZC5hY3Rpb24pO2Vsc2V7dmFyIHU9e2xhbmU6YyxhY3Rpb246ZC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpkLmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTpkLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtsPT09bnVsbD8ocz1sPXUsaT1vKTpsPWwubmV4dD11LGl0LmxhbmVzfD1jLCRyfD1jfWQ9ZC5uZXh0fXdoaWxlKGQhPT1udWxsJiZkIT09YSk7bD09PW51bGw/aT1vOmwubmV4dD1zLHJvKG8sdC5tZW1vaXplZFN0YXRlKXx8KGNuPSEwKSx0Lm1lbW9pemVkU3RhdGU9byx0LmJhc2VTdGF0ZT1pLHQuYmFzZVF1ZXVlPWwsbi5sYXN0UmVuZGVyZWRTdGF0ZT1vfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7cj1lO2RvIGE9ci5sYW5lLGl0LmxhbmVzfD1hLCRyfD1hLHI9ci5uZXh0O3doaWxlKHIhPT1lKX1lbHNlIHI9PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIEl1KGUpe3ZhciB0PUxuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKHooMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIG89bi5kaXNwYXRjaCxyPW4ucGVuZGluZyxhPXQubWVtb2l6ZWRTdGF0ZTtpZihyIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGk9cj1yLm5leHQ7ZG8gYT1lKGEsaS5hY3Rpb24pLGk9aS5uZXh0O3doaWxlKGkhPT1yKTtybyhhLHQubWVtb2l6ZWRTdGF0ZSl8fChjbj0hMCksdC5tZW1vaXplZFN0YXRlPWEsdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9YSksbi5sYXN0UmVuZGVyZWRTdGF0ZT1hfXJldHVyblthLG9dfWZ1bmN0aW9uIEh2KCl7fWZ1bmN0aW9uIEt2KGUsdCl7dmFyIG49aXQsbz1MbigpLHI9dCgpLGE9IXJvKG8ubWVtb2l6ZWRTdGF0ZSxyKTtpZihhJiYoby5tZW1vaXplZFN0YXRlPXIsY249ITApLG89by5xdWV1ZSxhZihqdi5iaW5kKG51bGwsbixvLGUpLFtlXSksby5nZXRTbmFwc2hvdCE9PXR8fGF8fEF0IT09bnVsbCYmQXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxmcyg5LFZ2LmJpbmQobnVsbCxuLG8scix0KSx2b2lkIDAsbnVsbCksQ3Q9PT1udWxsKXRocm93IEVycm9yKHooMzQ5KSk7cXImMzB8fEd2KG4sdCxyKX1yZXR1cm4gcn1mdW5jdGlvbiBHdihlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PWl0LnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGl0LnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBWdihlLHQsbixvKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1vLFl2KHQpJiZxdihlKX1mdW5jdGlvbiBqdihlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtZdih0KSYmcXYoZSl9KX1mdW5jdGlvbiBZdihlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFybyhlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBxdihlKXt2YXIgdD1IbyhlLDEpO3QhPT1udWxsJiZvbyh0LGUsMSwtMSl9ZnVuY3Rpb24gZ3koZSl7dmFyIHQ9d28oKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6cHMsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD1uVC5iaW5kKG51bGwsaXQsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBmcyhlLHQsbixvKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6byxuZXh0Om51bGx9LHQ9aXQudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0saXQudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KG89bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1vLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiAkdigpe3JldHVybiBMbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gVmwoZSx0LG4sbyl7dmFyIHI9d28oKTtpdC5mbGFnc3w9ZSxyLm1lbW9pemVkU3RhdGU9ZnMoMXx0LG4sdm9pZCAwLG89PT12b2lkIDA/bnVsbDpvKX1mdW5jdGlvbiBUZChlLHQsbixvKXt2YXIgcj1MbigpO289bz09PXZvaWQgMD9udWxsOm87dmFyIGE9dm9pZCAwO2lmKHh0IT09bnVsbCl7dmFyIGk9eHQubWVtb2l6ZWRTdGF0ZTtpZihhPWkuZGVzdHJveSxvIT09bnVsbCYmbmYobyxpLmRlcHMpKXtyLm1lbW9pemVkU3RhdGU9ZnModCxuLGEsbyk7cmV0dXJufX1pdC5mbGFnc3w9ZSxyLm1lbW9pemVkU3RhdGU9ZnMoMXx0LG4sYSxvKX1mdW5jdGlvbiB5eShlLHQpe3JldHVybiBWbCg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBhZihlLHQpe3JldHVybiBUZCgyMDQ4LDgsZSx0KX1mdW5jdGlvbiBYdihlLHQpe3JldHVybiBUZCg0LDIsZSx0KX1mdW5jdGlvbiBKdihlLHQpe3JldHVybiBUZCg0LDQsZSx0KX1mdW5jdGlvbiBRdihlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gWnYoZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLFRkKDQsNCxRdi5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBzZigpe31mdW5jdGlvbiBlYihlLHQpe3ZhciBuPUxuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgbz1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIG8hPT1udWxsJiZ0IT09bnVsbCYmbmYodCxvWzFdKT9vWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gdGIoZSx0KXt2YXIgbj1MbigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIG89bi5tZW1vaXplZFN0YXRlO3JldHVybiBvIT09bnVsbCYmdCE9PW51bGwmJm5mKHQsb1sxXSk/b1swXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIG5iKGUsdCxuKXtyZXR1cm4gcXImMjE/KHJvKG4sdCl8fChuPXN2KCksaXQubGFuZXN8PW4sJHJ8PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLGNuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gZVQoZSx0KXt2YXIgbj1XZTtXZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgbz1NdS50cmFuc2l0aW9uO011LnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1dlPW4sTXUudHJhbnNpdGlvbj1vfX1mdW5jdGlvbiBvYigpe3JldHVybiBMbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gdFQoZSx0LG4pe3ZhciBvPWtyKGUpO2lmKG49e2xhbmU6byxhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LHJiKGUpKWFiKHQsbik7ZWxzZSBpZihuPXp2KGUsdCxuLG8pLG4hPT1udWxsKXt2YXIgcj1ubigpO29vKG4sZSxvLHIpLGliKG4sdCxvKX19ZnVuY3Rpb24gblQoZSx0LG4pe3ZhciBvPWtyKGUpLHI9e2xhbmU6byxhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKHJiKGUpKWFiKHQscik7ZWxzZXt2YXIgYT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGE9PT1udWxsfHxhLmxhbmVzPT09MCkmJihhPXQubGFzdFJlbmRlcmVkUmVkdWNlcixhIT09bnVsbCkpdHJ5e3ZhciBpPXQubGFzdFJlbmRlcmVkU3RhdGUscz1hKGksbik7aWYoci5oYXNFYWdlclN0YXRlPSEwLHIuZWFnZXJTdGF0ZT1zLHJvKHMsaSkpe3ZhciBsPXQuaW50ZXJsZWF2ZWQ7bD09PW51bGw/KHIubmV4dD1yLEpwKHQpKTooci5uZXh0PWwubmV4dCxsLm5leHQ9ciksdC5pbnRlcmxlYXZlZD1yO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49enYoZSx0LHIsbyksbiE9PW51bGwmJihyPW5uKCksb28obixlLG8sciksaWIobix0LG8pKX19ZnVuY3Rpb24gcmIoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1pdHx8dCE9PW51bGwmJnQ9PT1pdH1mdW5jdGlvbiBhYihlLHQpe3FpPWZkPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gaWIoZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIG89dC5sYW5lcztvJj1lLnBlbmRpbmdMYW5lcyxufD1vLHQubGFuZXM9bixVcChlLG4pfX12YXIgbWQ9e3JlYWRDb250ZXh0OlBuLHVzZUNhbGxiYWNrOlZ0LHVzZUNvbnRleHQ6VnQsdXNlRWZmZWN0OlZ0LHVzZUltcGVyYXRpdmVIYW5kbGU6VnQsdXNlSW5zZXJ0aW9uRWZmZWN0OlZ0LHVzZUxheW91dEVmZmVjdDpWdCx1c2VNZW1vOlZ0LHVzZVJlZHVjZXI6VnQsdXNlUmVmOlZ0LHVzZVN0YXRlOlZ0LHVzZURlYnVnVmFsdWU6VnQsdXNlRGVmZXJyZWRWYWx1ZTpWdCx1c2VUcmFuc2l0aW9uOlZ0LHVzZU11dGFibGVTb3VyY2U6VnQsdXNlU3luY0V4dGVybmFsU3RvcmU6VnQsdXNlSWQ6VnQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxvVD17cmVhZENvbnRleHQ6UG4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd28oKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OlBuLHVzZUVmZmVjdDp5eSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxWbCg0MTk0MzA4LDQsUXYuYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBWbCg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZsKDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49d28oKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIG89d28oKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxvLm1lbW9pemVkU3RhdGU9by5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LG8ucXVldWU9ZSxlPWUuZGlzcGF0Y2g9dFQuYmluZChudWxsLGl0LGUpLFtvLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD13bygpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpneSx1c2VEZWJ1Z1ZhbHVlOnNmLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdvKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9Z3koITEpLHQ9ZVswXTtyZXR1cm4gZT1lVC5iaW5kKG51bGwsZVsxXSksd28oKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1pdCxyPXdvKCk7aWYoZXQpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3Ioeig0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLEN0PT09bnVsbCl0aHJvdyBFcnJvcih6KDM0OSkpO3FyJjMwfHxHdihvLHQsbil9ci5tZW1vaXplZFN0YXRlPW47dmFyIGE9e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIHIucXVldWU9YSx5eShqdi5iaW5kKG51bGwsbyxhLGUpLFtlXSksby5mbGFnc3w9MjA0OCxmcyg5LFZ2LmJpbmQobnVsbCxvLGEsbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT13bygpLHQ9Q3QuaWRlbnRpZmllclByZWZpeDtpZihldCl7dmFyIG49Rm8sbz1VbztuPShvJn4oMTw8MzItbm8obyktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj11cysrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1aTisrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sclQ9e3JlYWRDb250ZXh0OlBuLHVzZUNhbGxiYWNrOmViLHVzZUNvbnRleHQ6UG4sdXNlRWZmZWN0OmFmLHVzZUltcGVyYXRpdmVIYW5kbGU6WnYsdXNlSW5zZXJ0aW9uRWZmZWN0Olh2LHVzZUxheW91dEVmZmVjdDpKdix1c2VNZW1vOnRiLHVzZVJlZHVjZXI6T3UsdXNlUmVmOiR2LHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIE91KHBzKX0sdXNlRGVidWdWYWx1ZTpzZix1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PUxuKCk7cmV0dXJuIG5iKHQseHQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPU91KHBzKVswXSx0PUxuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpIdix1c2VTeW5jRXh0ZXJuYWxTdG9yZTpLdix1c2VJZDpvYix1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGFUPXtyZWFkQ29udGV4dDpQbix1c2VDYWxsYmFjazplYix1c2VDb250ZXh0OlBuLHVzZUVmZmVjdDphZix1c2VJbXBlcmF0aXZlSGFuZGxlOlp2LHVzZUluc2VydGlvbkVmZmVjdDpYdix1c2VMYXlvdXRFZmZlY3Q6SnYsdXNlTWVtbzp0Yix1c2VSZWR1Y2VyOkl1LHVzZVJlZjokdix1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBJdShwcyl9LHVzZURlYnVnVmFsdWU6c2YsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1MbigpO3JldHVybiB4dD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6bmIodCx4dC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9SXUocHMpWzBdLHQ9TG4oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOkh2LHVzZVN5bmNFeHRlcm5hbFN0b3JlOkt2LHVzZUlkOm9iLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gWm4oZSx0KXtpZihlJiZlLmRlZmF1bHRQcm9wcyl7dD1zdCh7fSx0KSxlPWUuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiBlKXRbbl09PT12b2lkIDAmJih0W25dPWVbbl0pO3JldHVybiB0fXJldHVybiB0fWZ1bmN0aW9uIGZwKGUsdCxuLG8pe3Q9ZS5tZW1vaXplZFN0YXRlLG49bihvLHQpLG49bj09bnVsbD90OnN0KHt9LHQsbiksZS5tZW1vaXplZFN0YXRlPW4sZS5sYW5lcz09PTAmJihlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1uKX12YXIgRGQ9e2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4oZT1lLl9yZWFjdEludGVybmFscyk/UXIoZSk9PT1lOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG89bm4oKSxyPWtyKGUpLGE9em8obyxyKTthLnBheWxvYWQ9dCxuIT1udWxsJiYoYS5jYWxsYmFjaz1uKSx0PWJyKGUsYSxyKSx0IT09bnVsbCYmKG9vKHQsZSxyLG8pLEtsKHQsZSxyKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG89bm4oKSxyPWtyKGUpLGE9em8obyxyKTthLnRhZz0xLGEucGF5bG9hZD10LG4hPW51bGwmJihhLmNhbGxiYWNrPW4pLHQ9YnIoZSxhLHIpLHQhPT1udWxsJiYob28odCxlLHIsbyksS2wodCxlLHIpKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgbj1ubigpLG89a3IoZSkscj16byhuLG8pO3IudGFnPTIsdCE9bnVsbCYmKHIuY2FsbGJhY2s9dCksdD1icihlLHIsbyksdCE9PW51bGwmJihvbyh0LGUsbyxuKSxLbCh0LGUsbykpfX07ZnVuY3Rpb24gdnkoZSx0LG4sbyxyLGEsaSl7cmV0dXJuIGU9ZS5zdGF0ZU5vZGUsdHlwZW9mIGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPT0iZnVuY3Rpb24iP2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG8sYSxpKTp0LnByb3RvdHlwZSYmdC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IWFzKG4sbyl8fCFhcyhyLGEpOiEwfWZ1bmN0aW9uIHNiKGUsdCxuKXt2YXIgbz0hMSxyPUVyLGE9dC5jb250ZXh0VHlwZTtyZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9hPVBuKGEpOihyPXBuKHQpP2pyOnF0LmN1cnJlbnQsbz10LmNvbnRleHRUeXBlcyxhPShvPW8hPW51bGwpP1ZhKGUscik6RXIpLHQ9bmV3IHQobixhKSxlLm1lbW9pemVkU3RhdGU9dC5zdGF0ZSE9PW51bGwmJnQuc3RhdGUhPT12b2lkIDA/dC5zdGF0ZTpudWxsLHQudXBkYXRlcj1EZCxlLnN0YXRlTm9kZT10LHQuX3JlYWN0SW50ZXJuYWxzPWUsbyYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXIsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1hKSx0fWZ1bmN0aW9uIGJ5KGUsdCxuLG8pe2U9dC5zdGF0ZSx0eXBlb2YgdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixvKSx0eXBlb2YgdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLG8pLHQuc3RhdGUhPT1lJiZEZC5lbnF1ZXVlUmVwbGFjZVN0YXRlKHQsdC5zdGF0ZSxudWxsKX1mdW5jdGlvbiBtcChlLHQsbixvKXt2YXIgcj1lLnN0YXRlTm9kZTtyLnByb3BzPW4sci5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsci5yZWZzPXt9LFFwKGUpO3ZhciBhPXQuY29udGV4dFR5cGU7dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9yLmNvbnRleHQ9UG4oYSk6KGE9cG4odCk/anI6cXQuY3VycmVudCxyLmNvbnRleHQ9VmEoZSxhKSksci5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsYT10LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyx0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKGZwKGUsdCxhLG4pLHIuc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PSJmdW5jdGlvbiJ8fHR5cGVvZiByLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2Ygci5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0PXIuc3RhdGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZyLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiByLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJnIuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLHQhPT1yLnN0YXRlJiZEZC5lbnF1ZXVlUmVwbGFjZVN0YXRlKHIsci5zdGF0ZSxudWxsKSx1ZChlLG4scixvKSxyLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIHIuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJihlLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiAkYShlLHQpe3RyeXt2YXIgbj0iIixvPXQ7ZG8gbis9TEUobyksbz1vLnJldHVybjt3aGlsZShvKTt2YXIgcj1ufWNhdGNoKGEpe3I9YApFcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBgK2EubWVzc2FnZStgCmArYS5zdGFja31yZXR1cm57dmFsdWU6ZSxzb3VyY2U6dCxzdGFjazpyLGRpZ2VzdDpudWxsfX1mdW5jdGlvbiBSdShlLHQsbil7cmV0dXJue3ZhbHVlOmUsc291cmNlOm51bGwsc3RhY2s6bj8/bnVsbCxkaWdlc3Q6dD8/bnVsbH19ZnVuY3Rpb24gaHAoZSx0KXt0cnl7Y29uc29sZS5lcnJvcih0LnZhbHVlKX1jYXRjaChuKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgbn0pfX12YXIgaVQ9dHlwZW9mIFdlYWtNYXA9PSJmdW5jdGlvbiI/V2Vha01hcDpNYXA7ZnVuY3Rpb24gbGIoZSx0LG4pe249em8oLTEsbiksbi50YWc9MyxuLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIG89dC52YWx1ZTtyZXR1cm4gbi5jYWxsYmFjaz1mdW5jdGlvbigpe2dkfHwoZ2Q9ITAsTnA9byksaHAoZSx0KX0sbn1mdW5jdGlvbiBkYihlLHQsbil7bj16bygtMSxuKSxuLnRhZz0zO3ZhciBvPWUudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe3ZhciByPXQudmFsdWU7bi5wYXlsb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIG8ocil9LG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtocChlLHQpfX12YXIgYT1lLnN0YXRlTm9kZTtyZXR1cm4gYSE9PW51bGwmJnR5cGVvZiBhLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYobi5jYWxsYmFjaz1mdW5jdGlvbigpe2hwKGUsdCksdHlwZW9mIG8hPSJmdW5jdGlvbiImJih3cj09PW51bGw/d3I9bmV3IFNldChbdGhpc10pOndyLmFkZCh0aGlzKSk7dmFyIGk9dC5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKHQudmFsdWUse2NvbXBvbmVudFN0YWNrOmkhPT1udWxsP2k6IiJ9KX0pLG59ZnVuY3Rpb24gd3koZSx0LG4pe3ZhciBvPWUucGluZ0NhY2hlO2lmKG89PT1udWxsKXtvPWUucGluZ0NhY2hlPW5ldyBpVDt2YXIgcj1uZXcgU2V0O28uc2V0KHQscil9ZWxzZSByPW8uZ2V0KHQpLHI9PT12b2lkIDAmJihyPW5ldyBTZXQsby5zZXQodCxyKSk7ci5oYXMobil8fChyLmFkZChuKSxlPXdULmJpbmQobnVsbCxlLHQsbiksdC50aGVuKGUsZSkpfWZ1bmN0aW9uIGt5KGUpe2Rve3ZhciB0O2lmKCh0PWUudGFnPT09MTMpJiYodD1lLm1lbW9pemVkU3RhdGUsdD10IT09bnVsbD90LmRlaHlkcmF0ZWQhPT1udWxsOiEwKSx0KXJldHVybiBlO2U9ZS5yZXR1cm59d2hpbGUoZSE9PW51bGwpO3JldHVybiBudWxsfWZ1bmN0aW9uIHh5KGUsdCxuLG8scil7cmV0dXJuIGUubW9kZSYxPyhlLmZsYWdzfD02NTUzNixlLmxhbmVzPXIsZSk6KGU9PT10P2UuZmxhZ3N8PTY1NTM2OihlLmZsYWdzfD0xMjgsbi5mbGFnc3w9MTMxMDcyLG4uZmxhZ3MmPS01MjgwNSxuLnRhZz09PTEmJihuLmFsdGVybmF0ZT09PW51bGw/bi50YWc9MTc6KHQ9em8oLTEsMSksdC50YWc9MixicihuLHQsMSkpKSxuLmxhbmVzfD0xKSxlKX12YXIgc1Q9R28uUmVhY3RDdXJyZW50T3duZXIsY249ITE7ZnVuY3Rpb24gdG4oZSx0LG4sbyl7dC5jaGlsZD1lPT09bnVsbD9Gdih0LG51bGwsbixvKTpZYSh0LGUuY2hpbGQsbixvKX1mdW5jdGlvbiBTeShlLHQsbixvLHIpe249bi5yZW5kZXI7dmFyIGE9dC5yZWY7cmV0dXJuIEhhKHQsciksbz1vZihlLHQsbixvLGEsciksbj1yZigpLGUhPT1udWxsJiYhY24/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+cixLbyhlLHQscikpOihldCYmbiYmVnAodCksdC5mbGFnc3w9MSx0bihlLHQsbyxyKSx0LmNoaWxkKX1mdW5jdGlvbiBFeShlLHQsbixvLHIpe2lmKGU9PT1udWxsKXt2YXIgYT1uLnR5cGU7cmV0dXJuIHR5cGVvZiBhPT0iZnVuY3Rpb24iJiYhaGYoYSkmJmEuZGVmYXVsdFByb3BzPT09dm9pZCAwJiZuLmNvbXBhcmU9PT1udWxsJiZuLmRlZmF1bHRQcm9wcz09PXZvaWQgMD8odC50YWc9MTUsdC50eXBlPWEsY2IoZSx0LGEsbyxyKSk6KGU9JGwobi50eXBlLG51bGwsbyx0LHQubW9kZSxyKSxlLnJlZj10LnJlZixlLnJldHVybj10LHQuY2hpbGQ9ZSl9aWYoYT1lLmNoaWxkLCEoZS5sYW5lcyZyKSl7dmFyIGk9YS5tZW1vaXplZFByb3BzO2lmKG49bi5jb21wYXJlLG49biE9PW51bGw/bjphcyxuKGksbykmJmUucmVmPT09dC5yZWYpcmV0dXJuIEtvKGUsdCxyKX1yZXR1cm4gdC5mbGFnc3w9MSxlPXhyKGEsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWV9ZnVuY3Rpb24gY2IoZSx0LG4sbyxyKXtpZihlIT09bnVsbCl7dmFyIGE9ZS5tZW1vaXplZFByb3BzO2lmKGFzKGEsbykmJmUucmVmPT09dC5yZWYpaWYoY249ITEsdC5wZW5kaW5nUHJvcHM9bz1hLChlLmxhbmVzJnIpIT09MCllLmZsYWdzJjEzMTA3MiYmKGNuPSEwKTtlbHNlIHJldHVybiB0LmxhbmVzPWUubGFuZXMsS28oZSx0LHIpfXJldHVybiBncChlLHQsbixvLHIpfWZ1bmN0aW9uIHViKGUsdCxuKXt2YXIgbz10LnBlbmRpbmdQcm9wcyxyPW8uY2hpbGRyZW4sYT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbDtpZihvLm1vZGU9PT0iaGlkZGVuIilpZighKHQubW9kZSYxKSl0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LGplKFVhLHduKSx3bnw9bjtlbHNle2lmKCEobiYxMDczNzQxODI0KSlyZXR1cm4gZT1hIT09bnVsbD9hLmJhc2VMYW5lc3xuOm4sdC5sYW5lcz10LmNoaWxkTGFuZXM9MTA3Mzc0MTgyNCx0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LHQudXBkYXRlUXVldWU9bnVsbCxqZShVYSx3biksd258PWUsbnVsbDt0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LG89YSE9PW51bGw/YS5iYXNlTGFuZXM6bixqZShVYSx3biksd258PW99ZWxzZSBhIT09bnVsbD8obz1hLmJhc2VMYW5lc3xuLHQubWVtb2l6ZWRTdGF0ZT1udWxsKTpvPW4samUoVWEsd24pLHdufD1vO3JldHVybiB0bihlLHQscixuKSx0LmNoaWxkfWZ1bmN0aW9uIHBiKGUsdCl7dmFyIG49dC5yZWY7KGU9PT1udWxsJiZuIT09bnVsbHx8ZSE9PW51bGwmJmUucmVmIT09bikmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9ZnVuY3Rpb24gZ3AoZSx0LG4sbyxyKXt2YXIgYT1wbihuKT9qcjpxdC5jdXJyZW50O3JldHVybiBhPVZhKHQsYSksSGEodCxyKSxuPW9mKGUsdCxuLG8sYSxyKSxvPXJmKCksZSE9PW51bGwmJiFjbj8odC51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQuZmxhZ3MmPS0yMDUzLGUubGFuZXMmPX5yLEtvKGUsdCxyKSk6KGV0JiZvJiZWcCh0KSx0LmZsYWdzfD0xLHRuKGUsdCxuLHIpLHQuY2hpbGQpfWZ1bmN0aW9uIE55KGUsdCxuLG8scil7aWYocG4obikpe3ZhciBhPSEwO2lkKHQpfWVsc2UgYT0hMTtpZihIYSh0LHIpLHQuc3RhdGVOb2RlPT09bnVsbClqbChlLHQpLHNiKHQsbixvKSxtcCh0LG4sbyxyKSxvPSEwO2Vsc2UgaWYoZT09PW51bGwpe3ZhciBpPXQuc3RhdGVOb2RlLHM9dC5tZW1vaXplZFByb3BzO2kucHJvcHM9czt2YXIgbD1pLmNvbnRleHQsZD1uLmNvbnRleHRUeXBlO3R5cGVvZiBkPT0ib2JqZWN0IiYmZCE9PW51bGw/ZD1QbihkKTooZD1wbihuKT9qcjpxdC5jdXJyZW50LGQ9VmEodCxkKSk7dmFyIGM9bi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsdT10eXBlb2YgYz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiI7dXx8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChzIT09b3x8bCE9PWQpJiZieSh0LGksbyxkKSxjcj0hMTt2YXIgcD10Lm1lbW9pemVkU3RhdGU7aS5zdGF0ZT1wLHVkKHQsbyxpLHIpLGw9dC5tZW1vaXplZFN0YXRlLHMhPT1vfHxwIT09bHx8dW4uY3VycmVudHx8Y3I/KHR5cGVvZiBjPT0iZnVuY3Rpb24iJiYoZnAodCxuLGMsbyksbD10Lm1lbW9pemVkU3RhdGUpLChzPWNyfHx2eSh0LG4scyxvLHAsbCxkKSk/KHV8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksdHlwZW9mIGkuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSk6KHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCksdC5tZW1vaXplZFByb3BzPW8sdC5tZW1vaXplZFN0YXRlPWwpLGkucHJvcHM9byxpLnN0YXRlPWwsaS5jb250ZXh0PWQsbz1zKToodHlwZW9mIGkuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSxvPSExKX1lbHNle2k9dC5zdGF0ZU5vZGUsV3YoZSx0KSxzPXQubWVtb2l6ZWRQcm9wcyxkPXQudHlwZT09PXQuZWxlbWVudFR5cGU/czpabih0LnR5cGUscyksaS5wcm9wcz1kLHU9dC5wZW5kaW5nUHJvcHMscD1pLmNvbnRleHQsbD1uLmNvbnRleHRUeXBlLHR5cGVvZiBsPT0ib2JqZWN0IiYmbCE9PW51bGw/bD1QbihsKToobD1wbihuKT9qcjpxdC5jdXJyZW50LGw9VmEodCxsKSk7dmFyIGY9bi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7KGM9dHlwZW9mIGY9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iKXx8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChzIT09dXx8cCE9PWwpJiZieSh0LGksbyxsKSxjcj0hMSxwPXQubWVtb2l6ZWRTdGF0ZSxpLnN0YXRlPXAsdWQodCxvLGkscik7dmFyIG09dC5tZW1vaXplZFN0YXRlO3MhPT11fHxwIT09bXx8dW4uY3VycmVudHx8Y3I/KHR5cGVvZiBmPT0iZnVuY3Rpb24iJiYoZnAodCxuLGYsbyksbT10Lm1lbW9pemVkU3RhdGUpLChkPWNyfHx2eSh0LG4sZCxvLHAsbSxsKXx8ITEpPyhjfHx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGkuY29tcG9uZW50V2lsbFVwZGF0ZSE9ImZ1bmN0aW9uInx8KHR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGU9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbFVwZGF0ZShvLG0sbCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGU9PSJmdW5jdGlvbiImJmkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUobyxtLGwpKSx0eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00KSx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTEwMjQpKToodHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnA9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSx0Lm1lbW9pemVkUHJvcHM9byx0Lm1lbW9pemVkU3RhdGU9bSksaS5wcm9wcz1vLGkuc3RhdGU9bSxpLmNvbnRleHQ9bCxvPWQpOih0eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnA9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmcD09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLG89ITEpfXJldHVybiB5cChlLHQsbixvLGEscil9ZnVuY3Rpb24geXAoZSx0LG4sbyxyLGEpe3BiKGUsdCk7dmFyIGk9KHQuZmxhZ3MmMTI4KSE9PTA7aWYoIW8mJiFpKXJldHVybiByJiZjeSh0LG4sITEpLEtvKGUsdCxhKTtvPXQuc3RhdGVOb2RlLHNULmN1cnJlbnQ9dDt2YXIgcz1pJiZ0eXBlb2Ygbi5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPSJmdW5jdGlvbiI/bnVsbDpvLnJlbmRlcigpO3JldHVybiB0LmZsYWdzfD0xLGUhPT1udWxsJiZpPyh0LmNoaWxkPVlhKHQsZS5jaGlsZCxudWxsLGEpLHQuY2hpbGQ9WWEodCxudWxsLHMsYSkpOnRuKGUsdCxzLGEpLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlLHImJmN5KHQsbiwhMCksdC5jaGlsZH1mdW5jdGlvbiBmYihlKXt2YXIgdD1lLnN0YXRlTm9kZTt0LnBlbmRpbmdDb250ZXh0P2R5KGUsdC5wZW5kaW5nQ29udGV4dCx0LnBlbmRpbmdDb250ZXh0IT09dC5jb250ZXh0KTp0LmNvbnRleHQmJmR5KGUsdC5jb250ZXh0LCExKSxacChlLHQuY29udGFpbmVySW5mbyl9ZnVuY3Rpb24gVHkoZSx0LG4sbyxyKXtyZXR1cm4gamEoKSxZcChyKSx0LmZsYWdzfD0yNTYsdG4oZSx0LG4sbyksdC5jaGlsZH12YXIgdnA9e2RlaHlkcmF0ZWQ6bnVsbCx0cmVlQ29udGV4dDpudWxsLHJldHJ5TGFuZTowfTtmdW5jdGlvbiBicChlKXtyZXR1cm57YmFzZUxhbmVzOmUsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH19ZnVuY3Rpb24gbWIoZSx0LG4pe3ZhciBvPXQucGVuZGluZ1Byb3BzLHI9YXQuY3VycmVudCxhPSExLGk9KHQuZmxhZ3MmMTI4KSE9PTAscztpZigocz1pKXx8KHM9ZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZT09PW51bGw/ITE6KHImMikhPT0wKSxzPyhhPSEwLHQuZmxhZ3MmPS0xMjkpOihlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCkmJihyfD0xKSxqZShhdCxyJjEpLGU9PT1udWxsKXJldHVybiB1cCh0KSxlPXQubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmKGU9ZS5kZWh5ZHJhdGVkLGUhPT1udWxsKT8odC5tb2RlJjE/ZS5kYXRhPT09IiQhIj90LmxhbmVzPTg6dC5sYW5lcz0xMDczNzQxODI0OnQubGFuZXM9MSxudWxsKTooaT1vLmNoaWxkcmVuLGU9by5mYWxsYmFjayxhPyhvPXQubW9kZSxhPXQuY2hpbGQsaT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjppfSwhKG8mMSkmJmEhPT1udWxsPyhhLmNoaWxkTGFuZXM9MCxhLnBlbmRpbmdQcm9wcz1pKTphPU1kKGksbywwLG51bGwpLGU9VnIoZSxvLG4sbnVsbCksYS5yZXR1cm49dCxlLnJldHVybj10LGEuc2libGluZz1lLHQuY2hpbGQ9YSx0LmNoaWxkLm1lbW9pemVkU3RhdGU9YnAobiksdC5tZW1vaXplZFN0YXRlPXZwLGUpOmxmKHQsaSkpO2lmKHI9ZS5tZW1vaXplZFN0YXRlLHIhPT1udWxsJiYocz1yLmRlaHlkcmF0ZWQscyE9PW51bGwpKXJldHVybiBsVChlLHQsaSxvLHMscixuKTtpZihhKXthPW8uZmFsbGJhY2ssaT10Lm1vZGUscj1lLmNoaWxkLHM9ci5zaWJsaW5nO3ZhciBsPXttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOm8uY2hpbGRyZW59O3JldHVybiEoaSYxKSYmdC5jaGlsZCE9PXI/KG89dC5jaGlsZCxvLmNoaWxkTGFuZXM9MCxvLnBlbmRpbmdQcm9wcz1sLHQuZGVsZXRpb25zPW51bGwpOihvPXhyKHIsbCksby5zdWJ0cmVlRmxhZ3M9ci5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQpLHMhPT1udWxsP2E9eHIocyxhKTooYT1WcihhLGksbixudWxsKSxhLmZsYWdzfD0yKSxhLnJldHVybj10LG8ucmV0dXJuPXQsby5zaWJsaW5nPWEsdC5jaGlsZD1vLG89YSxhPXQuY2hpbGQsaT1lLmNoaWxkLm1lbW9pemVkU3RhdGUsaT1pPT09bnVsbD9icChuKTp7YmFzZUxhbmVzOmkuYmFzZUxhbmVzfG4sY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6aS50cmFuc2l0aW9uc30sYS5tZW1vaXplZFN0YXRlPWksYS5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyZ+bix0Lm1lbW9pemVkU3RhdGU9dnAsb31yZXR1cm4gYT1lLmNoaWxkLGU9YS5zaWJsaW5nLG89eHIoYSx7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46by5jaGlsZHJlbn0pLCEodC5tb2RlJjEpJiYoby5sYW5lcz1uKSxvLnJldHVybj10LG8uc2libGluZz1udWxsLGUhPT1udWxsJiYobj10LmRlbGV0aW9ucyxuPT09bnVsbD8odC5kZWxldGlvbnM9W2VdLHQuZmxhZ3N8PTE2KTpuLnB1c2goZSkpLHQuY2hpbGQ9byx0Lm1lbW9pemVkU3RhdGU9bnVsbCxvfWZ1bmN0aW9uIGxmKGUsdCl7cmV0dXJuIHQ9TWQoe21vZGU6InZpc2libGUiLGNoaWxkcmVuOnR9LGUubW9kZSwwLG51bGwpLHQucmV0dXJuPWUsZS5jaGlsZD10fWZ1bmN0aW9uIFVsKGUsdCxuLG8pe3JldHVybiBvIT09bnVsbCYmWXAobyksWWEodCxlLmNoaWxkLG51bGwsbiksZT1sZih0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxlLmZsYWdzfD0yLHQubWVtb2l6ZWRTdGF0ZT1udWxsLGV9ZnVuY3Rpb24gbFQoZSx0LG4sbyxyLGEsaSl7aWYobilyZXR1cm4gdC5mbGFncyYyNTY/KHQuZmxhZ3MmPS0yNTcsbz1SdShFcnJvcih6KDQyMikpKSxVbChlLHQsaSxvKSk6dC5tZW1vaXplZFN0YXRlIT09bnVsbD8odC5jaGlsZD1lLmNoaWxkLHQuZmxhZ3N8PTEyOCxudWxsKTooYT1vLmZhbGxiYWNrLHI9dC5tb2RlLG89TWQoe21vZGU6InZpc2libGUiLGNoaWxkcmVuOm8uY2hpbGRyZW59LHIsMCxudWxsKSxhPVZyKGEscixpLG51bGwpLGEuZmxhZ3N8PTIsby5yZXR1cm49dCxhLnJldHVybj10LG8uc2libGluZz1hLHQuY2hpbGQ9byx0Lm1vZGUmMSYmWWEodCxlLmNoaWxkLG51bGwsaSksdC5jaGlsZC5tZW1vaXplZFN0YXRlPWJwKGkpLHQubWVtb2l6ZWRTdGF0ZT12cCxhKTtpZighKHQubW9kZSYxKSlyZXR1cm4gVWwoZSx0LGksbnVsbCk7aWYoci5kYXRhPT09IiQhIil7aWYobz1yLm5leHRTaWJsaW5nJiZyLm5leHRTaWJsaW5nLmRhdGFzZXQsbyl2YXIgcz1vLmRnc3Q7cmV0dXJuIG89cyxhPUVycm9yKHooNDE5KSksbz1SdShhLG8sdm9pZCAwKSxVbChlLHQsaSxvKX1pZihzPShpJmUuY2hpbGRMYW5lcykhPT0wLGNufHxzKXtpZihvPUN0LG8hPT1udWxsKXtzd2l0Y2goaSYtaSl7Y2FzZSA0OnI9MjticmVhaztjYXNlIDE2OnI9ODticmVhaztjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOmNhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cj0zMjticmVhaztjYXNlIDUzNjg3MDkxMjpyPTI2ODQzNTQ1NjticmVhaztkZWZhdWx0OnI9MH1yPXImKG8uc3VzcGVuZGVkTGFuZXN8aSk/MDpyLHIhPT0wJiZyIT09YS5yZXRyeUxhbmUmJihhLnJldHJ5TGFuZT1yLEhvKGUsciksb28obyxlLHIsLTEpKX1yZXR1cm4gbWYoKSxvPVJ1KEVycm9yKHooNDIxKSkpLFVsKGUsdCxpLG8pfXJldHVybiByLmRhdGE9PT0iJD8iPyh0LmZsYWdzfD0xMjgsdC5jaGlsZD1lLmNoaWxkLHQ9a1QuYmluZChudWxsLGUpLHIuX3JlYWN0UmV0cnk9dCxudWxsKTooZT1hLnRyZWVDb250ZXh0LGtuPXZyKHIubmV4dFNpYmxpbmcpLHhuPXQsZXQ9ITAsdG89bnVsbCxlIT09bnVsbCYmKE1uW09uKytdPVVvLE1uW09uKytdPUZvLE1uW09uKytdPVlyLFVvPWUuaWQsRm89ZS5vdmVyZmxvdyxZcj10KSx0PWxmKHQsby5jaGlsZHJlbiksdC5mbGFnc3w9NDA5Nix0KX1mdW5jdGlvbiBEeShlLHQsbil7ZS5sYW5lc3w9dDt2YXIgbz1lLmFsdGVybmF0ZTtvIT09bnVsbCYmKG8ubGFuZXN8PXQpLHBwKGUucmV0dXJuLHQsbil9ZnVuY3Rpb24gUHUoZSx0LG4sbyxyKXt2YXIgYT1lLm1lbW9pemVkU3RhdGU7YT09PW51bGw/ZS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczp0LHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6byx0YWlsOm4sdGFpbE1vZGU6cn06KGEuaXNCYWNrd2FyZHM9dCxhLnJlbmRlcmluZz1udWxsLGEucmVuZGVyaW5nU3RhcnRUaW1lPTAsYS5sYXN0PW8sYS50YWlsPW4sYS50YWlsTW9kZT1yKX1mdW5jdGlvbiBoYihlLHQsbil7dmFyIG89dC5wZW5kaW5nUHJvcHMscj1vLnJldmVhbE9yZGVyLGE9by50YWlsO2lmKHRuKGUsdCxvLmNoaWxkcmVuLG4pLG89YXQuY3VycmVudCxvJjIpbz1vJjF8Mix0LmZsYWdzfD0xMjg7ZWxzZXtpZihlIT09bnVsbCYmZS5mbGFncyYxMjgpZTpmb3IoZT10LmNoaWxkO2UhPT1udWxsOyl7aWYoZS50YWc9PT0xMyllLm1lbW9pemVkU3RhdGUhPT1udWxsJiZEeShlLG4sdCk7ZWxzZSBpZihlLnRhZz09PTE5KUR5KGUsbix0KTtlbHNlIGlmKGUuY2hpbGQhPT1udWxsKXtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZDtjb250aW51ZX1pZihlPT09dClicmVhayBlO2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8ZS5yZXR1cm49PT10KWJyZWFrIGU7ZT1lLnJldHVybn1lLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nfW8mPTF9aWYoamUoYXQsbyksISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPW51bGw7ZWxzZSBzd2l0Y2gocil7Y2FzZSJmb3J3YXJkcyI6Zm9yKG49dC5jaGlsZCxyPW51bGw7biE9PW51bGw7KWU9bi5hbHRlcm5hdGUsZSE9PW51bGwmJnBkKGUpPT09bnVsbCYmKHI9biksbj1uLnNpYmxpbmc7bj1yLG49PT1udWxsPyhyPXQuY2hpbGQsdC5jaGlsZD1udWxsKToocj1uLnNpYmxpbmcsbi5zaWJsaW5nPW51bGwpLFB1KHQsITEscixuLGEpO2JyZWFrO2Nhc2UiYmFja3dhcmRzIjpmb3Iobj1udWxsLHI9dC5jaGlsZCx0LmNoaWxkPW51bGw7ciE9PW51bGw7KXtpZihlPXIuYWx0ZXJuYXRlLGUhPT1udWxsJiZwZChlKT09PW51bGwpe3QuY2hpbGQ9cjticmVha31lPXIuc2libGluZyxyLnNpYmxpbmc9bixuPXIscj1lfVB1KHQsITAsbixudWxsLGEpO2JyZWFrO2Nhc2UidG9nZXRoZXIiOlB1KHQsITEsbnVsbCxudWxsLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0Lm1lbW9pemVkU3RhdGU9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBqbChlLHQpeyEodC5tb2RlJjEpJiZlIT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsdC5hbHRlcm5hdGU9bnVsbCx0LmZsYWdzfD0yKX1mdW5jdGlvbiBLbyhlLHQsbil7aWYoZSE9PW51bGwmJih0LmRlcGVuZGVuY2llcz1lLmRlcGVuZGVuY2llcyksJHJ8PXQubGFuZXMsIShuJnQuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYoZSE9PW51bGwmJnQuY2hpbGQhPT1lLmNoaWxkKXRocm93IEVycm9yKHooMTUzKSk7aWYodC5jaGlsZCE9PW51bGwpe2ZvcihlPXQuY2hpbGQsbj14cihlLGUucGVuZGluZ1Byb3BzKSx0LmNoaWxkPW4sbi5yZXR1cm49dDtlLnNpYmxpbmchPT1udWxsOyllPWUuc2libGluZyxuPW4uc2libGluZz14cihlLGUucGVuZGluZ1Byb3BzKSxuLnJldHVybj10O24uc2libGluZz1udWxsfXJldHVybiB0LmNoaWxkfWZ1bmN0aW9uIGRUKGUsdCxuKXtzd2l0Y2godC50YWcpe2Nhc2UgMzpmYih0KSxqYSgpO2JyZWFrO2Nhc2UgNTpCdih0KTticmVhaztjYXNlIDE6cG4odC50eXBlKSYmaWQodCk7YnJlYWs7Y2FzZSA0OlpwKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7YnJlYWs7Y2FzZSAxMDp2YXIgbz10LnR5cGUuX2NvbnRleHQscj10Lm1lbW9pemVkUHJvcHMudmFsdWU7amUoZGQsby5fY3VycmVudFZhbHVlKSxvLl9jdXJyZW50VmFsdWU9cjticmVhaztjYXNlIDEzOmlmKG89dC5tZW1vaXplZFN0YXRlLG8hPT1udWxsKXJldHVybiBvLmRlaHlkcmF0ZWQhPT1udWxsPyhqZShhdCxhdC5jdXJyZW50JjEpLHQuZmxhZ3N8PTEyOCxudWxsKTpuJnQuY2hpbGQuY2hpbGRMYW5lcz9tYihlLHQsbik6KGplKGF0LGF0LmN1cnJlbnQmMSksZT1LbyhlLHQsbiksZSE9PW51bGw/ZS5zaWJsaW5nOm51bGwpO2plKGF0LGF0LmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTppZihvPShuJnQuY2hpbGRMYW5lcykhPT0wLGUuZmxhZ3MmMTI4KXtpZihvKXJldHVybiBoYihlLHQsbik7dC5mbGFnc3w9MTI4fWlmKHI9dC5tZW1vaXplZFN0YXRlLHIhPT1udWxsJiYoci5yZW5kZXJpbmc9bnVsbCxyLnRhaWw9bnVsbCxyLmxhc3RFZmZlY3Q9bnVsbCksamUoYXQsYXQuY3VycmVudCksbylicmVhaztyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHQubGFuZXM9MCx1YihlLHQsbil9cmV0dXJuIEtvKGUsdCxuKX12YXIgZ2Isd3AseWIsdmI7Z2I9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5jaGlsZDtuIT09bnVsbDspe2lmKG4udGFnPT09NXx8bi50YWc9PT02KWUuYXBwZW5kQ2hpbGQobi5zdGF0ZU5vZGUpO2Vsc2UgaWYobi50YWchPT00JiZuLmNoaWxkIT09bnVsbCl7bi5jaGlsZC5yZXR1cm49bixuPW4uY2hpbGQ7Y29udGludWV9aWYobj09PXQpYnJlYWs7Zm9yKDtuLnNpYmxpbmc9PT1udWxsOyl7aWYobi5yZXR1cm49PT1udWxsfHxuLnJldHVybj09PXQpcmV0dXJuO249bi5yZXR1cm59bi5zaWJsaW5nLnJldHVybj1uLnJldHVybixuPW4uc2libGluZ319O3dwPWZ1bmN0aW9uKCl7fTt5Yj1mdW5jdGlvbihlLHQsbixvKXt2YXIgcj1lLm1lbW9pemVkUHJvcHM7aWYociE9PW8pe2U9dC5zdGF0ZU5vZGUsS3IoU28uY3VycmVudCk7dmFyIGE9bnVsbDtzd2l0Y2gobil7Y2FzZSJpbnB1dCI6cj1IdShlLHIpLG89SHUoZSxvKSxhPVtdO2JyZWFrO2Nhc2Uic2VsZWN0IjpyPXN0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLG89c3Qoe30sbyx7dmFsdWU6dm9pZCAwfSksYT1bXTticmVhaztjYXNlInRleHRhcmVhIjpyPVZ1KGUsciksbz1WdShlLG8pLGE9W107YnJlYWs7ZGVmYXVsdDp0eXBlb2Ygci5vbkNsaWNrIT0iZnVuY3Rpb24iJiZ0eXBlb2Ygby5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoZS5vbmNsaWNrPXJkKX1ZdShuLG8pO3ZhciBpO249bnVsbDtmb3IoZCBpbiByKWlmKCFvLmhhc093blByb3BlcnR5KGQpJiZyLmhhc093blByb3BlcnR5KGQpJiZyW2RdIT1udWxsKWlmKGQ9PT0ic3R5bGUiKXt2YXIgcz1yW2RdO2ZvcihpIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShpKSYmKG58fChuPXt9KSxuW2ldPSIiKX1lbHNlIGQhPT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiJiZkIT09ImNoaWxkcmVuIiYmZCE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZkIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmQhPT0iYXV0b0ZvY3VzIiYmKFFpLmhhc093blByb3BlcnR5KGQpP2F8fChhPVtdKTooYT1hfHxbXSkucHVzaChkLG51bGwpKTtmb3IoZCBpbiBvKXt2YXIgbD1vW2RdO2lmKHM9cj8uW2RdLG8uaGFzT3duUHJvcGVydHkoZCkmJmwhPT1zJiYobCE9bnVsbHx8cyE9bnVsbCkpaWYoZD09PSJzdHlsZSIpaWYocyl7Zm9yKGkgaW4gcykhcy5oYXNPd25Qcm9wZXJ0eShpKXx8bCYmbC5oYXNPd25Qcm9wZXJ0eShpKXx8KG58fChuPXt9KSxuW2ldPSIiKTtmb3IoaSBpbiBsKWwuaGFzT3duUHJvcGVydHkoaSkmJnNbaV0hPT1sW2ldJiYobnx8KG49e30pLG5baV09bFtpXSl9ZWxzZSBufHwoYXx8KGE9W10pLGEucHVzaChkLG4pKSxuPWw7ZWxzZSBkPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8obD1sP2wuX19odG1sOnZvaWQgMCxzPXM/cy5fX2h0bWw6dm9pZCAwLGwhPW51bGwmJnMhPT1sJiYoYT1hfHxbXSkucHVzaChkLGwpKTpkPT09ImNoaWxkcmVuIj90eXBlb2YgbCE9InN0cmluZyImJnR5cGVvZiBsIT0ibnVtYmVyInx8KGE9YXx8W10pLnB1c2goZCwiIitsKTpkIT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJmQhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmKFFpLmhhc093blByb3BlcnR5KGQpPyhsIT1udWxsJiZkPT09Im9uU2Nyb2xsIiYmJGUoInNjcm9sbCIsZSksYXx8cz09PWx8fChhPVtdKSk6KGE9YXx8W10pLnB1c2goZCxsKSl9biYmKGE9YXx8W10pLnB1c2goInN0eWxlIixuKTt2YXIgZD1hOyh0LnVwZGF0ZVF1ZXVlPWQpJiYodC5mbGFnc3w9NCl9fTt2Yj1mdW5jdGlvbihlLHQsbixvKXtuIT09byYmKHQuZmxhZ3N8PTQpfTtmdW5jdGlvbiBfaShlLHQpe2lmKCFldClzd2l0Y2goZS50YWlsTW9kZSl7Y2FzZSJoaWRkZW4iOnQ9ZS50YWlsO2Zvcih2YXIgbj1udWxsO3QhPT1udWxsOyl0LmFsdGVybmF0ZSE9PW51bGwmJihuPXQpLHQ9dC5zaWJsaW5nO249PT1udWxsP2UudGFpbD1udWxsOm4uc2libGluZz1udWxsO2JyZWFrO2Nhc2UiY29sbGFwc2VkIjpuPWUudGFpbDtmb3IodmFyIG89bnVsbDtuIT09bnVsbDspbi5hbHRlcm5hdGUhPT1udWxsJiYobz1uKSxuPW4uc2libGluZztvPT09bnVsbD90fHxlLnRhaWw9PT1udWxsP2UudGFpbD1udWxsOmUudGFpbC5zaWJsaW5nPW51bGw6by5zaWJsaW5nPW51bGx9fWZ1bmN0aW9uIGp0KGUpe3ZhciB0PWUuYWx0ZXJuYXRlIT09bnVsbCYmZS5hbHRlcm5hdGUuY2hpbGQ9PT1lLmNoaWxkLG49MCxvPTA7aWYodClmb3IodmFyIHI9ZS5jaGlsZDtyIT09bnVsbDspbnw9ci5sYW5lc3xyLmNoaWxkTGFuZXMsb3w9ci5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQsb3w9ci5mbGFncyYxNDY4MDA2NCxyLnJldHVybj1lLHI9ci5zaWJsaW5nO2Vsc2UgZm9yKHI9ZS5jaGlsZDtyIT09bnVsbDspbnw9ci5sYW5lc3xyLmNoaWxkTGFuZXMsb3w9ci5zdWJ0cmVlRmxhZ3Msb3w9ci5mbGFncyxyLnJldHVybj1lLHI9ci5zaWJsaW5nO3JldHVybiBlLnN1YnRyZWVGbGFnc3w9byxlLmNoaWxkTGFuZXM9bix0fWZ1bmN0aW9uIGNUKGUsdCxuKXt2YXIgbz10LnBlbmRpbmdQcm9wcztzd2l0Y2goanAodCksdC50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBqdCh0KSxudWxsO2Nhc2UgMTpyZXR1cm4gcG4odC50eXBlKSYmYWQoKSxqdCh0KSxudWxsO2Nhc2UgMzpyZXR1cm4gbz10LnN0YXRlTm9kZSxxYSgpLFhlKHVuKSxYZShxdCksdGYoKSxvLnBlbmRpbmdDb250ZXh0JiYoby5jb250ZXh0PW8ucGVuZGluZ0NvbnRleHQsby5wZW5kaW5nQ29udGV4dD1udWxsKSwoZT09PW51bGx8fGUuY2hpbGQ9PT1udWxsKSYmKExsKHQpP3QuZmxhZ3N8PTQ6ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJiEodC5mbGFncyYyNTYpfHwodC5mbGFnc3w9MTAyNCx0byE9PW51bGwmJihBcCh0byksdG89bnVsbCkpKSx3cChlLHQpLGp0KHQpLG51bGw7Y2FzZSA1OmVmKHQpO3ZhciByPUtyKGNzLmN1cnJlbnQpO2lmKG49dC50eXBlLGUhPT1udWxsJiZ0LnN0YXRlTm9kZSE9bnVsbCl5YihlLHQsbixvLHIpLGUucmVmIT09dC5yZWYmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mik7ZWxzZXtpZighbyl7aWYodC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKHooMTY2KSk7cmV0dXJuIGp0KHQpLG51bGx9aWYoZT1LcihTby5jdXJyZW50KSxMbCh0KSl7bz10LnN0YXRlTm9kZSxuPXQudHlwZTt2YXIgYT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKG9ba29dPXQsb1tsc109YSxlPSh0Lm1vZGUmMSkhPT0wLG4pe2Nhc2UiZGlhbG9nIjokZSgiY2FuY2VsIixvKSwkZSgiY2xvc2UiLG8pO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6JGUoImxvYWQiLG8pO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihyPTA7cjxIaS5sZW5ndGg7cisrKSRlKEhpW3JdLG8pO2JyZWFrO2Nhc2Uic291cmNlIjokZSgiZXJyb3IiLG8pO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOiRlKCJlcnJvciIsbyksJGUoImxvYWQiLG8pO2JyZWFrO2Nhc2UiZGV0YWlscyI6JGUoInRvZ2dsZSIsbyk7YnJlYWs7Y2FzZSJpbnB1dCI6TGcobyxhKSwkZSgiaW52YWxpZCIsbyk7YnJlYWs7Y2FzZSJzZWxlY3QiOm8uX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFhLm11bHRpcGxlfSwkZSgiaW52YWxpZCIsbyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6VWcobyxhKSwkZSgiaW52YWxpZCIsbyl9WXUobixhKSxyPW51bGw7Zm9yKHZhciBpIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIHM9YVtpXTtpPT09ImNoaWxkcmVuIj90eXBlb2Ygcz09InN0cmluZyI/by50ZXh0Q29udGVudCE9PXMmJihhLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZQbChvLnRleHRDb250ZW50LHMsZSkscj1bImNoaWxkcmVuIixzXSk6dHlwZW9mIHM9PSJudW1iZXIiJiZvLnRleHRDb250ZW50IT09IiIrcyYmKGEuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJlBsKG8udGV4dENvbnRlbnQscyxlKSxyPVsiY2hpbGRyZW4iLCIiK3NdKTpRaS5oYXNPd25Qcm9wZXJ0eShpKSYmcyE9bnVsbCYmaT09PSJvblNjcm9sbCImJiRlKCJzY3JvbGwiLG8pfXN3aXRjaChuKXtjYXNlImlucHV0Ijp4bChvKSxfZyhvLGEsITApO2JyZWFrO2Nhc2UidGV4dGFyZWEiOnhsKG8pLEZnKG8pO2JyZWFrO2Nhc2Uic2VsZWN0IjpjYXNlIm9wdGlvbiI6YnJlYWs7ZGVmYXVsdDp0eXBlb2YgYS5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoby5vbmNsaWNrPXJkKX1vPXIsdC51cGRhdGVRdWV1ZT1vLG8hPT1udWxsJiYodC5mbGFnc3w9NCl9ZWxzZXtpPXIubm9kZVR5cGU9PT05P3I6ci5vd25lckRvY3VtZW50LGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCImJihlPWp5KG4pKSxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP249PT0ic2NyaXB0Ij8oZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuaW5uZXJIVE1MPSI8c2NyaXB0PjxcL3NjcmlwdD4iLGU9ZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpKTp0eXBlb2Ygby5pcz09InN0cmluZyI/ZT1pLmNyZWF0ZUVsZW1lbnQobix7aXM6by5pc30pOihlPWkuY3JlYXRlRWxlbWVudChuKSxuPT09InNlbGVjdCImJihpPWUsby5tdWx0aXBsZT9pLm11bHRpcGxlPSEwOm8uc2l6ZSYmKGkuc2l6ZT1vLnNpemUpKSk6ZT1pLmNyZWF0ZUVsZW1lbnROUyhlLG4pLGVba29dPXQsZVtsc109byxnYihlLHQsITEsITEpLHQuc3RhdGVOb2RlPWU7ZTp7c3dpdGNoKGk9cXUobixvKSxuKXtjYXNlImRpYWxvZyI6JGUoImNhbmNlbCIsZSksJGUoImNsb3NlIixlKSxyPW87YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjokZSgibG9hZCIsZSkscj1vO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihyPTA7cjxIaS5sZW5ndGg7cisrKSRlKEhpW3JdLGUpO3I9bzticmVhaztjYXNlInNvdXJjZSI6JGUoImVycm9yIixlKSxyPW87YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6JGUoImVycm9yIixlKSwkZSgibG9hZCIsZSkscj1vO2JyZWFrO2Nhc2UiZGV0YWlscyI6JGUoInRvZ2dsZSIsZSkscj1vO2JyZWFrO2Nhc2UiaW5wdXQiOkxnKGUsbykscj1IdShlLG8pLCRlKCJpbnZhbGlkIixlKTticmVhaztjYXNlIm9wdGlvbiI6cj1vO2JyZWFrO2Nhc2Uic2VsZWN0IjplLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhby5tdWx0aXBsZX0scj1zdCh7fSxvLHt2YWx1ZTp2b2lkIDB9KSwkZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6VWcoZSxvKSxyPVZ1KGUsbyksJGUoImludmFsaWQiLGUpO2JyZWFrO2RlZmF1bHQ6cj1vfVl1KG4scikscz1yO2ZvcihhIGluIHMpaWYocy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGw9c1thXTthPT09InN0eWxlIj8keShlLGwpOmE9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhsPWw/bC5fX2h0bWw6dm9pZCAwLGwhPW51bGwmJll5KGUsbCkpOmE9PT0iY2hpbGRyZW4iP3R5cGVvZiBsPT0ic3RyaW5nIj8obiE9PSJ0ZXh0YXJlYSJ8fGwhPT0iIikmJlppKGUsbCk6dHlwZW9mIGw9PSJudW1iZXIiJiZaaShlLCIiK2wpOmEhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmYSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZhIT09ImF1dG9Gb2N1cyImJihRaS5oYXNPd25Qcm9wZXJ0eShhKT9sIT1udWxsJiZhPT09Im9uU2Nyb2xsIiYmJGUoInNjcm9sbCIsZSk6bCE9bnVsbCYmT3AoZSxhLGwsaSkpfXN3aXRjaChuKXtjYXNlImlucHV0Ijp4bChlKSxfZyhlLG8sITEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOnhsKGUpLEZnKGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvLnZhbHVlIT1udWxsJiZlLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK1NyKG8udmFsdWUpKTticmVhaztjYXNlInNlbGVjdCI6ZS5tdWx0aXBsZT0hIW8ubXVsdGlwbGUsYT1vLnZhbHVlLGEhPW51bGw/RmEoZSwhIW8ubXVsdGlwbGUsYSwhMSk6by5kZWZhdWx0VmFsdWUhPW51bGwmJkZhKGUsISFvLm11bHRpcGxlLG8uZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OnR5cGVvZiByLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihlLm9uY2xpY2s9cmQpfXN3aXRjaChuKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOm89ISFvLmF1dG9Gb2N1czticmVhayBlO2Nhc2UiaW1nIjpvPSEwO2JyZWFrIGU7ZGVmYXVsdDpvPSExfX1vJiYodC5mbGFnc3w9NCl9dC5yZWYhPT1udWxsJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfXJldHVybiBqdCh0KSxudWxsO2Nhc2UgNjppZihlJiZ0LnN0YXRlTm9kZSE9bnVsbCl2YihlLHQsZS5tZW1vaXplZFByb3BzLG8pO2Vsc2V7aWYodHlwZW9mIG8hPSJzdHJpbmciJiZ0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoeigxNjYpKTtpZihuPUtyKGNzLmN1cnJlbnQpLEtyKFNvLmN1cnJlbnQpLExsKHQpKXtpZihvPXQuc3RhdGVOb2RlLG49dC5tZW1vaXplZFByb3BzLG9ba29dPXQsKGE9by5ub2RlVmFsdWUhPT1uKSYmKGU9eG4sZSE9PW51bGwpKXN3aXRjaChlLnRhZyl7Y2FzZSAzOlBsKG8ubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApO2JyZWFrO2Nhc2UgNTplLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJlBsKG8ubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApfWEmJih0LmZsYWdzfD00KX1lbHNlIG89KG4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShvKSxvW2tvXT10LHQuc3RhdGVOb2RlPW99cmV0dXJuIGp0KHQpLG51bGw7Y2FzZSAxMzppZihYZShhdCksbz10Lm1lbW9pemVkU3RhdGUsZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoZXQmJmtuIT09bnVsbCYmdC5tb2RlJjEmJiEodC5mbGFncyYxMjgpKV92KCksamEoKSx0LmZsYWdzfD05ODU2MCxhPSExO2Vsc2UgaWYoYT1MbCh0KSxvIT09bnVsbCYmby5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoZT09PW51bGwpe2lmKCFhKXRocm93IEVycm9yKHooMzE4KSk7aWYoYT10Lm1lbW9pemVkU3RhdGUsYT1hIT09bnVsbD9hLmRlaHlkcmF0ZWQ6bnVsbCwhYSl0aHJvdyBFcnJvcih6KDMxNykpO2Fba29dPXR9ZWxzZSBqYSgpLCEodC5mbGFncyYxMjgpJiYodC5tZW1vaXplZFN0YXRlPW51bGwpLHQuZmxhZ3N8PTQ7anQodCksYT0hMX1lbHNlIHRvIT09bnVsbCYmKEFwKHRvKSx0bz1udWxsKSxhPSEwO2lmKCFhKXJldHVybiB0LmZsYWdzJjY1NTM2P3Q6bnVsbH1yZXR1cm4gdC5mbGFncyYxMjg/KHQubGFuZXM9bix0KToobz1vIT09bnVsbCxvIT09KGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmbyYmKHQuY2hpbGQuZmxhZ3N8PTgxOTIsdC5tb2RlJjEmJihlPT09bnVsbHx8YXQuY3VycmVudCYxP1N0PT09MCYmKFN0PTMpOm1mKCkpKSx0LnVwZGF0ZVF1ZXVlIT09bnVsbCYmKHQuZmxhZ3N8PTQpLGp0KHQpLG51bGwpO2Nhc2UgNDpyZXR1cm4gcWEoKSx3cChlLHQpLGU9PT1udWxsJiZpcyh0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxqdCh0KSxudWxsO2Nhc2UgMTA6cmV0dXJuIFhwKHQudHlwZS5fY29udGV4dCksanQodCksbnVsbDtjYXNlIDE3OnJldHVybiBwbih0LnR5cGUpJiZhZCgpLGp0KHQpLG51bGw7Y2FzZSAxOTppZihYZShhdCksYT10Lm1lbW9pemVkU3RhdGUsYT09PW51bGwpcmV0dXJuIGp0KHQpLG51bGw7aWYobz0odC5mbGFncyYxMjgpIT09MCxpPWEucmVuZGVyaW5nLGk9PT1udWxsKWlmKG8pX2koYSwhMSk7ZWxzZXtpZihTdCE9PTB8fGUhPT1udWxsJiZlLmZsYWdzJjEyOClmb3IoZT10LmNoaWxkO2UhPT1udWxsOyl7aWYoaT1wZChlKSxpIT09bnVsbCl7Zm9yKHQuZmxhZ3N8PTEyOCxfaShhLCExKSxvPWkudXBkYXRlUXVldWUsbyE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPW8sdC5mbGFnc3w9NCksdC5zdWJ0cmVlRmxhZ3M9MCxvPW4sbj10LmNoaWxkO24hPT1udWxsOylhPW4sZT1vLGEuZmxhZ3MmPTE0NjgwMDY2LGk9YS5hbHRlcm5hdGUsaT09PW51bGw/KGEuY2hpbGRMYW5lcz0wLGEubGFuZXM9ZSxhLmNoaWxkPW51bGwsYS5zdWJ0cmVlRmxhZ3M9MCxhLm1lbW9pemVkUHJvcHM9bnVsbCxhLm1lbW9pemVkU3RhdGU9bnVsbCxhLnVwZGF0ZVF1ZXVlPW51bGwsYS5kZXBlbmRlbmNpZXM9bnVsbCxhLnN0YXRlTm9kZT1udWxsKTooYS5jaGlsZExhbmVzPWkuY2hpbGRMYW5lcyxhLmxhbmVzPWkubGFuZXMsYS5jaGlsZD1pLmNoaWxkLGEuc3VidHJlZUZsYWdzPTAsYS5kZWxldGlvbnM9bnVsbCxhLm1lbW9pemVkUHJvcHM9aS5tZW1vaXplZFByb3BzLGEubWVtb2l6ZWRTdGF0ZT1pLm1lbW9pemVkU3RhdGUsYS51cGRhdGVRdWV1ZT1pLnVwZGF0ZVF1ZXVlLGEudHlwZT1pLnR5cGUsZT1pLmRlcGVuZGVuY2llcyxhLmRlcGVuZGVuY2llcz1lPT09bnVsbD9udWxsOntsYW5lczplLmxhbmVzLGZpcnN0Q29udGV4dDplLmZpcnN0Q29udGV4dH0pLG49bi5zaWJsaW5nO3JldHVybiBqZShhdCxhdC5jdXJyZW50JjF8MiksdC5jaGlsZH1lPWUuc2libGluZ31hLnRhaWwhPT1udWxsJiZtdCgpPlhhJiYodC5mbGFnc3w9MTI4LG89ITAsX2koYSwhMSksdC5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFvKWlmKGU9cGQoaSksZSE9PW51bGwpe2lmKHQuZmxhZ3N8PTEyOCxvPSEwLG49ZS51cGRhdGVRdWV1ZSxuIT09bnVsbCYmKHQudXBkYXRlUXVldWU9bix0LmZsYWdzfD00KSxfaShhLCEwKSxhLnRhaWw9PT1udWxsJiZhLnRhaWxNb2RlPT09ImhpZGRlbiImJiFpLmFsdGVybmF0ZSYmIWV0KXJldHVybiBqdCh0KSxudWxsfWVsc2UgMiptdCgpLWEucmVuZGVyaW5nU3RhcnRUaW1lPlhhJiZuIT09MTA3Mzc0MTgyNCYmKHQuZmxhZ3N8PTEyOCxvPSEwLF9pKGEsITEpLHQubGFuZXM9NDE5NDMwNCk7YS5pc0JhY2t3YXJkcz8oaS5zaWJsaW5nPXQuY2hpbGQsdC5jaGlsZD1pKToobj1hLmxhc3QsbiE9PW51bGw/bi5zaWJsaW5nPWk6dC5jaGlsZD1pLGEubGFzdD1pKX1yZXR1cm4gYS50YWlsIT09bnVsbD8odD1hLnRhaWwsYS5yZW5kZXJpbmc9dCxhLnRhaWw9dC5zaWJsaW5nLGEucmVuZGVyaW5nU3RhcnRUaW1lPW10KCksdC5zaWJsaW5nPW51bGwsbj1hdC5jdXJyZW50LGplKGF0LG8/biYxfDI6biYxKSx0KTooanQodCksbnVsbCk7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBmZigpLG89dC5tZW1vaXplZFN0YXRlIT09bnVsbCxlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCE9PW8mJih0LmZsYWdzfD04MTkyKSxvJiZ0Lm1vZGUmMT93biYxMDczNzQxODI0JiYoanQodCksdC5zdWJ0cmVlRmxhZ3MmNiYmKHQuZmxhZ3N8PTgxOTIpKTpqdCh0KSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcih6KDE1Nix0LnRhZykpfWZ1bmN0aW9uIHVUKGUsdCl7c3dpdGNoKGpwKHQpLHQudGFnKXtjYXNlIDE6cmV0dXJuIHBuKHQudHlwZSkmJmFkKCksZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAzOnJldHVybiBxYSgpLFhlKHVuKSxYZShxdCksdGYoKSxlPXQuZmxhZ3MsZSY2NTUzNiYmIShlJjEyOCk/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSA1OnJldHVybiBlZih0KSxudWxsO2Nhc2UgMTM6aWYoWGUoYXQpLGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiZlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0LmFsdGVybmF0ZT09PW51bGwpdGhyb3cgRXJyb3IoeigzNDApKTtqYSgpfXJldHVybiBlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDE5OnJldHVybiBYZShhdCksbnVsbDtjYXNlIDQ6cmV0dXJuIHFhKCksbnVsbDtjYXNlIDEwOnJldHVybiBYcCh0LnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBmZigpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgRmw9ITEsWXQ9ITEscFQ9dHlwZW9mIFdlYWtTZXQ9PSJmdW5jdGlvbiI/V2Vha1NldDpTZXQsJD1udWxsO2Z1bmN0aW9uIF9hKGUsdCl7dmFyIG49ZS5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gobyl7ZHQoZSx0LG8pfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24ga3AoZSx0LG4pe3RyeXtuKCl9Y2F0Y2gobyl7ZHQoZSx0LG8pfX12YXIgQXk9ITE7ZnVuY3Rpb24gZlQoZSx0KXtpZihycD10ZCxlPVN2KCksR3AoZSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXZhciBuPXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgbz1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihvJiZvLnJhbmdlQ291bnQhPT0wKXtuPW8uYW5jaG9yTm9kZTt2YXIgcj1vLmFuY2hvck9mZnNldCxhPW8uZm9jdXNOb2RlO289by5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxhLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBpPTAscz0tMSxsPS0xLGQ9MCxjPTAsdT1lLHA9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBmO3UhPT1ufHxyIT09MCYmdS5ub2RlVHlwZSE9PTN8fChzPWkrciksdSE9PWF8fG8hPT0wJiZ1Lm5vZGVUeXBlIT09M3x8KGw9aStvKSx1Lm5vZGVUeXBlPT09MyYmKGkrPXUubm9kZVZhbHVlLmxlbmd0aCksKGY9dS5maXJzdENoaWxkKSE9PW51bGw7KXA9dSx1PWY7Zm9yKDs7KXtpZih1PT09ZSlicmVhayB0O2lmKHA9PT1uJiYrK2Q9PT1yJiYocz1pKSxwPT09YSYmKytjPT09byYmKGw9aSksKGY9dS5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO3U9cCxwPXUucGFyZW50Tm9kZX11PWZ9bj1zPT09LTF8fGw9PT0tMT9udWxsOntzdGFydDpzLGVuZDpsfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoYXA9e2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6bn0sdGQ9ITEsJD10OyQhPT1udWxsOylpZih0PSQsZT10LmNoaWxkLCh0LnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJmUhPT1udWxsKWUucmV0dXJuPXQsJD1lO2Vsc2UgZm9yKDskIT09bnVsbDspe3Q9JDt0cnl7dmFyIG09dC5hbHRlcm5hdGU7aWYodC5mbGFncyYxMDI0KXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyx3PW0ubWVtb2l6ZWRTdGF0ZSx2PXQuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSh0LmVsZW1lbnRUeXBlPT09dC50eXBlP2c6Wm4odC50eXBlLGcpLHcpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIGI9dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztiLm5vZGVUeXBlPT09MT9iLnRleHRDb250ZW50PSIiOmIubm9kZVR5cGU9PT05JiZiLmRvY3VtZW50RWxlbWVudCYmYi5yZW1vdmVDaGlsZChiLmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKHooMTYzKSl9fWNhdGNoKGgpe2R0KHQsdC5yZXR1cm4saCl9aWYoZT10LnNpYmxpbmcsZSE9PW51bGwpe2UucmV0dXJuPXQucmV0dXJuLCQ9ZTticmVha30kPXQucmV0dXJufXJldHVybiBtPUF5LEF5PSExLG19ZnVuY3Rpb24gJGkoZSx0LG4pe3ZhciBvPXQudXBkYXRlUXVldWU7aWYobz1vIT09bnVsbD9vLmxhc3RFZmZlY3Q6bnVsbCxvIT09bnVsbCl7dmFyIHI9bz1vLm5leHQ7ZG97aWYoKHIudGFnJmUpPT09ZSl7dmFyIGE9ci5kZXN0cm95O3IuZGVzdHJveT12b2lkIDAsYSE9PXZvaWQgMCYma3AodCxuLGEpfXI9ci5uZXh0fXdoaWxlKHIhPT1vKX19ZnVuY3Rpb24gQWQoZSx0KXtpZih0PXQudXBkYXRlUXVldWUsdD10IT09bnVsbD90Lmxhc3RFZmZlY3Q6bnVsbCx0IT09bnVsbCl7dmFyIG49dD10Lm5leHQ7ZG97aWYoKG4udGFnJmUpPT09ZSl7dmFyIG89bi5jcmVhdGU7bi5kZXN0cm95PW8oKX1uPW4ubmV4dH13aGlsZShuIT09dCl9fWZ1bmN0aW9uIHhwKGUpe3ZhciB0PWUucmVmO2lmKHQhPT1udWxsKXt2YXIgbj1lLnN0YXRlTm9kZTtzd2l0Y2goZS50YWcpe2Nhc2UgNTplPW47YnJlYWs7ZGVmYXVsdDplPW59dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0LmN1cnJlbnQ9ZX19ZnVuY3Rpb24gYmIoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7dCE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLGJiKHQpKSxlLmNoaWxkPW51bGwsZS5kZWxldGlvbnM9bnVsbCxlLnNpYmxpbmc9bnVsbCxlLnRhZz09PTUmJih0PWUuc3RhdGVOb2RlLHQhPT1udWxsJiYoZGVsZXRlIHRba29dLGRlbGV0ZSB0W2xzXSxkZWxldGUgdFtscF0sZGVsZXRlIHRbJE5dLGRlbGV0ZSB0W1hOXSkpLGUuc3RhdGVOb2RlPW51bGwsZS5yZXR1cm49bnVsbCxlLmRlcGVuZGVuY2llcz1udWxsLGUubWVtb2l6ZWRQcm9wcz1udWxsLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUucGVuZGluZ1Byb3BzPW51bGwsZS5zdGF0ZU5vZGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gd2IoZSl7cmV0dXJuIGUudGFnPT09NXx8ZS50YWc9PT0zfHxlLnRhZz09PTR9ZnVuY3Rpb24gQ3koZSl7ZTpmb3IoOzspe2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8d2IoZS5yZXR1cm4pKXJldHVybiBudWxsO2U9ZS5yZXR1cm59Zm9yKGUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmc7ZS50YWchPT01JiZlLnRhZyE9PTYmJmUudGFnIT09MTg7KXtpZihlLmZsYWdzJjJ8fGUuY2hpbGQ9PT1udWxsfHxlLnRhZz09PTQpY29udGludWUgZTtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZH1pZighKGUuZmxhZ3MmMikpcmV0dXJuIGUuc3RhdGVOb2RlfX1mdW5jdGlvbiBTcChlLHQsbil7dmFyIG89ZS50YWc7aWYobz09PTV8fG89PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLm5vZGVUeXBlPT09OD9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdCk6bi5pbnNlcnRCZWZvcmUoZSx0KToobi5ub2RlVHlwZT09PTg/KHQ9bi5wYXJlbnROb2RlLHQuaW5zZXJ0QmVmb3JlKGUsbikpOih0PW4sdC5hcHBlbmRDaGlsZChlKSksbj1uLl9yZWFjdFJvb3RDb250YWluZXIsbiE9bnVsbHx8dC5vbmNsaWNrIT09bnVsbHx8KHQub25jbGljaz1yZCkpO2Vsc2UgaWYobyE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcihTcChlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KVNwKGUsdCxuKSxlPWUuc2libGluZ31mdW5jdGlvbiBFcChlLHQsbil7dmFyIG89ZS50YWc7aWYobz09PTV8fG89PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLmluc2VydEJlZm9yZShlLHQpOm4uYXBwZW5kQ2hpbGQoZSk7ZWxzZSBpZihvIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKEVwKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspRXAoZSx0LG4pLGU9ZS5zaWJsaW5nfXZhciBGdD1udWxsLGVvPSExO2Z1bmN0aW9uIGxyKGUsdCxuKXtmb3Iobj1uLmNoaWxkO24hPT1udWxsOylrYihlLHQsbiksbj1uLnNpYmxpbmd9ZnVuY3Rpb24ga2IoZSx0LG4pe2lmKHhvJiZ0eXBlb2YgeG8ub25Db21taXRGaWJlclVubW91bnQ9PSJmdW5jdGlvbiIpdHJ5e3hvLm9uQ29tbWl0RmliZXJVbm1vdW50KHdkLG4pfWNhdGNoe31zd2l0Y2gobi50YWcpe2Nhc2UgNTpZdHx8X2Eobix0KTtjYXNlIDY6dmFyIG89RnQscj1lbztGdD1udWxsLGxyKGUsdCxuKSxGdD1vLGVvPXIsRnQhPT1udWxsJiYoZW8/KGU9RnQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik6ZS5yZW1vdmVDaGlsZChuKSk6RnQucmVtb3ZlQ2hpbGQobi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4OkZ0IT09bnVsbCYmKGVvPyhlPUZ0LG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/RHUoZS5wYXJlbnROb2RlLG4pOmUubm9kZVR5cGU9PT0xJiZEdShlLG4pLG9zKGUpKTpEdShGdCxuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpvPUZ0LHI9ZW8sRnQ9bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxlbz0hMCxscihlLHQsbiksRnQ9byxlbz1yO2JyZWFrO2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZighWXQmJihvPW4udXBkYXRlUXVldWUsbyE9PW51bGwmJihvPW8ubGFzdEVmZmVjdCxvIT09bnVsbCkpKXtyPW89by5uZXh0O2Rve3ZhciBhPXIsaT1hLmRlc3Ryb3k7YT1hLnRhZyxpIT09dm9pZCAwJiYoYSYyfHxhJjQpJiZrcChuLHQsaSkscj1yLm5leHR9d2hpbGUociE9PW8pfWxyKGUsdCxuKTticmVhaztjYXNlIDE6aWYoIVl0JiYoX2Eobix0KSxvPW4uc3RhdGVOb2RlLHR5cGVvZiBvLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKSl0cnl7by5wcm9wcz1uLm1lbW9pemVkUHJvcHMsby5zdGF0ZT1uLm1lbW9pemVkU3RhdGUsby5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHMpe2R0KG4sdCxzKX1scihlLHQsbik7YnJlYWs7Y2FzZSAyMTpscihlLHQsbik7YnJlYWs7Y2FzZSAyMjpuLm1vZGUmMT8oWXQ9KG89WXQpfHxuLm1lbW9pemVkU3RhdGUhPT1udWxsLGxyKGUsdCxuKSxZdD1vKTpscihlLHQsbik7YnJlYWs7ZGVmYXVsdDpscihlLHQsbil9fWZ1bmN0aW9uIE15KGUpe3ZhciB0PWUudXBkYXRlUXVldWU7aWYodCE9PW51bGwpe2UudXBkYXRlUXVldWU9bnVsbDt2YXIgbj1lLnN0YXRlTm9kZTtuPT09bnVsbCYmKG49ZS5zdGF0ZU5vZGU9bmV3IHBUKSx0LmZvckVhY2goZnVuY3Rpb24obyl7dmFyIHI9eFQuYmluZChudWxsLGUsbyk7bi5oYXMobyl8fChuLmFkZChvKSxvLnRoZW4ocixyKSl9KX19ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbj10LmRlbGV0aW9ucztpZihuIT09bnVsbClmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIHI9bltvXTt0cnl7dmFyIGE9ZSxpPXQscz1pO2U6Zm9yKDtzIT09bnVsbDspe3N3aXRjaChzLnRhZyl7Y2FzZSA1OkZ0PXMuc3RhdGVOb2RlLGVvPSExO2JyZWFrIGU7Y2FzZSAzOkZ0PXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sZW89ITA7YnJlYWsgZTtjYXNlIDQ6RnQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxlbz0hMDticmVhayBlfXM9cy5yZXR1cm59aWYoRnQ9PT1udWxsKXRocm93IEVycm9yKHooMTYwKSk7a2IoYSxpLHIpLEZ0PW51bGwsZW89ITE7dmFyIGw9ci5hbHRlcm5hdGU7bCE9PW51bGwmJihsLnJldHVybj1udWxsKSxyLnJldHVybj1udWxsfWNhdGNoKGQpe2R0KHIsdCxkKX19aWYodC5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspeGIodCxlKSx0PXQuc2libGluZ31mdW5jdGlvbiB4YihlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlLG89ZS5mbGFncztzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZihRbih0LGUpLGJvKGUpLG8mNCl7dHJ5eyRpKDMsZSxlLnJldHVybiksQWQoMyxlKX1jYXRjaChnKXtkdChlLGUucmV0dXJuLGcpfXRyeXskaSg1LGUsZS5yZXR1cm4pfWNhdGNoKGcpe2R0KGUsZS5yZXR1cm4sZyl9fWJyZWFrO2Nhc2UgMTpRbih0LGUpLGJvKGUpLG8mNTEyJiZuIT09bnVsbCYmX2EobixuLnJldHVybik7YnJlYWs7Y2FzZSA1OmlmKFFuKHQsZSksYm8oZSksbyY1MTImJm4hPT1udWxsJiZfYShuLG4ucmV0dXJuKSxlLmZsYWdzJjMyKXt2YXIgcj1lLnN0YXRlTm9kZTt0cnl7WmkociwiIil9Y2F0Y2goZyl7ZHQoZSxlLnJldHVybixnKX19aWYobyY0JiYocj1lLnN0YXRlTm9kZSxyIT1udWxsKSl7dmFyIGE9ZS5tZW1vaXplZFByb3BzLGk9biE9PW51bGw/bi5tZW1vaXplZFByb3BzOmEscz1lLnR5cGUsbD1lLnVwZGF0ZVF1ZXVlO2lmKGUudXBkYXRlUXVldWU9bnVsbCxsIT09bnVsbCl0cnl7cz09PSJpbnB1dCImJmEudHlwZT09PSJyYWRpbyImJmEubmFtZSE9bnVsbCYmR3kocixhKSxxdShzLGkpO3ZhciBkPXF1KHMsYSk7Zm9yKGk9MDtpPGwubGVuZ3RoO2krPTIpe3ZhciBjPWxbaV0sdT1sW2krMV07Yz09PSJzdHlsZSI/JHkocix1KTpjPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj9ZeShyLHUpOmM9PT0iY2hpbGRyZW4iP1ppKHIsdSk6T3AocixjLHUsZCl9c3dpdGNoKHMpe2Nhc2UiaW5wdXQiOkt1KHIsYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6VnkocixhKTticmVhaztjYXNlInNlbGVjdCI6dmFyIHA9ci5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO3IuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIWEubXVsdGlwbGU7dmFyIGY9YS52YWx1ZTtmIT1udWxsP0ZhKHIsISFhLm11bHRpcGxlLGYsITEpOnAhPT0hIWEubXVsdGlwbGUmJihhLmRlZmF1bHRWYWx1ZSE9bnVsbD9GYShyLCEhYS5tdWx0aXBsZSxhLmRlZmF1bHRWYWx1ZSwhMCk6RmEociwhIWEubXVsdGlwbGUsYS5tdWx0aXBsZT9bXToiIiwhMSkpfXJbbHNdPWF9Y2F0Y2goZyl7ZHQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSA2OmlmKFFuKHQsZSksYm8oZSksbyY0KXtpZihlLnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoeigxNjIpKTtyPWUuc3RhdGVOb2RlLGE9ZS5tZW1vaXplZFByb3BzO3RyeXtyLm5vZGVWYWx1ZT1hfWNhdGNoKGcpe2R0KGUsZS5yZXR1cm4sZyl9fWJyZWFrO2Nhc2UgMzppZihRbih0LGUpLGJvKGUpLG8mNCYmbiE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e29zKHQuY29udGFpbmVySW5mbyl9Y2F0Y2goZyl7ZHQoZSxlLnJldHVybixnKX1icmVhaztjYXNlIDQ6UW4odCxlKSxibyhlKTticmVhaztjYXNlIDEzOlFuKHQsZSksYm8oZSkscj1lLmNoaWxkLHIuZmxhZ3MmODE5MiYmKGE9ci5tZW1vaXplZFN0YXRlIT09bnVsbCxyLnN0YXRlTm9kZS5pc0hpZGRlbj1hLCFhfHxyLmFsdGVybmF0ZSE9PW51bGwmJnIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUhPT1udWxsfHwodWY9bXQoKSkpLG8mNCYmTXkoZSk7YnJlYWs7Y2FzZSAyMjppZihjPW4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUhPT1udWxsLGUubW9kZSYxPyhZdD0oZD1ZdCl8fGMsUW4odCxlKSxZdD1kKTpRbih0LGUpLGJvKGUpLG8mODE5Mil7aWYoZD1lLm1lbW9pemVkU3RhdGUhPT1udWxsLChlLnN0YXRlTm9kZS5pc0hpZGRlbj1kKSYmIWMmJmUubW9kZSYxKWZvcigkPWUsYz1lLmNoaWxkO2MhPT1udWxsOyl7Zm9yKHU9JD1jOyQhPT1udWxsOyl7c3dpdGNoKHA9JCxmPXAuY2hpbGQscC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTokaSg0LHAscC5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpfYShwLHAucmV0dXJuKTt2YXIgbT1wLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7bz1wLG49cC5yZXR1cm47dHJ5e3Q9byxtLnByb3BzPXQubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7ZHQobyxuLGcpfX1icmVhaztjYXNlIDU6X2EocCxwLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihwLm1lbW9pemVkU3RhdGUhPT1udWxsKXtJeSh1KTtjb250aW51ZX19ZiE9PW51bGw/KGYucmV0dXJuPXAsJD1mKTpJeSh1KX1jPWMuc2libGluZ31lOmZvcihjPW51bGwsdT1lOzspe2lmKHUudGFnPT09NSl7aWYoYz09PW51bGwpe2M9dTt0cnl7cj11LnN0YXRlTm9kZSxkPyhhPXIuc3R5bGUsdHlwZW9mIGEuc2V0UHJvcGVydHk9PSJmdW5jdGlvbiI/YS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsIm5vbmUiLCJpbXBvcnRhbnQiKTphLmRpc3BsYXk9Im5vbmUiKToocz11LnN0YXRlTm9kZSxsPXUubWVtb2l6ZWRQcm9wcy5zdHlsZSxpPWwhPW51bGwmJmwuaGFzT3duUHJvcGVydHkoImRpc3BsYXkiKT9sLmRpc3BsYXk6bnVsbCxzLnN0eWxlLmRpc3BsYXk9cXkoImRpc3BsYXkiLGkpKX1jYXRjaChnKXtkdChlLGUucmV0dXJuLGcpfX19ZWxzZSBpZih1LnRhZz09PTYpe2lmKGM9PT1udWxsKXRyeXt1LnN0YXRlTm9kZS5ub2RlVmFsdWU9ZD8iIjp1Lm1lbW9pemVkUHJvcHN9Y2F0Y2goZyl7ZHQoZSxlLnJldHVybixnKX19ZWxzZSBpZigodS50YWchPT0yMiYmdS50YWchPT0yM3x8dS5tZW1vaXplZFN0YXRlPT09bnVsbHx8dT09PWUpJiZ1LmNoaWxkIT09bnVsbCl7dS5jaGlsZC5yZXR1cm49dSx1PXUuY2hpbGQ7Y29udGludWV9aWYodT09PWUpYnJlYWsgZTtmb3IoO3Uuc2libGluZz09PW51bGw7KXtpZih1LnJldHVybj09PW51bGx8fHUucmV0dXJuPT09ZSlicmVhayBlO2M9PT11JiYoYz1udWxsKSx1PXUucmV0dXJufWM9PT11JiYoYz1udWxsKSx1LnNpYmxpbmcucmV0dXJuPXUucmV0dXJuLHU9dS5zaWJsaW5nfX1icmVhaztjYXNlIDE5OlFuKHQsZSksYm8oZSksbyY0JiZNeShlKTticmVhaztjYXNlIDIxOmJyZWFrO2RlZmF1bHQ6UW4odCxlKSxibyhlKX19ZnVuY3Rpb24gYm8oZSl7dmFyIHQ9ZS5mbGFncztpZih0JjIpe3RyeXtlOntmb3IodmFyIG49ZS5yZXR1cm47biE9PW51bGw7KXtpZih3YihuKSl7dmFyIG89bjticmVhayBlfW49bi5yZXR1cm59dGhyb3cgRXJyb3IoeigxNjApKX1zd2l0Y2goby50YWcpe2Nhc2UgNTp2YXIgcj1vLnN0YXRlTm9kZTtvLmZsYWdzJjMyJiYoWmkociwiIiksby5mbGFncyY9LTMzKTt2YXIgYT1DeShlKTtFcChlLGEscik7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgaT1vLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLHM9Q3koZSk7U3AoZSxzLGkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeigxNjEpKX19Y2F0Y2gobCl7ZHQoZSxlLnJldHVybixsKX1lLmZsYWdzJj0tM310JjQwOTYmJihlLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gbVQoZSx0LG4peyQ9ZSxTYihlLHQsbil9ZnVuY3Rpb24gU2IoZSx0LG4pe2Zvcih2YXIgbz0oZS5tb2RlJjEpIT09MDskIT09bnVsbDspe3ZhciByPSQsYT1yLmNoaWxkO2lmKHIudGFnPT09MjImJm8pe3ZhciBpPXIubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fEZsO2lmKCFpKXt2YXIgcz1yLmFsdGVybmF0ZSxsPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxZdDtzPUZsO3ZhciBkPVl0O2lmKEZsPWksKFl0PWwpJiYhZClmb3IoJD1yOyQhPT1udWxsOylpPSQsbD1pLmNoaWxkLGkudGFnPT09MjImJmkubWVtb2l6ZWRTdGF0ZSE9PW51bGw/Unkocik6bCE9PW51bGw/KGwucmV0dXJuPWksJD1sKTpSeShyKTtmb3IoO2EhPT1udWxsOykkPWEsU2IoYSx0LG4pLGE9YS5zaWJsaW5nOyQ9cixGbD1zLFl0PWR9T3koZSx0LG4pfWVsc2Ugci5zdWJ0cmVlRmxhZ3MmODc3MiYmYSE9PW51bGw/KGEucmV0dXJuPXIsJD1hKTpPeShlLHQsbil9fWZ1bmN0aW9uIE95KGUpe2Zvcig7JCE9PW51bGw7KXt2YXIgdD0kO2lmKHQuZmxhZ3MmODc3Mil7dmFyIG49dC5hbHRlcm5hdGU7dHJ5e2lmKHQuZmxhZ3MmODc3Milzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6WXR8fEFkKDUsdCk7YnJlYWs7Y2FzZSAxOnZhciBvPXQuc3RhdGVOb2RlO2lmKHQuZmxhZ3MmNCYmIVl0KWlmKG49PT1udWxsKW8uY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciByPXQuZWxlbWVudFR5cGU9PT10LnR5cGU/bi5tZW1vaXplZFByb3BzOlpuKHQudHlwZSxuLm1lbW9pemVkUHJvcHMpO28uY29tcG9uZW50RGlkVXBkYXRlKHIsbi5tZW1vaXplZFN0YXRlLG8uX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBhPXQudXBkYXRlUXVldWU7YSE9PW51bGwmJmh5KHQsYSxvKTticmVhaztjYXNlIDM6dmFyIGk9dC51cGRhdGVRdWV1ZTtpZihpIT09bnVsbCl7aWYobj1udWxsLHQuY2hpbGQhPT1udWxsKXN3aXRjaCh0LmNoaWxkLnRhZyl7Y2FzZSA1Om49dC5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49dC5jaGlsZC5zdGF0ZU5vZGV9aHkodCxpLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz10LnN0YXRlTm9kZTtpZihuPT09bnVsbCYmdC5mbGFncyY0KXtuPXM7dmFyIGw9dC5tZW1vaXplZFByb3BzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6bC5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6bC5zcmMmJihuLnNyYz1sLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKHQubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciBkPXQuYWx0ZXJuYXRlO2lmKGQhPT1udWxsKXt2YXIgYz1kLm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciB1PWMuZGVoeWRyYXRlZDt1IT09bnVsbCYmb3ModSl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKHooMTYzKSl9WXR8fHQuZmxhZ3MmNTEyJiZ4cCh0KX1jYXRjaChwKXtkdCh0LHQucmV0dXJuLHApfX1pZih0PT09ZSl7JD1udWxsO2JyZWFrfWlmKG49dC5zaWJsaW5nLG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybiwkPW47YnJlYWt9JD10LnJldHVybn19ZnVuY3Rpb24gSXkoZSl7Zm9yKDskIT09bnVsbDspe3ZhciB0PSQ7aWYodD09PWUpeyQ9bnVsbDticmVha312YXIgbj10LnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPXQucmV0dXJuLCQ9bjticmVha30kPXQucmV0dXJufX1mdW5jdGlvbiBSeShlKXtmb3IoOyQhPT1udWxsOyl7dmFyIHQ9JDt0cnl7c3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBuPXQucmV0dXJuO3RyeXtBZCg0LHQpfWNhdGNoKGwpe2R0KHQsbixsKX1icmVhaztjYXNlIDE6dmFyIG89dC5zdGF0ZU5vZGU7aWYodHlwZW9mIG8uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiIpe3ZhciByPXQucmV0dXJuO3RyeXtvLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2gobCl7ZHQodCxyLGwpfX12YXIgYT10LnJldHVybjt0cnl7eHAodCl9Y2F0Y2gobCl7ZHQodCxhLGwpfWJyZWFrO2Nhc2UgNTp2YXIgaT10LnJldHVybjt0cnl7eHAodCl9Y2F0Y2gobCl7ZHQodCxpLGwpfX19Y2F0Y2gobCl7ZHQodCx0LnJldHVybixsKX1pZih0PT09ZSl7JD1udWxsO2JyZWFrfXZhciBzPXQuc2libGluZztpZihzIT09bnVsbCl7cy5yZXR1cm49dC5yZXR1cm4sJD1zO2JyZWFrfSQ9dC5yZXR1cm59fXZhciBoVD1NYXRoLmNlaWwsaGQ9R28uUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixkZj1Hby5SZWFjdEN1cnJlbnRPd25lcixSbj1Hby5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxPZT0wLEN0PW51bGwsdnQ9bnVsbCx6dD0wLHduPTAsVWE9VHIoMCksU3Q9MCxtcz1udWxsLCRyPTAsQ2Q9MCxjZj0wLFhpPW51bGwsZG49bnVsbCx1Zj0wLFhhPTEvMCxMbz1udWxsLGdkPSExLE5wPW51bGwsd3I9bnVsbCx6bD0hMSxtcj1udWxsLHlkPTAsSmk9MCxUcD1udWxsLFlsPS0xLHFsPTA7ZnVuY3Rpb24gbm4oKXtyZXR1cm4gT2UmNj9tdCgpOllsIT09LTE/WWw6WWw9bXQoKX1mdW5jdGlvbiBrcihlKXtyZXR1cm4gZS5tb2RlJjE/T2UmMiYmenQhPT0wP3p0Ji16dDpRTi50cmFuc2l0aW9uIT09bnVsbD8ocWw9PT0wJiYocWw9c3YoKSkscWwpOihlPVdlLGUhPT0wfHwoZT13aW5kb3cuZXZlbnQsZT1lPT09dm9pZCAwPzE2Om12KGUudHlwZSkpLGUpOjF9ZnVuY3Rpb24gb28oZSx0LG4sbyl7aWYoNTA8SmkpdGhyb3cgSmk9MCxUcD1udWxsLEVycm9yKHooMTg1KSk7aHMoZSxuLG8pLCghKE9lJjIpfHxlIT09Q3QpJiYoZT09PUN0JiYoIShPZSYyKSYmKENkfD1uKSxTdD09PTQmJnByKGUsenQpKSxmbihlLG8pLG49PT0xJiZPZT09PTAmJiEodC5tb2RlJjEpJiYoWGE9bXQoKSs1MDAsTmQmJkRyKCkpKX1mdW5jdGlvbiBmbihlLHQpe3ZhciBuPWUuY2FsbGJhY2tOb2RlO2VOKGUsdCk7dmFyIG89ZWQoZSxlPT09Q3Q/enQ6MCk7aWYobz09PTApbiE9PW51bGwmJkJnKG4pLGUuY2FsbGJhY2tOb2RlPW51bGwsZS5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZih0PW8mLW8sZS5jYWxsYmFja1ByaW9yaXR5IT09dCl7aWYobiE9bnVsbCYmQmcobiksdD09PTEpZS50YWc9PT0wP0pOKFB5LmJpbmQobnVsbCxlKSk6UnYoUHkuYmluZChudWxsLGUpKSxZTihmdW5jdGlvbigpeyEoT2UmNikmJkRyKCl9KSxuPW51bGw7ZWxzZXtzd2l0Y2gobHYobykpe2Nhc2UgMTpuPV9wO2JyZWFrO2Nhc2UgNDpuPWF2O2JyZWFrO2Nhc2UgMTY6bj1abDticmVhaztjYXNlIDUzNjg3MDkxMjpuPWl2O2JyZWFrO2RlZmF1bHQ6bj1abH1uPU9iKG4sRWIuYmluZChudWxsLGUpKX1lLmNhbGxiYWNrUHJpb3JpdHk9dCxlLmNhbGxiYWNrTm9kZT1ufX1mdW5jdGlvbiBFYihlLHQpe2lmKFlsPS0xLHFsPTAsT2UmNil0aHJvdyBFcnJvcih6KDMyNykpO3ZhciBuPWUuY2FsbGJhY2tOb2RlO2lmKEthKCkmJmUuY2FsbGJhY2tOb2RlIT09bilyZXR1cm4gbnVsbDt2YXIgbz1lZChlLGU9PT1DdD96dDowKTtpZihvPT09MClyZXR1cm4gbnVsbDtpZihvJjMwfHxvJmUuZXhwaXJlZExhbmVzfHx0KXQ9dmQoZSxvKTtlbHNle3Q9bzt2YXIgcj1PZTtPZXw9Mjt2YXIgYT1UYigpOyhDdCE9PWV8fHp0IT09dCkmJihMbz1udWxsLFhhPW10KCkrNTAwLEdyKGUsdCkpO2RvIHRyeXt2VCgpO2JyZWFrfWNhdGNoKHMpe05iKGUscyl9d2hpbGUoITApOyRwKCksaGQuY3VycmVudD1hLE9lPXIsdnQhPT1udWxsP3Q9MDooQ3Q9bnVsbCx6dD0wLHQ9U3QpfWlmKHQhPT0wKXtpZih0PT09MiYmKHI9WnUoZSksciE9PTAmJihvPXIsdD1EcChlLHIpKSksdD09PTEpdGhyb3cgbj1tcyxHcihlLDApLHByKGUsbyksZm4oZSxtdCgpKSxuO2lmKHQ9PT02KXByKGUsbyk7ZWxzZXtpZihyPWUuY3VycmVudC5hbHRlcm5hdGUsIShvJjMwKSYmIWdUKHIpJiYodD12ZChlLG8pLHQ9PT0yJiYoYT1adShlKSxhIT09MCYmKG89YSx0PURwKGUsYSkpKSx0PT09MSkpdGhyb3cgbj1tcyxHcihlLDApLHByKGUsbyksZm4oZSxtdCgpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1yLGUuZmluaXNoZWRMYW5lcz1vLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoeigzNDUpKTtjYXNlIDI6V3IoZSxkbixMbyk7YnJlYWs7Y2FzZSAzOmlmKHByKGUsbyksKG8mMTMwMDIzNDI0KT09PW8mJih0PXVmKzUwMC1tdCgpLDEwPHQpKXtpZihlZChlLDApIT09MClicmVhaztpZihyPWUuc3VzcGVuZGVkTGFuZXMsKHImbykhPT1vKXtubigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmcjticmVha31lLnRpbWVvdXRIYW5kbGU9c3AoV3IuYmluZChudWxsLGUsZG4sTG8pLHQpO2JyZWFrfVdyKGUsZG4sTG8pO2JyZWFrO2Nhc2UgNDppZihwcihlLG8pLChvJjQxOTQyNDApPT09bylicmVhaztmb3IodD1lLmV2ZW50VGltZXMscj0tMTswPG87KXt2YXIgaT0zMS1ubyhvKTthPTE8PGksaT10W2ldLGk+ciYmKHI9aSksbyY9fmF9aWYobz1yLG89bXQoKS1vLG89KDEyMD5vPzEyMDo0ODA+bz80ODA6MTA4MD5vPzEwODA6MTkyMD5vPzE5MjA6M2UzPm8/M2UzOjQzMjA+bz80MzIwOjE5NjAqaFQoby8xOTYwKSktbywxMDxvKXtlLnRpbWVvdXRIYW5kbGU9c3AoV3IuYmluZChudWxsLGUsZG4sTG8pLG8pO2JyZWFrfVdyKGUsZG4sTG8pO2JyZWFrO2Nhc2UgNTpXcihlLGRuLExvKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHooMzI5KSl9fX1yZXR1cm4gZm4oZSxtdCgpKSxlLmNhbGxiYWNrTm9kZT09PW4/RWIuYmluZChudWxsLGUpOm51bGx9ZnVuY3Rpb24gRHAoZSx0KXt2YXIgbj1YaTtyZXR1cm4gZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYoR3IoZSx0KS5mbGFnc3w9MjU2KSxlPXZkKGUsdCksZSE9PTImJih0PWRuLGRuPW4sdCE9PW51bGwmJkFwKHQpKSxlfWZ1bmN0aW9uIEFwKGUpe2RuPT09bnVsbD9kbj1lOmRuLnB1c2guYXBwbHkoZG4sZSl9ZnVuY3Rpb24gZ1QoZSl7Zm9yKHZhciB0PWU7Oyl7aWYodC5mbGFncyYxNjM4NCl7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuIT09bnVsbCYmKG49bi5zdG9yZXMsbiE9PW51bGwpKWZvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXt2YXIgcj1uW29dLGE9ci5nZXRTbmFwc2hvdDtyPXIudmFsdWU7dHJ5e2lmKCFybyhhKCkscikpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJm4hPT1udWxsKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBwcihlLHQpe2Zvcih0Jj1+Y2YsdCY9fkNkLGUuc3VzcGVuZGVkTGFuZXN8PXQsZS5waW5nZWRMYW5lcyY9fnQsZT1lLmV4cGlyYXRpb25UaW1lczswPHQ7KXt2YXIgbj0zMS1ubyh0KSxvPTE8PG47ZVtuXT0tMSx0Jj1+b319ZnVuY3Rpb24gUHkoZSl7aWYoT2UmNil0aHJvdyBFcnJvcih6KDMyNykpO0thKCk7dmFyIHQ9ZWQoZSwwKTtpZighKHQmMSkpcmV0dXJuIGZuKGUsbXQoKSksbnVsbDt2YXIgbj12ZChlLHQpO2lmKGUudGFnIT09MCYmbj09PTIpe3ZhciBvPVp1KGUpO28hPT0wJiYodD1vLG49RHAoZSxvKSl9aWYobj09PTEpdGhyb3cgbj1tcyxHcihlLDApLHByKGUsdCksZm4oZSxtdCgpKSxuO2lmKG49PT02KXRocm93IEVycm9yKHooMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsV3IoZSxkbixMbyksZm4oZSxtdCgpKSxudWxsfWZ1bmN0aW9uIHBmKGUsdCl7dmFyIG49T2U7T2V8PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7T2U9bixPZT09PTAmJihYYT1tdCgpKzUwMCxOZCYmRHIoKSl9fWZ1bmN0aW9uIFhyKGUpe21yIT09bnVsbCYmbXIudGFnPT09MCYmIShPZSY2KSYmS2EoKTt2YXIgdD1PZTtPZXw9MTt2YXIgbj1Sbi50cmFuc2l0aW9uLG89V2U7dHJ5e2lmKFJuLnRyYW5zaXRpb249bnVsbCxXZT0xLGUpcmV0dXJuIGUoKX1maW5hbGx5e1dlPW8sUm4udHJhbnNpdGlvbj1uLE9lPXQsIShPZSY2KSYmRHIoKX19ZnVuY3Rpb24gZmYoKXt3bj1VYS5jdXJyZW50LFhlKFVhKX1mdW5jdGlvbiBHcihlLHQpe2UuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTA7dmFyIG49ZS50aW1lb3V0SGFuZGxlO2lmKG4hPT0tMSYmKGUudGltZW91dEhhbmRsZT0tMSxqTihuKSksdnQhPT1udWxsKWZvcihuPXZ0LnJldHVybjtuIT09bnVsbDspe3ZhciBvPW47c3dpdGNoKGpwKG8pLG8udGFnKXtjYXNlIDE6bz1vLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMsbyE9bnVsbCYmYWQoKTticmVhaztjYXNlIDM6cWEoKSxYZSh1biksWGUocXQpLHRmKCk7YnJlYWs7Y2FzZSA1OmVmKG8pO2JyZWFrO2Nhc2UgNDpxYSgpO2JyZWFrO2Nhc2UgMTM6WGUoYXQpO2JyZWFrO2Nhc2UgMTk6WGUoYXQpO2JyZWFrO2Nhc2UgMTA6WHAoby50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6ZmYoKX1uPW4ucmV0dXJufWlmKEN0PWUsdnQ9ZT14cihlLmN1cnJlbnQsbnVsbCksenQ9d249dCxTdD0wLG1zPW51bGwsY2Y9Q2Q9JHI9MCxkbj1YaT1udWxsLEhyIT09bnVsbCl7Zm9yKHQ9MDt0PEhyLmxlbmd0aDt0KyspaWYobj1Iclt0XSxvPW4uaW50ZXJsZWF2ZWQsbyE9PW51bGwpe24uaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgcj1vLm5leHQsYT1uLnBlbmRpbmc7aWYoYSE9PW51bGwpe3ZhciBpPWEubmV4dDthLm5leHQ9cixvLm5leHQ9aX1uLnBlbmRpbmc9b31Icj1udWxsfXJldHVybiBlfWZ1bmN0aW9uIE5iKGUsdCl7ZG97dmFyIG49dnQ7dHJ5e2lmKCRwKCksR2wuY3VycmVudD1tZCxmZCl7Zm9yKHZhciBvPWl0Lm1lbW9pemVkU3RhdGU7byE9PW51bGw7KXt2YXIgcj1vLnF1ZXVlO3IhPT1udWxsJiYoci5wZW5kaW5nPW51bGwpLG89by5uZXh0fWZkPSExfWlmKHFyPTAsQXQ9eHQ9aXQ9bnVsbCxxaT0hMSx1cz0wLGRmLmN1cnJlbnQ9bnVsbCxuPT09bnVsbHx8bi5yZXR1cm49PT1udWxsKXtTdD0xLG1zPXQsdnQ9bnVsbDticmVha31lOnt2YXIgYT1lLGk9bi5yZXR1cm4scz1uLGw9dDtpZih0PXp0LHMuZmxhZ3N8PTMyNzY4LGwhPT1udWxsJiZ0eXBlb2YgbD09Im9iamVjdCImJnR5cGVvZiBsLnRoZW49PSJmdW5jdGlvbiIpe3ZhciBkPWwsYz1zLHU9Yy50YWc7aWYoIShjLm1vZGUmMSkmJih1PT09MHx8dT09PTExfHx1PT09MTUpKXt2YXIgcD1jLmFsdGVybmF0ZTtwPyhjLnVwZGF0ZVF1ZXVlPXAudXBkYXRlUXVldWUsYy5tZW1vaXplZFN0YXRlPXAubWVtb2l6ZWRTdGF0ZSxjLmxhbmVzPXAubGFuZXMpOihjLnVwZGF0ZVF1ZXVlPW51bGwsYy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBmPWt5KGkpO2lmKGYhPT1udWxsKXtmLmZsYWdzJj0tMjU3LHh5KGYsaSxzLGEsdCksZi5tb2RlJjEmJnd5KGEsZCx0KSx0PWYsbD1kO3ZhciBtPXQudXBkYXRlUXVldWU7aWYobT09PW51bGwpe3ZhciBnPW5ldyBTZXQ7Zy5hZGQobCksdC51cGRhdGVRdWV1ZT1nfWVsc2UgbS5hZGQobCk7YnJlYWsgZX1lbHNle2lmKCEodCYxKSl7d3koYSxkLHQpLG1mKCk7YnJlYWsgZX1sPUVycm9yKHooNDI2KSl9fWVsc2UgaWYoZXQmJnMubW9kZSYxKXt2YXIgdz1reShpKTtpZih3IT09bnVsbCl7ISh3LmZsYWdzJjY1NTM2KSYmKHcuZmxhZ3N8PTI1NikseHkodyxpLHMsYSx0KSxZcCgkYShsLHMpKTticmVhayBlfX1hPWw9JGEobCxzKSxTdCE9PTQmJihTdD0yKSxYaT09PW51bGw/WGk9W2FdOlhpLnB1c2goYSksYT1pO2Rve3N3aXRjaChhLnRhZyl7Y2FzZSAzOmEuZmxhZ3N8PTY1NTM2LHQmPS10LGEubGFuZXN8PXQ7dmFyIHY9bGIoYSxsLHQpO215KGEsdik7YnJlYWsgZTtjYXNlIDE6cz1sO3ZhciB5PWEudHlwZSxiPWEuc3RhdGVOb2RlO2lmKCEoYS5mbGFncyYxMjgpJiYodHlwZW9mIHkuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHxiIT09bnVsbCYmdHlwZW9mIGIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJih3cj09PW51bGx8fCF3ci5oYXMoYikpKSl7YS5mbGFnc3w9NjU1MzYsdCY9LXQsYS5sYW5lc3w9dDt2YXIgaD1kYihhLHMsdCk7bXkoYSxoKTticmVhayBlfX1hPWEucmV0dXJufXdoaWxlKGEhPT1udWxsKX1BYihuKX1jYXRjaChTKXt0PVMsdnQ9PT1uJiZuIT09bnVsbCYmKHZ0PW49bi5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKCEwKX1mdW5jdGlvbiBUYigpe3ZhciBlPWhkLmN1cnJlbnQ7cmV0dXJuIGhkLmN1cnJlbnQ9bWQsZT09PW51bGw/bWQ6ZX1mdW5jdGlvbiBtZigpeyhTdD09PTB8fFN0PT09M3x8U3Q9PT0yKSYmKFN0PTQpLEN0PT09bnVsbHx8ISgkciYyNjg0MzU0NTUpJiYhKENkJjI2ODQzNTQ1NSl8fHByKEN0LHp0KX1mdW5jdGlvbiB2ZChlLHQpe3ZhciBuPU9lO09lfD0yO3ZhciBvPVRiKCk7KEN0IT09ZXx8enQhPT10KSYmKExvPW51bGwsR3IoZSx0KSk7ZG8gdHJ5e3lUKCk7YnJlYWt9Y2F0Y2gocil7TmIoZSxyKX13aGlsZSghMCk7aWYoJHAoKSxPZT1uLGhkLmN1cnJlbnQ9byx2dCE9PW51bGwpdGhyb3cgRXJyb3IoeigyNjEpKTtyZXR1cm4gQ3Q9bnVsbCx6dD0wLFN0fWZ1bmN0aW9uIHlUKCl7Zm9yKDt2dCE9PW51bGw7KURiKHZ0KX1mdW5jdGlvbiB2VCgpe2Zvcig7dnQhPT1udWxsJiYhVkUoKTspRGIodnQpfWZ1bmN0aW9uIERiKGUpe3ZhciB0PU1iKGUuYWx0ZXJuYXRlLGUsd24pO2UubWVtb2l6ZWRQcm9wcz1lLnBlbmRpbmdQcm9wcyx0PT09bnVsbD9BYihlKTp2dD10LGRmLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBBYihlKXt2YXIgdD1lO2Rve3ZhciBuPXQuYWx0ZXJuYXRlO2lmKGU9dC5yZXR1cm4sdC5mbGFncyYzMjc2OCl7aWYobj11VChuLHQpLG4hPT1udWxsKXtuLmZsYWdzJj0zMjc2Nyx2dD1uO3JldHVybn1pZihlIT09bnVsbCllLmZsYWdzfD0zMjc2OCxlLnN1YnRyZWVGbGFncz0wLGUuZGVsZXRpb25zPW51bGw7ZWxzZXtTdD02LHZ0PW51bGw7cmV0dXJufX1lbHNlIGlmKG49Y1Qobix0LHduKSxuIT09bnVsbCl7dnQ9bjtyZXR1cm59aWYodD10LnNpYmxpbmcsdCE9PW51bGwpe3Z0PXQ7cmV0dXJufXZ0PXQ9ZX13aGlsZSh0IT09bnVsbCk7U3Q9PT0wJiYoU3Q9NSl9ZnVuY3Rpb24gV3IoZSx0LG4pe3ZhciBvPVdlLHI9Um4udHJhbnNpdGlvbjt0cnl7Um4udHJhbnNpdGlvbj1udWxsLFdlPTEsYlQoZSx0LG4sbyl9ZmluYWxseXtSbi50cmFuc2l0aW9uPXIsV2U9b31yZXR1cm4gbnVsbH1mdW5jdGlvbiBiVChlLHQsbixvKXtkbyBLYSgpO3doaWxlKG1yIT09bnVsbCk7aWYoT2UmNil0aHJvdyBFcnJvcih6KDMyNykpO249ZS5maW5pc2hlZFdvcms7dmFyIHI9ZS5maW5pc2hlZExhbmVzO2lmKG49PT1udWxsKXJldHVybiBudWxsO2lmKGUuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTAsbj09PWUuY3VycmVudCl0aHJvdyBFcnJvcih6KDE3NykpO2UuY2FsbGJhY2tOb2RlPW51bGwsZS5jYWxsYmFja1ByaW9yaXR5PTA7dmFyIGE9bi5sYW5lc3xuLmNoaWxkTGFuZXM7aWYodE4oZSxhKSxlPT09Q3QmJih2dD1DdD1udWxsLHp0PTApLCEobi5zdWJ0cmVlRmxhZ3MmMjA2NCkmJiEobi5mbGFncyYyMDY0KXx8emx8fCh6bD0hMCxPYihabCxmdW5jdGlvbigpe3JldHVybiBLYSgpLG51bGx9KSksYT0obi5mbGFncyYxNTk5MCkhPT0wLG4uc3VidHJlZUZsYWdzJjE1OTkwfHxhKXthPVJuLnRyYW5zaXRpb24sUm4udHJhbnNpdGlvbj1udWxsO3ZhciBpPVdlO1dlPTE7dmFyIHM9T2U7T2V8PTQsZGYuY3VycmVudD1udWxsLGZUKGUsbikseGIobixlKSxCTihhcCksdGQ9ISFycCxhcD1ycD1udWxsLGUuY3VycmVudD1uLG1UKG4sZSxyKSxqRSgpLE9lPXMsV2U9aSxSbi50cmFuc2l0aW9uPWF9ZWxzZSBlLmN1cnJlbnQ9bjtpZih6bCYmKHpsPSExLG1yPWUseWQ9ciksYT1lLnBlbmRpbmdMYW5lcyxhPT09MCYmKHdyPW51bGwpLCRFKG4uc3RhdGVOb2RlLG8pLGZuKGUsbXQoKSksdCE9PW51bGwpZm9yKG89ZS5vblJlY292ZXJhYmxlRXJyb3Isbj0wO248dC5sZW5ndGg7bisrKXI9dFtuXSxvKHIudmFsdWUse2NvbXBvbmVudFN0YWNrOnIuc3RhY2ssZGlnZXN0OnIuZGlnZXN0fSk7aWYoZ2QpdGhyb3cgZ2Q9ITEsZT1OcCxOcD1udWxsLGU7cmV0dXJuIHlkJjEmJmUudGFnIT09MCYmS2EoKSxhPWUucGVuZGluZ0xhbmVzLGEmMT9lPT09VHA/SmkrKzooSmk9MCxUcD1lKTpKaT0wLERyKCksbnVsbH1mdW5jdGlvbiBLYSgpe2lmKG1yIT09bnVsbCl7dmFyIGU9bHYoeWQpLHQ9Um4udHJhbnNpdGlvbixuPVdlO3RyeXtpZihSbi50cmFuc2l0aW9uPW51bGwsV2U9MTY+ZT8xNjplLG1yPT09bnVsbCl2YXIgbz0hMTtlbHNle2lmKGU9bXIsbXI9bnVsbCx5ZD0wLE9lJjYpdGhyb3cgRXJyb3IoeigzMzEpKTt2YXIgcj1PZTtmb3IoT2V8PTQsJD1lLmN1cnJlbnQ7JCE9PW51bGw7KXt2YXIgYT0kLGk9YS5jaGlsZDtpZigkLmZsYWdzJjE2KXt2YXIgcz1hLmRlbGV0aW9ucztpZihzIT09bnVsbCl7Zm9yKHZhciBsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciBkPXNbbF07Zm9yKCQ9ZDskIT09bnVsbDspe3ZhciBjPSQ7c3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OiRpKDgsYyxhKX12YXIgdT1jLmNoaWxkO2lmKHUhPT1udWxsKXUucmV0dXJuPWMsJD11O2Vsc2UgZm9yKDskIT09bnVsbDspe2M9JDt2YXIgcD1jLnNpYmxpbmcsZj1jLnJldHVybjtpZihiYihjKSxjPT09ZCl7JD1udWxsO2JyZWFrfWlmKHAhPT1udWxsKXtwLnJldHVybj1mLCQ9cDticmVha30kPWZ9fX12YXIgbT1hLmFsdGVybmF0ZTtpZihtIT09bnVsbCl7dmFyIGc9bS5jaGlsZDtpZihnIT09bnVsbCl7bS5jaGlsZD1udWxsO2Rve3ZhciB3PWcuc2libGluZztnLnNpYmxpbmc9bnVsbCxnPXd9d2hpbGUoZyE9PW51bGwpfX0kPWF9fWlmKGEuc3VidHJlZUZsYWdzJjIwNjQmJmkhPT1udWxsKWkucmV0dXJuPWEsJD1pO2Vsc2UgZTpmb3IoOyQhPT1udWxsOyl7aWYoYT0kLGEuZmxhZ3MmMjA0OClzd2l0Y2goYS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6JGkoOSxhLGEucmV0dXJuKX12YXIgdj1hLnNpYmxpbmc7aWYodiE9PW51bGwpe3YucmV0dXJuPWEucmV0dXJuLCQ9djticmVhayBlfSQ9YS5yZXR1cm59fXZhciB5PWUuY3VycmVudDtmb3IoJD15OyQhPT1udWxsOyl7aT0kO3ZhciBiPWkuY2hpbGQ7aWYoaS5zdWJ0cmVlRmxhZ3MmMjA2NCYmYiE9PW51bGwpYi5yZXR1cm49aSwkPWI7ZWxzZSBlOmZvcihpPXk7JCE9PW51bGw7KXtpZihzPSQscy5mbGFncyYyMDQ4KXRyeXtzd2l0Y2gocy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6QWQoOSxzKX19Y2F0Y2goUyl7ZHQocyxzLnJldHVybixTKX1pZihzPT09aSl7JD1udWxsO2JyZWFrIGV9dmFyIGg9cy5zaWJsaW5nO2lmKGghPT1udWxsKXtoLnJldHVybj1zLnJldHVybiwkPWg7YnJlYWsgZX0kPXMucmV0dXJufX1pZihPZT1yLERyKCkseG8mJnR5cGVvZiB4by5vblBvc3RDb21taXRGaWJlclJvb3Q9PSJmdW5jdGlvbiIpdHJ5e3hvLm9uUG9zdENvbW1pdEZpYmVyUm9vdCh3ZCxlKX1jYXRjaHt9bz0hMH1yZXR1cm4gb31maW5hbGx5e1dlPW4sUm4udHJhbnNpdGlvbj10fX1yZXR1cm4hMX1mdW5jdGlvbiBMeShlLHQsbil7dD0kYShuLHQpLHQ9bGIoZSx0LDEpLGU9YnIoZSx0LDEpLHQ9bm4oKSxlIT09bnVsbCYmKGhzKGUsMSx0KSxmbihlLHQpKX1mdW5jdGlvbiBkdChlLHQsbil7aWYoZS50YWc9PT0zKUx5KGUsZSxuKTtlbHNlIGZvcig7dCE9PW51bGw7KXtpZih0LnRhZz09PTMpe0x5KHQsZSxuKTticmVha31lbHNlIGlmKHQudGFnPT09MSl7dmFyIG89dC5zdGF0ZU5vZGU7aWYodHlwZW9mIHQudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYod3I9PT1udWxsfHwhd3IuaGFzKG8pKSl7ZT0kYShuLGUpLGU9ZGIodCxlLDEpLHQ9YnIodCxlLDEpLGU9bm4oKSx0IT09bnVsbCYmKGhzKHQsMSxlKSxmbih0LGUpKTticmVha319dD10LnJldHVybn19ZnVuY3Rpb24gd1QoZSx0LG4pe3ZhciBvPWUucGluZ0NhY2hlO28hPT1udWxsJiZvLmRlbGV0ZSh0KSx0PW5uKCksZS5waW5nZWRMYW5lc3w9ZS5zdXNwZW5kZWRMYW5lcyZuLEN0PT09ZSYmKHp0Jm4pPT09biYmKFN0PT09NHx8U3Q9PT0zJiYoenQmMTMwMDIzNDI0KT09PXp0JiY1MDA+bXQoKS11Zj9HcihlLDApOmNmfD1uKSxmbihlLHQpfWZ1bmN0aW9uIENiKGUsdCl7dD09PTAmJihlLm1vZGUmMT8odD1ObCxObDw8PTEsIShObCYxMzAwMjM0MjQpJiYoTmw9NDE5NDMwNCkpOnQ9MSk7dmFyIG49bm4oKTtlPUhvKGUsdCksZSE9PW51bGwmJihocyhlLHQsbiksZm4oZSxuKSl9ZnVuY3Rpb24ga1QoZSl7dmFyIHQ9ZS5tZW1vaXplZFN0YXRlLG49MDt0IT09bnVsbCYmKG49dC5yZXRyeUxhbmUpLENiKGUsbil9ZnVuY3Rpb24geFQoZSx0KXt2YXIgbj0wO3N3aXRjaChlLnRhZyl7Y2FzZSAxMzp2YXIgbz1lLnN0YXRlTm9kZSxyPWUubWVtb2l6ZWRTdGF0ZTtyIT09bnVsbCYmKG49ci5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6bz1lLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHooMzE0KSl9byE9PW51bGwmJm8uZGVsZXRlKHQpLENiKGUsbil9dmFyIE1iO01iPWZ1bmN0aW9uKGUsdCxuKXtpZihlIT09bnVsbClpZihlLm1lbW9pemVkUHJvcHMhPT10LnBlbmRpbmdQcm9wc3x8dW4uY3VycmVudCljbj0hMDtlbHNle2lmKCEoZS5sYW5lcyZuKSYmISh0LmZsYWdzJjEyOCkpcmV0dXJuIGNuPSExLGRUKGUsdCxuKTtjbj0hIShlLmZsYWdzJjEzMTA3Mil9ZWxzZSBjbj0hMSxldCYmdC5mbGFncyYxMDQ4NTc2JiZQdih0LGxkLHQuaW5kZXgpO3N3aXRjaCh0LmxhbmVzPTAsdC50YWcpe2Nhc2UgMjp2YXIgbz10LnR5cGU7amwoZSx0KSxlPXQucGVuZGluZ1Byb3BzO3ZhciByPVZhKHQscXQuY3VycmVudCk7SGEodCxuKSxyPW9mKG51bGwsdCxvLGUscixuKTt2YXIgYT1yZigpO3JldHVybiB0LmZsYWdzfD0xLHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJnR5cGVvZiByLnJlbmRlcj09ImZ1bmN0aW9uIiYmci4kJHR5cGVvZj09PXZvaWQgMD8odC50YWc9MSx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwscG4obyk/KGE9ITAsaWQodCkpOmE9ITEsdC5tZW1vaXplZFN0YXRlPXIuc3RhdGUhPT1udWxsJiZyLnN0YXRlIT09dm9pZCAwP3Iuc3RhdGU6bnVsbCxRcCh0KSxyLnVwZGF0ZXI9RGQsdC5zdGF0ZU5vZGU9cixyLl9yZWFjdEludGVybmFscz10LG1wKHQsbyxlLG4pLHQ9eXAobnVsbCx0LG8sITAsYSxuKSk6KHQudGFnPTAsZXQmJmEmJlZwKHQpLHRuKG51bGwsdCxyLG4pLHQ9dC5jaGlsZCksdDtjYXNlIDE2Om89dC5lbGVtZW50VHlwZTtlOntzd2l0Y2goamwoZSx0KSxlPXQucGVuZGluZ1Byb3BzLHI9by5faW5pdCxvPXIoby5fcGF5bG9hZCksdC50eXBlPW8scj10LnRhZz1FVChvKSxlPVpuKG8sZSkscil7Y2FzZSAwOnQ9Z3AobnVsbCx0LG8sZSxuKTticmVhayBlO2Nhc2UgMTp0PU55KG51bGwsdCxvLGUsbik7YnJlYWsgZTtjYXNlIDExOnQ9U3kobnVsbCx0LG8sZSxuKTticmVhayBlO2Nhc2UgMTQ6dD1FeShudWxsLHQsbyxabihvLnR5cGUsZSksbik7YnJlYWsgZX10aHJvdyBFcnJvcih6KDMwNixvLCIiKSl9cmV0dXJuIHQ7Y2FzZSAwOnJldHVybiBvPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLHI9dC5lbGVtZW50VHlwZT09PW8/cjpabihvLHIpLGdwKGUsdCxvLHIsbik7Y2FzZSAxOnJldHVybiBvPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLHI9dC5lbGVtZW50VHlwZT09PW8/cjpabihvLHIpLE55KGUsdCxvLHIsbik7Y2FzZSAzOmU6e2lmKGZiKHQpLGU9PT1udWxsKXRocm93IEVycm9yKHooMzg3KSk7bz10LnBlbmRpbmdQcm9wcyxhPXQubWVtb2l6ZWRTdGF0ZSxyPWEuZWxlbWVudCxXdihlLHQpLHVkKHQsbyxudWxsLG4pO3ZhciBpPXQubWVtb2l6ZWRTdGF0ZTtpZihvPWkuZWxlbWVudCxhLmlzRGVoeWRyYXRlZClpZihhPXtlbGVtZW50Om8saXNEZWh5ZHJhdGVkOiExLGNhY2hlOmkuY2FjaGUscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczppLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsdHJhbnNpdGlvbnM6aS50cmFuc2l0aW9uc30sdC51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9YSx0Lm1lbW9pemVkU3RhdGU9YSx0LmZsYWdzJjI1Nil7cj0kYShFcnJvcih6KDQyMykpLHQpLHQ9VHkoZSx0LG8sbixyKTticmVhayBlfWVsc2UgaWYobyE9PXIpe3I9JGEoRXJyb3Ioeig0MjQpKSx0KSx0PVR5KGUsdCxvLG4scik7YnJlYWsgZX1lbHNlIGZvcihrbj12cih0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLHhuPXQsZXQ9ITAsdG89bnVsbCxuPUZ2KHQsbnVsbCxvLG4pLHQuY2hpbGQ9bjtuOyluLmZsYWdzPW4uZmxhZ3MmLTN8NDA5NixuPW4uc2libGluZztlbHNle2lmKGphKCksbz09PXIpe3Q9S28oZSx0LG4pO2JyZWFrIGV9dG4oZSx0LG8sbil9dD10LmNoaWxkfXJldHVybiB0O2Nhc2UgNTpyZXR1cm4gQnYodCksZT09PW51bGwmJnVwKHQpLG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMsYT1lIT09bnVsbD9lLm1lbW9pemVkUHJvcHM6bnVsbCxpPXIuY2hpbGRyZW4saXAobyxyKT9pPW51bGw6YSE9PW51bGwmJmlwKG8sYSkmJih0LmZsYWdzfD0zMikscGIoZSx0KSx0bihlLHQsaSxuKSx0LmNoaWxkO2Nhc2UgNjpyZXR1cm4gZT09PW51bGwmJnVwKHQpLG51bGw7Y2FzZSAxMzpyZXR1cm4gbWIoZSx0LG4pO2Nhc2UgNDpyZXR1cm4gWnAodCx0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxvPXQucGVuZGluZ1Byb3BzLGU9PT1udWxsP3QuY2hpbGQ9WWEodCxudWxsLG8sbik6dG4oZSx0LG8sbiksdC5jaGlsZDtjYXNlIDExOnJldHVybiBvPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLHI9dC5lbGVtZW50VHlwZT09PW8/cjpabihvLHIpLFN5KGUsdCxvLHIsbik7Y2FzZSA3OnJldHVybiB0bihlLHQsdC5wZW5kaW5nUHJvcHMsbiksdC5jaGlsZDtjYXNlIDg6cmV0dXJuIHRuKGUsdCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixuKSx0LmNoaWxkO2Nhc2UgMTI6cmV0dXJuIHRuKGUsdCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixuKSx0LmNoaWxkO2Nhc2UgMTA6ZTp7aWYobz10LnR5cGUuX2NvbnRleHQscj10LnBlbmRpbmdQcm9wcyxhPXQubWVtb2l6ZWRQcm9wcyxpPXIudmFsdWUsamUoZGQsby5fY3VycmVudFZhbHVlKSxvLl9jdXJyZW50VmFsdWU9aSxhIT09bnVsbClpZihybyhhLnZhbHVlLGkpKXtpZihhLmNoaWxkcmVuPT09ci5jaGlsZHJlbiYmIXVuLmN1cnJlbnQpe3Q9S28oZSx0LG4pO2JyZWFrIGV9fWVsc2UgZm9yKGE9dC5jaGlsZCxhIT09bnVsbCYmKGEucmV0dXJuPXQpO2EhPT1udWxsOyl7dmFyIHM9YS5kZXBlbmRlbmNpZXM7aWYocyE9PW51bGwpe2k9YS5jaGlsZDtmb3IodmFyIGw9cy5maXJzdENvbnRleHQ7bCE9PW51bGw7KXtpZihsLmNvbnRleHQ9PT1vKXtpZihhLnRhZz09PTEpe2w9em8oLTEsbiYtbiksbC50YWc9Mjt2YXIgZD1hLnVwZGF0ZVF1ZXVlO2lmKGQhPT1udWxsKXtkPWQuc2hhcmVkO3ZhciBjPWQucGVuZGluZztjPT09bnVsbD9sLm5leHQ9bDoobC5uZXh0PWMubmV4dCxjLm5leHQ9bCksZC5wZW5kaW5nPWx9fWEubGFuZXN8PW4sbD1hLmFsdGVybmF0ZSxsIT09bnVsbCYmKGwubGFuZXN8PW4pLHBwKGEucmV0dXJuLG4sdCkscy5sYW5lc3w9bjticmVha31sPWwubmV4dH19ZWxzZSBpZihhLnRhZz09PTEwKWk9YS50eXBlPT09dC50eXBlP251bGw6YS5jaGlsZDtlbHNlIGlmKGEudGFnPT09MTgpe2lmKGk9YS5yZXR1cm4saT09PW51bGwpdGhyb3cgRXJyb3IoeigzNDEpKTtpLmxhbmVzfD1uLHM9aS5hbHRlcm5hdGUscyE9PW51bGwmJihzLmxhbmVzfD1uKSxwcChpLG4sdCksaT1hLnNpYmxpbmd9ZWxzZSBpPWEuY2hpbGQ7aWYoaSE9PW51bGwpaS5yZXR1cm49YTtlbHNlIGZvcihpPWE7aSE9PW51bGw7KXtpZihpPT09dCl7aT1udWxsO2JyZWFrfWlmKGE9aS5zaWJsaW5nLGEhPT1udWxsKXthLnJldHVybj1pLnJldHVybixpPWE7YnJlYWt9aT1pLnJldHVybn1hPWl9dG4oZSx0LHIuY2hpbGRyZW4sbiksdD10LmNoaWxkfXJldHVybiB0O2Nhc2UgOTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixIYSh0LG4pLHI9UG4ociksbz1vKHIpLHQuZmxhZ3N8PTEsdG4oZSx0LG8sbiksdC5jaGlsZDtjYXNlIDE0OnJldHVybiBvPXQudHlwZSxyPVpuKG8sdC5wZW5kaW5nUHJvcHMpLHI9Wm4oby50eXBlLHIpLEV5KGUsdCxvLHIsbik7Y2FzZSAxNTpyZXR1cm4gY2IoZSx0LHQudHlwZSx0LnBlbmRpbmdQcm9wcyxuKTtjYXNlIDE3OnJldHVybiBvPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLHI9dC5lbGVtZW50VHlwZT09PW8/cjpabihvLHIpLGpsKGUsdCksdC50YWc9MSxwbihvKT8oZT0hMCxpZCh0KSk6ZT0hMSxIYSh0LG4pLHNiKHQsbyxyKSxtcCh0LG8scixuKSx5cChudWxsLHQsbywhMCxlLG4pO2Nhc2UgMTk6cmV0dXJuIGhiKGUsdCxuKTtjYXNlIDIyOnJldHVybiB1YihlLHQsbil9dGhyb3cgRXJyb3IoeigxNTYsdC50YWcpKX07ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gcnYoZSx0KX1mdW5jdGlvbiBTVChlLHQsbixvKXt0aGlzLnRhZz1lLHRoaXMua2V5PW4sdGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbCx0aGlzLmluZGV4PTAsdGhpcy5yZWY9bnVsbCx0aGlzLnBlbmRpbmdQcm9wcz10LHRoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsLHRoaXMubW9kZT1vLHRoaXMuc3VidHJlZUZsYWdzPXRoaXMuZmxhZ3M9MCx0aGlzLmRlbGV0aW9ucz1udWxsLHRoaXMuY2hpbGRMYW5lcz10aGlzLmxhbmVzPTAsdGhpcy5hbHRlcm5hdGU9bnVsbH1mdW5jdGlvbiBJbihlLHQsbixvKXtyZXR1cm4gbmV3IFNUKGUsdCxuLG8pfWZ1bmN0aW9uIGhmKGUpe3JldHVybiBlPWUucHJvdG90eXBlLCEoIWV8fCFlLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIEVUKGUpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBoZihlKT8xOjA7aWYoZSE9bnVsbCl7aWYoZT1lLiQkdHlwZW9mLGU9PT1ScClyZXR1cm4gMTE7aWYoZT09PVBwKXJldHVybiAxNH1yZXR1cm4gMn1mdW5jdGlvbiB4cihlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlO3JldHVybiBuPT09bnVsbD8obj1JbihlLnRhZyx0LGUua2V5LGUubW9kZSksbi5lbGVtZW50VHlwZT1lLmVsZW1lbnRUeXBlLG4udHlwZT1lLnR5cGUsbi5zdGF0ZU5vZGU9ZS5zdGF0ZU5vZGUsbi5hbHRlcm5hdGU9ZSxlLmFsdGVybmF0ZT1uKToobi5wZW5kaW5nUHJvcHM9dCxuLnR5cGU9ZS50eXBlLG4uZmxhZ3M9MCxuLnN1YnRyZWVGbGFncz0wLG4uZGVsZXRpb25zPW51bGwpLG4uZmxhZ3M9ZS5mbGFncyYxNDY4MDA2NCxuLmNoaWxkTGFuZXM9ZS5jaGlsZExhbmVzLG4ubGFuZXM9ZS5sYW5lcyxuLmNoaWxkPWUuY2hpbGQsbi5tZW1vaXplZFByb3BzPWUubWVtb2l6ZWRQcm9wcyxuLm1lbW9pemVkU3RhdGU9ZS5tZW1vaXplZFN0YXRlLG4udXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0PWUuZGVwZW5kZW5jaWVzLG4uZGVwZW5kZW5jaWVzPXQ9PT1udWxsP251bGw6e2xhbmVzOnQubGFuZXMsZmlyc3RDb250ZXh0OnQuZmlyc3RDb250ZXh0fSxuLnNpYmxpbmc9ZS5zaWJsaW5nLG4uaW5kZXg9ZS5pbmRleCxuLnJlZj1lLnJlZixufWZ1bmN0aW9uICRsKGUsdCxuLG8scixhKXt2YXIgaT0yO2lmKG89ZSx0eXBlb2YgZT09ImZ1bmN0aW9uIiloZihlKSYmKGk9MSk7ZWxzZSBpZih0eXBlb2YgZT09InN0cmluZyIpaT01O2Vsc2UgZTpzd2l0Y2goZSl7Y2FzZSBEYTpyZXR1cm4gVnIobi5jaGlsZHJlbixyLGEsdCk7Y2FzZSBJcDppPTgscnw9ODticmVhaztjYXNlIEZ1OnJldHVybiBlPUluKDEyLG4sdCxyfDIpLGUuZWxlbWVudFR5cGU9RnUsZS5sYW5lcz1hLGU7Y2FzZSB6dTpyZXR1cm4gZT1JbigxMyxuLHQsciksZS5lbGVtZW50VHlwZT16dSxlLmxhbmVzPWEsZTtjYXNlIFd1OnJldHVybiBlPUluKDE5LG4sdCxyKSxlLmVsZW1lbnRUeXBlPVd1LGUubGFuZXM9YSxlO2Nhc2UgQnk6cmV0dXJuIE1kKG4scixhLHQpO2RlZmF1bHQ6aWYodHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbClzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSB6eTppPTEwO2JyZWFrIGU7Y2FzZSBXeTppPTk7YnJlYWsgZTtjYXNlIFJwOmk9MTE7YnJlYWsgZTtjYXNlIFBwOmk9MTQ7YnJlYWsgZTtjYXNlIGRyOmk9MTYsbz1udWxsO2JyZWFrIGV9dGhyb3cgRXJyb3IoeigxMzAsZT09bnVsbD9lOnR5cGVvZiBlLCIiKSl9cmV0dXJuIHQ9SW4oaSxuLHQsciksdC5lbGVtZW50VHlwZT1lLHQudHlwZT1vLHQubGFuZXM9YSx0fWZ1bmN0aW9uIFZyKGUsdCxuLG8pe3JldHVybiBlPUluKDcsZSxvLHQpLGUubGFuZXM9bixlfWZ1bmN0aW9uIE1kKGUsdCxuLG8pe3JldHVybiBlPUluKDIyLGUsbyx0KSxlLmVsZW1lbnRUeXBlPUJ5LGUubGFuZXM9bixlLnN0YXRlTm9kZT17aXNIaWRkZW46ITF9LGV9ZnVuY3Rpb24gTHUoZSx0LG4pe3JldHVybiBlPUluKDYsZSxudWxsLHQpLGUubGFuZXM9bixlfWZ1bmN0aW9uIF91KGUsdCxuKXtyZXR1cm4gdD1Jbig0LGUuY2hpbGRyZW4hPT1udWxsP2UuY2hpbGRyZW46W10sZS5rZXksdCksdC5sYW5lcz1uLHQuc3RhdGVOb2RlPXtjb250YWluZXJJbmZvOmUuY29udGFpbmVySW5mbyxwZW5kaW5nQ2hpbGRyZW46bnVsbCxpbXBsZW1lbnRhdGlvbjplLmltcGxlbWVudGF0aW9ufSx0fWZ1bmN0aW9uIE5UKGUsdCxuLG8scil7dGhpcy50YWc9dCx0aGlzLmNvbnRhaW5lckluZm89ZSx0aGlzLmZpbmlzaGVkV29yaz10aGlzLnBpbmdDYWNoZT10aGlzLmN1cnJlbnQ9dGhpcy5wZW5kaW5nQ2hpbGRyZW49bnVsbCx0aGlzLnRpbWVvdXRIYW5kbGU9LTEsdGhpcy5jYWxsYmFja05vZGU9dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9bnVsbCx0aGlzLmNhbGxiYWNrUHJpb3JpdHk9MCx0aGlzLmV2ZW50VGltZXM9YnUoMCksdGhpcy5leHBpcmF0aW9uVGltZXM9YnUoLTEpLHRoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5maW5pc2hlZExhbmVzPXRoaXMubXV0YWJsZVJlYWRMYW5lcz10aGlzLmV4cGlyZWRMYW5lcz10aGlzLnBpbmdlZExhbmVzPXRoaXMuc3VzcGVuZGVkTGFuZXM9dGhpcy5wZW5kaW5nTGFuZXM9MCx0aGlzLmVudGFuZ2xlbWVudHM9YnUoMCksdGhpcy5pZGVudGlmaWVyUHJlZml4PW8sdGhpcy5vblJlY292ZXJhYmxlRXJyb3I9cix0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9bnVsbH1mdW5jdGlvbiBnZihlLHQsbixvLHIsYSxpLHMsbCl7cmV0dXJuIGU9bmV3IE5UKGUsdCxuLHMsbCksdD09PTE/KHQ9MSxhPT09ITAmJih0fD04KSk6dD0wLGE9SW4oMyxudWxsLG51bGwsdCksZS5jdXJyZW50PWEsYS5zdGF0ZU5vZGU9ZSxhLm1lbW9pemVkU3RhdGU9e2VsZW1lbnQ6byxpc0RlaHlkcmF0ZWQ6bixjYWNoZTpudWxsLHRyYW5zaXRpb25zOm51bGwscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpudWxsfSxRcChhKSxlfWZ1bmN0aW9uIFRUKGUsdCxuKXt2YXIgbz0zPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6VGEsa2V5Om89PW51bGw/bnVsbDoiIitvLGNoaWxkcmVuOmUsY29udGFpbmVySW5mbzp0LGltcGxlbWVudGF0aW9uOm59fWZ1bmN0aW9uIEliKGUpe2lmKCFlKXJldHVybiBFcjtlPWUuX3JlYWN0SW50ZXJuYWxzO2U6e2lmKFFyKGUpIT09ZXx8ZS50YWchPT0xKXRocm93IEVycm9yKHooMTcwKSk7dmFyIHQ9ZTtkb3tzd2l0Y2godC50YWcpe2Nhc2UgMzp0PXQuc3RhdGVOb2RlLmNvbnRleHQ7YnJlYWsgZTtjYXNlIDE6aWYocG4odC50eXBlKSl7dD10LnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBlfX10PXQucmV0dXJufXdoaWxlKHQhPT1udWxsKTt0aHJvdyBFcnJvcih6KDE3MSkpfWlmKGUudGFnPT09MSl7dmFyIG49ZS50eXBlO2lmKHBuKG4pKXJldHVybiBJdihlLG4sdCl9cmV0dXJuIHR9ZnVuY3Rpb24gUmIoZSx0LG4sbyxyLGEsaSxzLGwpe3JldHVybiBlPWdmKG4sbywhMCxlLHIsYSxpLHMsbCksZS5jb250ZXh0PUliKG51bGwpLG49ZS5jdXJyZW50LG89bm4oKSxyPWtyKG4pLGE9em8obyxyKSxhLmNhbGxiYWNrPXQ/P251bGwsYnIobixhLHIpLGUuY3VycmVudC5sYW5lcz1yLGhzKGUscixvKSxmbihlLG8pLGV9ZnVuY3Rpb24gT2QoZSx0LG4sbyl7dmFyIHI9dC5jdXJyZW50LGE9bm4oKSxpPWtyKHIpO3JldHVybiBuPUliKG4pLHQuY29udGV4dD09PW51bGw/dC5jb250ZXh0PW46dC5wZW5kaW5nQ29udGV4dD1uLHQ9em8oYSxpKSx0LnBheWxvYWQ9e2VsZW1lbnQ6ZX0sbz1vPT09dm9pZCAwP251bGw6byxvIT09bnVsbCYmKHQuY2FsbGJhY2s9byksZT1icihyLHQsaSksZSE9PW51bGwmJihvbyhlLHIsaSxhKSxLbChlLHIsaSkpLGl9ZnVuY3Rpb24gYmQoZSl7aWYoZT1lLmN1cnJlbnQsIWUuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGUuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGUuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGUuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBfeShlLHQpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiZlLmRlaHlkcmF0ZWQhPT1udWxsKXt2YXIgbj1lLnJldHJ5TGFuZTtlLnJldHJ5TGFuZT1uIT09MCYmbjx0P246dH19ZnVuY3Rpb24geWYoZSx0KXtfeShlLHQpLChlPWUuYWx0ZXJuYXRlKSYmX3koZSx0KX1mdW5jdGlvbiBEVCgpe3JldHVybiBudWxsfXZhciBQYj10eXBlb2YgcmVwb3J0RXJyb3I9PSJmdW5jdGlvbiI/cmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX07ZnVuY3Rpb24gdmYoZSl7dGhpcy5faW50ZXJuYWxSb290PWV9SWQucHJvdG90eXBlLnJlbmRlcj12Zi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2ludGVybmFsUm9vdDtpZih0PT09bnVsbCl0aHJvdyBFcnJvcih6KDQwOSkpO09kKGUsdCxudWxsLG51bGwpfTtJZC5wcm90b3R5cGUudW5tb3VudD12Zi5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2ludGVybmFsUm9vdDtpZihlIT09bnVsbCl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIHQ9ZS5jb250YWluZXJJbmZvO1hyKGZ1bmN0aW9uKCl7T2QobnVsbCxlLG51bGwsbnVsbCl9KSx0W0JvXT1udWxsfX07ZnVuY3Rpb24gSWQoZSl7dGhpcy5faW50ZXJuYWxSb290PWV9SWQucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXV2KCk7ZT17YmxvY2tlZE9uOm51bGwsdGFyZ2V0OmUscHJpb3JpdHk6dH07Zm9yKHZhciBuPTA7bjx1ci5sZW5ndGgmJnQhPT0wJiZ0PHVyW25dLnByaW9yaXR5O24rKyk7dXIuc3BsaWNlKG4sMCxlKSxuPT09MCYmZnYoZSl9fTtmdW5jdGlvbiBiZihlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSl9ZnVuY3Rpb24gUmQoZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEmJihlLm5vZGVUeXBlIT09OHx8ZS5ub2RlVmFsdWUhPT0iIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICIpKX1mdW5jdGlvbiBVeSgpe31mdW5jdGlvbiBBVChlLHQsbixvLHIpe2lmKHIpe2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKXt2YXIgYT1vO289ZnVuY3Rpb24oKXt2YXIgZD1iZChpKTthLmNhbGwoZCl9fXZhciBpPVJiKHQsbyxlLDAsbnVsbCwhMSwhMSwiIixVeSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1pLGVbQm9dPWkuY3VycmVudCxpcyhlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksWHIoKSxpfWZvcig7cj1lLmxhc3RDaGlsZDspZS5yZW1vdmVDaGlsZChyKTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGQ9YmQobCk7cy5jYWxsKGQpfX12YXIgbD1nZihlLDAsITEsbnVsbCxudWxsLCExLCExLCIiLFV5KTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVtCb109bC5jdXJyZW50LGlzKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxYcihmdW5jdGlvbigpe09kKHQsbCxuLG8pfSksbH1mdW5jdGlvbiBQZChlLHQsbixvLHIpe3ZhciBhPW4uX3JlYWN0Um9vdENvbnRhaW5lcjtpZihhKXt2YXIgaT1hO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgbD1iZChpKTtzLmNhbGwobCl9fU9kKHQsaSxlLHIpfWVsc2UgaT1BVChuLHQsZSxyLG8pO3JldHVybiBiZChpKX1kdj1mdW5jdGlvbihlKXtzd2l0Y2goZS50YWcpe2Nhc2UgMzp2YXIgdD1lLnN0YXRlTm9kZTtpZih0LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBuPUJpKHQucGVuZGluZ0xhbmVzKTtuIT09MCYmKFVwKHQsbnwxKSxmbih0LG10KCkpLCEoT2UmNikmJihYYT1tdCgpKzUwMCxEcigpKSl9YnJlYWs7Y2FzZSAxMzpYcihmdW5jdGlvbigpe3ZhciBvPUhvKGUsMSk7aWYobyE9PW51bGwpe3ZhciByPW5uKCk7b28obyxlLDEscil9fSkseWYoZSwxKX19O0ZwPWZ1bmN0aW9uKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PUhvKGUsMTM0MjE3NzI4KTtpZih0IT09bnVsbCl7dmFyIG49bm4oKTtvbyh0LGUsMTM0MjE3NzI4LG4pfXlmKGUsMTM0MjE3NzI4KX19O2N2PWZ1bmN0aW9uKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PWtyKGUpLG49SG8oZSx0KTtpZihuIT09bnVsbCl7dmFyIG89bm4oKTtvbyhuLGUsdCxvKX15ZihlLHQpfX07dXY9ZnVuY3Rpb24oKXtyZXR1cm4gV2V9O3B2PWZ1bmN0aW9uKGUsdCl7dmFyIG49V2U7dHJ5e3JldHVybiBXZT1lLHQoKX1maW5hbGx5e1dlPW59fTtYdT1mdW5jdGlvbihlLHQsbil7c3dpdGNoKHQpe2Nhc2UiaW5wdXQiOmlmKEt1KGUsbiksdD1uLm5hbWUsbi50eXBlPT09InJhZGlvIiYmdCE9bnVsbCl7Zm9yKG49ZTtuLnBhcmVudE5vZGU7KW49bi5wYXJlbnROb2RlO2ZvcihuPW4ucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0iK0pTT04uc3RyaW5naWZ5KCIiK3QpKyddW3R5cGU9InJhZGlvIl0nKSx0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciBvPW5bdF07aWYobyE9PWUmJm8uZm9ybT09PWUuZm9ybSl7dmFyIHI9RWQobyk7aWYoIXIpdGhyb3cgRXJyb3Ioeig5MCkpO0t5KG8pLEt1KG8scil9fX1icmVhaztjYXNlInRleHRhcmVhIjpWeShlLG4pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp0PW4udmFsdWUsdCE9bnVsbCYmRmEoZSwhIW4ubXVsdGlwbGUsdCwhMSl9fTtReT1wZjtaeT1Ycjt2YXIgQ1Q9e3VzaW5nQ2xpZW50RW50cnlQb2ludDohMSxFdmVudHM6W3lzLE9hLEVkLFh5LEp5LHBmXX0sVWk9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOkJyLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOiIxOC4zLjEiLHJlbmRlcmVyUGFja2FnZU5hbWU6InJlYWN0LWRvbSJ9LE1UPXtidW5kbGVUeXBlOlVpLmJ1bmRsZVR5cGUsdmVyc2lvbjpVaS52ZXJzaW9uLHJlbmRlcmVyUGFja2FnZU5hbWU6VWkucmVuZGVyZXJQYWNrYWdlTmFtZSxyZW5kZXJlckNvbmZpZzpVaS5yZW5kZXJlckNvbmZpZyxvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxvdmVycmlkZVByb3BzRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOm51bGwsc2V0RXJyb3JIYW5kbGVyOm51bGwsc2V0U3VzcGVuc2VIYW5kbGVyOm51bGwsc2NoZWR1bGVVcGRhdGU6bnVsbCxjdXJyZW50RGlzcGF0Y2hlclJlZjpHby5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPW52KGUpLGU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGV9LGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOlVpLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlfHxEVCxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsLHJlY29uY2lsZXJWZXJzaW9uOiIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSImJihGaT1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIUZpLmlzRGlzYWJsZWQmJkZpLnN1cHBvcnRzRmliZXIpKXRyeXt3ZD1GaS5pbmplY3QoTVQpLHhvPUZpfWNhdGNoe312YXIgRmk7Tm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9Q1Q7Tm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIWJmKHQpKXRocm93IEVycm9yKHooMjAwKSk7cmV0dXJuIFRUKGUsdCxudWxsLG4pfTtObi5jcmVhdGVSb290PWZ1bmN0aW9uKGUsdCl7aWYoIWJmKGUpKXRocm93IEVycm9yKHooMjk5KSk7dmFyIG49ITEsbz0iIixyPVBiO3JldHVybiB0IT1udWxsJiYodC51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSx0LmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihvPXQuaWRlbnRpZmllclByZWZpeCksdC5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihyPXQub25SZWNvdmVyYWJsZUVycm9yKSksdD1nZihlLDEsITEsbnVsbCxudWxsLG4sITEsbyxyKSxlW0JvXT10LmN1cnJlbnQsaXMoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5ldyB2Zih0KX07Tm4uZmluZERPTU5vZGU9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZihlLm5vZGVUeXBlPT09MSlyZXR1cm4gZTt2YXIgdD1lLl9yZWFjdEludGVybmFscztpZih0PT09dm9pZCAwKXRocm93IHR5cGVvZiBlLnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcih6KDE4OCkpOihlPU9iamVjdC5rZXlzKGUpLmpvaW4oIiwiKSxFcnJvcih6KDI2OCxlKSkpO3JldHVybiBlPW52KHQpLGU9ZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZSxlfTtObi5mbHVzaFN5bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIFhyKGUpfTtObi5oeWRyYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZighUmQodCkpdGhyb3cgRXJyb3IoeigyMDApKTtyZXR1cm4gUGQobnVsbCxlLHQsITAsbil9O05uLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGUsdCxuKXtpZighYmYoZSkpdGhyb3cgRXJyb3Ioeig0MDUpKTt2YXIgbz1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxyPSExLGE9IiIsaT1QYjtpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihyPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihhPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPW4ub25SZWNvdmVyYWJsZUVycm9yKSksdD1SYih0LG51bGwsZSwxLG4/P251bGwsciwhMSxhLGkpLGVbQm9dPXQuY3VycmVudCxpcyhlKSxvKWZvcihlPTA7ZTxvLmxlbmd0aDtlKyspbj1vW2VdLHI9bi5fZ2V0VmVyc2lvbixyPXIobi5fc291cmNlKSx0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLHJdOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4scik7cmV0dXJuIG5ldyBJZCh0KX07Tm4ucmVuZGVyPWZ1bmN0aW9uKGUsdCxuKXtpZighUmQodCkpdGhyb3cgRXJyb3IoeigyMDApKTtyZXR1cm4gUGQobnVsbCxlLHQsITEsbil9O05uLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oZSl7aWYoIVJkKGUpKXRocm93IEVycm9yKHooNDApKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPyhYcihmdW5jdGlvbigpe1BkKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVtCb109bnVsbH0pfSksITApOiExfTtObi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1wZjtObi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihlLHQsbixvKXtpZighUmQobikpdGhyb3cgRXJyb3IoeigyMDApKTtpZihlPT1udWxsfHxlLl9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcih6KDM4KSk7cmV0dXJuIFBkKGUsdCxuLCExLG8pfTtObi52ZXJzaW9uPSIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2In0pO3ZhciBMZD1QbygoU1UsVWIpPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIF9iKCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShfYil9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19X2IoKSxVYi5leHBvcnRzPUxiKCl9KTt2YXIgemI9UG8od2Y9PnsidXNlIHN0cmljdCI7dmFyIEZiPUxkKCk7d2YuY3JlYXRlUm9vdD1GYi5jcmVhdGVSb290LHdmLmh5ZHJhdGVSb290PUZiLmh5ZHJhdGVSb290O3ZhciBFVX0pO3ZhciBQaz1QbyhkYz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgWEE9bWUoKSxKQT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksUUE9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxaQT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGVDPVhBLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLHRDPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gUmsoZSx0LG4pe3ZhciBvLHI9e30sYT1udWxsLGk9bnVsbDtuIT09dm9pZCAwJiYoYT0iIituKSx0LmtleSE9PXZvaWQgMCYmKGE9IiIrdC5rZXkpLHQucmVmIT09dm9pZCAwJiYoaT10LnJlZik7Zm9yKG8gaW4gdClaQS5jYWxsKHQsbykmJiF0Qy5oYXNPd25Qcm9wZXJ0eShvKSYmKHJbb109dFtvXSk7aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKG8gaW4gdD1lLmRlZmF1bHRQcm9wcyx0KXJbb109PT12b2lkIDAmJihyW29dPXRbb10pO3JldHVybnskJHR5cGVvZjpKQSx0eXBlOmUsa2V5OmEscmVmOmkscHJvcHM6cixfb3duZXI6ZUMuY3VycmVudH19ZGMuRnJhZ21lbnQ9UUE7ZGMuanN4PVJrO2RjLmpzeHM9Umt9KTt2YXIgWD1QbygoZFcsTGspPT57InVzZSBzdHJpY3QiO0xrLmV4cG9ydHM9UGsoKX0pO3ZhciBpRT1MKHpiKCksMSk7dmFyIE9UPSJsYXlvdXQtcGlja2VyIixaYT1be2lkOiJnb2FsLW9yaWVudGVkIixuYW1lOiJHb2FsLU9yaWVudGVkIChSZWNvbW1lbmRlZCkiLGljb246Ilx1ezFGM0FGfSIsZGVzY3JpcHRpb246IlF1YXJ0ZXJseSBwbGFubmluZywgdmljdG9yeSB0cmFja2luZywgYW5kIEFJIGNvYWNoaW5nIGFsb25nc2lkZSB5b3VyIGRhaWx5IHRhc2sgbGlzdC4gQmVzdCBmb3IgdXNlcnMgYWN0aXZlbHkgd29ya2luZyB0b3dhcmQgbG9uZy1ob3Jpem9uIGdvYWxzLiIsd2lkZ2V0czpbe3dpZGdldElkOiJwbGFubmluZyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJkcmVhbS10YXNrIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiZGF5LXNrZXRjaCIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InByb3Bvc2VkLWFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InNoYXJlZC1ub3RlcyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InJlY2VudC1ub3RlcyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6Im1vb2QiLGdyaWRXaWR0aFNpemU6MX0se3dpZGdldElkOiJxdW90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJxdWljay1hY3Rpb25zIixncmlkV2lkdGhTaXplOjF9LHt3aWRnZXRJZDoiZW5lcmd5LXBlci1oYWJpdCIsZ3JpZFdpZHRoU2l6ZToyfV19LHtpZDoiZGF5LXRvLWRheSIsbmFtZToiRGF5LXRvLURheSIsaWNvbjoiXHV7MUY0QzV9IixkZXNjcmlwdGlvbjoiRXhlY3V0aW5nIHRvZGF5J3Mgd29yayBcdTIwMTQgdGFza3MsIHNjaGVkdWxlLCBhbmQgZGFpbHkgcGxhbm5pbmcgd2l0aG91dCBsb25nZXItaG9yaXpvbiBub2lzZS4gTm8gbW9vZCB0cmFja2luZyBvciBnb2FsIHdpZGdldHMuIix3aWRnZXRzOlt7d2lkZ2V0SWQ6ImFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InByb3Bvc2VkLWFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJjYWxlbmRhciIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJxdW90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJyZWNlbnQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJwZWFrLWhvdXJzIixncmlkV2lkdGhTaXplOjJ9XX0se2lkOiJtaW5kZnVsLWFjaGlldmVyIixuYW1lOiJNaW5kZnVsIEFjaGlldmVyIixpY29uOiJcdXsxRjMzMX0iLGRlc2NyaXB0aW9uOiJGb3IgdGhvc2Ugd2hvIHRyYWNrIHdlbGxiZWluZyBhbG9uZ3NpZGUgdGFza3MuIEJhbGFuY2VzIG1vb2QsIGluc3BpcmF0aW9uLCBhbmQgdGFzayBoeWdpZW5lIFx1MjAxNCB3aXRob3V0IG92ZXJ3aGVsbWluZyB0aGUgdmlldyB3aXRoIHBsYW5uaW5nIHdpZGdldHMuIix3aWRnZXRzOlt7d2lkZ2V0SWQ6ImFnZW5kYSIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InBsYW5uaW5nIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoibW9vZCIsZ3JpZFdpZHRoU2l6ZToxfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLGdyaWRXaWR0aFNpemU6MX0se3dpZGdldElkOiJxdW90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJzaGFyZWQtbm90ZXMiLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJlbmVyZ3ktcGVyLWhhYml0IixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiZHJlYW0tdGFzayIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImNhbGVuZGFyIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoidmljdG9yeS12YWx1ZSIsZ3JpZFdpZHRoU2l6ZToyfV19XSxNdD1be3dpZGdldElkOiJsYXlvdXQtcGlja2VyIixuYW1lOiJMYXlvdXQgUGlja2VyIixkZXNjcmlwdGlvbjoiT25lLWNsaWNrIHByZXNldHMgdGhhdCByZWFycmFuZ2UgeW91ciBlbnRpcmUgZGFzaGJvYXJkIGludG8gYSBjdXJhdGVkIHByb2ZpbGUiLGljb246Ilx1ezFGNUMyfVx1RkUwRiIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicGxhbm5pbmciLG5hbWU6IlF1YXJ0ZXJseSBQbGFubmluZyIsZGVzY3JpcHRpb246IlBsYW4gYW5kIHRyYWNrIHlvdXIgcXVhcnRlcmx5IGdvYWxzIGFuZCBwcmlvcml0aWVzIixpY29uOiJcdXsxRjRDQn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLG5hbWU6IlZpY3RvcnkgVmFsdWUiLGRlc2NyaXB0aW9uOiJDZWxlYnJhdGUgd2lucyBhbmQgdHJhY2sgaGlnaC12YWx1ZSB0YXNrIGNvbXBsZXRpb25zIixpY29uOiJcdXsxRjNDNn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLG5hbWU6IkdvYWwgQ29hY2giLGRlc2NyaXB0aW9uOiJHZXQgdGFzayBzdWdnZXN0aW9ucyB0aGF0IGJsZW5kIHF1YXJ0ZXJseS9tb250aGx5IGdvYWxzIHdpdGggZGF5LW9mLXdlZWsgcHJlZmVyZW5jZXMiLGljb246Ilx1ezFGNTJFfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjIsdmlzaWJsZVN1YnRpdGxlOiJXaGF0IGlmIHlvdSBkaWQgaXQgdG9kYXk/In0se3dpZGdldElkOiJkYXktc2tldGNoIixuYW1lOiJEYXkgU2tldGNoZXIiLGRlc2NyaXB0aW9uOiJOb3RlYm9vay1wYXBlciBkYXkgcGxhbm5lciB3aXRoIGhvdXItYnktaG91ciBlbnRyaWVzIHNhdmVkIHRvIGEgbm90ZSIsaWNvbjoiXHV7MUY1RDJ9XHVGRTBGIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJhZ2VuZGEiLG5hbWU6IlRhc2sgQWdlbmRhIixkZXNjcmlwdGlvbjoiVmlldyBhbmQgbWFuYWdlIHlvdXIgcHJpb3JpdGl6ZWQgdGFzayBsaXN0IixpY29uOiJcdXsxRjRDQ30iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InByb3Bvc2VkLWFnZW5kYSIsbmFtZToiUHJvcG9zZWQgQWdlbmRhIixkZXNjcmlwdGlvbjoiQUktcHJvcG9zZWQgaG91ci1ieS1ob3VyIHNjaGVkdWxlIGJ1aWx0IGZyb20geW91ciByZWNlbnQgdGFza3MgYW5kIHF1YXJ0ZXJseSBwbGFuIixpY29uOiJcdXsxRjVEM31cdUZFMEYiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsaW50cm9kdWNlZEF0OiIyMDI2LTA2LTI3IixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicXVvdGVzIixuYW1lOiJJbnNwaXJhdGlvbiBRdW90ZXMiLGRlc2NyaXB0aW9uOiJSb3RhdGluZyBpbnNwaXJhdGlvbmFsIHF1b3RlcyB0byBrZWVwIHlvdSBtb3RpdmF0ZWQiLGljb246Ilx1ezFGNEExfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoiZ3JhdmV5YXJkIixuYW1lOiJUYXNrIFJldGlyZW1lbnQgQ2VudGVyIixkZXNjcmlwdGlvbjoiU3VyZmFjZSBuZWdsZWN0ZWQgdGFza3MgYW5kIHJldGlyZSB0aGVtIHRvIGFuIGFyY2hpdmVkIG5vdGUiLGljb246Ilx1ezFGNDc1fVx1RkUwRiIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixpbnRyb2R1Y2VkQXQ6IjIwMjYtMDUtMDkiLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJyZWNlbnQtbm90ZXMiLG5hbWU6IlJldmlzaXQgQ2FuZGlkYXRlIixkZXNjcmlwdGlvbjoiTm90ZXMgd2l0aCBvcGVuIHRhc2tzIHRoYXQgaGF2ZSBub3QgaGFkIGEgbmV3IHRhc2sgaW4gb3ZlciBhIHdlZWsiLGljb246Ilx1ezFGNEREfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoic2hhcmVkLW5vdGVzIixuYW1lOiJTaGFyZWQgTm90ZXMiLGRlc2NyaXB0aW9uOiJTaGFyZWQgbm90ZXMgcmVjZW50bHkgdXBkYXRlZCBieSBhIGNvbGxhYm9yYXRvciBhZnRlciB5b3VyIG93biBjaGFuZ2VzIixpY29uOiJcdXsxRjkxRH0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsaW50cm9kdWNlZEF0OiIyMDI2LTA2LTI2IixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoibm90ZS1wZWVrIixuYW1lOiJOb3RlIFBlZWsiLGRlc2NyaXB0aW9uOiJEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhbnkgbm90ZSB5b3UgY2hvb3NlLCBjbGlwcGVkIHRvIHRoZSB3aWRnZXQncyBzaXplIixpY29uOiJcdXsxRjREOH0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsaW50cm9kdWNlZEF0OiIyMDI2LTA4LTAzIixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoibW9vZCIsbmFtZToiRW5lcmd5IChNb29kKSBUcmFja2VyIix2aXNpYmxlVGl0bGU6IkhvdyBnb2VzIGl0PyIsZGVzY3JpcHRpb246IkxvZyB5b3VyIGRhaWx5IGVuZXJneSBsZXZlbCBhbmQgdmlzdWFsaXplIHRyZW5kcyBvdmVyIHRpbWUiLGljb246Ilx1ezFGM0FEfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoiY2FsZW5kYXIiLG5hbWU6IkNhbGVuZGFyIixkZXNjcmlwdGlvbjoiU2VlIHVwY29taW5nIGV2ZW50cyBhbmQgYXBwb2ludG1lbnRzIGF0IGEgZ2xhbmNlIixpY29uOiJcdXsxRjRDNX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InF1aWNrLWFjdGlvbnMiLG5hbWU6IlF1aWNrIEFjdGlvbnMiLGRlc2NyaXB0aW9uOiJTaG9ydGN1dHMgZm9yIHlvdXIgbW9zdCBmcmVxdWVudGx5IHVzZWQgZGFzaGJvYXJkIGFjdGlvbnMiLGljb246Ilx1MjZBMSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicGVhay1ob3VycyIsbmFtZToiUGVhayBIb3VycyIsZGVzY3JpcHRpb246IkhvdXJseSBkaXN0cmlidXRpb24gb2YgdGFzayBjcmVhdGlvbiBhbmQgY29tcGxldGlvbiBhY3Rpdml0eSIsaWNvbjoiXHUyM0YwIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJlbmVyZ3ktcGVyLWhhYml0IixuYW1lOiJFbmVyZ3kgUGVyIEhhYml0Iix2aXNpYmxlVGl0bGU6IkVuZXJneSBkZWx0YSBwZXIgaGFiaXQiLGRlc2NyaXB0aW9uOiJDb3JyZWxhdGUgZWFjaCByZWN1cnJpbmctdGFzayBoYWJpdCB3aXRoIGhvdyB5b3UgZmVsdDogYXZlcmFnZSBlbmVyZ3kgb24gZGF5cyB5b3UgZG8gaXQgdnMuIGRvbid0IixpY29uOiJcdXsxRjUwQn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsaW50cm9kdWNlZEF0OiIyMDI2LTA3LTE3IixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoiZGVidWctY29uc29sZSIsbmFtZToiRGVidWcgQ29uc29sZSIsZGVzY3JpcHRpb246IlNjcm9sbGFibGUgbG9nIHZpZXdlciBzaG93aW5nIGFsbCBsb2dJZkVuYWJsZWQgbWVzc2FnZXMgKGRldmVsb3BlciB0b29sKSIsaWNvbjoiXHV7MUY0MUJ9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6MixkZWJ1Z09ubHk6ITB9XTtmdW5jdGlvbiBicyhlKXtsZXQgdD1PYmplY3QuZnJvbUVudHJpZXMoTXQubWFwKG49PltuLndpZGdldElkLHtncmlkSGVpZ2h0U2l6ZToxLGdyaWRXaWR0aFNpemU6bi5kZWZhdWx0R3JpZFdpZHRoU2l6ZXx8MX1dKSk7cmV0dXJuKGU/LndpZGdldHN8fFtdKS5mb3JFYWNoKG49Pnt0W24ud2lkZ2V0SWRdJiYodFtuLndpZGdldElkXT17Li4udFtuLndpZGdldElkXSxncmlkV2lkdGhTaXplOk51bWJlcihuLmdyaWRXaWR0aFNpemUpfHx0W24ud2lkZ2V0SWRdLmdyaWRXaWR0aFNpemV9KX0pLHR9ZnVuY3Rpb24gV2IoZSx0KXtsZXQgbz0oQXJyYXkuaXNBcnJheShlKT9lOltdKS5maWx0ZXIoaT0+aS53aWRnZXRJZCE9PU9UKSxyPXQud2lkZ2V0cyxhPWJzKHQpO3JldHVybiBvLmxlbmd0aCE9PXIubGVuZ3RoPyExOnIuZXZlcnkoKGkscyk9Pm9bc10/LndpZGdldElkPT09aS53aWRnZXRJZCYmTnVtYmVyKG9bc10/LmdyaWRXaWR0aFNpemUpPT09YVtpLndpZGdldElkXT8uZ3JpZFdpZHRoU2l6ZSl9ZnVuY3Rpb24gQmIoZSl7cmV0dXJuIFphLmZpbmQodD0+dC5pZD09PWUpfHxudWxsfXZhciBFdD17REVGQVVMVDoiZGVmYXVsdCIsTEFZT1VUX0NPTkZJRzoibGF5b3V0Q29uZmlnIixNRU1PUllfTUVBU1VSRU1FTlQ6Im1lbW9yeU1lYXN1cmVtZW50IixTRVRUSU5HU19DT05GSUc6InNldHRpbmdzQ29uZmlnIn07dmFyIEtiPXR5cGVvZiBwcm9jZXNzPCJ1IiYmITEsX249ITEsa2Y9MzAsd2U9InBsdWdpbnMvZGFzaGJvYXJkIixVZD0icGxhbm5pbmcvcXVhcnRlcmx5Ijt2YXIgQj17QkFDS0dST1VORF9JTUFHRV9VUkw6IkJhY2tncm91bmQgSW1hZ2UgVVJMIixCQUNLR1JPVU5EX0lNQUdFX01PREU6IkJhY2tncm91bmQgSW1hZ2UgTW9kZSIsQ09OU09MRV9MT0dHSU5HOiJDb25zb2xlIGxvZ2dpbmciLERBU0hCT0FSRF9DT01QT05FTlRTOiJkYXNoYm9hcmRfZWxlbWVudHMiLERFQlVHX0NPTlNPTEU6ImRlYnVnX2NvbnNvbGUiLExMTV9BUElfS0VZX0FOVEhST1BJQzoiQW50aHJvcGljIEFQSSBLZXkiLExMTV9BUElfS0VZX0dFTUlOSToiR2VtaW5pIEFQSSBLZXkiLExMTV9BUElfS0VZX0dST0s6Ikdyb2sgQVBJIEtleSIsTExNX0FQSV9LRVlfT1BFTkFJOiJPcGVuQUkgQVBJIEtleSIsTExNX1BST1ZJREVSX01PREVMOiJMTE0gUHJvdmlkZXIiLEZJUlNUX0lOU1RBTExFRF9BVDoiZGFzaGJvYXJkX2ZpcnN0X2luc3RhbGxlZF9hdCIsUkVOREVSX0JSRUFEQ1JVTUI6ImRhc2hib2FyZF9yZW5kZXJfYnJlYWRjcnVtYiIsU0VMRUNURURfTEFZT1VUX1BST0ZJTEU6ImRhc2hib2FyZF9zZWxlY3RlZF9sYXlvdXRfcHJvZmlsZSIsVEFTS19ET01BSU5TOiJkYXNoYm9hcmRfdGFza19kb21haW5zIixQTEFOTklOR19OT1RFX1RBRzoiVGFnIHRvIGFwcGx5IHRvIHBsYW5uaW5nIG5vdGVzIixQUk9QT1NFRF9BR0VOREFfUFJJT1JJVFk6ImRhc2hib2FyZF9wcm9wb3NlZF9hZ2VuZGFfcHJpb3JpdHkiLFBST1BPU0VEX0FHRU5EQV9MTE06ImRhc2hib2FyZF9wcm9wb3NlZF9hZ2VuZGFfbGxtIn0sX2Q9e2FudGhyb3BpYzpCLkxMTV9BUElfS0VZX0FOVEhST1BJQyxnZW1pbmk6Qi5MTE1fQVBJX0tFWV9HRU1JTkksZ3JvazpCLkxMTV9BUElfS0VZX0dST0ssb3BlbmFpOkIuTExNX0FQSV9LRVlfT1BFTkFJfSxIYj17bm9uZTpudWxsLG9wZW5haToib3BlbmFpIixhbnRocm9waWM6ImFudGhyb3BpYyIsImFudGhyb3BpYy1zb25uZXQiOiJhbnRocm9waWMiLGdlbWluaToiZ2VtaW5pIixncm9rOiJncm9rIn07ZnVuY3Rpb24gVm8oZSl7cmV0dXJuIWV8fGU9PT0ibm9uZSI/bnVsbDpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSGIsZSk/SGJbZV06X2RbZV0/ZTpudWxsfWZ1bmN0aW9uICR0KGUpe3JldHVybiBfZFtlXXx8bnVsbH1mdW5jdGlvbiBGZChlKXtyZXR1cm4gT2JqZWN0LmtleXMoX2QpLmZpbHRlcih0PT57bGV0IG49ZT8uW19kW3RdXTtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciJiZuLnRyaW0oKS5sZW5ndGg+MH0pfWZ1bmN0aW9uIEdiKGUpe3N3aXRjaChlKXtjYXNlIm9wZW5haSI6cmV0dXJuKHByb2Nlc3MuZW52Lk9QRU5fQUlfQUNDRVNTX1RPS0VOfHwiIikudHJpbSgpO2Nhc2UiYW50aHJvcGljIjpyZXR1cm4ocHJvY2Vzcy5lbnYuQU5USFJPUElDX0FJX0FDQ0VTU19UT0tFTnx8IiIpLnRyaW0oKTtjYXNlImdyb2siOnJldHVybihwcm9jZXNzLmVudi5HUk9LX0FJX0FDQ0VTU19UT0tFTnx8IiIpLnRyaW0oKTtjYXNlImdlbWluaSI6cmV0dXJuKHByb2Nlc3MuZW52LkdFTUlOSV9BSV9BQ0NFU1NfVE9LRU58fCIiKS50cmltKCk7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gVmIoKXtyZXR1cm4gX24/WyJvcGVuYWkiLCJhbnRocm9waWMiLCJncm9rIiwiZ2VtaW5pIl0uc29tZShlPT4hIUdiKGUpKTohMX1mdW5jdGlvbiB6ZChlKXtpZighX24pcmV0dXJuIG51bGw7Zm9yKGxldCB0IG9mWyJvcGVuYWkiLCJhbnRocm9waWMiLCJncm9rIiwiZ2VtaW5pIl0pe2xldCBuPUdiKHQpLG89ZVt0XXx8bnVsbDtpZihuJiZvKXJldHVybntwcm92aWRlcjp0LG1vZGVsOm8sYXBpS2V5Om59fXJldHVybiBudWxsfWZ1bmN0aW9uIGpvKGUpe3JldHVybmBkYXNoYm9hcmRfJHtlfV9jb25maWdgfWZ1bmN0aW9uIGVpKGUsdCl7bGV0IG49ZT8uW2pvKHQpXTtpZighbilyZXR1cm5bXTtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShuKX1jYXRjaHtyZXR1cm5bXX19dmFyIGpiPVt7dmFsdWU6ImNvdmVyIixsYWJlbDoiQ292ZXIgKGZpbGwgZW50aXJlIGJhY2tncm91bmQpIn0se3ZhbHVlOiJjb250YWluIixsYWJlbDoiQ29udGFpbiAoZml0IHdpdGhvdXQgY3JvcHBpbmcpIn0se3ZhbHVlOiJyZXBlYXQiLGxhYmVsOiJSZXBlYXQgKHRpbGUgdGhlIGltYWdlKSJ9LHt2YWx1ZToicmVwZWF0LXgiLGxhYmVsOiJSZXBlYXQgaG9yaXpvbnRhbGx5In0se3ZhbHVlOiJyZXBlYXQteSIsbGFiZWw6IlJlcGVhdCB2ZXJ0aWNhbGx5In0se3ZhbHVlOiJuby1yZXBlYXQiLGxhYmVsOiJObyByZXBlYXQgKHNpbmdsZSBjZW50ZXJlZCBpbWFnZSkifV0sQVU9Qi5EQVNIQk9BUkRfQ09NUE9ORU5UUyxJVD0yNCo2MCo2MCoxZTM7ZnVuY3Rpb24gWWIoZSl7cmV0dXJuICRiKGUpPy5pY29ufHxudWxsfWZ1bmN0aW9uIFdkKGUpe2xldCB0PU10LmZpbmQobj0+bi53aWRnZXRJZD09PWUpO3JldHVybiB0Py52aXNpYmxlVGl0bGV8fHQ/Lm5hbWV8fGV9ZnVuY3Rpb24gcWIoZSl7cmV0dXJuICRiKGUpPy52aXNpYmxlU3VidGl0bGV8fG51bGx9ZnVuY3Rpb24gJGIoZSl7cmV0dXJuIE10LmZpbmQodD0+dC53aWRnZXRJZD09PWUpfHxudWxsfXZhciBZbz1NdC5maWx0ZXIoZT0+IWUuZGVidWdPbmx5KS5tYXAoZT0+KHt3aWRnZXRJZDplLndpZGdldElkLGdyaWRXaWR0aFNpemU6ZS5kZWZhdWx0R3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZToxLHNldHRpbmdzOnt9fSkpO2Z1bmN0aW9uIERlKGUpe3JldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpLWUqNjAqMWUzKS50b0lTT1N0cmluZygpfXZhciBxbz17ImRvbWFpbi13b3JrLXV1aWQiOlt7dXVpZDoibm90ZS13b3JrLTEiLG5hbWU6IlExIEdvYWwgUmV2aWV3Iix0YWdzOlsid29yayJdLHNoYXJlZDohMCxoYXNUYXNrczohMCxhY3RpdmU6RGUoNDUpLGNoYW5nZWQ6RGUoMjg4MCksdXBkYXRlZDpEZSg4KX0se3V1aWQ6Im5vdGUtd29yay0yIixuYW1lOiJTdGFuZC11cCBOb3RlcyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0zIixuYW1lOiJGZWF0dXJlIEltcGxlbWVudGF0aW9uIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTQiLG5hbWU6IkRlc2lnbiBGZWVkYmFjayIsdGFnczpbIndvcmsiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITAsYWN0aXZlOkRlKDE1MDApLGNoYW5nZWQ6RGUoNzIwMCksdXBkYXRlZDpEZSgxMjApfSx7dXVpZDoibm90ZS13b3JrLTUiLG5hbWU6IkJ1ZGdldCBUcmFja2VyIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTYiLG5hbWU6Ik9mZmxpbmUgVGVzdGluZyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay03IixuYW1lOiJTcHJpbnQgUmV0cm8iLHRhZ3M6WyJ3b3JrIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiExLGFjdGl2ZTpEZSg4NjQwKSxjaGFuZ2VkOkRlKDU1NzYwKSx1cGRhdGVkOkRlKDQ0NDQwKX0se3V1aWQ6Im5vdGUtd29yay04IixuYW1lOiJBUEkgTGF5ZXIgUmVzZWFyY2giLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstOSIsbmFtZToiSW50ZWdyYXRpb24gVGVzdHMiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstMTAiLG5hbWU6IlB1bGwgUmVxdWVzdCBRdWV1ZSIsdGFnczpbIndvcmsiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITAsYWN0aXZlOkRlKDI0MCksY2hhbmdlZDpEZSgxODApLHVwZGF0ZWQ6RGUoMTgwKX0se3V1aWQ6Im5vdGUtd29yay0xMSIsbmFtZToiU2V0dGluZ3MgTW9kdWxlIFRlc3RzIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTEyIixuYW1lOiJDU1MgQ2xlYW51cCIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xMyIsbmFtZToiRGFzaGJvYXJkIE1lbW9yeSBMZWFrIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTE0IixuYW1lOiJDbGllbnQgRmVlZGJhY2siLHRhZ3M6WyJ3b3JrIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiEwLGFjdGl2ZTpEZSgyMDE2MCksY2hhbmdlZDpEZSgxNDQwMCksdXBkYXRlZDpEZSgxNDMyMCl9LHt1dWlkOiJub3RlLXdvcmstMTUiLG5hbWU6IkFQSSBFcnJvciBIYW5kbGluZyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xNiIsbmFtZToiQXV0aCBUb2tlbiBSZWZyZXNoIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTE3IixuYW1lOiJEQiBRdWVyeSBQZXJmb3JtYW5jZSIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtb2xkLTNtbyIsbmFtZToiU2VjdXJpdHkgQmFja2xvZyAoUTQpIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtNG1vIixuYW1lOiJQbGF0Zm9ybSBNaWdyYXRpb24gTm90ZXMiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLW9sZC01bW8iLG5hbWU6IlRlY2ggRGVidCBUcmFja2VyIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtNm1vIixuYW1lOiJBYmFuZG9uZWQgRmVhdHVyZSBDb25jZXB0cyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtb2xkLTdtbyIsbmFtZToiTGVnYWN5IFN5c3RlbSBEb2NzIix0YWdzOlsid29yayJdfV0sImRvbWFpbi1wZXJzb25hbC11dWlkIjpbe3V1aWQ6Im5vdGUtcGVyc29uYWwtMSIsbmFtZToiTmV0d29ya2luZyBPdXRyZWFjaCIsdGFnczpbInBlcnNvbmFsIl0sc2hhcmVkOiEwLGhhc1Rhc2tzOiEwLGFjdGl2ZTpEZSgxMjApLGNoYW5nZWQ6RGUoMTQ0MCksdXBkYXRlZDpEZSgyNSl9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTIiLG5hbWU6IkZpdG5lc3MgTG9nIix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtMyIsbmFtZToiU29jaWFsIFJlbWluZGVycyIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTQiLG5hbWU6IkVudGVydGFpbm1lbnQiLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC01IixuYW1lOiJTaG9wcGluZyBMaXN0Iix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNiIsbmFtZToiSGVhbHRoIEFwcG9pbnRtZW50cyIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTciLG5hbWU6IlJlYWRpbmcgTGlzdCIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTgiLG5hbWU6IkhvYmJpZXMiLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC05IixuYW1lOiJUcmlwIFBsYW5uaW5nIix0YWdzOlsicGVyc29uYWwiXSxzaGFyZWQ6ITAsaGFzVGFza3M6ITEsYWN0aXZlOkRlKDQzMjApLGNoYW5nZWQ6RGUoMjg4MCksdXBkYXRlZDpEZSgzNjApfSx7dXVpZDoibm90ZS1wZXJzb25hbC0xMCIsbmFtZToiSG9tZSBPZmZpY2UiLHRhZ3M6WyJwZXJzb25hbCJdfV0sImRvbWFpbi1zaWRlLXV1aWQiOlt7dXVpZDoibm90ZS1zaWRlLTEiLG5hbWU6IkJsb2cgUG9zdCBJZGVhcyIsdGFnczpbInNpZGUtcHJvamVjdHMiXX0se3V1aWQ6Im5vdGUtc2lkZS0yIixuYW1lOiJTaWRlIFByb2plY3QgUkVBRE1FIix0YWdzOlsic2lkZS1wcm9qZWN0cyJdLHNoYXJlZDohMCxoYXNUYXNrczohMCxhY3RpdmU6RGUoMjg4MCksY2hhbmdlZDpEZSg0MzIwKSx1cGRhdGVkOkRlKDQ1KX0se3V1aWQ6Im5vdGUtc2lkZS0zIixuYW1lOiJDSSBQaXBlbGluZSBTZXR1cCIsdGFnczpbInNpZGUtcHJvamVjdHMiXX1dfSxSVD17Im5vdGUtd29yay0xIjpgIyBRMSBHb2FsIFJldmlldwoKV2hlcmUgdGhlIHF1YXJ0ZXIgYWN0dWFsbHkgbGFuZGVkLCBzbyB0aGUgbmV4dCBwbGFubmluZyBzZXNzaW9uIGFyZ3VlcyBmcm9tIGV2aWRlbmNlLgoKIyMgV2hhdCBzaGlwcGVkCgotIFt4XSBbU2hhcmVkIE5vdGVzIGNvbGxhYm9yYXRvciBmaWx0ZXJdKGh0dHBzOi8vYW1wbGVub3RlLmNvbSkKLSBbeF0gUGVhayBIb3VycyBkYXRlIG5hdmlnYXRpb24KLSBbIF0gRW1iZWQgbG9hZC10aW1lIGJ1ZGdldAoKIyMgTnVtYmVycwoKfCBNZXRyaWMgfCBUYXJnZXQgfCBBY3R1YWwgfAp8IC0tLSB8IC0tLSB8IC0tLSB8CnwgV2Vla2x5IGFjdGl2ZSB8IDEsMjAwIHwgMSwzNDAgfAp8IHA5NSBkYXNoYm9hcmQgbG9hZCB8IDkwMG1zIHwgMSwxNTBtcyB8Cgo+IFRoZSBsb2FkIHRpbWUgaXMgdGhlIG9uZSByZWQgbnVtYmVyLCBhbmQgaXQgaXMgYSBrbm93biBvbmUuCgoqKk5leHQgcXVhcnRlcjoqKiBmaW5pc2ggdGhlIGxvYWQtdGltZSB3b3JrIGJlZm9yZSBvcGVuaW5nIGFueSBuZXcgc3VyZmFjZSBhcmVhLmAsIm5vdGUtd29yay00IjpgIyBEZXNpZ24gRmVlZGJhY2sKCk5vdGVzIGZyb20gdGhlIHdhbGt0aHJvdWdoIG9mIHRoZSBbbmV3IHdpZGdldCBjaHJvbWVdW14xXSBtb2NrLXVwLgoKIyMgQWdyZWVkCgoxLiBUaGUgdGl0bGUgYmFyIGtlZXBzIGFuIGljb24sIGEgbmFtZSwgYW5kIG9uZSBhY3Rpb24gXHUyMDE0IG5vdGhpbmcgZWxzZS4KMi4gQm9keSBjb250ZW50IGlzIGNsaXBwZWQsIG5ldmVyIHNjcm9sbGVkLgozLiBUaGUgY2hvc2VuIG5vdGUncyBuYW1lIGJlbG9uZ3MgaW4gdGhlIHN1YnRpdGxlLgoKIyMgU3RpbGwgb3BlbgoKLSBEb2VzIHRoZSBhY2NlbnQtY29sb3JlZCBjYWxsIHRvIGFjdGlvbiByZWFkIGFzIGNsaWNrYWJsZSBhdCBvbmUgY2VsbCB3aWRlPwotIENsaXBwaW5nIGEgd2lkZSB0YWJsZSBkcm9wcyBpdHMgbGFzdCBjb2x1bW4uIEFjY2VwdGFibGUsIG9yIHdvcnRoIGEgc2Nyb2xsYmFyPwoKICBbXjFdOiBbV2lkZ2V0IGNocm9tZSBtb2NrLXVwLCB0aGlyZCByZXZpc2lvbl0oaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbSkKCiAgVGhlIG1vY2stdXAgdGhlIHdhbGt0aHJvdWdoIHdvcmtlZCBmcm9tIFx1MjAxNCB0aGlzIGRlc2NyaXB0aW9uIGFuZCB0aGUgcGljdHVyZSBiZWxvdyBib3RoIGxpdmUgaW4KICB0aGUgZm9vdG5vdGUgcmF0aGVyIHRoYW4gaW4gdGhlIG5vdGUgYm9keS4KCiAgIVtXaWRnZXQgY2hyb21lIG1vY2stdXBdKGh0dHBzOi8vaW1hZ2VzLmFtcGxlbm90ZS5jb20vN2JmN2VmMGMtMWY1MS0xMWYxLTg0Y2EtMzE4ZGNmYjc2ZTk1LzljYTJhMmEwLWYwNjQtNGUwOS04MDgzLWQxMjZiMDAyOGYwYS5wbmcpYCwibm90ZS13b3JrLTkiOmAjIEludGVncmF0aW9uIFRlc3RzCgpUaGUgc3VpdGUgdGhhdCBoYXMgdG8gcGFzcyBiZWZvcmUgYSByZWxlYXNlIGdvZXMgb3V0LgoKXGBcYFxgYmFzaApOT0RFX09QVElPTlM9LS1leHBlcmltZW50YWwtdm0tbW9kdWxlcyBucHggamVzdCAtLXRlc3RQYXRoUGF0dGVybj0nbm90ZS1wZWVrJyAtLW5vLWNvdmVyYWdlIC0tdmVyYm9zZQpcYFxgXGAKCiMjIENvdmVyYWdlIGdhcHMKCi0gTm8gdGVzdCBjb3ZlcnMgYSBub3RlIHdob3NlIGNvbnRlbnQgYXJyaXZlcyBhZnRlciB0aGUgd2lkZ2V0IHVubW91bnRzLgotIFJpY2ggRm9vdG5vdGUgcG9wdXBzIGFyZSBvbmx5IGV4ZXJjaXNlZCBieSBoYW5kLgoKRXZlcnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgZXhpc3RzIHNvIHRoYXQgYSB3aWRnZXQgc2hvcnRlciB0aGFuIGl0cyBub3RlIGhhcyBzb21ldGhpbmcgdG8gY2xpcC4KCiMjIEZpbGxlcgoKTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQKbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28uYH07ZnVuY3Rpb24gUFQoZSl7cmV0dXJuIE9iamVjdC52YWx1ZXMocW8pLmZsYXQoKS5maW5kKG49Pm4udXVpZD09PWUpfHxudWxsfWZ1bmN0aW9uIExUKGUpe2xldCB0PShlLnRhZ3N8fFtdKS5qb2luKCIsICIpfHwidW50YWdnZWQiO3JldHVybmAjICR7ZS5uYW1lfQoKRGV2LW1vZGUgc2FtcGxlIGNvbnRlbnQgZm9yICoqJHtlLm5hbWV9KiouIEV2ZXJ5IHNhbXBsZSBub3RlIGhhcyBpdHMgb3duIGJvZHksIHNvIHN3aXRjaGluZwpub3RlcyBpbiBhIHBpY2tlciBjaGFuZ2VzIHdoYXQgeW91IHNlZS4KCiMjIFRhc2tzCgotIFsgXSBSZXZpZXcgdGhlIG5leHQgYWN0aW9uIGZvciAke2UubmFtZX0KCi0gWyBdIENhcHR1cmUgdGhlIFtjdXJyZW50IHN0YXRlXShodHRwczovL2FtcGxlbm90ZS5jb20pCgotIFsgXSBTaGFyZSB0aGUgZm9sbG93LXVwIHdpdGggdGhlIHByb2plY3Qgb3duZXIKCi0gVGFnczogJHt0fQotIFVVSUQ6IFxgJHtlLnV1aWR9XGAKCiMjIE5vdGVzCgoxLiBGaXJzdCB0aGluZyB3b3J0aCByZW1lbWJlcmluZyBhYm91dCAke2UubmFtZX0uCjIuIFNlY29uZCB0aGluZywgd2hpY2ggcnVucyBsb25nIGVub3VnaCB0byB3cmFwIGluc2lkZSBhIG5hcnJvdyB3aWRnZXQgYW5kIHByb3ZlIHRoYXQgdGhlIHRleHQKICAgcmVmbG93cyByYXRoZXIgdGhhbiBwdXNoaW5nIHRoZSB3aWRnZXQgd2lkZXIgdGhhbiB0aGUgY2VsbCB0aGUgdXNlciBjaG9zZSBmb3IgaXQuCjMuIFRoaXJkIHRoaW5nLmB9ZnVuY3Rpb24gWGIoZSl7bGV0IHQ9UFQoZSk7cmV0dXJuIHQ/UlRbZV18fExUKHQpOm51bGx9dmFyIEpiPVt7dXVpZDoicGVyc29uLWpvcmRhbi1sZWUiLG5hbWU6IkpvcmRhbiBMZWUiLGF2YXRhcjp7aW1hZ2U6Imh0dHBzOi8vaS5wcmF2YXRhci5jYy84MD91PWpvcmRhbi1sZWUifSxhY3RpdmU6RGUoMzApLHNoYXJpbmc6e25vdGVzOlsibm90ZS13b3JrLTEiXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1zYW0tcml2ZXJhIixuYW1lOiJTYW0gUml2ZXJhIixhdmF0YXI6e3RleHQ6IlNSIn0sYWN0aXZlOkRlKDkwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtd29yay0xIl0sdGFnczpbXX19LHt1dWlkOiJwZXJzb24tcHJpeWEtcGF0ZWwiLG5hbWU6IlByaXlhIFBhdGVsIixhdmF0YXI6e2ltYWdlOiJodHRwczovL2kucHJhdmF0YXIuY2MvODA/dT1wcml5YS1wYXRlbCJ9LGFjdGl2ZTpEZSgyNDApLHNoYXJpbmc6e25vdGVzOlsibm90ZS13b3JrLTQiXSx0YWdzOlsid29yayJdfX0se3V1aWQ6InBlcnNvbi1jaGVuLXdlaSIsbmFtZToiQ2hlbiBXZWkiLGF2YXRhcjp7dGV4dDoiQ1cifSxhY3RpdmU6RGUoMTUwMCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXdvcmstNyJdLHRhZ3M6W119fSx7dXVpZDoicGVyc29uLW1hcmlhLWdvbWV6IixuYW1lOiJNYXJpYSBHb21leiIsYXZhdGFyOntpbWFnZToiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzgwP3U9bWFyaWEtZ29tZXoifSxhY3RpdmU6RGUoMTYwMCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXdvcmstNyJdLHRhZ3M6W119fSx7dXVpZDoicGVyc29uLWFsZXgta2ltIixuYW1lOiJBbGV4IEtpbSIsYXZhdGFyOnt0ZXh0OiJBSyJ9LGFjdGl2ZTpEZSgyMDApLHNoYXJpbmc6e25vdGVzOlsibm90ZS13b3JrLTEwIl0sdGFnczpbXX19LHt1dWlkOiJwZXJzb24tdGF5bG9yLWJyb29rcyIsbmFtZToiVGF5bG9yIEJyb29rcyIsYXZhdGFyOnt0ZXh0OiJUQiJ9LGFjdGl2ZTpEZSg0NDAwKSxzaGFyaW5nOntub3RlczpbIm5vdGUtd29yay0xNCJdLHRhZ3M6W119fSx7dXVpZDoicGVyc29uLWRhbmEtY29sZSIsbmFtZToiRGFuYSBDb2xlIixhdmF0YXI6e2ltYWdlOiJodHRwczovL2kucHJhdmF0YXIuY2MvODA/dT1kYW5hLWNvbGUifSxhY3RpdmU6RGUoNjApLHNoYXJpbmc6e25vdGVzOlsibm90ZS1wZXJzb25hbC0xIl0sdGFnczpbInBlcnNvbmFsIl19fSx7dXVpZDoicGVyc29uLXJvYmluLWZveCIsbmFtZToiUm9iaW4gRm94IixhdmF0YXI6e3RleHQ6IlJGIn0sYWN0aXZlOkRlKDQwMCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXBlcnNvbmFsLTkiXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1qYW1pZS1wYXJrIixuYW1lOiJKYW1pZSBQYXJrIixhdmF0YXI6e2ltYWdlOiJodHRwczovL2kucHJhdmF0YXIuY2MvODA/dT1qYW1pZS1wYXJrIn0sYWN0aXZlOkRlKDQyMCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXBlcnNvbmFsLTkiXSx0YWdzOltdfX0se3V1aWQ6InBlcnNvbi1tb3JnYW4tZWxsaXMiLG5hbWU6Ik1vcmdhbiBFbGxpcyIsYXZhdGFyOnt0ZXh0OiJNRSJ9LGFjdGl2ZTpEZSg1MCksc2hhcmluZzp7bm90ZXM6WyJub3RlLXNpZGUtMiJdLHRhZ3M6WyJzaWRlLXByb2plY3RzIl19fV0sX1Q9e3NoYXJlZDplPT4hIWU/LnNoYXJlZCx0YXNrTGlzdHM6ZT0+ZT8uaGFzVGFza3MhPT0hMX07ZnVuY3Rpb24geGYoZSx0KXtyZXR1cm4gdD9TdHJpbmcodCkuc3BsaXQoIiwiKS5tYXAobz0+by50cmltKCkpLmZpbHRlcihCb29sZWFuKS5ldmVyeShvPT57bGV0IHI9X1Rbb107cmV0dXJuIHI/cihlKTohMH0pOiEwfWZ1bmN0aW9uIFFiKGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wuYXN5bmNJdGVyYXRvcix7dmFsdWU6ZnVuY3Rpb24oKXtsZXQgdD0wO3JldHVybntuZXh0OigpPT50PGUubGVuZ3RoP1Byb21pc2UucmVzb2x2ZSh7dmFsdWU6ZVt0KytdLGRvbmU6ITF9KTpQcm9taXNlLnJlc29sdmUoe2RvbmU6ITB9KX19fSksZX12YXIgY3Q9InRvcCIsTnQ9ImJvdHRvbSIsYnQ9InJpZ2h0IixodD0ibGVmdCIsQmQ9ImF1dG8iLEFyPVtjdCxOdCxidCxodF0sJG89InN0YXJ0Iixacj0iZW5kIixaYj0iY2xpcHBpbmdQYXJlbnRzIixIZD0idmlld3BvcnQiLHRpPSJwb3BwZXIiLGV3PSJyZWZlcmVuY2UiLFNmPUFyLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdChbdCsiLSIrJG8sdCsiLSIrWnJdKX0sW10pLEtkPVtdLmNvbmNhdChBcixbQmRdKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQoW3QsdCsiLSIrJG8sdCsiLSIrWnJdKX0sW10pLFVUPSJiZWZvcmVSZWFkIixGVD0icmVhZCIselQ9ImFmdGVyUmVhZCIsV1Q9ImJlZm9yZU1haW4iLEJUPSJtYWluIixIVD0iYWZ0ZXJNYWluIixLVD0iYmVmb3JlV3JpdGUiLEdUPSJ3cml0ZSIsVlQ9ImFmdGVyV3JpdGUiLHR3PVtVVCxGVCx6VCxXVCxCVCxIVCxLVCxHVCxWVF07ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGU/KGUubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpOm51bGx9ZnVuY3Rpb24gdHQoZSl7aWYoZT09bnVsbClyZXR1cm4gd2luZG93O2lmKGUudG9TdHJpbmcoKSE9PSJbb2JqZWN0IFdpbmRvd10iKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQ7cmV0dXJuIHQmJnQuZGVmYXVsdFZpZXd8fHdpbmRvd31yZXR1cm4gZX1mdW5jdGlvbiBVbihlKXt2YXIgdD10dChlKS5FbGVtZW50O3JldHVybiBlIGluc3RhbmNlb2YgdHx8ZSBpbnN0YW5jZW9mIEVsZW1lbnR9ZnVuY3Rpb24gVHQoZSl7dmFyIHQ9dHQoZSkuSFRNTEVsZW1lbnQ7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9ZnVuY3Rpb24gbmkoZSl7aWYodHlwZW9mIFNoYWRvd1Jvb3Q+InUiKXJldHVybiExO3ZhciB0PXR0KGUpLlNoYWRvd1Jvb3Q7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgU2hhZG93Um9vdH1mdW5jdGlvbiBqVChlKXt2YXIgdD1lLnN0YXRlO09iamVjdC5rZXlzKHQuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24obil7dmFyIG89dC5zdHlsZXNbbl18fHt9LHI9dC5hdHRyaWJ1dGVzW25dfHx7fSxhPXQuZWxlbWVudHNbbl07IVR0KGEpfHwhT3QoYSl8fChPYmplY3QuYXNzaWduKGEuc3R5bGUsbyksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcz1yW2ldO3M9PT0hMT9hLnJlbW92ZUF0dHJpYnV0ZShpKTphLnNldEF0dHJpYnV0ZShpLHM9PT0hMD8iIjpzKX0pKX0pfWZ1bmN0aW9uIFlUKGUpe3ZhciB0PWUuc3RhdGUsbj17cG9wcGVyOntwb3NpdGlvbjp0Lm9wdGlvbnMuc3RyYXRlZ3ksbGVmdDoiMCIsdG9wOiIwIixtYXJnaW46IjAifSxhcnJvdzp7cG9zaXRpb246ImFic29sdXRlIn0scmVmZXJlbmNlOnt9fTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LmVsZW1lbnRzLnBvcHBlci5zdHlsZSxuLnBvcHBlciksdC5zdHlsZXM9bix0LmVsZW1lbnRzLmFycm93JiZPYmplY3QuYXNzaWduKHQuZWxlbWVudHMuYXJyb3cuc3R5bGUsbi5hcnJvdyksZnVuY3Rpb24oKXtPYmplY3Qua2V5cyh0LmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciByPXQuZWxlbWVudHNbb10sYT10LmF0dHJpYnV0ZXNbb118fHt9LGk9T2JqZWN0LmtleXModC5zdHlsZXMuaGFzT3duUHJvcGVydHkobyk/dC5zdHlsZXNbb106bltvXSkscz1pLnJlZHVjZShmdW5jdGlvbihsLGQpe3JldHVybiBsW2RdPSIiLGx9LHt9KTshVHQocil8fCFPdChyKXx8KE9iamVjdC5hc3NpZ24oci5zdHlsZSxzKSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGwpe3IucmVtb3ZlQXR0cmlidXRlKGwpfSkpfSl9fXZhciB3cz17bmFtZToiYXBwbHlTdHlsZXMiLGVuYWJsZWQ6ITAscGhhc2U6IndyaXRlIixmbjpqVCxlZmZlY3Q6WVQscmVxdWlyZXM6WyJjb21wdXRlU3R5bGVzIl19O2Z1bmN0aW9uIEl0KGUpe3JldHVybiBlLnNwbGl0KCItIilbMF19dmFyIGFvPU1hdGgubWF4LGVhPU1hdGgubWluLFhvPU1hdGgucm91bmQ7ZnVuY3Rpb24gb2koKXt2YXIgZT1uYXZpZ2F0b3IudXNlckFnZW50RGF0YTtyZXR1cm4gZSE9bnVsbCYmZS5icmFuZHMmJkFycmF5LmlzQXJyYXkoZS5icmFuZHMpP2UuYnJhbmRzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5icmFuZCsiLyIrdC52ZXJzaW9ufSkuam9pbigiICIpOm5hdmlnYXRvci51c2VyQWdlbnR9ZnVuY3Rpb24ga3MoKXtyZXR1cm4hL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChvaSgpKX1mdW5jdGlvbiBGbihlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTt2YXIgbz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9MSxhPTE7dCYmVHQoZSkmJihyPWUub2Zmc2V0V2lkdGg+MCYmWG8oby53aWR0aCkvZS5vZmZzZXRXaWR0aHx8MSxhPWUub2Zmc2V0SGVpZ2h0PjAmJlhvKG8uaGVpZ2h0KS9lLm9mZnNldEhlaWdodHx8MSk7dmFyIGk9VW4oZSk/dHQoZSk6d2luZG93LHM9aS52aXN1YWxWaWV3cG9ydCxsPSFrcygpJiZuLGQ9KG8ubGVmdCsobCYmcz9zLm9mZnNldExlZnQ6MCkpL3IsYz0oby50b3ArKGwmJnM/cy5vZmZzZXRUb3A6MCkpL2EsdT1vLndpZHRoL3IscD1vLmhlaWdodC9hO3JldHVybnt3aWR0aDp1LGhlaWdodDpwLHRvcDpjLHJpZ2h0OmQrdSxib3R0b206YytwLGxlZnQ6ZCx4OmQseTpjfX1mdW5jdGlvbiB0YShlKXt2YXIgdD1GbihlKSxuPWUub2Zmc2V0V2lkdGgsbz1lLm9mZnNldEhlaWdodDtyZXR1cm4gTWF0aC5hYnModC53aWR0aC1uKTw9MSYmKG49dC53aWR0aCksTWF0aC5hYnModC5oZWlnaHQtbyk8PTEmJihvPXQuaGVpZ2h0KSx7eDplLm9mZnNldExlZnQseTplLm9mZnNldFRvcCx3aWR0aDpuLGhlaWdodDpvfX1mdW5jdGlvbiB4cyhlLHQpe3ZhciBuPXQuZ2V0Um9vdE5vZGUmJnQuZ2V0Um9vdE5vZGUoKTtpZihlLmNvbnRhaW5zKHQpKXJldHVybiEwO2lmKG4mJm5pKG4pKXt2YXIgbz10O2Rve2lmKG8mJmUuaXNTYW1lTm9kZShvKSlyZXR1cm4hMDtvPW8ucGFyZW50Tm9kZXx8by5ob3N0fXdoaWxlKG8pfXJldHVybiExfWZ1bmN0aW9uIHJuKGUpe3JldHVybiB0dChlKS5nZXRDb21wdXRlZFN0eWxlKGUpfWZ1bmN0aW9uIEVmKGUpe3JldHVyblsidGFibGUiLCJ0ZCIsInRoIl0uaW5kZXhPZihPdChlKSk+PTB9ZnVuY3Rpb24gQnQoZSl7cmV0dXJuKChVbihlKT9lLm93bmVyRG9jdW1lbnQ6ZS5kb2N1bWVudCl8fHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIEpvKGUpe3JldHVybiBPdChlKT09PSJodG1sIj9lOmUuYXNzaWduZWRTbG90fHxlLnBhcmVudE5vZGV8fChuaShlKT9lLmhvc3Q6bnVsbCl8fEJ0KGUpfWZ1bmN0aW9uIG53KGUpe3JldHVybiFUdChlKXx8cm4oZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6ZS5vZmZzZXRQYXJlbnR9ZnVuY3Rpb24gcVQoZSl7dmFyIHQ9L2ZpcmVmb3gvaS50ZXN0KG9pKCkpLG49L1RyaWRlbnQvaS50ZXN0KG9pKCkpO2lmKG4mJlR0KGUpKXt2YXIgbz1ybihlKTtpZihvLnBvc2l0aW9uPT09ImZpeGVkIilyZXR1cm4gbnVsbH12YXIgcj1KbyhlKTtmb3IobmkocikmJihyPXIuaG9zdCk7VHQocikmJlsiaHRtbCIsImJvZHkiXS5pbmRleE9mKE90KHIpKTwwOyl7dmFyIGE9cm4ocik7aWYoYS50cmFuc2Zvcm0hPT0ibm9uZSJ8fGEucGVyc3BlY3RpdmUhPT0ibm9uZSJ8fGEuY29udGFpbj09PSJwYWludCJ8fFsidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiXS5pbmRleE9mKGEud2lsbENoYW5nZSkhPT0tMXx8dCYmYS53aWxsQ2hhbmdlPT09ImZpbHRlciJ8fHQmJmEuZmlsdGVyJiZhLmZpbHRlciE9PSJub25lIilyZXR1cm4gcjtyPXIucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpbyhlKXtmb3IodmFyIHQ9dHQoZSksbj1udyhlKTtuJiZFZihuKSYmcm4obikucG9zaXRpb249PT0ic3RhdGljIjspbj1udyhuKTtyZXR1cm4gbiYmKE90KG4pPT09Imh0bWwifHxPdChuKT09PSJib2R5IiYmcm4obikucG9zaXRpb249PT0ic3RhdGljIik/dDpufHxxVChlKXx8dH1mdW5jdGlvbiBuYShlKXtyZXR1cm5bInRvcCIsImJvdHRvbSJdLmluZGV4T2YoZSk+PTA/IngiOiJ5In1mdW5jdGlvbiBvYShlLHQsbil7cmV0dXJuIGFvKGUsZWEodCxuKSl9ZnVuY3Rpb24gb3coZSx0LG4pe3ZhciBvPW9hKGUsdCxuKTtyZXR1cm4gbz5uP246b31mdW5jdGlvbiBTcygpe3JldHVybnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH19ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sU3MoKSxlKX1mdW5jdGlvbiBOcyhlLHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihuLG8pe3JldHVybiBuW29dPWUsbn0se30pfXZhciAkVD1mdW5jdGlvbih0LG4pe3JldHVybiB0PXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoT2JqZWN0LmFzc2lnbih7fSxuLnJlY3RzLHtwbGFjZW1lbnQ6bi5wbGFjZW1lbnR9KSk6dCxFcyh0eXBlb2YgdCE9Im51bWJlciI/dDpOcyh0LEFyKSl9O2Z1bmN0aW9uIFhUKGUpe3ZhciB0LG49ZS5zdGF0ZSxvPWUubmFtZSxyPWUub3B0aW9ucyxhPW4uZWxlbWVudHMuYXJyb3csaT1uLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxzPUl0KG4ucGxhY2VtZW50KSxsPW5hKHMpLGQ9W2h0LGJ0XS5pbmRleE9mKHMpPj0wLGM9ZD8iaGVpZ2h0Ijoid2lkdGgiO2lmKCEoIWF8fCFpKSl7dmFyIHU9JFQoci5wYWRkaW5nLG4pLHA9dGEoYSksZj1sPT09InkiP2N0Omh0LG09bD09PSJ5Ij9OdDpidCxnPW4ucmVjdHMucmVmZXJlbmNlW2NdK24ucmVjdHMucmVmZXJlbmNlW2xdLWlbbF0tbi5yZWN0cy5wb3BwZXJbY10sdz1pW2xdLW4ucmVjdHMucmVmZXJlbmNlW2xdLHY9aW8oYSkseT12P2w9PT0ieSI/di5jbGllbnRIZWlnaHR8fDA6di5jbGllbnRXaWR0aHx8MDowLGI9Zy8yLXcvMixoPXVbZl0sUz15LXBbY10tdVttXSx4PXkvMi1wW2NdLzIrYixFPW9hKGgseCxTKSxUPWw7bi5tb2RpZmllcnNEYXRhW29dPSh0PXt9LHRbVF09RSx0LmNlbnRlck9mZnNldD1FLXgsdCl9fWZ1bmN0aW9uIEpUKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMsbz1uLmVsZW1lbnQscj1vPT09dm9pZCAwPyJbZGF0YS1wb3BwZXItYXJyb3ddIjpvO3IhPW51bGwmJih0eXBlb2Ygcj09InN0cmluZyImJihyPXQuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IociksIXIpfHx4cyh0LmVsZW1lbnRzLnBvcHBlcixyKSYmKHQuZWxlbWVudHMuYXJyb3c9cikpfXZhciBydz17bmFtZToiYXJyb3ciLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOlhULGVmZmVjdDpKVCxyZXF1aXJlczpbInBvcHBlck9mZnNldHMiXSxyZXF1aXJlc0lmRXhpc3RzOlsicHJldmVudE92ZXJmbG93Il19O2Z1bmN0aW9uIHpuKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19dmFyIFFUPXt0b3A6ImF1dG8iLHJpZ2h0OiJhdXRvIixib3R0b206ImF1dG8iLGxlZnQ6ImF1dG8ifTtmdW5jdGlvbiBaVChlLHQpe3ZhciBuPWUueCxvPWUueSxyPXQuZGV2aWNlUGl4ZWxSYXRpb3x8MTtyZXR1cm57eDpYbyhuKnIpL3J8fDAseTpYbyhvKnIpL3J8fDB9fWZ1bmN0aW9uIGF3KGUpe3ZhciB0LG49ZS5wb3BwZXIsbz1lLnBvcHBlclJlY3Qscj1lLnBsYWNlbWVudCxhPWUudmFyaWF0aW9uLGk9ZS5vZmZzZXRzLHM9ZS5wb3NpdGlvbixsPWUuZ3B1QWNjZWxlcmF0aW9uLGQ9ZS5hZGFwdGl2ZSxjPWUucm91bmRPZmZzZXRzLHU9ZS5pc0ZpeGVkLHA9aS54LGY9cD09PXZvaWQgMD8wOnAsbT1pLnksZz1tPT09dm9pZCAwPzA6bSx3PXR5cGVvZiBjPT0iZnVuY3Rpb24iP2Moe3g6Zix5Omd9KTp7eDpmLHk6Z307Zj13LngsZz13Lnk7dmFyIHY9aS5oYXNPd25Qcm9wZXJ0eSgieCIpLHk9aS5oYXNPd25Qcm9wZXJ0eSgieSIpLGI9aHQsaD1jdCxTPXdpbmRvdztpZihkKXt2YXIgeD1pbyhuKSxFPSJjbGllbnRIZWlnaHQiLFQ9ImNsaWVudFdpZHRoIjtpZih4PT09dHQobikmJih4PUJ0KG4pLHJuKHgpLnBvc2l0aW9uIT09InN0YXRpYyImJnM9PT0iYWJzb2x1dGUiJiYoRT0ic2Nyb2xsSGVpZ2h0IixUPSJzY3JvbGxXaWR0aCIpKSx4PXgscj09PWN0fHwocj09PWh0fHxyPT09YnQpJiZhPT09WnIpe2g9TnQ7dmFyIEE9dSYmeD09PVMmJlMudmlzdWFsVmlld3BvcnQ/Uy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6eFtFXTtnLT1BLW8uaGVpZ2h0LGcqPWw/MTotMX1pZihyPT09aHR8fChyPT09Y3R8fHI9PT1OdCkmJmE9PT1acil7Yj1idDt2YXIgQz11JiZ4PT09UyYmUy52aXN1YWxWaWV3cG9ydD9TLnZpc3VhbFZpZXdwb3J0LndpZHRoOnhbVF07Zi09Qy1vLndpZHRoLGYqPWw/MTotMX19dmFyIE89T2JqZWN0LmFzc2lnbih7cG9zaXRpb246c30sZCYmUVQpLFA9Yz09PSEwP1pUKHt4OmYseTpnfSx0dChuKSk6e3g6Zix5Omd9O2lmKGY9UC54LGc9UC55LGwpe3ZhciBVO3JldHVybiBPYmplY3QuYXNzaWduKHt9LE8sKFU9e30sVVtoXT15PyIwIjoiIixVW2JdPXY/IjAiOiIiLFUudHJhbnNmb3JtPShTLmRldmljZVBpeGVsUmF0aW98fDEpPD0xPyJ0cmFuc2xhdGUoIitmKyJweCwgIitnKyJweCkiOiJ0cmFuc2xhdGUzZCgiK2YrInB4LCAiK2crInB4LCAwKSIsVSkpfXJldHVybiBPYmplY3QuYXNzaWduKHt9LE8sKHQ9e30sdFtoXT15P2crInB4IjoiIix0W2JdPXY/ZisicHgiOiIiLHQudHJhbnNmb3JtPSIiLHQpKX1mdW5jdGlvbiBlRChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLG89bi5ncHVBY2NlbGVyYXRpb24scj1vPT09dm9pZCAwPyEwOm8sYT1uLmFkYXB0aXZlLGk9YT09PXZvaWQgMD8hMDphLHM9bi5yb3VuZE9mZnNldHMsbD1zPT09dm9pZCAwPyEwOnMsZD17cGxhY2VtZW50Okl0KHQucGxhY2VtZW50KSx2YXJpYXRpb246em4odC5wbGFjZW1lbnQpLHBvcHBlcjp0LmVsZW1lbnRzLnBvcHBlcixwb3BwZXJSZWN0OnQucmVjdHMucG9wcGVyLGdwdUFjY2VsZXJhdGlvbjpyLGlzRml4ZWQ6dC5vcHRpb25zLnN0cmF0ZWd5PT09ImZpeGVkIn07dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMhPW51bGwmJih0LnN0eWxlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5wb3BwZXIsYXcoT2JqZWN0LmFzc2lnbih7fSxkLHtvZmZzZXRzOnQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLHBvc2l0aW9uOnQub3B0aW9ucy5zdHJhdGVneSxhZGFwdGl2ZTppLHJvdW5kT2Zmc2V0czpsfSkpKSksdC5tb2RpZmllcnNEYXRhLmFycm93IT1udWxsJiYodC5zdHlsZXMuYXJyb3c9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5hcnJvdyxhdyhPYmplY3QuYXNzaWduKHt9LGQse29mZnNldHM6dC5tb2RpZmllcnNEYXRhLmFycm93LHBvc2l0aW9uOiJhYnNvbHV0ZSIsYWRhcHRpdmU6ITEscm91bmRPZmZzZXRzOmx9KSkpKSx0LmF0dHJpYnV0ZXMucG9wcGVyPU9iamVjdC5hc3NpZ24oe30sdC5hdHRyaWJ1dGVzLnBvcHBlcix7ImRhdGEtcG9wcGVyLXBsYWNlbWVudCI6dC5wbGFjZW1lbnR9KX12YXIgaXc9e25hbWU6ImNvbXB1dGVTdHlsZXMiLGVuYWJsZWQ6ITAscGhhc2U6ImJlZm9yZVdyaXRlIixmbjplRCxkYXRhOnt9fTt2YXIgR2Q9e3Bhc3NpdmU6ITB9O2Z1bmN0aW9uIHREKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmluc3RhbmNlLG89ZS5vcHRpb25zLHI9by5zY3JvbGwsYT1yPT09dm9pZCAwPyEwOnIsaT1vLnJlc2l6ZSxzPWk9PT12b2lkIDA/ITA6aSxsPXR0KHQuZWxlbWVudHMucG9wcGVyKSxkPVtdLmNvbmNhdCh0LnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLHQuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO3JldHVybiBhJiZkLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLEdkKX0pLHMmJmwuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxHZCksZnVuY3Rpb24oKXthJiZkLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLEdkKX0pLHMmJmwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxHZCl9fXZhciBzdz17bmFtZToiZXZlbnRMaXN0ZW5lcnMiLGVuYWJsZWQ6ITAscGhhc2U6IndyaXRlIixmbjpmdW5jdGlvbigpe30sZWZmZWN0OnRELGRhdGE6e319O3ZhciBuRD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifTtmdW5jdGlvbiByaShlKXtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxmdW5jdGlvbih0KXtyZXR1cm4gbkRbdF19KX12YXIgb0Q9e3N0YXJ0OiJlbmQiLGVuZDoic3RhcnQifTtmdW5jdGlvbiBWZChlKXtyZXR1cm4gZS5yZXBsYWNlKC9zdGFydHxlbmQvZyxmdW5jdGlvbih0KXtyZXR1cm4gb0RbdF19KX1mdW5jdGlvbiByYShlKXt2YXIgdD10dChlKSxuPXQucGFnZVhPZmZzZXQsbz10LnBhZ2VZT2Zmc2V0O3JldHVybntzY3JvbGxMZWZ0Om4sc2Nyb2xsVG9wOm99fWZ1bmN0aW9uIGFhKGUpe3JldHVybiBGbihCdChlKSkubGVmdCtyYShlKS5zY3JvbGxMZWZ0fWZ1bmN0aW9uIE5mKGUsdCl7dmFyIG49dHQoZSksbz1CdChlKSxyPW4udmlzdWFsVmlld3BvcnQsYT1vLmNsaWVudFdpZHRoLGk9by5jbGllbnRIZWlnaHQscz0wLGw9MDtpZihyKXthPXIud2lkdGgsaT1yLmhlaWdodDt2YXIgZD1rcygpOyhkfHwhZCYmdD09PSJmaXhlZCIpJiYocz1yLm9mZnNldExlZnQsbD1yLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmEsaGVpZ2h0OmkseDpzK2FhKGUpLHk6bH19ZnVuY3Rpb24gVGYoZSl7dmFyIHQsbj1CdChlKSxvPXJhKGUpLHI9KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5ib2R5LGE9YW8obi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoLHI/ci5zY3JvbGxXaWR0aDowLHI/ci5jbGllbnRXaWR0aDowKSxpPWFvKG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0LHI/ci5zY3JvbGxIZWlnaHQ6MCxyP3IuY2xpZW50SGVpZ2h0OjApLHM9LW8uc2Nyb2xsTGVmdCthYShlKSxsPS1vLnNjcm9sbFRvcDtyZXR1cm4gcm4ocnx8bikuZGlyZWN0aW9uPT09InJ0bCImJihzKz1hbyhuLmNsaWVudFdpZHRoLHI/ci5jbGllbnRXaWR0aDowKS1hKSx7d2lkdGg6YSxoZWlnaHQ6aSx4OnMseTpsfX1mdW5jdGlvbiBpYShlKXt2YXIgdD1ybihlKSxuPXQub3ZlcmZsb3csbz10Lm92ZXJmbG93WCxyPXQub3ZlcmZsb3dZO3JldHVybi9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChuK3Irbyl9ZnVuY3Rpb24gamQoZSl7cmV0dXJuWyJodG1sIiwiYm9keSIsIiNkb2N1bWVudCJdLmluZGV4T2YoT3QoZSkpPj0wP2Uub3duZXJEb2N1bWVudC5ib2R5OlR0KGUpJiZpYShlKT9lOmpkKEpvKGUpKX1mdW5jdGlvbiBDcihlLHQpe3ZhciBuO3Q9PT12b2lkIDAmJih0PVtdKTt2YXIgbz1qZChlKSxyPW89PT0oKG49ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6bi5ib2R5KSxhPXR0KG8pLGk9cj9bYV0uY29uY2F0KGEudmlzdWFsVmlld3BvcnR8fFtdLGlhKG8pP286W10pOm8scz10LmNvbmNhdChpKTtyZXR1cm4gcj9zOnMuY29uY2F0KENyKEpvKGkpKSl9ZnVuY3Rpb24gYWkoZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx7bGVmdDplLngsdG9wOmUueSxyaWdodDplLngrZS53aWR0aCxib3R0b206ZS55K2UuaGVpZ2h0fSl9ZnVuY3Rpb24gckQoZSx0KXt2YXIgbj1GbihlLCExLHQ9PT0iZml4ZWQiKTtyZXR1cm4gbi50b3A9bi50b3ArZS5jbGllbnRUb3Asbi5sZWZ0PW4ubGVmdCtlLmNsaWVudExlZnQsbi5ib3R0b209bi50b3ArZS5jbGllbnRIZWlnaHQsbi5yaWdodD1uLmxlZnQrZS5jbGllbnRXaWR0aCxuLndpZHRoPWUuY2xpZW50V2lkdGgsbi5oZWlnaHQ9ZS5jbGllbnRIZWlnaHQsbi54PW4ubGVmdCxuLnk9bi50b3Asbn1mdW5jdGlvbiBsdyhlLHQsbil7cmV0dXJuIHQ9PT1IZD9haShOZihlLG4pKTpVbih0KT9yRCh0LG4pOmFpKFRmKEJ0KGUpKSl9ZnVuY3Rpb24gYUQoZSl7dmFyIHQ9Q3IoSm8oZSkpLG49WyJhYnNvbHV0ZSIsImZpeGVkIl0uaW5kZXhPZihybihlKS5wb3NpdGlvbik+PTAsbz1uJiZUdChlKT9pbyhlKTplO3JldHVybiBVbihvKT90LmZpbHRlcihmdW5jdGlvbihyKXtyZXR1cm4gVW4ocikmJnhzKHIsbykmJk90KHIpIT09ImJvZHkifSk6W119ZnVuY3Rpb24gRGYoZSx0LG4sbyl7dmFyIHI9dD09PSJjbGlwcGluZ1BhcmVudHMiP2FEKGUpOltdLmNvbmNhdCh0KSxhPVtdLmNvbmNhdChyLFtuXSksaT1hWzBdLHM9YS5yZWR1Y2UoZnVuY3Rpb24obCxkKXt2YXIgYz1sdyhlLGQsbyk7cmV0dXJuIGwudG9wPWFvKGMudG9wLGwudG9wKSxsLnJpZ2h0PWVhKGMucmlnaHQsbC5yaWdodCksbC5ib3R0b209ZWEoYy5ib3R0b20sbC5ib3R0b20pLGwubGVmdD1hbyhjLmxlZnQsbC5sZWZ0KSxsfSxsdyhlLGksbykpO3JldHVybiBzLndpZHRoPXMucmlnaHQtcy5sZWZ0LHMuaGVpZ2h0PXMuYm90dG9tLXMudG9wLHMueD1zLmxlZnQscy55PXMudG9wLHN9ZnVuY3Rpb24gVHMoZSl7dmFyIHQ9ZS5yZWZlcmVuY2Usbj1lLmVsZW1lbnQsbz1lLnBsYWNlbWVudCxyPW8/SXQobyk6bnVsbCxhPW8/em4obyk6bnVsbCxpPXQueCt0LndpZHRoLzItbi53aWR0aC8yLHM9dC55K3QuaGVpZ2h0LzItbi5oZWlnaHQvMixsO3N3aXRjaChyKXtjYXNlIGN0Omw9e3g6aSx5OnQueS1uLmhlaWdodH07YnJlYWs7Y2FzZSBOdDpsPXt4OmkseTp0LnkrdC5oZWlnaHR9O2JyZWFrO2Nhc2UgYnQ6bD17eDp0LngrdC53aWR0aCx5OnN9O2JyZWFrO2Nhc2UgaHQ6bD17eDp0Lngtbi53aWR0aCx5OnN9O2JyZWFrO2RlZmF1bHQ6bD17eDp0LngseTp0Lnl9fXZhciBkPXI/bmEocik6bnVsbDtpZihkIT1udWxsKXt2YXIgYz1kPT09InkiPyJoZWlnaHQiOiJ3aWR0aCI7c3dpdGNoKGEpe2Nhc2UgJG86bFtkXT1sW2RdLSh0W2NdLzItbltjXS8yKTticmVhaztjYXNlIFpyOmxbZF09bFtkXSsodFtjXS8yLW5bY10vMik7YnJlYWs7ZGVmYXVsdDp9fXJldHVybiBsfWZ1bmN0aW9uIHNvKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQsbz1uLnBsYWNlbWVudCxyPW89PT12b2lkIDA/ZS5wbGFjZW1lbnQ6byxhPW4uc3RyYXRlZ3ksaT1hPT09dm9pZCAwP2Uuc3RyYXRlZ3k6YSxzPW4uYm91bmRhcnksbD1zPT09dm9pZCAwP1piOnMsZD1uLnJvb3RCb3VuZGFyeSxjPWQ9PT12b2lkIDA/SGQ6ZCx1PW4uZWxlbWVudENvbnRleHQscD11PT09dm9pZCAwP3RpOnUsZj1uLmFsdEJvdW5kYXJ5LG09Zj09PXZvaWQgMD8hMTpmLGc9bi5wYWRkaW5nLHc9Zz09PXZvaWQgMD8wOmcsdj1Fcyh0eXBlb2YgdyE9Im51bWJlciI/dzpOcyh3LEFyKSkseT1wPT09dGk/ZXc6dGksYj1lLnJlY3RzLnBvcHBlcixoPWUuZWxlbWVudHNbbT95OnBdLFM9RGYoVW4oaCk/aDpoLmNvbnRleHRFbGVtZW50fHxCdChlLmVsZW1lbnRzLnBvcHBlciksbCxjLGkpLHg9Rm4oZS5lbGVtZW50cy5yZWZlcmVuY2UpLEU9VHMoe3JlZmVyZW5jZTp4LGVsZW1lbnQ6YixzdHJhdGVneToiYWJzb2x1dGUiLHBsYWNlbWVudDpyfSksVD1haShPYmplY3QuYXNzaWduKHt9LGIsRSkpLEE9cD09PXRpP1Q6eCxDPXt0b3A6Uy50b3AtQS50b3Ardi50b3AsYm90dG9tOkEuYm90dG9tLVMuYm90dG9tK3YuYm90dG9tLGxlZnQ6Uy5sZWZ0LUEubGVmdCt2LmxlZnQscmlnaHQ6QS5yaWdodC1TLnJpZ2h0K3YucmlnaHR9LE89ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtpZihwPT09dGkmJk8pe3ZhciBQPU9bcl07T2JqZWN0LmtleXMoQykuZm9yRWFjaChmdW5jdGlvbihVKXt2YXIgST1bYnQsTnRdLmluZGV4T2YoVSk+PTA/MTotMSxIPVtjdCxOdF0uaW5kZXhPZihVKT49MD8ieSI6IngiO0NbVV0rPVBbSF0qSX0pfXJldHVybiBDfWZ1bmN0aW9uIEFmKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQsbz1uLnBsYWNlbWVudCxyPW4uYm91bmRhcnksYT1uLnJvb3RCb3VuZGFyeSxpPW4ucGFkZGluZyxzPW4uZmxpcFZhcmlhdGlvbnMsbD1uLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxkPWw9PT12b2lkIDA/S2Q6bCxjPXpuKG8pLHU9Yz9zP1NmOlNmLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gem4obSk9PT1jfSk6QXIscD11LmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gZC5pbmRleE9mKG0pPj0wfSk7cC5sZW5ndGg9PT0wJiYocD11KTt2YXIgZj1wLnJlZHVjZShmdW5jdGlvbihtLGcpe3JldHVybiBtW2ddPXNvKGUse3BsYWNlbWVudDpnLGJvdW5kYXJ5OnIscm9vdEJvdW5kYXJ5OmEscGFkZGluZzppfSlbSXQoZyldLG19LHt9KTtyZXR1cm4gT2JqZWN0LmtleXMoZikuc29ydChmdW5jdGlvbihtLGcpe3JldHVybiBmW21dLWZbZ119KX1mdW5jdGlvbiBpRChlKXtpZihJdChlKT09PUJkKXJldHVybltdO3ZhciB0PXJpKGUpO3JldHVybltWZChlKSx0LFZkKHQpXX1mdW5jdGlvbiBzRChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLG89ZS5uYW1lO2lmKCF0Lm1vZGlmaWVyc0RhdGFbb10uX3NraXApe2Zvcih2YXIgcj1uLm1haW5BeGlzLGE9cj09PXZvaWQgMD8hMDpyLGk9bi5hbHRBeGlzLHM9aT09PXZvaWQgMD8hMDppLGw9bi5mYWxsYmFja1BsYWNlbWVudHMsZD1uLnBhZGRpbmcsYz1uLmJvdW5kYXJ5LHU9bi5yb290Qm91bmRhcnkscD1uLmFsdEJvdW5kYXJ5LGY9bi5mbGlwVmFyaWF0aW9ucyxtPWY9PT12b2lkIDA/ITA6ZixnPW4uYWxsb3dlZEF1dG9QbGFjZW1lbnRzLHc9dC5vcHRpb25zLnBsYWNlbWVudCx2PUl0KHcpLHk9dj09PXcsYj1sfHwoeXx8IW0/W3JpKHcpXTppRCh3KSksaD1bd10uY29uY2F0KGIpLnJlZHVjZShmdW5jdGlvbihqLFope3JldHVybiBqLmNvbmNhdChJdChaKT09PUJkP0FmKHQse3BsYWNlbWVudDpaLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5OnUscGFkZGluZzpkLGZsaXBWYXJpYXRpb25zOm0sYWxsb3dlZEF1dG9QbGFjZW1lbnRzOmd9KTpaKX0sW10pLFM9dC5yZWN0cy5yZWZlcmVuY2UseD10LnJlY3RzLnBvcHBlcixFPW5ldyBNYXAsVD0hMCxBPWhbMF0sQz0wO0M8aC5sZW5ndGg7QysrKXt2YXIgTz1oW0NdLFA9SXQoTyksVT16bihPKT09PSRvLEk9W2N0LE50XS5pbmRleE9mKFApPj0wLEg9ST8id2lkdGgiOiJoZWlnaHQiLF89c28odCx7cGxhY2VtZW50Ok8sYm91bmRhcnk6Yyxyb290Qm91bmRhcnk6dSxhbHRCb3VuZGFyeTpwLHBhZGRpbmc6ZH0pLEs9ST9VP2J0Omh0OlU/TnQ6Y3Q7U1tIXT54W0hdJiYoSz1yaShLKSk7dmFyIE09cmkoSyksVz1bXTtpZihhJiZXLnB1c2goX1tQXTw9MCkscyYmVy5wdXNoKF9bS108PTAsX1tNXTw9MCksVy5ldmVyeShmdW5jdGlvbihqKXtyZXR1cm4gan0pKXtBPU8sVD0hMTticmVha31FLnNldChPLFcpfWlmKFQpZm9yKHZhciBEPW0/MzoxLE49ZnVuY3Rpb24oWil7dmFyIG9lPWguZmluZChmdW5jdGlvbihxKXt2YXIgdGU9RS5nZXQocSk7aWYodGUpcmV0dXJuIHRlLnNsaWNlKDAsWikuZXZlcnkoZnVuY3Rpb24oZGUpe3JldHVybiBkZX0pfSk7aWYob2UpcmV0dXJuIEE9b2UsImJyZWFrIn0sRj1EO0Y+MDtGLS0pe3ZhciBZPU4oRik7aWYoWT09PSJicmVhayIpYnJlYWt9dC5wbGFjZW1lbnQhPT1BJiYodC5tb2RpZmllcnNEYXRhW29dLl9za2lwPSEwLHQucGxhY2VtZW50PUEsdC5yZXNldD0hMCl9fXZhciBkdz17bmFtZToiZmxpcCIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46c0QscmVxdWlyZXNJZkV4aXN0czpbIm9mZnNldCJdLGRhdGE6e19za2lwOiExfX07ZnVuY3Rpb24gY3coZSx0LG4pe3JldHVybiBuPT09dm9pZCAwJiYobj17eDowLHk6MH0pLHt0b3A6ZS50b3AtdC5oZWlnaHQtbi55LHJpZ2h0OmUucmlnaHQtdC53aWR0aCtuLngsYm90dG9tOmUuYm90dG9tLXQuaGVpZ2h0K24ueSxsZWZ0OmUubGVmdC10LndpZHRoLW4ueH19ZnVuY3Rpb24gdXcoZSl7cmV0dXJuW2N0LGJ0LE50LGh0XS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdPj0wfSl9ZnVuY3Rpb24gbEQoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUubmFtZSxvPXQucmVjdHMucmVmZXJlbmNlLHI9dC5yZWN0cy5wb3BwZXIsYT10Lm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93LGk9c28odCx7ZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxzPXNvKHQse2FsdEJvdW5kYXJ5OiEwfSksbD1jdyhpLG8pLGQ9Y3cocyxyLGEpLGM9dXcobCksdT11dyhkKTt0Lm1vZGlmaWVyc0RhdGFbbl09e3JlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czpsLHBvcHBlckVzY2FwZU9mZnNldHM6ZCxpc1JlZmVyZW5jZUhpZGRlbjpjLGhhc1BvcHBlckVzY2FwZWQ6dX0sdC5hdHRyaWJ1dGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LHQuYXR0cmlidXRlcy5wb3BwZXIseyJkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuIjpjLCJkYXRhLXBvcHBlci1lc2NhcGVkIjp1fSl9dmFyIHB3PXtuYW1lOiJoaWRlIixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixyZXF1aXJlc0lmRXhpc3RzOlsicHJldmVudE92ZXJmbG93Il0sZm46bER9O2Z1bmN0aW9uIGREKGUsdCxuKXt2YXIgbz1JdChlKSxyPVtodCxjdF0uaW5kZXhPZihvKT49MD8tMToxLGE9dHlwZW9mIG49PSJmdW5jdGlvbiI/bihPYmplY3QuYXNzaWduKHt9LHQse3BsYWNlbWVudDplfSkpOm4saT1hWzBdLHM9YVsxXTtyZXR1cm4gaT1pfHwwLHM9KHN8fDApKnIsW2h0LGJ0XS5pbmRleE9mKG8pPj0wP3t4OnMseTppfTp7eDppLHk6c319ZnVuY3Rpb24gY0QoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxvPWUubmFtZSxyPW4ub2Zmc2V0LGE9cj09PXZvaWQgMD9bMCwwXTpyLGk9S2QucmVkdWNlKGZ1bmN0aW9uKGMsdSl7cmV0dXJuIGNbdV09ZEQodSx0LnJlY3RzLGEpLGN9LHt9KSxzPWlbdC5wbGFjZW1lbnRdLGw9cy54LGQ9cy55O3QubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzIT1udWxsJiYodC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCs9bCx0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55Kz1kKSx0Lm1vZGlmaWVyc0RhdGFbb109aX12YXIgZnc9e25hbWU6Im9mZnNldCIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIscmVxdWlyZXM6WyJwb3BwZXJPZmZzZXRzIl0sZm46Y0R9O2Z1bmN0aW9uIHVEKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm5hbWU7dC5tb2RpZmllcnNEYXRhW25dPVRzKHtyZWZlcmVuY2U6dC5yZWN0cy5yZWZlcmVuY2UsZWxlbWVudDp0LnJlY3RzLnBvcHBlcixzdHJhdGVneToiYWJzb2x1dGUiLHBsYWNlbWVudDp0LnBsYWNlbWVudH0pfXZhciBtdz17bmFtZToicG9wcGVyT2Zmc2V0cyIsZW5hYmxlZDohMCxwaGFzZToicmVhZCIsZm46dUQsZGF0YTp7fX07ZnVuY3Rpb24gQ2YoZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBwRChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLG89ZS5uYW1lLHI9bi5tYWluQXhpcyxhPXI9PT12b2lkIDA/ITA6cixpPW4uYWx0QXhpcyxzPWk9PT12b2lkIDA/ITE6aSxsPW4uYm91bmRhcnksZD1uLnJvb3RCb3VuZGFyeSxjPW4uYWx0Qm91bmRhcnksdT1uLnBhZGRpbmcscD1uLnRldGhlcixmPXA9PT12b2lkIDA/ITA6cCxtPW4udGV0aGVyT2Zmc2V0LGc9bT09PXZvaWQgMD8wOm0sdz1zbyh0LHtib3VuZGFyeTpsLHJvb3RCb3VuZGFyeTpkLHBhZGRpbmc6dSxhbHRCb3VuZGFyeTpjfSksdj1JdCh0LnBsYWNlbWVudCkseT16bih0LnBsYWNlbWVudCksYj0heSxoPW5hKHYpLFM9Q2YoaCkseD10Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxFPXQucmVjdHMucmVmZXJlbmNlLFQ9dC5yZWN0cy5wb3BwZXIsQT10eXBlb2YgZz09ImZ1bmN0aW9uIj9nKE9iamVjdC5hc3NpZ24oe30sdC5yZWN0cyx7cGxhY2VtZW50OnQucGxhY2VtZW50fSkpOmcsQz10eXBlb2YgQT09Im51bWJlciI/e21haW5BeGlzOkEsYWx0QXhpczpBfTpPYmplY3QuYXNzaWduKHttYWluQXhpczowLGFsdEF4aXM6MH0sQSksTz10Lm1vZGlmaWVyc0RhdGEub2Zmc2V0P3QubW9kaWZpZXJzRGF0YS5vZmZzZXRbdC5wbGFjZW1lbnRdOm51bGwsUD17eDowLHk6MH07aWYoeCl7aWYoYSl7dmFyIFUsST1oPT09InkiP2N0Omh0LEg9aD09PSJ5Ij9OdDpidCxfPWg9PT0ieSI/ImhlaWdodCI6IndpZHRoIixLPXhbaF0sTT1LK3dbSV0sVz1LLXdbSF0sRD1mPy1UW19dLzI6MCxOPXk9PT0kbz9FW19dOlRbX10sRj15PT09JG8/LVRbX106LUVbX10sWT10LmVsZW1lbnRzLmFycm93LGo9ZiYmWT90YShZKTp7d2lkdGg6MCxoZWlnaHQ6MH0sWj10Lm1vZGlmaWVyc0RhdGFbImFycm93I3BlcnNpc3RlbnQiXT90Lm1vZGlmaWVyc0RhdGFbImFycm93I3BlcnNpc3RlbnQiXS5wYWRkaW5nOlNzKCksb2U9WltJXSxxPVpbSF0sdGU9b2EoMCxFW19dLGpbX10pLGRlPWI/RVtfXS8yLUQtdGUtb2UtQy5tYWluQXhpczpOLXRlLW9lLUMubWFpbkF4aXMsbGU9Yj8tRVtfXS8yK0QrdGUrcStDLm1haW5BeGlzOkYrdGUrcStDLm1haW5BeGlzLHBlPXQuZWxlbWVudHMuYXJyb3cmJmlvKHQuZWxlbWVudHMuYXJyb3cpLGtlPXBlP2g9PT0ieSI/cGUuY2xpZW50VG9wfHwwOnBlLmNsaWVudExlZnR8fDA6MCxQZT0oVT1PPy5baF0pIT1udWxsP1U6MCx1ZT1LK2RlLVBlLWtlLHFlPUsrbGUtUGUsSmU9b2EoZj9lYShNLHVlKTpNLEssZj9hbyhXLHFlKTpXKTt4W2hdPUplLFBbaF09SmUtS31pZihzKXt2YXIgUWUseXQ9aD09PSJ4Ij9jdDpodCxMdD1oPT09IngiP050OmJ0LEhlPXhbU10sYmU9Uz09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgiLG90PUhlK3dbeXRdLHJ0PUhlLXdbTHRdLGt0PVtjdCxodF0uaW5kZXhPZih2KSE9PS0xLGhlPShRZT1PPy5bU10pIT1udWxsP1FlOjAsZmU9a3Q/b3Q6SGUtRVtiZV0tVFtiZV0taGUrQy5hbHRBeGlzLF90PWt0P0hlK0VbYmVdK1RbYmVdLWhlLUMuYWx0QXhpczpydCxYbj1mJiZrdD9vdyhmZSxIZSxfdCk6b2EoZj9mZTpvdCxIZSxmP190OnJ0KTt4W1NdPVhuLFBbU109WG4tSGV9dC5tb2RpZmllcnNEYXRhW29dPVB9fXZhciBodz17bmFtZToicHJldmVudE92ZXJmbG93IixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixmbjpwRCxyZXF1aXJlc0lmRXhpc3RzOlsib2Zmc2V0Il19O2Z1bmN0aW9uIE1mKGUpe3JldHVybntzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9fWZ1bmN0aW9uIE9mKGUpe3JldHVybiBlPT09dHQoZSl8fCFUdChlKT9yYShlKTpNZihlKX1mdW5jdGlvbiBmRChlKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49WG8odC53aWR0aCkvZS5vZmZzZXRXaWR0aHx8MSxvPVhvKHQuaGVpZ2h0KS9lLm9mZnNldEhlaWdodHx8MTtyZXR1cm4gbiE9PTF8fG8hPT0xfWZ1bmN0aW9uIElmKGUsdCxuKXtuPT09dm9pZCAwJiYobj0hMSk7dmFyIG89VHQodCkscj1UdCh0KSYmZkQodCksYT1CdCh0KSxpPUZuKGUscixuKSxzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGw9e3g6MCx5OjB9O3JldHVybihvfHwhbyYmIW4pJiYoKE90KHQpIT09ImJvZHkifHxpYShhKSkmJihzPU9mKHQpKSxUdCh0KT8obD1Gbih0LCEwKSxsLngrPXQuY2xpZW50TGVmdCxsLnkrPXQuY2xpZW50VG9wKTphJiYobC54PWFhKGEpKSkse3g6aS5sZWZ0K3Muc2Nyb2xsTGVmdC1sLngseTppLnRvcCtzLnNjcm9sbFRvcC1sLnksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9fWZ1bmN0aW9uIG1EKGUpe3ZhciB0PW5ldyBNYXAsbj1uZXcgU2V0LG89W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3Quc2V0KGEubmFtZSxhKX0pO2Z1bmN0aW9uIHIoYSl7bi5hZGQoYS5uYW1lKTt2YXIgaT1bXS5jb25jYXQoYS5yZXF1aXJlc3x8W10sYS5yZXF1aXJlc0lmRXhpc3RzfHxbXSk7aS5mb3JFYWNoKGZ1bmN0aW9uKHMpe2lmKCFuLmhhcyhzKSl7dmFyIGw9dC5nZXQocyk7bCYmcihsKX19KSxvLnB1c2goYSl9cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihhKXtuLmhhcyhhLm5hbWUpfHxyKGEpfSksb31mdW5jdGlvbiBSZihlKXt2YXIgdD1tRChlKTtyZXR1cm4gdHcucmVkdWNlKGZ1bmN0aW9uKG4sbyl7cmV0dXJuIG4uY29uY2F0KHQuZmlsdGVyKGZ1bmN0aW9uKHIpe3JldHVybiByLnBoYXNlPT09b30pKX0sW10pfWZ1bmN0aW9uIFBmKGUpe3ZhciB0O3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fHwodD1uZXcgUHJvbWlzZShmdW5jdGlvbihuKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7dD12b2lkIDAsbihlKCkpfSl9KSksdH19ZnVuY3Rpb24gTGYoZSl7dmFyIHQ9ZS5yZWR1Y2UoZnVuY3Rpb24obixvKXt2YXIgcj1uW28ubmFtZV07cmV0dXJuIG5bby5uYW1lXT1yP09iamVjdC5hc3NpZ24oe30scixvLHtvcHRpb25zOk9iamVjdC5hc3NpZ24oe30sci5vcHRpb25zLG8ub3B0aW9ucyksZGF0YTpPYmplY3QuYXNzaWduKHt9LHIuZGF0YSxvLmRhdGEpfSk6byxufSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdFtuXX0pfXZhciBndz17cGxhY2VtZW50OiJib3R0b20iLG1vZGlmaWVyczpbXSxzdHJhdGVneToiYWJzb2x1dGUifTtmdW5jdGlvbiB5dygpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiF0LnNvbWUoZnVuY3Rpb24obyl7cmV0dXJuIShvJiZ0eXBlb2Ygby5nZXRCb3VuZGluZ0NsaWVudFJlY3Q9PSJmdW5jdGlvbiIpfSl9ZnVuY3Rpb24gdncoZSl7ZT09PXZvaWQgMCYmKGU9e30pO3ZhciB0PWUsbj10LmRlZmF1bHRNb2RpZmllcnMsbz1uPT09dm9pZCAwP1tdOm4scj10LmRlZmF1bHRPcHRpb25zLGE9cj09PXZvaWQgMD9ndzpyO3JldHVybiBmdW5jdGlvbihzLGwsZCl7ZD09PXZvaWQgMCYmKGQ9YSk7dmFyIGM9e3BsYWNlbWVudDoiYm90dG9tIixvcmRlcmVkTW9kaWZpZXJzOltdLG9wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxndyxhKSxtb2RpZmllcnNEYXRhOnt9LGVsZW1lbnRzOntyZWZlcmVuY2U6cyxwb3BwZXI6bH0sYXR0cmlidXRlczp7fSxzdHlsZXM6e319LHU9W10scD0hMSxmPXtzdGF0ZTpjLHNldE9wdGlvbnM6ZnVuY3Rpb24odil7dmFyIHk9dHlwZW9mIHY9PSJmdW5jdGlvbiI/dihjLm9wdGlvbnMpOnY7ZygpLGMub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGEsYy5vcHRpb25zLHkpLGMuc2Nyb2xsUGFyZW50cz17cmVmZXJlbmNlOlVuKHMpP0NyKHMpOnMuY29udGV4dEVsZW1lbnQ/Q3Iocy5jb250ZXh0RWxlbWVudCk6W10scG9wcGVyOkNyKGwpfTt2YXIgYj1SZihMZihbXS5jb25jYXQobyxjLm9wdGlvbnMubW9kaWZpZXJzKSkpO3JldHVybiBjLm9yZGVyZWRNb2RpZmllcnM9Yi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGguZW5hYmxlZH0pLG0oKSxmLnVwZGF0ZSgpfSxmb3JjZVVwZGF0ZTpmdW5jdGlvbigpe2lmKCFwKXt2YXIgdj1jLmVsZW1lbnRzLHk9di5yZWZlcmVuY2UsYj12LnBvcHBlcjtpZih5dyh5LGIpKXtjLnJlY3RzPXtyZWZlcmVuY2U6SWYoeSxpbyhiKSxjLm9wdGlvbnMuc3RyYXRlZ3k9PT0iZml4ZWQiKSxwb3BwZXI6dGEoYil9LGMucmVzZXQ9ITEsYy5wbGFjZW1lbnQ9Yy5vcHRpb25zLnBsYWNlbWVudCxjLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbihDKXtyZXR1cm4gYy5tb2RpZmllcnNEYXRhW0MubmFtZV09T2JqZWN0LmFzc2lnbih7fSxDLmRhdGEpfSk7Zm9yKHZhciBoPTA7aDxjLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoO2grKyl7aWYoYy5yZXNldD09PSEwKXtjLnJlc2V0PSExLGg9LTE7Y29udGludWV9dmFyIFM9Yy5vcmRlcmVkTW9kaWZpZXJzW2hdLHg9Uy5mbixFPVMub3B0aW9ucyxUPUU9PT12b2lkIDA/e306RSxBPVMubmFtZTt0eXBlb2YgeD09ImZ1bmN0aW9uIiYmKGM9eCh7c3RhdGU6YyxvcHRpb25zOlQsbmFtZTpBLGluc3RhbmNlOmZ9KXx8Yyl9fX19LHVwZGF0ZTpQZihmdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih3KXtmLmZvcmNlVXBkYXRlKCksdyhjKX0pfSksZGVzdHJveTpmdW5jdGlvbigpe2coKSxwPSEwfX07aWYoIXl3KHMsbCkpcmV0dXJuIGY7Zi5zZXRPcHRpb25zKGQpLnRoZW4oZnVuY3Rpb24odyl7IXAmJmQub25GaXJzdFVwZGF0ZSYmZC5vbkZpcnN0VXBkYXRlKHcpfSk7ZnVuY3Rpb24gbSgpe2Mub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKHcpe3ZhciB2PXcubmFtZSx5PXcub3B0aW9ucyxiPXk9PT12b2lkIDA/e306eSxoPXcuZWZmZWN0O2lmKHR5cGVvZiBoPT0iZnVuY3Rpb24iKXt2YXIgUz1oKHtzdGF0ZTpjLG5hbWU6dixpbnN0YW5jZTpmLG9wdGlvbnM6Yn0pLHg9ZnVuY3Rpb24oKXt9O3UucHVzaChTfHx4KX19KX1mdW5jdGlvbiBnKCl7dS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3JldHVybiB3KCl9KSx1PVtdfXJldHVybiBmfX12YXIgaEQ9W3N3LG13LGl3LHdzLGZ3LGR3LGh3LHJ3LHB3XSxfZj12dyh7ZGVmYXVsdE1vZGlmaWVyczpoRH0pO3ZhciBnRD0idGlwcHktYm94IixBdz0idGlwcHktY29udGVudCIseUQ9InRpcHB5LWJhY2tkcm9wIixDdz0idGlwcHktYXJyb3ciLE13PSJ0aXBweS1zdmctYXJyb3ciLHNhPXtwYXNzaXZlOiEwLGNhcHR1cmU6ITB9LE93PWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHl9O2Z1bmN0aW9uIFVmKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbz1lW3RdO3JldHVybiBvPz8oQXJyYXkuaXNBcnJheShuKT9uW3RdOm4pfXJldHVybiBlfWZ1bmN0aW9uIEtmKGUsdCl7dmFyIG49e30udG9TdHJpbmcuY2FsbChlKTtyZXR1cm4gbi5pbmRleE9mKCJbb2JqZWN0Iik9PT0wJiZuLmluZGV4T2YodCsiXSIpPi0xfWZ1bmN0aW9uIEl3KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UuYXBwbHkodm9pZCAwLHQpOmV9ZnVuY3Rpb24gYncoZSx0KXtpZih0PT09MClyZXR1cm4gZTt2YXIgbjtyZXR1cm4gZnVuY3Rpb24obyl7Y2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChmdW5jdGlvbigpe2Uobyl9LHQpfX1mdW5jdGlvbiB2RChlKXtyZXR1cm4gZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pfWZ1bmN0aW9uIGlpKGUpe3JldHVybltdLmNvbmNhdChlKX1mdW5jdGlvbiB3dyhlLHQpe2UuaW5kZXhPZih0KT09PS0xJiZlLnB1c2godCl9ZnVuY3Rpb24gYkQoZSl7cmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuaW5kZXhPZih0KT09PW59KX1mdW5jdGlvbiB3RChlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIHFkKGUpe3JldHVybltdLnNsaWNlLmNhbGwoZSl9ZnVuY3Rpb24ga3coZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiBlW25dIT09dm9pZCAwJiYodFtuXT1lW25dKSx0fSx7fSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9ZnVuY3Rpb24gJGQoZSl7cmV0dXJuWyJFbGVtZW50IiwiRnJhZ21lbnQiXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiBLZihlLHQpfSl9ZnVuY3Rpb24ga0QoZSl7cmV0dXJuIEtmKGUsIk5vZGVMaXN0Iil9ZnVuY3Rpb24geEQoZSl7cmV0dXJuIEtmKGUsIk1vdXNlRXZlbnQiKX1mdW5jdGlvbiBTRChlKXtyZXR1cm4hIShlJiZlLl90aXBweSYmZS5fdGlwcHkucmVmZXJlbmNlPT09ZSl9ZnVuY3Rpb24gRUQoZSl7cmV0dXJuICRkKGUpP1tlXTprRChlKT9xZChlKTpBcnJheS5pc0FycmF5KGUpP2U6cWQoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSl9ZnVuY3Rpb24gRmYoZSx0KXtlLmZvckVhY2goZnVuY3Rpb24obil7biYmKG4uc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXQrIm1zIil9KX1mdW5jdGlvbiB4dyhlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0ZSIsdCl9KX1mdW5jdGlvbiBORChlKXt2YXIgdCxuPWlpKGUpLG89blswXTtyZXR1cm4gbyE9bnVsbCYmKHQ9by5vd25lckRvY3VtZW50KSE9bnVsbCYmdC5ib2R5P28ub3duZXJEb2N1bWVudDpkb2N1bWVudH1mdW5jdGlvbiBURChlLHQpe3ZhciBuPXQuY2xpZW50WCxvPXQuY2xpZW50WTtyZXR1cm4gZS5ldmVyeShmdW5jdGlvbihyKXt2YXIgYT1yLnBvcHBlclJlY3QsaT1yLnBvcHBlclN0YXRlLHM9ci5wcm9wcyxsPXMuaW50ZXJhY3RpdmVCb3JkZXIsZD13RChpLnBsYWNlbWVudCksYz1pLm1vZGlmaWVyc0RhdGEub2Zmc2V0O2lmKCFjKXJldHVybiEwO3ZhciB1PWQ9PT0iYm90dG9tIj9jLnRvcC55OjAscD1kPT09InRvcCI/Yy5ib3R0b20ueTowLGY9ZD09PSJyaWdodCI/Yy5sZWZ0Lng6MCxtPWQ9PT0ibGVmdCI/Yy5yaWdodC54OjAsZz1hLnRvcC1vK3U+bCx3PW8tYS5ib3R0b20tcD5sLHY9YS5sZWZ0LW4rZj5sLHk9bi1hLnJpZ2h0LW0+bDtyZXR1cm4gZ3x8d3x8dnx8eX0pfWZ1bmN0aW9uIHpmKGUsdCxuKXt2YXIgbz10KyJFdmVudExpc3RlbmVyIjtbInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIl0uZm9yRWFjaChmdW5jdGlvbihyKXtlW29dKHIsbil9KX1mdW5jdGlvbiBTdyhlLHQpe2Zvcih2YXIgbj10O247KXt2YXIgbztpZihlLmNvbnRhaW5zKG4pKXJldHVybiEwO249bi5nZXRSb290Tm9kZT09bnVsbHx8KG89bi5nZXRSb290Tm9kZSgpKT09bnVsbD92b2lkIDA6by5ob3N0fXJldHVybiExfXZhciBFbz17aXNUb3VjaDohMX0sRXc9MDtmdW5jdGlvbiBERCgpe0VvLmlzVG91Y2h8fChFby5pc1RvdWNoPSEwLHdpbmRvdy5wZXJmb3JtYW5jZSYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixSdykpfWZ1bmN0aW9uIFJ3KCl7dmFyIGU9cGVyZm9ybWFuY2Uubm93KCk7ZS1FdzwyMCYmKEVvLmlzVG91Y2g9ITEsZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixSdykpLEV3PWV9ZnVuY3Rpb24gQUQoKXt2YXIgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKFNEKGUpKXt2YXIgdD1lLl90aXBweTtlLmJsdXImJiF0LnN0YXRlLmlzVmlzaWJsZSYmZS5ibHVyKCl9fWZ1bmN0aW9uIENEKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsREQsc2EpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIixBRCl9dmFyIE1EPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLE9EPU1EPyEhd2luZG93Lm1zQ3J5cHRvOiExO3ZhciBJRD17YW5pbWF0ZUZpbGw6ITEsZm9sbG93Q3Vyc29yOiExLGlubGluZVBvc2l0aW9uaW5nOiExLHN0aWNreTohMX0sUkQ9e2FsbG93SFRNTDohMSxhbmltYXRpb246ImZhZGUiLGFycm93OiEwLGNvbnRlbnQ6IiIsaW5lcnRpYTohMSxtYXhXaWR0aDozNTAscm9sZToidG9vbHRpcCIsdGhlbWU6IiIsekluZGV4Ojk5OTl9LGxvPU9iamVjdC5hc3NpZ24oe2FwcGVuZFRvOk93LGFyaWE6e2NvbnRlbnQ6ImF1dG8iLGV4cGFuZGVkOiJhdXRvIn0sZGVsYXk6MCxkdXJhdGlvbjpbMzAwLDI1MF0sZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDpudWxsLGhpZGVPbkNsaWNrOiEwLGlnbm9yZUF0dHJpYnV0ZXM6ITEsaW50ZXJhY3RpdmU6ITEsaW50ZXJhY3RpdmVCb3JkZXI6MixpbnRlcmFjdGl2ZURlYm91bmNlOjAsbW92ZVRyYW5zaXRpb246IiIsb2Zmc2V0OlswLDEwXSxvbkFmdGVyVXBkYXRlOmZ1bmN0aW9uKCl7fSxvbkJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe30sb25DcmVhdGU6ZnVuY3Rpb24oKXt9LG9uRGVzdHJveTpmdW5jdGlvbigpe30sb25IaWRkZW46ZnVuY3Rpb24oKXt9LG9uSGlkZTpmdW5jdGlvbigpe30sb25Nb3VudDpmdW5jdGlvbigpe30sb25TaG93OmZ1bmN0aW9uKCl7fSxvblNob3duOmZ1bmN0aW9uKCl7fSxvblRyaWdnZXI6ZnVuY3Rpb24oKXt9LG9uVW50cmlnZ2VyOmZ1bmN0aW9uKCl7fSxvbkNsaWNrT3V0c2lkZTpmdW5jdGlvbigpe30scGxhY2VtZW50OiJ0b3AiLHBsdWdpbnM6W10scG9wcGVyT3B0aW9uczp7fSxyZW5kZXI6bnVsbCxzaG93T25DcmVhdGU6ITEsdG91Y2g6ITAsdHJpZ2dlcjoibW91c2VlbnRlciBmb2N1cyIsdHJpZ2dlclRhcmdldDpudWxsfSxJRCxSRCksUEQ9T2JqZWN0LmtleXMobG8pLExEPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5rZXlzKHQpO24uZm9yRWFjaChmdW5jdGlvbihvKXtsb1tvXT10W29dfSl9O2Z1bmN0aW9uIFB3KGUpe3ZhciB0PWUucGx1Z2luc3x8W10sbj10LnJlZHVjZShmdW5jdGlvbihvLHIpe3ZhciBhPXIubmFtZSxpPXIuZGVmYXVsdFZhbHVlO2lmKGEpe3ZhciBzO29bYV09ZVthXSE9PXZvaWQgMD9lW2FdOihzPWxvW2FdKSE9bnVsbD9zOml9cmV0dXJuIG99LHt9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxlLG4pfWZ1bmN0aW9uIF9EKGUsdCl7dmFyIG49dD9PYmplY3Qua2V5cyhQdyhPYmplY3QuYXNzaWduKHt9LGxvLHtwbHVnaW5zOnR9KSkpOlBELG89bi5yZWR1Y2UoZnVuY3Rpb24ocixhKXt2YXIgaT0oZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlwcHktIithKXx8IiIpLnRyaW0oKTtpZighaSlyZXR1cm4gcjtpZihhPT09ImNvbnRlbnQiKXJbYV09aTtlbHNlIHRyeXtyW2FdPUpTT04ucGFyc2UoaSl9Y2F0Y2h7clthXT1pfXJldHVybiByfSx7fSk7cmV0dXJuIG99ZnVuY3Rpb24gTncoZSx0KXt2YXIgbj1PYmplY3QuYXNzaWduKHt9LHQse2NvbnRlbnQ6SXcodC5jb250ZW50LFtlXSl9LHQuaWdub3JlQXR0cmlidXRlcz97fTpfRChlLHQucGx1Z2lucykpO3JldHVybiBuLmFyaWE9T2JqZWN0LmFzc2lnbih7fSxsby5hcmlhLG4uYXJpYSksbi5hcmlhPXtleHBhbmRlZDpuLmFyaWEuZXhwYW5kZWQ9PT0iYXV0byI/dC5pbnRlcmFjdGl2ZTpuLmFyaWEuZXhwYW5kZWQsY29udGVudDpuLmFyaWEuY29udGVudD09PSJhdXRvIj90LmludGVyYWN0aXZlP251bGw6ImRlc2NyaWJlZGJ5IjpuLmFyaWEuY29udGVudH0sbn12YXIgVUQ9ZnVuY3Rpb24oKXtyZXR1cm4iaW5uZXJIVE1MIn07ZnVuY3Rpb24gQmYoZSx0KXtlW1VEKCldPXR9ZnVuY3Rpb24gVHcoZSl7dmFyIHQ9RHMoKTtyZXR1cm4gZT09PSEwP3QuY2xhc3NOYW1lPUN3Oih0LmNsYXNzTmFtZT1NdywkZChlKT90LmFwcGVuZENoaWxkKGUpOkJmKHQsZSkpLHR9ZnVuY3Rpb24gRHcoZSx0KXskZCh0LmNvbnRlbnQpPyhCZihlLCIiKSxlLmFwcGVuZENoaWxkKHQuY29udGVudCkpOnR5cGVvZiB0LmNvbnRlbnQhPSJmdW5jdGlvbiImJih0LmFsbG93SFRNTD9CZihlLHQuY29udGVudCk6ZS50ZXh0Q29udGVudD10LmNvbnRlbnQpfWZ1bmN0aW9uIEhmKGUpe3ZhciB0PWUuZmlyc3RFbGVtZW50Q2hpbGQsbj1xZCh0LmNoaWxkcmVuKTtyZXR1cm57Ym94OnQsY29udGVudDpuLmZpbmQoZnVuY3Rpb24obyl7cmV0dXJuIG8uY2xhc3NMaXN0LmNvbnRhaW5zKEF3KX0pLGFycm93Om4uZmluZChmdW5jdGlvbihvKXtyZXR1cm4gby5jbGFzc0xpc3QuY29udGFpbnMoQ3cpfHxvLmNsYXNzTGlzdC5jb250YWlucyhNdyl9KSxiYWNrZHJvcDpuLmZpbmQoZnVuY3Rpb24obyl7cmV0dXJuIG8uY2xhc3NMaXN0LmNvbnRhaW5zKHlEKX0pfX1mdW5jdGlvbiBMdyhlKXt2YXIgdD1EcygpLG49RHMoKTtuLmNsYXNzTmFtZT1nRCxuLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0ZSIsImhpZGRlbiIpLG4uc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7dmFyIG89RHMoKTtvLmNsYXNzTmFtZT1BdyxvLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0ZSIsImhpZGRlbiIpLER3KG8sZS5wcm9wcyksdC5hcHBlbmRDaGlsZChuKSxuLmFwcGVuZENoaWxkKG8pLHIoZS5wcm9wcyxlLnByb3BzKTtmdW5jdGlvbiByKGEsaSl7dmFyIHM9SGYodCksbD1zLmJveCxkPXMuY29udGVudCxjPXMuYXJyb3c7aS50aGVtZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIsaS50aGVtZSk6bC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGhlbWUiKSx0eXBlb2YgaS5hbmltYXRpb249PSJzdHJpbmciP2wuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbiIsaS5hbmltYXRpb24pOmwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbiIpLGkuaW5lcnRpYT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1pbmVydGlhIiwiIik6bC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtaW5lcnRpYSIpLGwuc3R5bGUubWF4V2lkdGg9dHlwZW9mIGkubWF4V2lkdGg9PSJudW1iZXIiP2kubWF4V2lkdGgrInB4IjppLm1heFdpZHRoLGkucm9sZT9sLnNldEF0dHJpYnV0ZSgicm9sZSIsaS5yb2xlKTpsLnJlbW92ZUF0dHJpYnV0ZSgicm9sZSIpLChhLmNvbnRlbnQhPT1pLmNvbnRlbnR8fGEuYWxsb3dIVE1MIT09aS5hbGxvd0hUTUwpJiZEdyhkLGUucHJvcHMpLGkuYXJyb3c/Yz9hLmFycm93IT09aS5hcnJvdyYmKGwucmVtb3ZlQ2hpbGQoYyksbC5hcHBlbmRDaGlsZChUdyhpLmFycm93KSkpOmwuYXBwZW5kQ2hpbGQoVHcoaS5hcnJvdykpOmMmJmwucmVtb3ZlQ2hpbGQoYyl9cmV0dXJue3BvcHBlcjp0LG9uVXBkYXRlOnJ9fUx3LiQkdGlwcHk9ITA7dmFyIEZEPTEsWWQ9W10sV2Y9W107ZnVuY3Rpb24gekQoZSx0KXt2YXIgbj1OdyhlLE9iamVjdC5hc3NpZ24oe30sbG8sUHcoa3codCkpKSksbyxyLGEsaT0hMSxzPSExLGw9ITEsZD0hMSxjLHUscCxmPVtdLG09YncodWUsbi5pbnRlcmFjdGl2ZURlYm91bmNlKSxnLHc9RkQrKyx2PW51bGwseT1iRChuLnBsdWdpbnMpLGI9e2lzRW5hYmxlZDohMCxpc1Zpc2libGU6ITEsaXNEZXN0cm95ZWQ6ITEsaXNNb3VudGVkOiExLGlzU2hvd246ITF9LGg9e2lkOncscmVmZXJlbmNlOmUscG9wcGVyOkRzKCkscG9wcGVySW5zdGFuY2U6dixwcm9wczpuLHN0YXRlOmIscGx1Z2luczp5LGNsZWFyRGVsYXlUaW1lb3V0czpmZSxzZXRQcm9wczpfdCxzZXRDb250ZW50OlhuLHNob3c6YmEsaGlkZTp3YSxoaWRlV2l0aEludGVyYWN0aXZpdHk6YXIsZW5hYmxlOmt0LGRpc2FibGU6aGUsdW5tb3VudDprYSxkZXN0cm95Ok5pfTtpZighbi5yZW5kZXIpcmV0dXJuIGg7dmFyIFM9bi5yZW5kZXIoaCkseD1TLnBvcHBlcixFPVMub25VcGRhdGU7eC5zZXRBdHRyaWJ1dGUoImRhdGEtdGlwcHktcm9vdCIsIiIpLHguaWQ9InRpcHB5LSIraC5pZCxoLnBvcHBlcj14LGUuX3RpcHB5PWgseC5fdGlwcHk9aDt2YXIgVD15Lm1hcChmdW5jdGlvbihSKXtyZXR1cm4gUi5mbihoKX0pLEE9ZS5oYXNBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiKTtyZXR1cm4gcGUoKSxEKCksSygpLE0oIm9uQ3JlYXRlIixbaF0pLG4uc2hvd09uQ3JlYXRlJiZvdCgpLHguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZnVuY3Rpb24oKXtoLnByb3BzLmludGVyYWN0aXZlJiZoLnN0YXRlLmlzVmlzaWJsZSYmaC5jbGVhckRlbGF5VGltZW91dHMoKX0pLHguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtoLnByb3BzLmludGVyYWN0aXZlJiZoLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPj0wJiZJKCkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixtKX0pLGg7ZnVuY3Rpb24gQygpe3ZhciBSPWgucHJvcHMudG91Y2g7cmV0dXJuIEFycmF5LmlzQXJyYXkoUik/UjpbUiwwXX1mdW5jdGlvbiBPKCl7cmV0dXJuIEMoKVswXT09PSJob2xkIn1mdW5jdGlvbiBQKCl7dmFyIFI7cmV0dXJuISEoKFI9aC5wcm9wcy5yZW5kZXIpIT1udWxsJiZSLiQkdGlwcHkpfWZ1bmN0aW9uIFUoKXtyZXR1cm4gZ3x8ZX1mdW5jdGlvbiBJKCl7dmFyIFI9VSgpLnBhcmVudE5vZGU7cmV0dXJuIFI/TkQoUik6ZG9jdW1lbnR9ZnVuY3Rpb24gSCgpe3JldHVybiBIZih4KX1mdW5jdGlvbiBfKFIpe3JldHVybiBoLnN0YXRlLmlzTW91bnRlZCYmIWguc3RhdGUuaXNWaXNpYmxlfHxFby5pc1RvdWNofHxjJiZjLnR5cGU9PT0iZm9jdXMiPzA6VWYoaC5wcm9wcy5kZWxheSxSPzA6MSxsby5kZWxheSl9ZnVuY3Rpb24gSyhSKXtSPT09dm9pZCAwJiYoUj0hMSkseC5zdHlsZS5wb2ludGVyRXZlbnRzPWgucHJvcHMuaW50ZXJhY3RpdmUmJiFSPyIiOiJub25lIix4LnN0eWxlLnpJbmRleD0iIitoLnByb3BzLnpJbmRleH1mdW5jdGlvbiBNKFIsUSxpZSl7aWYoaWU9PT12b2lkIDAmJihpZT0hMCksVC5mb3JFYWNoKGZ1bmN0aW9uKE5lKXtOZVtSXSYmTmVbUl0uYXBwbHkoTmUsUSl9KSxpZSl7dmFyIE1lOyhNZT1oLnByb3BzKVtSXS5hcHBseShNZSxRKX19ZnVuY3Rpb24gVygpe3ZhciBSPWgucHJvcHMuYXJpYTtpZihSLmNvbnRlbnQpe3ZhciBRPSJhcmlhLSIrUi5jb250ZW50LGllPXguaWQsTWU9aWkoaC5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtNZS5mb3JFYWNoKGZ1bmN0aW9uKE5lKXt2YXIgVXQ9TmUuZ2V0QXR0cmlidXRlKFEpO2lmKGguc3RhdGUuaXNWaXNpYmxlKU5lLnNldEF0dHJpYnV0ZShRLFV0P1V0KyIgIitpZTppZSk7ZWxzZXt2YXIgWnQ9VXQmJlV0LnJlcGxhY2UoaWUsIiIpLnRyaW0oKTtadD9OZS5zZXRBdHRyaWJ1dGUoUSxadCk6TmUucmVtb3ZlQXR0cmlidXRlKFEpfX0pfX1mdW5jdGlvbiBEKCl7aWYoIShBfHwhaC5wcm9wcy5hcmlhLmV4cGFuZGVkKSl7dmFyIFI9aWkoaC5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtSLmZvckVhY2goZnVuY3Rpb24oUSl7aC5wcm9wcy5pbnRlcmFjdGl2ZT9RLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsaC5zdGF0ZS5pc1Zpc2libGUmJlE9PT1VKCk/InRydWUiOiJmYWxzZSIpOlEucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KX19ZnVuY3Rpb24gTigpe0koKS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLG0pLFlkPVlkLmZpbHRlcihmdW5jdGlvbihSKXtyZXR1cm4gUiE9PW19KX1mdW5jdGlvbiBGKFIpe2lmKCEoRW8uaXNUb3VjaCYmKGx8fFIudHlwZT09PSJtb3VzZWRvd24iKSkpe3ZhciBRPVIuY29tcG9zZWRQYXRoJiZSLmNvbXBvc2VkUGF0aCgpWzBdfHxSLnRhcmdldDtpZighKGgucHJvcHMuaW50ZXJhY3RpdmUmJlN3KHgsUSkpKXtpZihpaShoLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpLnNvbWUoZnVuY3Rpb24oaWUpe3JldHVybiBTdyhpZSxRKX0pKXtpZihFby5pc1RvdWNofHxoLnN0YXRlLmlzVmlzaWJsZSYmaC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTApcmV0dXJufWVsc2UgTSgib25DbGlja091dHNpZGUiLFtoLFJdKTtoLnByb3BzLmhpZGVPbkNsaWNrPT09ITAmJihoLmNsZWFyRGVsYXlUaW1lb3V0cygpLGguaGlkZSgpLHM9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3M9ITF9KSxoLnN0YXRlLmlzTW91bnRlZHx8b2UoKSl9fX1mdW5jdGlvbiBZKCl7bD0hMH1mdW5jdGlvbiBqKCl7bD0hMX1mdW5jdGlvbiBaKCl7dmFyIFI9SSgpO1IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixGLCEwKSxSLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixGLHNhKSxSLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGosc2EpLFIuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixZLHNhKX1mdW5jdGlvbiBvZSgpe3ZhciBSPUkoKTtSLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsRiwhMCksUi5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsRixzYSksUi5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixqLHNhKSxSLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsWSxzYSl9ZnVuY3Rpb24gcShSLFEpe2RlKFIsZnVuY3Rpb24oKXshaC5zdGF0ZS5pc1Zpc2libGUmJngucGFyZW50Tm9kZSYmeC5wYXJlbnROb2RlLmNvbnRhaW5zKHgpJiZRKCl9KX1mdW5jdGlvbiB0ZShSLFEpe2RlKFIsUSl9ZnVuY3Rpb24gZGUoUixRKXt2YXIgaWU9SCgpLmJveDtmdW5jdGlvbiBNZShOZSl7TmUudGFyZ2V0PT09aWUmJih6ZihpZSwicmVtb3ZlIixNZSksUSgpKX1pZihSPT09MClyZXR1cm4gUSgpO3pmKGllLCJyZW1vdmUiLHUpLHpmKGllLCJhZGQiLE1lKSx1PU1lfWZ1bmN0aW9uIGxlKFIsUSxpZSl7aWU9PT12b2lkIDAmJihpZT0hMSk7dmFyIE1lPWlpKGgucHJvcHMudHJpZ2dlclRhcmdldHx8ZSk7TWUuZm9yRWFjaChmdW5jdGlvbihOZSl7TmUuYWRkRXZlbnRMaXN0ZW5lcihSLFEsaWUpLGYucHVzaCh7bm9kZTpOZSxldmVudFR5cGU6UixoYW5kbGVyOlEsb3B0aW9uczppZX0pfSl9ZnVuY3Rpb24gcGUoKXtPKCkmJihsZSgidG91Y2hzdGFydCIsUGUse3Bhc3NpdmU6ITB9KSxsZSgidG91Y2hlbmQiLHFlLHtwYXNzaXZlOiEwfSkpLHZEKGgucHJvcHMudHJpZ2dlcikuZm9yRWFjaChmdW5jdGlvbihSKXtpZihSIT09Im1hbnVhbCIpc3dpdGNoKGxlKFIsUGUpLFIpe2Nhc2UibW91c2VlbnRlciI6bGUoIm1vdXNlbGVhdmUiLHFlKTticmVhaztjYXNlImZvY3VzIjpsZShPRD8iZm9jdXNvdXQiOiJibHVyIixKZSk7YnJlYWs7Y2FzZSJmb2N1c2luIjpsZSgiZm9jdXNvdXQiLEplKTticmVha319KX1mdW5jdGlvbiBrZSgpe2YuZm9yRWFjaChmdW5jdGlvbihSKXt2YXIgUT1SLm5vZGUsaWU9Ui5ldmVudFR5cGUsTWU9Ui5oYW5kbGVyLE5lPVIub3B0aW9ucztRLnJlbW92ZUV2ZW50TGlzdGVuZXIoaWUsTWUsTmUpfSksZj1bXX1mdW5jdGlvbiBQZShSKXt2YXIgUSxpZT0hMTtpZighKCFoLnN0YXRlLmlzRW5hYmxlZHx8UWUoUil8fHMpKXt2YXIgTWU9KChRPWMpPT1udWxsP3ZvaWQgMDpRLnR5cGUpPT09ImZvY3VzIjtjPVIsZz1SLmN1cnJlbnRUYXJnZXQsRCgpLCFoLnN0YXRlLmlzVmlzaWJsZSYmeEQoUikmJllkLmZvckVhY2goZnVuY3Rpb24oTmUpe3JldHVybiBOZShSKX0pLFIudHlwZT09PSJjbGljayImJihoLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPDB8fGkpJiZoLnByb3BzLmhpZGVPbkNsaWNrIT09ITEmJmguc3RhdGUuaXNWaXNpYmxlP2llPSEwOm90KFIpLFIudHlwZT09PSJjbGljayImJihpPSFpZSksaWUmJiFNZSYmcnQoUil9fWZ1bmN0aW9uIHVlKFIpe3ZhciBRPVIudGFyZ2V0LGllPVUoKS5jb250YWlucyhRKXx8eC5jb250YWlucyhRKTtpZighKFIudHlwZT09PSJtb3VzZW1vdmUiJiZpZSkpe3ZhciBNZT1iZSgpLmNvbmNhdCh4KS5tYXAoZnVuY3Rpb24oTmUpe3ZhciBVdCxadD1OZS5fdGlwcHksVXI9KFV0PVp0LnBvcHBlckluc3RhbmNlKT09bnVsbD92b2lkIDA6VXQuc3RhdGU7cmV0dXJuIFVyP3twb3BwZXJSZWN0Ok5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHBvcHBlclN0YXRlOlVyLHByb3BzOm59Om51bGx9KS5maWx0ZXIoQm9vbGVhbik7VEQoTWUsUikmJihOKCkscnQoUikpfX1mdW5jdGlvbiBxZShSKXt2YXIgUT1RZShSKXx8aC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTAmJmk7aWYoIVEpe2lmKGgucHJvcHMuaW50ZXJhY3RpdmUpe2guaGlkZVdpdGhJbnRlcmFjdGl2aXR5KFIpO3JldHVybn1ydChSKX19ZnVuY3Rpb24gSmUoUil7aC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImZvY3VzaW4iKTwwJiZSLnRhcmdldCE9PVUoKXx8aC5wcm9wcy5pbnRlcmFjdGl2ZSYmUi5yZWxhdGVkVGFyZ2V0JiZ4LmNvbnRhaW5zKFIucmVsYXRlZFRhcmdldCl8fHJ0KFIpfWZ1bmN0aW9uIFFlKFIpe3JldHVybiBFby5pc1RvdWNoP08oKSE9PVIudHlwZS5pbmRleE9mKCJ0b3VjaCIpPj0wOiExfWZ1bmN0aW9uIHl0KCl7THQoKTt2YXIgUj1oLnByb3BzLFE9Ui5wb3BwZXJPcHRpb25zLGllPVIucGxhY2VtZW50LE1lPVIub2Zmc2V0LE5lPVIuZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCxVdD1SLm1vdmVUcmFuc2l0aW9uLFp0PVAoKT9IZih4KS5hcnJvdzpudWxsLFVyPU5lP3tnZXRCb3VuZGluZ0NsaWVudFJlY3Q6TmUsY29udGV4dEVsZW1lbnQ6TmUuY29udGV4dEVsZW1lbnR8fFUoKX06ZSx4YT17bmFtZToiJCR0aXBweSIsZW5hYmxlZDohMCxwaGFzZToiYmVmb3JlV3JpdGUiLHJlcXVpcmVzOlsiY29tcHV0ZVN0eWxlcyJdLGZuOmZ1bmN0aW9uKGlyKXt2YXIgc2U9aXIuc3RhdGU7aWYoUCgpKXt2YXIgWmU9SCgpLFRlPVplLmJveDtbInBsYWNlbWVudCIsInJlZmVyZW5jZS1oaWRkZW4iLCJlc2NhcGVkIl0uZm9yRWFjaChmdW5jdGlvbihsbil7bG49PT0icGxhY2VtZW50Ij9UZS5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2VtZW50IixzZS5wbGFjZW1lbnQpOnNlLmF0dHJpYnV0ZXMucG9wcGVyWyJkYXRhLXBvcHBlci0iK2xuXT9UZS5zZXRBdHRyaWJ1dGUoImRhdGEtIitsbiwiIik6VGUucmVtb3ZlQXR0cmlidXRlKCJkYXRhLSIrbG4pfSksc2UuYXR0cmlidXRlcy5wb3BwZXI9e319fX0sT289W3tuYW1lOiJvZmZzZXQiLG9wdGlvbnM6e29mZnNldDpNZX19LHtuYW1lOiJwcmV2ZW50T3ZlcmZsb3ciLG9wdGlvbnM6e3BhZGRpbmc6e3RvcDoyLGJvdHRvbToyLGxlZnQ6NSxyaWdodDo1fX19LHtuYW1lOiJmbGlwIixvcHRpb25zOntwYWRkaW5nOjV9fSx7bmFtZToiY29tcHV0ZVN0eWxlcyIsb3B0aW9uczp7YWRhcHRpdmU6IVV0fX0seGFdO1AoKSYmWnQmJk9vLnB1c2goe25hbWU6ImFycm93IixvcHRpb25zOntlbGVtZW50Olp0LHBhZGRpbmc6M319KSxPby5wdXNoLmFwcGx5KE9vLFE/Lm1vZGlmaWVyc3x8W10pLGgucG9wcGVySW5zdGFuY2U9X2YoVXIseCxPYmplY3QuYXNzaWduKHt9LFEse3BsYWNlbWVudDppZSxvbkZpcnN0VXBkYXRlOnAsbW9kaWZpZXJzOk9vfSkpfWZ1bmN0aW9uIEx0KCl7aC5wb3BwZXJJbnN0YW5jZSYmKGgucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpLGgucG9wcGVySW5zdGFuY2U9bnVsbCl9ZnVuY3Rpb24gSGUoKXt2YXIgUj1oLnByb3BzLmFwcGVuZFRvLFEsaWU9VSgpO2gucHJvcHMuaW50ZXJhY3RpdmUmJlI9PT1Pd3x8Uj09PSJwYXJlbnQiP1E9aWUucGFyZW50Tm9kZTpRPUl3KFIsW2llXSksUS5jb250YWlucyh4KXx8US5hcHBlbmRDaGlsZCh4KSxoLnN0YXRlLmlzTW91bnRlZD0hMCx5dCgpfWZ1bmN0aW9uIGJlKCl7cmV0dXJuIHFkKHgucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGlwcHktcm9vdF0iKSl9ZnVuY3Rpb24gb3QoUil7aC5jbGVhckRlbGF5VGltZW91dHMoKSxSJiZNKCJvblRyaWdnZXIiLFtoLFJdKSxaKCk7dmFyIFE9XyghMCksaWU9QygpLE1lPWllWzBdLE5lPWllWzFdO0VvLmlzVG91Y2gmJk1lPT09ImhvbGQiJiZOZSYmKFE9TmUpLFE/bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5zaG93KCl9LFEpOmguc2hvdygpfWZ1bmN0aW9uIHJ0KFIpe2lmKGguY2xlYXJEZWxheVRpbWVvdXRzKCksTSgib25VbnRyaWdnZXIiLFtoLFJdKSwhaC5zdGF0ZS5pc1Zpc2libGUpe29lKCk7cmV0dXJufWlmKCEoaC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKT49MCYmaC5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTAmJlsibW91c2VsZWF2ZSIsIm1vdXNlbW92ZSJdLmluZGV4T2YoUi50eXBlKT49MCYmaSkpe3ZhciBRPV8oITEpO1E/cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5zdGF0ZS5pc1Zpc2libGUmJmguaGlkZSgpfSxRKTphPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2guaGlkZSgpfSl9fWZ1bmN0aW9uIGt0KCl7aC5zdGF0ZS5pc0VuYWJsZWQ9ITB9ZnVuY3Rpb24gaGUoKXtoLmhpZGUoKSxoLnN0YXRlLmlzRW5hYmxlZD0hMX1mdW5jdGlvbiBmZSgpe2NsZWFyVGltZW91dChvKSxjbGVhclRpbWVvdXQociksY2FuY2VsQW5pbWF0aW9uRnJhbWUoYSl9ZnVuY3Rpb24gX3QoUil7aWYoIWguc3RhdGUuaXNEZXN0cm95ZWQpe00oIm9uQmVmb3JlVXBkYXRlIixbaCxSXSksa2UoKTt2YXIgUT1oLnByb3BzLGllPU53KGUsT2JqZWN0LmFzc2lnbih7fSxRLGt3KFIpLHtpZ25vcmVBdHRyaWJ1dGVzOiEwfSkpO2gucHJvcHM9aWUscGUoKSxRLmludGVyYWN0aXZlRGVib3VuY2UhPT1pZS5pbnRlcmFjdGl2ZURlYm91bmNlJiYoTigpLG09YncodWUsaWUuaW50ZXJhY3RpdmVEZWJvdW5jZSkpLFEudHJpZ2dlclRhcmdldCYmIWllLnRyaWdnZXJUYXJnZXQ/aWkoUS50cmlnZ2VyVGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uKE1lKXtNZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiKX0pOmllLnRyaWdnZXJUYXJnZXQmJmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiksRCgpLEsoKSxFJiZFKFEsaWUpLGgucG9wcGVySW5zdGFuY2UmJih5dCgpLGJlKCkuZm9yRWFjaChmdW5jdGlvbihNZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKE1lLl90aXBweS5wb3BwZXJJbnN0YW5jZS5mb3JjZVVwZGF0ZSl9KSksTSgib25BZnRlclVwZGF0ZSIsW2gsUl0pfX1mdW5jdGlvbiBYbihSKXtoLnNldFByb3BzKHtjb250ZW50OlJ9KX1mdW5jdGlvbiBiYSgpe3ZhciBSPWguc3RhdGUuaXNWaXNpYmxlLFE9aC5zdGF0ZS5pc0Rlc3Ryb3llZCxpZT0haC5zdGF0ZS5pc0VuYWJsZWQsTWU9RW8uaXNUb3VjaCYmIWgucHJvcHMudG91Y2gsTmU9VWYoaC5wcm9wcy5kdXJhdGlvbiwwLGxvLmR1cmF0aW9uKTtpZighKFJ8fFF8fGllfHxNZSkmJiFVKCkuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpJiYoTSgib25TaG93IixbaF0sITEpLGgucHJvcHMub25TaG93KGgpIT09ITEpKXtpZihoLnN0YXRlLmlzVmlzaWJsZT0hMCxQKCkmJih4LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKSxLKCksWigpLGguc3RhdGUuaXNNb3VudGVkfHwoeC5zdHlsZS50cmFuc2l0aW9uPSJub25lIiksUCgpKXt2YXIgVXQ9SCgpLFp0PVV0LmJveCxVcj1VdC5jb250ZW50O0ZmKFtadCxVcl0sMCl9cD1mdW5jdGlvbigpe3ZhciBPbztpZighKCFoLnN0YXRlLmlzVmlzaWJsZXx8ZCkpe2lmKGQ9ITAseC5vZmZzZXRIZWlnaHQseC5zdHlsZS50cmFuc2l0aW9uPWgucHJvcHMubW92ZVRyYW5zaXRpb24sUCgpJiZoLnByb3BzLmFuaW1hdGlvbil7dmFyIFRpPUgoKSxpcj1UaS5ib3gsc2U9VGkuY29udGVudDtGZihbaXIsc2VdLE5lKSx4dyhbaXIsc2VdLCJ2aXNpYmxlIil9VygpLEQoKSx3dyhXZixoKSwoT289aC5wb3BwZXJJbnN0YW5jZSk9PW51bGx8fE9vLmZvcmNlVXBkYXRlKCksTSgib25Nb3VudCIsW2hdKSxoLnByb3BzLmFuaW1hdGlvbiYmUCgpJiZ0ZShOZSxmdW5jdGlvbigpe2guc3RhdGUuaXNTaG93bj0hMCxNKCJvblNob3duIixbaF0pfSl9fSxIZSgpfX1mdW5jdGlvbiB3YSgpe3ZhciBSPSFoLnN0YXRlLmlzVmlzaWJsZSxRPWguc3RhdGUuaXNEZXN0cm95ZWQsaWU9IWguc3RhdGUuaXNFbmFibGVkLE1lPVVmKGgucHJvcHMuZHVyYXRpb24sMSxsby5kdXJhdGlvbik7aWYoIShSfHxRfHxpZSkmJihNKCJvbkhpZGUiLFtoXSwhMSksaC5wcm9wcy5vbkhpZGUoaCkhPT0hMSkpe2lmKGguc3RhdGUuaXNWaXNpYmxlPSExLGguc3RhdGUuaXNTaG93bj0hMSxkPSExLGk9ITEsUCgpJiYoeC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxOKCksb2UoKSxLKCEwKSxQKCkpe3ZhciBOZT1IKCksVXQ9TmUuYm94LFp0PU5lLmNvbnRlbnQ7aC5wcm9wcy5hbmltYXRpb24mJihGZihbVXQsWnRdLE1lKSx4dyhbVXQsWnRdLCJoaWRkZW4iKSl9VygpLEQoKSxoLnByb3BzLmFuaW1hdGlvbj9QKCkmJnEoTWUsaC51bm1vdW50KTpoLnVubW91bnQoKX19ZnVuY3Rpb24gYXIoUil7SSgpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsbSksd3coWWQsbSksbShSKX1mdW5jdGlvbiBrYSgpe2guc3RhdGUuaXNWaXNpYmxlJiZoLmhpZGUoKSxoLnN0YXRlLmlzTW91bnRlZCYmKEx0KCksYmUoKS5mb3JFYWNoKGZ1bmN0aW9uKFIpe1IuX3RpcHB5LnVubW91bnQoKX0pLHgucGFyZW50Tm9kZSYmeC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHgpLFdmPVdmLmZpbHRlcihmdW5jdGlvbihSKXtyZXR1cm4gUiE9PWh9KSxoLnN0YXRlLmlzTW91bnRlZD0hMSxNKCJvbkhpZGRlbiIsW2hdKSl9ZnVuY3Rpb24gTmkoKXtoLnN0YXRlLmlzRGVzdHJveWVkfHwoaC5jbGVhckRlbGF5VGltZW91dHMoKSxoLnVubW91bnQoKSxrZSgpLGRlbGV0ZSBlLl90aXBweSxoLnN0YXRlLmlzRGVzdHJveWVkPSEwLE0oIm9uRGVzdHJveSIsW2hdKSl9fWZ1bmN0aW9uIEFzKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPWxvLnBsdWdpbnMuY29uY2F0KHQucGx1Z2luc3x8W10pO0NEKCk7dmFyIG89T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVnaW5zOm59KSxyPUVEKGUpO2lmKDApdmFyIGEsaTt2YXIgcz1yLnJlZHVjZShmdW5jdGlvbihsLGQpe3ZhciBjPWQmJnpEKGQsbyk7cmV0dXJuIGMmJmwucHVzaChjKSxsfSxbXSk7cmV0dXJuICRkKGUpP3NbMF06c31Bcy5kZWZhdWx0UHJvcHM9bG87QXMuc2V0RGVmYXVsdFByb3BzPUxEO0FzLmN1cnJlbnRJbnB1dD1Fbzt2YXIgRDM9T2JqZWN0LmFzc2lnbih7fSx3cyx7ZWZmZWN0OmZ1bmN0aW9uKHQpe3ZhciBuPXQuc3RhdGUsbz17cG9wcGVyOntwb3NpdGlvbjpuLm9wdGlvbnMuc3RyYXRlZ3ksbGVmdDoiMCIsdG9wOiIwIixtYXJnaW46IjAifSxhcnJvdzp7cG9zaXRpb246ImFic29sdXRlIn0scmVmZXJlbmNlOnt9fTtPYmplY3QuYXNzaWduKG4uZWxlbWVudHMucG9wcGVyLnN0eWxlLG8ucG9wcGVyKSxuLnN0eWxlcz1vLG4uZWxlbWVudHMuYXJyb3cmJk9iamVjdC5hc3NpZ24obi5lbGVtZW50cy5hcnJvdy5zdHlsZSxvLmFycm93KX19KTtBcy5zZXREZWZhdWx0UHJvcHMoe3JlbmRlcjpMd30pO3ZhciBDcz1BcztmdW5jdGlvbiBZZigpe3JldHVybnthc3luYzohMSxicmVha3M6ITEsZXh0ZW5zaW9uczpudWxsLGdmbTohMCxob29rczpudWxsLHBlZGFudGljOiExLHJlbmRlcmVyOm51bGwsc2lsZW50OiExLHRva2VuaXplcjpudWxsLHdhbGtUb2tlbnM6bnVsbH19dmFyIGRhPVlmKCk7ZnVuY3Rpb24gQncoZSl7ZGE9ZX12YXIgSXM9e2V4ZWM6KCk9Pm51bGx9O2Z1bmN0aW9uIHplKGUsdD0iIil7bGV0IG49dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5zb3VyY2Usbz17cmVwbGFjZToocixhKT0+e2xldCBpPXR5cGVvZiBhPT0ic3RyaW5nIj9hOmEuc291cmNlO3JldHVybiBpPWkucmVwbGFjZShhbi5jYXJldCwiJDEiKSxuPW4ucmVwbGFjZShyLGkpLG99LGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKG4sdCl9O3JldHVybiBvfXZhciBhbj17Y29kZVJlbW92ZUluZGVudDovXig/OiB7MSw0fXwgezAsM31cdCkvZ20sb3V0cHV0TGlua1JlcGxhY2U6L1xcKFtcW1xdXSkvZyxpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOi9eKFxzKykoPzpgYGApLyxiZWdpbm5pbmdTcGFjZTovXlxzKy8sZW5kaW5nSGFzaDovIyQvLHN0YXJ0aW5nU3BhY2VDaGFyOi9eIC8sZW5kaW5nU3BhY2VDaGFyOi8gJC8sbm9uU3BhY2VDaGFyOi9bXiBdLyxuZXdMaW5lQ2hhckdsb2JhbDovXG4vZyx0YWJDaGFyR2xvYmFsOi9cdC9nLG11bHRpcGxlU3BhY2VHbG9iYWw6L1xzKy9nLGJsYW5rTGluZTovXlsgXHRdKiQvLGRvdWJsZUJsYW5rTGluZTovXG5bIFx0XSpcblsgXHRdKiQvLGJsb2NrcXVvdGVTdGFydDovXiB7MCwzfT4vLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOi9cbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cbnwkKS9nLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMjovXiB7MCwzfT5bIFx0XT8vZ20sbGlzdFJlcGxhY2VUYWJzOi9eXHQrLyxsaXN0UmVwbGFjZU5lc3Rpbmc6L14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxsaXN0SXNUYXNrOi9eXFtbIHhYXVxdIC8sbGlzdFJlcGxhY2VUYXNrOi9eXFtbIHhYXVxdICsvLGFueUxpbmU6L1xuLipcbi8saHJlZkJyYWNrZXRzOi9ePCguKik+JC8sdGFibGVEZWxpbWl0ZXI6L1s6fF0vLHRhYmxlQWxpZ25DaGFyczovXlx8fFx8ICokL2csdGFibGVSb3dCbGFua0xpbmU6L1xuWyBcdF0qJC8sdGFibGVBbGlnblJpZ2h0Oi9eICotKzogKiQvLHRhYmxlQWxpZ25DZW50ZXI6L14gKjotKzogKiQvLHRhYmxlQWxpZ25MZWZ0Oi9eICo6LSsgKiQvLHN0YXJ0QVRhZzovXjxhIC9pLGVuZEFUYWc6L148XC9hPi9pLHN0YXJ0UHJlU2NyaXB0VGFnOi9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLGVuZFByZVNjcmlwdFRhZzovXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLHN0YXJ0QW5nbGVCcmFja2V0Oi9ePC8sZW5kQW5nbGVCcmFja2V0Oi8+JC8scGVkYW50aWNIcmVmVGl0bGU6L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLyx1bmljb2RlQWxwaGFOdW1lcmljOi9bXHB7TH1ccHtOfV0vdSxlc2NhcGVUZXN0Oi9bJjw+IiddLyxlc2NhcGVSZXBsYWNlOi9bJjw+IiddL2csZXNjYXBlVGVzdE5vRW5jb2RlOi9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxlc2NhcGVSZXBsYWNlTm9FbmNvZGU6L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvZyx1bmVzY2FwZVRlc3Q6LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWcsY2FyZXQ6LyhefFteXFtdKVxeL2cscGVyY2VudERlY29kZTovJTI1L2csZmluZFBpcGU6L1x8L2csc3BsaXRQaXBlOi8gXHwvLHNsYXNoUGlwZTovXFxcfC9nLGNhcnJpYWdlUmV0dXJuOi9cclxufFxyL2csc3BhY2VMaW5lOi9eICskL2dtLG5vdFNwYWNlU3RhcnQ6L15cUyovLGVuZGluZ05ld2xpbmU6L1xuJC8sbGlzdEl0ZW1SZWdleDplPT5uZXcgUmVnRXhwKGBeKCB7MCwzfSR7ZX0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCksbmV4dEJ1bGxldFJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSxoclJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSxmZW5jZXNCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlxgXGBcYHx+fn4pYCksaGVhZGluZ0JlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19I2ApLGh0bWxCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwiaSIpfSxXRD0vXig/OlsgXHRdKig/OlxufCQpKSsvLEJEPS9eKCg/OiB7NH18IHswLDN9XHQpW15cbl0rKD86XG4oPzpbIFx0XSooPzpcbnwkKSkqKT8pKy8sSEQ9L14gezAsM30oYHszLH0oPz1bXmBcbl0qKD86XG58JCkpfH57Myx9KShbXlxuXSopKD86XG58JCkoPzp8KFtcc1xTXSo/KSg/OlxufCQpKSg/OiB7MCwzfVwxW35gXSogKig/PVxufCQpfCQpLyxScz0vXiB7MCwzfSgoPzotW1x0IF0qKXszLH18KD86X1sgXHRdKil7Myx9fCg/OlwqWyBcdF0qKXszLH0pKD86XG4rfCQpLyxLRD0vXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxxZj0vKD86WyorLV18XGR7MSw5fVsuKV0pLyxIdz0vXig/IWJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKCg/Oi58XG4oPyFccyo/XG58YnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkpKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLEt3PXplKEh3KS5yZXBsYWNlKC9idWxsL2cscWYpLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLC8oPzogezR9fCB7MCwzfVx0KS8pLnJlcGxhY2UoL2ZlbmNlcy9nLC8gezAsM30oPzpgezMsfXx+ezMsfSkvKS5yZXBsYWNlKC9ibG9ja3F1b3RlL2csLyB7MCwzfT4vKS5yZXBsYWNlKC9oZWFkaW5nL2csLyB7MCwzfSN7MSw2fS8pLnJlcGxhY2UoL2h0bWwvZywvIHswLDN9PFteXG4+XSs+XG4vKS5yZXBsYWNlKC9cfHRhYmxlL2csIiIpLmdldFJlZ2V4KCksR0Q9emUoSHcpLnJlcGxhY2UoL2J1bGwvZyxxZikucmVwbGFjZSgvYmxvY2tDb2RlL2csLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cbj5dKz5cbi8pLnJlcGxhY2UoL3RhYmxlL2csLyB7MCwzfVx8Pyg/Ols6XC0gXSpcfCkrW1w6XC0gXSpcbi8pLmdldFJlZ2V4KCksJGY9L14oW15cbl0rKD86XG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xuKVteXG5dKykqKS8sVkQ9L15bXlxuXSsvLFhmPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvLGpEPXplKC9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcblsgXHRdKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuWyBcdF0qKT98ICpcblsgXHRdKikodGl0bGUpKT8gKig/OlxuK3wkKS8pLnJlcGxhY2UoImxhYmVsIixYZikucmVwbGFjZSgidGl0bGUiLC8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvKS5nZXRSZWdleCgpLFlEPXplKC9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvKS5yZXBsYWNlKC9idWxsL2cscWYpLmdldFJlZ2V4KCksdGM9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiLEpmPS88IS0tKD86LT8+fFtcc1xTXSo/KD86LS0+fCQpKS8scUQ9emUoIl4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCkpIiwiaSIpLnJlcGxhY2UoImNvbW1lbnQiLEpmKS5yZXBsYWNlKCJ0YWciLHRjKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpLEd3PXplKCRmKS5yZXBsYWNlKCJociIsUnMpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsdGMpLmdldFJlZ2V4KCksJEQ9emUoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxuXSopKD86XG58JCkpKy8pLnJlcGxhY2UoInBhcmFncmFwaCIsR3cpLmdldFJlZ2V4KCksUWY9e2Jsb2NrcXVvdGU6JEQsY29kZTpCRCxkZWY6akQsZmVuY2VzOkhELGhlYWRpbmc6S0QsaHI6UnMsaHRtbDpxRCxsaGVhZGluZzpLdyxsaXN0OllELG5ld2xpbmU6V0QscGFyYWdyYXBoOkd3LHRhYmxlOklzLHRleHQ6VkR9LF93PXplKCJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSIpLnJlcGxhY2UoImhyIixScykucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIig/OiB7NH18IHswLDN9CSlbXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHRjKS5nZXRSZWdleCgpLFhEPXsuLi5RZixsaGVhZGluZzpHRCx0YWJsZTpfdyxwYXJhZ3JhcGg6emUoJGYpLnJlcGxhY2UoImhyIixScykucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInRhYmxlIixfdykucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHRjKS5nZXRSZWdleCgpfSxKRD17Li4uUWYsaHRtbDp6ZShgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgKS5yZXBsYWNlKCJjb21tZW50IixKZikucmVwbGFjZSgvdGFnL2csIig/ISg/OmF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOnxbXlxcd1xcc0BdKkApXFxiIikuZ2V0UmVnZXgoKSxkZWY6L14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogKyhbIihdW15cbl0rWyIpXSkpPyAqKD86XG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XG4rfCQpLyxmZW5jZXM6SXMsbGhlYWRpbmc6L14oLis/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxwYXJhZ3JhcGg6emUoJGYpLnJlcGxhY2UoImhyIixScykucmVwbGFjZSgiaGVhZGluZyIsYCAqI3sxLDZ9ICpbXgpdYCkucmVwbGFjZSgibGhlYWRpbmciLEt3KS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCIiKS5yZXBsYWNlKCJ8bGlzdCIsIiIpLnJlcGxhY2UoInxodG1sIiwiIikucmVwbGFjZSgifHRhZyIsIiIpLmdldFJlZ2V4KCl9LFFEPS9eXFwoWyEiIyQlJicoKSorLFwtLi86Ozw9Pj9AXFtcXVxcXl9ge3x9fl0pLyxaRD0vXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLFZ3PS9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLGVBPS9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLG5jPS9bXHB7UH1ccHtTfV0vdSxaZj0vW1xzXHB7UH1ccHtTfV0vdSxqdz0vW15cc1xwe1B9XHB7U31dL3UsdEE9emUoL14oKD8hWypfXSlwdW5jdFNwYWNlKS8sInUiKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csWmYpLmdldFJlZ2V4KCksWXc9Lyg/IX4pW1xwe1B9XHB7U31dL3UsbkE9Lyg/IX4pW1xzXHB7UH1ccHtTfV0vdSxvQT0vKD86W15cc1xwe1B9XHB7U31dfH4pL3UsckE9L1xbW15bXF1dKj9cXVwoKD86XFwufFteXFxcKFwpXXxcKCg/OlxcLnxbXlxcXChcKV0pKlwpKSpcKXxgW15gXSo/YHw8W148Pl0qPz4vZyxxdz0vXig/OlwqKyg/OigoPyFcKilwdW5jdCl8W15ccypdKSl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxzX10pKS8sYUE9emUocXcsInUiKS5yZXBsYWNlKC9wdW5jdC9nLG5jKS5nZXRSZWdleCgpLGlBPXplKHF3LCJ1IikucmVwbGFjZSgvcHVuY3QvZyxZdykuZ2V0UmVnZXgoKSwkdz0iXlteXypdKj9fX1teXypdKj9cXCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXFwqKXB1bmN0KFxcKispKD89W1xcc118JCl8bm90UHVuY3RTcGFjZShcXCorKSg/IVxcKikoPz1wdW5jdFNwYWNlfCQpfCg/IVxcKilwdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXFwqKykoPyFcXCopKD89cHVuY3QpfCg/IVxcKilwdW5jdChcXCorKSg/IVxcKikoPz1wdW5jdCl8bm90UHVuY3RTcGFjZShcXCorKSg/PW5vdFB1bmN0U3BhY2UpIixzQT16ZSgkdywiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csancpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxaZikucmVwbGFjZSgvcHVuY3QvZyxuYykuZ2V0UmVnZXgoKSxsQT16ZSgkdywiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csb0EpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxuQSkucmVwbGFjZSgvcHVuY3QvZyxZdykuZ2V0UmVnZXgoKSxkQT16ZSgiXlteXypdKj9cXCpcXCpbXl8qXSo/X1teXypdKj8oPz1cXCpcXCopfFteX10rKD89W15fXSl8KD8hXylwdW5jdChfKykoPz1bXFxzXXwkKXxub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKXwoPyFfKXB1bmN0U3BhY2UoXyspKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXyspKD8hXykoPz1wdW5jdCl8KD8hXylwdW5jdChfKykoPyFfKSg/PXB1bmN0KSIsImd1IikucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLGp3KS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csWmYpLnJlcGxhY2UoL3B1bmN0L2csbmMpLmdldFJlZ2V4KCksY0E9emUoL1xcKHB1bmN0KS8sImd1IikucmVwbGFjZSgvcHVuY3QvZyxuYykuZ2V0UmVnZXgoKSx1QT16ZSgvXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vKS5yZXBsYWNlKCJzY2hlbWUiLC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LykucmVwbGFjZSgiZW1haWwiLC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pLmdldFJlZ2V4KCkscEE9emUoSmYpLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCksZkE9emUoIl5jb21tZW50fF48L1thLXpBLVpdW1xcdzotXSpcXHMqPnxePFthLXpBLVpdW1xcdy1dKig/OmF0dHJpYnV0ZSkqP1xccyovPz58XjxcXD9bXFxzXFxTXSo/XFw/PnxePCFbYS16QS1aXStcXHNbXFxzXFxTXSo/PnxePCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+IikucmVwbGFjZSgiY29tbWVudCIscEEpLnJlcGxhY2UoImF0dHJpYnV0ZSIsL1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCksUWQ9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy8sbUE9emUoL14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzooPzpbIFx0XSooPzpcblsgXHRdKik/KSh0aXRsZSkpP1xzKlwpLykucmVwbGFjZSgibGFiZWwiLFFkKS5yZXBsYWNlKCJocmVmIiwvPCg/OlxcLnxbXlxuPD5cXF0pKz58W14gXHRcblx4MDAtXHgxZl0qLykucmVwbGFjZSgidGl0bGUiLC8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS8pLmdldFJlZ2V4KCksWHc9emUoL14hP1xbKGxhYmVsKVxdXFsocmVmKVxdLykucmVwbGFjZSgibGFiZWwiLFFkKS5yZXBsYWNlKCJyZWYiLFhmKS5nZXRSZWdleCgpLEp3PXplKC9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vKS5yZXBsYWNlKCJyZWYiLFhmKS5nZXRSZWdleCgpLGhBPXplKCJyZWZsaW5rfG5vbGluayg/IVxcKCkiLCJnIikucmVwbGFjZSgicmVmbGluayIsWHcpLnJlcGxhY2UoIm5vbGluayIsSncpLmdldFJlZ2V4KCksZW09e19iYWNrcGVkYWw6SXMsYW55UHVuY3R1YXRpb246Y0EsYXV0b2xpbms6dUEsYmxvY2tTa2lwOnJBLGJyOlZ3LGNvZGU6WkQsZGVsOklzLGVtU3Ryb25nTERlbGltOmFBLGVtU3Ryb25nUkRlbGltQXN0OnNBLGVtU3Ryb25nUkRlbGltVW5kOmRBLGVzY2FwZTpRRCxsaW5rOm1BLG5vbGluazpKdyxwdW5jdHVhdGlvbjp0QSxyZWZsaW5rOlh3LHJlZmxpbmtTZWFyY2g6aEEsdGFnOmZBLHRleHQ6ZUEsdXJsOklzfSxnQT17Li4uZW0sbGluazp6ZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsUWQpLmdldFJlZ2V4KCkscmVmbGluazp6ZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsUWQpLmdldFJlZ2V4KCl9LEdmPXsuLi5lbSxlbVN0cm9uZ1JEZWxpbUFzdDpsQSxlbVN0cm9uZ0xEZWxpbTppQSx1cmw6emUoL14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLCJpIikucmVwbGFjZSgiZW1haWwiLC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLykuZ2V0UmVnZXgoKSxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKCg/OlxcLnxbXlxcXSkqPyg/OlxcLnxbXlxzflxcXSkpXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99LHlBPXsuLi5HZixicjp6ZShWdykucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6emUoR2YudGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9LFhkPXtub3JtYWw6UWYsZ2ZtOlhELHBlZGFudGljOkpEfSxNcz17bm9ybWFsOmVtLGdmbTpHZixicmVha3M6eUEscGVkYW50aWM6Z0F9LHZBPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxVdz1lPT52QVtlXTtmdW5jdGlvbiBObyhlLHQpe2lmKHQpe2lmKGFuLmVzY2FwZVRlc3QudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKGFuLmVzY2FwZVJlcGxhY2UsVXcpfWVsc2UgaWYoYW4uZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShhbi5lc2NhcGVSZXBsYWNlTm9FbmNvZGUsVXcpO3JldHVybiBlfWZ1bmN0aW9uIEZ3KGUpe3RyeXtlPWVuY29kZVVSSShlKS5yZXBsYWNlKGFuLnBlcmNlbnREZWNvZGUsIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1mdW5jdGlvbiB6dyhlLHQpe2xldCBuPWUucmVwbGFjZShhbi5maW5kUGlwZSwoYSxpLHMpPT57bGV0IGw9ITEsZD1pO2Zvcig7LS1kPj0wJiZzW2RdPT09IlxcIjspbD0hbDtyZXR1cm4gbD8ifCI6IiB8In0pLG89bi5zcGxpdChhbi5zcGxpdFBpcGUpLHI9MDtpZihvWzBdLnRyaW0oKXx8by5zaGlmdCgpLG8ubGVuZ3RoPjAmJiFvLmF0KC0xKT8udHJpbSgpJiZvLnBvcCgpLHQpaWYoby5sZW5ndGg+dClvLnNwbGljZSh0KTtlbHNlIGZvcig7by5sZW5ndGg8dDspby5wdXNoKCIiKTtmb3IoO3I8by5sZW5ndGg7cisrKW9bcl09b1tyXS50cmltKCkucmVwbGFjZShhbi5zbGFzaFBpcGUsInwiKTtyZXR1cm4gb31mdW5jdGlvbiBPcyhlLHQsbil7bGV0IG89ZS5sZW5ndGg7aWYobz09PTApcmV0dXJuIiI7bGV0IHI9MDtmb3IoO3I8bzspe2xldCBhPWUuY2hhckF0KG8tci0xKTtpZihhPT09dCYmIW4pcisrO2Vsc2UgaWYoYSE9PXQmJm4pcisrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxvLXIpfWZ1bmN0aW9uIGJBKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylpZihlW29dPT09IlxcIilvKys7ZWxzZSBpZihlW29dPT09dFswXSluKys7ZWxzZSBpZihlW29dPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiBvO3JldHVybiBuPjA/LTI6LTF9ZnVuY3Rpb24gV3coZSx0LG4sbyxyKXtsZXQgYT10LmhyZWYsaT10LnRpdGxlfHxudWxsLHM9ZVsxXS5yZXBsYWNlKHIub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsIiQxIik7by5zdGF0ZS5pbkxpbms9ITA7bGV0IGw9e3R5cGU6ZVswXS5jaGFyQXQoMCk9PT0iISI/ImltYWdlIjoibGluayIscmF3Om4saHJlZjphLHRpdGxlOmksdGV4dDpzLHRva2VuczpvLmlubGluZVRva2VucyhzKX07cmV0dXJuIG8uc3RhdGUuaW5MaW5rPSExLGx9ZnVuY3Rpb24gd0EoZSx0LG4pe2xldCBvPWUubWF0Y2gobi5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtpZihvPT09bnVsbClyZXR1cm4gdDtsZXQgcj1vWzFdO3JldHVybiB0LnNwbGl0KGAKYCkubWFwKGE9PntsZXQgaT1hLm1hdGNoKG4ub3RoZXIuYmVnaW5uaW5nU3BhY2UpO2lmKGk9PT1udWxsKXJldHVybiBhO2xldFtzXT1pO3JldHVybiBzLmxlbmd0aD49ci5sZW5ndGg/YS5zbGljZShyLmxlbmd0aCk6YX0pLmpvaW4oYApgKX12YXIgWmQ9Y2xhc3N7b3B0aW9ucztydWxlcztsZXhlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8ZGF9c3BhY2UoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWMoZSk7aWYodCYmdFswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzp0WzBdfX1jb2RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKGUpO2lmKHQpe2xldCBuPXRbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmNvZGVSZW1vdmVJbmRlbnQsIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6dFswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP246T3MobixgCmApfX19ZmVuY2VzKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoZSk7aWYodCl7bGV0IG49dFswXSxvPXdBKG4sdFszXXx8IiIsdGhpcy5ydWxlcyk7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuLGxhbmc6dFsyXT90WzJdLnRyaW0oKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpOnRbMl0sdGV4dDpvfX19aGVhZGluZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZih0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdChuKSl7bGV0IG89T3MobiwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFvfHx0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KG8pKSYmKG49by50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6dFswXSxkZXB0aDp0WzFdLmxlbmd0aCx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19aHIoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5oci5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhyIixyYXc6T3ModFswXSxgCmApfX1ibG9ja3F1b3RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKGUpO2lmKHQpe2xldCBuPU9zKHRbMF0sYApgKS5zcGxpdChgCmApLG89IiIscj0iIixhPVtdO2Zvcig7bi5sZW5ndGg+MDspe2xldCBpPSExLHM9W10sbDtmb3IobD0wO2w8bi5sZW5ndGg7bCsrKWlmKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVN0YXJ0LnRlc3QobltsXSkpcy5wdXNoKG5bbF0pLGk9ITA7ZWxzZSBpZighaSlzLnB1c2gobltsXSk7ZWxzZSBicmVhaztuPW4uc2xpY2UobCk7bGV0IGQ9cy5qb2luKGAKYCksYz1kLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSxgCiAgICAkMWApLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsIiIpO289bz9gJHtvfQoke2R9YDpkLHI9cj9gJHtyfQoke2N9YDpjO2xldCB1PXRoaXMubGV4ZXIuc3RhdGUudG9wO2lmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSEwLHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoYyxhLCEwKSx0aGlzLmxleGVyLnN0YXRlLnRvcD11LG4ubGVuZ3RoPT09MClicmVhaztsZXQgcD1hLmF0KC0xKTtpZihwPy50eXBlPT09ImNvZGUiKWJyZWFrO2lmKHA/LnR5cGU9PT0iYmxvY2txdW90ZSIpe2xldCBmPXAsbT1mLnJhdytgCmArbi5qb2luKGAKYCksZz10aGlzLmJsb2NrcXVvdGUobSk7YVthLmxlbmd0aC0xXT1nLG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC1mLnJhdy5sZW5ndGgpK2cucmF3LHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC1mLnRleHQubGVuZ3RoKStnLnRleHQ7YnJlYWt9ZWxzZSBpZihwPy50eXBlPT09Imxpc3QiKXtsZXQgZj1wLG09Zi5yYXcrYApgK24uam9pbihgCmApLGc9dGhpcy5saXN0KG0pO2FbYS5sZW5ndGgtMV09ZyxvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtcC5yYXcubGVuZ3RoKStnLnJhdyxyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtZi5yYXcubGVuZ3RoKStnLnJhdyxuPW0uc3Vic3RyaW5nKGEuYXQoLTEpLnJhdy5sZW5ndGgpLnNwbGl0KGAKYCk7Y29udGludWV9fXJldHVybnt0eXBlOiJibG9ja3F1b3RlIixyYXc6byx0b2tlbnM6YSx0ZXh0OnJ9fX1saXN0KGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udHJpbSgpLG89bi5sZW5ndGg+MSxyPXt0eXBlOiJsaXN0IixyYXc6IiIsb3JkZXJlZDpvLHN0YXJ0Om8/K24uc2xpY2UoMCwtMSk6IiIsbG9vc2U6ITEsaXRlbXM6W119O249bz9gXFxkezEsOX1cXCR7bi5zbGljZSgtMSl9YDpgXFwke259YCx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihuPW8/bjoiWyorLV0iKTtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgobiksaT0hMTtmb3IoO2U7KXtsZXQgbD0hMSxkPSIiLGM9IiI7aWYoISh0PWEuZXhlYyhlKSl8fHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChlKSlicmVhaztkPXRbMF0sZT1lLnN1YnN0cmluZyhkLmxlbmd0aCk7bGV0IHU9dFsyXS5zcGxpdChgCmAsMSlbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFicyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxwPWUuc3BsaXQoYApgLDEpWzBdLGY9IXUudHJpbSgpLG09MDtpZih0aGlzLm9wdGlvbnMucGVkYW50aWM/KG09MixjPXUudHJpbVN0YXJ0KCkpOmY/bT10WzFdLmxlbmd0aCsxOihtPXRbMl0uc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSxtPW0+ND8xOm0sYz11LnNsaWNlKG0pLG0rPXRbMV0ubGVuZ3RoKSxmJiZ0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KHApJiYoZCs9cCtgCmAsZT1lLnN1YnN0cmluZyhwLmxlbmd0aCsxKSxsPSEwKSwhbCl7bGV0IHY9dGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgobSkseT10aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgobSksYj10aGlzLnJ1bGVzLm90aGVyLmZlbmNlc0JlZ2luUmVnZXgobSksaD10aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KG0pLFM9dGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleChtKTtmb3IoO2U7KXtsZXQgeD1lLnNwbGl0KGAKYCwxKVswXSxFO2lmKHA9eCx0aGlzLm9wdGlvbnMucGVkYW50aWM/KHA9cC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCIgICIpLEU9cCk6RT1wLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIiksYi50ZXN0KHApfHxoLnRlc3QocCl8fFMudGVzdChwKXx8di50ZXN0KHApfHx5LnRlc3QocCkpYnJlYWs7aWYoRS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj1tfHwhcC50cmltKCkpYys9YApgK0Uuc2xpY2UobSk7ZWxzZXtpZihmfHx1LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIikuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKT49NHx8Yi50ZXN0KHUpfHxoLnRlc3QodSl8fHkudGVzdCh1KSlicmVhaztjKz1gCmArcH0hZiYmIXAudHJpbSgpJiYoZj0hMCksZCs9eCtgCmAsZT1lLnN1YnN0cmluZyh4Lmxlbmd0aCsxKSx1PUUuc2xpY2UobSl9fXIubG9vc2V8fChpP3IubG9vc2U9ITA6dGhpcy5ydWxlcy5vdGhlci5kb3VibGVCbGFua0xpbmUudGVzdChkKSYmKGk9ITApKTtsZXQgZz1udWxsLHc7dGhpcy5vcHRpb25zLmdmbSYmKGc9dGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLmV4ZWMoYyksZyYmKHc9Z1swXSE9PSJbIF0gIixjPWMucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywiIikpKSxyLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OmQsdGFzazohIWcsY2hlY2tlZDp3LGxvb3NlOiExLHRleHQ6Yyx0b2tlbnM6W119KSxyLnJhdys9ZH1sZXQgcz1yLml0ZW1zLmF0KC0xKTtpZihzKXMucmF3PXMucmF3LnRyaW1FbmQoKSxzLnRleHQ9cy50ZXh0LnRyaW1FbmQoKTtlbHNlIHJldHVybjtyLnJhdz1yLnJhdy50cmltRW5kKCk7Zm9yKGxldCBsPTA7bDxyLml0ZW1zLmxlbmd0aDtsKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsci5pdGVtc1tsXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhyLml0ZW1zW2xdLnRleHQsW10pLCFyLmxvb3NlKXtsZXQgZD1yLml0ZW1zW2xdLnRva2Vucy5maWx0ZXIodT0+dS50eXBlPT09InNwYWNlIiksYz1kLmxlbmd0aD4wJiZkLnNvbWUodT0+dGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QodS5yYXcpKTtyLmxvb3NlPWN9aWYoci5sb29zZSlmb3IobGV0IGw9MDtsPHIuaXRlbXMubGVuZ3RoO2wrKylyLml0ZW1zW2xdLmxvb3NlPSEwO3JldHVybiByfX1odG1sKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzp0WzBdLHByZTp0WzFdPT09InByZSJ8fHRbMV09PT0ic2NyaXB0Inx8dFsxXT09PSJzdHlsZSIsdGV4dDp0WzBdfX1kZWYoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsIiAiKSxvPXRbMl0/dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuaHJlZkJyYWNrZXRzLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIik6IiIscj10WzNdP3RbM10uc3Vic3RyaW5nKDEsdFszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKTp0WzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpuLHJhdzp0WzBdLGhyZWY6byx0aXRsZTpyfX19dGFibGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKGUpO2lmKCF0fHwhdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KHRbMl0pKXJldHVybjtsZXQgbj16dyh0WzFdKSxvPXRbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywiIikuc3BsaXQoInwiKSxyPXRbM10/LnRyaW0oKT90WzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwiIikuc3BsaXQoYApgKTpbXSxhPXt0eXBlOiJ0YWJsZSIscmF3OnRbMF0saGVhZGVyOltdLGFsaWduOltdLHJvd3M6W119O2lmKG4ubGVuZ3RoPT09by5sZW5ndGgpe2ZvcihsZXQgaSBvZiBvKXRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnblJpZ2h0LnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJyaWdodCIpOnRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGkpP2EuYWxpZ24ucHVzaCgiY2VudGVyIik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGkpP2EuYWxpZ24ucHVzaCgibGVmdCIpOmEuYWxpZ24ucHVzaChudWxsKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylhLmhlYWRlci5wdXNoKHt0ZXh0Om5baV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5baV0pLGhlYWRlcjohMCxhbGlnbjphLmFsaWduW2ldfSk7Zm9yKGxldCBpIG9mIHIpYS5yb3dzLnB1c2goencoaSxhLmhlYWRlci5sZW5ndGgpLm1hcCgocyxsKT0+KHt0ZXh0OnMsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHMpLGhlYWRlcjohMSxhbGlnbjphLmFsaWduW2xdfSkpKTtyZXR1cm4gYX19bGhlYWRpbmcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzp0WzBdLGRlcHRoOnRbMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0OnRbMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHRbMV0pfX1wYXJhZ3JhcGgoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLmNoYXJBdCh0WzFdLmxlbmd0aC0xKT09PWAKYD90WzFdLnNsaWNlKDAsLTEpOnRbMV07cmV0dXJue3R5cGU6InBhcmFncmFwaCIscmF3OnRbMF0sdGV4dDpuLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuKX19fXRleHQoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToidGV4dCIscmF3OnRbMF0sdGV4dDp0WzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZSh0WzBdKX19ZXNjYXBlKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3OnRbMF0sdGV4dDp0WzFdfX10YWcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoZSk7aWYodClyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QodFswXSk/dGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITA6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITEpLCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSExKSx7dHlwZToiaHRtbCIscmF3OnRbMF0saW5MaW5rOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLGluUmF3QmxvY2s6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrLGJsb2NrOiExLHRleHQ6dFswXX19bGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoZSk7aWYodCl7bGV0IG49dFsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KG4pKXtpZighdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKSlyZXR1cm47bGV0IGE9T3Mobi5zbGljZSgwLC0xKSwiXFwiKTtpZigobi5sZW5ndGgtYS5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2xldCBhPWJBKHRbMl0sIigpIik7aWYoYT09PS0yKXJldHVybjtpZihhPi0xKXtsZXQgcz0odFswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrdFsxXS5sZW5ndGgrYTt0WzJdPXRbMl0uc3Vic3RyaW5nKDAsYSksdFswXT10WzBdLnN1YnN0cmluZygwLHMpLnRyaW0oKSx0WzNdPSIifX1sZXQgbz10WzJdLHI9IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLnBlZGFudGljSHJlZlRpdGxlLmV4ZWMobyk7YSYmKG89YVsxXSxyPWFbM10pfWVsc2Ugcj10WzNdP3RbM10uc2xpY2UoMSwtMSk6IiI7cmV0dXJuIG89by50cmltKCksdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KG8pJiYodGhpcy5vcHRpb25zLnBlZGFudGljJiYhdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKT9vPW8uc2xpY2UoMSk6bz1vLnNsaWNlKDEsLTEpKSxXdyh0LHtocmVmOm8mJm8ucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKSx0aXRsZTpyJiZyLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIil9LHRbMF0sdGhpcy5sZXhlcix0aGlzLnJ1bGVzKX19cmVmbGluayhlLHQpe2xldCBuO2lmKChuPXRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhlKSl8fChuPXRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKGUpKSl7bGV0IG89KG5bMl18fG5bMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCIgIikscj10W28udG9Mb3dlckNhc2UoKV07aWYoIXIpe2xldCBhPW5bMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6YSx0ZXh0OmF9fXJldHVybiBXdyhuLHIsblswXSx0aGlzLmxleGVyLHRoaXMucnVsZXMpfX1lbVN0cm9uZyhlLHQsbj0iIil7bGV0IG89dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhlKTtpZighb3x8b1szXSYmbi5tYXRjaCh0aGlzLnJ1bGVzLm90aGVyLnVuaWNvZGVBbHBoYU51bWVyaWMpKXJldHVybjtpZighKG9bMV18fG9bMl18fCIiKXx8IW58fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMobikpe2xldCBhPVsuLi5vWzBdXS5sZW5ndGgtMSxpLHMsbD1hLGQ9MCxjPW9bMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7Zm9yKGMubGFzdEluZGV4PTAsdD10LnNsaWNlKC0xKmUubGVuZ3RoK2EpOyhvPWMuZXhlYyh0KSkhPW51bGw7KXtpZihpPW9bMV18fG9bMl18fG9bM118fG9bNF18fG9bNV18fG9bNl0sIWkpY29udGludWU7aWYocz1bLi4uaV0ubGVuZ3RoLG9bM118fG9bNF0pe2wrPXM7Y29udGludWV9ZWxzZSBpZigob1s1XXx8b1s2XSkmJmElMyYmISgoYStzKSUzKSl7ZCs9cztjb250aW51ZX1pZihsLT1zLGw+MCljb250aW51ZTtzPU1hdGgubWluKHMscytsK2QpO2xldCB1PVsuLi5vWzBdXVswXS5sZW5ndGgscD1lLnNsaWNlKDAsYStvLmluZGV4K3Urcyk7aWYoTWF0aC5taW4oYSxzKSUyKXtsZXQgbT1wLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OnAsdGV4dDptLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhtKX19bGV0IGY9cC5zbGljZSgyLC0yKTtyZXR1cm57dHlwZToic3Ryb25nIixyYXc6cCx0ZXh0OmYsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGYpfX19fWNvZGVzcGFuKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwiICIpLG89dGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdChuKSxyPXRoaXMucnVsZXMub3RoZXIuc3RhcnRpbmdTcGFjZUNoYXIudGVzdChuKSYmdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdChuKTtyZXR1cm4gbyYmciYmKG49bi5zdWJzdHJpbmcoMSxuLmxlbmd0aC0xKSkse3R5cGU6ImNvZGVzcGFuIixyYXc6dFswXSx0ZXh0Om59fX1icihlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImJyIixyYXc6dFswXX19ZGVsKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImRlbCIscmF3OnRbMF0sdGV4dDp0WzJdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2Vucyh0WzJdKX19YXV0b2xpbmsoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhlKTtpZih0KXtsZXQgbixvO3JldHVybiB0WzJdPT09IkAiPyhuPXRbMV0sbz0ibWFpbHRvOiIrbik6KG49dFsxXSxvPW4pLHt0eXBlOiJsaW5rIixyYXc6dFswXSx0ZXh0Om4saHJlZjpvLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpuLHRleHQ6bn1dfX19dXJsKGUpe2xldCB0O2lmKHQ9dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWMoZSkpe2xldCBuLG87aWYodFsyXT09PSJAIiluPXRbMF0sbz0ibWFpbHRvOiIrbjtlbHNle2xldCByO2RvIHI9dFswXSx0WzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyh0WzBdKT8uWzBdPz8iIjt3aGlsZShyIT09dFswXSk7bj10WzBdLHRbMV09PT0id3d3LiI/bz0iaHR0cDovLyIrdFswXTpvPXRbMF19cmV0dXJue3R5cGU6ImxpbmsiLHJhdzp0WzBdLHRleHQ6bixocmVmOm8sdG9rZW5zOlt7dHlwZToidGV4dCIscmF3Om4sdGV4dDpufV19fX1pbmxpbmVUZXh0KGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZih0KXtsZXQgbj10aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s7cmV0dXJue3R5cGU6InRleHQiLHJhdzp0WzBdLHRleHQ6dFswXSxlc2NhcGVkOm59fX19LFFvPWNsYXNzIFZme3Rva2VucztvcHRpb25zO3N0YXRlO3Rva2VuaXplcjtpbmxpbmVRdWV1ZTtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz10fHxkYSx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBaZCx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2xldCBuPXtvdGhlcjphbixibG9jazpYZC5ub3JtYWwsaW5saW5lOk1zLm5vcm1hbH07dGhpcy5vcHRpb25zLnBlZGFudGljPyhuLmJsb2NrPVhkLnBlZGFudGljLG4uaW5saW5lPU1zLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1YZC5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT1Ncy5icmVha3M6bi5pbmxpbmU9TXMuZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz1ufXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6WGQsaW5saW5lOk1zfX1zdGF0aWMgbGV4KHQsbil7cmV0dXJuIG5ldyBWZihuKS5sZXgodCl9c3RhdGljIGxleElubGluZSh0LG4pe3JldHVybiBuZXcgVmYobikuaW5saW5lVG9rZW5zKHQpfWxleCh0KXt0PXQucmVwbGFjZShhbi5jYXJyaWFnZVJldHVybixgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7Zm9yKGxldCBuPTA7bjx0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDtuKyspe2xldCBvPXRoaXMuaW5saW5lUXVldWVbbl07dGhpcy5pbmxpbmVUb2tlbnMoby5zcmMsby50b2tlbnMpfXJldHVybiB0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKHQsbj1bXSxvPSExKXtmb3IodGhpcy5vcHRpb25zLnBlZGFudGljJiYodD10LnJlcGxhY2UoYW4udGFiQ2hhckdsb2JhbCwiICAgICIpLnJlcGxhY2UoYW4uc3BhY2VMaW5lLCIiKSk7dDspe2xldCByO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5ibG9jaz8uc29tZShpPT4ocj1pLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpY29udGludWU7aWYocj10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO3IucmF3Lmxlbmd0aD09PTEmJmkhPT12b2lkIDA/aS5yYXcrPWAKYDpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCk7bGV0IGk9bi5hdCgtMSk7aT8udHlwZT09PSJwYXJhZ3JhcGgifHxpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InBhcmFncmFwaCJ8fGk/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArci5yYXcsaS50ZXh0Kz1gCmArci5yYXcsdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPWkudGV4dCk6dGhpcy50b2tlbnMubGlua3Nbci50YWddfHwodGhpcy50b2tlbnMubGlua3Nbci50YWddPXtocmVmOnIuaHJlZix0aXRsZTpyLnRpdGxlfSk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWxldCBhPXQ7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spe2xldCBpPTEvMCxzPXQuc2xpY2UoMSksbDt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goZD0+e2w9ZC5jYWxsKHtsZXhlcjp0aGlzfSxzKSx0eXBlb2YgbD09Im51bWJlciImJmw+PTAmJihpPU1hdGgubWluKGksbCkpfSksaTwxLzAmJmk+PTAmJihhPXQuc3Vic3RyaW5nKDAsaSsxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihyPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChhKSkpe2xldCBpPW4uYXQoLTEpO28mJmk/LnR5cGU9PT0icGFyYWdyYXBoIj8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gociksbz1hLmxlbmd0aCE9PXQubGVuZ3RoLHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRleHQodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZih0KXtsZXQgaT0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGkpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGkpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IG89dCxyPW51bGw7aWYodGhpcy50b2tlbnMubGlua3Mpe2xldCBzPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihzLmxlbmd0aD4wKWZvcig7KHI9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhvKSkhPW51bGw7KXMuaW5jbHVkZXMoclswXS5zbGljZShyWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYobz1vLnNsaWNlKDAsci5pbmRleCkrIlsiKyJhIi5yZXBlYXQoclswXS5sZW5ndGgtMikrIl0iK28uc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsocj10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhvKSkhPW51bGw7KW89by5zbGljZSgwLHIuaW5kZXgpKyIrKyIrby5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoOyhyPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhvKSkhPW51bGw7KW89by5zbGljZSgwLHIuaW5kZXgpKyJbIisiYSIucmVwZWF0KHJbMF0ubGVuZ3RoLTIpKyJdIitvLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtsZXQgYT0hMSxpPSIiO2Zvcig7dDspe2F8fChpPSIiKSxhPSExO2xldCBzO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5pbmxpbmU/LnNvbWUoZD0+KHM9ZC5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKSwhMCk6ITEpKWNvbnRpbnVlO2lmKHM9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIubGluayh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLnJlZmxpbmsodCx0aGlzLnRva2Vucy5saW5rcykpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKTtsZXQgZD1uLmF0KC0xKTtzLnR5cGU9PT0idGV4dCImJmQ/LnR5cGU9PT0idGV4dCI/KGQucmF3Kz1zLnJhdyxkLnRleHQrPXMudGV4dCk6bi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcodCxvLGkpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4odCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5icih0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmRlbCh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHM9dGhpcy50b2tlbml6ZXIudXJsKHQpKSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1sZXQgbD10O2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSl7bGV0IGQ9MS8wLGM9dC5zbGljZSgxKSx1O3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2gocD0+e3U9cC5jYWxsKHtsZXhlcjp0aGlzfSxjKSx0eXBlb2YgdT09Im51bWJlciImJnU+PTAmJihkPU1hdGgubWluKGQsdSkpfSksZDwxLzAmJmQ+PTAmJihsPXQuc3Vic3RyaW5nKDAsZCsxKSl9aWYocz10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGwpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCkscy5yYXcuc2xpY2UoLTEpIT09Il8iJiYoaT1zLnJhdy5zbGljZSgtMSkpLGE9ITA7bGV0IGQ9bi5hdCgtMSk7ZD8udHlwZT09PSJ0ZXh0Ij8oZC5yYXcrPXMucmF3LGQudGV4dCs9cy50ZXh0KTpuLnB1c2gocyk7Y29udGludWV9aWYodCl7bGV0IGQ9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihkKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihkKX19cmV0dXJuIG59fSxlYz1jbGFzc3tvcHRpb25zO3BhcnNlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8ZGF9c3BhY2UoZSl7cmV0dXJuIiJ9Y29kZSh7dGV4dDplLGxhbmc6dCxlc2NhcGVkOm59KXtsZXQgbz0odHx8IiIpLm1hdGNoKGFuLm5vdFNwYWNlU3RhcnQpPy5bMF0scj1lLnJlcGxhY2UoYW4uZW5kaW5nTmV3bGluZSwiIikrYApgO3JldHVybiBvPyc8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS0nK05vKG8pKyciPicrKG4/cjpObyhyLCEwKSkrYDwvY29kZT48L3ByZT4KYDoiPHByZT48Y29kZT4iKyhuP3I6Tm8ociwhMCkpK2A8L2NvZGU+PC9wcmU+CmB9YmxvY2txdW90ZSh7dG9rZW5zOmV9KXtyZXR1cm5gPGJsb2NrcXVvdGU+CiR7dGhpcy5wYXJzZXIucGFyc2UoZSl9PC9ibG9ja3F1b3RlPgpgfWh0bWwoe3RleHQ6ZX0pe3JldHVybiBlfWhlYWRpbmcoe3Rva2VuczplLGRlcHRoOnR9KXtyZXR1cm5gPGgke3R9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9oJHt0fT4KYH1ocihlKXtyZXR1cm5gPGhyPgpgfWxpc3QoZSl7bGV0IHQ9ZS5vcmRlcmVkLG49ZS5zdGFydCxvPSIiO2ZvcihsZXQgaT0wO2k8ZS5pdGVtcy5sZW5ndGg7aSsrKXtsZXQgcz1lLml0ZW1zW2ldO28rPXRoaXMubGlzdGl0ZW0ocyl9bGV0IHI9dD8ib2wiOiJ1bCIsYT10JiZuIT09MT8nIHN0YXJ0PSInK24rJyInOiIiO3JldHVybiI8IityK2ErYD4KYCtvKyI8LyIrcitgPgpgfWxpc3RpdGVtKGUpe2xldCB0PSIiO2lmKGUudGFzayl7bGV0IG49dGhpcy5jaGVja2JveCh7Y2hlY2tlZDohIWUuY2hlY2tlZH0pO2UubG9vc2U/ZS50b2tlbnNbMF0/LnR5cGU9PT0icGFyYWdyYXBoIj8oZS50b2tlbnNbMF0udGV4dD1uKyIgIitlLnRva2Vuc1swXS50ZXh0LGUudG9rZW5zWzBdLnRva2VucyYmZS50b2tlbnNbMF0udG9rZW5zLmxlbmd0aD4wJiZlLnRva2Vuc1swXS50b2tlbnNbMF0udHlwZT09PSJ0ZXh0IiYmKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0PW4rIiAiK05vKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0KSxlLnRva2Vuc1swXS50b2tlbnNbMF0uZXNjYXBlZD0hMCkpOmUudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHJhdzpuKyIgIix0ZXh0Om4rIiAiLGVzY2FwZWQ6ITB9KTp0Kz1uKyIgIn1yZXR1cm4gdCs9dGhpcy5wYXJzZXIucGFyc2UoZS50b2tlbnMsISFlLmxvb3NlKSxgPGxpPiR7dH08L2xpPgpgfWNoZWNrYm94KHtjaGVja2VkOmV9KXtyZXR1cm4iPGlucHV0ICIrKGU/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaCh7dG9rZW5zOmV9KXtyZXR1cm5gPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L3A+CmB9dGFibGUoZSl7bGV0IHQ9IiIsbj0iIjtmb3IobGV0IHI9MDtyPGUuaGVhZGVyLmxlbmd0aDtyKyspbis9dGhpcy50YWJsZWNlbGwoZS5oZWFkZXJbcl0pO3QrPXRoaXMudGFibGVyb3coe3RleHQ6bn0pO2xldCBvPSIiO2ZvcihsZXQgcj0wO3I8ZS5yb3dzLmxlbmd0aDtyKyspe2xldCBhPWUucm93c1tyXTtuPSIiO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSsrKW4rPXRoaXMudGFibGVjZWxsKGFbaV0pO28rPXRoaXMudGFibGVyb3coe3RleHQ6bn0pfXJldHVybiBvJiYobz1gPHRib2R5PiR7b308L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCt0K2A8L3RoZWFkPgpgK28rYDwvdGFibGU+CmB9dGFibGVyb3coe3RleHQ6ZX0pe3JldHVybmA8dHI+CiR7ZX08L3RyPgpgfXRhYmxlY2VsbChlKXtsZXQgdD10aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyksbj1lLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKGUuYWxpZ24/YDwke259IGFsaWduPSIke2UuYWxpZ259Ij5gOmA8JHtufT5gKSt0K2A8LyR7bn0+CmB9c3Ryb25nKHt0b2tlbnM6ZX0pe3JldHVybmA8c3Ryb25nPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9zdHJvbmc+YH1lbSh7dG9rZW5zOmV9KXtyZXR1cm5gPGVtPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9lbT5gfWNvZGVzcGFuKHt0ZXh0OmV9KXtyZXR1cm5gPGNvZGU+JHtObyhlLCEwKX08L2NvZGU+YH1icihlKXtyZXR1cm4iPGJyPiJ9ZGVsKHt0b2tlbnM6ZX0pe3JldHVybmA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9kZWw+YH1saW5rKHtocmVmOmUsdGl0bGU6dCx0b2tlbnM6bn0pe2xldCBvPXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKG4pLHI9RncoZSk7aWYocj09PW51bGwpcmV0dXJuIG87ZT1yO2xldCBhPSc8YSBocmVmPSInK2UrJyInO3JldHVybiB0JiYoYSs9JyB0aXRsZT0iJytObyh0KSsnIicpLGErPSI+IitvKyI8L2E+IixhfWltYWdlKHtocmVmOmUsdGl0bGU6dCx0ZXh0Om4sdG9rZW5zOm99KXtvJiYobj10aGlzLnBhcnNlci5wYXJzZUlubGluZShvLHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikpO2xldCByPUZ3KGUpO2lmKHI9PT1udWxsKXJldHVybiBObyhuKTtlPXI7bGV0IGE9YDxpbWcgc3JjPSIke2V9IiBhbHQ9IiR7bn0iYDtyZXR1cm4gdCYmKGErPWAgdGl0bGU9IiR7Tm8odCl9ImApLGErPSI+IixhfXRleHQoZSl7cmV0dXJuInRva2VucyJpbiBlJiZlLnRva2Vucz90aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyk6ImVzY2FwZWQiaW4gZSYmZS5lc2NhcGVkP2UudGV4dDpObyhlLnRleHQpfX0sUHM9Y2xhc3N7c3Ryb25nKHt0ZXh0OmV9KXtyZXR1cm4gZX1lbSh7dGV4dDplfSl7cmV0dXJuIGV9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybiBlfWRlbCh7dGV4dDplfSl7cmV0dXJuIGV9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9dGV4dCh7dGV4dDplfSl7cmV0dXJuIGV9bGluayh7dGV4dDplfSl7cmV0dXJuIiIrZX1pbWFnZSh7dGV4dDplfSl7cmV0dXJuIiIrZX1icigpe3JldHVybiIifX0sWm89Y2xhc3MgamZ7b3B0aW9ucztyZW5kZXJlcjt0ZXh0UmVuZGVyZXI7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXR8fGRhLHRoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXJ8fG5ldyBlYyx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMucmVuZGVyZXIucGFyc2VyPXRoaXMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IFBzfXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgamYobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyBqZihuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCBvPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgYT10W3JdO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthLnR5cGVdKXtsZXQgcz1hLGw9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3MudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LHMpO2lmKGwhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMocy50eXBlKSl7bys9bHx8IiI7Y29udGludWV9fWxldCBpPWE7c3dpdGNoKGkudHlwZSl7Y2FzZSJzcGFjZSI6e28rPXRoaXMucmVuZGVyZXIuc3BhY2UoaSk7Y29udGludWV9Y2FzZSJociI6e28rPXRoaXMucmVuZGVyZXIuaHIoaSk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7bys9dGhpcy5yZW5kZXJlci5oZWFkaW5nKGkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e28rPXRoaXMucmVuZGVyZXIuY29kZShpKTtjb250aW51ZX1jYXNlInRhYmxlIjp7bys9dGhpcy5yZW5kZXJlci50YWJsZShpKTtjb250aW51ZX1jYXNlImJsb2NrcXVvdGUiOntvKz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoaSk7Y29udGludWV9Y2FzZSJsaXN0Ijp7bys9dGhpcy5yZW5kZXJlci5saXN0KGkpO2NvbnRpbnVlfWNhc2UiaHRtbCI6e28rPXRoaXMucmVuZGVyZXIuaHRtbChpKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e28rPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKGkpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBzPWksbD10aGlzLnJlbmRlcmVyLnRleHQocyk7Zm9yKDtyKzE8dC5sZW5ndGgmJnRbcisxXS50eXBlPT09InRleHQiOylzPXRbKytyXSxsKz1gCmArdGhpcy5yZW5kZXJlci50ZXh0KHMpO24/bys9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoe3R5cGU6InBhcmFncmFwaCIscmF3OmwsdGV4dDpsLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpsLHRleHQ6bCxlc2NhcGVkOiEwfV19KTpvKz1sO2NvbnRpbnVlfWRlZmF1bHQ6e2xldCBzPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKHMpLCIiO3Rocm93IG5ldyBFcnJvcihzKX19fXJldHVybiBvfXBhcnNlSW5saW5lKHQsbj10aGlzLnJlbmRlcmVyKXtsZXQgbz0iIjtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7bGV0IGE9dFtyXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYS50eXBlXSl7bGV0IHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2EudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGEpO2lmKHMhPT0hMXx8IVsiZXNjYXBlIiwiaHRtbCIsImxpbmsiLCJpbWFnZSIsInN0cm9uZyIsImVtIiwiY29kZXNwYW4iLCJiciIsImRlbCIsInRleHQiXS5pbmNsdWRlcyhhLnR5cGUpKXtvKz1zfHwiIjtjb250aW51ZX19bGV0IGk9YTtzd2l0Y2goaS50eXBlKXtjYXNlImVzY2FwZSI6e28rPW4udGV4dChpKTticmVha31jYXNlImh0bWwiOntvKz1uLmh0bWwoaSk7YnJlYWt9Y2FzZSJsaW5rIjp7bys9bi5saW5rKGkpO2JyZWFrfWNhc2UiaW1hZ2UiOntvKz1uLmltYWdlKGkpO2JyZWFrfWNhc2Uic3Ryb25nIjp7bys9bi5zdHJvbmcoaSk7YnJlYWt9Y2FzZSJlbSI6e28rPW4uZW0oaSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e28rPW4uY29kZXNwYW4oaSk7YnJlYWt9Y2FzZSJiciI6e28rPW4uYnIoaSk7YnJlYWt9Y2FzZSJkZWwiOntvKz1uLmRlbChpKTticmVha31jYXNlInRleHQiOntvKz1uLnRleHQoaSk7YnJlYWt9ZGVmYXVsdDp7bGV0IHM9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksIiI7dGhyb3cgbmV3IEVycm9yKHMpfX19cmV0dXJuIG99fSxKZD1jbGFzc3tvcHRpb25zO2Jsb2NrO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxkYX1zdGF0aWMgcGFzc1Rocm91Z2hIb29rcz1uZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIiwicHJvY2Vzc0FsbFRva2VucyJdKTtwcmVwcm9jZXNzKGUpe3JldHVybiBlfXBvc3Rwcm9jZXNzKGUpe3JldHVybiBlfXByb2Nlc3NBbGxUb2tlbnMoZSl7cmV0dXJuIGV9cHJvdmlkZUxleGVyKCl7cmV0dXJuIHRoaXMuYmxvY2s/UW8ubGV4OlFvLmxleElubGluZX1wcm92aWRlUGFyc2VyKCl7cmV0dXJuIHRoaXMuYmxvY2s/Wm8ucGFyc2U6Wm8ucGFyc2VJbmxpbmV9fSxrQT1jbGFzc3tkZWZhdWx0cz1ZZigpO29wdGlvbnM9dGhpcy5zZXRPcHRpb25zO3BhcnNlPXRoaXMucGFyc2VNYXJrZG93bighMCk7cGFyc2VJbmxpbmU9dGhpcy5wYXJzZU1hcmtkb3duKCExKTtQYXJzZXI9Wm87UmVuZGVyZXI9ZWM7VGV4dFJlbmRlcmVyPVBzO0xleGVyPVFvO1Rva2VuaXplcj1aZDtIb29rcz1KZDtjb25zdHJ1Y3RvciguLi5lKXt0aGlzLnVzZSguLi5lKX13YWxrVG9rZW5zKGUsdCl7bGV0IG49W107Zm9yKGxldCBvIG9mIGUpc3dpdGNoKG49bi5jb25jYXQodC5jYWxsKHRoaXMsbykpLG8udHlwZSl7Y2FzZSJ0YWJsZSI6e2xldCByPW87Zm9yKGxldCBhIG9mIHIuaGVhZGVyKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEudG9rZW5zLHQpKTtmb3IobGV0IGEgb2Ygci5yb3dzKWZvcihsZXQgaSBvZiBhKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGkudG9rZW5zLHQpKTticmVha31jYXNlImxpc3QiOntsZXQgcj1vO249bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKHIuaXRlbXMsdCkpO2JyZWFrfWRlZmF1bHQ6e2xldCByPW87dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW3IudHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW3IudHlwZV0uZm9yRWFjaChhPT57bGV0IGk9clthXS5mbGF0KDEvMCk7bj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoaSx0KSl9KTpyLnRva2VucyYmKG49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKHIudG9rZW5zLHQpKSl9fXJldHVybiBufXVzZSguLi5lKXtsZXQgdD10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnN8fHtyZW5kZXJlcnM6e30sY2hpbGRUb2tlbnM6e319O3JldHVybiBlLmZvckVhY2gobj0+e2xldCBvPXsuLi5ufTtpZihvLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fG8uYXN5bmN8fCExLG4uZXh0ZW5zaW9ucyYmKG4uZXh0ZW5zaW9ucy5mb3JFYWNoKHI9PntpZighci5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gcil7bGV0IGE9dC5yZW5kZXJlcnNbci5uYW1lXTthP3QucmVuZGVyZXJzW3IubmFtZV09ZnVuY3Rpb24oLi4uaSl7bGV0IHM9ci5yZW5kZXJlci5hcHBseSh0aGlzLGkpO3JldHVybiBzPT09ITEmJihzPWEuYXBwbHkodGhpcyxpKSksc306dC5yZW5kZXJlcnNbci5uYW1lXT1yLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gcil7aWYoIXIubGV2ZWx8fHIubGV2ZWwhPT0iYmxvY2siJiZyLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7bGV0IGE9dFtyLmxldmVsXTthP2EudW5zaGlmdChyLnRva2VuaXplcik6dFtyLmxldmVsXT1bci50b2tlbml6ZXJdLHIuc3RhcnQmJihyLmxldmVsPT09ImJsb2NrIj90LnN0YXJ0QmxvY2s/dC5zdGFydEJsb2NrLnB1c2goci5zdGFydCk6dC5zdGFydEJsb2NrPVtyLnN0YXJ0XTpyLmxldmVsPT09ImlubGluZSImJih0LnN0YXJ0SW5saW5lP3Quc3RhcnRJbmxpbmUucHVzaChyLnN0YXJ0KTp0LnN0YXJ0SW5saW5lPVtyLnN0YXJ0XSkpfSJjaGlsZFRva2VucyJpbiByJiZyLmNoaWxkVG9rZW5zJiYodC5jaGlsZFRva2Vuc1tyLm5hbWVdPXIuY2hpbGRUb2tlbnMpfSksby5leHRlbnNpb25zPXQpLG4ucmVuZGVyZXIpe2xldCByPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBlYyh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi5yZW5kZXJlcil7aWYoIShhIGluIHIpKXRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7YX0nIGRvZXMgbm90IGV4aXN0YCk7aWYoWyJvcHRpb25zIiwicGFyc2VyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4ucmVuZGVyZXJbaV0sbD1yW2ldO3JbaV09KC4uLmQpPT57bGV0IGM9cy5hcHBseShyLGQpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkocixkKSksY3x8IiJ9fW8ucmVuZGVyZXI9cn1pZihuLnRva2VuaXplcil7bGV0IHI9dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBaZCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi50b2tlbml6ZXIpe2lmKCEoYSBpbiByKSl0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHthfScgZG9lcyBub3QgZXhpc3RgKTtpZihbIm9wdGlvbnMiLCJydWxlcyIsImxleGVyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4udG9rZW5pemVyW2ldLGw9cltpXTtyW2ldPSguLi5kKT0+e2xldCBjPXMuYXBwbHkocixkKTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KHIsZCkpLGN9fW8udG9rZW5pemVyPXJ9aWYobi5ob29rcyl7bGV0IHI9dGhpcy5kZWZhdWx0cy5ob29rc3x8bmV3IEpkO2ZvcihsZXQgYSBpbiBuLmhvb2tzKXtpZighKGEgaW4gcikpdGhyb3cgbmV3IEVycm9yKGBob29rICcke2F9JyBkb2VzIG5vdCBleGlzdGApO2lmKFsib3B0aW9ucyIsImJsb2NrIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4uaG9va3NbaV0sbD1yW2ldO0pkLnBhc3NUaHJvdWdoSG9va3MuaGFzKGEpP3JbaV09ZD0+e2lmKHRoaXMuZGVmYXVsdHMuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzLmNhbGwocixkKSkudGhlbih1PT5sLmNhbGwocix1KSk7bGV0IGM9cy5jYWxsKHIsZCk7cmV0dXJuIGwuY2FsbChyLGMpfTpyW2ldPSguLi5kKT0+e2xldCBjPXMuYXBwbHkocixkKTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KHIsZCkpLGN9fW8uaG9va3M9cn1pZihuLndhbGtUb2tlbnMpe2xldCByPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxhPW4ud2Fsa1Rva2VucztvLndhbGtUb2tlbnM9ZnVuY3Rpb24oaSl7bGV0IHM9W107cmV0dXJuIHMucHVzaChhLmNhbGwodGhpcyxpKSksciYmKHM9cy5jb25jYXQoci5jYWxsKHRoaXMsaSkpKSxzfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99fSksdGhpc31zZXRPcHRpb25zKGUpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLmV9LHRoaXN9bGV4ZXIoZSx0KXtyZXR1cm4gUW8ubGV4KGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VyKGUsdCl7cmV0dXJuIFpvLnBhcnNlKGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VNYXJrZG93bihlKXtyZXR1cm4obixvKT0+e2xldCByPXsuLi5vfSxhPXsuLi50aGlzLmRlZmF1bHRzLC4uLnJ9LGk9dGhpcy5vbkVycm9yKCEhYS5zaWxlbnQsISFhLmFzeW5jKTtpZih0aGlzLmRlZmF1bHRzLmFzeW5jPT09ITAmJnIuYXN5bmM9PT0hMSlyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4iKSk7aWYodHlwZW9mIG4+InUifHxuPT09bnVsbClyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pKyIsIHN0cmluZyBleHBlY3RlZCIpKTthLmhvb2tzJiYoYS5ob29rcy5vcHRpb25zPWEsYS5ob29rcy5ibG9jaz1lKTtsZXQgcz1hLmhvb2tzP2EuaG9va3MucHJvdmlkZUxleGVyKCk6ZT9Rby5sZXg6UW8ubGV4SW5saW5lLGw9YS5ob29rcz9hLmhvb2tzLnByb3ZpZGVQYXJzZXIoKTplP1pvLnBhcnNlOlpvLnBhcnNlSW5saW5lO2lmKGEuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShhLmhvb2tzP2EuaG9va3MucHJlcHJvY2VzcyhuKTpuKS50aGVuKGQ9PnMoZCxhKSkudGhlbihkPT5hLmhvb2tzP2EuaG9va3MucHJvY2Vzc0FsbFRva2VucyhkKTpkKS50aGVuKGQ9PmEud2Fsa1Rva2Vucz9Qcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMoZCxhLndhbGtUb2tlbnMpKS50aGVuKCgpPT5kKTpkKS50aGVuKGQ9PmwoZCxhKSkudGhlbihkPT5hLmhvb2tzP2EuaG9va3MucG9zdHByb2Nlc3MoZCk6ZCkuY2F0Y2goaSk7dHJ5e2EuaG9va3MmJihuPWEuaG9va3MucHJlcHJvY2VzcyhuKSk7bGV0IGQ9cyhuLGEpO2EuaG9va3MmJihkPWEuaG9va3MucHJvY2Vzc0FsbFRva2VucyhkKSksYS53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnMoZCxhLndhbGtUb2tlbnMpO2xldCBjPWwoZCxhKTtyZXR1cm4gYS5ob29rcyYmKGM9YS5ob29rcy5wb3N0cHJvY2VzcyhjKSksY31jYXRjaChkKXtyZXR1cm4gaShkKX19fW9uRXJyb3IoZSx0KXtyZXR1cm4gbj0+e2lmKG4ubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2xldCBvPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK05vKG4ubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIHQ/UHJvbWlzZS5yZXNvbHZlKG8pOm99aWYodClyZXR1cm4gUHJvbWlzZS5yZWplY3Qobik7dGhyb3cgbn19fSxsYT1uZXcga0E7ZnVuY3Rpb24gTGUoZSx0KXtyZXR1cm4gbGEucGFyc2UoZSx0KX1MZS5vcHRpb25zPUxlLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGxhLnNldE9wdGlvbnMoZSksTGUuZGVmYXVsdHM9bGEuZGVmYXVsdHMsQncoTGUuZGVmYXVsdHMpLExlfTtMZS5nZXREZWZhdWx0cz1ZZjtMZS5kZWZhdWx0cz1kYTtMZS51c2U9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIGxhLnVzZSguLi5lKSxMZS5kZWZhdWx0cz1sYS5kZWZhdWx0cyxCdyhMZS5kZWZhdWx0cyksTGV9O0xlLndhbGtUb2tlbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbGEud2Fsa1Rva2VucyhlLHQpfTtMZS5wYXJzZUlubGluZT1sYS5wYXJzZUlubGluZTtMZS5QYXJzZXI9Wm87TGUucGFyc2VyPVpvLnBhcnNlO0xlLlJlbmRlcmVyPWVjO0xlLlRleHRSZW5kZXJlcj1QcztMZS5MZXhlcj1RbztMZS5sZXhlcj1Rby5sZXg7TGUuVG9rZW5pemVyPVpkO0xlLkhvb2tzPUpkO0xlLnBhcnNlPUxlO3ZhciBDMz1MZS5vcHRpb25zLE0zPUxlLnNldE9wdGlvbnMsTzM9TGUudXNlLEkzPUxlLndhbGtUb2tlbnMsUXc9TGUucGFyc2VJbmxpbmU7dmFyIFIzPVpvLnBhcnNlLFAzPVFvLmxleDtMZS51c2Uoe2JyZWFrczohMCxnZm06ITAscmVuZGVyZXI6e2xpbmsoe2hyZWY6ZSx0aXRsZTp0LHRleHQ6bn0pe2xldCBvPXQ/YCB0aXRsZT0iJHt0fSJgOiIiO3JldHVybmA8YSBocmVmPSIke2V9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiR7b30+JHtufTwvYT5gfX19KTtmdW5jdGlvbiBMcyhlKXtyZXR1cm4gZT9MZS5wYXJzZUlubGluZShlKToiIn1mdW5jdGlvbiBfcyhlKXtyZXR1cm4gZT9MZS5wYXJzZShlKToiIn1mdW5jdGlvbiBadyhlKXtpZighZSlyZXR1cm4iIjtsZXQgdD1lLnJlcGxhY2UoL1xbKFteXF1dKylcXVxbXF4/XGQrXF0vZywiJDEiKS5yZXBsYWNlKC9cW1xeW15cXV0qXF0vZywiIikucmVwbGFjZSgvPT0oW149XSspPT0vZywiJDEiKTtyZXR1cm4gUXcodCx7cmVuZGVyZXI6bmV3IFBzfSkudHJpbSgpfXZhciB4QT0vXFsoW15cXV0rKVxdXFtcXj8oXGQrKVxdL2csZWs9L1xzKlxbXF4/KFxkKylcXVsuOl1ccyovLFNBPS9eIVxbKFteXF1dKilcXVwoKFteKV0rKVwpLyxFQT0vXlxbKFteXF1dKilcXVwoKFteKV0qKVwpLyxOQT0vXC4obXA0fHdlYm18b2dnKShcP3wkKS9pLG5rPS8oPzp5b3V0dWJlXC5jb21cL3dhdGNoXD92PXx5b3V0dVwuYmVcLykoW2EtekEtWjAtOV8tXSspLyxvaz0vdmltZW9cLmNvbVwvKFxkKykvO2Z1bmN0aW9uIFRBKGUpe3JldHVybiBOQS50ZXN0KGUpfHxuay50ZXN0KGUpfHxvay50ZXN0KGUpfWZ1bmN0aW9uIFVzKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywiJiMzOTsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiB0bShlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBEQShlLHQpe2xldCBuPWUubWF0Y2goU0EpO2lmKG4pe2xldCByPW5bMl07VEEocik/dC52aWRlb3MucHVzaCh7YWx0Om5bMV0sdXJsOnJ9KTp0LmltYWdlcy5wdXNoKHthbHQ6blsxXSx1cmw6cn0pO3JldHVybn1sZXQgbz1lLm1hdGNoKEVBKTtpZihvKXshdC5kZXNjcmlwdGlvbiYmIXQudXJsPyh0LmRlc2NyaXB0aW9uPW9bMV18fCIiLHQudXJsPW9bMl18fCIiKTp0LnRleHQucHVzaChlKTtyZXR1cm59ZSYmdC50ZXh0LnB1c2goZSl9ZnVuY3Rpb24gQUEoZSl7bGV0IHQ9ZS5tYXRjaChlayk7aWYoIXQpcmV0dXJue2Zvb3Rub3Rlczp7fSxjbGVhbmVkTWFya2Rvd246ZX07bGV0IG49ZS5zdWJzdHJpbmcoMCx0LmluZGV4KS50cmltRW5kKCksbz1lLnN1YnN0cmluZyh0LmluZGV4KSxyPXt9LGE9bmV3IFJlZ0V4cChlay5zb3VyY2UsImciKSxpPW51bGwscz0wLGw7Zm9yKDsobD1hLmV4ZWMobykpIT09bnVsbDspaSE9PW51bGwmJihyW2ldPXRrKG8uc3Vic3RyaW5nKHMsbC5pbmRleCkpKSxpPWxbMV0scz1sLmluZGV4K2xbMF0ubGVuZ3RoO3JldHVybiBpIT09bnVsbCYmKHJbaV09dGsoby5zdWJzdHJpbmcocykpKSx7Zm9vdG5vdGVzOnIsY2xlYW5lZE1hcmtkb3duOm59fWZ1bmN0aW9uIHRrKGUpe2xldCB0PXtkZXNjcmlwdGlvbjoiIix1cmw6IiIsaW1hZ2VzOltdLHZpZGVvczpbXSx0ZXh0OltdfTtmb3IobGV0IG4gb2YgZS5zcGxpdChgCmApKXtsZXQgbz1uLnRyaW0oKTtvJiZEQShvLHQpfXJldHVybiB0fWZ1bmN0aW9uIENBKGUpe2xldCB0PVtdO3JldHVybiBlLmltYWdlcy5sZW5ndGgmJnQucHVzaCh7Y2xzOiJpbWFnZSIsdGl0bGU6IkNvbnRhaW5zIGltYWdlIixzeW1ib2w6Ilx1ezFGNUJDfSJ9KSxlLnZpZGVvcy5sZW5ndGgmJnQucHVzaCh7Y2xzOiJ2aWRlbyIsdGl0bGU6IkNvbnRhaW5zIHZpZGVvIixzeW1ib2w6Ilx1ezFGM0FDfSJ9KSwhZS5pbWFnZXMubGVuZ3RoJiYhZS52aWRlb3MubGVuZ3RoJiYoZS51cmw/dC5wdXNoKHtjbHM6InVybCIsdGl0bGU6IkNvbnRhaW5zIGxpbmsiLHN5bWJvbDoiXHV7MUY1MTd9In0pOihlLmRlc2NyaXB0aW9ufHxlLnRleHQubGVuZ3RoKSYmdC5wdXNoKHtjbHM6InRleHQiLHRpdGxlOiJDb250YWlucyBkZXRhaWxzIixzeW1ib2w6Ilx1ezFGNEREfSJ9KSksdH1mdW5jdGlvbiBNQShlKXtsZXQgdD1bJzxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAiPiddO2UudXJsJiZ0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtdXJsIj48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xOCAxM3Y2YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmg2Ii8+PHBvbHlsaW5lIHBvaW50cz0iMTUgMyAyMSAzIDIxIDkiLz48bGluZSB4MT0iMTAiIHkxPSIxNCIgeDI9IjIxIiB5Mj0iMyIvPjwvc3ZnPjxhIGhyZWY9IiR7VXMoZS51cmwpfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+JHt0bShlLnVybCl9PC9hPjwvZGl2PmApLGUuZGVzY3JpcHRpb24mJnQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC10ZXh0Ij4ke3RtKGUuZGVzY3JpcHRpb24pfTwvZGl2PmApO2ZvcihsZXQgbiBvZiBlLnRleHQpdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLXRleHQiPiR7dG0obil9PC9kaXY+YCk7Zm9yKGxldCBuIG9mIGUuaW1hZ2VzKXQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PGltZyBzcmM9IiR7VXMobi51cmwpfSIgYWx0PSIke1VzKG4uYWx0KX0iIGxvYWRpbmc9ImxhenkiLz48L2Rpdj5gKTtmb3IobGV0IG4gb2YgZS52aWRlb3Mpe2xldCBvPW4udXJsLm1hdGNoKG5rKSxyPW4udXJsLm1hdGNoKG9rKTtvP3QucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7b1sxXX0iIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+PC9kaXY+YCk6cj90LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjxpZnJhbWUgc3JjPSJodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJHtyWzFdfSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT48L2Rpdj5gKTp0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjx2aWRlbyBzcmM9IiR7VXMobi51cmwpfSIgY29udHJvbHM+PC92aWRlbz48L2Rpdj5gKX1yZXR1cm4gdC5wdXNoKCc8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLWFjdGlvbnMiPjxidXR0b24gY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtY2xvc2UiIHR5cGU9ImJ1dHRvbiI+Q0xPU0U8L2J1dHRvbj48L2Rpdj4nKSx0LnB1c2goIjwvZGl2PiIpLHQuam9pbigiIil9ZnVuY3Rpb24gT0EoZSx0KXtsZXQgbj1DQSh0KSxvPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7dXJsOnQudXJsLGRlc2NyaXB0aW9uOnQuZGVzY3JpcHRpb24sdGV4dDp0LnRleHQsaW1hZ2VzOnQuaW1hZ2VzLHZpZGVvczp0LnZpZGVvc30pKSxyPXQudXJsfHwiIyIsYT1uLm1hcChpPT5gPHNwYW4gY2xhc3M9InJpY2gtZm9vdG5vdGUtaW5kaWNhdG9yIHJpY2gtZm9vdG5vdGUtaW5kaWNhdG9yLS0ke2kuY2xzfSIgdGl0bGU9IiR7aS50aXRsZX0iPiR7aS5zeW1ib2x9PC9zcGFuPmApLmpvaW4oIiIpO3JldHVybmA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXdyYXAiPjxhIGNsYXNzPSJyaWNoLWZvb3Rub3RlLWxpbmsiIGhyZWY9IiR7VXMocil9IiBkYXRhLXJpY2gtZm9vdG5vdGU9IiR7b30iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPiR7ZX08L2E+YCthKyI8L2Rpdj4ifWZ1bmN0aW9uIGNvKGUpe3JldHVybiBhayhlLExzKX1mdW5jdGlvbiByayhlKXtyZXR1cm4gYWsoZSxfcyl9ZnVuY3Rpb24gYWsoZSx0KXtpZighZSlyZXR1cm4iIjtsZXR7Zm9vdG5vdGVzOm4sY2xlYW5lZE1hcmtkb3duOm99PUFBKGUpO2lmKE9iamVjdC5rZXlzKG4pLmxlbmd0aD09PTApcmV0dXJuIHQoZSk7bGV0IHI9W10sYT1vLnJlcGxhY2UoeEEsKHMsbCxkKT0+e2lmKCFuW2RdKXJldHVybiBzO2xldCBjPXIubGVuZ3RoO3JldHVybiByLnB1c2goe3RleHQ6bCxmbklkOmR9KSxgPCEtLUZOUkVGOiR7Y30tLT5gfSksaT10KGEpO3JldHVybiBpPWkucmVwbGFjZSgvPCEtLUZOUkVGOihcZCspLS0+L2csKHMsbCk9PntsZXR7dGV4dDpkLGZuSWQ6Y309cltwYXJzZUludChsKV0sdT1uW2NdO2lmKCF1KXJldHVybiBkO2xldCBwPUxzKGQpO3JldHVybiBPQShwLHUpfSksaX1mdW5jdGlvbiBXbihlKXtpZighZSlyZXR1cm47bGV0IHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCIucmljaC1mb290bm90ZS1saW5rW2RhdGEtcmljaC1mb290bm90ZV0iKTtmb3IobGV0IG4gb2YgdCl7aWYobi5fdGlwcHlSaWNoRm9vdG5vdGUpY29udGludWU7bGV0IG87dHJ5e289SlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQobi5kYXRhc2V0LnJpY2hGb290bm90ZSkpfWNhdGNoe2NvbnRpbnVlfWlmKCEhIShvLmRlc2NyaXB0aW9ufHxvLnRleHQ/Lmxlbmd0aHx8by5pbWFnZXM/Lmxlbmd0aHx8by52aWRlb3M/Lmxlbmd0aCkpY29udGludWU7bGV0IGE9TUEobyksaT1DcyhuLHtjb250ZW50OmEsYWxsb3dIVE1MOiEwLGludGVyYWN0aXZlOiEwLHRyaWdnZXI6Im1hbnVhbCIscGxhY2VtZW50OiJib3R0b20tc3RhcnQiLHRoZW1lOiJyaWNoLWZvb3Rub3RlIixtYXhXaWR0aDo0MjAsYXJyb3c6ITAsZHVyYXRpb246WzE1MCwxMDBdLGFwcGVuZFRvOigpPT5kb2N1bWVudC5ib2R5LG9uU2hvd24oKXtsZXQgcz1pLnBvcHBlci5xdWVyeVNlbGVjdG9yKCIucmljaC1mb290bm90ZS1wb3B1cC1jbG9zZSIpO3MmJnMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5pLmhpZGUoKSx7b25jZTohMH0pfX0pO24uX3RpcHB5UmljaEZvb3Rub3RlPWksbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscz0+e2lmKGkuc3RhdGUuaXNWaXNpYmxlKXtpLmhpZGUoKTtyZXR1cm59cy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCksaS5zaG93KCl9KX19dmFyIG5tPSExLElBPTAsUkE9MjAwLG9jPVtdLG9tPW5ldyBTZXQ7ZnVuY3Rpb24gcm0oZSl7aWYodHlwZW9mIGU9PSJib29sZWFuIil7bm09ZTtyZXR1cm59bGV0IHQ9U3RyaW5nKGV8fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKTtubT1bInRydWUiLCJ5ZXMiLCIxIiwib24iLCJlbmFibGVkIl0uaW5jbHVkZXModCl9ZnVuY3Rpb24gayguLi5lKXtpZihubSl7Y29uc29sZS5sb2coLi4uZSk7bGV0IHQ9e2lkOisrSUEsdHM6RGF0ZS5ub3coKSxhcmdzOmV9O29jLnB1c2godCksb2MubGVuZ3RoPlJBJiZvYy5zaGlmdCgpLHNldFRpbWVvdXQoKCk9Pm9tLmZvckVhY2gobj0+bih0KSksMCl9fWZ1bmN0aW9uIGlrKCl7cmV0dXJuWy4uLm9jXX1mdW5jdGlvbiBzayhlKXtvbS5hZGQoZSl9ZnVuY3Rpb24gbGsoZSl7b20uZGVsZXRlKGUpfXZhciBkaz0iQ29uc29sZSBsb2dnaW5nIixQQT1uZXcgU2V0KFsiY2hhbmdlZCIsImNyZWF0ZWQiLCJvcGVuZWQiLCJyZWxldmFuY2UiLCJ0aXRsZSIsInVwZGF0ZWQiXSk7ZnVuY3Rpb24gTEEoZSl7cmV0dXJuYGRhc2hib2FyZF8ke2V9X2NvbmZpZ2B9ZnVuY3Rpb24gcmMoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9lOmU/LnV1aWR9ZnVuY3Rpb24gaGsoZSl7cmV0dXJuKGUubWF0Y2goL14oI3sxLDZ9KVxzKyguKykkL2dtKXx8W10pLm1hcCgobixvKT0+KHtoZWFkaW5nOnt0ZXh0Om4ucmVwbGFjZSgvXiN7MSw2fVxzKy8sIiIpLnRyaW0oKSxsZXZlbDoobi5tYXRjaCgvXiMrLyl8fFsiIl0pWzBdLmxlbmd0aH0saW5kZXg6b30pKX1mdW5jdGlvbiBhYyhlKXtyZXR1cm4gZT09bnVsbD9udWxsOmU8MWUxMD9lKjFlMzplfWZ1bmN0aW9uIF9BKGUpe2xldCB0PW5ldyBEYXRlKGUpLG49dC5nZXREYXkoKTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpLW4rKG49PT0wPy02OjEpKSx0LnNldEhvdXJzKDAsMCwwLDApLHR9ZnVuY3Rpb24gc20oZSl7cmV0dXJuKGV8fFtdKS5tYXAodD0+KHsuLi50LHNjb3JlOnQ/LnNjb3JlPz90Py52aWN0b3J5VmFsdWU/PzB9KSl9ZnVuY3Rpb24gVUEoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCksbz1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihyPT57bGV0IGE9YWMoci5zdGFydEF0KTtyZXR1cm4hci5jb21wbGV0ZWRBdCYmIXIuZGlzbWlzc2VkQXQmJmEhPW51bGwmJmE+PW4mJmE8b30pfWZ1bmN0aW9uIGdrKGUsdCl7bGV0IG49dC5nZXRUaW1lKCksbz1uKzcqODY0ZTU7cmV0dXJuIGUuZmlsdGVyKHI9PntsZXQgYT1hYyhyLmNvbXBsZXRlZEF0KTtyZXR1cm4gYSE9bnVsbCYmYT49biYmYTxvfSl9ZnVuY3Rpb24gRkEoZSx0KXtyZXR1cm4gZ2soZSx0KS5yZWR1Y2UoKG4sbyk9Pm4rKG8udmljdG9yeVZhbHVlfHwwKSwwKX1mdW5jdGlvbiB6QShlLHQpe3JldHVyblsiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0IiwiU3VuIl0ubWFwKChvLHIpPT57bGV0IGE9bmV3IERhdGUodCk7YS5zZXREYXRlKGEuZ2V0RGF0ZSgpK3IpO2xldCBpPW5ldyBEYXRlKGEpO2kuc2V0RGF0ZShpLmdldERhdGUoKSsxKTtsZXQgcz1lLmZpbHRlcihsPT57bGV0IGQ9YWMobC5jb21wbGV0ZWRBdCk7cmV0dXJuIGQhPW51bGwmJmQ+PWEuZ2V0VGltZSgpJiZkPGkuZ2V0VGltZSgpfSk7cmV0dXJue2RheTpvLGRhdGU6YS50b0lTT1N0cmluZygpLHZhbHVlOnMucmVkdWNlKChsLGQpPT5sKyhkLnZpY3RvcnlWYWx1ZXx8MCksMCksdGFza0NvdW50OnMubGVuZ3RofX0pfWZ1bmN0aW9uIGNrKGUpe2xldCB0PVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxuPShlLTEpKjM7cmV0dXJuW3Rbbl0sdFtuKzFdLHRbbisyXV19ZnVuY3Rpb24gRnMoZSl7ZS5zdHlsZS5iYWNrZ3JvdW5kPSJ2YXIoLS1kYXNoYm9hcmQtY29sb3ItYmctY2FyZCwgI2ZmZmZmZikiLGUuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgdmFyKC0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciwgI2Q4ZGRlNikiLGUuc3R5bGUuYm9yZGVyUmFkaXVzPSI2cHgiLGUuc3R5bGUuY29sb3I9InZhcigtLWRhc2hib2FyZC1jb2xvci10ZXh0LCAjMWYyOTMzKSIsZS5zdHlsZS5mb250RmFtaWx5PSJpbmhlcml0IixlLnN0eWxlLmZvbnRTaXplPSIwLjg1cmVtIixlLnN0eWxlLnBhZGRpbmc9IjZweCA4cHgiLGUuc3R5bGUud2lkdGg9IjEwMCUifWZ1bmN0aW9uIFdBKGUsdCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtuLnN0eWxlLmRpc3BsYXk9ImZsZXgiLG4uc3R5bGUuYWxpZ25JdGVtcz0iY2VudGVyIixuLnN0eWxlLmdhcD0iMTBweCI7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO28udGV4dENvbnRlbnQ9ZT8ubGFiZWx8fGBJbnB1dCAke3QrMX1gLG8uc3R5bGUuY29sb3I9InZhcigtLWRhc2hib2FyZC1jb2xvci10ZXh0LXNlY29uZGFyeSwgIzdhODY5OSkiLG8uc3R5bGUuZm9udFdlaWdodD0iNjAwIixvLnN0eWxlLm1pbldpZHRoPSIxNDBweCIsbi5hcHBlbmRDaGlsZChvKTtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLnN0eWxlLmZsZXg9IjEiLG4uYXBwZW5kQ2hpbGQocik7bGV0IGE9ZT8udHlwZXx8InRleHQiLGk9QXJyYXkuaXNBcnJheShlPy5vcHRpb25zKT9lLm9wdGlvbnM6W107aWYoYT09PSJjaGVja2JveCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIGwudHlwZT0iY2hlY2tib3giLGwuY2hlY2tlZD0hIWU/LnZhbHVlLHIuYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLmNoZWNrZWR9fWlmKGE9PT0icmFkaW8iKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLnN0eWxlLmRpc3BsYXk9ImZsZXgiLGwuc3R5bGUuZmxleFdyYXA9IndyYXAiLGwuc3R5bGUuZ2FwPSIxMHB4IjtsZXQgZD1gZGV2LXByb21wdC1yYWRpby0ke0RhdGUubm93KCl9LSR7dH1gLGM9bnVsbDtmb3IobGV0W3UscF1vZiBpLmVudHJpZXMoKSl7bGV0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtmLnN0eWxlLmRpc3BsYXk9ImlubGluZS1mbGV4IixmLnN0eWxlLmFsaWduSXRlbXM9ImNlbnRlciIsZi5zdHlsZS5nYXA9IjRweCI7bGV0IG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTttLnR5cGU9InJhZGlvIixtLm5hbWU9ZCxtLnZhbHVlPVN0cmluZyhwPy52YWx1ZT8/cD8ubGFiZWw/PyIiKSxlPy52YWx1ZSE9bnVsbCYmU3RyaW5nKGUudmFsdWUpPT09bS52YWx1ZSYmKG0uY2hlY2tlZD0hMCksY3x8KGM9bSk7bGV0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2cudGV4dENvbnRlbnQ9cD8ubGFiZWw/P20udmFsdWUsZi5hcHBlbmQobSxnKSxsLmFwcGVuZENoaWxkKGYpLHU9PT1pLmxlbmd0aC0xJiYhbC5xdWVyeVNlbGVjdG9yKCJpbnB1dDpjaGVja2VkIikmJmMmJihjLmNoZWNrZWQ9ITApfXJldHVybiByLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6YyxnZXRWYWx1ZTooKT0+e2xldCB1PWwucXVlcnlTZWxlY3RvcigiaW5wdXQ6Y2hlY2tlZCIpO3JldHVybiB1P3UudmFsdWU6bnVsbH19fWlmKGE9PT0ibm90ZSIpe2xldCBsPU9iamVjdC52YWx1ZXMocW8pLmZsYXQoKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO0ZzKGQpO2ZvcihsZXQgdSBvZiBsKXtsZXQgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtwLnZhbHVlPXUudXVpZCxwLnRleHRDb250ZW50PXUubmFtZXx8dS51dWlkLGQuYXBwZW5kQ2hpbGQocCl9cmV0dXJuIGU/LnZhbHVlIT1udWxsJiYoZC52YWx1ZT1TdHJpbmcocmMoZS52YWx1ZSkpKSxyLmFwcGVuZENoaWxkKGQpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6ZCxnZXRWYWx1ZTooKT0+bC5maW5kKHU9PnUudXVpZD09PWQudmFsdWUpfHxudWxsfX1pZihhPT09InNlbGVjdCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO0ZzKGwpO2ZvcihsZXQgZCBvZiBpKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtjLnZhbHVlPVN0cmluZyhkPy52YWx1ZT8/ZD8ubGFiZWw/PyIiKSxjLnRleHRDb250ZW50PWQ/LmxhYmVsPz9jLnZhbHVlLGwuYXBwZW5kQ2hpbGQoYyl9cmV0dXJuIGU/LnZhbHVlIT1udWxsJiYobC52YWx1ZT1TdHJpbmcoZS52YWx1ZSkpLHIuYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLnZhbHVlfX1pZihhPT09ImRhdGUiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2lmKGwudHlwZT0iZGF0ZSIsZT8udmFsdWUhPW51bGwpe2xldCBkPW5ldyBEYXRlKGFjKE51bWJlcihlLnZhbHVlKSkpO051bWJlci5pc05hTihkLmdldFRpbWUoKSl8fChsLnZhbHVlPWQudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKSl9cmV0dXJuIEZzKGwpLHIuYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT57aWYoIWwudmFsdWUpcmV0dXJuIG51bGw7bGV0IGQ9RGF0ZS5wYXJzZShgJHtsLnZhbHVlfVQwMDowMDowMFpgKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGQpP251bGw6TWF0aC5mbG9vcihkLzFlMyl9fX1pZihhPT09InRleHQiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3JldHVybiBsLnJvd3M9MixGcyhsKSxsLnZhbHVlPVN0cmluZyhlPy52YWx1ZT8/IiIpLGU/LnBsYWNlaG9sZGVyJiYobC5wbGFjZWhvbGRlcj1lLnBsYWNlaG9sZGVyKSxyLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC52YWx1ZX19bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyZXR1cm4gcy50eXBlPWE9PT0ic2VjdXJlVGV4dCI/InBhc3N3b3JkIjoidGV4dCIsRnMocykscy52YWx1ZT1TdHJpbmcoZT8udmFsdWU/PyIiKSxlPy5wbGFjZWhvbGRlciYmKHMucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlciksci5hcHBlbmRDaGlsZChzKSx7bGluZTpuLGZvY3VzVGFyZ2V0OnMsZ2V0VmFsdWU6KCk9PnMudmFsdWV9fWZ1bmN0aW9uIGFtKGUsdCl7ZS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCB2YXIoLS1kYXNoYm9hcmQtY29sb3ItYm9yZGVyLCAjZDhkZGU2KSIsZS5zdHlsZS5ib3JkZXJSYWRpdXM9IjZweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLGUuc3R5bGUuZm9udFNpemU9IjAuOHJlbSIsZS5zdHlsZS5mb250V2VpZ2h0PSI2MDAiLGUuc3R5bGUucGFkZGluZz0iOHB4IDE2cHgiLHQ/KGUuc3R5bGUuYmFja2dyb3VuZD0idmFyKC0tZGFzaGJvYXJkLWNvbG9yLWFjY2VudCwgI2U4ODUzZCkiLGUuc3R5bGUuYm9yZGVyQ29sb3I9InZhcigtLWRhc2hib2FyZC1jb2xvci1hY2NlbnQsICNlODg1M2QpIixlLnN0eWxlLmNvbG9yPSJ2YXIoLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1vbi1hY2NlbnQsICNmZmZmZmYpIik6KGUuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLGUuc3R5bGUuY29sb3I9InZhcigtLWRhc2hib2FyZC1jb2xvci10ZXh0LXNlY29uZGFyeSwgIzdhODY5OSkiKX1mdW5jdGlvbiBCQShlLHQ9e30pe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtsZXQgbj1BcnJheS5pc0FycmF5KHQ/LmlucHV0cykmJnQuaW5wdXRzLmxlbmd0aD4wP3QuaW5wdXRzOlt7dHlwZToidGV4dCJ9XSxvPUFycmF5LmlzQXJyYXkodD8uYWN0aW9ucyk/dC5hY3Rpb25zOltdO3JldHVybiBuZXcgUHJvbWlzZShyPT57bGV0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5kYXRhc2V0LmRldlByb21wdD0ib3ZlcmxheSIsYS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGEuc3R5bGUuaW5zZXQ9IjAiLGEuc3R5bGUuYmFja2dyb3VuZD0idmFyKC0tZGFzaGJvYXJkLWNvbG9yLW92ZXJsYXktYmFja2Ryb3AsIHJnYmEoMCwwLDAsMC40KSkiLGEuc3R5bGUuekluZGV4PSI5OTk5OSIsYS5zdHlsZS5kaXNwbGF5PSJncmlkIixhLnN0eWxlLnBsYWNlSXRlbXM9ImNlbnRlciI7bGV0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5zdHlsZS53aWR0aD0ibWluKDY1MHB4LCA5MnZ3KSIsaS5zdHlsZS5iYWNrZ3JvdW5kPSJ2YXIoLS1kYXNoYm9hcmQtY29sb3ItYmctY2FyZCwgI2ZmZmZmZikiLGkuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgdmFyKC0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciwgI2Q4ZGRlNikiLGkuc3R5bGUuYm9yZGVyUmFkaXVzPSIxNHB4IixpLnN0eWxlLmNvbG9yPSJ2YXIoLS1kYXNoYm9hcmQtY29sb3ItdGV4dCwgIzFmMjkzMykiLGkuc3R5bGUuZm9udEZhbWlseT0iUm9ib3RvLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYiLGkuc3R5bGUuYm94U2hhZG93PSIwIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4yNSkiLGEuYXBwZW5kQ2hpbGQoaSk7bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy50ZXh0Q29udGVudD1TdHJpbmcoZT8/IlByb21wdCIpLHMuc3R5bGUuYm9yZGVyQm90dG9tPSIxcHggc29saWQgdmFyKC0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciwgI2Q4ZGRlNikiLHMuc3R5bGUuY29sb3I9InZhcigtLWRhc2hib2FyZC1jb2xvci1uYXZ5LCAjMmMzZTZiKSIscy5zdHlsZS5mb250U2l6ZT0iMC45NXJlbSIscy5zdHlsZS5mb250V2VpZ2h0PSI3MDAiLHMuc3R5bGUucGFkZGluZz0iMTZweCIsaS5hcHBlbmRDaGlsZChzKTtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7bC5zdHlsZS5kaXNwbGF5PSJmbGV4IixsLnN0eWxlLmZsZXhEaXJlY3Rpb249ImNvbHVtbiIsbC5zdHlsZS5mb250U2l6ZT0iMC44NXJlbSIsbC5zdHlsZS5nYXA9IjEwcHgiLGwuc3R5bGUucGFkZGluZz0iMTZweCIsaS5hcHBlbmRDaGlsZChsKTtsZXQgZD1uLm1hcCgoZyx3KT0+V0EoZyx3KSk7Zm9yKGxldCBnIG9mIGQpbC5hcHBlbmRDaGlsZChnLmxpbmUpO2xldCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc3R5bGUuZGlzcGxheT0iZmxleCIsYy5zdHlsZS5qdXN0aWZ5Q29udGVudD0iZmxleC1lbmQiLGMuc3R5bGUuZ2FwPSI4cHgiLGMuc3R5bGUuYm9yZGVyVG9wPSIxcHggc29saWQgdmFyKC0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciwgI2Q4ZGRlNikiLGMuc3R5bGUubWFyZ2luVG9wPSI4cHgiLGMuc3R5bGUucGFkZGluZ1RvcD0iMTZweCIsbC5hcHBlbmRDaGlsZChjKTtsZXQgdT0tMTtmb3IobGV0W2csd11vZiBvLmVudHJpZXMoKSl7bGV0IHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7di50eXBlPSJidXR0b24iLHYudGV4dENvbnRlbnQ9dz8ubGFiZWx8fGBBY3Rpb24gJHtnKzF9YCxhbSh2LCExKSx2LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3U9dz8udmFsdWU/P2csbC5yZXF1ZXN0U3VibWl0KCl9KSxjLmFwcGVuZENoaWxkKHYpfWxldCBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3AudHlwZT0iYnV0dG9uIixwLmRhdGFzZXQuZGV2UHJvbXB0Q2FuY2VsPSJ0cnVlIixwLnRleHRDb250ZW50PSJDYW5jZWwiLGFtKHAsITEpLHAuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57YS5yZW1vdmUoKSxyKG51bGwpfSksYy5hcHBlbmRDaGlsZChwKTtsZXQgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtmLnR5cGU9InN1Ym1pdCIsZi50ZXh0Q29udGVudD0iU3VibWl0IixhbShmLCEwKSxjLmFwcGVuZENoaWxkKGYpLGwuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixnPT57Zy5wcmV2ZW50RGVmYXVsdCgpO2xldCB3PWQubWFwKHY9PnYuZ2V0VmFsdWUoKSk7YS5yZW1vdmUoKSx3Lmxlbmd0aD09PTEmJm8ubGVuZ3RoPT09MD9yKHdbMF0pOm8ubGVuZ3RoPT09MD9yKHcpOnIoWy4uLncsdV0pfSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtsZXQgbT1kLmZpbmQoZz0+Zy5mb2N1c1RhcmdldCk/LmZvY3VzVGFyZ2V0O20mJm0uZm9jdXMoKX0pfXZhciB6cz1udWxsO2FzeW5jIGZ1bmN0aW9uIHlrKCl7aWYoenMhPT1udWxsKXJldHVybiB6czt0cnl7enM9YXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvc2V0dGluZ3MiKSkuanNvbigpfWNhdGNoe3pzPXt9fXJldHVybiB6c31hc3luYyBmdW5jdGlvbiBIQShlLHQpe2xldCBuPWF3YWl0IHlrKCk7bltlXT10O3RyeXthd2FpdCBmZXRjaCgiL2FwaS9zZXR0aW5ncyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtrZXk6ZSx2YWx1ZTp0fSl9KX1jYXRjaChvKXtjb25zb2xlLndhcm4oIltkZXYtYXBwXSBmYWlsZWQgdG8gcGVyc2lzdCBzZXR0aW5nIixlLG8pfX1hc3luYyBmdW5jdGlvbiBpbSgpe3RyeXtsZXQgZT1hd2FpdCBmZXRjaCgiL2FwaS90YXNrcyIpO3JldHVybiBzbShhd2FpdCBlLmpzb24oKSl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIEtBKGUsdCl7dHJ5e2xldCBuPWF3YWl0IGZldGNoKGAvYXBpL3Rhc2tzP2Zyb209JHtlfSZ0bz0ke3R9YCk7cmV0dXJuIHNtKGF3YWl0IG4uanNvbigpKX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgZnVuY3Rpb24gdWsoZSl7dHJ5e2xldCB0PWU/YC9hcGkvbW9vZHM/ZnJvbT0ke2V9YDoiL2FwaS9tb29kcyI7cmV0dXJuIGF3YWl0KGF3YWl0IGZldGNoKHQpKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fXZhciBHQT1be2lkOiJkb21haW4td29yay11dWlkIixuYW1lOiJXb3JrIix1dWlkOiJkb21haW4td29yay11dWlkIixub3Rlczpxb1siZG9tYWluLXdvcmstdXVpZCJdfSx7aWQ6ImRvbWFpbi1wZXJzb25hbC11dWlkIixuYW1lOiJQZXJzb25hbCIsdXVpZDoiZG9tYWluLXBlcnNvbmFsLXV1aWQiLG5vdGVzOnFvWyJkb21haW4tcGVyc29uYWwtdXVpZCJdfSx7aWQ6ImRvbWFpbi1zaWRlLXV1aWQiLG5hbWU6IlNpZGUgUHJvamVjdHMiLHV1aWQ6ImRvbWFpbi1zaWRlLXV1aWQiLG5vdGVzOnFvWyJkb21haW4tc2lkZS11dWlkIl19XTtmdW5jdGlvbiBwayhlLHQ9IiIsbj0iIil7bGV0IG89dHlwZW9mIG49PSJzdHJpbmciP24udHJpbSgpLnRvTG93ZXJDYXNlKCk6IiI7aWYoIVBBLmhhcyhvKXx8bz09PSJyZWxldmFuY2UiJiYhdClyZXR1cm4gZTtpZighWyJyZWxldmFuY2UiLCJ0aXRsZSJdLmluY2x1ZGVzKG8pKXtsZXQgYT1vPT09ImNyZWF0ZWQiPyJjcmVhdGVkIjpvPT09Im9wZW5lZCI/Im9wZW5lZCI6InVwZGF0ZWQiLGk9cz0+e2xldCBsPURhdGUucGFyc2Uocz8uW2FdfHwoYT09PSJvcGVuZWQiP3M/LnVwZGF0ZWR8fHM/LmNyZWF0ZWQ6IiIpfHwiIik7cmV0dXJuIE51bWJlci5pc05hTihsKT8wOmx9O3JldHVyblsuLi5lXS5zb3J0KChzLGwpPT57bGV0IGQ9aShsKS1pKHMpO3JldHVybiBkIT09MD9kOihzPy5uYW1lfHwiIikubG9jYWxlQ29tcGFyZShsPy5uYW1lfHwiIil9KX1sZXQgcj10LnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVyblsuLi5lXS5zb3J0KChhLGkpPT57bGV0IHM9YT8ubmFtZXx8IiIsbD1pPy5uYW1lfHwiIjtpZihvPT09InRpdGxlIilyZXR1cm4gcy5sb2NhbGVDb21wYXJlKGwpO2xldCBkPXU9PntsZXQgcD11LnRvTG93ZXJDYXNlKCk7cmV0dXJuIHA9PT1yPzM6cC5zdGFydHNXaXRoKHIpPzI6cC5pbmNsdWRlcyhyKT8xOjB9LGM9ZChsKS1kKHMpO3JldHVybiBjIT09MD9jOnMubG9jYWxlQ29tcGFyZShsKX0pfWFzeW5jIGZ1bmN0aW9uIGZrKGUpe3RyeXtyZXR1cm4gYXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kP25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoZSl9YCkpLmpzb24oKX1jYXRjaHtyZXR1cm4gbnVsbH19YXN5bmMgZnVuY3Rpb24gbWsoZSl7dHJ5e2xldCBuPWF3YWl0IGxtKCkuZ2V0Tm90ZUNvbnRlbnQoZSk7cmV0dXJuIGhrKG58fCIiKX1jYXRjaHtyZXR1cm5bXX19dmFyIHNpPW51bGw7ZnVuY3Rpb24gbG0oKXtpZihzaSlyZXR1cm4gc2k7bGV0IGU9dD0+e2xldCBuPS9eaHR0cHM6XC9cL3d3d1wuYW1wbGVub3RlXC5jb21cL25vdGVzKD86JHxbLz9dLiopLy50ZXN0KHQpO3JldHVybiBuP2NvbnNvbGUubG9nKCJbZGV2LWFwcF0gbmF2aWdhdGUiLHQpOmNvbnNvbGUud2FybigiW2Rldi1hcHBdIG5hdmlnYXRlIHJlamVjdGVkIGludmFsaWQgVVJMIix0KSxufTtyZXR1cm4gc2k9e3NldHRpbmdzOnt9LGFzeW5jIGluaXQoKXtsZXQgdD1hd2FpdCB5aygpO2lmKHRbZGtdfHwodFtka109InRydWUiKSx0eXBlb2YgdC5kYXNoYm9hcmRfZWxlbWVudHM9PSJzdHJpbmciKXRyeXt0LmRhc2hib2FyZF9lbGVtZW50cz1KU09OLnBhcnNlKHQuZGFzaGJvYXJkX2VsZW1lbnRzKX1jYXRjaHt0LmRhc2hib2FyZF9lbGVtZW50cz1udWxsfWxldCBuPVsidmljdG9yeS12YWx1ZSIsImNhbGVuZGFyIiwibW9vZCIsIm5vdGUtcGVlayIsInF1b3RlcyJdO2ZvcihsZXQgaCBvZiBuLm1hcChMQSkpaWYodHlwZW9mIHRbaF09PSJzdHJpbmciKXRyeXt0W2hdPUpTT04ucGFyc2UodFtoXSl9Y2F0Y2h7dFtoXT1udWxsfWxldCBvPW5ldyBEYXRlLHI9X0EobyksYT1hd2FpdCBpbSgpLGk9YXdhaXQgdWsoKSxzPU1hdGguY2VpbCgoby5nZXRNb250aCgpKzEpLzMpLGw9YFEke3N9ICR7by5nZXRGdWxsWWVhcigpfWAsZD1zPT09ND8xOnMrMSxjPXM9PT00P28uZ2V0RnVsbFllYXIoKSsxOm8uZ2V0RnVsbFllYXIoKSx1PWBRJHtkfSAke2N9YCxbcCxmXT1hd2FpdCBQcm9taXNlLmFsbChbZmsoYCR7bH0gUGxhbmApLGZrKGAke3V9IFBsYW5gKV0pLFttLGddPWF3YWl0IFByb21pc2UuYWxsKFtwPy51dWlkP21rKHAudXVpZCk6UHJvbWlzZS5yZXNvbHZlKFtdKSxmPy51dWlkP21rKGYudXVpZCk6UHJvbWlzZS5yZXNvbHZlKFtdKV0pLHc9Y2socyksdj1jayhkKSx5PXcuZXZlcnkoaD0+bS5zb21lKFM9PlMuaGVhZGluZz8udGV4dD8udHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1oLnRvTG93ZXJDYXNlKCkpKSxiPXYuZXZlcnkoaD0+Zy5zb21lKFM9PlMuaGVhZGluZz8udGV4dD8udHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1oLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gc2kuc2V0dGluZ3M9dCx7dGFza3M6YSx0b2RheVRhc2tzOlVBKGEsbyksY29tcGxldGVkVGhpc1dlZWs6Z2soYSxyKSx3ZWVrbHlWaWN0b3J5VmFsdWU6RkEoYSxyKSxkYWlseVZpY3RvcnlWYWx1ZXM6ekEoYSxyKSxtb29kUmF0aW5nczppLHF1YXJ0ZXJseVBsYW5zOntjdXJyZW50Ont5ZWFyOm8uZ2V0RnVsbFllYXIoKSxxdWFydGVyOnMsbGFiZWw6bCxub3RlVVVJRDpwPy51dWlkPz9udWxsLGhhc0FsbE1vbnRobHlEZXRhaWxzOnl9LG5leHQ6e3llYXI6YyxxdWFydGVyOmQsbGFiZWw6dSxub3RlVVVJRDpmPy51dWlkPz9udWxsLGhhc0FsbE1vbnRobHlEZXRhaWxzOmJ9fSxjdXJyZW50RGF0ZTpvLnRvSVNPU3RyaW5nKCksc2V0dGluZ3M6dCx0YXNrRG9tYWluczpbe25hbWU6IldvcmsiLHV1aWQ6ImRvbWFpbi13b3JrLXV1aWQifSx7bmFtZToiUGVyc29uYWwiLHV1aWQ6ImRvbWFpbi1wZXJzb25hbC11dWlkIn0se25hbWU6IlNpZGUgUHJvamVjdHMiLHV1aWQ6ImRvbWFpbi1zaWRlLXV1aWQifV0sYWN0aXZlVGFza0RvbWFpbjoiZG9tYWluLXdvcmstdXVpZCJ9fSxhc3luYyBjb25maWd1cmUoKXtyZXR1cm4gbnVsbH0sYXN5bmMgZ2V0TW9vZFJhdGluZ3ModCl7cmV0dXJuIHVrKHQpfSxhc3luYyBnZXRDb21wbGV0ZWRUYXNrcyh0LG4pe3JldHVybiBLQSh0LG4pfSxhc3luYyBnZXRFeHRlcm5hbENhbGVuZGFyRXZlbnRzKCl7bGV0IHQ9bmV3IERhdGUsbj10LmdldEZ1bGxZZWFyKCksbz10LmdldE1vbnRoKCkscj10LmdldERhdGUoKTtyZXR1cm5be2FsbERheTohMSxjYWxlbmRhcjp7dXVpZDoiY2FsLXBlcnNvbmFsLXV1aWQiLG5hbWU6IlBlcnNvbmFsIn0sY29sb3I6IiM0Mjg1ZjQiLGVuZDpuZXcgRGF0ZShuLG8sciwxNywwLDApLHN0YXJ0Om5ldyBEYXRlKG4sbyxyLDE2LDAsMCksdGl0bGU6IkJpcnRoZGF5IHBhcnR5In0se2FsbERheTohMSxjYWxlbmRhcjp7dXVpZDoiY2FsLXdvcmstdXVpZCIsbmFtZToiV29yayJ9LGNvbG9yOiIjMGI4MDQzIixlbmQ6bmV3IERhdGUobixvLHIrMiwxMiwyNSwwKSxzdGFydDpuZXcgRGF0ZShuLG8scisyLDExLDI1LDApLHRpdGxlOiJRdWFydGVybHkgUmV2aWV3IFN5bmMifV19LGFzeW5jIGdldFRhc2tEb21haW5zKCl7cmV0dXJuIEdBfSxhc3luYyBnZXRQZW9wbGUoKXtyZXR1cm4gSmJ9LGFzeW5jIGdldFRhc2tEb21haW5UYXNrcyh0KXtsZXQgbj10P2AvYXBpL3Rhc2tzP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX1gOiIvYXBpL3Rhc2tzIixvPWF3YWl0IGZldGNoKG4pO3JldHVybiBzbShhd2FpdCBvLmpzb24oKSl9LGFzeW5jIGdldE5vdGVUYXNrcyh0LG4pe2xldCBvPXR5cGVvZiB0PT0ic3RyaW5nIj90OnQ/LnV1aWQ7cmV0dXJuKGF3YWl0IGltKCkpLmZpbHRlcihhPT5hLm5vdGVVVUlEPT09byYmYS5jb21wbGV0ZWRBdD09bnVsbCYmYS5kaXNtaXNzZWRBdD09bnVsbCl9LGFzeW5jIGdldFRhc2sodCl7cmV0dXJuKGF3YWl0IGltKCkpLmZpbmQobz0+by51dWlkPT09dCl8fG51bGx9LG5hdmlnYXRlKHQpe3JldHVybiBlKHQpfSxhc3luYyBzZXRTZXR0aW5nKHQsbil7bGV0IG89bj09bnVsbD8iIjpTdHJpbmcobik7c2kuc2V0dGluZ3NbdF09byxhd2FpdCBIQSh0LG8pfSxhc3luYyByZWNvcmRNb29kUmF0aW5nKHQpe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dmFsdWU6dH0pfSkpLmpzb24oKSkudXVpZH1jYXRjaChuKXtyZXR1cm4gaygiW2Rldi1hcHBdIHJlY29yZE1vb2RSYXRpbmcgZmFpbGVkOiIsbiksbnVsbH19LGFzeW5jIHVwZGF0ZU1vb2RSYXRpbmcodCxuKXt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBBVENIIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3V1aWQ6dCx1cGRhdGVzOm59KX0pfWNhdGNoKG8pe2soIltkZXYtYXBwXSB1cGRhdGVNb29kUmF0aW5nIGZhaWxlZDoiLG8pfX0sYXN5bmMgZ2V0Tm90ZUNvbnRlbnQodCl7bGV0IG49cmModCksbz1YYihuKTtpZihvIT09bnVsbClyZXR1cm4gbzt0cnl7cmV0dXJuKGF3YWl0KGF3YWl0IGZldGNoKGAvYXBpL25vdGUtY29udGVudD91dWlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG4pfWApKS5qc29uKCkpLmNvbnRlbnQ/PyIifWNhdGNoe3JldHVybiIifX0sYXN5bmMgZ2V0Tm90ZVNlY3Rpb25zKHQpe2xldCBuPWF3YWl0IHRoaXMuZ2V0Tm90ZUNvbnRlbnQodCk7cmV0dXJuIGhrKG4pfSxodG1sRnJvbUNvbnRlbnQodCl7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiaHRtbEZyb21Db250ZW50IHJlcXVpcmVzIGEgU3RyaW5nIik7cmV0dXJuYDxkaXYgY2xhc3M9ImFtcGxlLWVkaXRvciI+JHtyayh0KX08L2Rpdj5gfSxhc3luYyBmaW5kTm90ZSh0PXt9KXtpZih0LnV1aWQpe2xldCBuPU9iamVjdC52YWx1ZXMocW8pLmZsYXQoKS5maW5kKG89Pm8udXVpZD09PXQudXVpZCk7aWYobilyZXR1cm4gbn10cnl7bGV0IG49dC51dWlkP2B1dWlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQudXVpZCl9YDpgbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0Lm5hbWUpfWAscj1hd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWZpbmQ/JHtufWApKS5qc29uKCk7cmV0dXJuIHI/LnV1aWQ/cjpudWxsfWNhdGNoe3JldHVybiBudWxsfX0sZmlsdGVyTm90ZXModD17fSxuPSIiKXtsZXQgbztpZih0LnRhc2tEb21haW5VVUlEKXtsZXQgcj0ocW9bdC50YXNrRG9tYWluVVVJRF18fFtdKS5maWx0ZXIoYT0+eGYoYSx0Lmdyb3VwKSk7bz1wayhyLHQucXVlcnksbil9ZWxzZXtsZXQgcj1PYmplY3QudmFsdWVzKHFvKS5mbGF0KCkuZmlsdGVyKGk9PnhmKGksdC5ncm91cCkpLGE9dC5xdWVyeT9yLmZpbHRlcihpPT4oaS5uYW1lfHwiIikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTpyO289cGsoYSx0LnF1ZXJ5fHxudWxsLG4pfXJldHVybiBRYihvKX0sYXN5bmMgdXBkYXRlVGFzayh0LG4pe3JldHVybiBrKCJbZGV2LWFwcF0gdXBkYXRlVGFzayIsdCxuKSwhMH0sYXN5bmMgY3JlYXRlTm90ZSh0LG49W10pe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbm90ZS1jcmVhdGUiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7bmFtZTp0LHRhZ3M6bn0pfSkpLmpzb24oKSkudXVpZH1jYXRjaHtyZXR1cm4gbnVsbH19LGFzeW5jIHJlcGxhY2VOb3RlQ29udGVudCh0LG4sbz17fSl7bGV0IHI9cmModCk7dHJ5e2xldCBhPXt1dWlkOnIsY29udGVudDpufTtyZXR1cm4gby5zZWN0aW9uJiYoYS5zZWN0aW9uPW8uc2VjdGlvbiksKGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL25vdGUtY29udGVudCIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KGEpfSkpLmpzb24oKSkub2t8fCExfWNhdGNoe3JldHVybiExfX0sYXN5bmMgaW5zZXJ0Tm90ZUNvbnRlbnQodCxuLG89e30pe2xldCByPXJjKHQpO3RyeXthd2FpdCBmZXRjaCgiL2FwaS9ub3RlLWFwcGVuZCIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHt1dWlkOnIsY29udGVudDpuLGF0RW5kOiEhby5hdEVuZH0pfSl9Y2F0Y2h7fX0sYXN5bmMgYXR0YWNoTm90ZU1lZGlhKHQsbil7aygiW2Rldi1hcHBdIGF0dGFjaE5vdGVNZWRpYSBjYWxsZWQsIGRhdGFVUkwgbGVuZ3RoOiIsbj8ubGVuZ3RofHwwKTt0cnl7bGV0IGE9KGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL2F0dGFjaC1tZWRpYSIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtkYXRhVVJMOm59KX0pKS5qc29uKCkpLnVybHx8bnVsbDtyZXR1cm4gaygiW2Rldi1hcHBdIGF0dGFjaE5vdGVNZWRpYSByZXNwb25zZToiLGE/YFVSTCByZWNlaXZlZDogJHthfWA6Im5vIFVSTCBpbiByZXNwb25zZSIpLGF9Y2F0Y2gobyl7cmV0dXJuIGsoIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgRkFJTEVEOiIsbyksbnVsbH19LGFzeW5jIHByb21wdCh0LG49e30pe3JldHVybiBCQSh0LG4pfX0sc2l9ZnVuY3Rpb24gZG0oKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1IilyZXR1cm4hMTtsZXQgZT1uYXZpZ2F0b3IudXNlckFnZW50fHwiIjtyZXR1cm4vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QoZSk/ITA6bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjEmJi9NYWNpbnRvc2gvLnRlc3QoZSl9ZnVuY3Rpb24gdmsoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1IilyZXR1cm4gbnVsbDtsZXQgZT1uYXZpZ2F0b3IuZGV2aWNlTWVtb3J5O3JldHVybiB0eXBlb2YgZT09Im51bWJlciImJmU+MD9lOm51bGx9ZnVuY3Rpb24gYmsoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1IilyZXR1cm4gbnVsbDtsZXQgZT1uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIiJiZlPjA/ZTpudWxsfWZ1bmN0aW9uIHdrKCl7aWYodHlwZW9mIHdpbmRvdz4idSIpcmV0dXJue2RldmljZVdpZHRoOm51bGwsaW5uZXJIZWlnaHQ6bnVsbCxpbm5lcldpZHRoOm51bGx9O2xldCBlPXR5cGVvZiBzY3JlZW48InUiP3NjcmVlbjpudWxsO3JldHVybntkZXZpY2VXaWR0aDplP01hdGgubWluKGUud2lkdGgsZS5oZWlnaHQpOm51bGwsaW5uZXJIZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0fHxudWxsLGlubmVyV2lkdGg6d2luZG93LmlubmVyV2lkdGh8fG51bGx9fWZ1bmN0aW9uIGtrKCl7bGV0IGU9dmsoKSx0PWJrKCksbj1kbSgpLHtkZXZpY2VXaWR0aDpvfT13aygpLHI9byE9bnVsbCYmbzw9NDMwO3JldHVybiBlIT1udWxsJiZlPD00fHx0IT1udWxsJiZ0PD00fHxuJiZyPyJsb3ciOiFuJiYoZT09bnVsbHx8ZT40KSYmKHQ9PW51bGx8fHQ+NCk/ImhpZ2giOiJtZWRpdW0ifWZ1bmN0aW9uIHhrKCl7cmV0dXJuIGRtKCl8fGtrKCk9PT0ibG93In1mdW5jdGlvbiBjbSgpe2xldHtkZXZpY2VXaWR0aDplLGlubmVySGVpZ2h0OnQsaW5uZXJXaWR0aDpufT13aygpO3JldHVybntjb3JlczpiaygpLGRldmljZVdpZHRoOmUsaW5uZXJIZWlnaHQ6dCxpbm5lcldpZHRoOm4sbWVtb3J5R2I6dmsoKSxtb2JpbGU6ZG0oKSx0aWVyOmtrKCl9fWZ1bmN0aW9uIFNrKCl7aWYodHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuO2xldCBlPWNtKCk7cmV0dXJuIHdpbmRvdy5fX2Rhc2hib2FyZFZpZXdwb3J0RGlhZz1lLGV9ZnVuY3Rpb24gTmsoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSJ8fCF3aW5kb3cuU2VudHJ5fHxBcnJheS5pc0FycmF5KHdpbmRvdy5fX2Rhc2hib2FyZFNlbnRyeVF1ZXVlKSYmd2luZG93Ll9fZGFzaGJvYXJkU2VudHJ5UmVhZHkhPT0hMD9udWxsOndpbmRvdy5TZW50cnl9ZnVuY3Rpb24gakEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9lOm5ldyBFcnJvcihlPy5tZXNzYWdlfHxTdHJpbmcoZSkpfWZ1bmN0aW9uIFlBKGUpe3R5cGVvZiB3aW5kb3c+InUifHwhQXJyYXkuaXNBcnJheSh3aW5kb3cuX19kYXNoYm9hcmRTZW50cnlRdWV1ZSl8fHdpbmRvdy5fX2Rhc2hib2FyZFNlbnRyeVF1ZXVlLmxlbmd0aDwyMCYmd2luZG93Ll9fZGFzaGJvYXJkU2VudHJ5UXVldWUucHVzaChlKX1mdW5jdGlvbiB1bShlKXtsZXQgdD1OaygpO2lmKCF0fHx0eXBlb2YgdC53aXRoU2NvcGUhPSJmdW5jdGlvbiIpcmV0dXJuIFlBKGUpO3RyeXtyZXR1cm4gdC53aXRoU2NvcGUobj0+e2ZvcihsZXRbbyxyXW9mIE9iamVjdC5lbnRyaWVzKGUudGFnc3x8e30pKXIhPW51bGwmJm4uc2V0VGFnKG8sU3RyaW5nKHIpKTtmb3IobGV0W28scl1vZiBPYmplY3QuZW50cmllcyhlLmV4dHJhc3x8e30pKXIhPW51bGwmJm4uc2V0RXh0cmEobyxyKTtyZXR1cm4gZS5sZXZlbCYmbi5zZXRMZXZlbChlLmxldmVsKSxlLmVycm9yP3QuY2FwdHVyZUV4Y2VwdGlvbihlLmVycm9yKTp0LmNhcHR1cmVNZXNzYWdlKFN0cmluZyhlLm1lc3NhZ2UpKX0pfWNhdGNoKG4pe2soIltzZW50cnldIGZhaWxlZCB0byBjYXB0dXJlIGRhc2hib2FyZCBldmVudDoiLG4pO3JldHVybn19ZnVuY3Rpb24gVGsoZSl7bGV0e2FjdGlvbjp0LHNvdXJjZTpuLHdpZGdldElkOm8sLi4ucn09ZTtyZXR1cm57ZXh0cmFzOnIsdGFnczp7ImRhc2hib2FyZC5hY3Rpb24iOnQsImRhc2hib2FyZC5zb3VyY2UiOm4sImRhc2hib2FyZC53aWRnZXRJZCI6b319fWZ1bmN0aW9uIFdzKGUsdD17fSl7bGV0e2V4dHJhczpuLHRhZ3M6b309VGsodCk7cmV0dXJuIHVtKHtlcnJvcjpqQShlKSxleHRyYXM6bix0YWdzOm99KX1mdW5jdGlvbiBwbShlLHQ9e30pe2xldHtsZXZlbDpuLC4uLm99PXQse2V4dHJhczpyLHRhZ3M6YX09VGsobyk7cmV0dXJuIHVtKHtleHRyYXM6cixsZXZlbDpufHwiZXJyb3IiLG1lc3NhZ2U6ZSx0YWdzOmF9KX1mdW5jdGlvbiBpYyhlLHQ9e30pe2xldCBuPWU/LmVycm9yfHxlPy5tZXNzYWdlfHxgJHt0LmFjdGlvbnx8InBsdWdpbiJ9IGZhaWxlZGAsbz1lPy5lcnJvclN0YWNrfHxlPy5zdGFjayxyPW5ldyBFcnJvcihTdHJpbmcobikpO3JldHVybiBvJiYoci5zdGFjaz1TdHJpbmcobykpLFdzKHIsdCl9ZnVuY3Rpb24gRGsoZSx0KXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpLnRoZW4obj0+e24mJnR5cGVvZiBuPT0ib2JqZWN0IiYmbi5lbWJlZENhbGxGYWlsZWQmJmljKG4se2FjdGlvbjplLHNvdXJjZToiYnJpZGdlLWNhbGwifSl9LG49PntXcyhuLHthY3Rpb246ZSxzb3VyY2U6ImJyaWRnZS1yZWplY3QifSl9KSx0fWZ1bmN0aW9uIEFrKCl7dHlwZW9mIHdpbmRvdz4idSJ8fCh3aW5kb3cuX19kYXNoYm9hcmREcmFpblNlbnRyeVF1ZXVlPUVrLHdpbmRvdy5fX2Rhc2hib2FyZFNlbnRyeVN0YXR1c0NoYW5nZWQ9ZT0+ayhDayhlKSksRWsoKSl9ZnVuY3Rpb24gQ2soZSl7aWYoIWUpcmV0dXJuIltzZW50cnldIGxvYWRlciBhYnNlbnQgXHUyMDE0IG5vIFNFTlRSWV9EU04gYXQgYnVpbGQgdGltZSwgc28gbm8gZXhjZXB0aW9ucyB3aWxsIGJlIHJlcG9ydGVkIjtsZXQgdD1lLmVsYXBzZWRNcz09bnVsbD8iIjpgIGFmdGVyICR7ZS5lbGFwc2VkTXN9bXNgLG49ZS5kZXRhaWw/YCAoJHtlLmRldGFpbH0pYDoiIjtyZXR1cm4gZS5zdGF0ZT09PSJyZWFkeSI/YFtzZW50cnldIFNESyBsb2FkZWQgYW5kIGluaXRpYWxpemVkJHt0fSwgZW52aXJvbm1lbnQgIiR7ZS5lbnZpcm9ubWVudH0iYDplLnN0YXRlPT09ImxvYWRpbmciP2Bbc2VudHJ5XSBTREsgc3RpbGwgbG9hZGluZyBmcm9tICR7ZS5jZG5Vcmx9LCBlbnZpcm9ubWVudCAiJHtlLmVudmlyb25tZW50fSJgOmBbc2VudHJ5XSBTREsgdW5hdmFpbGFibGUgXHUyMDE0ICR7ZS5zdGF0ZX0ke259JHt0fTsgZXhjZXB0aW9ucyB3aWxsIG5vdCBiZSByZXBvcnRlZGB9ZnVuY3Rpb24gTWsoKXt0eXBlb2Ygd2luZG93PiJ1Inx8ayhDayh3aW5kb3cuX19kYXNoYm9hcmRTZW50cnlTdGF0dXMpKX1mdW5jdGlvbiBFaygpe2lmKHR5cGVvZiB3aW5kb3c+InUifHwhQXJyYXkuaXNBcnJheSh3aW5kb3cuX19kYXNoYm9hcmRTZW50cnlRdWV1ZSl8fCFOaygpKXJldHVybjtsZXQgZT13aW5kb3cuX19kYXNoYm9hcmRTZW50cnlRdWV1ZTt3aW5kb3cuX19kYXNoYm9hcmRTZW50cnlRdWV1ZT1udWxsO2ZvcihsZXQgdCBvZiBlKXVtKHQpfXZhciB2ZT1MKG1lKCksMSk7dmFyIEJuPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxxQT1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGZtPWNsYXNze2NvbnN0cnVjdG9yKHtpbmRleDp0LHNob3J0Om4sZnVsbDpvLHBsYW46cixjdXJyZW50OmF9KXt0aGlzLmluZGV4PXQsdGhpcy5zaG9ydD1uLHRoaXMuZnVsbD1vLHRoaXMucGxhbj1yLHRoaXMuY3VycmVudD1hfX07ZnVuY3Rpb24gTXIoKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RnVsbFllYXIoKSxuPWUuZ2V0TW9udGgoKSxvPU1hdGguZmxvb3Iobi8zKSsxO3JldHVybnt5ZWFyOnQscXVhcnRlcjpvLGxhYmVsOmBRJHtvfSAke3R9YH19ZnVuY3Rpb24gT2soKXtsZXR7eWVhcjplLHF1YXJ0ZXI6dH09TXIoKTtyZXR1cm4gdCsrLHQ+NCYmKHQ9MSxlKyspLHt5ZWFyOmUscXVhcnRlcjp0LGxhYmVsOmBRJHt0fSAke2V9YH19ZnVuY3Rpb24gSWsoZSx0KXtsZXQgbj0oZS5xdWFydGVyLTEpKjMsbz1uZXcgRGF0ZSgpLmdldE1vbnRoKCkscj1bXTtmb3IobGV0IGE9MDthPDY7YSsrKXtsZXQgaT0obithKSUxMjtyLnB1c2gobmV3IGZtKHtpbmRleDppLHNob3J0OnFBW2ldLGZ1bGw6Qm5baV0scGxhbjphPDM/ZTp0LGN1cnJlbnQ6aT09PW99KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gc2MoKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RGF5KCksbjtyZXR1cm4gdD09PTY/bj0yOnQ9PT0wP249MTpuPTEtdCxuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpK24pfWZ1bmN0aW9uIGxjKGUpe3JldHVybmBXZWVrIG9mICR7Qm5bZS5nZXRNb250aCgpXX0gJHtlLmdldERhdGUoKX1gfWZ1bmN0aW9uIGxpKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpLG89bmV3IFJlZ0V4cChgKF58XFxuKSgjezEsNn0pXFxzKyR7bn1cXHMqXFxuYCwiaSIpLHI9ZS5tYXRjaChvKTtpZighcilyZXR1cm4gbnVsbDtsZXQgYT1yLmluZGV4K3JbMF0ubGVuZ3RoLGk9ZS5zdWJzdHJpbmcoYSkscz1pLm1hdGNoKC9cbiN7MSw2fVxzLyksbD1zP2kuc3Vic3RyaW5nKDAscy5pbmRleCk6aTtyZXR1cm4gJEEobCl9ZnVuY3Rpb24gJEEoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFxzKlxcXHMqKSskL2csIiIpLnRyaW0oKX1mdW5jdGlvbiBtbShlKXtyZXR1cm5gCiMjIyAke2V9Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CmB9ZnVuY3Rpb24gaG0oZSl7cmV0dXJuYAojIyMgJHtlfQotIFByaW1hcnkgZm9jdXM6Ci0gS2V5IHRhc2tzOgotIENvbW1pdG1lbnRzOgpgfXZhciBIbj1MKG1lKCksMSk7dmFyIFVrPUwoWCgpLDEpLF9rPXt0aGVtZToiZGFzaGJvYXJkIixkdXJhdGlvbjpbMTIwLDgwXSxhcnJvdzohMCxvZmZzZXQ6WzAsOF19O2Z1bmN0aW9uIEJzKHtjb250ZW50OmUscGxhY2VtZW50OnQsaW50ZXJhY3RpdmU6bixjaGlsZHJlbjpvLC4uLnJ9KXtsZXQgYT0oMCxIbi51c2VSZWYpKG51bGwpLGk9KDAsSG4udXNlUmVmKShudWxsKTtyZXR1cm4oMCxIbi51c2VFZmZlY3QpKCgpPT57aWYoYS5jdXJyZW50KXJldHVybiBpLmN1cnJlbnQ9Q3MoYS5jdXJyZW50LHsuLi5fayxjb250ZW50OmV8fCIiLHBsYWNlbWVudDp0fHwidG9wIixpbnRlcmFjdGl2ZTpufHwhMSxhbGxvd0hUTUw6ITAsLi4ucn0pLCgpPT57aS5jdXJyZW50Py5kZXN0cm95KCksaS5jdXJyZW50PW51bGx9fSxbXSksKDAsSG4udXNlRWZmZWN0KSgoKT0+e2kuY3VycmVudCYmZSE9bnVsbCYmaS5jdXJyZW50LnNldENvbnRlbnQoZSl9LFtlXSksKDAsVWsuanN4KSgic3BhbiIse3JlZjphLHN0eWxlOntkaXNwbGF5OiJpbmxpbmUifSxjaGlsZHJlbjpvfSl9ZnVuY3Rpb24gSHMoZT17fSl7bGV0IHQ9KDAsSG4udXNlUmVmKShudWxsKSxuPSgwLEhuLnVzZVJlZikoe3dpZHRoOjAsaGVpZ2h0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9KSxvPSgwLEhuLnVzZVJlZikobnVsbCkscj0oMCxIbi51c2VSZWYpKGUuaGlkZURlbGF5fHwzMDApLGE9KDAsSG4udXNlUmVmKShudWxsKTtmdW5jdGlvbiBpKCl7by5jdXJyZW50JiYoY2xlYXJUaW1lb3V0KG8uY3VycmVudCksby5jdXJyZW50PW51bGwpfWZ1bmN0aW9uIHMoYyx1KXtpKCksdSE9PXZvaWQgMCYmKGEuY3VycmVudD11KSxvLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e28uY3VycmVudD1udWxsLHQuY3VycmVudD8uaGlkZSgpLGEuY3VycmVudCYmYS5jdXJyZW50KCl9LGM/P3IuY3VycmVudCl9KDAsSG4udXNlRWZmZWN0KSgoKT0+e3QuY3VycmVudD1Dcyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx7Li4uX2ssZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDooKT0+bi5jdXJyZW50LHRyaWdnZXI6Im1hbnVhbCIsaGlkZU9uQ2xpY2s6ITEsYWxsb3dIVE1MOiEwLGludGVyYWN0aXZlOiEhZS5pbnRlcmFjdGl2ZSxwbGFjZW1lbnQ6ZS5wbGFjZW1lbnR8fCJ0b3AiLGFwcGVuZFRvOigpPT5kb2N1bWVudC5ib2R5LC4uLmV9KTtsZXQgYyx1O2lmKGUuaW50ZXJhY3RpdmUpe2xldCBwPXQuY3VycmVudC5wb3BwZXI7Yz0oKT0+aSgpLHU9KCk9PnMoKSxwLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGMpLHAuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdSl9cmV0dXJuKCk9PntpZihlLmludGVyYWN0aXZlJiZ0LmN1cnJlbnQpe2xldCBwPXQuY3VycmVudC5wb3BwZXI7YyYmcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixjKSx1JiZwLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHUpfWkoKSx0LmN1cnJlbnQ/LmRlc3Ryb3koKSx0LmN1cnJlbnQ9bnVsbH19LFtdKTtmdW5jdGlvbiBsKGMsdSxwLGYpe2koKTtsZXQgbT10LmN1cnJlbnQ7aWYoIW0pcmV0dXJuO24uY3VycmVudD17d2lkdGg6MCxoZWlnaHQ6MCx0b3A6cCxyaWdodDp1LGJvdHRvbTpwLGxlZnQ6dX0sbS5zZXRDb250ZW50KGMpO2xldCBnPWZ8fHt9LHc9Zy5wbGFjZW1lbnR8fG0ucHJvcHMucGxhY2VtZW50O3chPT1tLnByb3BzLnBsYWNlbWVudCYmbS5zZXRQcm9wcyh7cGxhY2VtZW50Ond9KTtsZXQgdj1tLnBvcHBlci5maXJzdEVsZW1lbnRDaGlsZDt2JiZ2LmNsYXNzTGlzdC50b2dnbGUoImJlbG93LWNoYXJ0IiwhIWcuYmVsb3dDaGFydCksbS5zdGF0ZS5pc1Zpc2libGU/bS5wb3BwZXJJbnN0YW5jZT8udXBkYXRlKCk6bS5zaG93KCl9ZnVuY3Rpb24gZCgpe2koKSx0LmN1cnJlbnQ/LmhpZGUoKX1yZXR1cm57c2hvdzpsLGhpZGU6ZCxzY2hlZHVsZUhpZGU6cyxjYW5jZWxTY2hlZHVsZWRIaWRlOml9fXZhciBEdD1MKG1lKCkpO2Z1bmN0aW9uIEJlKGUsdD17fSl7aWYoISh0eXBlb2Ygd2luZG93PiJ1Inx8dHlwZW9mIHdpbmRvdy5wbGF1c2libGUhPSJmdW5jdGlvbiIpKXRyeXt3aW5kb3cucGxhdXNpYmxlKCJEYXNoYm9hcmQgQWN0aW9uIix7cHJvcHM6e2FjdGlvbjplLC4uLnR9fSl9Y2F0Y2gobil7ayhgW1BsYXVzaWJsZV0gRmFpbGVkIHRvIGNhcHR1cmUgZGFzaGJvYXJkIGFjdGlvbiAiJHtlfSI6YCxuKX19dmFyIGNhPSgwLER0LmNyZWF0ZUNvbnRleHQpKG51bGwpLGNjPSJkYXNoYm9hcmQ6d2lkZ2V0LWxvYWRlZCI7ZnVuY3Rpb24gbkMoZSx0PSJsb2FkZWQiKXt0eXBlb2Ygd2luZG93PiJ1Inx8IWV8fHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChjYyx7ZGV0YWlsOntvdXRjb21lOnQsd2lkZ2V0SWQ6ZX19KSl9ZnVuY3Rpb24gdWMoZSx0PXt9KXtsZXQgbj1lLmpvaW4oInwiKSxvPSgwLER0LnVzZVJlZikoe2RlZmVycmVkOm5ldyBTZXQsZXJyb3JlZDpuZXcgU2V0LGV4cGVjdGVkOltdLGZpcmVkOiExLGtleTpudWxsLGxvYWRlZDpuZXcgU2V0fSk7by5jdXJyZW50LmtleSE9PW4mJihvLmN1cnJlbnQ9e2RlZmVycmVkOm5ldyBTZXQsZXJyb3JlZDpuZXcgU2V0LGV4cGVjdGVkOmUuc2xpY2UoKSxmaXJlZDohMSxrZXk6bixsb2FkZWQ6bmV3IFNldH0pO2xldCByPSgwLER0LnVzZVJlZikodC5vblNldHRsZSk7ci5jdXJyZW50PXQub25TZXR0bGU7bGV0IGE9KDAsRHQudXNlQ2FsbGJhY2spKCgpPT57bGV0IGk9by5jdXJyZW50O2lmKGkuZmlyZWR8fGkuZXhwZWN0ZWQubGVuZ3RoPT09MClyZXR1cm47Zm9yKGxldCBsIG9mIGkuZXhwZWN0ZWQpaWYoIWkubG9hZGVkLmhhcyhsKSYmIWkuZXJyb3JlZC5oYXMobCkmJiFpLmRlZmVycmVkLmhhcyhsKSlyZXR1cm47aS5maXJlZD0hMDtsZXQgcz1pLmV4cGVjdGVkLmZpbHRlcihsPT4haS5sb2FkZWQuaGFzKGwpJiYhaS5lcnJvcmVkLmhhcyhsKSkubGVuZ3RoO2kuZXJyb3JlZC5zaXplPjA/KGsoYFtkYXNoYm9hcmRdICR7aS5lcnJvcmVkLnNpemV9LyR7aS5leHBlY3RlZC5sZW5ndGh9IGNvbXBvbmVudHMgZmFpbGVkIHRvIGxvYWQ6YCxbLi4uaS5lcnJvcmVkXSksQmUoImRhc2hib2FyZExvYWRFcnJvciIse2RlZmVycmVkQ291bnQ6cyxlcnJvckNvdW50OmkuZXJyb3JlZC5zaXplLHdpZGdldENvdW50OmkuZXhwZWN0ZWQubGVuZ3RofSkpOihrKGBbZGFzaGJvYXJkXSBhbGwgJHtpLmV4cGVjdGVkLmxlbmd0aH0gY29tcG9uZW50cyBzZXR0bGVkIHN1Y2Nlc3NmdWxseSAoJHtzfSBkZWZlcnJlZCB1bnRpbCBzY3JvbGxlZCBpbnRvIHZpZXcpYCksQmUoImRhc2hib2FyZExvYWRTdWNjZXNzIix7ZGVmZXJyZWRDb3VudDpzLHdpZGdldENvdW50OmkuZXhwZWN0ZWQubGVuZ3RofSkpLHIuY3VycmVudD8uKHtkZWZlcnJlZENvdW50OnMsZXJyb3JDb3VudDppLmVycm9yZWQuc2l6ZSxlcnJvcmVkSWRzOlsuLi5pLmVycm9yZWRdLGV4cGVjdGVkQ291bnQ6aS5leHBlY3RlZC5sZW5ndGh9KX0sW10pO3JldHVybigwLER0LnVzZU1lbW8pKCgpPT4oe3JlcG9ydERlZmVycmVkOmk9PntvLmN1cnJlbnQuZGVmZXJyZWQuYWRkKGkpLGEoKX0scmVwb3J0RXJyb3I6aT0+e28uY3VycmVudC5lcnJvcmVkLmFkZChpKSxhKCl9LHJlcG9ydExvYWRlZDppPT57by5jdXJyZW50LmxvYWRlZC5hZGQoaSksYSgpfX0pLFthXSl9ZnVuY3Rpb24gRmsoZSl7bGV0IHQ9KDAsRHQudXNlQ29udGV4dCkoY2EpLG49KDAsRHQudXNlUmVmKSghMSk7KDAsRHQudXNlRWZmZWN0KSgoKT0+e24uY3VycmVudHx8KG4uY3VycmVudD0hMCx0Py5yZXBvcnRMb2FkZWQoZSkpfSxbXSl9ZnVuY3Rpb24gdXQoZSx0LG49ITEpe2xldCBvPSgwLER0LnVzZVJlZikoITEpOygwLER0LnVzZUVmZmVjdCkoKCk9PntvLmN1cnJlbnR8fCF0JiYhbnx8KG8uY3VycmVudD0hMCxuQyhlLG4/ImVycm9yIjoibG9hZGVkIikpfSxbbix0LGVdKX1mdW5jdGlvbiB6ayhlKXtsZXQgdD0oMCxEdC51c2VDb250ZXh0KShjYSksbj0oMCxEdC51c2VSZWYpKCExKTsoMCxEdC51c2VFZmZlY3QpKCgpPT57bi5jdXJyZW50fHwobi5jdXJyZW50PSEwLHQ/LnJlcG9ydERlZmVycmVkKGUpKX0sW10pfXZhciBLcz17c2V0dGluZ3M6e30sY29udGV4dDp7fX07ZnVuY3Rpb24gV2soZSl7ZS5zZXR0aW5ncyYmKEtzLnNldHRpbmdzPWUuc2V0dGluZ3MpLGUuY29udGV4dCYmKEtzLmNvbnRleHQ9ZS5jb250ZXh0KX1mdW5jdGlvbiBfZSgpe3JldHVybiBLcy5zZXR0aW5nc31mdW5jdGlvbiBHcygpe3JldHVybiBLcy5jb250ZXh0fWZ1bmN0aW9uIHVvKGUsdCl7S3Muc2V0dGluZ3NbZV09dH12YXIgb0M9MjUwO2Z1bmN0aW9uIEtuKGUsdCx7aW5jbHVkZURvbmU6bj0hMSxtYXhOb3RlczpvPW9DfT17fSl7cmV0dXJuIHQ/ZS5nZXRUYXNrRG9tYWluVGFza3ModCk6ckMoZSxuLG8pfWFzeW5jIGZ1bmN0aW9uIHJDKGUsdCxuKXtsZXQgbz1uZXcgU2V0LHI9W107Zm9yIGF3YWl0KGxldCBzIG9mIGF3YWl0IGUuZmlsdGVyTm90ZXMoe2dyb3VwOiJ0YXNrTGlzdHMifSwiY2hhbmdlZCIpKWlmKCEoIXM/LnV1aWR8fG8uaGFzKHMudXVpZCkpJiYoby5hZGQocy51dWlkKSxyLnB1c2gocyksci5sZW5ndGg+PW4pKWJyZWFrO2soYFthbGwtbm90ZXMtdGFza3NdIE5vIHRhc2sgZG9tYWluIFx1MjAxNCBzY2FubmluZyAke3IubGVuZ3RofSB0YXNrLWxpc3Qgbm90ZXMgZm9yIHRhc2tzYCk7bGV0IGE9YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHIubWFwKHM9PmUuZ2V0Tm90ZVRhc2tzKHt1dWlkOnMudXVpZH0se2luY2x1ZGVEb25lOnR9KSkpLGk9W107Zm9yKGxldCBzPTA7czxhLmxlbmd0aDtzKz0xKXtsZXQgbD1hW3NdLGQ9cltzXTtpZighbHx8bC5zdGF0dXM9PT0icmVqZWN0ZWQiKXtrKCJbYWxsLW5vdGVzLXRhc2tzXSBnZXROb3RlVGFza3MgZmFpbGVkOiIsbD8ucmVhc29uKTtjb250aW51ZX1sZXQgYz1BcnJheS5pc0FycmF5KGwudmFsdWUpP2wudmFsdWU6W107Zm9yKGxldCB1IG9mIGMpdT8udXVpZCYmaS5wdXNoKHsuLi51LG5vdGVOYW1lOnUubm90ZU5hbWV8fHUubm90ZVRpdGxlfHx1Lm5vdGU/Lm5hbWV8fGQubmFtZXx8bnVsbCxub3RlVVVJRDp1Lm5vdGVVVUlEfHxkLnV1aWR9KX1yZXR1cm4gayhgW2FsbC1ub3Rlcy10YXNrc10gR2F0aGVyZWQgJHtpLmxlbmd0aH0gdGFza3MgYWNyb3NzIGFsbCBub3RlcyAobm8gdGFzayBkb21haW4pYCksaX1mdW5jdGlvbiBJZShlLHt0aHJvd09uSW52YWxpZDp0PSEwfT17fSl7bGV0IG49KCk9PntpZighdClyZXR1cm4gbnVsbDt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGRhdGUgaW5wdXQ6ICR7U3RyaW5nKGUpfWApfTtpZihlPT1udWxsfHxlPT09IiIpcmV0dXJuIG4oKTtpZihlIGluc3RhbmNlb2YgRGF0ZSl7bGV0IHI9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTihyLmdldFRpbWUoKSk/bigpOnJ9aWYodHlwZW9mIGU9PSJudW1iZXIiKXtpZighTnVtYmVyLmlzRmluaXRlKGUpKXJldHVybiBuKCk7bGV0IHI9TWF0aC5hYnMoZSk8MWUxMD9lKjFlMzplLGE9bmV3IERhdGUocik7cmV0dXJuIE51bWJlci5pc05hTihhLmdldFRpbWUoKSk/bigpOmF9aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgcj1lLnRyaW0oKTtpZighcilyZXR1cm4gbigpO2lmKC9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGUpKXtsZXRbcyxsLGRdPWUuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKTtyZXR1cm4gbmV3IERhdGUocyxsLTEsZCl9bGV0IGE9TnVtYmVyKHIpO2lmKCFOdW1iZXIuaXNOYU4oYSkpcmV0dXJuIEllKGEse3Rocm93T25JbnZhbGlkOnR9KTtsZXQgaT1uZXcgRGF0ZShyKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGkuZ2V0VGltZSgpKT9uKCk6aX1sZXQgbz1uZXcgRGF0ZShlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKG8uZ2V0VGltZSgpKT9uKCk6b31mdW5jdGlvbiBlcihlKXtsZXQgdD1JZShlKTtyZXR1cm4gbmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSwwLDAsMCwwKX1mdW5jdGlvbiBHbihlKXtsZXQgdD1JZShlKSxuPXQuZ2V0RnVsbFllYXIoKSxvPVN0cmluZyh0LmdldE1vbnRoKCkrMSkucGFkU3RhcnQoMiwiMCIpLHI9U3RyaW5nKHQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCR7bn0tJHtvfS0ke3J9YH1mdW5jdGlvbiBhZShlKXtyZXR1cm4gR24oZSl9ZnVuY3Rpb24gcGMoZSl7bGV0IHQ9SWUoZSk7cmV0dXJuYCR7dC5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyh0LmdldE1vbnRoKCkrMSkucGFkU3RhcnQoMiwiMCIpfWB9ZnVuY3Rpb24gZ20oZSl7bGV0W3Qsbl09U3RyaW5nKGUpLnNwbGl0KCItIikubWFwKE51bWJlcik7cmV0dXJuIG5ldyBEYXRlKHQsbi0xLDEsMCwwLDAsMCl9ZnVuY3Rpb24gQmsoZSx0PTApe2xldCBuPUllKGUpO3JldHVybiBuZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpK3QsMSwwLDAsMCwwKX1mdW5jdGlvbiBtbihlLHQ9MSl7bGV0IG49SWUoZSkscj0obi5nZXREYXkoKS10KzcpJTcsYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLXIpO3JldHVybiBhLnNldEhvdXJzKDAsMCwwLDApLGF9ZnVuY3Rpb24gSGsoZSx0PTEpe2xldCBuPW1uKGUsdCksbz1uZXcgRGF0ZShuKTtyZXR1cm4gby5zZXREYXRlKG8uZ2V0RGF0ZSgpKzYpLG8uc2V0SG91cnMoMjMsNTksNTksOTk5KSxvfWZ1bmN0aW9uIEtrKGUsdD0xKXtsZXQgbj1tbihlLHQpLG89W107Zm9yKGxldCByPTA7cjw3O3IrKyl7bGV0IGE9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKStyKSxpPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkrcisxKTtvLnB1c2goe2Zyb206TWF0aC5mbG9vcihhLmdldFRpbWUoKS8xZTMpLHRvOk1hdGguZmxvb3IoaS5nZXRUaW1lKCkvMWUzKSxkYXRlS2V5OmFlKGEpfSl9cmV0dXJue2JvdW5kYXJpZXM6byx3ZWVrU3RhcnRLZXk6YWUobil9fWZ1bmN0aW9uIEdrKGUsdD0xKXtsZXQgbj1tbihlLHQpO3JldHVybiBBcnJheS5mcm9tKHtsZW5ndGg6N30sKG8scik9PntsZXQgYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpK3IpO3JldHVybntkYXk6YS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHt3ZWVrZGF5OiJzaG9ydCJ9KSxkYXRlOmEudG9JU09TdHJpbmcoKSxkYXRlS2V5OmFlKGEpfX0pfWZ1bmN0aW9uIGZjKGUpe3JldHVybiBlPT09InN1bmRheSI/MDoxfWZ1bmN0aW9uIGRpKGUsdCl7cmV0dXJuIHQ9PT0iMjRoIj9gJHtTdHJpbmcoZSkucGFkU3RhcnQoMiwiMCIpfTowMGA6ZT09PTA/IjEyYW0iOmU8MTI/YCR7ZX1hbWA6ZT09PTEyPyIxMnBtIjpgJHtlLTEyfXBtYH1mdW5jdGlvbiBWayhlLHQpe2xldCBuPU1hdGguZmxvb3IoZS82MCksbz1lJTYwO2lmKHQ9PT0iMjRoIilyZXR1cm5gJHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfToke1N0cmluZyhvKS5wYWRTdGFydCgyLCIwIil9YDtsZXQgcj1uPj0xMj8iUE0iOiJBTSI7cmV0dXJuYCR7bj09PTA/MTI6bj4xMj9uLTEyOm59OiR7U3RyaW5nKG8pLnBhZFN0YXJ0KDIsIjAiKX0gJHtyfWB9ZnVuY3Rpb24gamsoZSl7cmV0dXJuIEllKGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KX1hc3luYyBmdW5jdGlvbiB1YShlKXtsZXQgdD1hd2FpdCBlO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ7aWYodCYmdHlwZW9mIHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPT0iZnVuY3Rpb24iKXtsZXQgbj1bXTtmb3IgYXdhaXQobGV0IG8gb2YgdCluLnB1c2gobyk7cmV0dXJuIG59cmV0dXJuW119ZnVuY3Rpb24gWWsoZSl7cmV0dXJuYCR7ZX0gUGxhbmB9ZnVuY3Rpb24gdHIoZSx0KXtsZXQgbj10eXBlb2YgZT09InN0cmluZyI/ZS50cmltKCk6IiI7cmV0dXJuIG4/YCR7dH0gJHtufSBQbGFuYDpZayh0KX1hc3luYyBmdW5jdGlvbiBUbyhlLHQsbixvKXtsZXQgcj10cihuLG8pLGk9KGF3YWl0IHVhKGUuZmlsdGVyTm90ZXMoe3F1ZXJ5OnJ9KSkpLmZpbmQoYz0+Yy5uYW1lPT09cik7aWYoaSlyZXR1cm4gaTtsZXQgcz1ZayhvKTtpZihyPT09cylyZXR1cm4oYXdhaXQgdWEoZS5maWx0ZXJOb3Rlcyh7cXVlcnk6c30pKSkuZmluZCh1PT51Lm5hbWU9PT1zKXx8bnVsbDtpZighdHx8IW4pcmV0dXJuIG51bGw7bGV0IGQ9KGF3YWl0IHVhKGUuZmlsdGVyTm90ZXMoe3F1ZXJ5OnN9KSkpLmZpbmQoYz0+Yy5uYW1lPT09cyk7aWYoIWQ/LnV1aWQpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBhd2FpdCBlLnNldE5vdGVOYW1lKGQscik9PT0hMT8oayhgW3F1YXJ0ZXJseS1wbGFuLW5vdGVzXSBzZXROb3RlTmFtZSByZWZ1c2VkIHJlbmFtZSBvZiAiJHtzfSIgXHUyMTkyICIke3J9ImApLGQpOihrKGBbcXVhcnRlcmx5LXBsYW4tbm90ZXNdIE1pZ3JhdGVkIGxlZ2FjeSBwbGFuICIke3N9IiBcdTIxOTIgIiR7cn0iYCksey4uLmQsbmFtZTpyfSl9Y2F0Y2goYyl7cmV0dXJuIGsoYFtxdWFydGVybHktcGxhbi1ub3Rlc10gRmFpbGVkIHRvIHJlbmFtZSBsZWdhY3kgcGxhbiAiJHtzfSJgLGM/Lm1lc3NhZ2V8fGMpLGR9fWFzeW5jIGZ1bmN0aW9uIHBvKGUpe2xldCB0PV9lKClbQi5UQVNLX0RPTUFJTlNdLG49e307dHJ5e249dD9KU09OLnBhcnNlKHQpOnt9fWNhdGNoe249e319bGV0IG89QXJyYXkuaXNBcnJheShuLmRvbWFpbnMpP24uZG9tYWlucy5maWx0ZXIocz0+cz8udXVpZCk6W10scj1uLnNlbGVjdGVkRG9tYWluVXVpZHx8bnVsbDtpZighcnx8by5sZW5ndGg9PT0wKXtsZXQgcz1udWxsO3R5cGVvZiBlLmdldFRhc2tEb21haW5zPT0iZnVuY3Rpb24iJiYocz1hd2FpdCBlLmdldFRhc2tEb21haW5zKCkuY2F0Y2goKCk9Pm51bGwpKSxBcnJheS5pc0FycmF5KHMpJiZzLmxlbmd0aD4wJiYobz1zLmZpbHRlcihsPT5sPy51dWlkKS5tYXAobD0+KHtuYW1lOmwubmFtZSx1dWlkOmwudXVpZH0pKSxyfHwocj15bShvKSkpfWxldCBhPW8uZmluZChzPT5zLnV1aWQ9PT1yKXx8bnVsbCxpPXZtKG8pO3JldHVybntkb21haW5OYW1lOmE/Lm5hbWV8fG51bGwsZG9tYWluVXVpZDpyfHxudWxsLGRvbWFpbnM6byxtaWdyYXRpb25Eb21haW5OYW1lOml9fWZ1bmN0aW9uIHltKGUpe2lmKCFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTApcmV0dXJuIG51bGw7bGV0IHQ9ZS5maW5kKG49Pm4ubmFtZT09PSJXb3JrIik7cmV0dXJuIHQ/dC51dWlkOmVbMF0udXVpZH1hc3luYyBmdW5jdGlvbiBxayhlLHQpe2lmKCF0fHx0eXBlb2YgZS5nZXRUYXNrRG9tYWluVGFza3MhPSJmdW5jdGlvbiIpcmV0dXJuIG51bGw7bGV0IG49YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3ModCkuY2F0Y2goKCk9Pm51bGwpO3JldHVybiBBcnJheS5pc0FycmF5KG4pP25ldyBTZXQobi5tYXAobz0+bz8udXVpZCkuZmlsdGVyKEJvb2xlYW4pKTpudWxsfWZ1bmN0aW9uIHZtKGUpe3JldHVybiFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTA/bnVsbDooZS5maW5kKG49Pm4ubmFtZT09PSJXb3JrIil8fGVbMF0pPy5uYW1lfHxudWxsfWFzeW5jIGZ1bmN0aW9uIEprKGUsdCl7bGV0IG49bmV3IERhdGUsbz1tbihuKSxyPUhrKG4pLGE9X2UoKVtCLlRBU0tfRE9NQUlOU10saT17fTt0cnl7aT1hP0pTT04ucGFyc2UoYSk6e319Y2F0Y2h7aT17fX1pLnNlbGVjdGVkRG9tYWluVXVpZD10LGF3YWl0IGUuc2V0U2V0dGluZyhCLlRBU0tfRE9NQUlOUyxKU09OLnN0cmluZ2lmeShpKSksdW8oQi5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkoaSkpO2xldCBzPWF3YWl0IGlDKGUsdCksbD1hd2FpdCBjQyhlLHtkb21haW5zOmkuZG9tYWluc3x8W10sc2VsZWN0ZWREb21haW5VdWlkOnR9KTtyZXR1cm57YWN0aXZlVGFza0RvbWFpbjp0LGNvbXBsZXRlZFRoaXNXZWVrOm8wKHMsbyxyKSxkYWlseVZpY3RvcnlWYWx1ZXM6ZEMocyxvKSxxdWFydGVybHlQbGFuczpsLHRhc2tzOnMsdG9kYXlUYXNrczpzQyhzLG4pLHdlZWtseVZpY3RvcnlWYWx1ZTpsQyhzLG8scil9fWZ1bmN0aW9uIGFDKGUsdCl7bGV0IG49QXJyYXkuaXNBcnJheSh0KSxvPW4/dC5sZW5ndGg6MCxyPXQ9PT1udWxsPyJudWxsIjpBcnJheS5pc0FycmF5KHQpPyJhcnJheSI6dHlwZW9mIHQsYT10JiZ0eXBlb2YgdD09Im9iamVjdCImJiFuP09iamVjdC5rZXlzKHQpOm51bGwsaTt0cnl7aT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaHtpPVN0cmluZyh0KX1rKGAke2V9IGdldFRhc2tEb21haW5zKCkgcmV0dXJuZWQgJHtvfSBkb21haW5zICh0eXBlPSR7cn0ke2E/YCwga2V5cz1bJHthLmpvaW4oIiwiKX1dYDoiIn0pYCx7cmF3OnQsc2VyaWFsaXplZDppfSl9YXN5bmMgZnVuY3Rpb24gUWsoZSl7aygiW3JlZnJlc2hUYXNrRG9tYWluc10gU3RhcnRpbmcgZG9tYWluIHJlZnJlc2giKTtsZXQgdD1fZSgpW0IuVEFTS19ET01BSU5TXTtrKGBbcmVmcmVzaFRhc2tEb21haW5zXSBTdG9yZWQgJHtCLlRBU0tfRE9NQUlOU30gc2V0dGluZ2AsdCk7bGV0IG49e307dHJ5e249dD9KU09OLnBhcnNlKHQpOnt9fWNhdGNoKGEpe2soIltyZWZyZXNoVGFza0RvbWFpbnNdIEZhaWxlZCB0byBwYXJzZSBzdG9yZWQgdGFzay1kb21haW5zIHNldHRpbmc7IHN0YXJ0aW5nIGZyZXNoIix7cmF3OnQsZXJyOmF9KSxuPXt9fWxldCBvO3RyeXtvPWF3YWl0IGUuZ2V0VGFza0RvbWFpbnMoKX1jYXRjaChhKXtrKCJbcmVmcmVzaFRhc2tEb21haW5zXSBnZXRUYXNrRG9tYWlucygpIHRocmV3IixhKSxvPW51bGx9cmV0dXJuIGFDKCJbcmVmcmVzaFRhc2tEb21haW5zXSIsbyksQXJyYXkuaXNBcnJheShvKT8obi5kb21haW5zPW8uZmlsdGVyKGE9PmEmJmEudXVpZCkubWFwKGE9Pih7bmFtZTphLm5hbWUsdXVpZDphLnV1aWR9KSksbi5sYXN0UmV0cmlldmVkPURhdGUubm93KCkpOihrKCJbcmVmcmVzaFRhc2tEb21haW5zXSBBUEkgcmV0dXJuZWQgbm8gdXNhYmxlIGRvbWFpbnM7IGtlZXBpbmcgcHJldmlvdXNseSBzdG9yZWQgZG9tYWlucyIpLG4uZG9tYWlucz1BcnJheS5pc0FycmF5KG4uZG9tYWlucyk/bi5kb21haW5zOltdKSxuLnNlbGVjdGVkRG9tYWluVXVpZCYmbi5kb21haW5zLnNvbWUoYT0+YS51dWlkPT09bi5zZWxlY3RlZERvbWFpblV1aWQpfHwoayhgW3JlZnJlc2hUYXNrRG9tYWluc10gUHJldmlvdXMgc2VsZWN0aW9uICR7bi5zZWxlY3RlZERvbWFpblV1aWR9IG5vIGxvbmdlciBleGlzdHMsIHBpY2tpbmcgZGVmYXVsdGApLG4uc2VsZWN0ZWREb21haW5VdWlkPXltKG4uZG9tYWlucykpLGF3YWl0IGUuc2V0U2V0dGluZyhCLlRBU0tfRE9NQUlOUyxKU09OLnN0cmluZ2lmeShuKSksayhgW3JlZnJlc2hUYXNrRG9tYWluc10gUmVmcmVzaCBjb21wbGV0ZSBcdTIwMTQgJHtuLmRvbWFpbnMubGVuZ3RofSBkb21haW5zLCBhY3RpdmU6ICR7bi5zZWxlY3RlZERvbWFpblV1aWR9YCkse2RvbWFpbnM6bi5kb21haW5zLGFjdGl2ZVRhc2tEb21haW46bi5zZWxlY3RlZERvbWFpblV1aWR9fWFzeW5jIGZ1bmN0aW9uIFprKGUsdCl7bGV0e2xhYmVsOm4seWVhcjpvLHF1YXJ0ZXI6cn09dCxhPXQuZG9tYWluTmFtZXx8KGF3YWl0IHBvKGUpKS5kb21haW5OYW1lLGk9dHIoYSxuKSxzPV9lKClbQi5QTEFOTklOR19OT1RFX1RBR118fFVkLGw9W3dlLHNdLHttaWdyYXRpb25Eb21haW5OYW1lOmR9PWF3YWl0IHBvKGUpLHU9YXdhaXQgVG8oZSxhJiZkJiZhPT09ZCxhLG4pO2lmKHUpcmV0dXJuIGF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHt1LnV1aWR9YCkse3V1aWQ6dS51dWlkLGV4aXN0ZWQ6ITB9O0JlKCJjcmVhdGVRdWFydGVybHlQbGFuIik7bGV0IHA9Ym0obixyKSxmPWF3YWl0IGUuY3JlYXRlTm90ZShpLGwpO3JldHVybiBhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmZ9LHApLGF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtmfWApLF9uJiZmP3tkZXZFZGl0OiEwLGV4aXN0ZWQ6ITEsbm90ZVVVSUQ6Zn06e3V1aWQ6ZixleGlzdGVkOiExfX1hc3luYyBmdW5jdGlvbiBtYyhlLHQsbil7aWYoIXQpcmV0dXJue2ZvdW5kOiExLGNvbnRlbnQ6bnVsbH07bGV0IG89YXdhaXQgZS5nZXROb3RlU2VjdGlvbnMoe3V1aWQ6dH0pO2soYFtnZXRNb250aGx5UGxhbkNvbnRlbnRdIG5vdGVVVUlEPSR7dH0gbW9udGhOYW1lPSIke259IiBzZWN0aW9uczpgLG8/Lm1hcChzPT5zLmhlYWRpbmc/LnRleHQpKTtsZXQgcj1vLmZpbmQocz0+cy5oZWFkaW5nJiZzLmhlYWRpbmcudGV4dCYmcy5oZWFkaW5nLnRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1uLnRvTG93ZXJDYXNlKCkpO2lmKGsoIltnZXRNb250aGx5UGxhbkNvbnRlbnRdIG1vbnRoU2VjdGlvbiBmb3VuZDoiLCEhciksIXIpcmV0dXJue2ZvdW5kOiExLGNvbnRlbnQ6bnVsbH07bGV0IGE9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSksaT1saShhLG4pO3JldHVybiBrKGBbZ2V0TW9udGhseVBsYW5Db250ZW50XSBleHRyYWN0ZWQgY29udGVudCBsZW5ndGg6ICR7aT8ubGVuZ3RoPz8wfWApLHtmb3VuZDohMCxjb250ZW50Oml8fCIifX1hc3luYyBmdW5jdGlvbiBlMChlLHQsbil7bGV0e2xhYmVsOm8seWVhcjpyLHF1YXJ0ZXI6YX09dCxpPXQuZG9tYWluTmFtZXx8KGF3YWl0IHBvKGUpKS5kb21haW5OYW1lLHM9dHIoaSxvKSxsPV9lKClbQi5QTEFOTklOR19OT1RFX1RBR118fFVkLGQ9W3dlLGxdLHttaWdyYXRpb25Eb21haW5OYW1lOmN9PWF3YWl0IHBvKGUpLHA9YXdhaXQgVG8oZSxpJiZjJiZpPT09YyxpLG8pLGY7aWYocClmPXAudXVpZCxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmZ9LG1tKG4pLHthdEVuZDohMH0pO2Vsc2V7bGV0IGc9Ym0obyxhKTtCZSgiY3JlYXRlUXVhcnRlcmx5UGxhbiIpLGY9YXdhaXQgZS5jcmVhdGVOb3RlKHMsZCksYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpmfSxnKX1sZXQgbT1hd2FpdCBuMChlLGYsbik7cmV0dXJue25vdGVVVUlEOmYsY29udGVudDptLGNyZWF0ZWQ6IXB9fWFzeW5jIGZ1bmN0aW9uIHQwKGUsdCxuKXtsZXR7bGFiZWw6byx5ZWFyOnIscXVhcnRlcjphfT10LGk9dC5kb21haW5OYW1lfHwoYXdhaXQgcG8oZSkpLmRvbWFpbk5hbWUscz10cihpLG8pLGw9X2UoKVtCLlBMQU5OSU5HX05PVEVfVEFHXXx8VWQsZD1bd2UsbF0se21pZ3JhdGlvbkRvbWFpbk5hbWU6Y309YXdhaXQgcG8oZSkscD1hd2FpdCBUbyhlLGkmJmMmJmk9PT1jLGksbyksZjtpZihwKWY9cC51dWlkLChhd2FpdCBtYyhlLGYsbikpLmZvdW5kfHxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmZ9LGhtKG4pLHthdEVuZDohMH0pO2Vsc2V7bGV0IGc9Ym0obyxhKTtmPWF3YWl0IGUuY3JlYXRlTm90ZShzLGQpLGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6Zn0sZyksYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpmfSxobShuKSx7YXRFbmQ6ITB9KX1sZXQgbT1hd2FpdCBuMChlLGYsbik7cmV0dXJue25vdGVVVUlEOmYsY29udGVudDptfX1hc3luYyBmdW5jdGlvbiBuMChlLHQsbix7YXR0ZW1wdHM6bz0zLGRlbGF5TXM6cj01MDB9PXt9KXtmb3IobGV0IGE9MDthPG87YSsrKXthPjAmJmF3YWl0IG5ldyBQcm9taXNlKGw9PnNldFRpbWVvdXQobCxyKSk7bGV0IGk9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSkscz1saShpLG4pO2lmKHMpcmV0dXJuIHN9cmV0dXJuIG1tKG4pLnNwbGl0KGAKYCkuZmlsdGVyKGE9PmEmJiFhLnN0YXJ0c1dpdGgoIiMiKSkuam9pbihgCmApfWFzeW5jIGZ1bmN0aW9uIGlDKGUsdCxuPSExKXtsZXQgbz1EYXRlLm5vdygpLHI9YXdhaXQgS24oZSx0LHtpbmNsdWRlRG9uZTpufSk7cmV0dXJuIGsoYFtfZmV0Y2hUYXNrc0ZvckRvbWFpbl0gJHt0P2BnZXRUYXNrRG9tYWluVGFza3MoJHt0fSlgOiJhbGwtbm90ZXMgZmFsbGJhY2sifSByZXR1cm5lZCAke3IubGVuZ3RofSB0YXNrcyBpbiAke0RhdGUubm93KCktb31tc2ApLHJ9ZnVuY3Rpb24gc0MoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCksbz1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihyPT4hci5jb21wbGV0ZWRBdCYmIXIuZGlzbWlzc2VkQXQmJmZvKHIuc3RhcnRBdCkmJmZvKHIuc3RhcnRBdCk+PW4mJmZvKHIuc3RhcnRBdCk8bykuc29ydCgocixhKT0+KGZvKHIuc3RhcnRBdCl8fDApLShmbyhhLnN0YXJ0QXQpfHwwKSl9ZnVuY3Rpb24gbzAoZSx0LG4pe2xldCBvPXQuZ2V0VGltZSgpLHI9bi5nZXRUaW1lKCk7cmV0dXJuIGUuZmlsdGVyKGE9PmZvKGEuY29tcGxldGVkQXQpJiZmbyhhLmNvbXBsZXRlZEF0KT49byYmZm8oYS5jb21wbGV0ZWRBdCk8PXIpfWZ1bmN0aW9uIGxDKGUsdCxuKXtyZXR1cm4gbzAoZSx0LG4pLnJlZHVjZSgobyxyKT0+bysoci52aWN0b3J5VmFsdWV8fDApLDApfWZ1bmN0aW9uIGRDKGUsdCl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDo3fSwobyxyKT0+e2xldCBhPW5ldyBEYXRlKHQpO2Euc2V0RGF0ZShhLmdldERhdGUoKStyKTtsZXQgaT1uZXcgRGF0ZShhKTtpLnNldERhdGUoaS5nZXREYXRlKCkrMSk7bGV0IHM9ZS5maWx0ZXIobD0+Zm8obC5jb21wbGV0ZWRBdCkmJmZvKGwuY29tcGxldGVkQXQpPj1hLmdldFRpbWUoKSYmZm8obC5jb21wbGV0ZWRBdCk8aS5nZXRUaW1lKCkpO3JldHVybntkYXk6WyJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiLCJTdW4iXVtyXSxkYXRlOmEudG9JU09TdHJpbmcoKSx2YWx1ZTpzLnJlZHVjZSgobCxkKT0+bCsoZC52aWN0b3J5VmFsdWV8fDApLDApLHRhc2tDb3VudDpzLmxlbmd0aH19KX1hc3luYyBmdW5jdGlvbiBjQyhlLHQpe2xldCBuPURhdGUubm93KCksbz1NcigpLHI9T2soKSxhPUFycmF5LmlzQXJyYXkodD8uZG9tYWlucyk/dC5kb21haW5zOltdLGk9dD8uc2VsZWN0ZWREb21haW5VdWlkfHxudWxsLHM9YS5maW5kKGg9PmgudXVpZD09PWkpPy5uYW1lfHxudWxsLGw9dm0oYSksZD1zJiZsJiZzPT09bCxjPXRyKHMsby5sYWJlbCksdT10cihzLHIubGFiZWwpO2soYFtfZmluZFF1YXJ0ZXJseVBsYW5zXSBxdWVyeWluZzogIiR7Y30iLCAiJHt1fSIgKGxlZ2FjeU1pZ3JhdGlvbj0ke2R9KWApO2xldFtwLGZdPWF3YWl0IFByb21pc2UuYWxsKFtUbyhlLGQscyxvLmxhYmVsKSxUbyhlLGQscyxyLmxhYmVsKV0pLG09cD8udXVpZHx8bnVsbCxnPWY/LnV1aWR8fG51bGw7ayhgW19maW5kUXVhcnRlcmx5UGxhbnNdIHJlc29sdmVkIFVVSURzIFx1MjAxNCBjdXJyZW50OiAke219LCBuZXh0OiAke2d9YCk7bGV0IHc9JGsoby5xdWFydGVyKSx2PSRrKHIucXVhcnRlciksW3ksYl09YXdhaXQgUHJvbWlzZS5hbGwoW20/WGsoZSxtLHcpOlByb21pc2UucmVzb2x2ZSghMSksZz9YayhlLGcsdik6UHJvbWlzZS5yZXNvbHZlKCExKV0pO3JldHVybiBrKGBbX2ZpbmRRdWFydGVybHlQbGFuc10gaGFzQWxsTW9udGhseURldGFpbHMgXHUyMDE0IGN1cnJlbnQ6ICR7eX0sIG5leHQ6ICR7Yn0gKCR7RGF0ZS5ub3coKS1ufW1zIHRvdGFsKWApLHtjdXJyZW50OnsuLi5vLGRvbWFpbk5hbWU6cyxub3RlVVVJRDptLGhhc0FsbE1vbnRobHlEZXRhaWxzOnl9LG5leHQ6ey4uLnIsZG9tYWluTmFtZTpzLG5vdGVVVUlEOmcsaGFzQWxsTW9udGhseURldGFpbHM6Yn19fWZ1bmN0aW9uICRrKGUpe2xldCB0PShlLTEpKjM7cmV0dXJuWzAsMSwyXS5tYXAobj0+Qm5bKHQrbiklMTJdKX1hc3luYyBmdW5jdGlvbiBYayhlLHQsbil7dHJ5e2xldCBvPWF3YWl0IGUuZ2V0Tm90ZVNlY3Rpb25zKHt1dWlkOnR9KTtyZXR1cm4gbi5ldmVyeShyPT5vLnNvbWUoYT0+YS5oZWFkaW5nPy50ZXh0Py50cmltKCkudG9Mb3dlckNhc2UoKT09PXIudG9Mb3dlckNhc2UoKSkpfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBmbyhlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil7bGV0IHQ9TnVtYmVyKGUpO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDwxZTEwP3QqMWUzOnQ6bnVsbH1yZXR1cm4gZTwxZTEwP2UqMWUzOmV9ZnVuY3Rpb24gYm0oZSx0KXtsZXQgbz17MTpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIl0sMjpbIkFwcmlsIiwiTWF5IiwiSnVuZSJdLDM6WyJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIl0sNDpbIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl19W3RdfHxbIk1vbnRoIDEiLCJNb250aCAyIiwiTW9udGggMyJdO3JldHVybmAjIFF1YXJ0ZXIgVGhlbWUKW09uZSBzZW50ZW5jZSBkZXNjcmliaW5nIHRoZSBtYWluIGZvY3VzIG9mIHRoaXMgcXVhcnRlci5dCgojIyBTdWNjZXNzIExvb2tzIExpa2UKLSBbIF0gW1RvcCBvdXRjb21lXQotIFsgXSBbVG9wIG91dGNvbWVdCi0gWyBdIFtUb3Agb3V0Y29tZV0KCiMgUHJvamVjdHMKCiMjIFtQcm9qZWN0IDFdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMjIFtQcm9qZWN0IDJdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMjIFtQcm9qZWN0IDNdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMgTm90IFRoaXMgUXVhcnRlcgotIFsgXSBbTG93ZXItcHJpb3JpdHkgcHJvamVjdF0KLSBbIF0gW0NvbW1pdG1lbnQgdG8gZGVjbGluZV0KLSBbIF0gW0FyZWEgdG8gaW50ZW50aW9uYWxseSBpZ25vcmVdCgojIERheS1vZi1XZWVrIEJyZWFrZG93bgpBbnkgY2F0ZWdvcnkgb2YgdGFzayB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGJlIHRoZSBmb2N1cyBmb3IgZGlmZmVyZW50IGRheXMtb2Ytd2VlayAoc29tZXRpbWVzIGNhbGxlZCAiZGF5IHN0cmlwaW5nIik/ClNlcGFyYXRlIHlvdXIgdGFzayBjYXRlZ29yaWVzIHdpdGggYSBzZW1pY29sb24gKGkuZS4sICI7IikuIFdlIHdpbGwgY29uc2lkZXIgdGhlbSB3aGVuIHByb3Bvc2luZyBwb3NzaWJsZSAKZGFpbHkgYWdlbmRhcyBmcm9tIHlvdXIgZXhpc3RpbmcgdGFza3MuICAKCi0gTW9uZGF5czogCi0gVHVlc2RheXM6IAotIFdlZG5lc2RheXM6IAotIFRodXJzZGF5czogCi0gRnJpZGF5czogCgpbQW1wbGVub3RlIG1lc3NhZ2VdCllvdSBjYW4gYWxzbyBhZGQgU2F0dXJkYXkgYW5kIFN1bmRheSBpZiB5b3UgbGlrZTsgdGhleSdyZSBub3QgaW4gdGhlIGxpc3Qgc2luY2UgYnkgZGVmYXVsdCBiZWNhdXNlIHdlIHN1c3BlY3QgCnlvdSdyZSBiZXN0IG9mZiBwcmVzZXJ2aW5nIHlvdXIgd2Vla2VuZCBmb3IgdW5wbGFubmVkIGZhbWlseSAmIHJlc3RvcmF0aW9uIGFjdGl2aXRpZXMuICAgCgojIE1vbnRoLWJ5LU1vbnRoIEJyZWFrZG93bgoKIyMgJHtvWzBdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyMgJHtvWzFdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyMgJHtvWzJdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyBXZWVrbHkgUGxhbm5pbmcgUHJvbXB0CldoaWNoIHByb2plY3RzIG5lZWQgdGltZSBvbiBteSBjYWxlbmRhciB0aGlzIHdlZWs/CgojIFF1YXJ0ZXJseSBSZXZpZXcKLSBGaW5pc2hlZDoKLSBQcm9ncmVzcyBtYWRlOgotIExlc3NvbnMgbGVhcm5lZDoKLSBDYXJyeSBmb3J3YXJkOmB9dmFyIGNpPUwobWUoKSk7YXN5bmMgZnVuY3Rpb24gaGMoZSx0KXtyZXR1cm4gX24/e2RldkVkaXQ6ITAsbm90ZVVVSUQ6dH06YXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3R9YCl9YXN5bmMgZnVuY3Rpb24gcjAoZSx0KXtyZXR1cm4gYXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSl9YXN5bmMgZnVuY3Rpb24gYTAoZSx0LG4sbyl7cmV0dXJuIGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnR9LG4sbyl9dmFyIE9yPUwoWCgpKTtmdW5jdGlvbiB3bSh7YXBwOmUsbm90ZVVVSUQ6dCxvbkJhY2s6bn0pe2xldFtvLHJdPSgwLGNpLnVzZVN0YXRlKSgiIiksW2EsaV09KDAsY2kudXNlU3RhdGUpKCEwKSxbcyxsXT0oMCxjaS51c2VTdGF0ZSkoITEpOygwLGNpLnVzZUVmZmVjdCkoKCk9PntsZXQgYz0hMTtyZXR1cm4gcjAoZSx0KS50aGVuKHU9PntjfHwocih1fHwiIiksaSghMSkpfSksKCk9PntjPSEwfX0sW3QsZV0pO2xldCBkPWFzeW5jKCk9PntsKCEwKSxhd2FpdCBhMChlLHQsbyksbCghMSl9O3JldHVybiBhPygwLE9yLmpzeCkoImRpdiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItbG9hZGluZyIsY2hpbGRyZW46IkxvYWRpbmcgbm90ZVx1MjAyNiJ9KTooMCxPci5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvciIsY2hpbGRyZW46WygwLE9yLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLXRvb2xiYXIiLGNoaWxkcmVuOlsoMCxPci5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLWJ0biBub3RlLWVkaXRvci1idG4tLWJhY2siLG9uQ2xpY2s6bixjaGlsZHJlbjoiXHUyMTkwIEJhY2sifSksKDAsT3IuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1idG4gbm90ZS1lZGl0b3ItYnRuLS1zYXZlIixvbkNsaWNrOmQsZGlzYWJsZWQ6cyxjaGlsZHJlbjpzPyJTYXZpbmdcdTIwMjYiOiJTYXZlIn0pXX0pLCgwLE9yLmpzeCkoInRleHRhcmVhIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci10ZXh0YXJlYSIsdmFsdWU6byxvbkNoYW5nZTpjPT5yKGMudGFyZ2V0LnZhbHVlKX0pXX0pfXZhciBWbj1MKG1lKCkpO3ZhciB5Yz1MKG1lKCkpO3ZhciBsdD1MKG1lKCkpLG5yPUwoWCgpKSxnYz0iZGFzaGJvYXJkOndpZGdldC1mb2N1cy1yZXF1ZXN0Iix1Qz0yZTMsa209ImRhc2hib2FyZDp3aWRnZXQtZHJhZy1yZWFkeSIsaTA9MjIwO2Z1bmN0aW9uIHBDKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudD8hIWUuY2xvc2VzdCgiYnV0dG9uLCBhLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgW3JvbGU9J2J1dHRvbiddIik6ITF9ZnVuY3Rpb24gVnMoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuITE7bGV0IGU9bmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsdD0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QoZSksbj1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM+MSYmL01hY2ludG9zaC8udGVzdChlKTtyZXR1cm4hdCYmIW4mJndpbmRvdy5pbm5lcldpZHRoPjgwMH1mdW5jdGlvbiBmQyhlLHQsbil7aWYoIUFycmF5LmlzQXJyYXkoZSl8fCF0fHwhbnx8dD09PW4pcmV0dXJuIGU7bGV0IG89ZS5maW5kSW5kZXgobD0+bD8ud2lkZ2V0SWQ9PT10KSxyPWUuZmluZEluZGV4KGw9Pmw/LndpZGdldElkPT09bik7aWYobzwwfHxyPDB8fG89PT1yKXJldHVybiBlO2xldCBhPVsuLi5lXSxbaV09YS5zcGxpY2UobywxKSxzPW88cj9yLTE6cjtyZXR1cm4gYS5zcGxpY2UocywwLGkpLGF9ZnVuY3Rpb24gbUMoKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBuZXcgTWFwO2xldCBlPW5ldyBNYXA7cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpLmZvckVhY2gobj0+e2xldCBvPW4uZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO28mJmUuc2V0KG8sbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9KSxlfWZ1bmN0aW9uIGhDKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgTWFwKXx8ZS5zaXplPT09MHx8dHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm47bGV0IG49W107ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1ncmlkIC5ncmlkLWNlbGxbZGF0YS13aWRnZXQtaWRdIikuZm9yRWFjaChyPT57bGV0IGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtd2lkZ2V0LWlkIik7aWYoIWF8fGE9PT10KXJldHVybjtsZXQgaT1lLmdldChhKTtpZighaSlyZXR1cm47bGV0IHM9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPWkubGVmdC1zLmxlZnQsZD1pLnRvcC1zLnRvcDtNYXRoLmFicyhsKTwxJiZNYXRoLmFicyhkKTwxfHwoci5zdHlsZS50cmFuc2l0aW9uPSJub25lIixyLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteCIsYCR7bH1weGApLHIuc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC15IixgJHtkfXB4YCksbi5wdXNoKHIpKX0pLG4ubGVuZ3RoIT09MCYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e24uZm9yRWFjaChyPT57ci5zdHlsZS50cmFuc2l0aW9uPWB0cmFuc2Zvcm0gJHtpMH1tcyBlYXNlYCxyLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteCIsIjBweCIpLHIuc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC15IiwiMHB4Iil9KSx3aW5kb3cuc2V0VGltZW91dCgoKT0+e24uZm9yRWFjaChyPT5yLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIikpfSxpMCs0MCl9KX1mdW5jdGlvbiBzMChlKXtyZXR1cm4oZXx8W10pLm1hcCh0PT50Py53aWRnZXRJZCkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oInwiKX1mdW5jdGlvbiBsMChlLHQpe2xldFtuLG9dPSgwLGx0LnVzZVN0YXRlKShudWxsKSxbcixhXT0oMCxsdC51c2VTdGF0ZSkoZSksaT0oMCxsdC51c2VSZWYpKGUpLHM9KDAsbHQudXNlUmVmKShudWxsKTsoMCxsdC51c2VFZmZlY3QpKCgpPT57bnx8YShlKX0sW2Usbl0pLCgwLGx0LnVzZUVmZmVjdCkoKCk9PntpLmN1cnJlbnQ9cn0sW3JdKSwoMCxsdC51c2VMYXlvdXRFZmZlY3QpKCgpPT57bGV0IGQ9cy5jdXJyZW50OyFufHwhZHx8KHMuY3VycmVudD1udWxsLGhDKGQsbikpfSxbcixuXSksKDAsbHQudXNlRWZmZWN0KSgoKT0+e2xldCBkPWM9PntsZXQgdT1jPy5kZXRhaWw/LndpZGdldElkO3UmJihvKHUpLGEocD0+QXJyYXkuaXNBcnJheShwKSYmcC5sZW5ndGg/cDplKSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihrbSxkKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoa20sZCl9LFtlXSk7bGV0IGw9KDAsbHQudXNlQ2FsbGJhY2spKCgpPT57aWYoIW4pcmV0dXJuO2xldCBkPXMwKGUpLGM9czAoaS5jdXJyZW50KTtvKG51bGwpLGMmJmQhPT1jJiZ0KGkuY3VycmVudC5tYXAodT0+dS53aWRnZXRJZCkpfSxbZSxuLHRdKTtyZXR1cm4oMCxsdC51c2VFZmZlY3QpKCgpPT57aWYoIW4pcmV0dXJuO2xldCBkPXA9PntpZigocC5idXR0b25zJjEpIT09MSl7bCgpO3JldHVybn1sZXQgZz1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHAuY2xpZW50WCxwLmNsaWVudFkpPy5jbG9zZXN0Py4oIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpPy5nZXRBdHRyaWJ1dGU/LigiZGF0YS13aWRnZXQtaWQiKTtpZighZ3x8Zz09PW4pcmV0dXJuO2xldCB3PW1DKCk7YSh2PT57bGV0IHk9ZkModixuLGcpO3JldHVybiB5IT09diYmKHMuY3VycmVudD13KSx5fSl9LGM9KCk9PmwoKSx1PSgpPT5sKCk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGQpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixjKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdSksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixkKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHUpfX0sW24sbF0pLHtkcmFnZ2luZ1dpZGdldElkOm4sZGlzcGxheWVkQ29tcG9uZW50czpyfX1mdW5jdGlvbiB4bSh7Y29uZmlndXJhYmxlOmUsaGVhZGVyQWN0aW9uczp0LGljb246bixvbkNvbmZpZ3VyZTpvLHN1YnRpdGxlOnIsdGl0bGU6YSx3aWRnZXRJZDppfSl7bGV0W3MsbF09KDAsbHQudXNlU3RhdGUpKCgpPT5WcygpKSxkPSgwLGx0LnVzZVJlZikobnVsbCksYz0oMCxsdC51c2VSZWYpKG51bGwpLHU9KDAsbHQudXNlUmVmKSghMSkscD0oMCxsdC51c2VNZW1vKSgoKT0+KHt3aWRnZXRJZDppfSksW2ldKTtyZXR1cm4oMCxsdC51c2VFZmZlY3QpKCgpPT57bGV0IGY9KCk9PmwoVnMoKSk7cmV0dXJuIGYoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZil9LFtdKSwoMCxsdC51c2VFZmZlY3QpKCgpPT57bGV0IGY9ZC5jdXJyZW50O2lmKCFmKXJldHVybjtsZXQgbT0oKT0+e2MuY3VycmVudCE9bnVsbCYmKHdpbmRvdy5jbGVhclRpbWVvdXQoYy5jdXJyZW50KSxjLmN1cnJlbnQ9bnVsbCl9LGc9eT0+e2YuY2xhc3NMaXN0LnRvZ2dsZSgid2lkZ2V0LWhlYWRpbmctYmFyLS1kcmFnLXJlYWR5IiwhIXkpfSx3PXk9Pnt5LmJ1dHRvbj09PTAmJihwQyh5LnRhcmdldCl8fCh1LmN1cnJlbnQ9ITEsZyghMSksbSgpLGMuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e3UuY3VycmVudD0hMCxnKCEwKSx3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoa20se2RldGFpbDpwfSkpfSx1QykpKX0sdj0oKT0+e20oKSx1LmN1cnJlbnQ9ITEsZyghMSl9O3JldHVybiBmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix2KSwoKT0+e20oKSxnKCExKSxmLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHYpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix2KX19LFtwXSksKDAsbnIuanN4cykoImRpdiIse3JlZjpkLGNsYXNzTmFtZTpgd2lkZ2V0LWhlYWRlciB3aWRnZXQtaGVhZGluZy1iYXIke3M/IiB3aWRnZXQtaGVhZGluZy1iYXItLWZvY3VzYWJsZSI6IiJ9YCxjaGlsZHJlbjpbcz8oMCxuci5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1pY29uIHdpZGdldC1pY29uLWJ1dHRvbiIsdHlwZToiYnV0dG9uIix0aXRsZTpgRm9jdXMgJHthfWAsImFyaWEtbGFiZWwiOmBGb2N1cyAke2F9YCxvbkNsaWNrOigpPT53aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZ2Mse2RldGFpbDpwfSkpLGNoaWxkcmVuOm59KTooMCxuci5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaWNvbiIsY2hpbGRyZW46bn0pLCgwLG5yLmpzeHMpKCJoMyIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlIixjaGlsZHJlbjpbKDAsbnIuanN4KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19sYWJlbCIsY2hpbGRyZW46YX0pLHI/KDAsbnIuanN4KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19zdWJ0aXRsZSIsY2hpbGRyZW46cn0pOm51bGxdfSksdHx8bnVsbCxlPygwLG5yLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWNvbmZpZ3VyZSIsb25DbGljazpvLGNoaWxkcmVuOiJcdTI2OTkgQ29uZmlndXJlIn0pOm51bGxdfSl9dmFyIGpzPUwoWCgpKSxTbT0oMCx5Yy5jcmVhdGVDb250ZXh0KShudWxsKTtmdW5jdGlvbiByZSh7YXBwOmUsY2hpbGRyZW46dCxjb25maWd1cmFibGU6bixncmlkSGVpZ2h0U2l6ZTpvLGdyaWRXaWR0aFNpemU6cixoZWFkZXJBY3Rpb25zOmEsaWNvbjppLG9uQ29uZmlndXJlOnMsc3VidGl0bGU6bCx0aXRsZTpkLHdpZGdldElkOmN9KXtsZXQgdT0oMCx5Yy51c2VDb250ZXh0KShTbSkscD1pPz9ZYihjKSxmPWw/P3FiKGMpLG09ZD8/V2QoYyksZz1hc3luYygpPT57cz9zKCk6ZSYmYXdhaXQgZS5jb25maWd1cmUoYykmJndpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKX0sdz1yPz91Py5ncmlkV2lkdGhTaXplLHY9bz8/dT8uZ3JpZEhlaWdodFNpemUseT1OdW1iZXIodyk+MD9OdW1iZXIodyk6MSxiPU51bWJlcih2KT4wP051bWJlcih2KToxLGg9YGhvcml6b250YWwtJHt5fS1jZWxsIHZlcnRpY2FsLSR7Yn0tY2VsbGA7cmV0dXJuKDAsanMuanN4cykoImRpdiIse2NsYXNzTmFtZTpgd2lkZ2V0IHdpZGdldC0ke2N9ICR7aH1gLGNoaWxkcmVuOlsoMCxqcy5qc3gpKHhtLHtjb25maWd1cmFibGU6bixoZWFkZXJBY3Rpb25zOmEsaWNvbjpwLHN1YnRpdGxlOmYsdGl0bGU6bSx3aWRnZXRJZDpjLG9uQ29uZmlndXJlOmd9KSwoMCxqcy5qc3gpKCJkaXYiLHtjbGFzc05hbWU6IndpZGdldC1ib2R5IixjaGlsZHJlbjp0fSldfSl9dmFyIEFlPUwoWCgpKTthc3luYyBmdW5jdGlvbiBnQyhlLHQpe3JldHVybiB0Lm5vdGVVVUlEP2F3YWl0IGhjKGUsdC5ub3RlVVVJRCk6YXdhaXQgWmsoZSx0KX1hc3luYyBmdW5jdGlvbiBkMChlLHQse2FjdGl2ZVRhYjpuLHNldEFjdGl2ZVRhYjpvLHNldE1vbnRoTG9hZGluZzpyLHNldE1vbnRoQ29udGVudDphfSl7aWYobj09PXQuaW5kZXgpe28obnVsbCksYShudWxsKTtyZXR1cm59byh0LmluZGV4KSxyKCEwKSxhKG51bGwpO2xldCBpPXQucGxhbi5ub3RlVVVJRDt0cnl7aWYoIWkpYSh7Zm91bmQ6ITEscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSk7ZWxzZXtsZXQgcz1hd2FpdCBtYyhlLGksdC5mdWxsKTtrKGBbUGxhbm5pbmddIFJhdyBtYXJrZG93biBmb3IgJHt0LmZ1bGx9OmAscz8uY29udGVudCksYSh7Li4ucyxwbGFuOnQucGxhbixtb250aE5hbWU6dC5mdWxsLHllYXI6dC5wbGFuLnllYXJ9KX19Y2F0Y2h7YSh7Zm91bmQ6ITEscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSl9ZmluYWxseXtyKCExKX19YXN5bmMgZnVuY3Rpb24geUMoZSx0LHtzZXRNb250aExvYWRpbmc6bixzZXRNb250aENvbnRlbnQ6b30pe2lmKHQpe24oITApO3RyeXtsZXQgcj1hd2FpdCBlMChlLHQucGxhbix0Lm1vbnRoTmFtZSk7aWYociYmci5ub3RlVVVJRClyZXR1cm4gbyhhPT4oey4uLmEsZm91bmQ6ITAsY29udGVudDpyLmNvbnRlbnR8fCIifSkpLGF3YWl0IGhjKGUsci5ub3RlVVVJRCl9Y2F0Y2h7fWZpbmFsbHl7bighMSl9fX1hc3luYyBmdW5jdGlvbiB2QyhlLHQsbixvLHIpe28oITApO3RyeXtsZXQgYT1hd2FpdCB0MChlLHQsbik7aWYoYT8ubm90ZVVVSUQpcmV0dXJuIHIoe2ZvdW5kOiEwLGNvbnRlbnQ6YS5jb250ZW50fHwiIn0pLGF3YWl0IGhjKGUsYS5ub3RlVVVJRCl9Y2F0Y2h7fWZpbmFsbHl7byghMSl9fWZ1bmN0aW9uIGJDKHtwbGFuOmUsb25DYXJkQ2xpY2s6dH0pe2xldCBuPSEhZS5ub3RlVVVJRCxvPSEhZS5oYXNBbGxNb250aGx5RGV0YWlscyxyPSJxdWFydGVyLWNhcmQiKyhuPyIgcXVhcnRlci1jYXJkLS1oYXMtcGxhbiI6IiIpLGE9ZS5kb21haW5OYW1lP2Ake2UubGFiZWx9IFx4QjcgJHtlLmRvbWFpbk5hbWV9YDplLmxhYmVsO3JldHVybigwLEFlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6cixvbkNsaWNrOnQsY2hpbGRyZW46WygwLEFlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItbGFiZWwiLGNoaWxkcmVuOmF9KSwoMCxBZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJxdWFydGVyLXN0YXR1cy1yb3ciLGNoaWxkcmVuOlsoMCxBZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxdWFydGVyLXN0YXR1cyIsY2hpbGRyZW46bj8iXHV7MUY0RER9IE9wZW4gUGxhbiI6IisgQ3JlYXRlIFBsYW4ifSksbj8oMCxBZS5qc3gpKEJzLHtjb250ZW50Om8/IkFsbCAzIG1vbnRocyBpbiB0aGlzIHF1YXJ0ZXIgaGF2ZSBiZWVuIHBsYW5uZWQuIjoiTW9udGhseSBkZXRhaWxzIGFyZSBtaXNzaW5nIGZvciBvbmUgb3IgbW9yZSBtb250aHMgXHUyMDE0IHRoaXMgcGxhbiBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MuIixwbGFjZW1lbnQ6ImJvdHRvbSIsY2hpbGRyZW46KDAsQWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToicXVhcnRlci1wbGFuLWluZGljYXRvciIsb25DbGljazpsPT5sLnN0b3BQcm9wYWdhdGlvbigpLGNoaWxkcmVuOm8/Ilx1MjcwNSI6Ilx1ezFGNkE3fSJ9KX0pOm51bGxdfSldfSl9ZnVuY3Rpb24gd0Moe21vbnRoTG9hZGluZzplLG1vbnRoQ29udGVudDp0LG9uQ3JlYXRlUGxhbjpufSl7cmV0dXJuIGU/KDAsQWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWxvYWRpbmciLGNoaWxkcmVuOiJMb2FkaW5nXHUyMDI2In0pOnQ/dC5mb3VuZD8oMCxBZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50IixjaGlsZHJlbjpbKDAsQWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWhlYWRlciIsY2hpbGRyZW46dC5tb250aE5hbWV9KSwoMCxBZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpfcyh0LmNvbnRlbnQpfHwiPHA+KEVtcHR5IHNlY3Rpb24pPC9wPiJ9fSldfSk6KDAsQWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWVtcHR5IixjaGlsZHJlbjooMCxBZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImNyZWF0ZS1tb250aC1wbGFuLWxpbmsiLG9uQ2xpY2s6bixjaGlsZHJlbjpgQ3JlYXRlIGEgcGxhbiBmb3IgJHt0Lm1vbnRoTmFtZX0gJHt0LnllYXJ9YH0pfSk6bnVsbH1mdW5jdGlvbiBrQyh7d2Vla0xhYmVsOmUseWVhcjp0LHdlZWtMb2FkaW5nOm4sd2Vla0NvbnRlbnQ6byxvbkNyZWF0ZVdlZWtQbGFuOnJ9KXtyZXR1cm4gbj8oMCxBZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLXNlY3Rpb24iLGNoaWxkcmVuOigwLEFlLmpzeCkoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4tbG9hZGluZyIsY2hpbGRyZW46IkxvYWRpbmdcdTIwMjYifSl9KTpvPy5mb3VuZD8oMCxBZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSIsY2hpbGRyZW46KDAsQWUuanN4cykoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCIsY2hpbGRyZW46WygwLEFlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIiLGNoaWxkcmVuOmV9KSwoMCxBZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpfcyhvLmNvbnRlbnQpfHwiPHA+KEVtcHR5IHNlY3Rpb24pPC9wPiJ9fSldfSl9KTooMCxBZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJ3ZWVrbHktcGxhbi1zZWN0aW9uIixjaGlsZHJlbjpbKDAsQWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJ3ZWVrbHktcGxhbi1oZWFkZXIiLGNoaWxkcmVuOiJXZWVrbHkgUGxhbiJ9KSwoMCxBZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImNyZWF0ZS13ZWVrLXBsYW4tbGluayIsb25DbGljazpyLGNoaWxkcmVuOmBDcmVhdGUgYSB3ZWVrbHkgcGxhbiBmb3IgJHtlfSwgJHt0fWB9KV19KX1mdW5jdGlvbiBFbSh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLHF1YXJ0ZXJseVBsYW5zOm59KXtsZXRbbyxyXT0oMCxWbi51c2VTdGF0ZSkobnVsbCksW2EsaV09KDAsVm4udXNlU3RhdGUpKG51bGwpLFtzLGxdPSgwLFZuLnVzZVN0YXRlKSghMSksW2QsY109KDAsVm4udXNlU3RhdGUpKG51bGwpLFt1LHBdPSgwLFZuLnVzZVN0YXRlKSghMSksW2YsbV09KDAsVm4udXNlU3RhdGUpKCExKSxbZyx3XT0oMCxWbi51c2VTdGF0ZSkobnVsbCksdj10Pj0yLHk9ISEobj8uY3VycmVudCYmbj8ubmV4dCksYj1uPy5jdXJyZW50Py5kb21haW5OYW1lfHxuPy5uZXh0Py5kb21haW5OYW1lfHxudWxsLGg9eT9JayhuLmN1cnJlbnQsbi5uZXh0KTpbXSxTPXthY3RpdmVUYWI6byxzZXRBY3RpdmVUYWI6cixzZXRNb250aExvYWRpbmc6bCxzZXRNb250aENvbnRlbnQ6aX0seD17c2V0TW9udGhMb2FkaW5nOmwsc2V0TW9udGhDb250ZW50Oml9LEU9c2MoKSxUPWxjKEUpLEE9Yj9gUXVhcnRlcmx5IFBsYW5uaW5nIFx4QjcgJHtifWA6dm9pZCAwO2lmKHV0KCJwbGFubmluZyIseSYmZiYmIXMmJighdnx8IXUpKSwoMCxWbi51c2VFZmZlY3QpKCgpPT57cihudWxsKSxpKG51bGwpLGMobnVsbCksbSghMSl9LFtiXSksKDAsVm4udXNlRWZmZWN0KSgoKT0+e2lmKCF5fHxmKXJldHVybjtsZXQgTz1oLmZpbmQoUD0+UC5jdXJyZW50KTtPJiYobSghMCksZDAoZSxPLFMpKX0sW2IsZix5XSksKDAsVm4udXNlRWZmZWN0KSgoKT0+e2lmKCF5fHwhdilyZXR1cm47bGV0IE89bi5jdXJyZW50Py5ub3RlVVVJRDtPJiYocCghMCksbWMoZSxPLFQpLnRoZW4oUD0+e2soYFtQbGFubmluZ10gV2Vla2x5IHNlY3Rpb24gIiR7VH0iOmAsUCksYyhQKX0pLmNhdGNoKCgpPT5jKHtmb3VuZDohMSxjb250ZW50Om51bGx9KSkuZmluYWxseSgoKT0+cCghMSkpKX0sW3YseSxuPy5jdXJyZW50Py5ub3RlVVVJRCxUXSksZyYmX24pcmV0dXJuKDAsQWUuanN4KShyZSx7dGl0bGU6QSx3aWRnZXRJZDoicGxhbm5pbmciLGNoaWxkcmVuOigwLEFlLmpzeCkod20se2FwcDplLG5vdGVVVUlEOmcsb25CYWNrOigpPT53KG51bGwpfSl9KTtpZigheSlyZXR1cm4oMCxBZS5qc3gpKHJlLHt0aXRsZTpBLHdpZGdldElkOiJwbGFubmluZyIsY2hpbGRyZW46KDAsQWUuanN4KSgicCIse2NsYXNzTmFtZToicGxhbm5pbmctZW1wdHkiLGNoaWxkcmVuOiJMb2FkaW5nIHF1YXJ0ZXJseSBwbGFuc1x1MjAyNiJ9KX0pO2xldCBDPU89PntPPy5kZXZFZGl0JiZPLm5vdGVVVUlEJiZ3KE8ubm90ZVVVSUQpfTtyZXR1cm4oMCxBZS5qc3hzKShyZSx7dGl0bGU6QSx3aWRnZXRJZDoicGxhbm5pbmciLGNoaWxkcmVuOlsoMCxBZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBsYW5uaW5nLXF1YXJ0ZXJzIixjaGlsZHJlbjpbbi5jdXJyZW50LG4ubmV4dF0ubWFwKE89PigwLEFlLmpzeCkoYkMse3BsYW46TyxvbkNhcmRDbGljazphc3luYygpPT57bGV0IFA9YXdhaXQgZ0MoZSxPKTtDKFApfX0sTy5sYWJlbCkpfSksKDAsQWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC10YWJzIixjaGlsZHJlbjpoLm1hcChPPT4oMCxBZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im1vbnRoLXRhYiIrKE8uaW5kZXg9PT1vPyIgYWN0aXZlIjoiIiksb25DbGljazooKT0+ZDAoZSxPLFMpLGNoaWxkcmVuOk8uc2hvcnR9LE8uaW5kZXgpKX0pLG8hPT1udWxsPygwLEFlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1hcmVhIixjaGlsZHJlbjooMCxBZS5qc3gpKHdDLHttb250aExvYWRpbmc6cyxtb250aENvbnRlbnQ6YSxvbkNyZWF0ZVBsYW46YXN5bmMoKT0+e2xldCBPPWF3YWl0IHlDKGUsYSx4KTtDKE8pfX0pfSk6bnVsbCx2PygwLEFlLmpzeCkoa0Mse3dlZWtMYWJlbDpULHllYXI6bi5jdXJyZW50LnllYXIsd2Vla0xvYWRpbmc6dSx3ZWVrQ29udGVudDpkLG9uQ3JlYXRlV2Vla1BsYW46YXN5bmMoKT0+e2xldCBPPWF3YWl0IHZDKGUsbi5jdXJyZW50LFQscCxjKTtDKE8pfX0pOm51bGxdfSl9dmFyIHZjPUwobWUoKSk7ZnVuY3Rpb24gYzAoZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIE51bWJlci5pc05hTihlLmdldFRpbWUoKSk/bnVsbDpuZXcgRGF0ZShlLmdldFRpbWUoKSk7aWYodHlwZW9mIGUhPSJudW1iZXIiJiZ0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG51bGw7bGV0IHQ9dHlwZW9mIGU9PSJudW1iZXIiJiZlPDFlMTA/bmV3IERhdGUoZSoxZTMpOm5ldyBEYXRlKGUpO3JldHVybiBOdW1iZXIuaXNOYU4odC5nZXRUaW1lKCkpP251bGw6dH1mdW5jdGlvbiB1aShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmZpbHRlcih0PT50JiZ0eXBlb2YgdD09Im9iamVjdCIpLm1hcCh0PT4oey4uLnQsZW5kOmMwKHQuZW5kKSxzdGFydDpjMCh0LnN0YXJ0KX0pKTpbXX1mdW5jdGlvbiB1MChlLHQsbil7bGV0IG89dD97ZGF5czozLHRhc2tEb21haW5VVUlEOnR9OntkYXlzOjN9O2UuZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyhvKS50aGVuKHI9PntrKCJbdXNlRXh0ZXJuYWxDYWxlbmRhckV2ZW50c10gUmVjZWl2ZWQgY2FsZW5kYXIgZXZlbnRzIixyKSxuKHVpKHIpKX0pLmNhdGNoKCgpPT57bihbXSl9KX1mdW5jdGlvbiBObShlLHQpe2xldFtuLG9dPSgwLHZjLnVzZVN0YXRlKShudWxsKTtyZXR1cm4oMCx2Yy51c2VFZmZlY3QpKCgpPT57byhudWxsKSx1MChlLHQsbyk7ZnVuY3Rpb24gcigpe2RvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT09PSJ2aXNpYmxlIiYmdTAoZSx0LG8pfXJldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixyKSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIscil9LFtlLHRdKSx7Y2FsZW5kYXJFdmVudHM6bixjYWxlbmRhckV2ZW50c0xvYWRlZDpuIT09bnVsbH19dmFyIHAwPTMwLFRtPTI0KjYwKjYwKjFlMztmdW5jdGlvbiBEbShlLHttYXhEYXlzOnQ9cDAsdG9kYXk6bj1uZXcgRGF0ZX09e30pe2xldCBvPWYwKGUsbik7cmV0dXJuIE1hdGgubWF4KDEsTWF0aC5taW4odCxvKzEpKX1mdW5jdGlvbiBmMChlLHQ9bmV3IERhdGUpe2xldCBuPWVyKHQpLG89ZXIoZSk7cmV0dXJuIE1hdGguZmxvb3IoKG8uZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS9UbSl9ZnVuY3Rpb24gbTAoZSx0KXtpZighZSlyZXR1cm4hMTtpZihlLnN0YXJ0JiZhZShlLnN0YXJ0KT09PWFlKHQpKXJldHVybiEwO2xldCBuPWVyKHQpLmdldFRpbWUoKSxvPW4rVG0scj1lLnN0YXJ0P0llKGUuc3RhcnQse3Rocm93T25JbnZhbGlkOiExfSk6bnVsbCxhPWUuZW5kP0llKGUuZW5kLHt0aHJvd09uSW52YWxpZDohMX0pOm51bGwsaT1yP3IuZ2V0VGltZSgpOm4scz1hP2EuZ2V0VGltZSgpOmkrVG07cmV0dXJuIGk8byYmcz5ufWFzeW5jIGZ1bmN0aW9uIGgwKGUsdCxuPW51bGwse2xvZ1ByZWZpeDpvPSJbY2FsZW5kYXItdXRpbGl0eV0iLG1heERheXM6cj1wMH09e30pe2lmKHR5cGVvZiBlLmdldEV4dGVybmFsQ2FsZW5kYXJFdmVudHMhPSJmdW5jdGlvbiIpcmV0dXJuW107bGV0IGE9ZjAodCk7aWYoYTwwfHxhPj1yKXJldHVybltdO2xldCBpPURtKHQse21heERheXM6cn0pLHM9bj97ZGF5czppLHRhc2tEb21haW5VVUlEOm59OntkYXlzOml9O3JldHVybiBhd2FpdCBlLmdldEV4dGVybmFsQ2FsZW5kYXJFdmVudHMocykuY2F0Y2gobD0+KGsoYCR7b30gZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyBmYWlsZWRgLGw/Lm1lc3NhZ2UpLFtdKSl9dmFyIGJjPSJkYXNoYm9hcmQ6dG9kYXktb2JsaWdhdGlvbnMiLGtjPSJkYXNoYm9hcmQ6dG9kYXktb2JsaWdhdGlvbnMtcmVxdWVzdCIseEM9NTAwLFNDPTFlMTAsRUM9NmU0O2Z1bmN0aW9uIENtKGUsdCxuKXtsZXQgbz1HbihufHxuZXcgRGF0ZSksaT0oZXx8W10pLmZpbHRlcihwPT5wJiYhcC5jb21wbGV0ZWRBdCYmIXAuZGlzbWlzc2VkQXQpLmZpbHRlcihwPT55MChwLnN0YXJ0QXR8fHAuZGVhZGxpbmUsbykpLm1hcChwPT52MCh7ZHVyYXRpb25NaW51dGVzOk5DKHApLHNvdXJjZToidGFzayIsc3RhcnRNaW51dGVzOmcwKHAuc3RhcnRBdHx8cC5kZWFkbGluZSksdGFza1V1aWQ6cC51dWlkfHxudWxsLHRpdGxlOnAuY29udGVudH0pKSxkPSh0fHxbXSkuZmlsdGVyKHA9PnAmJiFwLmFsbERheSkuZmlsdGVyKHA9PnkwKHAuc3RhcnQsbykpLm1hcChwPT52MCh7ZHVyYXRpb25NaW51dGVzOlRDKHApLHNvdXJjZToiZXZlbnQiLHN0YXJ0TWludXRlczpnMChwLnN0YXJ0KSx0aXRsZTpwLnRpdGxlfHwiQ2FsZW5kYXIgZXZlbnQifSkpO3JldHVyblsuLi5pLC4uLmRdLmZpbHRlcihCb29sZWFuKS5zb3J0KChwLGYpPT5wLnN0YXJ0TWludXRlcy1mLnN0YXJ0TWludXRlcyl9ZnVuY3Rpb24gd2MoZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIE51bWJlci5pc05hTihlLmdldFRpbWUoKSk/bnVsbDplLmdldFRpbWUoKTtpZih0eXBlb2YgZT09Im51bWJlciIpcmV0dXJuIGU8U0M/ZSoxZTM6ZTtpZih0eXBlb2YgZT09InN0cmluZyIpe2xldCB0PW5ldyBEYXRlKGUpLmdldFRpbWUoKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpP251bGw6dH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnMChlKXtsZXQgdD13YyhlKTtpZih0PT1udWxsKXJldHVybiBudWxsO2xldCBuPW5ldyBEYXRlKHQpO3JldHVybiBuLmdldEhvdXJzKCkqNjArbi5nZXRNaW51dGVzKCl9ZnVuY3Rpb24geTAoZSx0KXtsZXQgbj13YyhlKTtyZXR1cm4gbiE9bnVsbCYmR24obmV3IERhdGUobikpPT09dH1mdW5jdGlvbiB2MCh7ZHVyYXRpb25NaW51dGVzOmU9bnVsbCxzb3VyY2U6dCxzdGFydE1pbnV0ZXM6bix0YXNrVXVpZDpvPW51bGwsdGl0bGU6cn0pe2xldCBhPVN0cmluZyhyfHwiIikucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCk7cmV0dXJuIG49PW51bGx8fCFhP251bGw6e2R1cmF0aW9uTWludXRlczplfHxudWxsLHNvdXJjZTp0LHN0YXJ0TWludXRlczpuLHRhc2tVdWlkOm8sdGl0bGU6YX19ZnVuY3Rpb24gTkMoZSl7bGV0IHQ9ZT8uZHVyYXRpb247cmV0dXJuIHR5cGVvZiB0IT0ibnVtYmVyInx8dDw9MD9udWxsOk1hdGgucm91bmQodC82MCl9ZnVuY3Rpb24gVEMoZSl7bGV0IHQ9d2MoZT8uc3RhcnQpLG49d2MoZT8uZW5kKTtyZXR1cm4gdD09bnVsbHx8bj09bnVsbHx8bjw9dD9udWxsOk1hdGgucm91bmQoKG4tdCkvRUMpfWFzeW5jIGZ1bmN0aW9uIEFtKGUse2NhbGVuZGFyRXZlbnRzOnQ9bnVsbCxjdXJyZW50RGF0ZTpuPW51bGwsZG9tYWluVXVpZDpvPW51bGx9PXt9KXtsZXQgcj1hd2FpdCBLbihlLG8pLmNhdGNoKCgpPT5bXSksYT1bXTtpZihBcnJheS5pc0FycmF5KHQpKWE9dWkodCk7ZWxzZSB0cnl7bGV0IHM9RG0obnx8bmV3IERhdGUpLGw9bz97ZGF5czpzLHRhc2tEb21haW5VVUlEOm99OntkYXlzOnN9LGQ9YXdhaXQgZS5nZXRFeHRlcm5hbENhbGVuZGFyRXZlbnRzKGwpO2E9dWkoZCl9Y2F0Y2gocyl7aygiW3Byb3Bvc2VkLWFnZW5kYV0gZGVyaXZlVG9kYXlPYmxpZ2F0aW9uczogY2FsZW5kYXIgZmV0Y2ggZmFpbGVkIixzKX1sZXQgaT1DbShyLGEsbik7cmV0dXJuIGsoIltwcm9wb3NlZC1hZ2VuZGFdIGRlcml2ZVRvZGF5T2JsaWdhdGlvbnMiLHtjb3VudDppLmxlbmd0aCxkb21haW5VdWlkOm99KSxpfWZ1bmN0aW9uIGIwKGUse2NhbGVuZGFyRXZlbnRzOnQ9bnVsbCxjdXJyZW50RGF0ZTpuPW51bGwsZG9tYWluVXVpZDpvPW51bGwsdGltZW91dE1zOnI9eEN9PXt9KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9BbShlLHtjYWxlbmRhckV2ZW50czp0LGN1cnJlbnREYXRlOm4sZG9tYWluVXVpZDpvfSk6dHlwZW9mIHdpbmRvdz4idSJ8fCF3aW5kb3cuZGlzcGF0Y2hFdmVudD9BbShlLHtjdXJyZW50RGF0ZTpuLGRvbWFpblV1aWQ6b30pOm5ldyBQcm9taXNlKGE9PntsZXQgaT0hMSxzPXU9PntpfHwoaT0hMCxkKCksYSh1KSl9LGw9dT0+cyhBcnJheS5pc0FycmF5KHU/LmRldGFpbD8ub2JsaWdhdGlvbnMpP3UuZGV0YWlsLm9ibGlnYXRpb25zOltdKTtmdW5jdGlvbiBkKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYmMsbCksY2xlYXJUaW1lb3V0KGMpfXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGJjLGwpO2xldCBjPXNldFRpbWVvdXQoKCk9PntBbShlLHtjdXJyZW50RGF0ZTpuLGRvbWFpblV1aWQ6b30pLnRoZW4ocykuY2F0Y2goKCk9PnMoW10pKX0scik7d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGtjKSl9KX12YXIgSXI9TChtZSgpKTt2YXIgWWU9TChYKCkpLHhjPTM7ZnVuY3Rpb24gdzAoZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8IXQ/W106ZS5maWx0ZXIobj0+bj8uc3RhcnQmJkduKG4uc3RhcnQpPT09dCl9ZnVuY3Rpb24gTW0oe2FwcDplLGNhbGVuZGFyRXZlbnRzOnQsY3VycmVudERhdGU6bixzZWxlY3RlZERhdGU6byx0YXNrczpyLHRpbWVGb3JtYXQ6YX0pe2xldFtpLHNdPSgwLElyLnVzZVN0YXRlKSgwKSxsPSgwLElyLnVzZVJlZikobnVsbCksZD1HbihufHxuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpLGM9T2JqZWN0LmtleXMocnx8e30pLnNvcnQoKSxwPUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoPjA/dzAodCxkKTpbXSxmPUFycmF5LmZyb20obmV3IFNldChbLi4uYywuLi5wLmxlbmd0aD4wP1tkXTpbXV0pKS5zb3J0KCksbT1vJiYhZi5pbmNsdWRlcyhvKT9bLi4uZixvXS5zb3J0KCk6ZixnPU1hdGgubWF4KDEsTWF0aC5jZWlsKG0ubGVuZ3RoL3hjKSk7KDAsSXIudXNlRWZmZWN0KSgoKT0+e2lmKCFvKXJldHVybjtsZXQgTT1tLmluZGV4T2Yobyk7TT49MCYmcyhNYXRoLmZsb29yKE0veGMpKX0sW29dKSwoMCxJci51c2VFZmZlY3QpKCgpPT57V24obC5jdXJyZW50KX0pLCgwLElyLnVzZUVmZmVjdCkoKCk9PntsZXQgTT0oKT0+e2xldCBXPUNtKHI/LltkXXx8W10scCxuKTt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoYmMse2RldGFpbDp7ZGF0ZUtleTpkLG9ibGlnYXRpb25zOld9fSkpfTtyZXR1cm4gTSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGtjLE0pLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihrYyxNKX0sW3QsbixyLGRdKTtsZXQgdz1NYXRoLm1pbihpLGctMSksdj1tLnNsaWNlKHcqeGMsKHcrMSkqeGMpLHk9TT0+TS5pbXBvcnRhbnQmJk0udXJnZW50PyJwcmlvcml0eS1jcml0aWNhbCI6TS5pbXBvcnRhbnQ/InByaW9yaXR5LWltcG9ydGFudCI6TS51cmdlbnQ/InByaW9yaXR5LXVyZ2VudCI6InByaW9yaXR5LW5vcm1hbCIsYj1NPT57aWYoIU0pcmV0dXJuIG51bGw7aWYoTSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIE0uZ2V0VGltZSgpO2lmKHR5cGVvZiBNPT0ibnVtYmVyIilyZXR1cm4gTTwxZTEwP00qMWUzOk07aWYodHlwZW9mIE09PSJzdHJpbmciKXtsZXQgVz1uZXcgRGF0ZShNKS5nZXRUaW1lKCk7cmV0dXJuIE51bWJlci5pc05hTihXKT9udWxsOld9cmV0dXJuIG51bGx9LGg9TT0+e2xldCBXPWIoTT8uZW5kKSxEPWIoTT8uc3RhcnQpO3JldHVybiBXPT1udWxsfHxEPT1udWxsfHxXPD1EP251bGw6TWF0aC5yb3VuZCgoVy1EKS82ZTQpfSxTPU09PntsZXQgVz1iKE0pO2lmKCFXKXJldHVybiIiO2xldCBEPWE9PT0iMjRoIj97aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0Iixob3VyMTI6ITF9Ontob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyZXR1cm4gbmV3IERhdGUoVykudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLEQpfSx4PU09Pk0ubm90ZVVVSUR8fE0ubm90ZVV1aWR8fE0ubm90ZT8udXVpZHx8bnVsbCxFPU09Pk0ubm90ZU5hbWV8fE0ubm90ZVRpdGxlfHxNLm5vdGU/Lm5hbWV8fCJPcGVuIG5vdGUiLFQ9YXN5bmMgTT0+e2xldCBXPXgoTSk7IVd8fCFNLnV1aWR8fGF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtXfT9oaWdobGlnaHRUYXNrVVVJRD0ke00udXVpZH1gKX0sQT1hc3luYyhNLFcpPT57Vy5zdG9wUHJvcGFnYXRpb24oKTtsZXQgRD14KE0pO0QmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtEfWApfSxDPU09Pm5ldyBEYXRlKGAke019VDAwOjAwOjAwYCkudG9Mb2NhbGVEYXRlU3RyaW5nKFtdLHt3ZWVrZGF5OiJzaG9ydCIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSksTz1EYXRlLm5vdygpLFA9TT0+TS5maWx0ZXIoVz0+e2xldCBEPWIoVy5oaWRlVW50aWwpO3JldHVybiBEPT1udWxsPyEwOkQ8PU99KSxVPShNLFcpPT57aWYoVy50eXBlPT09ImV2ZW50IiYmVy5ldmVudC5hbGxEYXkpcmV0dXJuIG5ldyBEYXRlKGAke019VDAwOjAwOjAwYCkuZ2V0VGltZSgpO2xldCBEPVcudHlwZT09PSJldmVudCI/Vy5ldmVudC5zdGFydDpXLnRhc2suc3RhcnRBdHx8Vy50YXNrLmRlYWRsaW5lLE49YihEKTtyZXR1cm4gTj8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSxJPShNLFcsRCk9PlsuLi5ELm1hcCgoTixGKT0+KHtpbmRleDpGLHNvcnRNczpVKE0se3Rhc2s6Tix0eXBlOiJ0YXNrIn0pLHRhc2s6Tix0eXBlOiJ0YXNrIn0pKSwuLi5XLm1hcCgoTixGKT0+KHtldmVudDpOLGluZGV4OkYsc29ydE1zOlUoTSx7ZXZlbnQ6Tix0eXBlOiJldmVudCJ9KSxzb3VyY2VPcmRlcjpELmxlbmd0aCtGLHR5cGU6ImV2ZW50In0pKV0ubWFwKChOLEYpPT4oey4uLk4sc291cmNlT3JkZXI6Ti5zb3VyY2VPcmRlcj8/Rn0pKS5zb3J0KChOLEYpPT5OLnNvcnRNcy1GLnNvcnRNc3x8Ti5zb3VyY2VPcmRlci1GLnNvdXJjZU9yZGVyKSxIPWc+MT8oMCxZZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnaW5hdGlvbiIsY2hpbGRyZW46WygwLFllLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2UtYXJyb3ciLG9uQ2xpY2s6KCk9PnMoTT0+TWF0aC5tYXgoMCxNLTEpKSxkaXNhYmxlZDp3PT09MCxjaGlsZHJlbjoiXHUyNUMwIn0pLCgwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdlLWluZGljYXRvciIsY2hpbGRyZW46YCR7dysxfSAvICR7Z31gfSksKDAsWWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnZS1hcnJvdyIsb25DbGljazooKT0+cyhNPT5NYXRoLm1pbihnLTEsTSsxKSksZGlzYWJsZWQ6dz49Zy0xLGNoaWxkcmVuOiJcdTI1QjYifSldfSk6bnVsbCxfPU09PntsZXQgVz1iKE0udGFzay5zdGFydEF0KSxEPWIoTS50YXNrLmVuZEF0KSxOPVcmJkQmJkQ+VztyZXR1cm4oMCxZZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3ciLG9uQ2xpY2s6Rj0+e0YudGFyZ2V0LmNsb3Nlc3QoImEiKXx8VChNLnRhc2spfSxjaGlsZHJlbjpbKDAsWWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOmBhZ2VuZGEtaW5kaWNhdG9yICR7eShNLnRhc2spfWB9KSwoMCxZZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtY29udGVudCIsY2hpbGRyZW46WygwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10aW1lIix0aXRsZTpgJHtNLnRhc2suc3RhcnRBdD8iU3RhcnQiOiJEZWFkbGluZSJ9IHRpbWUgZm9yIHRhc2tgLGNoaWxkcmVuOlMoTS50YXNrLnN0YXJ0QXR8fE0udGFzay5kZWFkbGluZSl9KSwoMCxZZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpjbyhNLnRhc2suY29udGVudCl8fCJVbnRpdGxlZCB0YXNrIn19KSx4KE0udGFzayk/KDAsWWUuanN4KSgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixjbGFzc05hbWU6ImFnZW5kYS1ub3RlLWxpbmsiLG9uQ2xpY2s6Rj0+QShNLnRhc2ssRiksY2hpbGRyZW46RShNLnRhc2spfSk6bnVsbF19KSxOPygwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1kdXJhdGlvbiIsY2hpbGRyZW46TWF0aC5yb3VuZCgoRC1XKS82ZTQpKyJtIn0pOm51bGxdfSxNLnRhc2sudXVpZCl9LEs9TT0+e2xldCBXPWgoTS5ldmVudCk7cmV0dXJuKDAsWWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWl0ZW0gYWdlbmRhLXRhc2stcm93IixjaGlsZHJlbjpbKDAsWWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtaW5kaWNhdG9yIHByaW9yaXR5LW5vcm1hbCJ9KSwoMCxZZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtY29udGVudCIsY2hpbGRyZW46W00uZXZlbnQuYWxsRGF5PygwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10aW1lIixjaGlsZHJlbjoiQWxsIGRheSJ9KTpNLmV2ZW50LnN0YXJ0PygwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10aW1lIixjaGlsZHJlbjpTKE0uZXZlbnQuc3RhcnQpfSk6bnVsbCwoMCxZZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGV4dCIsY2hpbGRyZW46TS5ldmVudC50aXRsZXx8IkNhbGVuZGFyIGV2ZW50In0pLE0uZXZlbnQuY2FsZW5kYXI/Lm5hbWU/KDAsWWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLW5vdGUtbGluayIsY2hpbGRyZW46TS5ldmVudC5jYWxlbmRhci5uYW1lfSk6bnVsbF19KSxXPygwLFllLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1kdXJhdGlvbiIsY2hpbGRyZW46VysibSJ9KTpudWxsXX0sYGNhbC0ke00uaW5kZXh9YCl9O3JldHVybigwLFllLmpzeCkocmUse2hlYWRlckFjdGlvbnM6SCx3aWRnZXRJZDoiYWdlbmRhIixjaGlsZHJlbjooMCxZZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1saXN0IixyZWY6bCxjaGlsZHJlbjp2Lm1hcChNPT57bGV0IFc9cltNXXx8W10sRD1QKFcpLE49dzAodCxNKSxGPUkoTSxOLEQpO3JldHVybigwLFllLmpzeHMpKCJzZWN0aW9uIix7Y2xhc3NOYW1lOiJhZ2VuZGEtZGF5IixjaGlsZHJlbjpbKDAsWWUuanN4KSgiaDQiLHtjbGFzc05hbWU6ImFnZW5kYS1kYXRlLWxhYmVsIixjaGlsZHJlbjpDKE0pfSksRC5sZW5ndGg9PT0wJiZOLmxlbmd0aD09PTA/KDAsWWUuanN4KSgicCIse2NsYXNzTmFtZToiYWdlbmRhLWVtcHR5LWRheSIsY2hpbGRyZW46TT09PWQ/Ik5vIHRhc2tzIHNjaGVkdWxlZCBmb3IgdG9kYXkiOiJObyB0YXNrcyBzY2hlZHVsZWQifSk6Ri5tYXAoWT0+WS50eXBlPT09InRhc2siP18oWSk6SyhZKSldfSxNKX0pfSl9KX12YXIgazA9TChtZSgpKTt2YXIgVG49TChYKCkpO2Z1bmN0aW9uIE9tKHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGN1cnJlbnREYXRlOm4sZ3JpZEhlaWdodFNpemU6byxncmlkV2lkdGhTaXplOnIsb25EYXRlU2VsZWN0OmEsb25PcGVuU2V0dGluZ3M6aSxvcGVuVGFza3M6cyxzZWxlY3RlZERhdGU6bCx3ZWVrRm9ybWF0OmR9KXtsZXQgYz1uZXcgRGF0ZShuKSxbdSxwXT0oMCxrMC51c2VTdGF0ZSkobmV3IERhdGUoYy5nZXRGdWxsWWVhcigpLGMuZ2V0TW9udGgoKSwxKSksZj1kPT09Im1vbmRheSI/MTowLG09bmV3IERhdGUodS5nZXRGdWxsWWVhcigpLHUuZ2V0TW9udGgoKSsxLDApLmdldERhdGUoKSxnPShuZXcgRGF0ZSh1LmdldEZ1bGxZZWFyKCksdS5nZXRNb250aCgpLDEpLmdldERheSgpLWYrNyklNyx3PWY9PT0xP1siTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIiwiU3UiXTpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0sdj17fSx5PXUuZ2V0RnVsbFllYXIoKSxiPXUuZ2V0TW9udGgoKSxoPWAke3l9LSR7U3RyaW5nKGIrMSkucGFkU3RhcnQoMiwiMCIpfS1gO1tzLHRdLmZvckVhY2goVT0+e09iamVjdC5rZXlzKFV8fHt9KS5mb3JFYWNoKEk9PntpZihJLnN0YXJ0c1dpdGgoaCkpe2xldCBIPXBhcnNlSW50KEkuc3Vic3RyaW5nKDgpLDEwKTt2W0hdPSh2W0hdfHwwKSsoVVtJXT8ubGVuZ3RofHwwKX19KX0pO2xldCBTPSgpPT5wKG5ldyBEYXRlKHUuZ2V0RnVsbFllYXIoKSx1LmdldE1vbnRoKCktMSwxKSkseD0oKT0+cChuZXcgRGF0ZSh1LmdldEZ1bGxZZWFyKCksdS5nZXRNb250aCgpKzEsMSkpLEU9dS50b0xvY2FsZVN0cmluZygiZGVmYXVsdCIse21vbnRoOiJsb25nIix5ZWFyOiJudW1lcmljIn0pLFQ9VT0+VT09PWMuZ2V0RGF0ZSgpJiZ1LmdldE1vbnRoKCk9PT1jLmdldE1vbnRoKCkmJnUuZ2V0RnVsbFllYXIoKT09PWMuZ2V0RnVsbFllYXIoKSxBPVU9PntsZXQgST11LmdldEZ1bGxZZWFyKCksSD1TdHJpbmcodS5nZXRNb250aCgpKzEpLnBhZFN0YXJ0KDIsIjAiKSxfPVN0cmluZyhVKS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCR7SX0tJHtIfS0ke199YH0sQz1VPT5sJiZBKFUpPT09bCxPPVU9PntpZihhKXtsZXQgST1BKFUpO2EoST09PWw/bnVsbDpJKX19LFA9W107Zm9yKGxldCBVPTA7VTxnO1UrKylQLnB1c2goKDAsVG4uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtY2VsbCBlbXB0eSJ9LCJlbXB0eS0iK1UpKTtmb3IobGV0IFU9MTtVPD1tO1UrKyl7bGV0IEk9dltVXXx8MCxIPUk9PT0wPyJub25lIjpJPD0yPyIjODZlZmFjIjpJPD01PyIjZmJiZjI0IjoiI2Y4NzE3MSIsXz0iY2FsLWNlbGwiO1QoVSkmJihfKz0iIHRvZGF5IiksQyhVKSYmKF8rPSIgc2VsZWN0ZWQiKSxQLnB1c2goKDAsVG4uanN4cykoImRpdiIse2NsYXNzTmFtZTpfLG9uQ2xpY2s6KCk9Pk8oVSksY2hpbGRyZW46WygwLFRuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1kYXkiLGNoaWxkcmVuOlV9KSxIIT09Im5vbmUiPygwLFRuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1kb3QiLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6SH19KTpudWxsXX0sVSkpfXJldHVybigwLFRuLmpzeHMpKHJlLHtjb25maWd1cmFibGU6ITAsZ3JpZEhlaWdodFNpemU6byxncmlkV2lkdGhTaXplOnIsb25Db25maWd1cmU6aSx3aWRnZXRJZDoiY2FsZW5kYXIiLGNoaWxkcmVuOlsoMCxUbi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtbmF2IixjaGlsZHJlbjpbKDAsVG4uanN4KSgiYnV0dG9uIix7b25DbGljazpTLGNsYXNzTmFtZToiY2FsLWFycm93IixjaGlsZHJlbjoiXHUyNUMwIn0pLCgwLFRuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1tb250aCIsY2hpbGRyZW46RX0pLCgwLFRuLmpzeCkoImJ1dHRvbiIse29uQ2xpY2s6eCxjbGFzc05hbWU6ImNhbC1hcnJvdyIsY2hpbGRyZW46Ilx1MjVCNiJ9KV19KSwoMCxUbi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtZ3JpZCIsY2hpbGRyZW46W3cubWFwKFU9PigwLFRuLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY2FsLWhlYWRlciIsY2hpbGRyZW46VX0sVSkpLFBdfSldfSl9ZnVuY3Rpb24gREMoZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYodHlwZW9mIGU9PSJvYmplY3QiKXJldHVybiBlO3RyeXtsZXQgdD1KU09OLnBhcnNlKGUpO3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCI/dDpudWxsfWNhdGNoe3JldHVybiBudWxsfX1mdW5jdGlvbiBBQyhlKXtsZXQgdD1EQyhlPy5bQi5SRU5ERVJfQlJFQURDUlVNQl0pO3JldHVybiB0P3ticmVhZGNydW1iOnQsY3Jhc2hlZDp0LnNldHRsZWRBdD09bnVsbH06bnVsbH1mdW5jdGlvbiB4MChlKXtsZXQgdD1BQyhlKTtpZighdHx8IXQuY3Jhc2hlZClyZXR1cm4gbnVsbDtsZXR7YnJlYWRjcnVtYjpufT10O3JldHVybiBrKGBbY3Jhc2gtYnJlYWRjcnVtYl0gcHJpb3Igc2Vzc2lvbiBkaWQgbm90IHJlYWNoIGxvYWQtc2V0dGxlIFx1MjAxNCBsaWtlbHkgT09NLiB3aWRnZXRzOiR7bi53aWRnZXRDb3VudH0gdGllcjoke24udGllcn0gbW9iaWxlOiR7bi5tb2JpbGV9YCxuLndpZGdldElkcyksQmUoImRhc2hib2FyZFByaW9yQ3Jhc2giLHtjb3JlczpuLmNvcmVzPz8idW5rbm93biIsbWVtb3J5R2I6bi5tZW1vcnlHYj8/InVua25vd24iLHRpZXI6bi50aWVyPz8idW5rbm93biIsd2lkZ2V0Q291bnQ6bi53aWRnZXRDb3VudD8/MH0pLG59YXN5bmMgZnVuY3Rpb24gUzAoZSx7ZGV2aWNlUHJvZmlsZTp0LHN0YXJ0ZWRBdDpuLHdpZGdldElkczpvfSl7bGV0IHI9e2NvcmVzOnQ/LmNvcmVzPz9udWxsLG1lbW9yeUdiOnQ/Lm1lbW9yeUdiPz9udWxsLG1vYmlsZTohIXQ/Lm1vYmlsZSxzZXR0bGVkQXQ6bnVsbCxzdGFydGVkQXQ6bix0aWVyOnQ/LnRpZXI/P251bGwsd2lkZ2V0Q291bnQ6by5sZW5ndGgsd2lkZ2V0SWRzOm99O3JldHVybiBhd2FpdCBlLnNldFNldHRpbmcoQi5SRU5ERVJfQlJFQURDUlVNQixKU09OLnN0cmluZ2lmeShyKSkscn1hc3luYyBmdW5jdGlvbiBFMChlLHtkZXZpY2VQcm9maWxlOnQsc2V0dGxlZEF0Om4sc3RhcnRlZEF0Om8sd2lkZ2V0SWRzOnJ9KXtsZXQgYT17Y29yZXM6dD8uY29yZXM/P251bGwsbWVtb3J5R2I6dD8ubWVtb3J5R2I/P251bGwsbW9iaWxlOiEhdD8ubW9iaWxlLHNldHRsZWRBdDpuLHN0YXJ0ZWRBdDpvLHRpZXI6dD8udGllcj8/bnVsbCx3aWRnZXRDb3VudDpyLmxlbmd0aCx3aWRnZXRJZHM6cn07YXdhaXQgZS5zZXRTZXR0aW5nKEIuUkVOREVSX0JSRUFEQ1JVTUIsSlNPTi5zdHJpbmdpZnkoYSkpfXZhciBqbj1MKG1lKCkpO3ZhciBuZT1MKFgoKSk7ZnVuY3Rpb24gSW0oZSx0LG4pe3QhPT1uJiZCZShuPyJhZGREYXNoYm9hcmRDb21wb25lbnQiOiJyZW1vdmVEYXNoYm9hcmRDb21wb25lbnQiLHt3aWRnZXRJZDplfSl9ZnVuY3Rpb24gRDAoZSl7cmV0dXJuIE10LmZpbmQodD0+dC53aWRnZXRJZD09PWUpfWZ1bmN0aW9uIENDKGUsdCl7bGV0IG49bmV3IFNldCh0fHxbXSksbz1NdC5tYXAocz0+cy53aWRnZXRJZCkuZmlsdGVyKHM9PiFuLmhhcyhzKSksYT0oQXJyYXkuaXNBcnJheShlKT9lOltdKS5tYXAocz0+cy53aWRnZXRJZCkuZmlsdGVyKHM9Pm8uaW5jbHVkZXMocykpLGk9by5maWx0ZXIocz0+IWEuaW5jbHVkZXMocykpO3JldHVybntyZW5kZXJlZElkczphLGhpZGRlbklkczppfX1mdW5jdGlvbiBOMChlLHQpe2xldCBuPW5ldyBTZXQodHx8W10pLG89e307cmV0dXJuIE10LmZpbHRlcihhPT4hbi5oYXMoYS53aWRnZXRJZCkpLmZvckVhY2goYT0+e29bYS53aWRnZXRJZF09e2dyaWRXaWR0aFNpemU6YS5kZWZhdWx0R3JpZFdpZHRoU2l6ZXx8MSxncmlkSGVpZ2h0U2l6ZToxfX0pLChBcnJheS5pc0FycmF5KGUpP2U6W10pLmZvckVhY2goYT0+e29bYS53aWRnZXRJZF0mJihvW2Eud2lkZ2V0SWRdPXtncmlkV2lkdGhTaXplOmEuZ3JpZFdpZHRoU2l6ZXx8b1thLndpZGdldElkXS5ncmlkV2lkdGhTaXplLGdyaWRIZWlnaHRTaXplOmEuZ3JpZEhlaWdodFNpemV8fDF9KX0pLG99ZnVuY3Rpb24gTUMoZSx0LG4sbyl7bGV0IHI9Wy4uLmUsLi4udF0sYT1yLmluZGV4T2Yobik7aWYobz09PSJ1cCImJmE9PT0wfHxvPT09ImRvd24iJiZhPT09ci5sZW5ndGgtMSlyZXR1cm4gbnVsbDtsZXQgaT1bLi4ucl0scz1vPT09InVwIj9hLTE6YSsxO3JldHVybltpW2FdLGlbc11dPVtpW3NdLGlbYV1dLHtyZW5kZXJlZElkczppLnNsaWNlKDAsZS5sZW5ndGgpLGhpZGRlbklkczppLnNsaWNlKGUubGVuZ3RoKX19ZnVuY3Rpb24gT0MoZSx0LG4sbyl7bGV0IHI9ZS5maWx0ZXIoaT0+aSE9PW4pLGE9dC5maWx0ZXIoaT0+aSE9PW4pO3JldHVybiBlLmluY2x1ZGVzKG8pP3Iuc3BsaWNlKHIuaW5kZXhPZihvKSwwLG4pOmEuc3BsaWNlKGEuaW5kZXhPZihvKSwwLG4pLHtyZW5kZXJlZElkczpyLGhpZGRlbklkczphfX1mdW5jdGlvbiBJQyhlLHQsbixvKXtsZXQgcj1lLmZpbHRlcihpPT5pIT09biksYT10LmZpbHRlcihpPT5pIT09bik7cmV0dXJuKG89PT0icmVuZGVyZWQiP3I6YSkucHVzaChuKSx7cmVuZGVyZWRJZHM6cixoaWRkZW5JZHM6YX19ZnVuY3Rpb24gUkMoe3dpZGdldElkOmUsY3R4OnR9KXtsZXQgbj1EMChlKTtpZighbilyZXR1cm4gbnVsbDtsZXQgbz1bLi4udC5yZW5kZXJlZElkcywuLi50LmhpZGRlbklkc10scj1vLmluZGV4T2YoZSksYT1bImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbSIsdC5kcmFnZ2luZ0lkPT09ZT8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLS1kcmFnZ2luZyI6IiIsdC5kcmFnT3ZlcklkPT09ZT8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLS1kcmFnLW92ZXIiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpO3JldHVybigwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6YSxkcmFnZ2FibGU6ITAsb25EcmFnU3RhcnQ6aT0+dC5vbkRyYWdTdGFydChpLGUpLG9uRHJhZ0VuZDp0Lm9uRHJhZ0VuZCxvbkRyYWdPdmVyOmk9PnQub25EcmFnT3Zlckl0ZW0oaSxlKSxvbkRyb3A6aT0+dC5vbkRyb3BPbkl0ZW0oaSxlKSxjaGlsZHJlbjpbKDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWhhbmRsZSIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46Ilx1MjgzRiJ9KSwoMCxuZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46bi5pY29ufSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWluZm8iLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tbmFtZSIsY2hpbGRyZW46bi5uYW1lfSksbi5kZXNjcmlwdGlvbiYmKDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWRlc2NyaXB0aW9uIixjaGlsZHJlbjpuLmRlc2NyaXB0aW9ufSldfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtYXJyb3ctYnV0dG9uIix0eXBlOiJidXR0b24iLGRpc2FibGVkOnI9PT0wLHRpdGxlOiJNb3ZlIHVwIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtuLm5hbWV9IHVwYCxvbkNsaWNrOmk9PntpLnN0b3BQcm9wYWdhdGlvbigpLHQub25Nb3ZlKGUsInVwIil9LGNoaWxkcmVuOiJcdTIxOTEifSksKDAsbmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWFycm93LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpyPT09by5sZW5ndGgtMSx0aXRsZToiTW92ZSBkb3duIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtuLm5hbWV9IGRvd25gLG9uQ2xpY2s6aT0+e2kuc3RvcFByb3BhZ2F0aW9uKCksdC5vbk1vdmUoZSwiZG93biIpfSxjaGlsZHJlbjoiXHUyMTkzIn0pXX0pXX0pfWZ1bmN0aW9uIFQwKHtzZWN0aW9uSWQ6ZSxsYWJlbDp0LGljb246bixpdGVtczpvLGN0eDpyfSl7bGV0IGE9WyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24iLHIuZHJhZ092ZXJTZWN0aW9uPT09ZT8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLS1kcmFnLW92ZXIiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpO3JldHVybigwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6YSxvbkRyYWdPdmVyOmk9PnIub25EcmFnT3ZlclNlY3Rpb24oaSxlKSxvbkRyYWdMZWF2ZTpyLm9uRHJhZ0xlYXZlU2VjdGlvbixvbkRyb3A6aT0+ci5vbkRyb3BPblNlY3Rpb24oaSxlKSxjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLWhlYWRlciIsY2hpbGRyZW46WygwLG5lLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIixjaGlsZHJlbjpufSksKDAsbmUuanN4KSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi10aXRsZSIsY2hpbGRyZW46dH0pXX0pLG8ubGVuZ3RoPT09MD8oMCxuZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtZW1wdHkiLGNoaWxkcmVuOmU9PT0icmVuZGVyZWQiPyJEcmFnIGNvbXBvbmVudHMgaGVyZSB0byBzaG93IHRoZW0gb24gdGhlIGRhc2hib2FyZCI6IkFsbCBjb21wb25lbnRzIGFyZSBjdXJyZW50bHkgc2hvd24ifSk6KDAsbmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWxpc3QiLGNoaWxkcmVuOm8ubWFwKGk9PigwLG5lLmpzeCkoUkMse3dpZGdldElkOmksY3R4OnJ9LGkpKX0pXX0pfWZ1bmN0aW9uIFBDKHt3aWRnZXRJZDplLHNpemluZzp0LG9uU2l6aW5nQ2hhbmdlOm59KXtsZXQgbz1EMChlKTtpZighbylyZXR1cm4gbnVsbDtsZXQgcj10W2VdPy5ncmlkV2lkdGhTaXplPz9vLmRlZmF1bHRHcmlkV2lkdGhTaXplPz8xLGE9dFtlXT8uZ3JpZEhlaWdodFNpemU/PzEsaT1vLm1heEhvcml6b250YWxUaWxlc3x8NCxzPW8ubWF4VmVydGljYWxUaWxlc3x8MjtyZXR1cm4oMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtIixjaGlsZHJlbjpbKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbS1oZWFkZXIiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46by5pY29ufSksKDAsbmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLW5hbWUiLGNoaWxkcmVuOm8ubmFtZX0pXX0pLCgwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWl0ZW0tY29udHJvbHMiLGNoaWxkcmVuOlsoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1maWVsZCIsY2hpbGRyZW46WygwLG5lLmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1sYWJlbCIsY2hpbGRyZW46IldpZHRoIn0pLCgwLG5lLmpzeCkoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctc2VsZWN0Iix2YWx1ZTpyLG9uQ2hhbmdlOmw9Pm4oZSwiZ3JpZFdpZHRoU2l6ZSIsTnVtYmVyKGwudGFyZ2V0LnZhbHVlKSksY2hpbGRyZW46QXJyYXkuZnJvbSh7bGVuZ3RoOml9LChsLGQpPT4oMCxuZS5qc3gpKCJvcHRpb24iLHt2YWx1ZTpkKzEsY2hpbGRyZW46YCR7ZCsxfWB9LGQrMSkpfSldfSksKDAsbmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctZmllbGQiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctbGFiZWwiLGNoaWxkcmVuOiJWZXJ0aWNhbCB0aWxlcyJ9KSwoMCxuZS5qc3gpKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLXNlbGVjdCIsdmFsdWU6YSxvbkNoYW5nZTpsPT5uKGUsImdyaWRIZWlnaHRTaXplIixOdW1iZXIobC50YXJnZXQudmFsdWUpKSxjaGlsZHJlbjpBcnJheS5mcm9tKHtsZW5ndGg6c30sKGwsZCk9PigwLG5lLmpzeCkoIm9wdGlvbiIse3ZhbHVlOmQrMSxjaGlsZHJlbjpgJHtkKzF9YH0sZCsxKSl9KV19KV19KV19KX1mdW5jdGlvbiBMQyhlLHQpe2xldHtyZW5kZXJlZElkczpuLGhpZGRlbklkczpvfT1DQyhlLHQpLFtyLGFdPSgwLGpuLnVzZVN0YXRlKShuKSxbaSxzXT0oMCxqbi51c2VTdGF0ZSkobyksW2wsZF09KDAsam4udXNlU3RhdGUpKCgpPT5OMChlLHQpKSxbYyx1XT0oMCxqbi51c2VTdGF0ZSkobnVsbCksW3AsZl09KDAsam4udXNlU3RhdGUpKG51bGwpLFttLGddPSgwLGpuLnVzZVN0YXRlKShudWxsKSx3PSgwLGpuLnVzZVJlZikobnVsbCksW3YseV09KDAsam4udXNlU3RhdGUpKCExKSxiPSgpPT57dy5jdXJyZW50PW51bGwsdShudWxsKSxmKG51bGwpLGcobnVsbCl9O3JldHVybntyZW5kZXJlZElkczpyLGhpZGRlbklkczppLHNpemluZzpsLGRyYWdnaW5nSWQ6YyxkcmFnT3ZlcklkOnAsZHJhZ092ZXJTZWN0aW9uOm0saGFzUmVzZXQ6dixvbk1vdmU6KEksSCk9PntsZXQgXz1NQyhyLGksSSxIKTtfJiYoSW0oSSxyLmluY2x1ZGVzKEkpLF8ucmVuZGVyZWRJZHMuaW5jbHVkZXMoSSkpLGEoXy5yZW5kZXJlZElkcykscyhfLmhpZGRlbklkcykpfSxvbkRyYWdTdGFydDooSSxIKT0+e3cuY3VycmVudD1ILEkuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dShIKSl9LG9uRHJhZ0VuZDooKT0+YigpLG9uRHJhZ092ZXJJdGVtOihJLEgpPT57SS5wcmV2ZW50RGVmYXVsdCgpLEkuc3RvcFByb3BhZ2F0aW9uKCksSS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0ibW92ZSIsZihIKSxnKG51bGwpfSxvbkRyYWdPdmVyU2VjdGlvbjooSSxIKT0+e0kucHJldmVudERlZmF1bHQoKSxJLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJtb3ZlIixnKEgpLGYobnVsbCl9LG9uRHJhZ0xlYXZlU2VjdGlvbjpJPT57SS5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKEkucmVsYXRlZFRhcmdldCl8fGcobnVsbCl9LG9uRHJvcE9uSXRlbTooSSxIKT0+e0kucHJldmVudERlZmF1bHQoKSxJLnN0b3BQcm9wYWdhdGlvbigpO2xldCBfPXcuY3VycmVudDtpZihiKCksIV98fF89PT1IKXJldHVybjtsZXR7cmVuZGVyZWRJZHM6SyxoaWRkZW5JZHM6TX09T0MocixpLF8sSCk7SW0oXyxyLmluY2x1ZGVzKF8pLEsuaW5jbHVkZXMoXykpLGEoSykscyhNKX0sb25Ecm9wT25TZWN0aW9uOihJLEgpPT57SS5wcmV2ZW50RGVmYXVsdCgpO2xldCBfPXcuY3VycmVudDtpZihiKCksIV8pcmV0dXJuO2xldHtyZW5kZXJlZElkczpLLGhpZGRlbklkczpNfT1JQyhyLGksXyxIKTtJbShfLHIuaW5jbHVkZXMoXyksSy5pbmNsdWRlcyhfKSksYShLKSxzKE0pfSxvblNpemluZ0NoYW5nZTooSSxILF8pPT57ZChLPT4oey4uLkssW0ldOnsuLi5LW0ldLFtIXTpffX0pKX0sb25SZXNldDpJPT57bGV0IEg9bmV3IFNldCh0fHxbXSksXz1CYihJKTtpZihfKXtsZXQgSz1fLndpZGdldHMubWFwKFc9Plcud2lkZ2V0SWQpLmZpbHRlcihXPT4hSC5oYXMoVykpLE09TXQubWFwKFc9Plcud2lkZ2V0SWQpLmZpbHRlcihXPT4hSC5oYXMoVykpO2EoSykscyhNLmZpbHRlcihXPT4hSy5pbmNsdWRlcyhXKSkpLGQoYnMoXykpfWVsc2V7bGV0IEs9TXQubWFwKE09Pk0ud2lkZ2V0SWQpLmZpbHRlcihNPT4hSC5oYXMoTSkpO2EoSykscyhbXSksZChOMChudWxsLHQpKX15KCEwKX19fWZ1bmN0aW9uIFJtKHtjdXJyZW50TGF5b3V0OmUsZXhjbHVkZVdpZGdldElkczp0LG9uU2F2ZTpuLG9uQ2FuY2VsOm8sc2VsZWN0ZWRMYXlvdXRQcm9maWxlOnJ9KXtsZXRbYSxpXT0oMCxqbi51c2VTdGF0ZSkoImNvbXBvbmVudHMiKSxbcyxsXT0oMCxqbi51c2VTdGF0ZSkocnx8bnVsbCksZD1MQyhlLHQpLHtyZW5kZXJlZElkczpjLGhpZGRlbklkczp1LHNpemluZzpwLGhhc1Jlc2V0OmYsb25SZXNldDptLG9uU2l6aW5nQ2hhbmdlOmd9PWQsdz1hPT09ImNvbXBvbmVudHMiPygwLG5lLmpzeHMpKG5lLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsbmUuanN4KShUMCx7c2VjdGlvbklkOiJyZW5kZXJlZCIsbGFiZWw6IlJlbmRlcmVkIERhc2hib2FyZCBFbGVtZW50cyIsaWNvbjoiXHV7MUY0NDF9IixpdGVtczpjLGN0eDpkfSksKDAsbmUuanN4KShUMCx7c2VjdGlvbklkOiJoaWRkZW4iLGxhYmVsOiJIaWRkZW4gRGFzaGJvYXJkIEVsZW1lbnRzIixpY29uOiJcdXsxRjZBQn0iLGl0ZW1zOnUsY3R4OmR9KV19KTpjLmxlbmd0aD09PTA/KDAsbmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWVtcHR5IixjaGlsZHJlbjoiTm8gcmVuZGVyZWQgY29tcG9uZW50cy4gQWRkIGNvbXBvbmVudHMgaW4gdGhlIENvbXBvbmVudHMgdGFiLiJ9KTooMCxuZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nIixjaGlsZHJlbjpjLm1hcCh2PT4oMCxuZS5qc3gpKFBDLHt3aWRnZXRJZDp2LHNpemluZzpwLG9uU2l6aW5nQ2hhbmdlOmd9LHYpKX0pO3JldHVybigwLG5lLmpzeCkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLW92ZXJsYXkiLG9uQ2xpY2s6dj0+di50YXJnZXQ9PT12LmN1cnJlbnRUYXJnZXQmJm8oKSxjaGlsZHJlbjooMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtY29udGFpbmVyIGRhc2hib2FyZC1sYXlvdXQtcG9wdXAiLGNoaWxkcmVuOlsoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtaGVhZGVyIixjaGlsZHJlbjpbKDAsbmUuanN4KSgiaDMiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC10aXRsZSIsY2hpbGRyZW46Ilx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgTGF5b3V0In0pLCgwLG5lLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZXhwbGFuYXRpb24tcGFyYWdyYXBoIixjaGlsZHJlbjoiQ3VzdG9taXplIHRoZSBvcmRlciBvZiB5b3VyIHdpZGdldHMgYnkgZHJhZ2dpbmcgb3Igc2l6aW5nIHRoZW0gaW4gdGhpcyBtZW51LiBZb3UgY2FuIGFsc28gcmVvcmRlciB3aWRnZXRzIG91dHNpZGUgdGhpcyBtZW51IGJ5IGNsaWNraW5nIG9uIHRoZWlyIGhlYWRlciBmb3IgMiBzZWNvbmRzIHRvIGVuZ2FnZSBkcmFnIHJlb3JkZXJpbmcuIn0pLCgwLG5lLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImV4cGxhbmF0aW9uLXBhcmFncmFwaCIsY2hpbGRyZW46WygwLG5lLmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXByb2ZpbGUtbGFiZWwiLGNoaWxkcmVuOiJEZWZhdWx0IGxheW91dCJ9KSwoMCxuZS5qc3hzKSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXByb2ZpbGUtc2VsZWN0Iix2YWx1ZTpzfHwiIixvbkNoYW5nZTp2PT5sKHYudGFyZ2V0LnZhbHVlfHxudWxsKSxjaGlsZHJlbjpbKDAsbmUuanN4KSgib3B0aW9uIix7dmFsdWU6IiIsY2hpbGRyZW46IkN1c3RvbSAobm8gcHJlc2V0KSJ9KSxaYS5tYXAodj0+KDAsbmUuanN4KSgib3B0aW9uIix7dmFsdWU6di5pZCxjaGlsZHJlbjp2Lm5hbWV9LHYuaWQpKV19KV19KSwoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXRhYnMiLGNoaWxkcmVuOlsoMCxuZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtdGFiIisoYT09PSJjb21wb25lbnRzIj8iIGFjdGl2ZSI6IiIpLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+aSgiY29tcG9uZW50cyIpLGNoaWxkcmVuOiJDb21wb25lbnRzIn0pLCgwLG5lLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC10YWIiKyhhPT09InNpemluZyI/IiBhY3RpdmUiOiIiKSx0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmkoInNpemluZyIpLGNoaWxkcmVuOiJTaXppbmcifSldfSldfSksKDAsbmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYm9keSBkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWJvZHkiLGNoaWxkcmVuOnd9KSwoMCxuZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYWN0aW9ucyIsY2hpbGRyZW46WygwLG5lLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWxpbmsiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+bShzKSxjaGlsZHJlbjoiUmVzZXQgdG8gZGVmYXVsdHMifSksKDAsbmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOm8sY2hpbGRyZW46IkNhbmNlbCJ9KSwoMCxuZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PntCZSgic2F2ZURhc2hib2FyZExheW91dCIse3dpZGdldENvdW50OmMubGVuZ3RofSksbihjLGYscCxzKX0sY2hpbGRyZW46IlNhdmUgTGF5b3V0In0pXX0pXX0pfSl9dmFyIEEwPSJNaXNzaW9uIENvbnRyb2wgRGFzaGJvYXJkOiBwbHVnaW4gc2V0dGluZ3MiO2Z1bmN0aW9uIEMwKCl7dHJ5e2xldHtob3VyQ3ljbGU6ZX09bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodm9pZCAwLHtob3VyOiJudW1lcmljIn0pLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBlPT09ImgyMyJ8fGU9PT0iaDI0Ij8iMjRoIjoibWVyaWRpYW4ifWNhdGNoe3JldHVybiJtZXJpZGlhbiJ9fWZ1bmN0aW9uIE0wKCl7dHJ5e2xldCBlPW5ldyBJbnRsLkxvY2FsZShuYXZpZ2F0b3IubGFuZ3VhZ2UpLHQ9ZS53ZWVrSW5mb3x8ZS5nZXRXZWVrSW5mbz8uKCk7cmV0dXJuIHQ/LmZpcnN0RGF5PT09N3x8dD8uZmlyc3REYXk9PT0wPyJzdW5kYXkiOiJtb25kYXkifWNhdGNoe3JldHVybiJtb25kYXkifX1mdW5jdGlvbiBfQyhlKXtsZXQgdD17fTtpZighZSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZS5zcGxpdChgCmApKXtsZXQgbz1uLm1hdGNoKC9eKFteOl0rKTpccyooLispLyk7aWYoIW8pY29udGludWU7bGV0IHI9b1sxXS50cmltKCkudG9Mb3dlckNhc2UoKSxhPW9bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7cj09PSJ0aW1lIGZvcm1hdCImJih0LnRpbWVGb3JtYXQ9YSkscj09PSJ3ZWVrIGZvcm1hdCImJih0LndlZWtGb3JtYXQ9YSl9cmV0dXJuIHR9ZnVuY3Rpb24gTzAoZSl7bGV0IHQ9W107cmV0dXJuIGUudGltZUZvcm1hdCYmdC5wdXNoKGBUaW1lIGZvcm1hdDogJHtlLnRpbWVGb3JtYXR9YCksZS53ZWVrRm9ybWF0JiZ0LnB1c2goYFdlZWsgZm9ybWF0OiAke2Uud2Vla0Zvcm1hdH1gKSx0LmpvaW4oYApgKX12YXIgWXM9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fYXBwPXQsdGhpcy5fbm90ZVVVSUQ9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfWFzeW5jIGxvYWQoKXtsZXQgdD1hd2FpdCB0aGlzLl9hcHAuZmluZE5vdGUoe25hbWU6QTAsdGFnczpbd2VdfSk7aWYodD8udXVpZCl7dGhpcy5fbm90ZVVVSUQ9dC51dWlkO2xldCBvPWF3YWl0IHRoaXMuX2FwcC5nZXROb3RlQ29udGVudCh7dXVpZDp0LnV1aWR9KTtyZXR1cm4gdGhpcy5fc2V0dGluZ3M9X0MobyksdGhpcy5fc2V0dGluZ3MudGltZUZvcm1hdHx8KHRoaXMuX3NldHRpbmdzLnRpbWVGb3JtYXQ9QzAoKSksdGhpcy5fc2V0dGluZ3Mud2Vla0Zvcm1hdHx8KHRoaXMuX3NldHRpbmdzLndlZWtGb3JtYXQ9TTAoKSksaygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBsb2FkZWQgc2V0dGluZ3M6Iix0aGlzLl9zZXR0aW5ncyksey4uLnRoaXMuX3NldHRpbmdzfX10aGlzLl9zZXR0aW5ncz17dGltZUZvcm1hdDpDMCgpLHdlZWtGb3JtYXQ6TTAoKX07bGV0IG49YXdhaXQgdGhpcy5fYXBwLmNyZWF0ZU5vdGUoQTAsW3dlXSx7YXJjaGl2ZTohMH0pO3JldHVybiB0aGlzLl9ub3RlVVVJRD10eXBlb2Ygbj09Im9iamVjdCI/bi51dWlkOm4sYXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sTzAodGhpcy5fc2V0dGluZ3MpKSxrKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIGNyZWF0ZWQgc2V0dGluZ3Mgbm90ZToiLHRoaXMuX25vdGVVVUlEKSx7Li4udGhpcy5fc2V0dGluZ3N9fWFzeW5jIHNhdmUodCl7aWYodGhpcy5fc2V0dGluZ3M9ey4uLnRoaXMuX3NldHRpbmdzLC4uLnR9LCF0aGlzLl9ub3RlVVVJRCl7aygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBubyBub3RlVVVJRDsgY2Fubm90IHNhdmUiKTtyZXR1cm59YXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sTzAodGhpcy5fc2V0dGluZ3MpKSxrKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIHNhdmVkIHNldHRpbmdzOiIsdGhpcy5fc2V0dGluZ3MpfWdldCBzZXR0aW5ncygpe3JldHVybiB0aGlzLl9zZXR0aW5ncz97Li4udGhpcy5fc2V0dGluZ3N9Om51bGx9fTt2YXIgU2M9TChtZSgpLDEpO3ZhciBEbz1MKFgoKSwxKTtmdW5jdGlvbiBtbyh7dGl0bGU6ZSxvblN1Ym1pdDp0LG9uQ2FuY2VsOm4sc3VibWl0TGFiZWw6bz0iU3VibWl0IixjaGlsZHJlbjpyLHNjcm9sbFRvcDphfSl7bGV0IGk9KDAsU2MudXNlUmVmKShudWxsKTtyZXR1cm4oMCxTYy51c2VFZmZlY3QpKCgpPT57aWYoYT09PXZvaWQgMClyZXR1cm47bGV0IGw9ZD0+e2kuY3VycmVudCYmIWkuY3VycmVudC5jb250YWlucyhkLnRhcmdldCkmJm4oKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsbCksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsbCl9LFthLG5dKSwoMCxEby5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1vdmVybGF5IixzdHlsZTphIT09dm9pZCAwP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDphLGxlZnQ6MCxyaWdodDowLG1pbkhlaWdodDoiMTAwdmgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHBhZGRpbmc6IjE2cHgifTp2b2lkIDAsb25DbGljazphPT09dm9pZCAwP2w9PntsLnRhcmdldD09PWwuY3VycmVudFRhcmdldCYmbigpfTp2b2lkIDAsY2hpbGRyZW46KDAsRG8uanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWNvbnRhaW5lciIscmVmOmksc3R5bGU6YSE9PXZvaWQgMD97cG9pbnRlckV2ZW50czoiYXV0byJ9OnZvaWQgMCxjaGlsZHJlbjpbZT8oMCxEby5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1oZWFkZXIiLGNoaWxkcmVuOigwLERvLmpzeCkoImgzIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtdGl0bGUiLGNoaWxkcmVuOmV9KX0pOm51bGwsKDAsRG8uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYm9keSIsY2hpbGRyZW46cn0pLCgwLERvLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1hY3Rpb25zIixjaGlsZHJlbjpbKDAsRG8uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsb25DbGljazpuLGNoaWxkcmVuOiJDYW5jZWwifSksKDAsRG8uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLXN1Ym1pdCIsb25DbGljazp0LGNoaWxkcmVuOm99KV19KV19KX0pfXZhciBVQz01MCoxMDI0KjQ7dmFyIEkwPXthbnRocm9waWM6Imh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL3NldHRpbmdzL2tleXMiLCJhbnRocm9waWMtc29ubmV0IjoiaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vc2V0dGluZ3Mva2V5cyIsZGVlcHNlZWs6Imh0dHBzOi8vcGxhdGZvcm0uZGVlcHNlZWsuY29tL2FwaV9rZXlzIixnZW1pbmk6Imh0dHBzOi8vYWlzdHVkaW8uZ29vZ2xlLmNvbS9hcHAvYXBpLWtleXMiLGdyb2s6Imh0dHBzOi8vY29uc29sZS54LmFpL3RlYW0vZGVmYXVsdC9hcGkta2V5cyIsb3BlbmFpOiJodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vYXBpLWtleXMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vd3d3LnBlcnBsZXhpdHkuYWkvYWNjb3VudC9hcGkva2V5cyJ9LGhuPXthbnRocm9waWM6ImNsYXVkZS1vcHVzLTQtNiIsImFudGhyb3BpYy1zb25uZXQiOiJjbGF1ZGUtc29ubmV0LTQtNiIsZGVlcHNlZWs6ImRlZXBzZWVrLWNoYXQiLGdlbWluaToiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsZ3JvazoiZ3Jvay00LjIwIixvcGVuYWk6ImdwdC01LjQiLHBlcnBsZXhpdHk6InNvbmFyLXBybyJ9O3ZhciBQbT17YW50aHJvcGljOiJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIiwiYW50aHJvcGljLXNvbm5ldCI6Imh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiLGRlZXBzZWVrOiJodHRwczovL2FwaS5kZWVwc2Vlay5jb20vdjEvY2hhdC9jb21wbGV0aW9ucyIsZ2VtaW5pOiJodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzL3ttb2RlbC1uYW1lfTpnZW5lcmF0ZUNvbnRlbnQiLGdyb2s6Imh0dHBzOi8vYXBpLnguYWkvdjEvY2hhdC9jb21wbGV0aW9ucyIsb3BlbmFpOiJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkvY2hhdC9jb21wbGV0aW9ucyJ9LGU4PU9iamVjdC5rZXlzKFBtKSxSMD17ImNsYXVkZS1vcHVzLTQtNiI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTYiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtNS0yMDI1MDkyOSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNS0yMDI1MTAwMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTUtMjAyNTExMDEiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0xLTIwMjUwODA1IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtMCI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy03LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTAiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMjAyNTA1MTQiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTUtaGFpa3UtbGF0ZXN0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LWhhaWt1LTIwMjQxMDIyIjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLWhhaWt1LTIwMjQwMzA3IjoyMDAqMTAyNCo0fSxQMD17ImRlZXBzZWVrLWNoYXQiOjY0KjEwMjQqNCwiZGVlcHNlZWstcmVhc29uZXIiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEtMDUyOCI6NjQqMTAyNCo0fSxMMD17ImdlbWluaS0zLWZsYXNoIjo2NCoxMDI0KjQsImdlbWluaS0zLWZsYXNoLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLXByZXZpZXciOjEwMjQqMTAyNCo0LCJnZW1pbmktMy4xLXByby1wcmV2aWV3IjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLWltYWdlLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTIuNS1wcm8iOjEwMjQqMTAyNCo0LCJnZW1pbmktMi41LWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlLXByZXZpZXctMDYtMTciOjEwMjQqMTAyNCo0LCJnZW1pbmktMi4wLWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuMC1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNH0sXzA9eyJncm9rLTQtMS1mYXN0IjoyMDQ4KjEwMjQqNCwiZ3Jvay00LWZhc3QiOjIwNDgqMTAyNCo0LCJncm9rLTQiOjI1NioxMDI0KjQsImdyb2stNC4yMCI6MjU2KjEwMjQqNCwiZ3Jvay00LTA3MDkiOjI1NioxMDI0KjQsImdyb2stMyI6MTI4KjEwMjQqNCwiZ3Jvay0zLWJldGEiOjEyOCoxMDI0KjQsImdyb2stMy1taW5pIjoxMjgqMTAyNCo0LCJncm9rLTMtbWluaS1iZXRhIjoxMjgqMTAyNCo0LCJncm9rLTItdmlzaW9uLTEyMTIiOjgqMTAyNCo0LCJncm9rLTItaW1hZ2UtMTIxMiI6MTI4KjEwMjQqNCwiZ3Jvay0yLTEyMTIiOjEyOCoxMDI0KjR9LFUwPXsiZ3B0LTUuNCI6NDAwKjEwMjQqNCwiZ3B0LTUuMiI6NDAwKjEwMjQqNCwiZ3B0LTUuMSI6NDAwKjEwMjQqNCwiZ3B0LTUuMS1jb2RleC1tYXgiOjQwMCoxMDI0KjQsImdwdC01Ijo0MDAqMTAyNCo0LCJncHQtNS1mYXN0Ijo0MDAqMTAyNCo0LCJncHQtNS10aGlua2luZyI6NDAwKjEwMjQqNCwiZ3B0LTQuMSI6MWUzKjEwMjQqNCwiZ3B0LTQuMS1taW5pIjoxMjgqMTAyNCo0LCJncHQtNG8iOjEyOCoxMDI0KjQsImdwdC00by1taW5pIjoxMjgqMTAyNCo0LG8zOjIwMCoxMDI0KjQsIm8zLW1pbmkiOjIwMCoxMDI0KjQsIm8zLXBybyI6MjAwKjEwMjQqNCwibzQtbWluaSI6MjAwKjEwMjQqNCwiZ3B0LTQiOjgqMTAyNCo0LCJncHQtNC0xMTA2LXByZXZpZXciOjEyOCoxMDI0KjQsImdwdC00LTMyayI6MzIqMTAyNCo0LCJncHQtNC0zMmstMDYxMyI6MzIqMTAyNCo0LCJncHQtNC12aXNpb24tcHJldmlldyI6MTI4KjEwMjQqNH0sdDg9eyJzb25hci1wcm8iOjIwMCoxMDI0KjQsc29uYXI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nLXBybyI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nIjoxMjgqMTAyNCo0LCJzb25hci1kZWVwLXJlc2VhcmNoIjoxMjgqMTAyNCo0fSxGQz17Li4uUjAsLi4uUDAsLi4uTDAsLi4uXzAsLi4uVTB9LExtPXthbnRocm9waWM6T2JqZWN0LmtleXMoUjApLGRlZXBzZWVrOk9iamVjdC5rZXlzKFAwKSxnZW1pbmk6T2JqZWN0LmtleXMoTDApLGdyb2s6T2JqZWN0LmtleXMoXzApLG9wZW5haTpPYmplY3Qua2V5cyhVMCl9O3ZhciBnbj1MKG1lKCkpO2Z1bmN0aW9uIHpDKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2xldCBvPW5ldyBGaWxlUmVhZGVyO28ub25sb2FkPXI9PnQoci50YXJnZXQucmVzdWx0KSxvLm9uZXJyb3I9cj0+e28uYWJvcnQoKSxuKHIudGFyZ2V0LmVycm9yKX0sby5yZWFkQXNEYXRhVVJMKGUpfSl9ZnVuY3Rpb24gX20oe2FwcDplLHBsdWdpbk5vdGVVVUlEOnQsaW5pdGlhbEltYWdlVXJsOm49IiIsaW5pdGlhbE1vZGU6bz0iY292ZXIifT17fSl7bGV0W3IsYV09KDAsZ24udXNlU3RhdGUpKG4pLFtpLHNdPSgwLGduLnVzZVN0YXRlKShvKSxbbCxkXT0oMCxnbi51c2VTdGF0ZSkoITEpLFtjLHVdPSgwLGduLnVzZVN0YXRlKSghMSkscD0oMCxnbi51c2VSZWYpKG51bGwpLGY9KDAsZ24udXNlQ2FsbGJhY2spKGFzeW5jIGI9PntpZighYnx8IWIudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSl7aygiW2JnLXVwbG9hZF0gcmVqZWN0ZWQgZmlsZSAobm90IGFuIGltYWdlIG9yIG1pc3NpbmcpOiIsYj8udHlwZSk7cmV0dXJufWsoIltiZy11cGxvYWRdIHN0YXJ0aW5nIHVwbG9hZCBmb3I6IixiLm5hbWUsYi50eXBlLGIuc2l6ZSwiYnl0ZXMiKSxkKCEwKTt0cnl7bGV0IGg9YXdhaXQgekMoYik7aygiW2JnLXVwbG9hZF0gZmlsZSBjb252ZXJ0ZWQgdG8gZGF0YSBVUkwsIGxlbmd0aDoiLGgubGVuZ3RoKTtsZXQgUz1hd2FpdCBlLmF0dGFjaE5vdGVNZWRpYSh7dXVpZDp0fSxoKTtrKCJbYmctdXBsb2FkXSBhdHRhY2hOb3RlTWVkaWEgcmV0dXJuZWQgVVJMOiIsUyksUz9hKFMpOmsoIltiZy11cGxvYWRdIGF0dGFjaE5vdGVNZWRpYSByZXR1cm5lZCBmYWxzeSBVUkwgXHUyMDE0IHVwbG9hZCBtYXkgaGF2ZSBmYWlsZWQgc2lsZW50bHkiKX1jYXRjaChoKXtrKCJbYmctdXBsb2FkXSB1cGxvYWQgRkFJTEVEIHdpdGggZXhjZXB0aW9uOiIsaCl9ZmluYWxseXtkKCExKSxrKCJbYmctdXBsb2FkXSB1cGxvYWQgZmxvdyBjb21wbGV0ZSIpfX0sW10pLG09KDAsZ24udXNlQ2FsbGJhY2spKGI9PntiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSx1KCExKTtsZXQgaD1iLmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtoJiZmKGgpfSxbZl0pLGc9KDAsZ24udXNlQ2FsbGJhY2spKGI9PntiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSx1KCEwKX0sW10pLHc9KDAsZ24udXNlQ2FsbGJhY2spKGI9PntiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSx1KCExKX0sW10pLHY9KDAsZ24udXNlQ2FsbGJhY2spKGI9PntsZXQgaD1iLnRhcmdldC5maWxlcz8uWzBdO2gmJmYoaCl9LFtmXSkseT0oMCxnbi51c2VDYWxsYmFjaykoKCk9PnthKCIiKX0sW10pO3JldHVybntiYWNrZ3JvdW5kSW1hZ2VVcmw6cixiYWNrZ3JvdW5kTW9kZTppLHNldEJhY2tncm91bmRNb2RlOnMsdXBsb2FkaW5nOmwsZHJhZ092ZXI6YyxmaWxlSW5wdXRSZWY6cCxoYW5kbGVEcm9wOm0saGFuZGxlRHJhZ092ZXI6ZyxoYW5kbGVEcmFnTGVhdmU6dyxoYW5kbGVGaWxlSW5wdXRDaGFuZ2U6dixoYW5kbGVSZW1vdmVJbWFnZTp5fX12YXIgcGE9TChtZSgpKTt2YXIgSj1MKFgoKSksUnI9W3t2YWx1ZToibm9uZSIsbGFiZWw6Ik5vbmUgKGRpc2FibGUgQUkgZmVhdHVyZXMpIixhcGlLZXlQcm92aWRlcjpudWxsfSx7dmFsdWU6Im9wZW5haSIsbGFiZWw6Ik9wZW5BSSBDaGF0R1BUIixhcGlLZXlQcm92aWRlcjoib3BlbmFpIn0se3ZhbHVlOiJhbnRocm9waWMiLGxhYmVsOiJBbnRocm9waWMgT3B1cyIsYXBpS2V5UHJvdmlkZXI6ImFudGhyb3BpYyJ9LHt2YWx1ZToiYW50aHJvcGljLXNvbm5ldCIsbGFiZWw6IkFudGhyb3BpYyBTb25uZXQiLGFwaUtleVByb3ZpZGVyOiJhbnRocm9waWMifSx7dmFsdWU6ImdlbWluaSIsbGFiZWw6Ikdvb2dsZSBHZW1pbmkiLGFwaUtleVByb3ZpZGVyOiJnZW1pbmkifSx7dmFsdWU6Imdyb2siLGxhYmVsOiJHcm9rIixhcGlLZXlQcm92aWRlcjoiZ3JvayJ9XTtmdW5jdGlvbiBXQygpe2xldCBlPW5hdmlnYXRvci51c2VyQWdlbnR8fCIiLHQ9bmF2aWdhdG9yLnBsYXRmb3JtfHwiIixuPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChlKSxvPW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4xJiYvTWFjaW50b3NoLy50ZXN0KGUpO3JldHVybiBufHxvP3tsaW5rUGFyZW50aGV0aWNhbDoibG9uZy1wcmVzcywgT3BlbiBpbiBOZXcgVGFiIixub3RlOiJMb25nLXByZXNzIHRoZSBmb2xsb3dpbmcgbGluaywgdGhlbiBjaG9vc2UgT3BlbiBpbiBOZXcgVGFiIG9yIE9wZW4gaW4gQnJvd3Nlci4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06L01hY3xpUGhvbmV8aVBvZHxpUGFkLy50ZXN0KHQpfHwvTWFjIE9TIFgvLnRlc3QoZSk/e2xpbmtQYXJlbnRoZXRpY2FsOiJDbWQrY2xpY2siLG5vdGU6IkNtZC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06L1dpbi8udGVzdCh0KT97bGlua1BhcmVudGhldGljYWw6IkN0cmwrY2xpY2siLG5vdGU6IkN0cmwtY2xpY2sgdGhlIGZvbGxvd2luZyBsaW5rIHRvIG9wZW4gaXQuIEEgbm9ybWFsIGNsaWNrIG1heSBoYXZlIG5vIHZpc2libGUgZWZmZWN0LiJ9OntsaW5rUGFyZW50aGV0aWNhbDoiQ3RybCtjbGljayIsbm90ZToiQ3RybC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QifX1mdW5jdGlvbiBCQyh7YXBpS2V5OmUsYXBpS2V5VmlzaWJsZTp0LGxpbmtQYXJlbnRoZXRpY2FsOm4sbm90ZTpvLG9uQXBpS2V5Q2hhbmdlOnIsb25Qcm92aWRlckNoYW5nZTphLG9uVG9nZ2xlS2V5VmlzaWJpbGl0eTppLHByb3ZpZGVyQXBpS2V5VXJsOnMscHJvdmlkZXJOYW1lOmwsc2VsZWN0ZWRQcm92aWRlcjpkfSl7cmV0dXJuKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIixjaGlsZHJlbjpbKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIiLGNoaWxkcmVuOlsoMCxKLmpzeCkoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSIsY2hpbGRyZW46IkFJIFByb3ZpZGVyIn0pLCgwLEouanN4KSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyIsY2hpbGRyZW46IkVuYWJsZSBhbmFseXNpcyBvZiBxdWFydGVybHkgcGxhbiAmIHN1Z2dlc3RlZCB0YXNrcy4ifSldfSksKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkxMTSBQcm92aWRlciJ9KSwoMCxKLmpzeCkoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlbGVjdCIsaWQ6ImxsbS1wcm92aWRlci1zZWxlY3QiLHZhbHVlOmQsb25DaGFuZ2U6Yz0+YShjLnRhcmdldC52YWx1ZSksY2hpbGRyZW46UnIubWFwKGM9PigwLEouanN4KSgib3B0aW9uIix7dmFsdWU6Yy52YWx1ZSxjaGlsZHJlbjpjLmxhYmVsfSxjLnZhbHVlKSl9KV19KSwoMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkFQSSBLZXkifSksKDAsSi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1oaW50IixjaGlsZHJlbjpvfSksKDAsSi5qc3gpKCJhIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1saW5rIixocmVmOnMsdGFyZ2V0OiJfYmxhbmsiLHJlbDoibm9vcGVuZXIgbm9yZWZlcnJlciIsY2hpbGRyZW46YFJldHJpZXZlIHlvdXIgJHtsfSBBUEkga2V5ICgke259KSBcdTIxOTJgfSksKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1pbnB1dC1yb3ciLGNoaWxkcmVuOlsoMCxKLmpzeCkoImlucHV0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1pbnB1dCIsdHlwZTp0PyJ0ZXh0IjoicGFzc3dvcmQiLHZhbHVlOmUsb25DaGFuZ2U6Yz0+cihjLnRhcmdldC52YWx1ZSkscGxhY2Vob2xkZXI6IlBhc3RlIHlvdXIgQVBJIGtleSBoZXJlIixhdXRvQ29tcGxldGU6Im9mZiIsc3BlbGxDaGVjazohMX0pLCgwLEouanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS10b2dnbGUiLHR5cGU6ImJ1dHRvbiIsb25DbGljazppLHRpdGxlOnQ/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSIsImFyaWEtbGFiZWwiOnQ/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSIsY2hpbGRyZW46dD8iXHV7MUY2NDh9IjoiXHV7MUY0NDF9XHVGRTBGIn0pXX0pXX0pXX0pXX0pfWZ1bmN0aW9uIEhDKHtiYWNrZ3JvdW5kSW1hZ2VVcmw6ZSxiYWNrZ3JvdW5kTW9kZTp0LGRyYWdPdmVyOm4sZmlsZUlucHV0UmVmOm8sb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTpyLG9uRHJhZ0xlYXZlOmEsb25EcmFnT3ZlcjppLG9uRHJvcDpzLG9uRmlsZUlucHV0Q2hhbmdlOmwsb25SZW1vdmVJbWFnZTpkLHVwbG9hZGluZzpjfSl7cmV0dXJuKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIixjaGlsZHJlbjpbKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIiLGNoaWxkcmVuOlsoMCxKLmpzeCkoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSIsY2hpbGRyZW46IkJhY2tncm91bmQgSW1hZ2UifSksKDAsSi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIixjaGlsZHJlbjoiVXBsb2FkIGFuIGltYWdlIHRvIHVzZSBhcyB5b3VyIGRhc2hib2FyZCBiYWNrZ3JvdW5kLiJ9KV19KSwoMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCIsY2hpbGRyZW46WygwLEouanN4cykoImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lJHtuPyIgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLS1hY3RpdmUiOiIifSR7Yz8iIGRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS0tdXBsb2FkaW5nIjoiIn1gLG9uRHJvcDpzLG9uRHJhZ092ZXI6aSxvbkRyYWdMZWF2ZTphLG9uQ2xpY2s6KCk9PiFjJiZvLmN1cnJlbnQ/LmNsaWNrKCksY2hpbGRyZW46WygwLEouanN4KSgiaW5wdXQiLHtyZWY6byx0eXBlOiJmaWxlIixhY2NlcHQ6ImltYWdlLyoiLGNsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLWlucHV0IixvbkNoYW5nZTpsfSksYz8oMCxKLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0IixjaGlsZHJlbjoiVXBsb2FkaW5nLi4uIn0pOmU/KDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtcHJldmlldyIsY2hpbGRyZW46WygwLEouanN4KSgiaW1nIix7c3JjOmUsYWx0OiJCYWNrZ3JvdW5kIHByZXZpZXciLGNsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXByZXZpZXctaW1nIixvbkxvYWQ6KCk9PmsoIltzZXR0aW5ncy1wb3B1cF0gYmFja2dyb3VuZCBwcmV2aWV3IGltYWdlIGxvYWRlZCBPSzoiLGUpLG9uRXJyb3I6cD0+aygiW3NldHRpbmdzLXBvcHVwXSBiYWNrZ3JvdW5kIHByZXZpZXcgaW1hZ2UgRkFJTEVEIHRvIGxvYWQ6IixlLHAudHlwZSl9KSwoMCxKLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0IixjaGlsZHJlbjoiRHJvcCBhIG5ldyBpbWFnZSBvciBjbGljayB0byByZXBsYWNlIn0pXX0pOigwLEouanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQiLGNoaWxkcmVuOiJEcmFnICYgZHJvcCBhbiBpbWFnZSBoZXJlLCBvciBjbGljayB0byB1cGxvYWQifSldfSksZSYmKDAsSi5qc3gpKCJhIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtcmVtb3ZlLWltYWdlIixocmVmOiIjIixvbkNsaWNrOnA9PntwLnByZXZlbnREZWZhdWx0KCksZCgpfSxjaGlsZHJlbjoiUmVtb3ZlIGltYWdlIn0pXX0pLGUmJigwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkRpc3BsYXkgTW9kZSJ9KSwoMCxKLmpzeCkoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlbGVjdCIsdmFsdWU6dCxvbkNoYW5nZTpwPT5yKHAudGFyZ2V0LnZhbHVlKSxjaGlsZHJlbjpqYi5tYXAocD0+KDAsSi5qc3gpKCJvcHRpb24iLHt2YWx1ZTpwLnZhbHVlLGNoaWxkcmVuOnAubGFiZWx9LHAudmFsdWUpKX0pXX0pXX0pfWZ1bmN0aW9uIEtDKHtvbk9wZW5NZW1vcnlNZWFzdXJlbWVudDplfSl7cmV0dXJuKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIixjaGlsZHJlbjpbKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIiLGNoaWxkcmVuOlsoMCxKLmpzeCkoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSIsY2hpbGRyZW46IkRlYnVnIFRvb2xzIn0pLCgwLEouanN4KSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyIsY2hpbGRyZW46Ik1lYXN1cmUgYSB3aWRnZXQncyBhcHByb3hpbWF0ZSBpbmNyZW1lbnRhbCBKYXZhU2NyaXB0IGhlYXAgZm9vdHByaW50LiJ9KV19KSwoMCxKLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRlYnVnLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOmUsY2hpbGRyZW46Ik9wZW4gd2lkZ2V0IG1lbW9yeSBtZWFzdXJlbWVudCJ9KV19KX1mdW5jdGlvbiBHQyh7b25UaW1lRm9ybWF0Q2hhbmdlOmUsb25XZWVrRm9ybWF0Q2hhbmdlOnQsdGltZUZvcm1hdDpuLHdlZWtGb3JtYXQ6b30pe3JldHVybigwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24gc2VjdGlvbiIsY2hpbGRyZW46WygwLEouanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJoNCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tdGl0bGUiLGNoaWxkcmVuOiJUaW1lICYgRGF0ZSBGb3JtYXQifSksKDAsSi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIixjaGlsZHJlbjoiQ2hvb3NlIGhvdyB0aW1lcyBhbmQgd2Vla3MgYXJlIGRpc3BsYXllZCBhY3Jvc3MgdGhlIGRhc2hib2FyZC4ifSldfSksKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxKLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIixjaGlsZHJlbjpbKDAsSi5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IlRpbWUgRm9ybWF0In0pLCgwLEouanN4cykoImxhYmVsIix7Y2hpbGRyZW46WygwLEouanN4KSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToidGltZS1mb3JtYXQiLHZhbHVlOiJtZXJpZGlhbiIsY2hlY2tlZDpuPT09Im1lcmlkaWFuIixvbkNoYW5nZTooKT0+ZSgibWVyaWRpYW4iKX0pLCJVc2UgbWVyaWRpYW4gKGFtL3BtKSB0aW1lcyJdfSksKDAsSi5qc3hzKSgibGFiZWwiLHtjaGlsZHJlbjpbKDAsSi5qc3gpKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ0aW1lLWZvcm1hdCIsdmFsdWU6IjI0aCIsY2hlY2tlZDpuPT09IjI0aCIsb25DaGFuZ2U6KCk9PmUoIjI0aCIpfSksIjI0IGhvdXIgdGltZSJdfSldfSksKDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSIsY2hpbGRyZW46WygwLEouanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwiLGNoaWxkcmVuOiJXZWVrIEZvcm1hdCJ9KSwoMCxKLmpzeHMpKCJsYWJlbCIse2NoaWxkcmVuOlsoMCxKLmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6IndlZWstZm9ybWF0Iix2YWx1ZToic3VuZGF5IixjaGVja2VkOm89PT0ic3VuZGF5IixvbkNoYW5nZTooKT0+dCgic3VuZGF5Iil9KSwiV2VlayBiZWdpbnMgb24gU3VuZGF5Il19KSwoMCxKLmpzeHMpKCJsYWJlbCIse2NoaWxkcmVuOlsoMCxKLmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6IndlZWstZm9ybWF0Iix2YWx1ZToibW9uZGF5IixjaGVja2VkOm89PT0ibW9uZGF5IixvbkNoYW5nZTooKT0+dCgibW9uZGF5Iil9KSwiV2VlayBiZWdpbnMgb24gTW9uZGF5Il19KV19KV19KV19KX1mdW5jdGlvbiBGMChlLHQpe2lmKCF0KXJldHVybiIiO2xldCBuPSR0KHQpO3JldHVybiBuJiZlPy5bbl18fCIifWZ1bmN0aW9uIFVtKHthcHA6ZSxjb25maWdQYXJhbXM6dCxvbkNhbmNlbDpuLG9uT3Blbk1lbW9yeU1lYXN1cmVtZW50Om8sb25TYXZlOnIscGx1Z2luTm90ZVVVSUQ6YSx0aW1lRm9ybWF0Omksd2Vla0Zvcm1hdDpzfSl7bGV0W2xdPSgwLHBhLnVzZVN0YXRlKSgoKT0+dHlwZW9mIHdpbmRvdz4idSI/MDp3aW5kb3cuc2Nyb2xsWT8/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcD8/MCksZD10Py5bQi5MTE1fUFJPVklERVJfTU9ERUxdLGM9dD8uW0IuQkFDS0dST1VORF9JTUFHRV9VUkxdLHU9dD8uW0IuQkFDS0dST1VORF9JTUFHRV9NT0RFXSxwPVJyLmZpbmQoaj0+ai52YWx1ZT09PWQpfHxSclswXSxbZixtXT0oMCxwYS51c2VTdGF0ZSkoRjAodCxwLmFwaUtleVByb3ZpZGVyKSksW2csd109KDAscGEudXNlU3RhdGUpKCExKSxbdix5XT0oMCxwYS51c2VTdGF0ZSkoZHx8Im9wZW5haSIpLFtiLGhdPSgwLHBhLnVzZVN0YXRlKShpfHwibWVyaWRpYW4iKSxbUyx4XT0oMCxwYS51c2VTdGF0ZSkoc3x8InN1bmRheSIpO2soIltzZXR0aW5ncy1wb3B1cF0gcmVuZGVyaW5nIERhc2hib2FyZFNldHRpbmdzUG9wdXAsIGN1cnJlbnRCYWNrZ3JvdW5kSW1hZ2VVcmw6IixjKTtsZXR7YmFja2dyb3VuZEltYWdlVXJsOkUsYmFja2dyb3VuZE1vZGU6VCxzZXRCYWNrZ3JvdW5kTW9kZTpBLHVwbG9hZGluZzpDLGRyYWdPdmVyOk8sZmlsZUlucHV0UmVmOlAsaGFuZGxlRHJvcDpVLGhhbmRsZURyYWdPdmVyOkksaGFuZGxlRHJhZ0xlYXZlOkgsaGFuZGxlRmlsZUlucHV0Q2hhbmdlOl8saGFuZGxlUmVtb3ZlSW1hZ2U6S309X20oe2FwcDplLHBsdWdpbk5vdGVVVUlEOmEsaW5pdGlhbEltYWdlVXJsOmMsaW5pdGlhbE1vZGU6dX0pLE09UnIuZmluZChqPT5qLnZhbHVlPT09dil8fFJyWzBdLFc9STBbTS5hcGlLZXlQcm92aWRlcl0sRD1Sci5maW5kKGo9PmoudmFsdWU9PT12KT8ubGFiZWwsTj1qPT57eShqKTtsZXQgWj1Sci5maW5kKHE9PnEudmFsdWU9PT1qKXx8UnJbMF0sb2U9RjAodCxaLmFwaUtleVByb3ZpZGVyKTttKG9lKX0se2xpbmtQYXJlbnRoZXRpY2FsOkYsbm90ZTpZfT1XQygpO3JldHVybigwLEouanN4KShtbyx7dGl0bGU6Ilx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgU2V0dGluZ3MiLHNjcm9sbFRvcDpsLG9uU3VibWl0OigpPT5yKHthcGlLZXk6ZixhcGlLZXlQcm92aWRlcjpNLmFwaUtleVByb3ZpZGVyLGJhY2tncm91bmRJbWFnZVVybDpFLGJhY2tncm91bmRNb2RlOlQsbGxtUHJvdmlkZXI6dix0aW1lRm9ybWF0OmIsd2Vla0Zvcm1hdDpTfSksb25DYW5jZWw6bixzdWJtaXRMYWJlbDoiU2F2ZSBTZXR0aW5ncyIsY2hpbGRyZW46KDAsSi5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtY29udGFpbmVyIixjaGlsZHJlbjpbKDAsSi5qc3gpKEhDLHtiYWNrZ3JvdW5kSW1hZ2VVcmw6RSxiYWNrZ3JvdW5kTW9kZTpULGRyYWdPdmVyOk8sZmlsZUlucHV0UmVmOlAsb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTpBLG9uRHJhZ0xlYXZlOkgsb25EcmFnT3ZlcjpJLG9uRHJvcDpVLG9uRmlsZUlucHV0Q2hhbmdlOl8sb25SZW1vdmVJbWFnZTpLLHVwbG9hZGluZzpDfSksKDAsSi5qc3gpKEJDLHthcGlLZXk6ZixhcGlLZXlWaXNpYmxlOmcsbGlua1BhcmVudGhldGljYWw6Rixub3RlOlksb25BcGlLZXlDaGFuZ2U6bSxvblByb3ZpZGVyQ2hhbmdlOk4sb25Ub2dnbGVLZXlWaXNpYmlsaXR5OigpPT53KGo9PiFqKSxwcm92aWRlckFwaUtleVVybDpXLHByb3ZpZGVyTmFtZTpELHNlbGVjdGVkUHJvdmlkZXI6dn0pLCgwLEouanN4KShHQyx7b25UaW1lRm9ybWF0Q2hhbmdlOmgsb25XZWVrRm9ybWF0Q2hhbmdlOngsdGltZUZvcm1hdDpiLHdlZWtGb3JtYXQ6U30pLG8/KDAsSi5qc3gpKEtDLHtvbk9wZW5NZW1vcnlNZWFzdXJlbWVudDpvfSk6bnVsbF19KX0pfXZhciBLZT1MKG1lKCkpO3ZhciBobz1MKFgoKSksejA9ImRheS1za2V0Y2giLEZtPTYsQjA9MjEsVkM9MWU0LGpDPTMwMCxQcj1BcnJheS5mcm9tKHtsZW5ndGg6QjAtRm0rMX0sKGUsdCk9PkZtK3QpO2Z1bmN0aW9uIEgwKGUpe3JldHVybiBlLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHt3ZWVrZGF5OiJsb25nIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pfWZ1bmN0aW9uIFlDKGUpe3JldHVybmBEYXkgU2tldGNoICR7SDAoZSl9YH1mdW5jdGlvbiBxQyhlKXtsZXQgdD17fSxuPW5ldyBTZXQ7aWYoIWUpcmV0dXJue2VudHJpZXM6dCxodW1hbkVkaXRlZEhvdXJzOm59O2ZvcihsZXQgbyBvZiBlLnNwbGl0KGAKYCkpe2xldCByPW8ubWF0Y2goL15odW1hbi1lZGl0ZWQ6XHMqKFtcZCxcc10qKS9pKTtpZihyKXtyWzFdLnNwbGl0KCIsIikuZm9yRWFjaChkPT57bGV0IGM9cGFyc2VJbnQoZC50cmltKCksMTApO2lzTmFOKGMpfHxuLmFkZChjKX0pO2NvbnRpbnVlfWxldCBhPW8ubWF0Y2goL14oXGR7MSwyfSg/OmFtfHBtKSk6XHMqKC4qKS9pKTtpZighYSljb250aW51ZTtsZXQgaT1hWzFdLnRvTG93ZXJDYXNlKCkscz1hWzJdLnJlcGxhY2UoL1xcKyQvLCIiKS50cmltKCksbD0kQyhpKTtsIT09bnVsbCYmUHIuaW5jbHVkZXMobCkmJih0W2xdPXMpfXJldHVybntlbnRyaWVzOnQsaHVtYW5FZGl0ZWRIb3VyczpufX1mdW5jdGlvbiAkQyhlKXtsZXQgdD1lLm1hdGNoKC9eKFxkezEsMn0pKGFtfHBtKSQvaSk7aWYoIXQpcmV0dXJuIG51bGw7bGV0IG49cGFyc2VJbnQodFsxXSwxMCksbz10WzJdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIG89PT0iYW0iJiZuPT09MTI/bj0wOm89PT0icG0iJiZuIT09MTImJihuKz0xMiksbn1mdW5jdGlvbiBYQyhlLHQpe2xldCBuPVByLm1hcChvPT57bGV0IHI9ZGkobyksYT1lW29dfHwiIjtyZXR1cm5gJHtyfTogJHthfWB9KTtpZih0LnNpemU+MCl7bGV0IG89Wy4uLnRdLnNvcnQoKHIsYSk9PnItYSk7bi5wdXNoKGBodW1hbi1lZGl0ZWQ6ICR7by5qb2luKCIsIil9YCl9cmV0dXJuIG4uam9pbihgCmApfWZ1bmN0aW9uIEVjKCl7bGV0IGU9e307cmV0dXJuIFByLmZvckVhY2godD0+e2VbdF09IiJ9KSxlfWZ1bmN0aW9uIFcwKGUpe3JldHVybiBlP2UgaW5zdGFuY2VvZiBEYXRlP2UuZ2V0VGltZSgpOnR5cGVvZiBlPT0ibnVtYmVyIj9lPDFlMTA/ZSoxZTM6ZTpudWxsOm51bGx9ZnVuY3Rpb24gSkMoZSl7bGV0IHQ9VzAoZT8uc3RhcnRBdCk7aWYoIXQpcmV0dXJuW107bGV0IG49bmV3IERhdGUodCkuZ2V0SG91cnMoKSxvPVtuXSxyPVcwKGU/LmVuZEF0KTtpZighcnx8cjw9dClyZXR1cm4gbztsZXQgYT1NYXRoLmZsb29yKChyLXQpLyg2MCo2MCoxZTMpKTtmb3IobGV0IGk9MTtpPGE7aSs9MSlvLnB1c2gobitpKTtyZXR1cm4gb31mdW5jdGlvbiBRQyhlKXtpZighZT8uc3RhcnR8fCEoZS5zdGFydCBpbnN0YW5jZW9mIERhdGUpfHxlLmFsbERheSlyZXR1cm5bXTtsZXQgdD1lLnN0YXJ0LmdldEhvdXJzKCk7aWYoIWUuZW5kfHwhKGUuZW5kIGluc3RhbmNlb2YgRGF0ZSl8fGUuZW5kPD1lLnN0YXJ0KXJldHVyblt0XTtsZXQgbj1lLmVuZC5nZXRIb3VycygpKyhlLmVuZC5nZXRNaW51dGVzKCk+MD8xOjApLG89W107Zm9yKGxldCByPXQ7cjxuO3IrKylvLnB1c2gocik7cmV0dXJuIG8ubGVuZ3RoPjA/bzpbdF19ZnVuY3Rpb24gWkMoZSl7bGV0IHQ9KGU/LmNvbnRlbnR8fCIiKS5zcGxpdChgCmApWzBdO3JldHVybiBadyh0KX1mdW5jdGlvbiBlTShlLHQpe3JldHVybiB0IT09bnVsbCYmSlNPTi5zdHJpbmdpZnkoZSkhPT1KU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiB0TShlLHQsbil7bGV0IG89ey4uLmV9O3JldHVybiB0LmZvckVhY2gocj0+e2xldCBhPVpDKHIpO2EmJkpDKHIpLmZvckVhY2goaT0+e1ByLmluY2x1ZGVzKGkpJiYhb1tpXSYmIW4uaGFzKGkpJiYob1tpXT1hKX0pfSksb31mdW5jdGlvbiBuTShlLHQsbixvKXtpZighQXJyYXkuaXNBcnJheSh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlO2xldCByPWFlKG4pLGE9ey4uLmV9O3JldHVybiB0LmZvckVhY2goaT0+eyFpPy50aXRsZXx8aS5hbGxEYXl8fCEoaS5zdGFydCBpbnN0YW5jZW9mIERhdGUpfHxhZShpLnN0YXJ0KSE9PXJ8fFFDKGkpLmZvckVhY2gocz0+e1ByLmluY2x1ZGVzKHMpJiYhYVtzXSYmIW8uaGFzKHMpJiYoYVtzXT1pLnRpdGxlKX0pfSksYX1mdW5jdGlvbiBvTSh7YXBwOmUsbm90ZU5hbWU6dH0pe2xldFtuLG9dPSgwLEtlLnVzZVN0YXRlKShFYyksW3IsYV09KDAsS2UudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxbaSxzXT0oMCxLZS51c2VTdGF0ZSkoITApLFtsLGRdPSgwLEtlLnVzZVN0YXRlKShudWxsKSxbYyx1XT0oMCxLZS51c2VTdGF0ZSkobnVsbCkscD0oMCxLZS51c2VSZWYpKG51bGwpLGY9KDAsS2UudXNlUmVmKShuKSxtPSgwLEtlLnVzZVJlZikocik7Zi5jdXJyZW50PW4sbS5jdXJyZW50PXI7bGV0IGc9KDAsS2UudXNlQ2FsbGJhY2spKGFzeW5jKHksYik9PntpZighZSlyZXR1cm47bGV0IGg9WEMoeSxiKTt0cnl7bGV0IFM9bDtTfHwoUz0oYXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0fSkpPy51dWlkfHxhd2FpdCBlLmNyZWF0ZU5vdGUodCxbd2VdLHthcmNoaXZlOiEwfSksZChTKSksYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6U30saCksdSh7Li4ueX0pLGsoYFtEYXlTa2V0Y2hdIHBlcnNpc3RlZCAke3R9YCl9Y2F0Y2goUyl7aygiW0RheVNrZXRjaF0gc2F2ZSBmYWlsZWQiLFMpfX0sW2UsdCxsXSksdz0oMCxLZS51c2VDYWxsYmFjaykoKHk9VkMpPT57cC5jdXJyZW50JiZjbGVhclRpbWVvdXQocC5jdXJyZW50KSxwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2coZi5jdXJyZW50LG0uY3VycmVudCl9LHkpfSxbZ10pLHY9KDAsS2UudXNlQ2FsbGJhY2spKCgpPT57cC5jdXJyZW50JiZjbGVhclRpbWVvdXQocC5jdXJyZW50KSxnKGYuY3VycmVudCxtLmN1cnJlbnQpfSxbZ10pO3JldHVybigwLEtlLnVzZUVmZmVjdCkoKCk9PntsZXQgeT0hMTtyZXR1cm4oYXN5bmMoKT0+e3MoITApO3RyeXtsZXQgYj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnR9KTtpZih5KXJldHVybjtpZihiPy51dWlkKXtkKGIudXVpZCk7bGV0IGg9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpiLnV1aWR9KTtpZih5KXJldHVybjtsZXR7ZW50cmllczpTLGh1bWFuRWRpdGVkSG91cnM6eH09cUMoaCksRT1FYygpO3guZm9yRWFjaChUPT57U1tUXSE9PXZvaWQgMCYmKEVbVF09U1tUXSl9KSxvKEUpLGEoeCksdSh7Li4uRX0pfWVsc2V7bGV0IGg9RWMoKTtvKGgpLGEobmV3IFNldCksdShoKX19Y2F0Y2goYil7aWYoaygiW0RheVNrZXRjaF0gbG9hZCBmYWlsZWQiLGIpLCF5KXtsZXQgaD1FYygpO28oaCksYShuZXcgU2V0KSx1KGgpfX1maW5hbGx5e3l8fHMoITEpfX0pKCksKCk9Pnt5PSEwfX0sW2UsdF0pLCgwLEtlLnVzZUVmZmVjdCkoKCk9PigpPT57cC5jdXJyZW50JiZjbGVhclRpbWVvdXQocC5jdXJyZW50KX0sW10pLHtlbnRyaWVzOm4saHVtYW5FZGl0ZWRIb3VyczpyLGlzRGlydHk6ZU0obixjKSxsb2FkaW5nOmksc2F2ZU5vdzp2LHNjaGVkdWxlU2F2ZTp3LHNldEVudHJpZXM6byxzZXRIdW1hbkVkaXRlZEhvdXJzOmF9fWZ1bmN0aW9uIHJNKHthZ2VuZGFUYXNrczplLGN1cnJlbnREYXRlOnQsaHVtYW5FZGl0ZWRIb3VyczpuLGxvYWRpbmc6byxzZXRFbnRyaWVzOnJ9KXsoMCxLZS51c2VFZmZlY3QpKCgpPT57aWYoIWV8fCF0fHxvKXJldHVybjtsZXQgYT1hZSh0KSxpPWVbYV18fFtdO2kubGVuZ3RoIT09MCYmcihzPT57bGV0IGw9dE0ocyxpLG4pO3JldHVybiBKU09OLnN0cmluZ2lmeShsKT09PUpTT04uc3RyaW5naWZ5KHMpP3M6bH0pfSxbZSx0LG4sbyxyXSl9ZnVuY3Rpb24gYU0oe2NhbGVuZGFyRXZlbnRzOmUsY3VycmVudERhdGU6dCxodW1hbkVkaXRlZEhvdXJzOm4sbG9hZGluZzpvLHNldEVudHJpZXM6cn0peygwLEtlLnVzZUVmZmVjdCkoKCk9PnshZXx8IXR8fG98fHIoYT0+e2xldCBpPW5NKGEsZSx0LG4pO3JldHVybiBKU09OLnN0cmluZ2lmeShpKT09PUpTT04uc3RyaW5naWZ5KGEpP2E6aX0pfSxbZSx0LG4sbyxyXSl9ZnVuY3Rpb24gaU0oZSx0KXtpZighZSlyZXR1cm4gMDtsZXQgbj1lLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWhvdXI9IiR7dH0iXWApO3JldHVybiBuP01hdGgubWF4KDAsbi5vZmZzZXRUb3AtKGUuY2xpZW50SGVpZ2h0LW4uY2xpZW50SGVpZ2h0KS8yKTowfWZ1bmN0aW9uIHNNKHtjdXJyZW50RGF0ZTplLGxvYWRpbmc6dCxub3RlYm9va1JlZjpufSl7bGV0IG89KDAsS2UudXNlUmVmKShudWxsKSxyPSgwLEtlLnVzZVJlZikobnVsbCk7KDAsS2UudXNlRWZmZWN0KSgoKT0+e2xldCBhPWFlKGUpO2lmKCFhKXJldHVybjtpZih0KXtvLmN1cnJlbnQ9YTtyZXR1cm59aWYoby5jdXJyZW50IT09YXx8ci5jdXJyZW50PT09YSlyZXR1cm47bGV0IGk9c2V0VGltZW91dCgoKT0+e2xldCBzPW4uY3VycmVudDtpZighcylyZXR1cm47bGV0IGw9TWF0aC5taW4oQjAsTWF0aC5tYXgoRm0sbmV3IERhdGUoKS5nZXRIb3VycygpKSk7cy5zY3JvbGxUb3A9aU0ocyxsKSxvLmN1cnJlbnQ9bnVsbCxyLmN1cnJlbnQ9YX0sMCk7cmV0dXJuKCk9PmNsZWFyVGltZW91dChpKX0sW2UsdCxuXSl9ZnVuY3Rpb24gbE0oKXtsZXQgZT0oMCxLZS51c2VSZWYpKHt9KSx0PSgwLEtlLnVzZUNhbGxiYWNrKSgobyxyKT0+e3I/ZS5jdXJyZW50W29dPXI6ZGVsZXRlIGUuY3VycmVudFtvXX0sW10pO3JldHVybntoYW5kbGVJbnB1dEtleURvd246KDAsS2UudXNlQ2FsbGJhY2spKChvLHIpPT57aWYoci5rZXkhPT0iQXJyb3dEb3duIiYmci5rZXkhPT0iQXJyb3dVcCIpcmV0dXJuO2lmKHIucHJldmVudERlZmF1bHQoKSxyLnNoaWZ0S2V5KXtsZXQgZz1yLmN1cnJlbnRUYXJnZXQsdz1nLnZhbHVlLmxlbmd0aDtyLmtleT09PSJBcnJvd1VwIj9nLnNldFNlbGVjdGlvblJhbmdlKDAsdywiYmFja3dhcmQiKTpnLnNldFNlbGVjdGlvblJhbmdlKDAsdywiZm9yd2FyZCIpO3JldHVybn1sZXQgYT1Qci5pbmRleE9mKG8pO2lmKGE9PT0tMSlyZXR1cm47bGV0IGk9ci5rZXk9PT0iQXJyb3dEb3duIj8xOi0xLHM9UHJbYStpXTtpZighcylyZXR1cm47bGV0IGw9ci5jdXJyZW50VGFyZ2V0LGQ9ZS5jdXJyZW50W3NdO2lmKCFkKXJldHVybjtsZXQgYz1sLnNlbGVjdGlvblN0YXJ0LHU9bC5zZWxlY3Rpb25FbmQscD1kLnZhbHVlLmxlbmd0aCxmPWM9PT1udWxsP3A6TWF0aC5taW4oYyxwKSxtPXU9PT1udWxsP2Y6TWF0aC5taW4odSxwKTtkLmZvY3VzKCksZC5zZXRTZWxlY3Rpb25SYW5nZShmLG0pfSxbXSksc2V0SW5wdXRSZWY6dH19ZnVuY3Rpb24gZE0oe2VudHJpZXM6ZSxoYW5kbGVCbHVyOnQsaGFuZGxlSW5wdXRDaGFuZ2U6bixoYW5kbGVJbnB1dEtleURvd246byxob3VyOnIsc2V0SW5wdXRSZWY6YSx0aW1lRm9ybWF0Oml9KXtyZXR1cm4oMCxoby5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLWxpbmUiLCJkYXRhLWhvdXIiOnIsY2hpbGRyZW46WygwLGhvLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtaG91ci1sYWJlbCIsY2hpbGRyZW46ZGkocixpKX0pLCgwLGhvLmpzeCkoImlucHV0Iix7dHlwZToidGV4dCIsY2xhc3NOYW1lOiJkYXktc2tldGNoLWlucHV0Iix2YWx1ZTplW3JdfHwiIixyZWY6cz0+YShyLHMpLG9uQ2hhbmdlOnM9Pm4ocixzLnRhcmdldC52YWx1ZSksb25LZXlEb3duOnM9Pm8ocixzKSxvbkJsdXI6dCxwbGFjZWhvbGRlcjoiIiwiYXJpYS1sYWJlbCI6YCR7ZGkocixpKX0gZW50cnlgfSldfSl9ZnVuY3Rpb24gY00oe2lzRGlydHk6ZSxvblNhdmVDbGljazp0fSl7cmV0dXJuKDAsaG8uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOmBkYXktc2tldGNoLXNhdmUtYnRuJHtlPyIiOiIgZGF5LXNrZXRjaC1zYXZlLWJ0bi0tZGlzYWJsZWQifWAsZGlzYWJsZWQ6IWUsb25DbGljazp0LHRpdGxlOmU/IlNhdmUgY2hhbmdlcyI6Ik5vIHVuc2F2ZWQgY2hhbmdlcyIsY2hpbGRyZW46ZT8iU2F2ZSI6IlNhdmVkIn0pfWZ1bmN0aW9uIHptKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY3VycmVudERhdGU6byx0aW1lRm9ybWF0OnJ9KXtsZXQgYT0oMCxLZS51c2VSZWYpKG51bGwpLGk9SWUobykscz1ZQyhpKSx7aGFuZGxlSW5wdXRLZXlEb3duOmwsc2V0SW5wdXRSZWY6ZH09bE0oKSx7ZW50cmllczpjLGh1bWFuRWRpdGVkSG91cnM6dSxpc0RpcnR5OnAsbG9hZGluZzpmLHNhdmVOb3c6bSxzY2hlZHVsZVNhdmU6ZyxzZXRFbnRyaWVzOncsc2V0SHVtYW5FZGl0ZWRIb3Vyczp2fT1vTSh7YXBwOnQsbm90ZU5hbWU6c30pO3JNKHthZ2VuZGFUYXNrczplLGN1cnJlbnREYXRlOm8saHVtYW5FZGl0ZWRIb3Vyczp1LGxvYWRpbmc6ZixzZXRFbnRyaWVzOnd9KSxhTSh7Y2FsZW5kYXJFdmVudHM6bixjdXJyZW50RGF0ZTpvLGh1bWFuRWRpdGVkSG91cnM6dSxsb2FkaW5nOmYsc2V0RW50cmllczp3fSksc00oe2N1cnJlbnREYXRlOm8sbG9hZGluZzpmLG5vdGVib29rUmVmOmF9KSx1dCh6MCwhZiYmbiE9PW51bGwpO2xldCB5PSgwLEtlLnVzZUNhbGxiYWNrKSgoKT0+e2coakMpfSxbZ10pLGI9KDAsS2UudXNlQ2FsbGJhY2spKChoLFMpPT57dyh4PT4oey4uLngsW2hdOlN9KSksdih4PT5uZXcgU2V0KFsuLi54LGhdKSksZygpfSxbZyx3LHZdKTtyZXR1cm4oMCxoby5qc3gpKHJlLHtoZWFkZXJBY3Rpb25zOigwLGhvLmpzeCkoY00se2lzRGlydHk6cCxvblNhdmVDbGljazptfSksc3VidGl0bGU6SDAoaSksd2lkZ2V0SWQ6ejAsY2hpbGRyZW46KDAsaG8uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLW5vdGVib29rIixyZWY6YSxjaGlsZHJlbjpmPygwLGhvLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZGF5LXNrZXRjaC1sb2FkaW5nIixjaGlsZHJlbjoiTG9hZGluZ1x1MjAyNiJ9KTpQci5tYXAoaD0+KDAsaG8uanN4KShkTSx7ZW50cmllczpjLGhhbmRsZUJsdXI6eSxoYW5kbGVJbnB1dENoYW5nZTpiLGhhbmRsZUlucHV0S2V5RG93bjpsLGhvdXI6aCxzZXRJbnB1dFJlZjpkLHRpbWVGb3JtYXQ6cn0saCkpfSl9KX12YXIgZmE9TChtZSgpKTt2YXIgb3I9TChYKCkpLHVNPSJkZWJ1Zy1jb25zb2xlIixLMD01KjEwMjQ7ZnVuY3Rpb24gcE0oZSl7bGV0IHQ9ZS5tYXAobj0+e2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gbjtpZihuIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuYCR7bi5uYW1lfTogJHtuLm1lc3NhZ2V9YDt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pfWNhdGNoe3JldHVybiBTdHJpbmcobil9fSkuam9pbigiICIpO3JldHVybiB0Lmxlbmd0aDw9SzA/dDpgJHt0LnNsaWNlKDAsSzApfVx1MjAyNiBbdHJ1bmNhdGVkLCAke3QubGVuZ3RofSBjaGFyc11gfWZ1bmN0aW9uIFdtKCl7bGV0W2UsdF09KDAsZmEudXNlU3RhdGUpKCgpPT5paygpKSxuPSgwLGZhLnVzZVJlZikobnVsbCk7cmV0dXJuKDAsZmEudXNlRWZmZWN0KSgoKT0+e2Z1bmN0aW9uIGEoaSl7dChzPT57bGV0IGw9Wy4uLnMsaV07cmV0dXJuIGwubGVuZ3RoPjIwMD9sLnNsaWNlKC0yMDApOmx9KX1yZXR1cm4gc2soYSksKCk9PmxrKGEpfSxbXSksKDAsZmEudXNlRWZmZWN0KSgoKT0+e24uY3VycmVudCYmKG4uY3VycmVudC5zY3JvbGxUb3A9bi5jdXJyZW50LnNjcm9sbEhlaWdodCl9LFtlXSksKDAsb3IuanN4KShyZSx7d2lkZ2V0SWQ6dU0saGVhZGVyQWN0aW9uczooMCxvci5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2NsZWFyLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT50KFtdKSx0aXRsZToiQ2xlYXIgbG9nIGVudHJpZXMiLGNoaWxkcmVuOiJDbGVhciJ9KSxjaGlsZHJlbjooMCxvci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGUiLHJlZjpuLGNoaWxkcmVuOmUubGVuZ3RoPT09MD8oMCxvci5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2VtcHR5IixjaGlsZHJlbjoiTm8gbG9nIG1lc3NhZ2VzIHlldC4gRW5hYmxlIENvbnNvbGUgTG9nZ2luZyBpbiBTZXR0aW5ncyB0byBzdGFydCBjYXB0dXJpbmcgbWVzc2FnZXMuIn0pOmUubWFwKGE9PigwLG9yLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2VudHJ5IixjaGlsZHJlbjpbKDAsb3IuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZGVidWctY29uc29sZV9fdGltZXN0YW1wIixjaGlsZHJlbjpuZXcgRGF0ZShhLnRzKS50b0lTT1N0cmluZygpLnNsaWNlKDExLDIzKX0pLCgwLG9yLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX21lc3NhZ2UiLGNoaWxkcmVuOnBNKGEuYXJncyl9KV19LGEuaWQpKX0pfSl9dmFyIEJtPXt9OyhmdW5jdGlvbiBlKHQsbixvLHIpe3ZhciBhPSEhKHQuV29ya2VyJiZ0LkJsb2ImJnQuUHJvbWlzZSYmdC5PZmZzY3JlZW5DYW52YXMmJnQuT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJiZ0LkhUTUxDYW52YXNFbGVtZW50JiZ0LkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbiYmdC5VUkwmJnQuVVJMLmNyZWF0ZU9iamVjdFVSTCksaT10eXBlb2YgUGF0aDJEPT0iZnVuY3Rpb24iJiZ0eXBlb2YgRE9NTWF0cml4PT0iZnVuY3Rpb24iLHM9ZnVuY3Rpb24oKXtpZighdC5PZmZzY3JlZW5DYW52YXMpcmV0dXJuITE7dHJ5e3ZhciBEPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSxOPUQuZ2V0Q29udGV4dCgiMmQiKTtOLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBGPUQudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7Ti5jcmVhdGVQYXR0ZXJuKEYsIm5vLXJlcGVhdCIpfWNhdGNoe3JldHVybiExfXJldHVybiEwfSgpO2Z1bmN0aW9uIGwoKXt9ZnVuY3Rpb24gZChEKXt2YXIgTj1uLmV4cG9ydHMuUHJvbWlzZSxGPU4hPT12b2lkIDA/Tjp0LlByb21pc2U7cmV0dXJuIHR5cGVvZiBGPT0iZnVuY3Rpb24iP25ldyBGKEQpOihEKGwsbCksbnVsbCl9dmFyIGM9ZnVuY3Rpb24oRCxOKXtyZXR1cm57dHJhbnNmb3JtOmZ1bmN0aW9uKEYpe2lmKEQpcmV0dXJuIEY7aWYoTi5oYXMoRikpcmV0dXJuIE4uZ2V0KEYpO3ZhciBZPW5ldyBPZmZzY3JlZW5DYW52YXMoRi53aWR0aCxGLmhlaWdodCksaj1ZLmdldENvbnRleHQoIjJkIik7cmV0dXJuIGouZHJhd0ltYWdlKEYsMCwwKSxOLnNldChGLFkpLFl9LGNsZWFyOmZ1bmN0aW9uKCl7Ti5jbGVhcigpfX19KHMsbmV3IE1hcCksdT1mdW5jdGlvbigpe3ZhciBEPU1hdGguZmxvb3IoMTYuNjY2NjY2NjY2NjY2NjY4KSxOLEYsWT17fSxqPTA7cmV0dXJuIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiImJnR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIj8oTj1mdW5jdGlvbihaKXt2YXIgb2U9TWF0aC5yYW5kb20oKTtyZXR1cm4gWVtvZV09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHEodGUpe2o9PT10ZXx8aitELTE8dGU/KGo9dGUsZGVsZXRlIFlbb2VdLFooKSk6WVtvZV09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHEpfSksb2V9LEY9ZnVuY3Rpb24oWil7WVtaXSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWVtaXSl9KTooTj1mdW5jdGlvbihaKXtyZXR1cm4gc2V0VGltZW91dChaLEQpfSxGPWZ1bmN0aW9uKFope3JldHVybiBjbGVhclRpbWVvdXQoWil9KSx7ZnJhbWU6TixjYW5jZWw6Rn19KCkscD1mdW5jdGlvbigpe3ZhciBELE4sRj17fTtmdW5jdGlvbiBZKGope2Z1bmN0aW9uIFoob2UscSl7ai5wb3N0TWVzc2FnZSh7b3B0aW9uczpvZXx8e30sY2FsbGJhY2s6cX0pfWouaW5pdD1mdW5jdGlvbihxKXt2YXIgdGU9cS50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbigpO2oucG9zdE1lc3NhZ2Uoe2NhbnZhczp0ZX0sW3RlXSl9LGouZmlyZT1mdW5jdGlvbihxLHRlLGRlKXtpZihOKXJldHVybiBaKHEsbnVsbCksTjt2YXIgbGU9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7cmV0dXJuIE49ZChmdW5jdGlvbihwZSl7ZnVuY3Rpb24ga2UoUGUpe1BlLmRhdGEuY2FsbGJhY2s9PT1sZSYmKGRlbGV0ZSBGW2xlXSxqLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGtlKSxOPW51bGwsYy5jbGVhcigpLGRlKCkscGUoKSl9ai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrZSksWihxLGxlKSxGW2xlXT1rZS5iaW5kKG51bGwse2RhdGE6e2NhbGxiYWNrOmxlfX0pfSksTn0sai5yZXNldD1mdW5jdGlvbigpe2oucG9zdE1lc3NhZ2Uoe3Jlc2V0OiEwfSk7Zm9yKHZhciBxIGluIEYpRltxXSgpLGRlbGV0ZSBGW3FdfX1yZXR1cm4gZnVuY3Rpb24oKXtpZihEKXJldHVybiBEO2lmKCFvJiZhKXt2YXIgaj1bInZhciBDT05GRVRUSSwgU0laRSA9IHt9LCBtb2R1bGUgPSB7fTsiLCIoIitlLnRvU3RyaW5nKCkrIikodGhpcywgbW9kdWxlLCB0cnVlLCBTSVpFKTsiLCJvbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2cpIHsiLCIgIGlmIChtc2cuZGF0YS5vcHRpb25zKSB7IiwiICAgIENPTkZFVFRJKG1zZy5kYXRhLm9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKCkgeyIsIiAgICAgIGlmIChtc2cuZGF0YS5jYWxsYmFjaykgeyIsIiAgICAgICAgcG9zdE1lc3NhZ2UoeyBjYWxsYmFjazogbXNnLmRhdGEuY2FsbGJhY2sgfSk7IiwiICAgICAgfSIsIiAgICB9KTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzZXQpIHsiLCIgICAgQ09ORkVUVEkgJiYgQ09ORkVUVEkucmVzZXQoKTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzaXplKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5yZXNpemUud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEucmVzaXplLmhlaWdodDsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEuY2FudmFzKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5jYW52YXMud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEuY2FudmFzLmhlaWdodDsiLCIgICAgQ09ORkVUVEkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGUobXNnLmRhdGEuY2FudmFzKTsiLCIgIH0iLCJ9Il0uam9pbihgCmApO3RyeXtEPW5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbal0pKSl9Y2F0Y2goWil7cmV0dXJuIHR5cGVvZiBjb25zb2xlPCJ1IiYmdHlwZW9mIGNvbnNvbGUud2Fybj09ImZ1bmN0aW9uIiYmY29uc29sZS53YXJuKCJcdXsxRjM4QX0gQ291bGQgbm90IGxvYWQgd29ya2VyIixaKSxudWxsfVkoRCl9cmV0dXJuIER9fSgpLGY9e3BhcnRpY2xlQ291bnQ6NTAsYW5nbGU6OTAsc3ByZWFkOjQ1LHN0YXJ0VmVsb2NpdHk6NDUsZGVjYXk6LjksZ3Jhdml0eToxLGRyaWZ0OjAsdGlja3M6MjAwLHg6LjUseTouNSxzaGFwZXM6WyJzcXVhcmUiLCJjaXJjbGUiXSx6SW5kZXg6MTAwLGNvbG9yczpbIiMyNmNjZmYiLCIjYTI1YWZkIiwiI2ZmNWU3ZSIsIiM4OGZmNWEiLCIjZmNmZjQyIiwiI2ZmYTYyZCIsIiNmZjM2ZmYiXSxkaXNhYmxlRm9yUmVkdWNlZE1vdGlvbjohMSxzY2FsYXI6MX07ZnVuY3Rpb24gbShELE4pe3JldHVybiBOP04oRCk6RH1mdW5jdGlvbiBnKEQpe3JldHVybiBEIT1udWxsfWZ1bmN0aW9uIHcoRCxOLEYpe3JldHVybiBtKEQmJmcoRFtOXSk/RFtOXTpmW05dLEYpfWZ1bmN0aW9uIHYoRCl7cmV0dXJuIEQ8MD8wOk1hdGguZmxvb3IoRCl9ZnVuY3Rpb24geShELE4pe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKE4tRCkpK0R9ZnVuY3Rpb24gYihEKXtyZXR1cm4gcGFyc2VJbnQoRCwxNil9ZnVuY3Rpb24gaChEKXtyZXR1cm4gRC5tYXAoUyl9ZnVuY3Rpb24gUyhEKXt2YXIgTj1TdHJpbmcoRCkucmVwbGFjZSgvW14wLTlhLWZdL2dpLCIiKTtyZXR1cm4gTi5sZW5ndGg8NiYmKE49TlswXStOWzBdK05bMV0rTlsxXStOWzJdK05bMl0pLHtyOmIoTi5zdWJzdHJpbmcoMCwyKSksZzpiKE4uc3Vic3RyaW5nKDIsNCkpLGI6YihOLnN1YnN0cmluZyg0LDYpKX19ZnVuY3Rpb24geChEKXt2YXIgTj13KEQsIm9yaWdpbiIsT2JqZWN0KTtyZXR1cm4gTi54PXcoTiwieCIsTnVtYmVyKSxOLnk9dyhOLCJ5IixOdW1iZXIpLE59ZnVuY3Rpb24gRShEKXtELndpZHRoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxELmhlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIFQoRCl7dmFyIE49RC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtELndpZHRoPU4ud2lkdGgsRC5oZWlnaHQ9Ti5oZWlnaHR9ZnVuY3Rpb24gQShEKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyZXR1cm4gTi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLE4uc3R5bGUudG9wPSIwcHgiLE4uc3R5bGUubGVmdD0iMHB4IixOLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLE4uc3R5bGUuekluZGV4PUQsTn1mdW5jdGlvbiBDKEQsTixGLFksaixaLG9lLHEsdGUpe0Quc2F2ZSgpLEQudHJhbnNsYXRlKE4sRiksRC5yb3RhdGUoWiksRC5zY2FsZShZLGopLEQuYXJjKDAsMCwxLG9lLHEsdGUpLEQucmVzdG9yZSgpfWZ1bmN0aW9uIE8oRCl7dmFyIE49RC5hbmdsZSooTWF0aC5QSS8xODApLEY9RC5zcHJlYWQqKE1hdGguUEkvMTgwKTtyZXR1cm57eDpELngseTpELnksd29iYmxlOk1hdGgucmFuZG9tKCkqMTAsd29iYmxlU3BlZWQ6TWF0aC5taW4oLjExLE1hdGgucmFuZG9tKCkqLjErLjA1KSx2ZWxvY2l0eTpELnN0YXJ0VmVsb2NpdHkqLjUrTWF0aC5yYW5kb20oKSpELnN0YXJ0VmVsb2NpdHksYW5nbGUyRDotTisoLjUqRi1NYXRoLnJhbmRvbSgpKkYpLHRpbHRBbmdsZTooTWF0aC5yYW5kb20oKSooLjc1LS4yNSkrLjI1KSpNYXRoLlBJLGNvbG9yOkQuY29sb3Isc2hhcGU6RC5zaGFwZSx0aWNrOjAsdG90YWxUaWNrczpELnRpY2tzLGRlY2F5OkQuZGVjYXksZHJpZnQ6RC5kcmlmdCxyYW5kb206TWF0aC5yYW5kb20oKSsyLHRpbHRTaW46MCx0aWx0Q29zOjAsd29iYmxlWDowLHdvYmJsZVk6MCxncmF2aXR5OkQuZ3Jhdml0eSozLG92YWxTY2FsYXI6LjYsc2NhbGFyOkQuc2NhbGFyLGZsYXQ6RC5mbGF0fX1mdW5jdGlvbiBQKEQsTil7Ti54Kz1NYXRoLmNvcyhOLmFuZ2xlMkQpKk4udmVsb2NpdHkrTi5kcmlmdCxOLnkrPU1hdGguc2luKE4uYW5nbGUyRCkqTi52ZWxvY2l0eStOLmdyYXZpdHksTi52ZWxvY2l0eSo9Ti5kZWNheSxOLmZsYXQ/KE4ud29iYmxlPTAsTi53b2JibGVYPU4ueCsxMCpOLnNjYWxhcixOLndvYmJsZVk9Ti55KzEwKk4uc2NhbGFyLE4udGlsdFNpbj0wLE4udGlsdENvcz0wLE4ucmFuZG9tPTEpOihOLndvYmJsZSs9Ti53b2JibGVTcGVlZCxOLndvYmJsZVg9Ti54KzEwKk4uc2NhbGFyKk1hdGguY29zKE4ud29iYmxlKSxOLndvYmJsZVk9Ti55KzEwKk4uc2NhbGFyKk1hdGguc2luKE4ud29iYmxlKSxOLnRpbHRBbmdsZSs9LjEsTi50aWx0U2luPU1hdGguc2luKE4udGlsdEFuZ2xlKSxOLnRpbHRDb3M9TWF0aC5jb3MoTi50aWx0QW5nbGUpLE4ucmFuZG9tPU1hdGgucmFuZG9tKCkrMik7dmFyIEY9Ti50aWNrKysvTi50b3RhbFRpY2tzLFk9Ti54K04ucmFuZG9tKk4udGlsdENvcyxqPU4ueStOLnJhbmRvbSpOLnRpbHRTaW4sWj1OLndvYmJsZVgrTi5yYW5kb20qTi50aWx0Q29zLG9lPU4ud29iYmxlWStOLnJhbmRvbSpOLnRpbHRTaW47aWYoRC5maWxsU3R5bGU9InJnYmEoIitOLmNvbG9yLnIrIiwgIitOLmNvbG9yLmcrIiwgIitOLmNvbG9yLmIrIiwgIisoMS1GKSsiKSIsRC5iZWdpblBhdGgoKSxpJiZOLnNoYXBlLnR5cGU9PT0icGF0aCImJnR5cGVvZiBOLnNoYXBlLnBhdGg9PSJzdHJpbmciJiZBcnJheS5pc0FycmF5KE4uc2hhcGUubWF0cml4KSlELmZpbGwoSyhOLnNoYXBlLnBhdGgsTi5zaGFwZS5tYXRyaXgsTi54LE4ueSxNYXRoLmFicyhaLVkpKi4xLE1hdGguYWJzKG9lLWopKi4xLE1hdGguUEkvMTAqTi53b2JibGUpKTtlbHNlIGlmKE4uc2hhcGUudHlwZT09PSJiaXRtYXAiKXt2YXIgcT1NYXRoLlBJLzEwKk4ud29iYmxlLHRlPU1hdGguYWJzKFotWSkqLjEsZGU9TWF0aC5hYnMob2UtaikqLjEsbGU9Ti5zaGFwZS5iaXRtYXAud2lkdGgqTi5zY2FsYXIscGU9Ti5zaGFwZS5iaXRtYXAuaGVpZ2h0Kk4uc2NhbGFyLGtlPW5ldyBET01NYXRyaXgoW01hdGguY29zKHEpKnRlLE1hdGguc2luKHEpKnRlLC1NYXRoLnNpbihxKSpkZSxNYXRoLmNvcyhxKSpkZSxOLngsTi55XSk7a2UubXVsdGlwbHlTZWxmKG5ldyBET01NYXRyaXgoTi5zaGFwZS5tYXRyaXgpKTt2YXIgUGU9RC5jcmVhdGVQYXR0ZXJuKGMudHJhbnNmb3JtKE4uc2hhcGUuYml0bWFwKSwibm8tcmVwZWF0Iik7UGUuc2V0VHJhbnNmb3JtKGtlKSxELmdsb2JhbEFscGhhPTEtRixELmZpbGxTdHlsZT1QZSxELmZpbGxSZWN0KE4ueC1sZS8yLE4ueS1wZS8yLGxlLHBlKSxELmdsb2JhbEFscGhhPTF9ZWxzZSBpZihOLnNoYXBlPT09ImNpcmNsZSIpRC5lbGxpcHNlP0QuZWxsaXBzZShOLngsTi55LE1hdGguYWJzKFotWSkqTi5vdmFsU2NhbGFyLE1hdGguYWJzKG9lLWopKk4ub3ZhbFNjYWxhcixNYXRoLlBJLzEwKk4ud29iYmxlLDAsMipNYXRoLlBJKTpDKEQsTi54LE4ueSxNYXRoLmFicyhaLVkpKk4ub3ZhbFNjYWxhcixNYXRoLmFicyhvZS1qKSpOLm92YWxTY2FsYXIsTWF0aC5QSS8xMCpOLndvYmJsZSwwLDIqTWF0aC5QSSk7ZWxzZSBpZihOLnNoYXBlPT09InN0YXIiKWZvcih2YXIgdWU9TWF0aC5QSS8yKjMscWU9NCpOLnNjYWxhcixKZT04Kk4uc2NhbGFyLFFlPU4ueCx5dD1OLnksTHQ9NSxIZT1NYXRoLlBJL0x0O0x0LS07KVFlPU4ueCtNYXRoLmNvcyh1ZSkqSmUseXQ9Ti55K01hdGguc2luKHVlKSpKZSxELmxpbmVUbyhRZSx5dCksdWUrPUhlLFFlPU4ueCtNYXRoLmNvcyh1ZSkqcWUseXQ9Ti55K01hdGguc2luKHVlKSpxZSxELmxpbmVUbyhRZSx5dCksdWUrPUhlO2Vsc2UgRC5tb3ZlVG8oTWF0aC5mbG9vcihOLngpLE1hdGguZmxvb3IoTi55KSksRC5saW5lVG8oTWF0aC5mbG9vcihOLndvYmJsZVgpLE1hdGguZmxvb3IoaikpLEQubGluZVRvKE1hdGguZmxvb3IoWiksTWF0aC5mbG9vcihvZSkpLEQubGluZVRvKE1hdGguZmxvb3IoWSksTWF0aC5mbG9vcihOLndvYmJsZVkpKTtyZXR1cm4gRC5jbG9zZVBhdGgoKSxELmZpbGwoKSxOLnRpY2s8Ti50b3RhbFRpY2tzfWZ1bmN0aW9uIFUoRCxOLEYsWSxqKXt2YXIgWj1OLnNsaWNlKCksb2U9RC5nZXRDb250ZXh0KCIyZCIpLHEsdGUsZGU9ZChmdW5jdGlvbihsZSl7ZnVuY3Rpb24gcGUoKXtxPXRlPW51bGwsb2UuY2xlYXJSZWN0KDAsMCxZLndpZHRoLFkuaGVpZ2h0KSxjLmNsZWFyKCksaigpLGxlKCl9ZnVuY3Rpb24ga2UoKXtvJiYhKFkud2lkdGg9PT1yLndpZHRoJiZZLmhlaWdodD09PXIuaGVpZ2h0KSYmKFkud2lkdGg9RC53aWR0aD1yLndpZHRoLFkuaGVpZ2h0PUQuaGVpZ2h0PXIuaGVpZ2h0KSwhWS53aWR0aCYmIVkuaGVpZ2h0JiYoRihEKSxZLndpZHRoPUQud2lkdGgsWS5oZWlnaHQ9RC5oZWlnaHQpLG9lLmNsZWFyUmVjdCgwLDAsWS53aWR0aCxZLmhlaWdodCksWj1aLmZpbHRlcihmdW5jdGlvbihQZSl7cmV0dXJuIFAob2UsUGUpfSksWi5sZW5ndGg/cT11LmZyYW1lKGtlKTpwZSgpfXE9dS5mcmFtZShrZSksdGU9cGV9KTtyZXR1cm57YWRkRmV0dGlzOmZ1bmN0aW9uKGxlKXtyZXR1cm4gWj1aLmNvbmNhdChsZSksZGV9LGNhbnZhczpELHByb21pc2U6ZGUscmVzZXQ6ZnVuY3Rpb24oKXtxJiZ1LmNhbmNlbChxKSx0ZSYmdGUoKX19fWZ1bmN0aW9uIEkoRCxOKXt2YXIgRj0hRCxZPSEhdyhOfHx7fSwicmVzaXplIiksaj0hMSxaPXcoTiwiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLG9lPWEmJiEhdyhOfHx7fSwidXNlV29ya2VyIikscT1vZT9wKCk6bnVsbCx0ZT1GP0U6VCxkZT1EJiZxPyEhRC5fX2NvbmZldHRpX2luaXRpYWxpemVkOiExLGxlPXR5cGVvZiBtYXRjaE1lZGlhPT0iZnVuY3Rpb24iJiZtYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbikiKS5tYXRjaGVzLHBlO2Z1bmN0aW9uIGtlKHVlLHFlLEplKXtmb3IodmFyIFFlPXcodWUsInBhcnRpY2xlQ291bnQiLHYpLHl0PXcodWUsImFuZ2xlIixOdW1iZXIpLEx0PXcodWUsInNwcmVhZCIsTnVtYmVyKSxIZT13KHVlLCJzdGFydFZlbG9jaXR5IixOdW1iZXIpLGJlPXcodWUsImRlY2F5IixOdW1iZXIpLG90PXcodWUsImdyYXZpdHkiLE51bWJlcikscnQ9dyh1ZSwiZHJpZnQiLE51bWJlciksa3Q9dyh1ZSwiY29sb3JzIixoKSxoZT13KHVlLCJ0aWNrcyIsTnVtYmVyKSxmZT13KHVlLCJzaGFwZXMiKSxfdD13KHVlLCJzY2FsYXIiKSxYbj0hIXcodWUsImZsYXQiKSxiYT14KHVlKSx3YT1RZSxhcj1bXSxrYT1ELndpZHRoKmJhLngsTmk9RC5oZWlnaHQqYmEueTt3YS0tOylhci5wdXNoKE8oe3g6a2EseTpOaSxhbmdsZTp5dCxzcHJlYWQ6THQsc3RhcnRWZWxvY2l0eTpIZSxjb2xvcjprdFt3YSVrdC5sZW5ndGhdLHNoYXBlOmZlW3koMCxmZS5sZW5ndGgpXSx0aWNrczpoZSxkZWNheTpiZSxncmF2aXR5Om90LGRyaWZ0OnJ0LHNjYWxhcjpfdCxmbGF0OlhufSkpO3JldHVybiBwZT9wZS5hZGRGZXR0aXMoYXIpOihwZT1VKEQsYXIsdGUscWUsSmUpLHBlLnByb21pc2UpfWZ1bmN0aW9uIFBlKHVlKXt2YXIgcWU9Wnx8dyh1ZSwiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLEplPXcodWUsInpJbmRleCIsTnVtYmVyKTtpZihxZSYmbGUpcmV0dXJuIGQoZnVuY3Rpb24oSGUpe0hlKCl9KTtGJiZwZT9EPXBlLmNhbnZhczpGJiYhRCYmKEQ9QShKZSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKSksWSYmIWRlJiZ0ZShEKTt2YXIgUWU9e3dpZHRoOkQud2lkdGgsaGVpZ2h0OkQuaGVpZ2h0fTtxJiYhZGUmJnEuaW5pdChEKSxkZT0hMCxxJiYoRC5fX2NvbmZldHRpX2luaXRpYWxpemVkPSEwKTtmdW5jdGlvbiB5dCgpe2lmKHEpe3ZhciBIZT17Z2V0Qm91bmRpbmdDbGllbnRSZWN0OmZ1bmN0aW9uKCl7aWYoIUYpcmV0dXJuIEQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9fTt0ZShIZSkscS5wb3N0TWVzc2FnZSh7cmVzaXplOnt3aWR0aDpIZS53aWR0aCxoZWlnaHQ6SGUuaGVpZ2h0fX0pO3JldHVybn1RZS53aWR0aD1RZS5oZWlnaHQ9bnVsbH1mdW5jdGlvbiBMdCgpe3BlPW51bGwsWSYmKGo9ITEsdC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHl0KSksRiYmRCYmKGRvY3VtZW50LmJvZHkuY29udGFpbnMoRCkmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCksRD1udWxsLGRlPSExKX1yZXR1cm4gWSYmIWomJihqPSEwLHQuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix5dCwhMSkpLHE/cS5maXJlKHVlLFFlLEx0KTprZSh1ZSxRZSxMdCl9cmV0dXJuIFBlLnJlc2V0PWZ1bmN0aW9uKCl7cSYmcS5yZXNldCgpLHBlJiZwZS5yZXNldCgpfSxQZX12YXIgSDtmdW5jdGlvbiBfKCl7cmV0dXJuIEh8fChIPUkobnVsbCx7dXNlV29ya2VyOiEwLHJlc2l6ZTohMH0pKSxIfWZ1bmN0aW9uIEsoRCxOLEYsWSxqLFosb2Upe3ZhciBxPW5ldyBQYXRoMkQoRCksdGU9bmV3IFBhdGgyRDt0ZS5hZGRQYXRoKHEsbmV3IERPTU1hdHJpeChOKSk7dmFyIGRlPW5ldyBQYXRoMkQ7cmV0dXJuIGRlLmFkZFBhdGgodGUsbmV3IERPTU1hdHJpeChbTWF0aC5jb3Mob2UpKmosTWF0aC5zaW4ob2UpKmosLU1hdGguc2luKG9lKSpaLE1hdGguY29zKG9lKSpaLEYsWV0pKSxkZX1mdW5jdGlvbiBNKEQpe2lmKCFpKXRocm93IG5ldyBFcnJvcigicGF0aCBjb25mZXR0aSBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTt2YXIgTixGO3R5cGVvZiBEPT0ic3RyaW5nIj9OPUQ6KE49RC5wYXRoLEY9RC5tYXRyaXgpO3ZhciBZPW5ldyBQYXRoMkQoTiksaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxaPWouZ2V0Q29udGV4dCgiMmQiKTtpZighRil7Zm9yKHZhciBvZT0xZTMscT1vZSx0ZT1vZSxkZT0wLGxlPTAscGUsa2UsUGU9MDtQZTxvZTtQZSs9Milmb3IodmFyIHVlPTA7dWU8b2U7dWUrPTIpWi5pc1BvaW50SW5QYXRoKFksUGUsdWUsIm5vbnplcm8iKSYmKHE9TWF0aC5taW4ocSxQZSksdGU9TWF0aC5taW4odGUsdWUpLGRlPU1hdGgubWF4KGRlLFBlKSxsZT1NYXRoLm1heChsZSx1ZSkpO3BlPWRlLXEsa2U9bGUtdGU7dmFyIHFlPTEwLEplPU1hdGgubWluKHFlL3BlLHFlL2tlKTtGPVtKZSwwLDAsSmUsLU1hdGgucm91bmQocGUvMitxKSpKZSwtTWF0aC5yb3VuZChrZS8yK3RlKSpKZV19cmV0dXJue3R5cGU6InBhdGgiLHBhdGg6TixtYXRyaXg6Rn19ZnVuY3Rpb24gVyhEKXt2YXIgTixGPTEsWT0iIzAwMDAwMCIsaj0nIkFwcGxlIENvbG9yIEVtb2ppIiwgIlNlZ29lIFVJIEVtb2ppIiwgIlNlZ29lIFVJIFN5bWJvbCIsICJOb3RvIENvbG9yIEVtb2ppIiwgIkVtb2ppT25lIENvbG9yIiwgIkFuZHJvaWQgRW1vamkiLCAiVHdlbW9qaSBNb3ppbGxhIiwgInN5c3RlbSBlbW9qaSIsIHNhbnMtc2VyaWYnO3R5cGVvZiBEPT0ic3RyaW5nIj9OPUQ6KE49RC50ZXh0LEY9InNjYWxhciJpbiBEP0Quc2NhbGFyOkYsaj0iZm9udEZhbWlseSJpbiBEP0QuZm9udEZhbWlseTpqLFk9ImNvbG9yImluIEQ/RC5jb2xvcjpZKTt2YXIgWj0xMCpGLG9lPSIiK1orInB4ICIraixxPW5ldyBPZmZzY3JlZW5DYW52YXMoWixaKSx0ZT1xLmdldENvbnRleHQoIjJkIik7dGUuZm9udD1vZTt2YXIgZGU9dGUubWVhc3VyZVRleHQoTiksbGU9TWF0aC5jZWlsKGRlLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQrZGUuYWN0dWFsQm91bmRpbmdCb3hMZWZ0KSxwZT1NYXRoLmNlaWwoZGUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQrZGUuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50KSxrZT0yLFBlPWRlLmFjdHVhbEJvdW5kaW5nQm94TGVmdCtrZSx1ZT1kZS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCtrZTtsZSs9a2Ura2UscGUrPWtlK2tlLHE9bmV3IE9mZnNjcmVlbkNhbnZhcyhsZSxwZSksdGU9cS5nZXRDb250ZXh0KCIyZCIpLHRlLmZvbnQ9b2UsdGUuZmlsbFN0eWxlPVksdGUuZmlsbFRleHQoTixQZSx1ZSk7dmFyIHFlPTEvRjtyZXR1cm57dHlwZToiYml0bWFwIixiaXRtYXA6cS50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKSxtYXRyaXg6W3FlLDAsMCxxZSwtbGUqcWUvMiwtcGUqcWUvMl19fW4uZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiBfKCkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuLmV4cG9ydHMucmVzZXQ9ZnVuY3Rpb24oKXtfKCkucmVzZXQoKX0sbi5leHBvcnRzLmNyZWF0ZT1JLG4uZXhwb3J0cy5zaGFwZUZyb21QYXRoPU0sbi5leHBvcnRzLnNoYXBlRnJvbVRleHQ9V30pKGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0aGlzfHx7fX0oKSxCbSwhMSk7dmFyIE5jPUJtLmV4cG9ydHMsTTg9Qm0uZXhwb3J0cy5jcmVhdGU7dmFyIEFvPSJBbXBsZSBBZ2VudCBQcm8iLEhtPSJYcnhoR1dQYmJtZ1NCSjZmU0NWbnM1N2siO2Z1bmN0aW9uIEcwKCl7bGV0IGU9X2UoKVtCLkxMTV9QUk9WSURFUl9NT0RFTF07aWYoIWV8fGU9PT0ibm9uZSIpcmV0dXJuW107bGV0IHQ9Vm8oZSl8fGUsbj1MbVt0XTtpZighbnx8bi5sZW5ndGg9PT0wKXJldHVybltdO2xldCBvPWhuW3RdO3JldHVybiBvP1tvLC4uLm4uZmlsdGVyKHI9PnIhPT1vKV06Wy4uLm5dfWZ1bmN0aW9uIFYwKGUsdCl7bGV0IG49X2UoKSxvPSR0KHQpO2lmKG8mJm5bb10pcmV0dXJuIG5bb10udHJpbSgpO2xldCByPW5bIkxMTSBBUEkgS2V5Il07aWYocilyZXR1cm4gci50cmltKCk7aWYoS2IpdGhyb3cgbmV3IEVycm9yKGBDb3VsZG50IGZpbmQgYSAke3R9IGtleSBpbiAke0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKG4pKX1gKTtyZXR1cm4gZS5hbGVydCgiUGxlYXNlIGNvbmZpZ3VyZSB5b3VyIEFQSSBrZXkgaW4gcGx1Z2luIHNldHRpbmdzLiIpLG51bGx9ZnVuY3Rpb24gajAoZSx0KXtsZXQgbj1waShlKSxvPVBtW25dO3JldHVybiBvPW8ucmVwbGFjZSgie21vZGVsLW5hbWV9IixlKSxuPT09ImdlbWluaSImJihvPWAke299P2tleT0ke3R9YCksb31mdW5jdGlvbiBwaShlKXtmb3IobGV0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhMbSkpaWYobi5pbmNsdWRlcyhlKSlyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICR7ZX0gbm90IGZvdW5kIGluIGFueSBwcm92aWRlcmApfWZ1bmN0aW9uIFRjKGUpe3JldHVybnthbnRocm9waWM6IkFudGhyb3BpYyIsZGVlcHNlZWs6IkRlZXBTZWVrIixnZW1pbmk6IkdlbWluaSIsZ3JvazoiR3JvayIsb3BlbmFpOiJPcGVuQUkiLHBlcnBsZXhpdHk6IlBlcnBsZXhpdHkifVtlXXx8ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfWZ1bmN0aW9uIFkwKGUpe2xldCB0LG49ZS50cmltKCksbz1uLmluZGV4T2YoIlsiKSxyPW4uaW5kZXhPZigieyIpLGE9bi5pbmNsdWRlcygifSIpLGk9bi5pbmNsdWRlcygiXSIpLHM9ITEsbD0tMTthJiZyPT09LTEmJihlPWB7JHtlfWAscj0wKSxpJiZvPT09LTEmJihlPWBbJHtlfWAsbz0wKSxvPWUuaW5kZXhPZigiWyIpLHI9ZS5pbmRleE9mKCJ7IiksbyE9PS0xJiYocj09PS0xfHxvPHIpPyhzPSEwLGw9byk6ciE9PS0xPyhzPSExLGw9cik6KGU9YHske2V9fWAsbD0wLHM9ITEpO2xldCBkPXM/Il0iOiJ9IixjPWUubGFzdEluZGV4T2YoZCk7aWYoYz09PS0xKXtlW2UubGVuZ3RoLTFdPT09IiwiJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTEpKTtsZXQgdT1lLmluY2x1ZGVzKCJbIikmJiFlLmluY2x1ZGVzKCJdIikscD1lLmluY2x1ZGVzKCJ7IikmJiFlLmluY2x1ZGVzKCJ9Iik7dSYmcD9lKz0ifV0iOnU/ZSs9Il0iOnA/ZSs9In0iOmU9cz9gJHtlfV1gOmAke2V9fWB9ZWxzZSBlPWUuc3Vic3RyaW5nKGwsYysxKTt0cnl7cmV0dXJuIHQ9SlNPTi5wYXJzZShlKSx0fWNhdGNoKHUpe2xldCBwPWU7ZT1mTShlKSxrKGBGYWlsZWQgdG8gcGFyc2UganNvblRleHQgU1RBUlQ6CiR7cH0KRU5ECiBkdWUgdG8gJHt1fS4gQXR0ZW1wdGVkIHJlYmFsYW5jZSB5aWVsZGVkOiAke2V9IChvcmlnaW5hbCBzaXplICR7cC5sZW5ndGh8fCIobnVsbCkifSwgcmViYWxhbmNlIHNpemUgJHtlPy5sZW5ndGh8fCIoMCkifSlgKTt0cnl7cmV0dXJuIHQ9SlNPTi5wYXJzZShlKSx0fWNhdGNoKG0pe2soIlJlYmFsYW5jZWQganNvblRleHQgc3RpbGwgZmFpbHMiLG0pfWxldCBmPWUucmVwbGFjZSgvIiIiL2csJyJcXCIiJykucmVwbGFjZSgvIlxuL2csJyJcXG4nKTtpZihmPWYucmVwbGFjZSgvKFt7LF1ccyopKFthLXpBLVpfJF1bYS16QS1aMC05XyRdKikiOi9nLCckMSIkMiI6JyksZj1mLnJlcGxhY2UoL1xuXHMqWyfigJzigJ1dL2csYAoiYCkucmVwbGFjZSgvWyfigJzigJ1dLFxzKlxuL2csYCIsCmApLnJlcGxhY2UoL1sn4oCc4oCdXVxzKihbXG5cXV0pLywnIiQxJyksZiE9PWUpdHJ5e3JldHVybiB0PUpTT04ucGFyc2UoZiksdH1jYXRjaChtKXtrKCJSZWZvcm1hdHRlZCB0ZXh0IHN0aWxsIGZhaWxzIixtKX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gRGMoZSl7cmV0dXJuYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtlfWB9ZnVuY3Rpb24gZk0oZSl7bGV0IHQ9ZS5pbmRleE9mKCJ7Iik7aWYodD09PS0xKXJldHVybiBudWxsO2xldCBuPWUuc3Vic3RyaW5nKHQpLnRyaW0oKSxvPVtdLHI9IiI7Zm9yKGxldCBhIG9mIG4paWYocis9YSxhPT09InsiP28ucHVzaCgifSIpOmE9PT0ifSI/b1tvLmxlbmd0aC0xXT09PSJ9IiYmby5wb3AoKTphPT09IlsiP28ucHVzaCgiXSIpOmE9PT0iXSImJm9bby5sZW5ndGgtMV09PT0iXSImJm8ucG9wKCksby5sZW5ndGg9PT0wKWJyZWFrO3JldHVybiBvLmxlbmd0aCYmKGsoIkZvdW5kIixvLmxlbmd0aCwiY2hhcmFjdGVycyB0byBhcHBlbmQgdG8gYmFsYW5jZSIsciwiLiBBZGRpbmcgIixvLnJldmVyc2UoKS5qb2luKCIiKSkscis9by5yZXZlcnNlKCkuam9pbigiIikpLHJ9dmFyIHEwPTI7ZnVuY3Rpb24gQWMoZSl7bGV0IHQ9ZS50cmltKCk7dC5pbmRleE9mKCJ7Iik9PT0tMSYmKHQ9InsiK3QpO2xldCBvO3Quc3BsaXQoIn17IikubGVuZ3RoPjE/KG89dC5zcGxpdCgifXsiKS5tYXAoaT0+YCR7aVswXT09PSJ7Ij8iIjoieyJ9JHtpfSR7aVtpLmxlbmd0aC0xXT09PSJ9Ij8iIjoifSJ9YCksaygiUmVjZWl2ZWQgbXVsdGlwbGUgcmVzcG9uc2VzIGZyb20gQUksIGV2YWx1YXRpbmcgZWFjaCBvZiIsbykpOm89W3RdO2xldCBhPW8ubWFwKGk9PlkwKGkpKS5maWx0ZXIoaT0+aSk7aWYoYS5sZW5ndGgpaWYoYS5sZW5ndGg+MSl7bGV0IGk9YVswXTtyZXR1cm4gT2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW3MsbF0pPT57Zm9yKGxldCBkIG9mIGEuc2xpY2UoMSkpe2xldCBjPWRbc107YyYmQXJyYXkuaXNBcnJheShjKSYmQXJyYXkuaXNBcnJheShsKSYmKGlbc109Wy4uLm5ldyBTZXQoWy4uLmwsLi4uY10pXS5maWx0ZXIodT0+dSkpfX0pLGl9ZWxzZSByZXR1cm4gYVswXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBtTShlLHQpe2xldCBuO3N3aXRjaChlKXtjYXNlImFudGhyb3BpYyI6bj10Py5jb250ZW50Py5hdCgwKT8udGV4dDticmVhaztjYXNlImdlbWluaSI6bj10Py5jYW5kaWRhdGVzPy5hdCgwKT8uY29udGVudD8ucGFydHM/LmF0KDApPy50ZXh0O2JyZWFrO2Nhc2Uib2xsYW1hIjpuPXQ/Lm1lc3NhZ2U/LmNvbnRlbnR8fHQ/LnJlc3BvbnNlO2JyZWFrO2Nhc2UiZGVlcHNlZWsiOmNhc2UiZ3JvayI6Y2FzZSJvcGVuYWkiOmNhc2UicGVycGxleGl0eSI6ZGVmYXVsdDpuPXQ/LmNob2ljZXM/LmF0KDApPy5tZXNzYWdlPy5jb250ZW50fHx0Py5jaG9pY2VzPy5hdCgwKT8ubWVzc2FnZT8udG9vbF9jYWxscz8uYXQoMCk/LmZ1bmN0aW9uPy5hcmd1bWVudHM7YnJlYWt9cmV0dXJuIG58fGsoYENvdWxkIG5vdCBleHRyYWN0IGNvbnRlbnQgZnJvbSAke2V9IHJlc3BvbnNlOmAsSlNPTi5zdHJpbmdpZnkodCxudWxsLDIpKSxufHxudWxsfWFzeW5jIGZ1bmN0aW9uICQwKGUsdCxuLG8scixhLHt0aW1lb3V0U2Vjb25kczppPTMwfT17fSl7bGV0IHM9cGkobiksbDtpZihyKWw9YXdhaXQgaE0oZSx0LG4sITAsciksZS5hbGVydChsLHtzY3JvbGxUb0VuZDohMH0pO2Vsc2UgdHJ5e2F3YWl0IFByb21pc2UucmFjZShbbmV3IFByb21pc2UoYXN5bmMoYyx1KT0+e2xldCBwPWF3YWl0IHQuanNvbigpO2w9bU0ocyxwKSxjKGwpfSksbmV3IFByb21pc2UoKGMsdSk9PnNldFRpbWVvdXQoKCk9PnUobmV3IEVycm9yKGAke3N9IFRpbWVvdXRgKSksaSoxZTMpKV0pfWNhdGNoKGMpe3Rocm93IGsoIkZhaWxlZCB0byBwYXJzZSByZXNwb25zZSBmcm9tIixuLCJlcnJvciIsYyksY31sZXQgZD1sO3JldHVybiBsPUFjKGwpLCFhfHxhKGwpP2w6KGQmJmsoIlJlY2VpdmVkIixkLCJidXQgY291bGQgbm90IHBhcnNlIGFzIGEgdmFsaWQgcmVzdWx0IiksbnVsbCl9YXN5bmMgZnVuY3Rpb24gaE0oZSx0LG4sbyxyKXtyZXR1cm4gdHlwZW9mIGdsb2JhbDwidSImJnR5cGVvZiBnbG9iYWwuZmV0Y2g8InUiP2F3YWl0IGdNKGUsdCxuLG8scik6YXdhaXQgeU0oZSx0LG4sbyxyKX1hc3luYyBmdW5jdGlvbiBnTShlLHQsbixvLHIpe2xldCBhPXQuYm9keSxpPSExLHM9IiIsbCxkO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgoYyx1KT0+e2xldCBwPSgpPT57bGV0IGY9MCxtPSgpPT57bGV0IGc9YS5yZWFkKCk7aWYoZyl7Zj0wO2xldCB3PWcudG9TdHJpbmcoKTtpZih7YWJvcnQ6aSxmYWlsZWRQYXJzZUNvbnRlbnQ6bCxpbmNyZW1lbnRhbENvbnRlbnRzOmQscmVjZWl2ZWRDb250ZW50OnN9PXIoZSx3LHMsbixvLGwpLGl8fCFYMChkLHMpKXtjKCk7cmV0dXJufW0oKX1lbHNlIGYrPTEsZjwzP3NldFRpbWVvdXQobSxxMCoxZTMpOmMoKX07bSgpfTthLm9uKCJyZWFkYWJsZSIscCl9KSxzfWFzeW5jIGZ1bmN0aW9uIHlNKGUsdCxuLG8scil7bGV0IGE9dC5ib2R5LmdldFJlYWRlcigpLGk9bmV3IFRleHREZWNvZGVyLHMsbCxkLGMsdT0wLHA9IiI7Zm9yKDshbDspe2xldCBmPW51bGwsbT0hMTt0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFt7ZG9uZTptLHZhbHVlOmZ9PWF3YWl0IGEucmVhZCgpLG5ldyBQcm9taXNlKChnLHcpPT5zZXRUaW1lb3V0KCgpPT53KG5ldyBFcnJvcigiVGltZW91dCIpKSxxMCoxZTMpKV0pfWNhdGNoKGcpe2w9ZyxrKCJGYWlsZWQgdG8gcmVjZWl2ZSBmdXJ0aGVyIHN0cmVhbSBkYXRhIGluIHRpbWUiLGcpO2JyZWFrfWlmKG18fHU+Myl7aygiQ29tcGxldGVkIGdlbmVyYXRpbmcgcmVzcG9uc2UgbGVuZ3RoIik7YnJlYWt9ZWxzZSBpZihmKXtsZXQgZz1pLmRlY29kZShmLHtzdHJlYW06ITB9KTt0cnl7aWYodHlwZW9mIGc9PSJzdHJpbmciKXt1PTA7bGV0IHc9cihlLGcscCxuLG8sZCk7aWYodyl7aWYoe2Fib3J0OnMsZmFpbGVkUGFyc2VDb250ZW50OmQsaW5jcmVtZW50YWxDb250ZW50czpjLHJlY2VpdmVkQ29udGVudDpwfT13LHN8fCFYMChjLHApKWJyZWFrfWVsc2UgaygiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSBmcm9tIixmLCJhcyBKU09OIiksdSs9MX1lbHNlIGsoIkZhaWxlZCB0byBwYXJzZSBzdHJlYW0gZnJvbSIsZiwiYXMgSlNPTiIpLHUrPTF9Y2F0Y2godyl7aygiVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIHJlc3BvbnNlIGZyb20gc3RyZWFtOiIsdyk7YnJlYWt9fWVsc2UgdSs9MX1yZXR1cm4gcH1mdW5jdGlvbiBYMChlLHQpe2xldCBuO2lmKGU/Lmxlbmd0aCYmKHQ/Lmxlbmd0aHx8MCk+PWtmKXtsZXQgbz10LnJlcGxhY2UoL1xuL2csIiAiKTtuPW8uc3Vic3RyaW5nKG8ubGVuZ3RoLWtmKS50cmltKCk9PT0iIixuJiZrKCJSZXNwb25zZSBleGNlZWRzIGVtcHR5IHNwYWNlIHRocmVzaG9sZC4gQWJvcnRpbmciKX1yZXR1cm4hbn12YXIgdk09MzAsSjA9NTA7YXN5bmMgZnVuY3Rpb24gYk0oZSx0LG4sbyxyLGEsaSl7bGV0IHM9RzAoKTtvJiYocz1zLmZpbHRlcihtPT5tIT09bykscy51bnNoaWZ0KG8pKTtsZXQgbD1zLnNoaWZ0KCk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJObyBBSSBwcm92aWRlciBpcyBjb25maWd1cmVkLiBDaG9vc2UgYSBwcm92aWRlciBpbiBEYXNoYm9hcmQgU2V0dGluZ3MuIik7aygiW2xsbVByb21wdF0gbW9kZWwgcmVzb2x1dGlvbiIse2FpTW9kZWxPdmVycmlkZTpvLG1vZGVsVG9Vc2U6bD8/bnVsbCxyZW1haW5pbmdDYW5kaWRhdGVDb3VudDpzLmxlbmd0aCxhcGlLZXlPdmVycmlkZVByZXNlbnQ6ISFyfSk7bGV0IGQ9W3tyb2xlOiJ1c2VyIixjb250ZW50Om59XSxjPWk/e3RpbWVvdXRTZWNvbmRzOml9Ont9O3ImJihjLmFwaUtleT1yKTtsZXQgdT1hd2FpdCB4TShlLGQsbCxjKSxmPWF3YWl0ICQwKGUsdSxsLGE/ImxsbVByb21wdEpzb24iOm51bGwsbnVsbCxudWxsKTtyZXR1cm4gZiYmYSYmdHlwZW9mIGY9PSJzdHJpbmciP0FjKGYpOmZ9YXN5bmMgZnVuY3Rpb24gQ2MoZSx0LHtqc29uUmVzcG9uc2U6bixhaU1vZGVsOm8sYXBpS2V5OnIsdGltZW91dFNlY29uZHM6YX09e30pe2xldCBpPXBlcmZvcm1hbmNlLm5vdygpO2soIltsbG1Qcm9tcHRdIHN0YXJ0aW5nIix7cHJvbXB0TGVuZ3RoOnQ/Lmxlbmd0aD8/MCxhbXBsZUFnZW50UHJvVXVpZDpIbSxoYXNDYWxsUGx1Z2luOnR5cGVvZiBlPy5jYWxsUGx1Z2luPT0iZnVuY3Rpb24iLGpzb25SZXNwb25zZTohIW4sYWlNb2RlbE92ZXJyaWRlOm8/P251bGwsYXBpS2V5T3ZlcnJpZGVQcmVzZW50OiEhcn0pO3RyeXtsZXQgZD1hd2FpdCBlLmNhbGxQbHVnaW4oe3NvdXJjZTpIbX0sIiIsdCxvKTtpZih0eXBlb2YgZD4idSIpe2xldCB1PWF3YWl0IGUuZmluZE5vdGUoe25hbWU6QW99KTtrKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHJldHVybmVkIHVuZGVmaW5lZDsgY2hlY2tpbmcgZm9yIEFtcGxlIEFnZW50IFBybyBub3RlIGV4aXN0ZW5jZSwgZ290Iix1KSx1JiYoZD1hd2FpdCBlLmNhbGxQbHVnaW4oe3V1aWQ6dS51dWlkfSwiIix0LG8pLGsoYFtsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIEF0dGVtcHQgdG8gY2FsbFBsdWdpbiBmb3Igbm90ZSB1dWlkICR7dS51dWlkfSB5aWVsZGVkYCxkKSl9bGV0IGM9TnVtYmVyKChwZXJmb3JtYW5jZS5ub3coKS1pKS50b0ZpeGVkKDEpKTtpZihkKXtsZXQgcD10eXBlb2YgZD09InN0cmluZyI/ZC5zdWJzdHJpbmcoMCwzMDApOkpTT04uc3RyaW5naWZ5KGQpLnN1YnN0cmluZygwLDMwMCk7aygiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiByYXcgcmVzdWx0Iix7ZHVyYXRpb25NczpjLHJlc3VsdFR5cGU6dHlwZW9mIGQscmVzdWx0TGVuZ3RoOnR5cGVvZiBkPT0ic3RyaW5nIj9kLmxlbmd0aDpudWxsLHJlc3VsdFNuaXBwZXQ6cH0pO2xldCBmPW4mJnR5cGVvZiBkPT0ic3RyaW5nIj9BYyhkKTpkO3JldHVybiBrKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHBhcnNlZCByZXN1bHQiLHtwYXJzZWRUeXBlOmY9PT1udWxsPyJudWxsIjp0eXBlb2YgZixoYXNUYXNrc0ZpZWxkOiEhKGYmJnR5cGVvZiBmPT0ib2JqZWN0IiYmInRhc2tzImluIGYpLHRhc2tzTGVuZ3RoOkFycmF5LmlzQXJyYXkoZj8udGFza3MpP2YudGFza3MubGVuZ3RoOm51bGwsaGFzR29hbHNTdW1tYXJ5OiEhKGYmJnR5cGVvZiBmPT0ib2JqZWN0IiYmZi5nb2Fsc1N1bW1hcnkpfSksZn1rKGBbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHJldHVybmVkICcke2R9JyAodHlwZW9mICR7dHlwZW9mIGR9KSBcdTIwMTQgZmFsbGluZyBiYWNrIHRvIGRpcmVjdCBMTE1gLHtkdXJhdGlvbk1zOmMscGx1Z2luUmVzdWx0VmFsdWU6ZCxwbHVnaW5SZXN1bHRUeXBlOnR5cGVvZiBkfSl9Y2F0Y2goZCl7aygiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiB0aHJldyBcdTIwMTQgZmFsbGluZyBiYWNrIHRvIGRpcmVjdCBMTE0iLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktaSkudG9GaXhlZCgxKSksZXJyb3JNZXNzYWdlOmQ/Lm1lc3NhZ2UsZXJyb3JOYW1lOmQ/Lm5hbWV9KX1sZXQgcz1wZXJmb3JtYW5jZS5ub3coKSxsPWF3YWl0IGJNKGUsbnVsbCx0LG8scixuLGEpO3JldHVybiBrKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBsbG1Qcm9tcHQgZmFsbGJhY2sgY29tcGxldGUiLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktcykudG9GaXhlZCgxKSkscmVzdWx0VHlwZTpsPT09bnVsbD8ibnVsbCI6dHlwZW9mIGwsaGFzVGFza3NGaWVsZDohIShsJiZ0eXBlb2YgbD09Im9iamVjdCImJiJ0YXNrcyJpbiBsKX0pLGx9ZnVuY3Rpb24gS20oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5tYXAodD0+S20odCkpOiFlfHx0eXBlb2YgZSE9Im9iamVjdCI/ZTpPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZSkubWFwKChbdCxuXSk9PnQ9PT0iY29udGVudCImJnR5cGVvZiBuPT0ic3RyaW5nIiYmbi5sZW5ndGg+SjA/W3QsYCR7bi5zbGljZSgwLEowLTMpfS4uLmBdOlt0LEttKG4pXSkpfWZ1bmN0aW9uIHdNKGUsdCl7bGV0IG49eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn07c3dpdGNoKGUpe2Nhc2UiYW50aHJvcGljIjpyZXR1cm57Li4ubiwieC1hcGkta2V5Ijp0LCJhbnRocm9waWMtZGFuZ2Vyb3VzLWRpcmVjdC1icm93c2VyLWFjY2VzcyI6InRydWUiLCJhbnRocm9waWMtdmVyc2lvbiI6IjIwMjMtMDYtMDEifTtjYXNlImdlbWluaSI6cmV0dXJuIG47ZGVmYXVsdDpyZXR1cm57Li4ubixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0fWB9fX1mdW5jdGlvbiBrTShlLHQsbixvLHtwcm9tcHRLZXk6cj1udWxsfT17fSl7bGV0IGE7c3dpdGNoKHBpKHQpKXtjYXNlImFudGhyb3BpYyI6e2xldCBzPWUuZmluZChkPT5kLnJvbGU9PT0ic3lzdGVtIiksbD1lLmZpbHRlcihkPT5kLnJvbGUhPT0ic3lzdGVtIik7YT17bWF4X3Rva2Vuczo0MDk2LG1vZGVsOnQsbWVzc2FnZXM6bH0sbiYmKGEuc3RyZWFtPW4pLHMmJihhLnN5c3RlbT1zLmNvbnRlbnQpO2JyZWFrfWNhc2UiZ2VtaW5pIjp7bGV0IHM9ZS5maW5kKGQ9PmQucm9sZT09PSJzeXN0ZW0iKTthPXtjb250ZW50czplLmZpbHRlcihkPT5kLnJvbGUhPT0ic3lzdGVtIikubWFwKGQ9Pih7cm9sZTpkLnJvbGU9PT0iYXNzaXN0YW50Ij8ibW9kZWwiOiJ1c2VyIixwYXJ0czpbe3RleHQ6ZC5jb250ZW50fV19KSl9LHMmJihhLnN5c3RlbUluc3RydWN0aW9uPXtwYXJ0czpbe3RleHQ6cy5jb250ZW50fV19KSxhLmdlbmVyYXRpb25Db25maWc9e3Jlc3BvbnNlTWltZVR5cGU6ImFwcGxpY2F0aW9uL2pzb24ifTticmVha31jYXNlImdyb2siOmNhc2UicGVycGxleGl0eSI6YT17bW9kZWw6dCxtZXNzYWdlczplfSxuJiYoYS5zdHJlYW09biksbyYmKGEudG9vbHM9byk7YnJlYWs7Y2FzZSJkZWVwc2VlayI6e2E9e21vZGVsOnQsbWVzc2FnZXM6ZX0sbiYmKGEuc3RyZWFtPW4pLG8mJihhLnRvb2xzPW8pLGEucmVzcG9uc2VfZm9ybWF0PXt0eXBlOiJqc29uX29iamVjdCJ9O2JyZWFrfWNhc2Uib3BlbmFpIjpkZWZhdWx0OnthPXttb2RlbDp0LG1lc3NhZ2VzOmV9LG4mJihhLnN0cmVhbT1uKSxvJiYoYS50b29scz1vKSxhLnJlc3BvbnNlX2Zvcm1hdD17dHlwZToianNvbl9vYmplY3QifTticmVha319cmV0dXJuIGF9YXN5bmMgZnVuY3Rpb24geE0oZSx0LG4se2FwaUtleTpvPW51bGwsYXR0ZW1wdE51bWJlcjpyPTEscHJvbXB0S2V5OmE9bnVsbCxzdHJlYW06aT1udWxsLHRpbWVvdXRTZWNvbmRzOnM9dk0sdG9vbHM6bD1udWxsfT17fSl7bGV0IGQ9cGkobik7cj4wJiZrKGBBdHRlbXB0ICMke3J9OiBUcnlpbmcgJHtufSB3aXRoICR7YXx8Im5vIHByb21wdEtleSJ9YCksb3x8KG89VjAoZSxkKSk7bGV0IGM9a00odCxuLGksbCx7cHJvbXB0S2V5OmF9KSx1PWowKG4sbyk7ayhgQ2FsbGluZyAke2R9IGF0ICR7dX0gd2l0aCBib2R5ICR7SlNPTi5zdHJpbmdpZnkoS20oYykpfSBhdCAke25ldyBEYXRlfWApO2xldCBwPXdNKGQsbyksZj1hd2FpdCBQcm9taXNlLnJhY2UoW2ZldGNoKHUse21ldGhvZDoiUE9TVCIsaGVhZGVyczpwLGJvZHk6SlNPTi5zdHJpbmdpZnkoYyl9KSxuZXcgUHJvbWlzZSgobSxnKT0+c2V0VGltZW91dCgoKT0+ZyhuZXcgRXJyb3IoIlRpbWVvdXQiKSkscyoxZTMpKV0pO2lmKCFmLm9rKXtsZXQgbT1uZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICR7Zi5zdGF0dXN9YCk7dGhyb3cgbS5yZXNwb25zZT1mLG19cmV0dXJuIGZ9ZnVuY3Rpb24gbWEoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/YFske2UubWFwKG1hKS5qb2luKCIsIil9XWA6ZSYmdHlwZW9mIGU9PSJvYmplY3QiP2B7JHtPYmplY3Qua2V5cyhlKS5zb3J0KCkubWFwKG89PmAke0pTT04uc3RyaW5naWZ5KG8pfToke21hKGVbb10pfWApLmpvaW4oIiwiKX19YDpKU09OLnN0cmluZ2lmeShlKX12YXIgU009MixFTT1bL14oPzooPzpzdW4oPzpkYXkpP3xtb24oPzpkYXkpP3x0dWUoPzpzZGF5KT98d2VkKD86bmVzZGF5KT98dGh1KD86cnNkYXkpP3xmcmkoPzpkYXkpP3xzYXQoPzp1cmRheSk/KSw/XHMrKT8oPzpqYW4oPzp1YXJ5KT98ZmViKD86cnVhcnkpP3xtYXIoPzpjaCk/fGFwcig/OmlsKT98bWF5fGp1big/OmUpP3xqdWwoPzp5KT98YXVnKD86dXN0KT98c2VwKD86dCg/OmVtYmVyKT8pP3xvY3QoPzpvYmVyKT98bm92KD86ZW1iZXIpP3xkZWMoPzplbWJlcik/KVxzK1xkezEsMn0oPzpzdHxuZHxyZHx0aCk/KD86LFxzKik/XGR7NH0kL2ksL15cZHs0fS1cZHsxLDJ9LVxkezEsMn0kLywvXlxkezEsMn1bLy1dXGR7MSwyfVsvLV1cZHsyLDR9JC8sL15cZHsxLDJ9XHMrKD86amFuKD86dWFyeSk/fGZlYig/OnJ1YXJ5KT98bWFyKD86Y2gpP3xhcHIoPzppbCk/fG1heXxqdW4oPzplKT98anVsKD86eSk/fGF1Zyg/OnVzdCk/fHNlcCg/OnQoPzplbWJlcik/KT98b2N0KD86b2Jlcik/fG5vdig/OmVtYmVyKT98ZGVjKD86ZW1iZXIpPylccytcZHs0fSQvaV0sTk09e2NvbmZlcmVuY2U6WyJjb25mZXJlbmNlIiwiY29udmVudGlvbiIsImV4cG8iLCJzdW1taXQiLCJ3b3Jrc2hvcCIsIm9mZnNpdGUiLCJyZXRyZWF0Il0sdHJhdmVsOlsiYWlycG9ydCIsImZsaWdodCIsImhvdGVsIiwicm9hZCB0cmlwIiwidHJpcCIsInRyYXZlbCJdLHZhY2F0aW9uOlsiaG9saWRheSIsIm9vbyIsInB0byIsInZhY2F0aW9uIl19LFRNPTUsR209NCxqbT01NTAsRE09MzAsUTA9Mzthc3luYyBmdW5jdGlvbiBNYyhlLHtjYWxlbmRhckV2ZW50czp0PW51bGwsZG9tYWluVXVpZDpuPW51bGwsdGFyZ2V0RGF0ZTpvPW5ldyBEYXRlfT17fSl7bGV0IHI9ZXIobyksW2EsaV09YXdhaXQgUHJvbWlzZS5hbGwoW1JNKGUse2RvbWFpblV1aWQ6bix0YXJnZXREYXRlOnJ9KSxBTShlLHtjYWxlbmRhckV2ZW50czp0LGRvbWFpblV1aWQ6bix0YXJnZXREYXRlOnJ9KV0pLHM9Q00oaSksbD1zLmlzVHJhdmVsTGlrZT9hd2FpdCBJTShlLHMucmVzZWFyY2hUZXJtcykuY2F0Y2godT0+KGsoIltyZWNvbW1lbmRhdGlvbi1jb250ZXh0XSByZXNlYXJjaCBub3RlIGxvb2t1cCBmYWlsZWQiLHU/Lm1lc3NhZ2UpLFtdKSk6W10sZD17YWxsRGF5RXZlbnRzOmksY29tcGxldGlvblBhdHRlcm5zOmEsZXZlbnRDb250ZXh0OnMscmVzZWFyY2hOb3RlczpsLHRhcmdldERhdGVLZXk6YWUocil9LGM9WjAoZCk7cmV0dXJuey4uLmQsY2FjaGVLZXk6YyxmaW5nZXJwcmludDpPTShkKX19YXN5bmMgZnVuY3Rpb24gQU0oZSx7Y2FsZW5kYXJFdmVudHM6dD1udWxsLGRvbWFpblV1aWQ6bj1udWxsLHRhcmdldERhdGU6bz1uZXcgRGF0ZX09e30pe2xldCByPUFycmF5LmlzQXJyYXkodCk/dDphd2FpdCBoMChlLG8sbik7cmV0dXJuIHVpKHIpLmZpbHRlcihkPT5kPy5hbGxEYXkmJm0wKGQsbykpLnNsaWNlKDAsVE0pLm1hcChkPT4oe2VuZEtleTpkLmVuZD9hZShkLmVuZCk6bnVsbCxzdGFydEtleTpkLnN0YXJ0P2FlKGQuc3RhcnQpOm51bGwsdGl0bGU6WW4oZC50aXRsZSl8fCJBbGwtZGF5IGV2ZW50In0pKX1mdW5jdGlvbiBDTShlKXtsZXQgdD0oZXx8W10pLm1hcChzPT5zLnRpdGxlKS5maWx0ZXIoQm9vbGVhbiksbj10LmpvaW4oIiAiKS50b0xvd2VyQ2FzZSgpLHI9T2JqZWN0LmVudHJpZXMoTk0pLmZpbHRlcigoWyxzXSk9PnMuc29tZShsPT5uLmluY2x1ZGVzKGwpKSkubWFwKChbc10pPT5zKSxhPXIuc29tZShzPT5zPT09InRyYXZlbCJ8fHM9PT0idmFjYXRpb24ifHxzPT09ImNvbmZlcmVuY2UiKSxpPXR4KHQuZmxhdE1hcChVTSkpO3JldHVybntjYXRlZ29yaWVzOnIsaXNUcmF2ZWxMaWtlOmEscmVzZWFyY2hUZXJtczppLHRpdGxlczp0fX1mdW5jdGlvbiBNTShlKXtsZXQgdD1ZbihlKTtyZXR1cm4gdD9FTS5zb21lKG49Pm4udGVzdCh0KSk6ITF9ZnVuY3Rpb24gWjAoZSl7bGV0IG49KGUuYWxsRGF5RXZlbnRzfHxbXSkubWFwKGE9Pih7c3RhcnRLZXk6YS5zdGFydEtleXx8bnVsbCx0aXRsZTphLnRpdGxlfHwiIn0pKS5zb3J0KChhLGkpPT5gJHthLnN0YXJ0S2V5fSR7YS50aXRsZX1gLmxvY2FsZUNvbXBhcmUoYCR7aS5zdGFydEtleX0ke2kudGl0bGV9YCkpLG89KGUuY29tcGxldGlvblBhdHRlcm5zfHxbXSkubWFwKGE9Pih7Y29tcGxldGVkQ291bnQ6YS5jb21wbGV0ZWRDb3VudCxub3RlTmFtZTphLm5vdGVOYW1lLG5vdGVVdWlkOmEubm90ZVV1aWR9KSkscj0oZS5yZXNlYXJjaE5vdGVzfHxbXSkubWFwKGE9Pih7bmFtZTphLm5hbWUsdXVpZDphLnV1aWR9KSk7cmV0dXJue2FsbERheUV2ZW50czpuLGNvbXBsZXRpb25QYXR0ZXJuczpvLGV2ZW50Q2F0ZWdvcmllczplLmV2ZW50Q29udGV4dD8uY2F0ZWdvcmllc3x8W10scmVzZWFyY2hOb3RlczpyLHRhcmdldERhdGVLZXk6ZS50YXJnZXREYXRlS2V5fHxudWxsfX1mdW5jdGlvbiBPTShlKXtsZXQgdD1lLmNhY2hlS2V5fHxaMChlKTtyZXR1cm4gbWEodCl9YXN5bmMgZnVuY3Rpb24gSU0oZSx0KXtsZXQgbj10eCgodHx8W10pLm1hcChsPT5ZbihsKSkuZmlsdGVyKGw9PmwubGVuZ3RoPj1RMCkpO2lmKG4ubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbz1uZXcgTWFwO2ZvcihsZXQgbCBvZiBuLnNsaWNlKDAsR20pKXtsZXQgZD1hd2FpdCB1YShlLmZpbHRlck5vdGVzKHtxdWVyeTpsfSwicmVsZXZhbmNlIikpLmNhdGNoKCgpPT5bXSk7Zm9yKGxldCBjIG9mIGQuc2xpY2UoMCxHbSkpVm0obyxjLGwsMyl9bGV0IHI9YXdhaXQgdWEoZS5maWx0ZXJOb3Rlcyh7fSwiY2hhbmdlZCIpKS5jYXRjaCgoKT0+W10pO2ZvcihsZXQgbCBvZiByLnNsaWNlKDAsRE0pKXtpZighbD8udXVpZCljb250aW51ZTtsZXQgZD1uLmZpbHRlcihwPT5ZbihsLm5hbWUpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocC50b0xvd2VyQ2FzZSgpKSk7aWYoZC5sZW5ndGgmJlZtKG8sbCxkWzBdLDIpLG8uaGFzKGwudXVpZCkmJm8uZ2V0KGwudXVpZCkuc25pcHBldCljb250aW51ZTtsZXQgYz1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOmwudXVpZH0pLmNhdGNoKCgpPT4iIiksdT1uLmZpbmQocD0+Yy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHAudG9Mb3dlckNhc2UoKSkpO3UmJlZtKG8sbCx1LDEsZXgoYyx1KSl9cmV0dXJuKGF3YWl0IF9NKGUsbykpLnNvcnQoKGwsZCk9PmQuc2NvcmUtbC5zY29yZXx8bC5uYW1lLmxvY2FsZUNvbXBhcmUoZC5uYW1lKSkuc2xpY2UoMCxHbSl9YXN5bmMgZnVuY3Rpb24gUk0oZSx7ZG9tYWluVXVpZDp0PW51bGwsdGFyZ2V0RGF0ZTpuPW5ldyBEYXRlfT17fSl7aWYodHlwZW9mIGUuZ2V0Q29tcGxldGVkVGFza3MhPSJmdW5jdGlvbiIpcmV0dXJuW107bGV0IG89dD9hd2FpdCBxayhlLHQpOm51bGwscj1bXTtmb3IobGV0IHU9MTt1PD1TTTt1Kz0xKXIucHVzaChuZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLXUqNykpO2xldCBhPWF3YWl0IFByb21pc2UuYWxsKHIubWFwKHU9PlBNKGUsdSkpKSxpPW5ldyBNYXA7Zm9yKGxldCB1PTA7dTxyLmxlbmd0aDt1Kz0xKWZvcihsZXQgcCBvZiBhW3VdKXtpZihvJiYhby5oYXMocC51dWlkKSljb250aW51ZTtsZXQgZj1wLm5vdGVVVUlEfHxudWxsO2lmKCFmKWNvbnRpbnVlO2xldCBtPVluKHAubm90ZU5hbWV8fHAubm90ZVRpdGxlfHxwLm5vdGU/Lm5hbWUpO2kuaGFzKGYpfHxpLnNldChmLHtjb21wbGV0ZWRDb3VudDowLGRhdGVzOm5ldyBTZXQsbm90ZU5hbWU6bSxub3RlVXVpZDpmfSk7bGV0IGc9aS5nZXQoZik7Zy5jb21wbGV0ZWRDb3VudCs9MSxnLmRhdGVzLmFkZChhZShyW3VdKSksIWcubm90ZU5hbWUmJm0mJihnLm5vdGVOYW1lPW0pfXJldHVybiBhd2FpdCBMTShlLGkpLFsuLi5pLnZhbHVlcygpXS5maWx0ZXIodT0+dS5ub3RlTmFtZSkuZmlsdGVyKHU9PiFNTSh1Lm5vdGVOYW1lKSkubWFwKHU9Pih7Y29tcGxldGVkQ291bnQ6dS5jb21wbGV0ZWRDb3VudCxkYXRlczpbLi4udS5kYXRlc10uc29ydCgpLG5vdGVOYW1lOnUubm90ZU5hbWUsbm90ZVV1aWQ6dS5ub3RlVXVpZH0pKS5zb3J0KCh1LHApPT5wLmNvbXBsZXRlZENvdW50LXUuY29tcGxldGVkQ291bnR8fHUubm90ZU5hbWUubG9jYWxlQ29tcGFyZShwLm5vdGVOYW1lKSl9ZnVuY3Rpb24gVm0oZSx0LG4sbyxyPSIiKXtpZighdD8udXVpZClyZXR1cm47bGV0IGE9ZS5nZXQodC51dWlkKXx8e21hdGNoZWRUZXJtczpuZXcgU2V0LG5hbWU6WW4odC5uYW1lKXx8IlVudGl0bGVkIG5vdGUiLHNjb3JlOjAsc25pcHBldDoiIix1dWlkOnQudXVpZH07YS5zY29yZSs9byxhLm1hdGNoZWRUZXJtcy5hZGQobiksciYmKCFhLnNuaXBwZXR8fHIubGVuZ3RoPmEuc25pcHBldC5sZW5ndGgpJiYoYS5zbmlwcGV0PXIpLGUuc2V0KHQudXVpZCxhKX1mdW5jdGlvbiBZbihlKXtyZXR1cm4gU3RyaW5nKGV8fCIiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKX1hc3luYyBmdW5jdGlvbiBQTShlLHQpe2xldCBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCksMCwwLDAsMCksbz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKzEsMCwwLDAsMCkscj1hd2FpdCBlLmdldENvbXBsZXRlZFRhc2tzKE1hdGguZmxvb3Iobi5nZXRUaW1lKCkvMWUzKSxNYXRoLmZsb29yKG8uZ2V0VGltZSgpLzFlMykpLmNhdGNoKGk9PihrKCJbcmVjb21tZW5kYXRpb24tY29udGV4dF0gZ2V0Q29tcGxldGVkVGFza3MgZmFpbGVkIixpPy5tZXNzYWdlKSxbXSkpO3JldHVybiBBcnJheS5pc0FycmF5KHIpP3IuZmlsdGVyKGk9Pmk/LmNvbXBsZXRlZEF0KTpbXX1hc3luYyBmdW5jdGlvbiBMTShlLHQpe2F3YWl0IFByb21pc2UuYWxsKFsuLi50LnZhbHVlcygpXS5tYXAoYXN5bmMgbj0+e2lmKG4ubm90ZU5hbWUpcmV0dXJuO2xldCBvPWF3YWl0IGUuZmluZE5vdGUoe3V1aWQ6bi5ub3RlVXVpZH0pLmNhdGNoKCgpPT5udWxsKTtuLm5vdGVOYW1lPVluKG8/Lm5hbWUpfSkpfWFzeW5jIGZ1bmN0aW9uIF9NKGUsdCl7bGV0IG49W107Zm9yKGxldCBvIG9mIHQudmFsdWVzKCkpe2lmKCFvLnNuaXBwZXQpe2xldCByPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6by51dWlkfSkuY2F0Y2goKCk9PiIiKSxhPVsuLi5vLm1hdGNoZWRUZXJtc11bMF18fCIiO28uc25pcHBldD1hP2V4KHIsYSk6WW4ocikuc3Vic3RyaW5nKDAsam0pfW4ucHVzaCh7bWF0Y2hlZFRlcm1zOlsuLi5vLm1hdGNoZWRUZXJtc10uc29ydCgpLG5hbWU6by5uYW1lLHNjb3JlOm8uc2NvcmUsc25pcHBldDpvLnNuaXBwZXQsdXVpZDpvLnV1aWR9KX1yZXR1cm4gbn1mdW5jdGlvbiBVTShlKXtyZXR1cm4gWW4oZSkucmVwbGFjZSgvXGIoPzpvb298cHRvfHZhY2F0aW9ufGhvbGlkYXl8dHJhdmVsfHRyaXB8Y29uZmVyZW5jZXxzdW1taXR8ZmxpZ2h0fGhvdGVsfHRvfGlufGF0fGZvcnx0aGV8YW5kKVxiL2dpLCIgIikuc3BsaXQoL1stOnwsKCkvXSsvKS5tYXAoYT0+WW4oYSkpLmZpbHRlcihhPT5hLmxlbmd0aD49UTApfWZ1bmN0aW9uIGV4KGUsdCl7bGV0IG49WW4oZSk7aWYoIW4pcmV0dXJuIiI7bGV0IG89bi50b0xvd2VyQ2FzZSgpLmluZGV4T2YodC50b0xvd2VyQ2FzZSgpKTtpZihvPDApcmV0dXJuIG4uc3Vic3RyaW5nKDAsam0pO2xldCByPU1hdGgubWF4KDAsby0xNjApO3JldHVybiBuLnN1YnN0cmluZyhyLHIram0pfWZ1bmN0aW9uIHR4KGUpe2xldCB0PW5ldyBTZXQ7cmV0dXJuKGV8fFtdKS5maWx0ZXIobz0+e2xldCByPVluKG8pLnRvTG93ZXJDYXNlKCk7cmV0dXJuIXJ8fHQuaGFzKHIpPyExOih0LmFkZChyKSwhMCl9KX1mdW5jdGlvbiBPYyhlLHthbGxvd0ludmVudGVkVHJhdmVsQWN0aXZpdGllczp0PSExLHNjaGVkdWxlTW9kZTpuPSExfT17fSl7aWYoIWUpcmV0dXJuIiI7bGV0IG89W10scj1GTShlLHthbGxvd0ludmVudGVkVHJhdmVsQWN0aXZpdGllczp0LHNjaGVkdWxlTW9kZTpufSk7ciYmby5wdXNoKHIpO2xldCBhPXpNKGUpO3JldHVybiBhJiZvLnB1c2goYSksby5sZW5ndGg/YAoKIyMgRGF5LXNwZWNpZmljIHJlY29tbWVuZGF0aW9uIGNvbnRleHQKJHtvLmpvaW4oYAoKYCl9YDoiIn1mdW5jdGlvbiBJYyhlKXtyZXR1cm4hIWU/LmV2ZW50Q29udGV4dD8uaXNUcmF2ZWxMaWtlfWZ1bmN0aW9uIEZNKGUse2FsbG93SW52ZW50ZWRUcmF2ZWxBY3Rpdml0aWVzOnQsc2NoZWR1bGVNb2RlOm59KXtsZXQgbz1lLmFsbERheUV2ZW50c3x8W107aWYoby5sZW5ndGg9PT0wKXJldHVybiIiO2xldCByPW8ubWFwKGk9PmAtICR7aS50aXRsZX1gKS5qb2luKGAKYCksYT0oZS5yZXNlYXJjaE5vdGVzfHxbXSkuc2xpY2UoMCw0KS5tYXAoaT0+YC0gJHtpLm5hbWV9ICgke2kubWF0Y2hlZFRlcm1zLmpvaW4oIiwgIil9KTogJHtpLnNuaXBwZXR9YCkuam9pbihgCmApO3JldHVybiBJYyhlKT9gQWxsLWRheSBldmVudCBvdmVycmlkZTogdGhlIHRhcmdldCBkYXkgaW5jbHVkZXMgdHJhdmVsL3ZhY2F0aW9uL2NvbmZlcmVuY2UgY29udGV4dC4gVGhpcyBvdmVycmlkZXMgb3JkaW5hcnkgd2Vla2RheSByb3V0aW5lcyBhbmQgaGlzdG9yaWNhbCBwcm9qZWN0IHRlbmRlbmNpZXMuCkFsbC1kYXkgZXZlbnRzOgoke3J9CiR7dD8iSW4gdGhpcyB0cmF2ZWwvdmFjYXRpb24gbW9kZSwgeW91IE1BWSBwcm9wb3NlIHVzZWZ1bCBsb2NhbCBhY3Rpdml0aWVzIGV2ZW4gd2hlbiBubyBjYW5kaWRhdGUgdGFzayBVVUlEIGV4aXN0czsgdXNlIG51bGwgZm9yIHRhc2tVdWlkIGFuZCBleHBsYWluIHdoeSBpdCBmaXRzIHRoZSB0cmlwLiI6IklmIHlvdSBwcm9wb3NlIGEgbmV3IGlkZWEgaW5zcGlyZWQgYnkgdHJhdmVsIHJlc2VhcmNoLCB1c2UgbnVsbCBmb3IgdGhlIHRhc2sgVVVJRCBvbmx5IHdoZW4gdGhpcyByZXNwb25zZSBmb3JtYXQgcGVybWl0cyBpbnZlbnRlZCB0YXNrcy4ifQoke24/IktlZXAgdGhlIHNjaGVkdWxlIGxpZ2h0IGFuZCByZWFsaXN0aWMgYXJvdW5kIHRyYXZlbCBsb2dpc3RpY3M7IGF2b2lkIGRlZmF1bHRpbmcgdG8gbm9ybWFsIHdvcmsgYmxvY2tzIHVubGVzcyB0aGUgZXZlbnQgaXMgY2xlYXJseSB3b3JrL2NvbmZlcmVuY2UgdGltZS4iOiJGYXZvciByZWNvbW1lbmRhdGlvbnMgdGhhdCByZXNwZWN0IHRoZSB1c2VyJ3MgbG9jYXRpb24sIHRyaXAgcHVycG9zZSwgYW5kIGF2YWlsYWJsZSBlbmVyZ3kuIn0KJHthP2BSZWxldmFudCByZXNlYXJjaCBub3RlczoKJHthfWA6Ik5vIG1hdGNoaW5nIHJlc2VhcmNoLW5vdGUgc25pcHBldHMgd2VyZSBmb3VuZDsgdXNlIGdlbmVyYWxseSBwb3B1bGFyIGxvY2FsIG9wdGlvbnMgb25seSBpZiB0aGUgZXZlbnQgdGl0bGUgcmV2ZWFscyBhIHBsYWNlIG9yIGV2ZW50LiJ9YDpgQWxsLWRheSBldmVudHMgb24gdGhlIHRhcmdldCBkYXk6CiR7cn0KVHJlYXQgdGhlc2UgYXMgZGF5LWxldmVsIGNvbnN0cmFpbnRzLiBUaGV5IGRvIG5vdCBvY2N1cHkgYSBzcGVjaWZpYyBjbG9jayByYW5nZSwgYnV0IHRoZXkgc2hvdWxkIGluZmx1ZW5jZSBob3cgYW1iaXRpb3VzIG9yIHdvcmstZm9jdXNlZCB0aGUgcmVjb21tZW5kYXRpb25zIGFyZS5gfWZ1bmN0aW9uIHpNKGUpe2xldCB0PShlLmNvbXBsZXRpb25QYXR0ZXJuc3x8W10pLnNsaWNlKDAsOCk7cmV0dXJuIHQubGVuZ3RoPT09MD8iIjpgU2FtZS13ZWVrZGF5IGNvbXBsZXRpb24gcGF0dGVybnMgZnJvbSB0aGUgcGFzdCB0d28gd2Vla3M6CiR7dC5tYXAobz0+YC0gJHtvLm5vdGVOYW1lfSAoJHtvLm5vdGVVdWlkfSk6ICR7by5jb21wbGV0ZWRDb3VudH0gdGFzayhzKSBjb21wbGV0ZWQgYWNyb3NzICR7by5kYXRlcy5qb2luKCIsICIpfWApLmpvaW4oYApgKX0KVGhlc2Ugbm90ZSBuYW1lcyBvZnRlbiBjb3JyZXNwb25kIHRvIHByb2plY3RzIG9yIHJlc3BvbnNpYmlsaXRpZXMuIFVzZSB0aGVtIGFzIGEgc29mdCBzaWduYWwgdGhhdCBzaW1pbGFyIHdvcmsgbWF5IGZpdCB0aGlzIHdlZWtkYXksIHVubGVzcyBhbGwtZGF5IHRyYXZlbC92YWNhdGlvbi9jb25mZXJlbmNlIGNvbnRleHQgYWJvdmUgc3VnZ2VzdHMgYSBkaWZmZXJlbnQga2luZCBvZiBkYXkuYH12YXIgV009WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLEJNPTUwLEhNPTJlMyxLTT0zZTMsR009MWUzLFZNPTFlMyxyeD01MDAsbng9ODY0MDAscXM9MWUxMCxqTT02MCxZTT0zLHFNPTIwMCwkTT00MDEsWE09NDAzLEpNPTEsUU09MTAsWk09NSxlTz03LHRPPTUsbk89LjUsb089MyxyTz0yMCxhTz0xNSxpTz0xNSxzTz04LGxPPTI1LGRPPTIwLGNPPTEyLHVPPTUscE89NSxmTz0zLG1PPTE1LGhPPTEwLGdPPTUsb3g9MSx5Tz0zLHZPPTcsYk89InN1ZyIsd089MWU2LGtPPS4xO2FzeW5jIGZ1bmN0aW9uIGF4KGUse2V4Y2x1ZGVVdWlkczp0LGV4aXN0aW5nTm90ZUhhbmRsZTpuLG1pbmltdW1UYXNrQ291bnQ6bz0xLG5vdGVOYW1lOnI9YERhc2hib2FyZCBwcm9wb3NlZCB0YXNrcyBmb3IgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFtdLHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0pfWAscHJvdmlkZXJFbU92ZXJyaWRlOmF9PXt9KXtsZXQgaT1NYXRoLm1heCgxLHBhcnNlSW50KG8sMTApfHwxKSxzPXQgaW5zdGFuY2VvZiBTZXQ/dDpudWxsLGw9bmV3IERhdGUsZD1XTVtsLmdldERheSgpXSxjPUJuW2wuZ2V0TW9udGgoKV0sdT1sLmdldERheSgpPT09MHx8bC5nZXREYXkoKT09PTY7aygiW2RyZWFtLXRhc2tdIGFuYWx5emVEcmVhbVRhc2tzIGVudHJ5Iix7bm90ZU5hbWU6cixtaW5pbXVtU3VnZ2VzdGlvbkNvdW50OmksZXhjbHVkZVV1aWRzU2l6ZTpzPy5zaXplPz8wLHByb3ZpZGVyRW1PdmVycmlkZTphPz9udWxsLGV4aXN0aW5nTm90ZUhhbmRsZVV1aWQ6bj8udXVpZD8/bnVsbH0pO2xldCBwPWF3YWl0IFNPKGUscixuKSxmPXAuY2FjaGVkLnRhc2tzLmZpbHRlcihLPT4hUGMoSykpO2soIltkcmVhbS10YXNrXSBjYWNoZWQtbm90ZSBzdGF0ZSIse25vdGVVVUlEOnAubm90ZUhhbmRsZT8udXVpZD8/bnVsbCxleGlzdGluZ0NvbnRlbnRMZW5ndGg6cC5leGlzdGluZ0NvbnRlbnQ/Lmxlbmd0aD8/MCxjYWNoZWRUYXNrQ291bnQ6cC5jYWNoZWQudGFza3MubGVuZ3RoLG1ldGFkYXRhVW5kaXNtaXNzZWRDb3VudDpmLmxlbmd0aCxtaW5pbXVtU3VnZ2VzdGlvbkNvdW50Oml9KTtsZXQgbT1hd2FpdCBOTyhlLHAuY2FjaGVkLnRhc2tzKSxnPVJjKGYuZmlsdGVyKEs9PiFZbShLLG0ubmF0aXZlVGFza0Zyb21UYXNrVXVpZCkpKTtpZihrKCJbZHJlYW0tdGFza10gY2FjaGUgYXZhaWxhYmlsaXR5IGFmdGVyIG5hdGl2ZSBjb21wbGV0aW9uIGNoZWNrIix7YXZhaWxhYmxlQ2FjaGVkQ291bnQ6Zy5sZW5ndGgsbWluaW11bVN1Z2dlc3Rpb25Db3VudDppLHdpbGxVc2VDYWNoZTpnLmxlbmd0aD49aX0pLGcubGVuZ3RoPj1pKXJldHVybiBETyhwLG0pO2xldCB3PWF3YWl0IFRPKGUpLHY9Zy5tYXAoSz0+Sy51dWlkKS5maWx0ZXIoQm9vbGVhbikseT1uZXcgU2V0KFsuLi5zfHxbXSwuLi52XSksYj1NYXRoLm1heChZTSxpLWcubGVuZ3RoKSxoPUFPKHcub3BlblRhc2tzLHkpLFM9dy5kb21haW5OYW1lJiZ3Lm1pZ3JhdGlvbkRvbWFpbk5hbWUmJncuZG9tYWluTmFtZT09PXcubWlncmF0aW9uRG9tYWluTmFtZSx4PWF3YWl0IFRvKGUsUyx3LmRvbWFpbk5hbWUsTXIoKS5sYWJlbCksRT10cih3LmRvbWFpbk5hbWUsTXIoKS5sYWJlbCksVD1udWxsLEE9bnVsbCxDPW51bGw7aWYoeCl7bGV0IEs9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp4LnV1aWR9KTtLPyhUPUssQT1saShLLGMpLEM9bGkoSyxsYyhzYygpKSkpOmsoYFtkcmVhbS10YXNrXSBFcnJvcjogUGxhbiBub3RlICIke0V9IiBmb3VuZCBidXQgY29udGVudCBpcyBlbXB0eWApfWVsc2UgayhgW2RyZWFtLXRhc2tdIE5vIHBsYW4gbm90ZSBmb3VuZCBmb3IgIiR7RX0iYCk7bGV0IE89cC5leGlzdGluZ0NvbnRlbnQ/cC5leGlzdGluZ0NvbnRlbnQuc3Vic3RyaW5nKDAsSE0pOm51bGwsUD17bW9udGhseUNvbnRlbnQ6QSxwcmV2aW91c0FuYWx5c2VzOk8scXVhcnRlcmx5Q29udGVudDpULHdlZWtseUNvbnRlbnQ6Q30sVT1hd2FpdCBNYyhlLHtkb21haW5VdWlkOncuZG9tYWluVXVpZCx0YXJnZXREYXRlOmx9KSxJPXhPKGwsZCxjKTtpZighKFAucXVhcnRlcmx5Q29udGVudHx8UC5tb250aGx5Q29udGVudHx8UC53ZWVrbHlDb250ZW50KSYmaC5sZW5ndGg9PT0wKXJldHVybiBrKGBbZHJlYW0tdGFza10gTm8gcGxhbm5pbmcgZGF0YSBlcnJvciBmb3IgJHtJfS4gcGxhbm5pbmdDb250ZXh0IGlzICR7UH0gKGtleXMgJHtPYmplY3Qua2V5cyhQKX0pLCBjYW5kaWRhdGVUYXNrcyBsZW5ndGggJHtoLmxlbmd0aH0uIFBsYW4gbm90ZSAnJHtFfScgZmluZE5vdGUgeWllbGRzICR7YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpFfSl9YCkse3Rhc2tzOltdLGVycm9yOiJObyBwbGFubmluZyBkYXRhIG9yIHRhc2tzIGZvdW5kIHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zIGZyb20uIFBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIixlcnJvckNvZGU6Im5vX3BsYW5uaW5nX2RhdGEiLG5vdGVVVUlEOnAubm90ZUhhbmRsZS51dWlkfTtsZXQgXz1hd2FpdCBDTyh7YXBwOmUsY2FuZGlkYXRlVGFza3M6aCxkYXRlSGVhZGluZzpJLGRheU5hbWU6ZCxpc1dlZWtlbmQ6dSxub3RlVXVpZEZyb21UYXNrVXVpZDp3Lm5vdGVVdWlkRnJvbVRhc2tVdWlkLHByb3ZpZGVyRW1PdmVycmlkZTphLHBsYW5uaW5nQ29udGV4dDpQLHJlY29tbWVuZGF0aW9uQ29udGV4dDpVLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDpifSk7cmV0dXJuIF8uZXJyb3I/e3Rhc2tzOltdLGVycm9yOl8uZXJyb3IsZXJyb3JDb2RlOl8uZXJyb3JDb2RlLGVycm9yRGV0YWlsOl8uZXJyb3JEZXRhaWwsbm90ZVVVSUQ6cC5ub3RlSGFuZGxlLnV1aWR9Oihhd2FpdCBPTyhlLHAuZXhpc3RpbmdDb250ZW50LF8uZ29hbHNTdW1tYXJ5LHAubm90ZUhhbmRsZSxfLmVuZm9yY2VkVGFza3MpLElPKHAsdyxfKSl9ZnVuY3Rpb24geE8oZSx0LG4pe3JldHVybmAke3R9ICR7bn0gJHtlLmdldERhdGUoKX0sICR7ZS5nZXRGdWxsWWVhcigpfWB9YXN5bmMgZnVuY3Rpb24gU08oZSx0LG4pe2xldCBvPWF3YWl0IEVPKGUsdCxuKSxyPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6by51dWlkfSksYT10eXBlb2Ygcj09InN0cmluZyI/ci5yZXBsYWNlKC9cclxuL2csYApgKToiIjtyZXR1cm57bm90ZUhhbmRsZTpvLGV4aXN0aW5nQ29udGVudDphLGNhY2hlZDpMTyhhKX19YXN5bmMgZnVuY3Rpb24gRU8oZSx0LG4pe2lmKG4/LnV1aWQpcmV0dXJuIGsoIltkcmVhbS10YXNrXSBfcmVzb2x2ZURyZWFtVGFza05vdGVIYW5kbGU6IHVzaW5nIGV4aXN0aW5nTm90ZUhhbmRsZSIsbi51dWlkKSxuO2xldCBvPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6dCx0YWdzOlt3ZV19KTtpZihvKXJldHVybiBrKCJbZHJlYW0tdGFza10gX3Jlc29sdmVEcmVhbVRhc2tOb3RlSGFuZGxlOiBmaW5kTm90ZSBsb2NhdGVkIixvLnV1aWQsImZvciIsdCksbztsZXQgcj1hd2FpdCBlLmNyZWF0ZU5vdGUodCxbd2VdLHthcmNoaXZlOiEwfSk7cmV0dXJuIGsoYFtkcmVhbS10YXNrXSBDcmVhdGVkIGRhaWx5IG5vdGUgIiR7dH0iIHdpdGggdXVpZCAke3J9YCkse3V1aWQ6cn19YXN5bmMgZnVuY3Rpb24gTk8oZSx0KXtsZXQgbj10LmZpbHRlcihzPT5zLnV1aWQmJiFQYyhzKSkubWFwKHM9PnMudXVpZCksbz0oYXdhaXQgUHJvbWlzZS5hbGwobi5tYXAocz0+ZS5nZXRUYXNrKHMpLmNhdGNoKCgpPT5udWxsKSkpKS5maWx0ZXIoQm9vbGVhbikscj1seChvKSxhPXN4KG8pLGk9YXdhaXQgaXgoZSxvKTtyZXR1cm57bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpyLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmksbm90ZVV1aWRGcm9tVGFza1V1aWQ6YSxkZWZhdWx0Tm90ZVVVSUQ6bnVsbH19YXN5bmMgZnVuY3Rpb24gVE8oZSl7bGV0e2RvbWFpbk5hbWU6dCxkb21haW5VdWlkOm4sbWlncmF0aW9uRG9tYWluTmFtZTpvfT1hd2FpdCBwbyhlKSxyPWF3YWl0IEtuKGUsbiksYT1yLmZpbHRlcihjPT4hYy5jb21wbGV0ZWRBdCYmIWMuZGlzbWlzc2VkQXQpO2soYFtkcmVhbS10YXNrXSBGb3VuZCAke2EubGVuZ3RofSBvcGVuIHRhc2tzIGZyb20gJHtuP2Bkb21haW4gJHtufSAoJHt0fSlgOiJhbGwgbm90ZXMgKGNvdWxkbid0IGZpbmQgYSBkb21haW5VdWlkKSJ9YCk7bGV0IGk9YXdhaXQgaXgoZSxhKSxzPWx4KHIpLGw9c3goYSksZD1QTyhyKTtyZXR1cm4gayhgW2RyZWFtLXRhc2tdIERlZmF1bHQgbm90ZSBmb3IgbmV3IHRhc2tzOiAke2R9YCkse2FsbFRhc2tzOnIsZGVmYXVsdE5vdGVVVUlEOmQsZG9tYWluTmFtZTp0LGRvbWFpblV1aWQ6bixtaWdyYXRpb25Eb21haW5OYW1lOm8sbmF0aXZlVGFza0Zyb21UYXNrVXVpZDpzLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmksbm90ZVV1aWRGcm9tVGFza1V1aWQ6bCxvcGVuVGFza3M6YX19YXN5bmMgZnVuY3Rpb24gaXgoZSx0KXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgciBvZiB0KXIubm90ZVVVSUQmJm4uYWRkKHIubm90ZVVVSUQpO2xldCBvPW5ldyBNYXA7Zm9yKGxldCByIG9mIHQpe2lmKCFyLm5vdGVVVUlEKWNvbnRpbnVlO2xldCBhPShyLm5vdGVOYW1lfHxyLm5vdGVUaXRsZXx8IiIpLnRyaW0oKTthJiZvLnNldChyLm5vdGVVVUlELGEpfXJldHVybiBhd2FpdCBQcm9taXNlLmFsbChbLi4ubl0ubWFwKGFzeW5jIHI9PntpZighby5oYXMocikpdHJ5e2xldCBhPWF3YWl0IGUuZmluZE5vdGUoe3V1aWQ6cn0pO2E/Lm5hbWUmJm8uc2V0KHIsYS5uYW1lKX1jYXRjaChhKXtrKCJbZHJlYW0tdGFza10gZmluZE5vdGUoeyB1dWlkIH0pIGZhaWxlZDoiLHIsYSl9fSkpLG99ZnVuY3Rpb24gc3goZSl7bGV0IHQ9bmV3IE1hcDtmb3IobGV0IG4gb2YgZSluLnV1aWQmJm4ubm90ZVVVSUQmJnQuc2V0KG4udXVpZCxuLm5vdGVVVUlEKTtyZXR1cm4gdH1mdW5jdGlvbiBseChlKXtsZXQgdD1uZXcgTWFwO2ZvcihsZXQgbiBvZiBlKW4udXVpZCYmdC5zZXQobi51dWlkLG4pO3JldHVybiB0fWZ1bmN0aW9uIERPKGUsdCl7ayhgW2RyZWFtLXRhc2tdIFVzaW5nICR7ZS5jYWNoZWQudGFza3MubGVuZ3RofSBjYWNoZWQgZGFpbHkgc3VnZ2VzdGlvbnMgZnJvbSBub3RlYCk7bGV0e25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6bixub3RlTmFtZUZyb21Ob3RlVXVpZDpvLG5vdGVVdWlkRnJvbVRhc2tVdWlkOnJ9PXQsYT1lLmNhY2hlZC50YXNrcy5maWx0ZXIocz0+IVBjKHMpJiYhWW0ocyxuKSk7cmV0dXJue3Rhc2tzOlJjKGEpLm1hcChzPT5keChjeChzKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpuLG5vdGVOYW1lRnJvbU5vdGVVdWlkOm8sbm90ZVV1aWRGcm9tVGFza1V1aWQ6cn0pKSxnb2Fsc1N1bW1hcnk6ZS5jYWNoZWQuZ29hbHNTdW1tYXJ5LGNhY2hlZDohMCxub3RlVVVJRDplLm5vdGVIYW5kbGUudXVpZCxkZWZhdWx0Tm90ZVVVSUQ6dC5kZWZhdWx0Tm90ZVVVSUQsc2hvd25VdWlkczpbXX19ZnVuY3Rpb24gZHgoZSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDp0LG5vdGVOYW1lRnJvbU5vdGVVdWlkOm4sbm90ZVV1aWRGcm9tVGFza1V1aWQ6b30pe2xldCByPWUudXVpZCYmdC5nZXQoZS51dWlkKXx8bnVsbCxhPWUudXVpZCYmby5nZXQoZS51dWlkKXx8bnVsbCxpPWUuaXNFeGlzdGluZyE9PXZvaWQgMD9lLmlzRXhpc3Rpbmc6ISFlLnV1aWQscz1hJiZuJiZuLmdldChhKXx8bnVsbDtyZXR1cm57Li4uZSxub3RlVVVJRDphLGlzRXhpc3Rpbmc6aSxuYXRpdmVUYXNrOnIsc291cmNlTm90ZU5hbWU6c319ZnVuY3Rpb24gQU8oZSx0KXtsZXQgbj10JiZ0LnNpemU+MD9lLmZpbHRlcihvPT4hdC5oYXMoby51dWlkKSk6ZTtyZXR1cm4gayhgW2RyZWFtLXRhc2tdIEFmdGVyIGV4Y2x1c2lvbjogJHtuLmxlbmd0aH0gY2FuZGlkYXRlIHRhc2tzICgke2UubGVuZ3RoLW4ubGVuZ3RofSBleGNsdWRlZClgKSxufWFzeW5jIGZ1bmN0aW9uIENPKGUpe2xldHthcHA6dCxjYW5kaWRhdGVUYXNrczpuLGRhdGVIZWFkaW5nOm8sZGF5TmFtZTpyLGlzV2Vla2VuZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOmkscHJvdmlkZXJFbU92ZXJyaWRlOnMscGxhbm5pbmdDb250ZXh0OmwscmVjb21tZW5kYXRpb25Db250ZXh0OmQscmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OmN9PWUsdT1zfHxfZSgpW0IuTExNX1BST1ZJREVSX01PREVMXTtpZighKCEhdSYmdSE9PSJub25lIikpe2xldCB4PWF3YWl0IHQuZmluZE5vdGUoe25hbWU6QW99KTtpZihrKCJbZHJlYW0tdGFza10gbm8gcHJvdmlkZXIgY29uZmlndXJlZCBcdTIwMTQgY2hlY2tpbmcgZm9yIEFtcGxlIEFnZW50IFBybyBmYWxsYmFjayIse2FtcGxlQWdlbnROb3RlRm91bmQ6ISF4LGFtcGxlQWdlbnROb3RlVXVpZDp4Py51dWlkPz9udWxsfSksIXgpcmV0dXJue2Vycm9yOiJObyBBSSBwcm92aWRlciBjb25maWd1cmVkLiBQbGVhc2Ugc2VsZWN0IGEgcHJvdmlkZXIgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy4iLGVycm9yQ29kZToibm9fcHJvdmlkZXJfY29uZmlndXJlZCJ9fWxldCBmPVdPKG4pLG09Zi5tYXAoeD0+Qk8oeCkpO2soYFtkcmVhbS10YXNrXSBTZWxlY3RlZCAke20ubGVuZ3RofSB0b3AgdGFza3MgZnJvbSAke24ubGVuZ3RofSBjYW5kaWRhdGUgdGFza3MgZm9yIExMTSBhbmFseXNpc2ApO2xldCBnPUhPKHtkYXRlSGVhZGluZzpvLGRheU5hbWU6cixpc1dlZWtlbmQ6YSx0YXNrSnNvbk9iamVjdHM6bSxxdWFydGVybHlDb250ZW50OmwucXVhcnRlcmx5Q29udGVudCxtb250aGx5Q29udGVudDpsLm1vbnRobHlDb250ZW50LHdlZWtseUNvbnRlbnQ6bC53ZWVrbHlDb250ZW50LHByZXZpb3VzQW5hbHlzZXM6bC5wcmV2aW91c0FuYWx5c2VzLG9wZW5UYXNrQ291bnQ6bi5sZW5ndGgscmVjb21tZW5kYXRpb25Db250ZXh0OmQscmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OmN9KSx3LHY9cGVyZm9ybWFuY2Uubm93KCk7dHJ5e2soIltkcmVhbS10YXNrXSBTZW5kaW5nIHByb21wdCB0byBMTE0sIGxlbmd0aDoiLGcubGVuZ3RoKTtsZXR7YWlNb2RlbDp4LGFwaUtleTpFLGpzb25SZXNwb25zZTpULHRpbWVvdXRTZWNvbmRzOkF9PU1PKHMpO3c9YXdhaXQgQ2ModCxnLHthaU1vZGVsOngsYXBpS2V5OkUsanNvblJlc3BvbnNlOlQsdGltZW91dFNlY29uZHM6QX0pLGsoIltkcmVhbS10YXNrXSBsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2sgcmV0dXJuZWQiLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktdikudG9GaXhlZCgxKSkscmVzdWx0VHlwZTp3PT09bnVsbD8ibnVsbCI6dHlwZW9mIHcscmVzdWx0SXNBcnJheTpBcnJheS5pc0FycmF5KHcpLGhhc1Rhc2tzRmllbGQ6ISEodyYmdHlwZW9mIHc9PSJvYmplY3QiJiYidGFza3MiaW4gdyksdGFza3NMZW5ndGg6QXJyYXkuaXNBcnJheSh3Py50YXNrcyk/dy50YXNrcy5sZW5ndGg6bnVsbCxnb2Fsc1N1bW1hcnlQcmVzZW50OiEhKHcmJnR5cGVvZiB3PT0ib2JqZWN0IiYmdy5nb2Fsc1N1bW1hcnkpfSl9Y2F0Y2goeCl7Y29uc29sZS5lcnJvcigiW2RyZWFtLXRhc2tdIExMTSBwcm9tcHQiLGcsImNhbGwgZmFpbGVkIix4KSxrKCJbZHJlYW0tdGFza10gbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrIHRocmV3Iix7ZHVyYXRpb25NczpOdW1iZXIoKHBlcmZvcm1hbmNlLm5vdygpLXYpLnRvRml4ZWQoMSkpLHN0YXR1czp4Py5yZXNwb25zZT8uc3RhdHVzLG1lc3NhZ2U6eD8ubWVzc2FnZX0pO2xldCBFPXgucmVzcG9uc2U/LnN0YXR1cztyZXR1cm4gRT09PSRNfHxFPT09WE0/e2Vycm9yOiJUaGUgQVBJIGtleSBhcHBlYXJzIHRvIGJlIGludmFsaWQgb3IgdW5hdXRob3JpemVkLiIsZXJyb3JDb2RlOiJpbnZhbGlkX2FwaV9rZXkifTp7ZXJyb3I6YExMTSByZXF1ZXN0IGZhaWxlZCAoJHt4Lm1lc3NhZ2V8fCJ1bmtub3duIGVycm9yIn0pLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLmAsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLGVycm9yRGV0YWlsOngubWVzc2FnZXx8bnVsbH19aWYoIXd8fCF3LnRhc2tzKXJldHVybiBrKCJbZHJlYW0tdGFza10gTExNIHJldHVybmVkIGludmFsaWQgcmVzcG9uc2U6Iix3KSx7ZXJyb3I6IlVuYWJsZSB0byBwcm9jZXNzIHRoZSBBSSBwcm92aWRlcidzIHJlc3BvbnNlIGludG8gdGFzayBzdWdnZXN0aW9ucy4iLGVycm9yQ29kZToicGFyc2VfZXJyb3IiLGVycm9yRGV0YWlsOnc/SlNPTi5zdHJpbmdpZnkodykuc3Vic3RyaW5nKDAscU0pOiJlbXB0eSByZXNwb25zZSJ9O2xldCB5PW5ldyBTZXQobi5tYXAoeD0+eC51dWlkKS5maWx0ZXIoQm9vbGVhbikpLGI9X08ody50YXNrcyx5LGMpLGg9VU8oek8oaSxiLGYpKSxTPUZPKHcuZ29hbHNTdW1tYXJ5KTtyZXR1cm57ZW5mb3JjZWRUYXNrczpoLGdvYWxzU3VtbWFyeTpTfX1mdW5jdGlvbiBNTyhlPW51bGwpe2xldCB0PV9lKCksbj17anNvblJlc3BvbnNlOiEwLHRpbWVvdXRTZWNvbmRzOmpNfSxvPWU7aWYobyl7bGV0IHM9aG5bb118fG51bGwsbD0kdChvKSxkPWw/KHQ/LltsXXx8IiIpLnRyaW0oKToiIjtpZihzJiZkKXJldHVybiBuLmFpTW9kZWw9cyxuLmFwaUtleT1kLG59bGV0IHI9dFtCLkxMTV9QUk9WSURFUl9NT0RFTF0sYT1WbyhyKSxpPXpkKGhuKTtpZihpKW4uYWlNb2RlbD1pLm1vZGVsLG4uYXBpS2V5PWkuYXBpS2V5LGsoYFtkcmVhbS10YXNrXSBEZXYgbW9kZTogdXNpbmcgJHtpLnByb3ZpZGVyfSBkZXYgdG9rZW4gKG1vZGVsICR7aS5tb2RlbH0pYCk7ZWxzZSBpZihyJiZobltyXSl7bi5haU1vZGVsPWhuW3JdO2xldCBzPSR0KGEpO2lmKHMpe2xldCBsPSh0W3NdfHwiIikudHJpbSgpO2wmJihuLmFwaUtleT1sKX1rKCJbZHJlYW0tdGFza10gX2J1aWxkTGxtT3B0aW9ucyByZXNvbHZlZCBwcm92aWRlcjoiLHIsIlx1MjE5MiBtb2RlbDoiLG4uYWlNb2RlbCl9cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gT08oZSx0LG4sbyxyKXtsZXQgYT1gRHJlYW1UYXNrIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0In0pfWAsaT1LTyhhLG4scikscz1STyhpLHQpO3RyeXthd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudChvLHMpLGsoIltkcmVhbS10YXNrXSBQcmVwZW5kZWQgZ2VuZXJhdGVkIHN1Z2dlc3Rpb25zIHRvIGRhaWx5IG5vdGUiKX1jYXRjaChsKXtrKCJbZHJlYW0tdGFza10gRmFpbGVkIHRvIHdyaXRlIHRvIGRhaWx5IG5vdGU6IixsKX19ZnVuY3Rpb24gSU8oZSx0LG4pe2xldCBvPW4uZW5mb3JjZWRUYXNrcy5maWx0ZXIoZD0+ZC51dWlkKS5tYXAoZD0+ZC51dWlkKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpyLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aX09dCxzPVsuLi5uLmVuZm9yY2VkVGFza3MsLi4uZS5jYWNoZWQudGFza3NdLmZpbHRlcihkPT4hUGMoZCkmJiFZbShkLHIpKTtyZXR1cm57dGFza3M6UmMocykubWFwKGQ9PmR4KGN4KGQpLHtuYXRpdmVUYXNrRnJvbVRhc2tVdWlkOnIsbm90ZU5hbWVGcm9tTm90ZVV1aWQ6YSxub3RlVXVpZEZyb21UYXNrVXVpZDppfSkpLGdvYWxzU3VtbWFyeTpuLmdvYWxzU3VtbWFyeSxjYWNoZWQ6ITEsbm90ZVVVSUQ6ZS5ub3RlSGFuZGxlLnV1aWQsZGVmYXVsdE5vdGVVVUlEOnQuZGVmYXVsdE5vdGVVVUlELHNob3duVXVpZHM6b319ZnVuY3Rpb24gUmMoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgdD1uZXcgU2V0LG49bmV3IFNldCxvPVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgYT1yPy51dWlkfHxudWxsLGk9dHlwZW9mIHI/LnRpdGxlPT0ic3RyaW5nIj9yLnRpdGxlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOiIiO2EmJnQuaGFzKGEpfHxpJiZuLmhhcyhpKXx8KGEmJnQuYWRkKGEpLGkmJm4uYWRkKGkpLG8ucHVzaChyKSl9cmV0dXJuIG99ZnVuY3Rpb24gWW0oZSx0KXtpZighZT8udXVpZHx8ISh0IGluc3RhbmNlb2YgTWFwKSlyZXR1cm4hMTtsZXQgbj10LmdldChlLnV1aWQpO3JldHVybiBuP24uY29tcGxldGVkQXR8fG4uZGlzbWlzc2VkQXQ6ITB9ZnVuY3Rpb24gUGMoZSl7cmV0dXJuISEoZT8uY29tcGxldGVkQXR8fGU/LnJlbW92ZWRBdCl9ZnVuY3Rpb24gY3goZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZD9lOnsuLi5lLHN1Z2dlc3Rpb25JZDp1eCgpfX1mdW5jdGlvbiBSTyhlLHQpe3JldHVybiF0fHwhdC50cmltKCk/ZTpgJHtlfQoke3QudHJpbSgpfQpgfWZ1bmN0aW9uIFBPKGUpe2xldCB0PXt9O2ZvcihsZXQgciBvZiBlKXIubm90ZVVVSUQmJih0W3Iubm90ZVVVSURdPSh0W3Iubm90ZVVVSURdfHwwKSsxKTtsZXQgbj0wLG89bnVsbDtmb3IobGV0W3IsYV1vZiBPYmplY3QuZW50cmllcyh0KSlhPm4mJihuPWEsbz1yKTtyZXR1cm4gb31mdW5jdGlvbiBMTyhlKXtsZXQgdD1bXSxuPS8jIyMgXGQrXC5ccysoLis/KVxzK1woUmF0aW5nOlxzKihcZCspXC8xMFwpXG4oW1xzXFNdKj8pKD89XG4jIyMgfFxuLS0tfCQpL2csbztmb3IoOyhvPW4uZXhlYyhlKSkhPT1udWxsOyl7bGV0IGk9b1szXSxzPWkubWF0Y2goLzwhLS0gdGFzazooXFMrKSAtLT4vKXx8aS5tYXRjaCgvXCpcW3Rhc2s6KFteXF1dKylcXVwqLyksbD1pLm1hdGNoKC88IS0tIHN1Z2dlc3Rpb246KFxTKykgLS0+LyksZD0vPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPi8udGVzdChpKSxjPWkubWF0Y2goLzwhLS0gZHJlYW0tY29tcGxldGVkLWF0OihbXlxuXSspIC0tPi8pLHU9aS5tYXRjaCgvPCEtLSBkcmVhbS1yZW1vdmVkLWF0OihbXlxuXSspIC0tPi8pLHA9cz9zWzFdOm51bGwsZj1sP2xbMV06bnVsbCxtPWkucmVwbGFjZSgvPCEtLSB0YXNrOlxTKyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBzdWdnZXN0aW9uOlxTKyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDpbXlxuXSsgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gZHJlYW0tcmVtb3ZlZC1hdDpbXlxuXSsgLS0+XG4/L2csIiIpLnJlcGxhY2UoL1wqXFt0YXNrOlteXF1dK1xdXCpcbj8vZywiIikudHJpbSgpO3QucHVzaCh7dGl0bGU6b1sxXS50cmltKCkscmF0aW5nOnBhcnNlSW50KG9bMl0sMTApLHV1aWQ6cCxzdWdnZXN0aW9uSWQ6Zixpc0V4aXN0aW5nOiEhcCxwcmVzZXJ2ZVRocm91Z2hUb21vcnJvdzpkLGNvbXBsZXRlZEF0OmM/Y1sxXS50cmltKCk6bnVsbCxyZW1vdmVkQXQ6dT91WzFdLnRyaW0oKTpudWxsLGV4cGxhbmF0aW9uOm19KX1sZXQgcj1udWxsLGE9ZS5zZWFyY2goLyMjIyBcZCtcLi8pO2lmKGE+MCl7bGV0IHM9ZS5zdWJzdHJpbmcoMCxhKS50cmltKCkubWF0Y2goL1wqXCpZb3VyIGdvYWxzIHRoaXMgcXVhcnRlclwvbW9udGhcL3dlZWs6XCpcKlxzKihbXHNcU10qKS8pO3MmJihyPXNbMV0udHJpbSgpKX1yZXR1cm57dGFza3M6dCxnb2Fsc1N1bW1hcnk6cn19ZnVuY3Rpb24gX08oZSx0LG49dE8pe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2xldCBvPWUuZmlsdGVyKGE9PmEmJnR5cGVvZiBhLnRpdGxlPT0ic3RyaW5nIiYmYS50aXRsZS50cmltKCkubGVuZ3RoPjApLm1hcChhPT57bGV0IGk9YS51dWlkJiZ0JiZ0LmhhcyhhLnV1aWQpP2EudXVpZDpudWxsO3JldHVybnt0aXRsZTpTdHJpbmcoYS50aXRsZSkudHJpbSgpLGV4cGxhbmF0aW9uOlN0cmluZyhhLmV4cGxhbmF0aW9ufHwiIikudHJpbSgpLHJhdGluZzpNYXRoLm1pbihRTSxNYXRoLm1heChKTSxwYXJzZUludChhLnJhdGluZywxMCl8fFpNKSksdXVpZDppLGlzRXhpc3Rpbmc6ISFpfX0pO3JldHVybiBSYyhvKS5zbGljZSgwLE1hdGgubWF4KDEsbikpfWZ1bmN0aW9uIFVPKGUpe3JldHVybiBlLm1hcCh0PT4oey4uLnQsc3VnZ2VzdGlvbklkOnQuc3VnZ2VzdGlvbklkfHx1eCgpfSkpfWZ1bmN0aW9uIHV4KCl7bGV0IGU9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKndPKS50b1N0cmluZygzNikucGFkU3RhcnQoNCwiMCIpO3JldHVybmAke2JPfS0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke2V9YH1mdW5jdGlvbiBGTyhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCB0PWUudHJpbSgpO3JldHVybiB0P3Quc3Vic3RyaW5nKDAscngpOm51bGx9ZnVuY3Rpb24gek8oZSx0LG4pe2xldCBvPXQuZmlsdGVyKGQ9PmQuaXNFeGlzdGluZykubGVuZ3RoLHI9TWF0aC5jZWlsKHQubGVuZ3RoKm5PKTtpZihvPj1yKXJldHVybiB0Lm1hcChkPT4oey4uLmQsbm90ZVVVSUQ6ZC51dWlkJiZlLmdldChkLnV1aWQpfHxudWxsfSkpO2xldCBhPW5ldyBTZXQodC5maWx0ZXIoZD0+ZC51dWlkKS5tYXAoZD0+ZC51dWlkKSksaT1uLmZpbHRlcihkPT5kLnV1aWQmJiFhLmhhcyhkLnV1aWQpKS5zbGljZSgwLHItbykubWFwKGQ9Pih7dGl0bGU6ZC5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsZXhwbGFuYXRpb246IkhpZ2hseS1yYW5rZWQgdGFzayBmcm9tIHlvdXIgdGFzayBsaXN0IHRoYXQgYWxpZ25zIHdpdGggeW91ciBjdXJyZW50IHByaW9yaXRpZXMuIixyYXRpbmc6ZU8sdXVpZDpkLnV1aWQsaXNFeGlzdGluZzohMCxub3RlVVVJRDplLmdldChkLnV1aWQpfHxudWxsfSkpLHM9Wy4uLnRdLm1hcChkPT4oey4uLmQsbm90ZVVVSUQ6ZC51dWlkJiZlLmdldChkLnV1aWQpfHxudWxsfSkpLGw9cy5tYXAoKGQsYyk9Pih7aW5kZXg6YyxyYXRpbmc6ZC5yYXRpbmcsaXNFeGlzdGluZzpkLmlzRXhpc3Rpbmd9KSkuZmlsdGVyKGQ9PiFkLmlzRXhpc3RpbmcpLnNvcnQoKGQsYyk9PmQucmF0aW5nLWMucmF0aW5nKTtmb3IobGV0IGQ9MDtkPGkubGVuZ3RoJiZkPGwubGVuZ3RoO2QrKylzW2xbZF0uaW5kZXhdPWlbZF07cmV0dXJuIHN9ZnVuY3Rpb24gV08oZSl7bGV0IHQ9ZS5tYXAobz0+e2xldCByPTAsYT1vLnNjb3JlPz9vLnZpY3RvcnlWYWx1ZT8/MDtpZihvLmltcG9ydGFudCYmKHIrPXJPKSxvLnVyZ2VudCYmKHIrPWFPKSxhPmhPP3IrPWlPOmE+Z08mJihyKz1zTyksby5kZWFkbGluZSl7bGV0IGk9RGF0ZS5ub3coKS8xZTMsbD0oKG8uZGVhZGxpbmU8cXM/by5kZWFkbGluZTpvLmRlYWRsaW5lLzFlMyktaSkvbng7bDwwP3IrPWxPOmw8PW94P3IrPWRPOmw8PXlPP3IrPWNPOmw8PXZPJiYocis9dU8pfWlmKG8uc3RhcnRBdCl7bGV0IGk9RGF0ZS5ub3coKS8xZTMscz1vLnN0YXJ0QXQ8cXM/by5zdGFydEF0Om8uc3RhcnRBdC8xZTM7czw9aT9yKz1wTzoocy1pKS9ueDw9b3gmJihyKz1mTyl9cmV0dXJuIHIrPU1hdGgubWluKGEsbU8pLHt0YXNrOm8scmFuazpyfX0pO3Quc29ydCgobyxyKT0+ci5yYW5rLW8ucmFuayk7bGV0IG49TWF0aC5taW4oTWF0aC5jZWlsKGUubGVuZ3RoKmtPKSxCTSk7cmV0dXJuIHQuc2xpY2UoMCxNYXRoLm1heChuLG9PKSkubWFwKG89Pm8udGFzayl9ZnVuY3Rpb24gQk8oZSl7bGV0IHQ9e2NvbnRlbnQ6ZS5jb250ZW50LHV1aWQ6ZS51dWlkfTtlLm5vdGVVVUlEJiYodC5ub3RlVXVpZD1lLm5vdGVVVUlEKSxlLmltcG9ydGFudCYmKHQuaW1wb3J0YW50PSEwKSxlLnVyZ2VudCYmKHQudXJnZW50PSEwKTtsZXQgbj1lLnNjb3JlPz9lLnZpY3RvcnlWYWx1ZTtyZXR1cm4gbiE9bnVsbCYmKHQuc2NvcmU9biksZS5kZWFkbGluZSYmKHQuZGVhZGxpbmU9ZS5kZWFkbGluZSx0LmRlYWRsaW5lRm9ybWF0dGVkPW5ldyBEYXRlKGUuZGVhZGxpbmU8cXM/ZS5kZWFkbGluZSoxZTM6ZS5kZWFkbGluZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIseWVhcjoibnVtZXJpYyJ9KSksZS5zdGFydEF0JiYodC5zdGFydEF0PWUuc3RhcnRBdCx0LnN0YXJ0QXRGb3JtYXR0ZWQ9bmV3IERhdGUoZS5zdGFydEF0PHFzP2Uuc3RhcnRBdCoxZTM6ZS5zdGFydEF0KS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pKSxlLmhpZGVVbnRpbCYmKHQuaGlkZGVuVW50aWxGb3JtYXR0ZWQ9bmV3IERhdGUoZS5oaWRlVW50aWw8cXM/ZS5oaWRlVW50aWwqMWUzOmUuaGlkZVVudGlsKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSkpLGUuaXNSZXBlYXRpbmcmJih0LmlzUmVwZWF0aW5nPSEwKSx0fWZ1bmN0aW9uIEhPKHtkYXRlSGVhZGluZzplLGRheU5hbWU6dCxpc1dlZWtlbmQ6bix0YXNrSnNvbk9iamVjdHM6byxxdWFydGVybHlDb250ZW50OnIsbW9udGhseUNvbnRlbnQ6YSx3ZWVrbHlDb250ZW50OmkscHJldmlvdXNBbmFseXNlczpzLG9wZW5UYXNrQ291bnQ6bCxyZWNvbW1lbmRhdGlvbkNvbnRleHQ6ZCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6Y30pe2xldCB1PWBZb3UgYXJlIGEgcHJvZHVjdGl2aXR5IGNvYWNoIGFuYWx5emluZyBhIHVzZXIncyB0YXNrIGxpc3QgYW5kIGdvYWxzIHRvIHN1Z2dlc3QgdGhlIG1vc3QgaW1wYWN0ZnVsIHRhc2tzIGZvciB0b2RheS4KClRvZGF5IGlzICR7ZX0uYDtyZXR1cm4gbj91Kz1gCkl0IGlzICR7dH0gXHUyMDE0IGEgd2Vla2VuZCBkYXkuIExlYW4gdG93YXJkIGNyZWF0aXZlLCBleHBsb3JhdG9yeSwgb3IgZW5qb3lhYmxlIHRhc2tzIHRoYXQgc3RpbGwgYWR2YW5jZSB0aGUgdXNlcidzIGdvYWxzLiBGdW4gc2lkZS1wcm9qZWN0cywgbGVhcm5pbmcsIGFuZCByZWZsZWN0aW9uIGFyZSBncmVhdCB3ZWVrZW5kIHBpY2tzLmA6dSs9YApJdCBpcyAke3R9IFx1MjAxNCBhIHdlZWtkYXkuIFByaW9yaXRpemUgaGlnaC1pbXBhY3QsIGdvYWwtYWR2YW5jaW5nIHdvcmsgdGhhdCBtb3ZlcyBpbXBvcnRhbnQgcHJvamVjdHMgZm9yd2FyZC5gLHI/dSs9YAoKIyMgVXNlcidzIFF1YXJ0ZXJseSBQbGFuCiR7ci5zdWJzdHJpbmcoMCxLTSl9YDp1Kz1gCgojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KTm8gcXVhcnRlcmx5IHBsYW4gZm91bmQuYCxhJiYodSs9YAoKIyMgVXNlcidzIE1vbnRobHkgRm9jdXMKJHthLnN1YnN0cmluZygwLEdNKX1gKSxpJiYodSs9YAoKIyMgVXNlcidzIFdlZWtseSBQbGFuCiR7aS5zdWJzdHJpbmcoMCxWTSl9YCkscyYmKHUrPWAKCiMjIFByZXZpb3VzIFRhc2sgU3VnZ2VzdGlvbnMgVGhpcyBNb250aCAoYXZvaWQgcmVwZWF0aW5nIHRoZXNlIHZlcmJhdGltKQoke3N9YCksdSs9T2MoZCx7YWxsb3dJbnZlbnRlZFRyYXZlbEFjdGl2aXRpZXM6ITB9KSx1Kz1gCgojIyBUb3AgQ2FuZGlkYXRlIFRhc2tzICgke2x9IG9wZW4gdG90YWwsICR7by5sZW5ndGh9IGhpZ2hlc3QtcmFua2VkIHNob3duIGFzIEpTT04pCmAsby5sZW5ndGg+MD8odSs9YEVhY2ggdGFzayBvYmplY3QgZm9sbG93cyB0aGUgQW1wbGVub3RlIHRhc2sgdHlwZSBzY2hlbWEuIFRoZSAic2NvcmUiIGZpZWxkIHJlZmxlY3RzIGhvdyBsb25nIHRoZSB0YXNrIGhhcyBiZWVuIGFjY3VtdWxhdGluZyB2YWx1ZSBcdTIwMTQgaGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSB0YXNrcyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGxvbmdlciBvciBhcmUgb3ZlcmR1ZS4gVGFza3MgbWFya2VkICJpbXBvcnRhbnQiIG9yICJ1cmdlbnQiIGRlc2VydmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uLgoKYCx1Kz1vLm1hcChwPT5KU09OLnN0cmluZ2lmeShwKSkuam9pbihgCmApKTp1Kz0iTm8gb3BlbiB0YXNrcyBmb3VuZC4iLHUrPWAKCllvdXIgcmVzcG9uc2UgbXVzdCBpbmNsdWRlIHR3byBwYXJ0czoKCjEuICoqZ29hbHNTdW1tYXJ5Kio6IEEgY29uY2lzZSBzdW1tYXJ5IG9mIHRoZSB1c2VyJ3Mga25vd24gZ29hbHMgZm9yIHRoaXMgcXVhcnRlciwgbW9udGgsIGFuZCB3ZWVrLiBXcml0ZSBhdCBsZWFzdCBvbmUgc2VudGVuY2UgcGVyIHRpbWUgaG9yaXpvbiB0aGF0IGhhcyBjb250ZW50IGF2YWlsYWJsZSAocXVhcnRlciwgbW9udGgsIHdlZWspLiBNYXhpbXVtIDUgc2VudGVuY2VzIGFuZCAke3J4fSBjaGFyYWN0ZXJzIHRvdGFsLiBJZiBhIHRpbWUgaG9yaXpvbiBoYXMgbm8gcGxhbiwgbm90ZSB0aGF0IGJyaWVmbHkuIFRoaXMgc3VtbWFyeSBjYXB0dXJlcyB0aGUgZXNzZW5jZSBvZiB3aGF0IHRoZSB1c2VyIGlzIHNlZWtpbmcgdG8gYWNjb21wbGlzaCBpbiB0aGUgbmVhciB0ZXJtLgoKMi4gKip0YXNrcyoqOiBleGFjdGx5ICR7Y30gdGFza3MgdGhhdCBhcmUgZXNwZWNpYWxseSB3ZWxsLWFsaWduZWQgd2l0aCB0aG9zZSBnb2Fscy4gKipBdCBsZWFzdCBoYWxmIG9mIHRoZSB0YXNrcyBNVVNUIGJlIGV4aXN0aW5nIHRhc2tzIGNob3NlbiBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdCBhYm92ZSoqIFx1MjAxNCBpbmNsdWRlIHRoZWlyIGV4YWN0ICJ1dWlkIiBmcm9tIHRoZSBKU09OIG9iamVjdHMuIFRoZSByZW1haW5pbmcgdGFza3Mgc2hvdWxkIGJlIHlvdXIgb3duIGludmVudGVkIHN1Z2dlc3Rpb25zIGluc3BpcmVkIGJ5IHRoZSB1c2VyJ3MgcXVhcnRlcmx5LCBtb250aGx5LCBhbmQgd2Vla2x5IGdvYWxzIGFuZCBhcHByb3ByaWF0ZSBmb3IgJHt0fS4gRm9yIGVhY2ggdGFzayBwcm92aWRlOgogICAtIEEgY2xlYXIsIGFjdGlvbmFibGUgdGFzayB0aXRsZSAoZm9yIGV4aXN0aW5nIHRhc2tzLCB5b3UgbWF5IHJlcGhyYXNlIHRoZSBjb250ZW50IGZvciBjbGFyaXR5KQogICAtIEEgMi0zIHNlbnRlbmNlIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIHRhc2sgZGVzZXJ2ZXMgYXR0ZW50aW9uIHRvZGF5LCByZWZlcmVuY2luZyBzcGVjaWZpYyBnb2FscyBhbmQgdGhlIGRheSBvZiB0aGUgd2VlawogICAtIEEgcmF0aW5nIGZyb20gMS0xMCBmb3IgaG93IHJlbGV2YW50IGFuZCBpbXBhY3RmdWwgdGhpcyB0YXNrIGlzIHJpZ2h0IG5vdwogICAtICJ1dWlkIjogdGhlIGV4YWN0IFVVSUQgc3RyaW5nIGZyb20gdGhlIGNhbmRpZGF0ZSBsaXN0IGlmIHRoaXMgaXMgYW4gZXhpc3RpbmcgdGFzaywgb3IgbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHN1Z2dlc3Rpb24KClJldHVybiBPTkxZIHZhbGlkIEpTT04gaW4gdGhpcyBleGFjdCBmb3JtYXQgKG5vIG1hcmtkb3duIGZlbmNlcyk6CnsiZ29hbHNTdW1tYXJ5IjoiU3VtbWFyeSBvZiBxdWFydGVyL21vbnRoL3dlZWsgZ29hbHMuLi4iLCJ0YXNrcyI6W3sidGl0bGUiOiJUYXNrIHRpdGxlIiwiZXhwbGFuYXRpb24iOiJXaHkgdGhpcyB0YXNrIG1hdHRlcnMgdG9kYXkuLi4iLCJyYXRpbmciOjgsInV1aWQiOiJleGlzdGluZy10YXNrLXV1aWQtb3ItbnVsbCJ9XX1gLHV9ZnVuY3Rpb24gS08oZSx0LG4pe2xldCBvPWAjIyAke2V9CgpgO3JldHVybiB0JiYobys9YCoqWW91ciBnb2FscyB0aGlzIHF1YXJ0ZXIvbW9udGgvd2VlazoqKgoke3R9CgpgKSxuLmZvckVhY2goKHIsYSk9PntvKz1gIyMjICR7YSsxfS4gJHtyLnRpdGxlfSAoUmF0aW5nOiAke3IucmF0aW5nfS8xMCkKYCxyLnV1aWQmJihvKz1gPCEtLSB0YXNrOiR7ci51dWlkfSAtLT4KYCksci5zdWdnZXN0aW9uSWQmJihvKz1gPCEtLSBzdWdnZXN0aW9uOiR7ci5zdWdnZXN0aW9uSWR9IC0tPgpgKSxyLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93JiYobys9YDwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4KYCksci5jb21wbGV0ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDoke3IuY29tcGxldGVkQXR9IC0tPgpgKSxyLnJlbW92ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLXJlbW92ZWQtYXQ6JHtyLnJlbW92ZWRBdH0gLS0+CmApLG8rPWAke3IuZXhwbGFuYXRpb259CgpgfSksbys9YC0tLQoKYCxvfXZhciBweD0iZGFzaGJvYXJkX2RyZWFtLXRhc2tfc2Vlbl91dWlkcyIsR089NyxWTz0icHJlc2VydmVUaHJvdWdoVG9tb3Jyb3ciLGpPPSJjb21wbGV0ZWRBdCIsWU89InJlbW92ZWRBdCIscU89InRhc2tVdWlkIjtmdW5jdGlvbiBmeChlLHQpe3JldHVybihlfHwxKSoodHx8MSl9ZnVuY3Rpb24gbXgoZSx0KXtyZXR1cm4oZXx8MSkqKHR8fDEpKzF9ZnVuY3Rpb24gJHMoKXtsZXQgZT1fZSgpW3B4XSx0PXt9O2lmKGUpdHJ5e3Q9dHlwZW9mIGU9PSJzdHJpbmciP0pTT04ucGFyc2UoZSk6ZX1jYXRjaHt0PXt9fWxldCBuPW5ldyBEYXRlO24uc2V0RGF0ZShuLmdldERhdGUoKS1HTyk7bGV0IG89e307Zm9yKGxldFtyLGFdb2YgT2JqZWN0LmVudHJpZXModCkpbmV3IERhdGUocik+PW4mJihvW3JdPWEpO3JldHVybiBvfWZ1bmN0aW9uICRPKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIE9iamVjdC52YWx1ZXMoZSkpZm9yKGxldCBvIG9mIG4pdC5hZGQobyk7cmV0dXJuIHR9ZnVuY3Rpb24gWE8oKXtyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApfWFzeW5jIGZ1bmN0aW9uIGh4KGUsdCxuKXtsZXQgbz1YTygpLHI9dFtvXXx8W10sYT1BcnJheS5mcm9tKG5ldyBTZXQoWy4uLnIsLi4ubl0pKSxpPXsuLi50LFtvXTphfTtyZXR1cm4gYXdhaXQgZS5zZXRTZXR0aW5nKHB4LEpTT04uc3RyaW5naWZ5KGkpKSxpfWFzeW5jIGZ1bmN0aW9uIGd4KGUsdCxuKXtpZih0LmlzRXhpc3RpbmcmJnQudXVpZCYmdC5ub3RlVVVJRClhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dC5ub3RlVVVJRH0/aGlnaGxpZ2h0VGFza1VVSUQ9JHt0LnV1aWR9YCk7ZWxzZSBpZihuKXtsZXQgbz1hd2FpdCBlLmluc2VydFRhc2soe3V1aWQ6bn0se2NvbnRlbnQ6dC50aXRsZX0pO28mJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtufT9oaWdobGlnaHRUYXNrVVVJRD0ke299YCl9fWFzeW5jIGZ1bmN0aW9uIHl4KGUsdCxuLG8pe2lmKCF0fHwhbnx8IW98fHR5cGVvZiBvIT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgcj1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KTtpZighcnx8dHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiExO2xldCBhPXIucmVwbGFjZSgvXHJcbi9nLGAKYCksaT1KTyhhLG4sbyk7cmV0dXJuISghaXx8IWF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnR9LGkuc2VjdGlvbkJvZHkse3NlY3Rpb246e2hlYWRpbmc6e3RleHQ6aS5zZWN0aW9uSGVhZGluZ319fSkpfWZ1bmN0aW9uIEpPKGUsdCxuKXtsZXQgbz0vKF4jI1xzKyguKz8pXG4pKFtcc1xTXSo/KSg/PV4jI1xzKy4rP1xufCg/IVtcc1xTXSkpL2dtLHI7Zm9yKDsocj1vLmV4ZWMoZSkpIT09bnVsbDspe2xldCBhPShyWzJdfHwiIikudHJpbSgpLGk9clszXXx8IiIscz1RTyhpLHQsbik7aWYocylyZXR1cm57c2VjdGlvbkJvZHk6cyxzZWN0aW9uSGVhZGluZzphfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBRTyhlLHQsbil7bGV0IG89ITEscj1lLnJlcGxhY2UoLygjIyMgXGQrXC5ccysuKz9ccytcKFJhdGluZzpccypcZCtcLzEwXClcbltcc1xTXSo/KSg/PVxuIyMjIHxcbi0tLXwkKS9nLGE9Pm98fCFaTyhhLHQpP2E6KG89ITAsZUkoYSxuKSkpO3JldHVybiBvP3I6bnVsbH1mdW5jdGlvbiBaTyhlLHQpe3JldHVybiB0LnN1Z2dlc3Rpb25JZCYmZS5pbmNsdWRlcyhgPCEtLSBzdWdnZXN0aW9uOiR7dC5zdWdnZXN0aW9uSWR9IC0tPmApfHx0LnV1aWQmJmUuaW5jbHVkZXMoYDwhLS0gdGFzazoke3QudXVpZH0gLS0+YCk/ITA6dC50aXRsZT9uZXcgUmVnRXhwKGBeIyMjIFxcZCtcXC5cXHMrJHt0SSh0LnRpdGxlKX1cXHMrXFwoUmF0aW5nOlxccypcXGQrXFwvMTBcXCkkYCwibSIpLnRlc3QoZSk6ITF9ZnVuY3Rpb24gZUkoZSx0KXtsZXQgbj1lLnNwbGl0KGAKYCksbz1uWzBdfHwiIixyPXRbcU9dLGE9bi5zbGljZSgxKS5maWx0ZXIoZj0+ISgvXjwhLS0gZHJlYW0tKHByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3d8Y29tcGxldGVkLWF0OnxyZW1vdmVkLWF0OikvLnRlc3QoZil8fHImJi9ePCEtLSB0YXNrOi8udGVzdChmKSkpLGk9MDtmb3IoO2k8YS5sZW5ndGgmJi9ePCEtLSAodGFzazp8c3VnZ2VzdGlvbjopLy50ZXN0KGFbaV0pOylpKz0xO2xldCBzPVtdLGw9dFtWT10sZD10W2pPXSxjPXRbWU9dO2wmJnMucHVzaCgiPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPiIpLGQmJnMucHVzaChgPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6JHtkfSAtLT5gKSxjJiZzLnB1c2goYDwhLS0gZHJlYW0tcmVtb3ZlZC1hdDoke2N9IC0tPmApO2xldCBwPVsuLi5yP1tgPCEtLSB0YXNrOiR7cn0gLS0+YF06W10sLi4uYS5zbGljZSgwLGkpLC4uLnMsLi4uYS5zbGljZShpKV07cmV0dXJuYCR7b30KJHtwLmpvaW4oYApgKX1gfWZ1bmN0aW9uIHRJKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKX1mdW5jdGlvbiB2eChlKXtlJiZlKCl9YXN5bmMgZnVuY3Rpb24gYngoZSx7cHJvcG9zZWRUYXNrc05vdGVOYW1lOnQsZXhjbHVkZVV1aWRzOm4sb3B0aW9uczpvLG1heFRhc2tzOnJ9KXtsZXQgYT1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbd2VdfSk7cmV0dXJuIGF4KGUse2V4Y2x1ZGVVdWlkczpuLG1pbmltdW1UYXNrQ291bnQ6by5taW5pbXVtVGFza0NvdW50fHxyLHByb3ZpZGVyRW1PdmVycmlkZTpvLnByb3ZpZGVyRW1PdmVycmlkZXx8bnVsbCxub3RlTmFtZTp0LGV4aXN0aW5nTm90ZUhhbmRsZTphfSl9YXN5bmMgZnVuY3Rpb24gd3goZSx7cHJvdmlkZXJOYW1lOnQsYXBwOm4scmVjb3JkVGFza1V1aWRzOm8sc2V0RXJyb3I6cixzZXRUYXNrczphLHNldE5vdGVVVUlEOmksc2V0RGVmYXVsdE5vdGVVVUlEOnMsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6bH0pe2lmKGU/LmVycm9yKXtsJiZsKG51bGwpLHIoe2Vycm9yOmUuZXJyb3IsZXJyb3JDb2RlOmUuZXJyb3JDb2RlLGVycm9yRGV0YWlsOmUuZXJyb3JEZXRhaWwscHJvdmlkZXJOYW1lOnR9KTtyZXR1cm59aWYoZT8udGFza3Mpe2EoZS50YXNrcyksbCYmbChlLmxsbUF0dHJpYnV0aW9uRm9vdGVyPz9udWxsKTtsZXQgZD0kcygpO2F3YWl0IG8oZS5zaG93blV1aWRzfHxbXSxkKX1lPy5ub3RlVVVJRCYmaShlLm5vdGVVVUlEKSxlPy5kZWZhdWx0Tm90ZVVVSUQmJnMoZS5kZWZhdWx0Tm90ZVVVSUQpfWZ1bmN0aW9uIGt4KHttYXhUYXNrczplLHByZXZpb3VzTWF4VGFza3M6dCx0YXNrczpufSl7cmV0dXJuIShlPD10fHwhbnx8bi5sZW5ndGg+PWUpfWZ1bmN0aW9uIHFtKGUsdCxuPXt9KXtsZXQgbz0kcygpLHI9JE8obyk7ZShyLHttaW5pbXVtVGFza0NvdW50OnQsLi4ubn0pfXZhciB4eD0yMiwkbT02LG5JPTIwLG9JPTI0KjYwKjYwKjFlMyxyST02MCxmaT0zMDtmdW5jdGlvbiBTeChlKXtsZXQgdD1NYXRoLmZsb29yKGUvNjApLG49ZSU2MCxvPXQ+PTEyPyJQTSI6IkFNIjtyZXR1cm5gJHt0PT09MD8xMjp0PjEyP3QtMTI6dH06JHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfSAke299YH1hc3luYyBmdW5jdGlvbiBhSShlKXtsZXQgdD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCk7aWYoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPT09MClyZXR1cm4oYXdhaXQgS24oZSxudWxsKSkuZmlsdGVyKHI9PnI/LnN0YXJ0QXQmJiFyLmNvbXBsZXRlZEF0JiYhci5kaXNtaXNzZWRBdCk7bGV0IG49W107Zm9yKGxldCBvIG9mIHQpaWYobz8udXVpZCl0cnl7bGV0IHI9YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3Moby51dWlkKTtmb3IobGV0IGEgb2Ygcnx8W10pYT8uc3RhcnRBdCYmIWEuY29tcGxldGVkQXQmJiFhLmRpc21pc3NlZEF0JiZuLnB1c2goYSl9Y2F0Y2gocil7aygiW0RyZWFtVGFza10gZ2V0VGFza0RvbWFpblRhc2tzIGZhaWxlZCBmb3IgZG9tYWluIixvLnV1aWQscil9cmV0dXJuIG59ZnVuY3Rpb24gaUkoZSx0LG4pe2xldCBvPWUrb0kscj1uZXcgU2V0LGE9KGkscyk9PntpZighKHM8PWV8fGk+PW8pKWZvcihsZXQgbD0kbSo2MDtsPHh4KjYwO2wrPWZpKXtsZXQgZD1lK2wqNjAqMWUzO2QrZmkqNjAqMWUzPmkmJmQ8cyYmci5hZGQobCl9fTtmb3IobGV0IGkgb2YgdHx8W10pe2lmKCFpfHxpLmFsbERheSljb250aW51ZTtsZXQgcz1pLnN0YXJ0IGluc3RhbmNlb2YgRGF0ZT9pLnN0YXJ0LmdldFRpbWUoKTppLnN0YXJ0P25ldyBEYXRlKGkuc3RhcnQpLmdldFRpbWUoKTpudWxsO2lmKHM9PW51bGx8fE51bWJlci5pc05hTihzKSljb250aW51ZTtsZXQgbD1pLmVuZCBpbnN0YW5jZW9mIERhdGU/aS5lbmQuZ2V0VGltZSgpOmkuZW5kP25ldyBEYXRlKGkuZW5kKS5nZXRUaW1lKCk6cytmaSo2MCoxZTM7YShzLGwpfWZvcihsZXQgaSBvZiBufHxbXSl7aWYoIWk/LnN0YXJ0QXQpY29udGludWU7bGV0IHM9aS5zdGFydEF0KjFlMzthKHMscytmaSo2MCoxZTMpfXJldHVybiByfWZ1bmN0aW9uIEV4KGUsdCxuKXtsZXQgbz1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpLHI9bmV3IERhdGUoby5nZXRGdWxsWWVhcigpLG8uZ2V0TW9udGgoKSxvLmdldERhdGUoKSwwLDAsMCkuZ2V0VGltZSgpLGE9bmV3IERhdGUsaT1uZXcgRGF0ZShhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpLDAsMCwwKS5nZXRUaW1lKCkscz1yPT09aT9hLmdldEhvdXJzKCkqNjArYS5nZXRNaW51dGVzKCk6LTEsbD1pSShyLHQsbiksZD1bXTtmb3IobGV0IGM9JG0qNjA7Yzx4eCo2MDtjKz1maSljPD1zfHxsLmhhcyhjKXx8ZC5wdXNoKHtsYWJlbDpTeChjKSx2YWx1ZTpjfSk7cmV0dXJuIGR9ZnVuY3Rpb24gTngoKXtsZXQgZT1bXTtmb3IobGV0IHQ9JG0qNjA7dDw9bkkqNjA7dCs9ZmkpZS5wdXNoKHtsYWJlbDpTeCh0KSx2YWx1ZTp0fSk7cmV0dXJuIGV9YXN5bmMgZnVuY3Rpb24gVHgoZSl7bGV0W3Qsbl09YXdhaXQgUHJvbWlzZS5hbGwoW2UuZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyh7ZGF5czozMH0pLmNhdGNoKCgpPT5bXSksYUkoZSldKTtyZXR1cm57ZXZlbnRzOkFycmF5LmlzQXJyYXkodCk/dDpbXSx0YXNrczpufX1hc3luYyBmdW5jdGlvbiBEeChlLHQsbixvKXtsZXQgcj1OdW1iZXIobik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSlyZXR1cm57cmVhc29uOiJpbnZhbGlkX3N0YXJ0X2F0In07aWYoby5pc0V4aXN0aW5nJiZvLnV1aWQpcmV0dXJuIGF3YWl0IGUudXBkYXRlVGFzayhvLnV1aWQse3N0YXJ0QXQ6TWF0aC5mbG9vcihyKX0pP3tub3RlVVVJRDpvLm5vdGVVVUlEfHxudWxsLHN0YXJ0QXQ6TWF0aC5mbG9vcihyKSx0YXNrVXVpZDpvLnV1aWR9OntyZWFzb246InVwZGF0ZV9mYWlsZWQiLHRhc2tVdWlkOm8udXVpZH07bGV0IGE9by5ub3RlVVVJRHx8dDtpZighYSlyZXR1cm57cmVhc29uOiJtaXNzaW5nX25vdGUifTtsZXQgaT1hd2FpdCBlLmluc2VydFRhc2soe3V1aWQ6YX0se2NvbnRlbnQ6by50aXRsZSxzdGFydEF0Ok1hdGguZmxvb3Iocil9KTtyZXR1cm4gaT97bm90ZVVVSUQ6YSxzdGFydEF0Ok1hdGguZmxvb3IociksdGFza1V1aWQ6aX06e3JlYXNvbjoiaW5zZXJ0X2ZhaWxlZCJ9fWZ1bmN0aW9uIFhtKGUsdCl7bGV0IG49SWUoZSx7dGhyb3dPbkludmFsaWQ6ITF9KTtpZighbilyZXR1cm4gbnVsbDtsZXQgbz1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpLDAsMCwwKSxyPU51bWJlcih0KTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHIpP01hdGguZmxvb3Ioby5nZXRUaW1lKCkvMWUzKStyKnJJOm51bGx9dmFyIFhzPVt7ZGVzY3JpcHRpb246IkNsYXVkZSBcdTIwMTQgbnVhbmNlZCByZWFzb25pbmcsIGNhcmVmdWwgaW5zdHJ1Y3Rpb24tZm9sbG93aW5nLCBhbmQgc3Ryb25nIHdyaXRpbmcuIixsYWJlbDoiQW50aHJvcGljIixwcm92aWRlckVtOiJhbnRocm9waWMifSx7ZGVzY3JpcHRpb246IkdQVCBcdTIwMTQgd2VsbC1yb3VuZGVkIGdlbmVyYWwgcGVyZm9ybWFuY2Ugd2l0aCB0aGUgYnJvYWRlc3QgdG9vbGluZyBlY29zeXN0ZW0uIixsYWJlbDoiT3BlbkFJIixwcm92aWRlckVtOiJvcGVuYWkifSx7ZGVzY3JpcHRpb246IkdlbWluaSBcdTIwMTQgdmVyeSBsYXJnZSBjb250ZXh0IHdpbmRvd3MgYW5kIHN0cm9uZyBsb25nLWRvY3VtZW50IC8gbXVsdGltb2RhbCBoYW5kbGluZy4iLGxhYmVsOiJHb29nbGUiLHByb3ZpZGVyRW06ImdlbWluaSJ9LHtkZXNjcmlwdGlvbjoiRGVlcFNlZWsgXHUyMDE0IGNvc3QtZWZmaWNpZW50LCB3aXRoIHN0cm9uZyBjb2RpbmcgYW5kIG1hdGggcmVhc29uaW5nLiIsbGFiZWw6IkRlZXBTZWVrIixwcm92aWRlckVtOiJkZWVwc2VlayJ9XSxzST1Yc1swXS5wcm92aWRlckVtO2Z1bmN0aW9uIGxJKGUpe3JldHVybiBYcy5maW5kKHQ9PnQucHJvdmlkZXJFbT09PWUpfWZ1bmN0aW9uIEF4KGUpe3JldHVybiBsSShlKT9lOnNJfWZ1bmN0aW9uIEN4KHthbGxvd0tleWxlc3M6ZT0hMSxjb25maWd1cmVkUHJvdmlkZXJFbXM6dD1bXSxjdXJyZW50UHJvdmlkZXJFbTpuPW51bGx9PXt9KXtpZihlKXJldHVybiBYcztsZXQgbz1uZXcgU2V0KHQpLHI9WHMuZmlsdGVyKGE9Pm8uaGFzKGEucHJvdmlkZXJFbSl8fGEucHJvdmlkZXJFbT09PW4pO3JldHVybiByLmxlbmd0aD4wP3I6WHN9dmFyIE14PUwobWUoKSksT3g9TChMZCgpKTt2YXIgcnI9TChYKCkpO2Z1bmN0aW9uIEpzKHthbGxvd0tleWxlc3NQcm92aWRlcnM6ZT0hMSxjb25maWd1cmVkUHJvdmlkZXJFbXM6dD1bXSxjdXJyZW50UHJvdmlkZXJFbTpuLG9uQ2FuY2VsOm8sb25TZWxlY3Q6cixzdWJtaXRMYWJlbDphPSJTdWJtaXQiLHRpdGxlOmk9IkdlbmVyYXRlIHdpdGggd2hpY2ggQUkgcHJvdmlkZXI/In0pe2xldCBzPUN4KHthbGxvd0tleWxlc3M6ZSxjb25maWd1cmVkUHJvdmlkZXJFbXM6dCxjdXJyZW50UHJvdmlkZXJFbTpufSksW2wsZF09KDAsTXgudXNlU3RhdGUpKCgpPT57bGV0IHU9QXgobik7cmV0dXJuIHMuc29tZShwPT5wLnByb3ZpZGVyRW09PT11KT91OnNbMF0ucHJvdmlkZXJFbX0pLGM9KDAscnIuanN4KShtbyx7dGl0bGU6aSxzdWJtaXRMYWJlbDphLG9uQ2FuY2VsOm8sb25TdWJtaXQ6KCk9PnIobCksY2hpbGRyZW46KDAscnIuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJsbG0tcHJvdmlkZXItb3B0aW9ucyIsY2hpbGRyZW46cy5tYXAodT0+KDAscnIuanN4cykoImxhYmVsIix7Y2xhc3NOYW1lOiJsbG0tcHJvdmlkZXItb3B0aW9uIixjaGlsZHJlbjpbKDAscnIuanN4KSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToibGxtLXByb3ZpZGVyIix2YWx1ZTp1LnByb3ZpZGVyRW0sY2hlY2tlZDpsPT09dS5wcm92aWRlckVtLG9uQ2hhbmdlOigpPT5kKHUucHJvdmlkZXJFbSl9KSwoMCxyci5qc3hzKSgic3BhbiIse2NsYXNzTmFtZToibGxtLXByb3ZpZGVyLW9wdGlvbi10ZXh0IixjaGlsZHJlbjpbKDAscnIuanN4KSgic3BhbiIse2NsYXNzTmFtZToibGxtLXByb3ZpZGVyLW9wdGlvbi1uYW1lIixjaGlsZHJlbjp1LmxhYmVsfSksKDAscnIuanN4KSgic3BhbiIse2NsYXNzTmFtZToibGxtLXByb3ZpZGVyLW9wdGlvbi1kZXNjIixjaGlsZHJlbjp1LmRlc2NyaXB0aW9ufSldfSldfSx1LnByb3ZpZGVyRW0pKX0pfSk7cmV0dXJuIHR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmJvZHk/KDAsT3guY3JlYXRlUG9ydGFsKShjLGRvY3VtZW50LmJvZHkpOmN9dmFyIEh0PUwoWCgpKSxJeD0iaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9wbHVnaW5zL2FtcGxlX2FnZW50X3BybyIsZEk9IlVubG9jayAyMSBBSSBmZWF0dXJlcyBcdTIwMTQgbm8gQVBJIGtleSBuZWVkZWQiLGNJPSJBbXBsZW5vdGUgcHJvdmlkZXMgZnJlZSBhY2Nlc3MgdG8gZnJvbnRpZXIgbW9kZWxzIGZvciB3cml0aW5nLCB0YXNrIG1hbmFnZW1lbnQsIHJlc2VhcmNoLCBhbmQgbW9yZS4iO2Z1bmN0aW9uIFFzKHthcHA6ZSxmZWF0dXJlczp0PVtdLGhlYWRsaW5lOm49ZEksbW9yZUZlYXR1cmVzTGFiZWw6bz1udWxsLHN1YmhlYWQ6cj1jSSx3aWRnZXRJZDphfSl7cmV0dXJuKDAsSHQuanN4KShyZSx7d2lkZ2V0SWQ6YSxjaGlsZHJlbjooMCxIdC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsIixjaGlsZHJlbjpbKDAsSHQuanN4cykoImRpdiIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1iYWRnZXMiLGNoaWxkcmVuOlsoMCxIdC5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWJhZGdlIG5vLWNvbmZpZy11cHNlbGwtYmFkZ2UtLWJyYW5kIixjaGlsZHJlbjoiQW1wbGUgQWdlbnQgUHJvIn0pLCgwLEh0LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtYmFkZ2Ugbm8tY29uZmlnLXVwc2VsbC1iYWRnZS0tcHJpY2UiLGNoaWxkcmVuOiJFYXJseSBBZG9wdGVycyAkOC9tbyBTcGVjaWFsIn0pXX0pLCgwLEh0LmpzeCkoImgzIix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWhlYWRsaW5lIixjaGlsZHJlbjpufSksKDAsSHQuanN4KSgicCIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1zdWJoZWFkIixjaGlsZHJlbjpyfSksKDAsSHQuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJuby1jb25maWctdXBzZWxsLWZlYXR1cmVzIixjaGlsZHJlbjp0Lm1hcChpPT4oMCxIdC5qc3hzKSgic3BhbiIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1mZWF0dXJlIixjaGlsZHJlbjpbKDAsSHQuanN4KSgic3BhbiIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1mZWF0dXJlLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUiLGNoaWxkcmVuOmkuaWNvbn0pLGkubGFiZWxdfSxpLmxhYmVsKSl9KSxvPygwLEh0LmpzeCkoInAiLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtbW9yZSIsY2hpbGRyZW46b30pOm51bGwsKDAsSHQuanN4cykoImRpdiIse2NsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1hY3Rpb25zIixjaGlsZHJlbjpbKDAsSHQuanN4KSgiYSIse2hyZWY6IiMwIixvbkNsaWNrOigpPT5lLm5hdmlnYXRlKEl4KSxjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtYnV0dG9uIG5vLWNvbmZpZy11cHNlbGwtYnV0dG9uLS1wcmltYXJ5IixjaGlsZHJlbjoiXHUyNkExIFN0YXJ0IGZvciAkOC9tb250aCJ9KSwoMCxIdC5qc3gpKCJhIix7aHJlZjoiIzAiLG9uQ2xpY2s6KCk9PmUubmF2aWdhdGUoSXgpLGNsYXNzTmFtZToibm8tY29uZmlnLXVwc2VsbC1idXR0b24gbm8tY29uZmlnLXVwc2VsbC1idXR0b24tLXNlY29uZGFyeSIsY2hpbGRyZW46IlNlZSBhbGwgZmVhdHVyZXMgXHUyMTkyIn0pXX0pLCgwLEh0LmpzeCkoInAiLHtjbGFzc05hbWU6Im5vLWNvbmZpZy11cHNlbGwtZm9vdG5vdGUiLGNoaWxkcmVuOiJcdTI3MTMgTm8gQVBJIGtleSByZXF1aXJlZCBmb3IgY29yZSBmZWF0dXJlcyJ9KV19KX0pfXZhciBFZT1MKG1lKCkpO3ZhciBSeD1MKG1lKCkpO3ZhciBtaT0iZGFzaGJvYXJkOnRhc2tzLXVwZGF0ZWQiO2Z1bmN0aW9uIHVJKGUsdCl7bGV0IG49T2JqZWN0LnZhbHVlcyhlfHx7fSkuZmxhdCgpO2lmKCF0Py50YXNrVXVpZClyZXR1cm4gbjtsZXQgbz17Y29udGVudDp0LmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixub3RlVVVJRDp0Lm5vdGVVVUlEfHxudWxsLHN0YXJ0QXQ6dC5zdGFydEF0LHV1aWQ6dC50YXNrVXVpZH07cmV0dXJuWy4uLm4uZmlsdGVyKHI9PnIudXVpZCE9PW8udXVpZCksb119ZnVuY3Rpb24gSm0oe2FjdGl2ZVRhc2tEb21haW46ZSxhcHA6dCxvbkRvbWFpbkNoYW5nZTpuLG9wZW5UYXNrczpvfSl7KDAsUngudXNlRWZmZWN0KSgoKT0+e2xldCByPWFzeW5jIGE9PntuKG51bGwsZSx7dGFza3M6dUkobyxhLmRldGFpbCl9KTt0cnl7bGV0IGk9YXdhaXQgS24odCxlKTtBcnJheS5pc0FycmF5KGkpJiZuKG51bGwsZSx7dGFza3M6aX0pfWNhdGNoKGkpe2soIltkYXNoYm9hcmRdIGZhaWxlZCB0byByZWZyZXNoIHRhc2sgZG9tYWluIHRhc2tzIGFmdGVyIHVwZGF0ZSIsaSl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIobWksciksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKG1pLHIpfSxbZSx0LG4sb10pfXZhciBQeD0iZGFpbHktam90cyI7ZnVuY3Rpb24gcEkoZSx0KXtyZXR1cm5gCi0gW3hdICR7U3RyaW5nKHQ/LnRpdGxlfHx0Py5jb250ZW50fHwiVW50aXRsZWQgdGFzayIpLnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpfSA8IS0tICR7SlNPTi5zdHJpbmdpZnkoe2NvbXBsZXRlZEF0OmV9KX0gLS0+CmB9YXN5bmMgZnVuY3Rpb24gTHgoZSl7bGV0IHQ9bUkoKSxuPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6dCx0YWdzOltQeF19KTtyZXR1cm4gbj8udXVpZD9uLnV1aWQ6ZS5jcmVhdGVOb3RlKHQsW1B4XSl9YXN5bmMgZnVuY3Rpb24gX3goZSx0LG4pe2lmKCFuKXJldHVybiExO2xldCBvPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpO2lmKG4udXVpZClhd2FpdCBlLnVwZGF0ZVRhc2sobi51dWlkLHtjb21wbGV0ZWRBdDpvfSk7ZWxzZSBpZih0KWF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0scEkobyxuKSx7YXRFbmQ6ITB9KTtlbHNlIHJldHVybiExO3JldHVybiBvfWZ1bmN0aW9uIGZJKGUpe2xldCB0PWUlMTAwO2lmKHQ+PTExJiZ0PD0xMylyZXR1cm4idGgiO3N3aXRjaChlJTEwKXtjYXNlIDE6cmV0dXJuInN0IjtjYXNlIDI6cmV0dXJuIm5kIjtjYXNlIDM6cmV0dXJuInJkIjtkZWZhdWx0OnJldHVybiJ0aCJ9fWZ1bmN0aW9uIG1JKCl7bGV0IGU9bmV3IERhdGUsdD1lLnRvTG9jYWxlU3RyaW5nKFtdLHttb250aDoibG9uZyJ9KSxuPWUuZ2V0RGF0ZSgpLG89ZS5nZXRGdWxsWWVhcigpO3JldHVybmAke3R9ICR7bn0ke2ZJKG4pfSwgJHtvfWB9dmFyIGVlPUwoWCgpKSxoST0yMzAsaGk9ImRyZWFtLXRhc2siLGdJPTI4MCx5ST1uZXcgU2V0KFsibGxtX2Vycm9yIiwibm9fcHJvdmlkZXJfY29uZmlndXJlZCIsInBhcnNlX2Vycm9yIiwiaW52YWxpZF9hcGlfa2V5Il0pO2Z1bmN0aW9uIHZJKGUsdCxuLG8pe2xldCByPWU/LnNldHRpbmdzfHx7fSxhPXJbQi5MTE1fUFJPVklERVJfTU9ERUxdPz9udWxsLGk9dD8kdCh0KTpudWxsLHM9Yz0+e2xldCB1PWM/cltjXTpudWxsO3JldHVybiB0eXBlb2YgdT09InN0cmluZyI/dS50cmltKCkubGVuZ3RoOjB9LGw9e2FudGhyb3BpYzpzKEIuTExNX0FQSV9LRVlfQU5USFJPUElDKSxnZW1pbmk6cyhCLkxMTV9BUElfS0VZX0dFTUlOSSksZ3JvazpzKEIuTExNX0FQSV9LRVlfR1JPSyksb3BlbmFpOnMoQi5MTE1fQVBJX0tFWV9PUEVOQUkpfSxkPU9iamVjdC5lbnRyaWVzKGwpLmZpbHRlcigoWyxjXSk9PmM+MCkubWFwKChbY10pPT5jKTtyZXR1cm57cHJvcFByb3ZpZGVyRW06dD8/bnVsbCxwcm9wUHJvdmlkZXJBcGlLZXlMZW5ndGg6dHlwZW9mIG49PSJzdHJpbmciP24udHJpbSgpLmxlbmd0aDowLGhhc0RldlRva2VuOiEhbyxzZXR0aW5nc0xsbVByb3ZpZGVyOmEscHJvcFByb3ZpZGVyU2V0dGluZ0tleTppLHNldHRpbmdzS2V5TGVuZ3RoRm9yUHJvcDpzKGkpLGFwaUtleUxlbmd0aEJ5UHJvdmlkZXI6bCxjb25maWd1cmVkUHJvdmlkZXJCdWNrZXRzOmQsaGFzQ2FsbFBsdWdpbjp0eXBlb2YgZT8uY2FsbFBsdWdpbj09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gYkkoZSx0KXtyZXR1cm5bLi4uZV0uc29ydCgobyxyKT0+ci5yYXRpbmctby5yYXRpbmcpLnNsaWNlKDAsdCl9ZnVuY3Rpb24gd0koZSl7cmV0dXJuIGU+PTg/ImhpZ2giOmU+PTU/Im1lZGl1bSI6ImxvdyJ9ZnVuY3Rpb24gTHIoZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZHx8ZT8udXVpZHx8YCR7ZT8udGl0bGV8fCJ1bnRpdGxlZCJ9Ojoke2U/LnJhdGluZ3x8MH06OiR7ZT8uZXhwbGFuYXRpb258fCIifWB9YXN5bmMgZnVuY3Rpb24ga0koZSx0LG4pe2xldCBvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCksMCwwLDApLHI9TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpO2lmKG4ubGVuZ3RoPjApe2xldCBhPWF3YWl0IGUucHJvbXB0KCJQaWNrIHdoZW4gdG8gc2NoZWR1bGUgdGhpcyB0YXNrLiBPbmx5IGZyZWUgdGltZXMgc3RpbGwgYWhlYWQgdG9kYXkgYXJlIGxpc3RlZCBcdTIwMTQgdXNlIHRoZSBidXR0b24gYmVsb3cgdG8gY2hvb3NlIGEgZnV0dXJlIGRhdGUgaW5zdGVhZC4iLHtpbnB1dHM6W3tsYWJlbDoiRGF0ZSIsdHlwZToic3RyaW5nIix2YWx1ZToiVG9kYXkifSx7bGFiZWw6IlRpbWUiLG9wdGlvbnM6bix0eXBlOiJzZWxlY3QiLHZhbHVlOm5bMF0udmFsdWV9XSxhY3Rpb25zOlt7aWNvbjoiZXZlbnQiLGxhYmVsOiJTY2hlZHVsZSBmb3IgYSBmdXR1cmUgZGF0ZSIsdmFsdWU6ImZ1dHVyZSJ9XX0pO2lmKCFhKXJldHVybiBudWxsO2lmKGFbYS5sZW5ndGgtMV0hPT0iZnV0dXJlIil7bGV0IGk9WG0ocixhWzFdKTtyZXR1cm4gaT09bnVsbCYmKGsoIltEcmVhbVRhc2tdIFNjaGVkdWxlOiBpbnZhbGlkIHRvZGF5IHRpbWUgcmV0dXJuZWQgYnkgcHJvbXB0Iix7dG9kYXlSZXN1bHQ6YX0pLGF3YWl0IGUuYWxlcnQoIkNvdWxkIG5vdCBzY2hlZHVsZTogdGhlIHNlbGVjdGVkIHRpbWUgd2FzIGludmFsaWQuIikpLGl9fXJldHVybiB4SShlLG8pfWFzeW5jIGZ1bmN0aW9uIHhJKGUsdCl7bGV0IG49bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSsxLDAsMCwwKSxvPU54KCkscj1hd2FpdCBlLnByb21wdCgiUGljayBhIGZ1dHVyZSBkYXRlIGFuZCB0aW1lIHRvIHNjaGVkdWxlIHRoaXMgdGFzay4iLHtpbnB1dHM6W3tsYWJlbDoiRGF0ZSIsdHlwZToiZGF0ZSIsdmFsdWU6TWF0aC5mbG9vcihuLmdldFRpbWUoKS8xZTMpfSx7bGFiZWw6IlRpbWUiLG9wdGlvbnM6byx0eXBlOiJzZWxlY3QiLHZhbHVlOm9bMF0udmFsdWV9XX0pO2lmKCFyKXJldHVybiBudWxsO2xldFthLGldPXI7aWYoYT09bnVsbHx8aT09bnVsbClyZXR1cm4gbnVsbDtsZXQgcz1YbShhLGkpO3JldHVybiBzPT1udWxsJiYoaygiW0RyZWFtVGFza10gU2NoZWR1bGU6IGludmFsaWQgZnV0dXJlIGRhdGUvdGltZSByZXR1cm5lZCBieSBwcm9tcHQiLHtkYXRlU2VjOmEsdGltZU1pbnV0ZXM6aX0pLGF3YWl0IGUuYWxlcnQoIkNvdWxkIG5vdCBzY2hlZHVsZTogdGhlIHNlbGVjdGVkIGRhdGUgb3IgdGltZSB3YXMgaW52YWxpZC4iKSksc31mdW5jdGlvbiBTSSh7aXNDbGlja2FibGU6ZSx0YXNrOnR9KXtyZXR1cm4gdC5pc0V4aXN0aW5nJiZ0LnNvdXJjZU5vdGVOYW1lPygwLGVlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stc291cmNlLW5vdGUtYmFkZ2UiLHRpdGxlOnQuc291cmNlTm90ZU5hbWU/YFRhc2sgaW4gbm90ZTogJHt0LnNvdXJjZU5vdGVOYW1lfWA6Ik9wZW4gdGhpcyB0YXNrIixjaGlsZHJlbjp0LnNvdXJjZU5vdGVOYW1lfSk6IXQuaXNFeGlzdGluZyYmZT8oMCxlZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5ldy1iYWRnZSIsdGl0bGU6Ik5ldyB0YXNrIFx1MjAxNCBjbGljayB0byBjcmVhdGUiLGNoaWxkcmVuOiIrbmV3In0pOm51bGx9ZnVuY3Rpb24gVXgoe25vdGVVVUlEOmUsb25PcGVuTm90ZTp0fSl7cmV0dXJuIGU/KDAsZWUuanN4KSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6dCx0aXRsZToiT3BlbiB0b2RheSdzIHByb3Bvc2VkIHRhc2tzIG5vdGUiLGNoaWxkcmVuOiJcdXsxRjVEMn1cdUZFMEYgTm90ZSJ9KTpudWxsfWZ1bmN0aW9uIEVJKHtvblJlc2VlZDplfSl7cmV0dXJuKDAsZWUuanN4KSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6ZSx0aXRsZToiR2V0IG5ldyB0YXNrIHN1Z2dlc3Rpb25zIChleGNsdWRlcyB0YXNrcyBzaG93biB0b2RheSkiLGNoaWxkcmVuOiJcdXsxRjUwNH0gUmVzZWVkIn0pfWZ1bmN0aW9uIE5JKCl7cmV0dXJuKDAsZWUuanN4KShyZSx7d2lkZ2V0SWQ6aGksY2hpbGRyZW46KDAsZWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1sb2FkaW5nIixjaGlsZHJlbjpbKDAsZWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXNwaW5uZXIifSksKDAsZWUuanN4KSgicCIse2NoaWxkcmVuOiJBbmFseXppbmcgdGhlIGZpbmVzdCB0YXNrcyBcdTIwMjYifSldfSl9KX12YXIgVEk9W3tpY29uOiJcdXsxRjNBRn0iLGxhYmVsOiJIaWdobGlnaHQgZ29hbC1tYXRjaGVkIHRhc2tzIn0se2ljb246Ilx1MjY5Nlx1RkUwRiIsbGFiZWw6IlNvcnQgdGFza3MgKGZ1biwgZmFzdCwgZXRjKSJ9LHtpY29uOiJcdXsxRjU3NX0iLGxhYmVsOiJEZWVwIG5vdGUgc2VhcmNoIn0se2ljb246Ilx1ezFGNEFBfSIsbGFiZWw6IlRhc2sgY29tcGxldGlvbiBhZ2VudCJ9LHtpY29uOiJcdXsxRjUyQ30iLGxhYmVsOiJNdWx0aS1hZ2VudCBkZWVwIHJlc2VhcmNoIn0se2ljb246Ilx1MjcwRlx1RkUwRiIsbGFiZWw6IkZpbmlzaCBhIG5vdGUgaW4gcHJvZ3Jlc3MifV07ZnVuY3Rpb24gREkoe2Vycm9ySW5mbzplLG5vdGVMaW5rOnQsb25SZXRyeTpuLG9uU2V0dGluZ3NDbGljazpvfSl7bGV0e2Vycm9yOnIsZXJyb3JDb2RlOmEsZXJyb3JEZXRhaWw6aSxwcm92aWRlck5hbWU6c309ZSxsO3N3aXRjaChhKXtjYXNlImludmFsaWRfYXBpX2tleSI6bD0oMCxlZS5qc3hzKShlZS5GcmFnbWVudCx7Y2hpbGRyZW46WygwLGVlLmpzeCkoInAiLHtjaGlsZHJlbjpgVGhlIEFQSSBrZXkgZm9yICR7c3x8InlvdXIgQUkgcHJvdmlkZXIifSBhcHBlYXJzIHRvIGJlIGludmFsaWQgb3IgdW5hdXRob3JpemVkLmB9KSwoMCxlZS5qc3hzKSgicCIse2NoaWxkcmVuOlsiUGxlYXNlIGNoZWNrIHlvdXIgQVBJIGtleSBpbiAiLCgwLGVlLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stc2V0dGluZ3MtbGluayIsb25DbGljazpvLGNoaWxkcmVuOiJBSSBzZXR0aW5ncyJ9KSwiLiJdfSldfSk7YnJlYWs7Y2FzZSJub19wbGFubmluZ19kYXRhIjpsPSgwLGVlLmpzeHMpKGVlLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsZWUuanN4KSgicCIse2NoaWxkcmVuOiJEcmVhbVRhc2sgbmVlZHMgcGxhbm5pbmcgY29udGV4dCB0byBnZW5lcmF0ZSBzdWdnZXN0aW9ucy4ifSksKDAsZWUuanN4KSgicCIse2NoaWxkcmVuOiJQb3B1bGF0ZSB5b3VyIHF1YXJ0ZXJseSBhbmQvb3IgbW9udGhseSBwbGFuIHRvIHJlY2VpdmUgQUktc3VnZ2VzdGVkIHRhc2tzLiJ9KV19KTticmVhaztjYXNlInBhcnNlX2Vycm9yIjpsPSgwLGVlLmpzeHMpKGVlLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAsZWUuanN4KSgicCIse2NoaWxkcmVuOiJVbmFibGUgdG8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3MgdGhlIEFJIHByb3ZpZGVyJ3MgcmVzcG9uc2UuIn0pLCgwLGVlLmpzeHMpKCJwIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWVycm9yLWRldGFpbCIsY2hpbGRyZW46WyJJZiB0aGlzIHBlcnNpc3RzLCBwbGVhc2UgY29udGFjdCBzdXBwb3J0QGFtcGxlbm90ZS5jb20iLGk/YCB3aXRoIHRoaXMgZGV0YWlsOiAke2l9YDoiIl19KV19KTticmVhaztkZWZhdWx0Omw9KDAsZWUuanN4KSgicCIse2NoaWxkcmVuOnJ8fCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiJ9KX1yZXR1cm4oMCxlZS5qc3gpKHJlLHt3aWRnZXRJZDpoaSxoZWFkZXJBY3Rpb25zOnQsY2hpbGRyZW46KDAsZWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lcnJvciIsY2hpbGRyZW46W2wsKDAsZWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXJldHJ5IixvbkNsaWNrOm4sY2hpbGRyZW46IlJldHJ5In0pXX0pfSl9ZnVuY3Rpb24gQUkoe25vdGVMaW5rOmUsb25SZXRyeTp0fSl7cmV0dXJuKDAsZWUuanN4KShyZSx7d2lkZ2V0SWQ6aGksaGVhZGVyQWN0aW9uczplLGNoaWxkcmVuOigwLGVlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stZW1wdHkiLGNoaWxkcmVuOlsoMCxlZS5qc3gpKCJwIix7Y2hpbGRyZW46Ik5vIHRhc2sgc3VnZ2VzdGlvbnMgYXZhaWxhYmxlLiJ9KSwoMCxlZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stcmV0cnkiLG9uQ2xpY2s6dCxjaGlsZHJlbjoiUmVmcmVzaCJ9KV19KX0pfWZ1bmN0aW9uIENJKHtkcmVhbVRhc2tzOmUsbWF4VGFza3M6dCxoZWFkZXJBY3Rpb25zOm4sb25UYXNrQ2xpY2s6byxsaXN0UmVmOnIsbGxtQXR0cmlidXRpb25Gb290ZXI6YSxhY3Rpb25IYW5kbGVyczppfSl7bGV0IHM9cGVyZm9ybWFuY2Uubm93KCksbD1iSShlLHQpO2soYFtEcmVhbVRhc2tdIF9zZWxlY3REaXNwbGF5VGFza3M6ICR7KHBlcmZvcm1hbmNlLm5vdygpLXMpLnRvRml4ZWQoMSl9bXMgKCR7ZS5sZW5ndGh9IFx1MjE5MiAke2wubGVuZ3RofSB0YXNrcylgKTtsZXR7ZGlzbWlzc2luZ1Rhc2tLZXlzOmQsZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6YyxvbkNvbXBsZXRlOnUsb25QcmVzZXJ2ZTpwLG9uUmVtb3ZlOmYsb25TY2hlZHVsZTptLG9uVG9nZ2xlRXhwbGFuYXRpb246Z309aTtyZXR1cm4oMCxlZS5qc3gpKHJlLHtoZWFkZXJBY3Rpb25zOm4sd2lkZ2V0SWQ6aGksY2hpbGRyZW46KDAsZWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1saXN0IixyZWY6cixjaGlsZHJlbjpbbC5tYXAoKHcsdik9PntsZXQgeT0hIW8saD0ody5uYXRpdmVUYXNrfHxudWxsKT8uc3RhcnRBdCE9bnVsbHx8dy5zdGFydEF0IT1udWxsLFM9THIodykseD1kLmhhcyhTKSxFPWNvKHcudGl0bGUpfHx3LnRpdGxlLFQ9Y28ody5leHBsYW5hdGlvbil8fCIiLEE9YGRyZWFtLXRhc2stY2FyZCR7dy5pc0V4aXN0aW5nPyIiOiIgZHJlYW0tdGFzay1jYXJkLS1pbnZlbnRlZCJ9JHt4PyIgZHJlYW0tdGFzay1jYXJkLS1kaXNtaXNzaW5nIjoiIn1gLEM9YGRyZWFtLXRhc2stY2FyZC10aXRsZSR7eT8iIGRyZWFtLXRhc2stY2FyZC10aXRsZS0tY2xpY2thYmxlIjoiIn1gLE89YGRyZWFtLXRhc2stY2FyZC1leHBsYW5hdGlvbiR7Yy5oYXMoUyk/IiBkcmVhbS10YXNrLWNhcmQtZXhwbGFuYXRpb24tLWV4cGFuZGVkIjoiIn1gO3JldHVybigwLGVlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6QSxjaGlsZHJlbjpbKDAsZWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWhlYWRlciIsY2hpbGRyZW46WygwLGVlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6QyxvbkNsaWNrOnk/KCk9Pm8odyk6dm9pZCAwLHJvbGU6eT8iYnV0dG9uIjp2b2lkIDAsdGFiSW5kZXg6eT8wOnZvaWQgMCxvbktleURvd246eT9QPT57KFAua2V5PT09IkVudGVyInx8UC5rZXk9PT0iICIpJiYoUC5wcmV2ZW50RGVmYXVsdCgpLG8odykpfTp2b2lkIDAsdGl0bGU6dy5pc0V4aXN0aW5nPyJPcGVuIHRoaXMgdGFzayI6IkNsaWNrIHRvIGNyZWF0ZSB0aGlzIHRhc2siLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6RX19KSwoMCxlZS5qc3gpKFNJLHtpc0NsaWNrYWJsZTp5LHRhc2s6d30pLCgwLGVlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6YGRyZWFtLXRhc2stcmF0aW5nIGRyZWFtLXRhc2stcmF0aW5nLS0ke3dJKHcucmF0aW5nKX1gLHRpdGxlOmBSZWxldmFuY2U6ICR7dy5yYXRpbmd9LzEwYCxjaGlsZHJlbjpgJHt3LnJhdGluZ30vMTBgfSldfSksKDAsZWUuanN4KSgicCIse2NsYXNzTmFtZTpPLHRpdGxlOncuZXhwbGFuYXRpb24/Lmxlbmd0aD5oST93LmV4cGxhbmF0aW9uOm51bGwsb25DbGljazooKT0+Zyh3KSxkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOlR9fSksKDAsZWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxlZS5qc3gpKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOlA9PnAoUCx3KSx0aXRsZTp3LnByZXNlcnZlVGhyb3VnaFRvbW9ycm93PyJDbGlja2luZyB0aGlzIHdpbGwgcmVtb3ZlIHByZXNlcnZlIHN0YXR1cyBzbyB0aGUgdGFzayBjYW4gcmVzZWVkIG5vcm1hbGx5IjoiQ2xpY2tpbmcgdGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSB0YXNrIHJlbWFpbnMgcHJlc2VudCBpbiB5b3VyIERyZWFtIFRhc2sgbGlzdCB0aHJvdWdoIHRvbW9ycm93IChub3JtYWxseSB0YXNrcyByZXNlZWQgZGFpbHkpIixjaGlsZHJlbjp3LnByZXNlcnZlVGhyb3VnaFRvbW9ycm93PyJcdXsxRjZBQn0gUmVtb3ZlIHByZXNlcnZlIjoiXHV7MUY0Q0V9IFByZXNlcnZlIn0pLCgwLGVlLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6UD0+dShQLHcpLHRpdGxlOiJNYXJrIHRoaXMgdGFzayBjb21wbGV0ZSBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSIsY2hpbGRyZW46Ilx1MjcwNSBDb21wbGV0ZWQifSksaD9udWxsOigwLGVlLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6UD0+bShQLHcpLHRpdGxlOiJTY2hlZHVsZSB0aGlzIHRhc2sgZm9yIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSIsY2hpbGRyZW46Ilx1ezFGNEM1fSBTY2hlZHVsZSJ9KSwoMCxlZS5qc3gpKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOlA9PmYoUCx3KSx0aXRsZToiUmVtb3ZlIHRoaXMgdGFzayBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSIsY2hpbGRyZW46Ilx1Mjc0QyBSZW1vdmUifSldfSldfSxTfHx2KX0pLGE/KDAsZWUuanN4KSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1sbG0tYXR0cmlidXRpb24iLGNoaWxkcmVuOmF9KTpudWxsXX0pfSl9ZnVuY3Rpb24gTUkoe2xvYWRpbmc6ZSxlcnJvcjp0LHRhc2tzOm4sbWF4VGFza3M6byxub3RlTGluazpyLGhlYWRlckFjdGlvbnM6YSxvblNldHRpbmdzQ2xpY2s6aSxydW5BbmFseXNpczpzLG9uVGFza0NsaWNrOmwsbGlzdFJlZjpkLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmMsYWN0aW9uSGFuZGxlcnM6dX0pe3JldHVybiBlPygwLGVlLmpzeCkoTkkse30pOnQ/KDAsZWUuanN4KShESSx7ZXJyb3JJbmZvOnQsbm90ZUxpbms6cixvblJldHJ5OigpPT5zKG51bGwpLG9uU2V0dGluZ3NDbGljazppfSk6IW58fG4ubGVuZ3RoPT09MD8oMCxlZS5qc3gpKEFJLHtub3RlTGluazpyLG9uUmV0cnk6KCk9PnMobnVsbCl9KTooMCxlZS5qc3gpKENJLHtkcmVhbVRhc2tzOm4sbWF4VGFza3M6byxoZWFkZXJBY3Rpb25zOmEsb25UYXNrQ2xpY2s6bCxsaXN0UmVmOmQsbGxtQXR0cmlidXRpb25Gb290ZXI6YyxhY3Rpb25IYW5kbGVyczp1fSl9ZnVuY3Rpb24gT0koe25vdGVVVUlEOmUsb25PcGVuTm90ZTp0LG9uUmVzZWVkOm59KXtyZXR1cm4oMCxlZS5qc3hzKSgic3BhbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1oZWFkZXItYWN0aW9ucyIsY2hpbGRyZW46WygwLGVlLmpzeCkoRUkse29uUmVzZWVkOm59KSwoMCxlZS5qc3gpKFV4LHtub3RlVVVJRDplLG9uT3Blbk5vdGU6dH0pXX0pfWZ1bmN0aW9uIElJKGUsdCxuLG8pe2xldFtyLGFdPSgwLEVlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksW2ksc109KDAsRWUudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxsPSgwLEVlLnVzZUNhbGxiYWNrKSgoKT0+e2EobmV3IFNldCkscyhuZXcgU2V0KX0sW10pLGQ9KDAsRWUudXNlQ2FsbGJhY2spKGFzeW5jKHYseSk9Pnthd2FpdCB5eChlLG4sdix5KX0sW2Usbl0pLGM9KDAsRWUudXNlQ2FsbGJhY2spKHY9PntsZXQgeT1Mcih2KTthKGI9PntsZXQgaD1uZXcgU2V0KGIpO3JldHVybiBoLmFkZCh5KSxofSksc2V0VGltZW91dCgoKT0+e28oYj0+KGJ8fFtdKS5maWx0ZXIoaD0+THIoaCkhPT15KSksYShiPT57bGV0IGg9bmV3IFNldChiKTtyZXR1cm4gaC5kZWxldGUoeSksaH0pLHMoYj0+e2xldCBoPW5ldyBTZXQoYik7cmV0dXJuIGguZGVsZXRlKHkpLGh9KX0sZ0kpfSxbb10pLHU9KDAsRWUudXNlQ2FsbGJhY2spKHY9PntsZXQgeT12LmN1cnJlbnRUYXJnZXQ/LmNsb3Nlc3Q/LigiLmRyZWFtLXRhc2stY2FyZCIpO2lmKCF5fHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm47bGV0IGI9eS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTshYi53aWR0aHx8IWIuaGVpZ2h0fHxOYyh7b3JpZ2luOnt4OihiLmxlZnQrYi53aWR0aC8yKS93aW5kb3cuaW5uZXJXaWR0aCx5OihiLnRvcCtiLmhlaWdodC8yKS93aW5kb3cuaW5uZXJIZWlnaHR9LHBhcnRpY2xlQ291bnQ6OTAsc3ByZWFkOjc1LHN0YXJ0VmVsb2NpdHk6NDJ9KX0sW10pLHA9KDAsRWUudXNlQ2FsbGJhY2spKGFzeW5jKHYseSk9Pnt2LnByZXZlbnREZWZhdWx0KCksQmUoImFwcHJvdmVEcmVhbVRhc2siLHt2aWE6ImNvbXBsZXRlIn0pLHUodik7bGV0IGI9eS51dWlkP251bGw6YXdhaXQgTHgoZSksaD1hd2FpdCBfeChlLGIseSk7aCYmYXdhaXQgZCh5LHtjb21wbGV0ZWRBdDpoLHJlbW92ZWRBdDpudWxsfSksYyh5KX0sW2UsdSxkLGNdKSxmPSgwLEVlLnVzZUNhbGxiYWNrKShhc3luYyh2LHkpPT57di5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPUxyKHkpLGg9IXkucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c7byhTPT4oU3x8W10pLm1hcCh4PT5Mcih4KT09PWI/ey4uLngscHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6aH06eCkpLGF3YWl0IGQoeSx7cHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6aH0pfSxbZCxvXSksbT0oMCxFZS51c2VDYWxsYmFjaykoYXN5bmModix5KT0+e3YucHJldmVudERlZmF1bHQoKTtsZXQgYj1uZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7YXdhaXQgZCh5LHtjb21wbGV0ZWRBdDpudWxsLHJlbW92ZWRBdDpifSksYyh5KX0sW2QsY10pLGc9KDAsRWUudXNlQ2FsbGJhY2spKGFzeW5jKHYseSk9Pnt2LnByZXZlbnREZWZhdWx0KCk7bGV0e2V2ZW50czpiLHRhc2tzOmh9PWF3YWl0IFR4KGUpLFM9bmV3IERhdGUseD1FeChTLGIsaCksRT1hd2FpdCBrSShlLFMseCk7aWYoRT09bnVsbClyZXR1cm47bGV0IFQ9YXdhaXQgRHgoZSx0LEUseSk7aWYoIVQudGFza1V1aWQpe2soIltEcmVhbVRhc2tdIFNjaGVkdWxlIGZhaWxlZCIsVCk7bGV0IEM9VC5yZWFzb249PT0ibWlzc2luZ19ub3RlIj8iQ291bGQgbm90IHNjaGVkdWxlOiBubyB0YXJnZXQgbm90ZSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgc3VnZ2VzdGlvbi4iOiJDb3VsZCBub3Qgc2NoZWR1bGUgdGhpcyB0YXNrLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHNjaGVkdWxlIGl0IG1hbnVhbGx5LiI7YXdhaXQgZS5hbGVydChDKTtyZXR1cm59QmUoImFwcHJvdmVEcmVhbVRhc2siLHt2aWE6InNjaGVkdWxlIn0pLGF3YWl0IGQoeSx7dGFza1V1aWQ6VC50YXNrVXVpZH0pO2xldCBBPUxyKHkpO2lmKG8oQz0+KEN8fFtdKS5tYXAoTz0+THIoTyk9PT1BP3suLi5PLGlzRXhpc3Rpbmc6ITAsbm90ZVVVSUQ6VC5ub3RlVVVJRHx8Ty5ub3RlVVVJRHx8dCxzdGFydEF0OlQuc3RhcnRBdHx8RSx1dWlkOlQudGFza1V1aWR9Ok8pKSx0eXBlb2Ygd2luZG93PCJ1Iil7bGV0IEM9bmV3IEN1c3RvbUV2ZW50KG1pLHtjb250ZW50OnkudGl0bGUsbm90ZVVVSUQ6VC5ub3RlVVVJRHx8eS5ub3RlVVVJRHx8dCxzdGFydEF0OkUsdGFza1V1aWQ6VC50YXNrVXVpZH0pO3dpbmRvdy5kaXNwYXRjaEV2ZW50KEMpfX0sW2UsdCxkLG9dKSx3PSgwLEVlLnVzZUNhbGxiYWNrKSh2PT57bGV0IHk9THIodik7cyhiPT57bGV0IGg9bmV3IFNldChiKTtyZXR1cm4gaC5oYXMoeSk/aC5kZWxldGUoeSk6aC5hZGQoeSksaH0pfSxbXSk7cmV0dXJue2Rpc21pc3NpbmdUYXNrS2V5czpyLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOmksb25Db21wbGV0ZVRhc2s6cCxvblByZXNlcnZlVGFzazpmLG9uUmVtb3ZlVGFzazptLG9uU2NoZWR1bGVUYXNrOmcsb25Ub2dnbGVFeHBsYW5hdGlvbjp3LHJlc2V0QWN0aW9uU3RhdGU6bH19ZnVuY3Rpb24gUW0oe2FwcDplLGdyaWRIZWlnaHRTaXplOnQsZ3JpZFdpZHRoU2l6ZTpuLG9uT3BlblNldHRpbmdzOm8scHJvdmlkZXJBcGlLZXk6cixwcm92aWRlckVtOmEsdGFza0RvbWFpbk5hbWU6aSx0YXNrRG9tYWluVVVJRDpzfSl7bGV0W2wsZF09KDAsRWUudXNlU3RhdGUpKCExKSxbYyx1XT0oMCxFZS51c2VTdGF0ZSkobnVsbCksW3AsZl09KDAsRWUudXNlU3RhdGUpKG51bGwpLFttLGddPSgwLEVlLnVzZVN0YXRlKShudWxsKSxbdyx2XT0oMCxFZS51c2VTdGF0ZSkobnVsbCksW3ksYl09KDAsRWUudXNlU3RhdGUpKG51bGwpLFtoLFNdPSgwLEVlLnVzZVN0YXRlKSghMSksW3gsRV09KDAsRWUudXNlU3RhdGUpKCExKSxbLFRdPSgwLEVlLnVzZVN0YXRlKSgoKT0+JHMoKSksQT0oMCxFZS51c2VSZWYpKDApLEM9KDAsRWUudXNlUmVmKShudWxsKSxPPSgwLEVlLnVzZVJlZikoMCk7Ty5jdXJyZW50Kz0xO2xldCBQPVZiKCksVT1QfHxyLEk9YT9UYyhhKTpudWxsLEg9Zngobix0KSxfPW14KG4sdCksSz1pfHwiQWxsIE5vdGVzIixNPW5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se2RheToibnVtZXJpYyIsbW9udGg6ImxvbmciLHllYXI6Im51bWVyaWMifSksVz1gRGFzaGJvYXJkIHByb3Bvc2VkIHRhc2tzIGZvciAke0t9IG9uICR7TX1gLEQ9KDAsRWUudXNlUmVmKShfKSx7ZGlzbWlzc2luZ1Rhc2tLZXlzOk4sZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6RixvbkNvbXBsZXRlVGFzazpZLG9uUHJlc2VydmVUYXNrOmosb25SZW1vdmVUYXNrOlosb25TY2hlZHVsZVRhc2s6b2Usb25Ub2dnbGVFeHBsYW5hdGlvbjpxLHJlc2V0QWN0aW9uU3RhdGU6dGV9PUlJKGUsdyxtLHUpLGRlPSgwLEVlLnVzZUNhbGxiYWNrKShhc3luYyhiZSxvdCk9PntsZXQgcnQ9KGJlfHxbXSkuZmlsdGVyKEJvb2xlYW4pO2lmKHJ0Lmxlbmd0aD09PTApcmV0dXJuIG90O2xldCBrdD1hd2FpdCBoeChlLG90LHJ0KTtyZXR1cm4gVChrdCksa3R9LFtlXSksbGU9KDAsRWUudXNlQ2FsbGJhY2spKGFzeW5jKGJlLG90PXt9KT0+e2xldCBydD1BLmN1cnJlbnQrMTtBLmN1cnJlbnQ9cnQ7bGV0IGt0PW90LnByb3ZpZGVyRW1PdmVycmlkZT9UYyhvdC5wcm92aWRlckVtT3ZlcnJpZGUpOkk7aygiW0RyZWFtVGFza10gcnVuQW5hbHlzaXMgZW50cnkiLHtoYXNMbG1Db25maWc6VSxwcm92aWRlck5hbWU6a3QsZXhjbHVkZVV1aWRzU2l6ZTpiZT8uc2l6ZT8/MCxvcHRpb25zOm90LHRhc2tHZW5lcmF0ZUNvdW50Ol8scHJvcG9zZWRUYXNrc05vdGVOYW1lOld9KSxkKCEwKSxmKG51bGwpLGIobnVsbCk7dHJ5e2xldCBoZT1wZXJmb3JtYW5jZS5ub3coKSxmZT1hd2FpdCBieChlLHtleGNsdWRlVXVpZHM6YmUsb3B0aW9uczpvdCxwcm9wb3NlZFRhc2tzTm90ZU5hbWU6VyxtYXhUYXNrczpffSk7aWYoayhgW0RyZWFtVGFza10gZmV0Y2hEcmVhbVRhc2tTdWdnZXN0aW9ucyB0b29rICR7KHBlcmZvcm1hbmNlLm5vdygpLWhlKS50b0ZpeGVkKDEpfW1zYCx7Y2FjaGVkOmZlPy5jYWNoZWQsdGFza0NvdW50OmZlPy50YXNrcz8ubGVuZ3RoPz8wLGVycm9yQ29kZTpmZT8uZXJyb3JDb2RlPz9udWxsLG5vdGVVVUlEOmZlPy5ub3RlVVVJRD8/bnVsbH0pLCFmZT8uY2FjaGVkJiYhZmU/LmVycm9yQ29kZSYmZmU/LnRhc2tzPy5sZW5ndGgmJkJlKCJnZW5lcmF0ZURyZWFtVGFza3MiLHtjb3VudDpmZS50YXNrcy5sZW5ndGh9KSxydCE9PUEuY3VycmVudClyZXR1cm47bGV0IF90PXBlcmZvcm1hbmNlLm5vdygpO2F3YWl0IHd4KGZlLHtwcm92aWRlck5hbWU6a3QsYXBwOmUscmVjb3JkVGFza1V1aWRzOmRlLHNldEVycm9yOmYsc2V0VGFza3M6dSxzZXROb3RlVVVJRDpnLHNldERlZmF1bHROb3RlVVVJRDp2LHNldExsbUF0dHJpYnV0aW9uRm9vdGVyOmJ9KSxrKGBbRHJlYW1UYXNrXSBhcHBseURyZWFtVGFza0FuYWx5c2lzUmVzdWx0IHRvb2sgJHsocGVyZm9ybWFuY2Uubm93KCktX3QpLnRvRml4ZWQoMSl9bXNgKX1jYXRjaChoZSl7aWYocnQhPT1BLmN1cnJlbnQpcmV0dXJuO2soIltEcmVhbVRhc2tdIHJ1bkFuYWx5c2lzIGNhdWdodCB1bmV4cGVjdGVkIGVycm9yIixoZSksZih7ZXJyb3I6aGUubWVzc2FnZXx8IkFuYWx5c2lzIGZhaWxlZCIsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLHByb3ZpZGVyTmFtZTprdH0pfWZpbmFsbHl7cnQ9PT1BLmN1cnJlbnQmJmQoITEpfX0sW2RlLF8sVyxJLFVdKTsoMCxFZS51c2VFZmZlY3QpKCgpPT57VCgkcygpKX0sW10pLCgwLEVlLnVzZUVmZmVjdCkoKCk9Pnt0ZSgpLHYobnVsbCksZyhudWxsKSx1KG51bGwpLGxlKG51bGwse21pbmltdW1UYXNrQ291bnQ6X30pfSxbVSxXLHNdKSwoMCxFZS51c2VFZmZlY3QpKCgpPT57bGV0IGJlPXZJKGUsYSxyLFApO2soIltEcmVhbVRhc2tdIGNvbmZpZyBzbmFwc2hvdCIse2hhc0xsbUNvbmZpZzpVLHByb3ZpZGVyTmFtZTpJLHJlbmRlckNvdW50Ok8uY3VycmVudCwuLi5iZX0pfSxbVSxhLHIsUCxJXSksKDAsRWUudXNlRWZmZWN0KSgoKT0+e2xldCBiZT0hMTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUuZmluZE5vdGUoe25hbWU6QW99KSkudGhlbihvdD0+e2JlfHxFKCEhb3QpfSksKCk9PntiZT0hMH19LFtlXSksKDAsRWUudXNlRWZmZWN0KSgoKT0+e2lmKCFVKXJldHVybjtsZXQgYmU9RC5jdXJyZW50O0QuY3VycmVudD1fLGt4KHttYXhUYXNrczpfLHByZXZpb3VzTWF4VGFza3M6YmUsdGFza3M6Y30pJiZxbShsZSxfKX0sW1UsXyxjXSksKDAsRWUudXNlRWZmZWN0KSgoKT0+e2xldCBiZT1wZXJmb3JtYW5jZS5ub3coKTtXbihDLmN1cnJlbnQpLGsoYFtEcmVhbVRhc2tdIGF0dGFjaEZvb3Rub3RlUG9wdXBzOiAkeyhwZXJmb3JtYW5jZS5ub3coKS1iZSkudG9GaXhlZCgxKX1tc2ApfSxbYyxwLGxdKTtsZXQgcGU9YXN5bmMgYmU9PntiZS5wcmV2ZW50RGVmYXVsdCgpLG0mJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHttfWApfSxrZT1iZT0+e2JlLnByZXZlbnREZWZhdWx0KCksdngobyl9LFBlPWJlPT57YmUucHJldmVudERlZmF1bHQoKSxTKCEwKX0sdWU9YmU9PntTKCExKSx1KG51bGwpLHRlKCksYihudWxsKSxxbShsZSxfLGJlP3twcm92aWRlckVtT3ZlcnJpZGU6YmV9Ont9KX0scWU9IWwmJiFjJiYhcCxKZT0hIXAmJnlJLmhhcyhwLmVycm9yQ29kZSksUWU9IVUmJiFsJiYoIWN8fGMubGVuZ3RoPT09MCkmJihxZXx8SmUpO3JldHVybiB1dChoaSwhbCYmKFFlfHwhIWN8fCEhcCksISFwKSxRZT8oaygiW0RyZWFtVGFza10gcmVuZGVyaW5nIG5vLWNvbmZpZyBzdGF0ZSIse3Byb3ZpZGVyTmFtZTpJLGhhc0Vycm9yOiEhcCxlcnJvckNvZGU6cD8uZXJyb3JDb2RlPz9udWxsLHRhc2tDb3VudDpjPy5sZW5ndGg/PzB9KSwoMCxlZS5qc3gpKFFzLHthcHA6ZSxmZWF0dXJlczpUSSxtb3JlRmVhdHVyZXNMYWJlbDoiKyAxNSBtb3JlIGZlYXR1cmVzIGluY2x1ZGVkIix3aWRnZXRJZDpoaX0pKTooMCxlZS5qc3hzKShlZS5GcmFnbWVudCx7Y2hpbGRyZW46WygwLGVlLmpzeCkoTUkse2Vycm9yOnAsaGVhZGVyQWN0aW9uczooMCxlZS5qc3gpKE9JLHtub3RlVVVJRDptLG9uT3Blbk5vdGU6cGUsb25SZXNlZWQ6UGV9KSxsaXN0UmVmOkMsbG9hZGluZzpsLGxsbUF0dHJpYnV0aW9uRm9vdGVyOnksbWF4VGFza3M6SCxub3RlTGluazooMCxlZS5qc3gpKFV4LHtub3RlVVVJRDptLG9uT3Blbk5vdGU6cGV9KSxvblRhc2tDbGljazpiZT0+Z3goZSxiZSx3KSx0YXNrczpjLG9uU2V0dGluZ3NDbGljazprZSxydW5BbmFseXNpczpsZSxhY3Rpb25IYW5kbGVyczp7ZGlzbWlzc2luZ1Rhc2tLZXlzOk4sZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6RixvbkNvbXBsZXRlOlksb25QcmVzZXJ2ZTpqLG9uUmVtb3ZlOlosb25TY2hlZHVsZTpvZSxvblRvZ2dsZUV4cGxhbmF0aW9uOnF9fSksaD8oMCxlZS5qc3gpKEpzLHthbGxvd0tleWxlc3NQcm92aWRlcnM6eCxjb25maWd1cmVkUHJvdmlkZXJFbXM6RmQoX2UoKSksY3VycmVudFByb3ZpZGVyRW06YSxvbkNhbmNlbDooKT0+UyghMSksb25TZWxlY3Q6dWUsc3VibWl0TGFiZWw6IlJlc2VlZCIsdGl0bGU6IlJlc2VlZCBzdWdnZXN0aW9ucyB3aXRoIHdoaWNoIEFJIHByb3ZpZGVyPyJ9KTpudWxsXX0pfXZhciB5bj1MKG1lKCkpO3ZhciBnaT0zNjUsZWg9MTMsUkk9MTUsUEk9NjAsQng9NSxIeD0zLExJPTEsWm09MztmdW5jdGlvbiBLeChlKXtyZXR1cm4hZXx8dHlwZW9mIGUhPSJzdHJpbmciPyIiOmUucmVwbGFjZSgvXFtcXj9bXlxdXSpcXVwoW14pXSpcKS9nLCIgIikucmVwbGFjZSgvW1xwe0Vtb2ppX1ByZXNlbnRhdGlvbn1ccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9XS9ndSwiICIpLnJlcGxhY2UoL1teXHB7TGV0dGVyfVxwe051bWJlcn1cc10vZ3UsIiAiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEd4KGUpe3JldHVybiFlfHx0eXBlb2YgZSE9InN0cmluZyI/IiI6S3goZS5zcGxpdChgCmApWzBdKX1mdW5jdGlvbiBMYyhlKXtyZXR1cm4hZXx8dHlwZW9mIGUhPSJzdHJpbmciPyIiOkt4KGUucmVwbGFjZSgvXG4rL2csIiAiKSl9ZnVuY3Rpb24gX0koZSl7cmV0dXJuIWV8fHR5cGVvZiBlIT0ic3RyaW5nIj8iVW50aXRsZWQgaGFiaXQiOmUuc3BsaXQoYApgKVswXS5yZXBsYWNlKC9cW1xePyhbXlxdXSopXF1cKFteKV0qXCkvZywiJDEiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKXx8IlVudGl0bGVkIGhhYml0In12YXIgVng9IlxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHUyMDBkXFx1ZmUwZlxcdXsxZjNmYn0tXFx1ezFmM2ZmfSIsVUk9bmV3IFJlZ0V4cChgXihbXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY31cXHB7RW1vamlfUHJlc2VudGF0aW9ufV1bJHtWeH1dKilgLCJ1IiksRkk9bmV3IFJlZ0V4cChgXlske1Z4fV0rXFxzKmAsInUiKTtmdW5jdGlvbiB0aChlKXtsZXQgdD1TdHJpbmcoZXx8IiIpLm1hdGNoKFVJKTtyZXR1cm4gdD90WzFdLnRyaW0oKToiIn1mdW5jdGlvbiBuaChlKXtyZXR1cm4gU3RyaW5nKGV8fCIiKS5yZXBsYWNlKEZJLCIiKS50cmltKCl8fFN0cmluZyhlfHwiIikudHJpbSgpfWZ1bmN0aW9uIGp4KGUsdD1abSl7cmV0dXJuIEd4KGUpLnNwbGl0KCIgIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aD49dD9fSShlKTplLnRyaW0oKX1mdW5jdGlvbiBvaChlKXtyZXR1cm4gTGMoangoZSkpfWZ1bmN0aW9uIEZ4KGUpe3JldHVybiBHeChlKS5zcGxpdCgiICIpLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiB6SShlLHQsbil7bGV0IG89TWF0aC5taW4oZS5sZW5ndGgsdC5sZW5ndGgpO2lmKG88bilyZXR1cm4hMTtsZXQgcj1uZXcgU2V0KHQpLGE9MDtmb3IobGV0IGkgb2YgbmV3IFNldChlKSlyLmhhcyhpKSYmKGErPTEpO3JldHVybiBhPm8vMn1mdW5jdGlvbiBXSShlKXtsZXQgdD1bLi4uZS5rZXlzKCldLnNvcnQoKSxuPXQuZmlsdGVyKGw9PkZ4KGUuZ2V0KGwpLmxhYmVsKS5sZW5ndGg+PVptKSxvPW5ldyBNYXAobi5tYXAobD0+W2wsRngoZS5nZXQobCkubGFiZWwpXSkpLHI9bmV3IE1hcCh0Lm1hcChsPT5bbCxsXSkpLGE9bD0+e2Zvcig7ci5nZXQobCkhPT1sOylyLnNldChsLHIuZ2V0KHIuZ2V0KGwpKSksbD1yLmdldChsKTtyZXR1cm4gbH07Zm9yKGxldCBsPTA7bDxuLmxlbmd0aDtsKyspZm9yKGxldCBkPWwrMTtkPG4ubGVuZ3RoO2QrKyl6SShvLmdldChuW2xdKSxvLmdldChuW2RdKSxabSkmJnIuc2V0KGEobltsXSksYShuW2RdKSk7bGV0IGk9bmV3IE1hcDtmb3IobGV0IGwgb2YgdCl7bGV0IGQ9YShsKTtpLmhhcyhkKXx8aS5zZXQoZCxbXSksaS5nZXQoZCkucHVzaChsKX1sZXQgcz1uZXcgTWFwO2ZvcihsZXQgbCBvZiBpLnZhbHVlcygpKXtsZXQgZD1sLnNsaWNlKCkuc29ydCgobSxnKT0+KGUuZ2V0KGcpLmNvbXBsZXRpb25zfHwwKS0oZS5nZXQobSkuY29tcGxldGlvbnN8fDApfHwobTxnPy0xOjEpKVswXSxjPWUuZ2V0KGQpLHU9e2xhYmVsOmMubGFiZWwsc2FtcGxlQ29udGVudDpjLnNhbXBsZUNvbnRlbnR8fGMubGFiZWwsY29tcGxldGlvbnM6MCxkb25lTW9vZHM6W10sbW9zdFJlY2VudERheUtleTpudWxsLG9mZk1vb2RzOltdLHdlZWtTdHJlYWs6MH0scD0hMSxmPSExO2ZvcihsZXQgbSBvZiBsKXtsZXQgZz1lLmdldChtKTtpZih1LmNvbXBsZXRpb25zKz1nLmNvbXBsZXRpb25zfHwwLEFycmF5LmlzQXJyYXkoZy5kb25lTW9vZHMpJiZ1LmRvbmVNb29kcy5wdXNoKC4uLmcuZG9uZU1vb2RzKSxBcnJheS5pc0FycmF5KGcub2ZmTW9vZHMpJiZ1Lm9mZk1vb2RzLnB1c2goLi4uZy5vZmZNb29kcyksZy5tb3N0UmVjZW50RGF5S2V5JiYoIXUubW9zdFJlY2VudERheUtleXx8Zy5tb3N0UmVjZW50RGF5S2V5PnUubW9zdFJlY2VudERheUtleSkmJih1Lm1vc3RSZWNlbnREYXlLZXk9Zy5tb3N0UmVjZW50RGF5S2V5KSxnLndlZWtTdHJlYWshPW51bGwmJih1LndlZWtTdHJlYWs9TWF0aC5tYXgodS53ZWVrU3RyZWFrLGcud2Vla1N0cmVhaykpLGcuZGF5c0RvbmUhPW51bGwmJih1LmRheXNEb25lPSh1LmRheXNEb25lfHwwKStnLmRheXNEb25lLHA9ITApLGcuZG9uZURheUtleXMpe3UuZG9uZURheUtleXN8fCh1LmRvbmVEYXlLZXlzPW5ldyBTZXQpO2ZvcihsZXQgdyBvZiBnLmRvbmVEYXlLZXlzKXUuZG9uZURheUtleXMuYWRkKHcpO2Y9ITB9fSFwJiYhZiYmKHUuZGF5c0RvbmU9MCkscy5zZXQoZCx1KX1yZXR1cm4gc31mdW5jdGlvbiBZeChlKXtyZXR1cm4gZT09bnVsbD9udWxsOmFlKGUpfWZ1bmN0aW9uIEJJKGUpe3JldHVybiBlPT1udWxsP251bGw6eWkoSWUoZSkpfWZ1bmN0aW9uIHlpKGUpe3JldHVybiBhZShlKS5zbGljZSgwLDcpfWZ1bmN0aW9uIF9jKGUpe2xldFt0LG5dPVN0cmluZyhlKS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpO3JldHVybmAke0JuWyhufHwxKS0xXXx8IiJ9ICR7dH1gfWZ1bmN0aW9uIHF4KGUpe2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG51bGw7bGV0IHQ9ZS50cmltKCkubWF0Y2goL14oW0EtWmEtel0rKVxzKyhcZHs0fSkkLyk7aWYoIXQpcmV0dXJuIG51bGw7bGV0IG49Qm4uZmluZEluZGV4KG89Pm8udG9Mb3dlckNhc2UoKT09PXRbMV0udG9Mb3dlckNhc2UoKSk7cmV0dXJuIG48MD9udWxsOmAke3RbMl19LSR7U3RyaW5nKG4rMSkucGFkU3RhcnQoMiwiMCIpfWB9ZnVuY3Rpb24gJHgoZT1uZXcgRGF0ZSx0PWVoKXtsZXQgbj1bXTtmb3IobGV0IG89dC0xO28+PTA7by0tKXtsZXQgcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLW8sMSk7bi5wdXNoKHlpKHIpKX1yZXR1cm4gbn1mdW5jdGlvbiByaChlKXtsZXRbdCxuXT1TdHJpbmcoZSkuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKTtyZXR1cm4gTWF0aC5mbG9vcihuZXcgRGF0ZSh0LChufHwxKS0xLDEsMCwwLDAsMCkuZ2V0VGltZSgpLzFlMyl9ZnVuY3Rpb24gWnMoZSl7cmV0dXJuIGFlKG1uKGUpKX1mdW5jdGlvbiBISShlLHQ9bmV3IERhdGUpe2xldFtuLG9dPVN0cmluZyhlKS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLHI9bmV3IERhdGUobixvLDApLmdldERhdGUoKSxhPVpzKGFlKHQpKSxpPVtdLHM9bmV3IFNldDtmb3IobGV0IGw9MTtsPD1yO2wrKyl7bGV0IGQ9WnMoYWUobmV3IERhdGUobixvLTEsbCkpKTtkLnNsaWNlKDAsNyk9PT1lJiYocy5oYXMoZCl8fGQ+YXx8KHMuYWRkKGQpLGkucHVzaChkKSkpfXJldHVybiBpfWZ1bmN0aW9uIEtJKGUpe2xldCB0PXt9O2ZvcihsZXQgbyBvZiBlfHxbXSl7aWYoIW98fG8ucmF0aW5nPT1udWxsKWNvbnRpbnVlO2xldCByPVl4KG8udGltZXN0YW1wKTtyJiYodFtyXXx8KHRbcl09e3RvdGFsOjAsY291bnQ6MH0pLHRbcl0udG90YWwrPW8ucmF0aW5nLHRbcl0uY291bnQrPTEpfWxldCBuPXt9O2ZvcihsZXQgbyBvZiBPYmplY3Qua2V5cyh0KSluW29dPXRbb10udG90YWwvdFtvXS5jb3VudDtyZXR1cm4gbn1mdW5jdGlvbiBHSShlLHQpe2xldCBuPTA7Zm9yKGxldCBvPXQubGVuZ3RoLTE7bz49MCYmZS5oYXModFtvXSk7by0tKW4rPTE7cmV0dXJuIG59ZnVuY3Rpb24gengoZSl7cmV0dXJuIWV8fGUubGVuZ3RoPT09MD8wOmUucmVkdWNlKCh0LG4pPT50K24sMCkvZS5sZW5ndGh9ZnVuY3Rpb24gVkkoZSx7b3JkZXJlZFdpbmRvd0tleXM6dD1bXSxtaW5Db21wbGV0aW9uczpuPUJ4LG1pbk1vb2REYXlzOm89SHh9PXt9KXtsZXQgcj1XSShlKSxhPVtdO2ZvcihsZXRbaSxzXW9mIHIuZW50cmllcygpKXtsZXQgbD1zLmRvbmVNb29kcy5sZW5ndGgsZD1zLm9mZk1vb2RzLmxlbmd0aDtpZihzLmNvbXBsZXRpb25zPG58fGw8b3x8ZD09PTApY29udGludWU7bGV0IGM9engocy5kb25lTW9vZHMpLHU9engocy5vZmZNb29kcyk7YS5wdXNoKHtrZXk6aSxsYWJlbDpzLmxhYmVsLHNhbXBsZUNvbnRlbnQ6cy5zYW1wbGVDb250ZW50fHxzLmxhYmVsLGNvbXBsZXRpb25zOnMuY29tcGxldGlvbnMsZGF5c0RvbmU6cy5kYXlzRG9uZSE9bnVsbD9zLmRheXNEb25lOnMuZG9uZURheUtleXM/cy5kb25lRGF5S2V5cy5zaXplOmwsc3RyZWFrOnMuZG9uZURheUtleXM/R0kocy5kb25lRGF5S2V5cyx0KTowLHdlZWtTdHJlYWs6cy53ZWVrU3RyZWFrIT1udWxsP3Mud2Vla1N0cmVhazowLGRlbHRhOmMtdSxkb25lV2l0aE1vb2Q6bCxvZmZXaXRoTW9vZDpkLGF2Z01vb2RPbkRvbmU6YyxhdmdNb29kT25PZmY6dSxtb3N0UmVjZW50RGF5S2V5OnMubW9zdFJlY2VudERheUtleXx8bnVsbH0pfXJldHVybiBhLnNvcnQoKGkscyk9PnMuZGVsdGEtaS5kZWx0YSksYX1mdW5jdGlvbiBqSShlLHQsbixvKXtsZXQgcj1ufHwwO2ZvcihsZXQgYSBvZiBlKXQuaGFzKGEpP3IrPTE6YSE9PW8mJihyPTApO3JldHVybiByfWZ1bmN0aW9uIFh4KHtjb21wbGV0ZWRUYXNrczplLG1vb2RSYXRpbmdzOnQsbW9udGhLZXlzOm4sbWluTW9udGhseUNvbXBsZXRpb25zOm89TEksdG9kYXk6cj1uZXcgRGF0ZSxwcmlvclN0cmVha0J5S2V5OmE9bmV3IE1hcH0pe2xldCBpPW5ldyBTZXQobnx8W10pLHM9S0kodCksbD1acyhhZShyKSksZD1uZXcgTWFwO2ZvcihsZXQgbSBvZiBpKWQuc2V0KG0sbmV3IE1hcCk7bGV0IGM9bmV3IE1hcDtmb3IobGV0IG0gb2YgZXx8W10pe2lmKCFtfHxtLmNvbXBsZXRlZEF0PT1udWxsKWNvbnRpbnVlO2xldCBnPUJJKG0uY29tcGxldGVkQXQpO2lmKCFnfHwhaS5oYXMoZykpY29udGludWU7bGV0IHc9b2gobS5jb250ZW50KTtpZighdyljb250aW51ZTtsZXQgdj1kLmdldChnKTt2Lmhhcyh3KXx8di5zZXQodyx7bGFiZWw6angobS5jb250ZW50KSxzYW1wbGVDb250ZW50Om0uY29udGVudCxjb3VudDowLGRvbmVEYXlLZXlzOm5ldyBTZXR9KTtsZXQgeT12LmdldCh3KTt5LmNvdW50Kz0xO2xldCBiPVl4KG0uY29tcGxldGVkQXQpO2ImJih5LmRvbmVEYXlLZXlzLmFkZChiKSxjLmhhcyh3KXx8Yy5zZXQodyxuZXcgU2V0KSxjLmdldCh3KS5hZGQoWnMoYikpKX1sZXQgdT1uZXcgTWFwO2ZvcihsZXQgbSBvZiBPYmplY3Qua2V5cyhzKSl7bGV0IGc9YCR7bS5zbGljZSgwLDcpfWA7aS5oYXMoZykmJih1LmhhcyhnKXx8dS5zZXQoZyxbXSksdS5nZXQoZykucHVzaChtKSl9bGV0IHA9bmV3IE1hcCxmPW5ldyBNYXA7Zm9yKGxldCBtIG9mWy4uLmldLnNvcnQoKSl7bGV0IGc9ZC5nZXQobSksdz11LmdldChtKXx8W10sdj1ISShtLHIpLHk9W107Zm9yKGxldFtiLGhdb2YgZy5lbnRyaWVzKCkpe2xldCBTPXAuaGFzKGIpP3AuZ2V0KGIpOmEuZ2V0KGIpfHwwLHg9Yy5nZXQoYil8fG5ldyBTZXQsRT1qSSh2LHgsUyxsKTtpZihwLnNldChiLEUpLGguY291bnQ8byljb250aW51ZTtsZXQgVD1bXSxBPVtdO2ZvcihsZXQgTyBvZiB3KXtsZXQgUD1zW09dO2guZG9uZURheUtleXMuaGFzKE8pP1QucHVzaChXeChQKSk6QS5wdXNoKFd4KFApKX1sZXQgQz1bLi4uaC5kb25lRGF5S2V5c10uc29ydCgpLmF0KC0xKXx8bnVsbDt5LnB1c2goe2xhYmVsOmgubGFiZWwsa2V5OmIsY291bnQ6aC5jb3VudCx3ZWVrU3RyZWFrOkUsZG9uZU1vb2RzOlQsbW9zdFJlY2VudERheUtleTpDLG9mZk1vb2RzOkF9KX15LnNvcnQoKGIsaCk9PmguY291bnQtYi5jb3VudHx8Yi5sYWJlbC5sb2NhbGVDb21wYXJlKGgubGFiZWwpKSxmLnNldChtLHttb250aEtleTptLGxhYmVsOl9jKG0pLHJvd3M6eX0pfXJldHVybiBmfWZ1bmN0aW9uIEp4KGUse2VuZm9yY2VBY3Rpdml0eUVsaWdpYmlsaXR5OnQ9ITEsb3JkZXJlZFdpbmRvd0tleXM6bj1bXSxtaW5Db21wbGV0aW9uczpvPUJ4LG1pbk1vb2REYXlzOnI9SHgsdG9kYXk6YT1uZXcgRGF0ZX09e30pe2xldCBpPW5ldyBNYXAscz1uZXcgTWFwO2ZvcihsZXQgdyBvZiBlLnZhbHVlcygpKWZvcihsZXQgdiBvZiB3LnJvd3N8fFtdKXtsZXQgeT12LmtleXx8TGModi5sYWJlbCk7aWYoIXkpY29udGludWU7aS5oYXMoeSl8fGkuc2V0KHkse2xhYmVsOnYubGFiZWwsc2FtcGxlQ29udGVudDp2LmxhYmVsLGNvbXBsZXRpb25zOjAsZG9uZU1vb2RzOltdLG1vc3RSZWNlbnREYXlLZXk6bnVsbCxvZmZNb29kczpbXSx3ZWVrU3RyZWFrOjB9KTtsZXQgYj1pLmdldCh5KTtiLmNvbXBsZXRpb25zKz12LmNvdW50fHwwLEFycmF5LmlzQXJyYXkodi5kb25lTW9vZHMpJiZiLmRvbmVNb29kcy5wdXNoKC4uLnYuZG9uZU1vb2RzKSxBcnJheS5pc0FycmF5KHYub2ZmTW9vZHMpJiZiLm9mZk1vb2RzLnB1c2goLi4udi5vZmZNb29kcyksYi5sYWJlbD12LmxhYmVsfHxiLmxhYmVsLHYubW9zdFJlY2VudERheUtleSYmKCFiLm1vc3RSZWNlbnREYXlLZXl8fHYubW9zdFJlY2VudERheUtleT5iLm1vc3RSZWNlbnREYXlLZXkpJiYoYi5tb3N0UmVjZW50RGF5S2V5PXYubW9zdFJlY2VudERheUtleSk7bGV0IGg9cy5nZXQoeSk7KCFofHwody5tb250aEtleXx8IiIpPmgpJiYocy5zZXQoeSx3Lm1vbnRoS2V5fHwiIiksYi53ZWVrU3RyZWFrPXYud2Vla1N0cmVha3x8MCl9Zm9yKGxldCB3IG9mIGkudmFsdWVzKCkpdy5kYXlzRG9uZT13LmNvbXBsZXRpb25zO2xldCBsPVZJKGkse29yZGVyZWRXaW5kb3dLZXlzOm4sbWluQ29tcGxldGlvbnM6byxtaW5Nb29kRGF5czpyfSk7aWYoIXQpcmV0dXJuIGw7bGV0IGQ9YWUoYSksYz1acyhkKSx1PUllKGMpO3Uuc2V0RGF0ZSh1LmdldERhdGUoKS03KTtsZXQgcD1hZSh1KSxmPUllKGQpO2Yuc2V0RGF0ZShmLmdldERhdGUoKS0oUEktMSkpO2xldCBtPWFlKGYpO3JldHVybiBsLmZpbHRlcih3PT57aWYody5jb21wbGV0aW9ucz5SSSlyZXR1cm4gdy5tb3N0UmVjZW50RGF5S2V5Pj1tO2xldCB2PXcubW9zdFJlY2VudERheUtleT49cDtyZXR1cm4gdy53ZWVrU3RyZWFrPjAmJnZ9KX1mdW5jdGlvbiBXeChlKXtyZXR1cm4gTWF0aC5yb3VuZCgoZXx8MCkqMTAwKS8xMDB9ZnVuY3Rpb24gYWgoZSl7bGV0IHQ9TWF0aC5yb3VuZCgoZXx8MCkqMTAwKS8xMDA7cmV0dXJuYCR7dD4wPyIrIjp0PDA/Ilx1MjIxMiI6IiJ9JHtNYXRoLmFicyh0KS50b0ZpeGVkKDIpfWB9dmFyIGVsPSJFbmVyZ3kgUGVyIEhhYml0IERhdGEiLGloPTMsZTE9YENhY2hlIGZvcm1hdDogJHtpaH1gLFlJPSJUaGlzIGFyY2hpdmVkIG5vdGUgaXMgbWFpbnRhaW5lZCBieSB0aGUgZGFzaGJvYXJkIHBsdWdpbidzIEVuZXJneSBQZXIgSGFiaXQgd2lkZ2V0LiBFYWNoIG1vbnRoIGJlbG93IGxpc3RzIGV2ZXJ5IGNvbXBsZXRlZCB0YXNrIG9jY3VycmVuY2UsIHdpdGggaXRzIGNvbXBsZXRpb24gY291bnQgYW5kIHRoZSBtb29kIHJhdGluZ3MgcmVjb3JkZWQgb24gdGhlIGRheXMgaXQgd2FzIChhbmQgd2Fzbid0KSBjb21wbGV0ZWQuIFBhc3QgbW9udGhzIGFyZSBjYWNoZWQgaGVyZSBzbyB0aGUgd2lkZ2V0IG5lZWQgbm90IHJlLXJlYWQgYSBmdWxsIHllYXIgb2YgY29tcGxldGVkIHRhc2tzIG9uIGV2ZXJ5IGxvYWQuIjtmdW5jdGlvbiBReChlKXtpZighZSlyZXR1cm5bXTtsZXQgdD1lLnJlcGxhY2UoL15ccypcWz8vLCIiKS5yZXBsYWNlKC9cXT9ccyokLywiIikudHJpbSgpO3JldHVybiB0P3Quc3BsaXQoIiwiKS5tYXAobj0+TnVtYmVyKG4udHJpbSgpKSkuZmlsdGVyKG49Pk51bWJlci5pc0Zpbml0ZShuKSk6W119ZnVuY3Rpb24gWngoZSl7cmV0dXJuYFskeyhlfHxbXSkuam9pbigiLCAiKX1dYH1mdW5jdGlvbiBxSShlKXtyZXR1cm4gU3RyaW5nKGV8fCIiKS5yZXBsYWNlKC9ccj9cbi9nLCIgIikucmVwbGFjZSgvXHwvZywiXFx8IikudHJpbSgpfWZ1bmN0aW9uIHRsKGUpe2xldCB0PWB8IFRhc2sgfCBDb21wbGV0aW9ucyB8IFdlZWtzIHN0cmVhayB8IE1vb2Qgb24gZG9uZSBkYXlzIHwgTW9vZCBvbiBvZmYgZGF5cyB8IExhc3QgY29tcGxldGVkIHwKfCAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfCAtLS0gfGAsbj0oZXx8W10pLm1hcChvPT5gfCAke3FJKG8ubGFiZWwpfSB8ICR7by5jb3VudH0gfCAke28ud2Vla1N0cmVha3x8MH0gfCAke1p4KG8uZG9uZU1vb2RzKX0gfCAke1p4KG8ub2ZmTW9vZHMpfSB8ICR7by5tb3N0UmVjZW50RGF5S2V5fHwiIn0gfGApLmpvaW4oYApgKTtyZXR1cm4gbj9gJHt0fQoke259YDp0fWZ1bmN0aW9uICRJKGUpe2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlLnNwbGl0KGAKYCkpe2xldCBvPW4udHJpbSgpO2lmKCFvLnN0YXJ0c1dpdGgoInwiKSljb250aW51ZTtsZXQgcj1vLnJlcGxhY2UoL15cfC8sIiIpLnJlcGxhY2UoL1x8JC8sIiIpLnNwbGl0KG5ldyBSZWdFeHAoIig/PCFcXFxcKVxcfCIpKS5tYXAodT0+dS50cmltKCkucmVwbGFjZSgvXFxcfC9nLCJ8IikpO2lmKHIubGVuZ3RoPDV8fC9eLSskLy50ZXN0KHJbMF0ucmVwbGFjZSgvXHMvZywiIikpfHxyWzFdLnRvTG93ZXJDYXNlKCk9PT0iY29tcGxldGlvbnMiKWNvbnRpbnVlO2xldCBhPXJbMF0saT1wYXJzZUludChyWzFdLDEwKTtpZighYXx8IU51bWJlci5pc0Zpbml0ZShpKSljb250aW51ZTtsZXQgcz1wYXJzZUludChyWzJdLDEwKXx8MCxsPVF4KHJbM10pLGQ9UXgocls0XSksYz0vXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChyWzVdfHwiIik/cls1XTpudWxsO3QucHVzaCh7bGFiZWw6YSxrZXk6TGMoYSksY291bnQ6aSx3ZWVrU3RyZWFrOnMsZG9uZU1vb2RzOmwsbW9zdFJlY2VudERheUtleTpjLG9mZk1vb2RzOmR9KX1yZXR1cm4gdH1mdW5jdGlvbiBYSShlKXtsZXQgdD1uZXcgTWFwO2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIHQ7bGV0IG49ZS5yZXBsYWNlKC9cclxuL2csYApgKSxvPS9eIyNccysoLis/KVxzKiQvZ20scj1bLi4ubi5tYXRjaEFsbChvKV07Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2xldCBpPXF4KHJbYV1bMV0pO2lmKCFpKWNvbnRpbnVlO2xldCBzPXJbYV0uaW5kZXgrclthXVswXS5sZW5ndGgsbD1hKzE8ci5sZW5ndGg/clthKzFdLmluZGV4Om4ubGVuZ3RoLGQ9JEkobi5zbGljZShzLGwpKTt0LnNldChpLHttb250aEtleTppLGxhYmVsOnJbYV1bMV0udHJpbSgpLHJvd3M6ZH0pfXJldHVybiB0fWZ1bmN0aW9uIEpJKGUpe2xldCBuPVsuLi5lLmtleXMoKV0uc29ydCgpLnJldmVyc2UoKS5tYXAobz0+e2xldCByPWUuZ2V0KG8pO3JldHVybmAjIyAke19jKG8pfQoKJHt0bChyLnJvd3MpfQpgfSk7cmV0dXJuW2AjICR7ZWx9YCwiIixlMSwiIixZSSwiIiwuLi5uXS5qb2luKGAKYCl9YXN5bmMgZnVuY3Rpb24gdDEoZSl7bGV0IHQ9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTplbCx0YWdzOlt3ZV19KS5jYXRjaCgoKT0+bnVsbCk7aWYoIXQ/LnV1aWQpcmV0dXJue2Zvcm1hdFZlcnNpb246MCxub3RlSGFuZGxlOm51bGwsbW9udGhzQnlLZXk6bmV3IE1hcCxyYXdDb250ZW50OiIifTtsZXQgbj1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnQudXVpZH0pLmNhdGNoKCgpPT4iIil8fCIiLG89bi5tYXRjaCgvXkNhY2hlIGZvcm1hdDpccyooXGQrKVxzKiQvbSk7cmV0dXJue2Zvcm1hdFZlcnNpb246bz9OdW1iZXIob1sxXSk6MCxub3RlSGFuZGxlOnQsbW9udGhzQnlLZXk6WEkobikscmF3Q29udGVudDpufX1hc3luYyBmdW5jdGlvbiBRSShlLHQpe2lmKHQ/LnV1aWQpcmV0dXJuIHQ7bGV0IG49YXdhaXQgZS5jcmVhdGVOb3RlKGVsLFt3ZV0se2FyY2hpdmU6ITB9KSxvPXtuYW1lOmVsLHV1aWQ6dHlwZW9mIG49PSJvYmplY3QiP24udXVpZDpufTtyZXR1cm4gayhgW2VuZXJneS1wZXItaGFiaXQtY2FjaGVdIGNyZWF0ZWQgY2FjaGUgbm90ZSAiJHtlbH0iIHV1aWQgJHtvLnV1aWR9YCksb31hc3luYyBmdW5jdGlvbiBuMShlLHtub3RlSGFuZGxlOnQscmF3Q29udGVudDpuLG1vbnRoc0J5S2V5Om8sY3VycmVudE1vbnRoS2V5OnIsY2hhbmdlZE1vbnRoS2V5czphfSl7bGV0IGk9YXdhaXQgUUkoZSx0KSxzPShufHwiIikuaW5jbHVkZXMoZTEpLGw9YS5sZW5ndGg9PT0xJiZhWzBdPT09ciYmcyxkPV9jKHIpLGM9bmV3IFJlZ0V4cChgXiMjXFxzKyR7ZH1cXHMqJGAsIm0iKS50ZXN0KG58fCIiKTtpZih0Py51dWlkJiZsJiZjKXtsZXQgdT10bChvLmdldChyKT8ucm93c3x8W10pO3RyeXtyZXR1cm4gYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoaSxgCiR7dX0KYCx7c2VjdGlvbjp7aGVhZGluZzp7dGV4dDpkfX19KSxrKGBbZW5lcmd5LXBlci1oYWJpdC1jYWNoZV0gcmVmcmVzaGVkIHNlY3Rpb24gIiR7ZH0iIGluIHBsYWNlYCksaX1jYXRjaChwKXtrKCJbZW5lcmd5LXBlci1oYWJpdC1jYWNoZV0gc2VjdGlvbiByZXBsYWNlIGZhaWxlZCwgcmV3cml0aW5nIHdob2xlIG5vdGU6IixwKX19cmV0dXJuIGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KGksSkkobykpLmNhdGNoKHU9PmsoIltlbmVyZ3ktcGVyLWhhYml0LWNhY2hlXSBmYWlsZWQgdG8gd3JpdGUgY2FjaGUgbm90ZToiLHUpKSxrKGBbZW5lcmd5LXBlci1oYWJpdC1jYWNoZV0gd3JvdGUgJHtvLnNpemV9IG1vbnRoIHNlY3Rpb24ocykgdG8gY2FjaGUgbm90ZWApLGl9dmFyIFpJPTI4LHZpPSJlbmVyZ3ktcGVyLWhhYml0IjtmdW5jdGlvbiBlUihlLHQsbixvLHIpe2xldCBhPVtdO2ZvcihsZXQgaT1yLmxlbmd0aC0xO2k+PTA7aS0tKXtsZXQgcz1yW2ldO2lmKG58fHM9PT10fHxzPj1vKXthLnB1c2gocyk7Y29udGludWV9aWYoZS5oYXMocykpYnJlYWs7YS5wdXNoKHMpfXJldHVybiBhLnNvcnQoKX1mdW5jdGlvbiB0UihlLHQpe2xldCBuPW51bGw7Zm9yKGxldFtyLGFdb2YgZS5lbnRyaWVzKCkpe2lmKCFhLnJvd3N8fGEucm93cy5sZW5ndGg9PT0wKWNvbnRpbnVlO2xldCBpPXJoKHIpOyhuPT1udWxsfHxpPG4pJiYobj1pKX1pZihuPT1udWxsKXJldHVybiBnaTtsZXQgbz1NYXRoLmZsb29yKCh0LW4pLzg2NDAwKSsxO3JldHVybiBNYXRoLm1heCgxLE1hdGgubWluKGdpLG8pKX1mdW5jdGlvbiBuUihlKXtsZXRbdCxuXT1TdHJpbmcoZSkuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKTtyZXR1cm4geWkobmV3IERhdGUodCwobnx8MSktMiwxKSl9ZnVuY3Rpb24gb1IoZSx0KXtsZXQgbj1uZXcgTWFwLG89ZS5nZXQoblIodCkpO2ZvcihsZXQgciBvZiBvPy5yb3dzfHxbXSluLnNldChyLmtleSxyLndlZWtTdHJlYWt8fDApO3JldHVybiBufWZ1bmN0aW9uIHJSKGUpe2xldCB0PW5ldyBNYXA7Zm9yKGxldCBuIG9mIGV8fFtdKXtpZighbnx8bi5jb21wbGV0ZWRBdD09bnVsbHx8IW4uY29udGVudCljb250aW51ZTtsZXQgbz1vaChuLmNvbnRlbnQpO2lmKCFvKWNvbnRpbnVlO2xldCByPXQuZ2V0KG8pOyghcnx8bi5jb21wbGV0ZWRBdD5yLmNvbXBsZXRlZEF0KSYmdC5zZXQobyx7bm90ZVVVSUQ6bi5ub3RlVVVJRHx8bnVsbCx0YXNrVVVJRDpuLnV1aWR8fG51bGwsZnVsbFRleHQ6bi5jb250ZW50LGNvbXBsZXRlZEF0Om4uY29tcGxldGVkQXQsdGFzazpufSl9cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gbzEoZSx7dG9kYXk6dD1uZXcgRGF0ZX09e30pe2xldCBuPXBlcmZvcm1hbmNlLm5vdygpLG89TWF0aC5mbG9vcih0LmdldFRpbWUoKS8xZTMpLHI9eWkodCksYT0keCh0LGVoKSxpPW5ldyBTZXQoYSkscz1hd2FpdCB0MShlKTtrKGBbJHt2aX1dIGNhY2hlIG5vdGUgJHtzLm5vdGVIYW5kbGU/ImZvdW5kIjoiYWJzZW50In0gd2l0aCAke3MubW9udGhzQnlLZXkuc2l6ZX0gY2FjaGVkIG1vbnRoKHMpYCk7bGV0IGw9bmV3IERhdGUodCk7bC5zZXREYXRlKGwuZ2V0RGF0ZSgpLShaSS0xKSk7bGV0IGQ9eWkobCksYz0hIXMubm90ZUhhbmRsZSYmcy5mb3JtYXRWZXJzaW9uIT09aWgsdT1lUihzLm1vbnRoc0J5S2V5LHIsYyxkLGEpLHA9cmgodVswXXx8ciksZj1wZXJmb3JtYW5jZS5ub3coKTtrKGBbJHt2aX1dIGZldGNoaW5nIGNvbXBsZXRlZCB0YXNrcyBmcm9tICR7bmV3IERhdGUocCoxZTMpLnRvSVNPU3RyaW5nKCl9ICgke3UubGVuZ3RofSBtb250aChzKSB0byByZWNvbXB1dGUpYCk7bGV0IG09YXdhaXQgZS5nZXRDb21wbGV0ZWRUYXNrcyhwLG8pLnRoZW4oRT0+QXJyYXkuaXNBcnJheShFKT9FOltdKTtrKGBbJHt2aX1dIGNvbXBsZXRlZCB0YXNrczogJHttLmxlbmd0aH0gaW4gJHsocGVyZm9ybWFuY2Uubm93KCktZikudG9GaXhlZCgxKX1tc2ApO2xldCBnPXBlcmZvcm1hbmNlLm5vdygpLHc9YXdhaXQgZS5nZXRNb29kUmF0aW5ncyhwKS50aGVuKEU9PkFycmF5LmlzQXJyYXkoRSk/RTpbXSk7ayhgWyR7dml9XSBtb29kIHJhdGluZ3M6ICR7dy5sZW5ndGh9IGluICR7KHBlcmZvcm1hbmNlLm5vdygpLWcpLnRvRml4ZWQoMSl9bXNgKTtsZXQgdj1vUihzLm1vbnRoc0J5S2V5LHVbMF18fHIpLHk9WHgoe2NvbXBsZXRlZFRhc2tzOm0sbW9vZFJhdGluZ3M6dyxtb250aEtleXM6dSx0b2RheTp0LHByaW9yU3RyZWFrQnlLZXk6dn0pLGI9bmV3IE1hcDtmb3IobGV0W0UsVF1vZiBzLm1vbnRoc0J5S2V5LmVudHJpZXMoKSlpLmhhcyhFKSYmYi5zZXQoRSxUKTtsZXQgaD1bXTtmb3IobGV0W0UsVF1vZiB5LmVudHJpZXMoKSl7bGV0IEE9Yi5nZXQoRSk7KCFBfHx0bChBLnJvd3MpIT09dGwoVC5yb3dzKSkmJmgucHVzaChFKSxiLnNldChFLFQpfShoLmxlbmd0aD4wfHxjfHwhcy5ub3RlSGFuZGxlKSYmYXdhaXQgbjEoZSx7bm90ZUhhbmRsZTpzLm5vdGVIYW5kbGUscmF3Q29udGVudDpzLnJhd0NvbnRlbnQsbW9udGhzQnlLZXk6YixjdXJyZW50TW9udGhLZXk6cixjaGFuZ2VkTW9udGhLZXlzOmh9KTtsZXQgUz1KeChiLHtlbmZvcmNlQWN0aXZpdHlFbGlnaWJpbGl0eTohMCx0b2RheTp0fSkseD1yUihtKTtmb3IobGV0IEUgb2YgUyl7bGV0IFQ9eC5nZXQoRS5rZXkpO1QmJihFLm5vdGVVVUlEPVQubm90ZVVVSUQsRS50YXNrVVVJRD1ULnRhc2tVVUlELEUuZnVsbFRleHQ9VC5mdWxsVGV4dCl9ayhgWyR7dml9XSBsb2FkZWQgJHtTLmxlbmd0aH0gaGFiaXQocykgZnJvbSAke2Iuc2l6ZX0gbW9udGgocykgaW4gJHsocGVyZm9ybWFuY2Uubm93KCktbikudG9GaXhlZCgxKX1tcyAoZmV0Y2hlZCAke3UubGVuZ3RofSBtb250aChzKSk6YCk7Zm9yKGxldCBFIG9mIFMpe2xldCBUPXguZ2V0KEUua2V5KT8udGFza3x8bnVsbDtrKGBbJHt2aX1dICAgaGFiaXQga2V5PSIke0Uua2V5fSIgbGFiZWw9IiR7RS5sYWJlbH0iIGNvbXBsZXRpb25zPSR7RS5jb21wbGV0aW9uc30gd2Vla1N0cmVhaz0ke0Uud2Vla1N0cmVha30gZGVsdGE9JHtFLmRlbHRhLnRvRml4ZWQoMil9IG1vc3QtcmVjZW50IHRhc2s6YCxUKX1yZXR1cm57aGFiaXRzOlMsd2luZG93RGF5czp0UihiLG8pLGNhY2hlZDpoLmxlbmd0aD09PTAmJiEhcy5ub3RlSGFuZGxlLG1vbnRoQ291bnQ6Yi5zaXplfX12YXIgVWU9TChYKCkpLG5sPSJlbmVyZ3ktcGVyLWhhYml0IixhUj04LGlSPTMzMCxzUj0iXHV7MUY1MDF9IixsUj1be3BhdHRlcm46L2V4ZXJjaXNlfHdvcmtvdXR8Z3ltLyxpY29uOiJcdXsxRjRBQX0ifSx7cGF0dGVybjovYmlrZXxjeWNsaW5nfGN5Y2xlLyxpY29uOiJcdXsxRjZCNH0ifSx7cGF0dGVybjovbGlmdC8saWNvbjoiXHV7MUYzQ0J9XHVGRTBGXHUyMDBEXHUyNjQwXHVGRTBGIn0se3BhdHRlcm46L2pvZ3xydW4vLGljb246Ilx1ezFGM0MzfSJ9LHtwYXR0ZXJuOi9oaWtlfHRyYWlsLyxpY29uOiJcdXsxRjk3RX0ifSx7cGF0dGVybjovd2Fsa3xvdXRzaWRlfG91dGRvb3J8c3RlcHMvLGljb246Ilx1MjYwMFx1RkUwRiJ9LHtwYXR0ZXJuOi9pbmJveHxlbWFpbC8saWNvbjoiXHV7MUY0RTV9In0se3BhdHRlcm46L3JlYWR8Ym9va3xzdHVkeXxob21ld29yay8saWNvbjoiXHV7MUY0RDZ9In0se3BhdHRlcm46L2RlZXAgd29ya3xmb2N1c3xyZXZpZXd8cmVmbGVjdC8saWNvbjoiXHV7MUY5RDB9In0se3BhdHRlcm46L3NjcmVlbnxwaG9uZXxzb2NpYWx8ZGlnaXRhbC8saWNvbjoiXHV7MUYzMTl9In0se3BhdHRlcm46L2xhdGUuP25pZ2h0fG5pZ2h0fG1pZG5pZ2h0LyxpY29uOiJcdXsxRjMxQ30ifSx7cGF0dGVybjovbWVkaXRhdHxicmVhdGh8bWluZGZ1bHx5b2dhLyxpY29uOiJcdXsxRjlEOH0ifSx7cGF0dGVybjovc2xlZXB8YmVkfHJlc3QvLGljb246Ilx1ezFGNjM0fSJ9LHtwYXR0ZXJuOi93YXRlcnxoeWRyYXR8ZHJpbmsvLGljb246Ilx1ezFGNEE3fSJ9LHtwYXR0ZXJuOi9wbGFufHJldmlld3xqb3VybmFsLyxpY29uOiJcdXsxRjRERH0ifSx7cGF0dGVybjovY29udGFjdHxlbWFpbHxqb3VybmFsfG1lc3NhZ2V8dGV4dHx3cml0ZXx3cml0aW5nLyxpY29uOiJcdTI3MERcdUZFMEYifSx7cGF0dGVybjovb3V0cmVhY2h8YnJvYWRjYXN0fGFkdmVydGlzZXxkaXN0cmlidXRpb24vLGljb246Ilx1ezFGNEUyfSJ9LHtwYXR0ZXJuOi9ncmF0aXR1ZGV8dGhhbmsvLGljb246Ilx1ezFGNjRGfSJ9LHtwYXR0ZXJuOi9jbGVhbnx0aWR5fG9yZ2FuaXplLyxpY29uOiJcdXsxRjlGOX0ifSx7cGF0dGVybjovY29va3xtZWFsfHJlY2lwZS8saWNvbjoiXHV7MUYzNzN9In0se3BhdHRlcm46L211c2ljfHNvbmd8c2luZy8saWNvbjoiXHV7MUYzQjV9In0se3BhdHRlcm46L2FydHxkcmF3fHBhaW50LyxpY29uOiJcdXsxRjNBOH0ifSx7cGF0dGVybjovZ2FtZXxwbGF5fGZ1bi8saWNvbjoiXHV7MUYzQUV9In0se3BhdHRlcm46L2ZhbWlseXxmcmllbmR8c29jaWFsLyxpY29uOiJcdXsxRjQ2Rn1cdTIwMERcdTI2NDBcdUZFMEYifSx7cGF0dGVybjovdm9sdW50ZWVyfGhlbHB8Y2hhcml0eS8saWNvbjoiXHUyNzY0XHVGRTBGIn0se3BhdHRlcm46L2ZpbmFuY2V8YnVkZ2V0fG1vbmV5LyxpY29uOiJcdXsxRjRCMH0ifSx7cGF0dGVybjovbGFuZ3VhZ2V8bGVhcm58c3R1ZHkvLGljb246Ilx1ezFGMjM2fSJ9LHtwYXR0ZXJuOi90cmF2ZWx8dHJpcHx2YWNhdGlvbi8saWNvbjoiXHUyNzA4XHVGRTBGIn0se3BhdHRlcm46L2dhcmRlbnxwbGFudHxuYXR1cmUvLGljb246Ilx1ezFGMzMxfSJ9LHtwYXR0ZXJuOi9tb3ZpZXxmaWxtfGNpbmVtYS8saWNvbjoiXHV7MUYzQUN9In0se3BhdHRlcm46L2NsZWFuaW5nfGxhdW5kcnl8aG91c2V3b3JrLyxpY29uOiJcdXsxRjlGQX0ifSx7cGF0dGVybjovc3dpbXxwb29sfHdhdGVyLyxpY29uOiJcdXsxRjNDQX0ifSx7cGF0dGVybjovbmV0d29ya2luZ3xiaXpkZXYvLGljb246Ilx1ezFGOTFEfSJ9XTtmdW5jdGlvbiBkUihlKXtsZXQgdD10aChlLmxhYmVsKXx8dGgoZS5mdWxsVGV4dCk7aWYodClyZXR1cm4gdDtsZXQgbj1uaChlLmxhYmVsKS50b0xvd2VyQ2FzZSgpO2ZvcihsZXR7cGF0dGVybjpvLGljb246cn1vZiBsUilpZihvLnRlc3QobikpcmV0dXJuIHI7cmV0dXJuIHNSfWZ1bmN0aW9uIGNSKGUpe2xldCB0PU51bWJlcihlKXx8MDtpZih0PD0wKXJldHVybiJubyBhY3RpdmUgc3RyZWFrIjtsZXQgbj0ic3RyZWFrLXdlZWsiO3JldHVybiB0Pj0yJiYobj0ic3RyZWFrLWFsaXZlIiksdD49NCYmKG49InN0cmVhay1tb250aCIpLHQ+PTEyJiYobj0ic3RyZWFrLXF1YXJ0ZXIiKSx0Pj0yNiYmKG49InN0cmVhay1oYWxmLXllYXIiKSwoMCxVZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOmBzdHJlYWstbGFiZWwgJHtufWAsY2hpbGRyZW46W3QsIi13ZWVrIHN0cmVhayBhY3RpdmUiXX0pfWZ1bmN0aW9uIHIxKGUsdCxuKXtsZXQgbz1uPT09MT8iZGF5IjoiZGF5cyI7cmV0dXJuYCR7ZX06ICR7YWgodCl9IGF2ZyBvdmVyICR7bn0gcmF0ZWQgJHtvfWB9ZnVuY3Rpb24gdVIoZSl7cmV0dXJuYCR7cjEoIldoZW4gY29tcGxldGVkIixlLmF2Z01vb2RPbkRvbmUsZS5kb25lV2l0aE1vb2QpfQoke3IxKCJXaGVuIG5vdCBjb21wbGV0ZWQiLGUuYXZnTW9vZE9uT2ZmLGUub2ZmV2l0aE1vb2QpfWB9ZnVuY3Rpb24gcFIoe2hhYml0OmUsd2luZG93RGF5czp0LG1heEFic0RlbHRhOm4sb25PcGVuOm99KXtsZXQgcj1lLmRlbHRhPj0wLGE9bj4wP01hdGgubWluKDEwMCxNYXRoLmFicyhlLmRlbHRhKS9uKjEwMCk6MCxpPSEhZS5ub3RlVVVJRCxzPWUuZnVsbFRleHR8fGUubGFiZWwsbD1gaGFiaXQtcm93LWxhYmVsJHtpPyIgaGFiaXQtcm93LWxhYmVsLS1saW5rIjoiIn1gLGQ9dVIoZSk7cmV0dXJuKDAsVWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiaGFiaXQtcm93IixjaGlsZHJlbjpbKDAsVWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiaGFiaXQtcm93LWxlYWQiLGNoaWxkcmVuOlsoMCxVZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctaWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46ZFIoZSl9KSwoMCxVZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctdGV4dCIsY2hpbGRyZW46WygwLFVlLmpzeCkoImRpdiIse2NsYXNzTmFtZTpsLHRpdGxlOnMscm9sZTppPyJsaW5rIjp2b2lkIDAsdGFiSW5kZXg6aT8wOnZvaWQgMCxvbkNsaWNrOmk/Yz0+e2MudGFyZ2V0LmNsb3Nlc3QoImEiKXx8byhlKX06dm9pZCAwLG9uS2V5RG93bjppP2M9PnsoYy5rZXk9PT0iRW50ZXIifHxjLmtleT09PSIgIikmJihjLnByZXZlbnREZWZhdWx0KCksbyhlKSl9OnZvaWQgMCxkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOmNvKG5oKGUubGFiZWwpKX19KSwoMCxVZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctbWV0YSIsY2hpbGRyZW46WyJDb21wbGV0ZWQgIixlLmRheXNEb25lLCIgb2YgIix0LCIgZGF5cyJdfSksKDAsVWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctbWV0YSIsY2hpbGRyZW46Y1IoZS53ZWVrU3RyZWFrKX0pXX0pXX0pLCgwLFVlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImhhYml0LXJvdy10cmFjayIsY2hpbGRyZW46WygwLFVlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiaGFiaXQtcm93LWF4aXMifSksKDAsVWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctYmFyLWhhbGYgaGFiaXQtcm93LWJhci1oYWxmLS1uZWdhdGl2ZSIsdGl0bGU6ZCxjaGlsZHJlbjohciYmKDAsVWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctYmFyIGhhYml0LXJvdy1iYXItLW5lZ2F0aXZlIixzdHlsZTp7d2lkdGg6YCR7YX0lYH19KX0pLCgwLFVlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiaGFiaXQtcm93LWJhci1oYWxmIGhhYml0LXJvdy1iYXItaGFsZi0tcG9zaXRpdmUiLHRpdGxlOmQsY2hpbGRyZW46ciYmKDAsVWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1yb3ctYmFyIGhhYml0LXJvdy1iYXItLXBvc2l0aXZlIixzdHlsZTp7d2lkdGg6YCR7YX0lYH19KX0pXX0pLCgwLFVlLmpzeCkoImRpdiIse2NsYXNzTmFtZTpgaGFiaXQtcm93LXZhbHVlICR7cj8iaGFiaXQtcm93LXZhbHVlLS1wb3NpdGl2ZSI6ImhhYml0LXJvdy12YWx1ZS0tbmVnYXRpdmUifWAsY2hpbGRyZW46YWgoZS5kZWx0YSl9KV19KX1mdW5jdGlvbiBzaCh7YXBwOmV9KXtsZXRbdCxuXT0oMCx5bi51c2VTdGF0ZSkobnVsbCksW28scl09KDAseW4udXNlU3RhdGUpKCExKSxbYSxpXT0oMCx5bi51c2VTdGF0ZSkoITApLHM9KDAseW4udXNlUmVmKShudWxsKTsoMCx5bi51c2VFZmZlY3QpKCgpPT57aWYoIWUpcmV0dXJuO2xldCBwPSExO3JldHVybiByKCExKSxpKCEwKSxvMShlKS50aGVuKGY9PntwfHwobihmKSxpKCExKSl9KS5jYXRjaChmPT57ayhgWyR7bmx9XSBmYWlsZWQgdG8gbG9hZCBoYWJpdCBkYXRhYCxmKSxwfHwobih7aGFiaXRzOltdLHdpbmRvd0RheXM6Z2l9KSxyKCEwKSxpKCExKSl9KSwoKT0+e3A9ITB9fSxbZV0pO2xldCBsPSgwLHluLnVzZU1lbW8pKCgpPT4odD8uaGFiaXRzfHxbXSkuc2xpY2UoMCxhUiksW3RdKTt1dChubCwhYSYmISF0LG8pO2xldCBkPSgwLHluLnVzZU1lbW8pKCgpPT5sLnJlZHVjZSgocCxmKT0+TWF0aC5tYXgocCxNYXRoLmFicyhmLmRlbHRhKSksMCksW2xdKTsoMCx5bi51c2VFZmZlY3QpKCgpPT57V24ocy5jdXJyZW50KX0sW2xdKTtsZXQgYz0oMCx5bi51c2VDYWxsYmFjaykocD0+eyFlfHwhcD8ubm90ZVVVSUR8fGUubmF2aWdhdGUoRGMocC5ub3RlVVVJRCkpfSxbZV0pLHU9dD8ud2luZG93RGF5c3x8Z2k7cmV0dXJuIHU9dT49aVI/MzY1OnUsYT8oMCxVZS5qc3gpKHJlLHt3aWRnZXRJZDpubCxjaGlsZHJlbjooMCxVZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImhhYml0LWVtcHR5IixjaGlsZHJlbjoiQW5hbHl6aW5nIHlvdXIgaGFiaXRzXHUyMDI2In0pfSk6bC5sZW5ndGg/KDAsVWUuanN4cykocmUse3dpZGdldElkOm5sLGNoaWxkcmVuOlsoMCxVZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImhhYml0LWhlYWRlciIsY2hpbGRyZW46KDAsVWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1leWVicm93IixjaGlsZHJlbjpgJHt1fSBEQVlTIEFOQUxZWkVEYH0pfSksKDAsVWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiaGFiaXQtY2hhcnQiLGNoaWxkcmVuOlsoMCxVZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImhhYml0LXplcm8tbGluZSIsY2hpbGRyZW46KDAsVWUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiaGFiaXQtemVyby1sYWJlbCIsY2hpbGRyZW46IjAifSl9KSwoMCxVZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImhhYml0LXJvd3MiLHJlZjpzLGNoaWxkcmVuOmwubWFwKHA9PigwLFVlLmpzeCkocFIse2hhYml0OnAsd2luZG93RGF5czp1LG1heEFic0RlbHRhOmQsb25PcGVuOmN9LHAua2V5KSl9KV19KV19KTooMCxVZS5qc3gpKHJlLHt3aWRnZXRJZDpubCxjaGlsZHJlbjooMCxVZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJoYWJpdC1lbXB0eSIsY2hpbGRyZW46WygwLFVlLmpzeCkoInAiLHtjaGlsZHJlbjoiTm8gcmVjdXJyaW5nLXRhc2sgaGFiaXRzIHdpdGggZW5vdWdoIG1vb2QgaGlzdG9yeSB0byBjb3JyZWxhdGUgeWV0LiJ9KSwoMCxVZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJoYWJpdC1lbXB0eS1oaW50IixjaGlsZHJlbjoiU2V0IHRhc2tzIHRvIHJlcGVhdCBhbmQgbG9nIHlvdXIgbW9vZCBvdmVyIHRpbWUgdG8gc2VlIHdoaWNoIGhhYml0cyBsaWZ0IHlvdXIgZGF5cy4ifSldfSl9KX12YXIgcHQ9TChtZSgpKTt2YXIgZDE9MixmUj02MDAsYzE9NCxtUj0uMixhMT0uOSxpMT05NixoUj0iZWFzZS1pbi1vdXQiLGdSPTI1MCx1MT01MDAscDE9e2JsdXI6IjBweCIsb3BhY2l0eToxLHNjYWxlWDoxLHNjYWxlWToxLHg6IjBweCIseToiMHB4In07ZnVuY3Rpb24gczEoZSx0KXtyZXR1cm4gTWF0aC5hYnMoZSk8MT8wOnQvTWF0aC5hYnMoZSl9ZnVuY3Rpb24geVIoZSx0KXtpZih0eXBlb2YgdD8uYW5pbWF0ZSE9ImZ1bmN0aW9uIilyZXR1cm4gbnVsbDtsZXQgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89ZS5sZWZ0LW4ubGVmdCxyPWUudG9wLW4udG9wLGE9ZS53aWR0aC8obi53aWR0aHx8MSksaT1lLmhlaWdodC8obi5oZWlnaHR8fDEpLHM9YHRyYW5zbGF0ZSgke299cHgsICR7cn1weCkgc2NhbGUoJHthfSwgJHtpfSlgO3Quc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJ0b3AgbGVmdCIsdC5zdHlsZS50cmFuc2Zvcm09cztsZXQgbD10LmFuaW1hdGUoW3t0cmFuc2Zvcm06c30se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwgMHB4KSBzY2FsZSgxLCAxKSJ9XSx7ZHVyYXRpb246dTEsZWFzaW5nOmhSfSk7cmV0dXJuIGwuZmluaXNoZWQuY2F0Y2goKCk9Pnt9KS5maW5hbGx5KCgpPT57dC5pc0Nvbm5lY3RlZCYmKHQuZ2V0QW5pbWF0aW9ucygpLnNvbWUoZD0+ZCE9PWwpfHwodC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNmb3JtIiksdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNmb3JtLW9yaWdpbiIpKSl9KSxsfWZ1bmN0aW9uIHZSKGUsdCxuKXtsZXQgbz1tMShuKTtyZXR1cm57aGVpZ2h0Om8/ZlI6dC5oZWlnaHQsbGVmdDplLmxlZnQsdG9wOndpbmRvdy5pbm5lckhlaWdodCptUix3aWR0aDpvP2Uud2lkdGg6dC53aWR0aH19ZnVuY3Rpb24gZjEoZSx0LG4pe2xldCBvPXQ/eyItLWZvY3VzLWJsdXIiOnQuYmx1ciwiLS1mb2N1cy1vcGFjaXR5IjpgJHt0Lm9wYWNpdHl9YCwiLS1mb2N1cy1zY2FsZS14IjpgJHt0LnNjYWxlWH1gLCItLWZvY3VzLXNjYWxlLXkiOmAke3Quc2NhbGVZfWAsIi0tZm9jdXMteCI6dC54LCItLWZvY3VzLXkiOnQueX06dm9pZCAwO3JldHVybntjbGFzc05hbWVzOltlPyJncmlkLWNlbGwtLWZvY3VzLW1vZGUiOiIiLGUmJmU9PT1uPyJncmlkLWNlbGwtLWZvY3VzZWQiOiIiLGUmJmUhPT1uPyJncmlkLWNlbGwtLWZvY3VzLWhpZGRlbiI6IiJdLmZpbHRlcihCb29sZWFuKSxzdHlsZTpvfX1mdW5jdGlvbiBiUihlLHQpe2xldCBuPWUubGVmdCtlLndpZHRoLzIsbz1lLnRvcCtlLmhlaWdodC8yLHI9bi10LngsYT1vLXQueTtNYXRoLmFicyhyKTwxJiZNYXRoLmFicyhhKTwxJiYoYT0tMSk7bGV0IGk9dC54K2Uud2lkdGgvMitpMSxzPXQueStlLmhlaWdodC8yK2kxLGw9W3MxKHIsaSksczEoYSxzKV0uZmlsdGVyKGM9PmM+MSksZD1NYXRoLm1heChsLmxlbmd0aD9NYXRoLm1pbiguLi5sKToxLDEuMzUpO3JldHVybntibHVyOiIycHgiLG9wYWNpdHk6MCxzY2FsZVg6YTEsc2NhbGVZOmExLHg6YCR7ciooZC0xKX1weGAseTpgJHthKihkLTEpfXB4YH19ZnVuY3Rpb24gVWMoZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudD4idSI/bnVsbDpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZD0iJHtlfSJdIC5ncmlkLWNlbGwtc3VyZmFjZWApfWZ1bmN0aW9uIG0xKGUpe2xldCB0PU10LmZpbmQocj0+ci53aWRnZXRJZD09PWUpO2lmKCF0KXJldHVybiExO2xldCBuPXQubWF4SG9yaXpvbnRhbFRpbGVzPT1udWxsfHx0Lm1heEhvcml6b250YWxUaWxlcz49YzEsbz10Lm1heFZlcnRpY2FsVGlsZXM9PW51bGx8fHQubWF4VmVydGljYWxUaWxlcz49ZDE7cmV0dXJuIG4mJm99ZnVuY3Rpb24gaDEoZSx0KXtyZXR1cm4hZT8ud2lkZ2V0SWR8fGUud2lkZ2V0SWQhPT10fHwhbTEodCk/ZTp7Li4uZSxncmlkSGVpZ2h0U2l6ZTpkMSxncmlkV2lkdGhTaXplOmMxfX1mdW5jdGlvbiB3UihlKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gbnVsbDtsZXQgdD1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpKTtpZighdC5sZW5ndGgpcmV0dXJuIG51bGw7bGV0IG49e3g6d2luZG93LmlubmVyV2lkdGgvMix5OndpbmRvdy5pbm5lckhlaWdodC8yfSxvPXt9O3JldHVybiB0LmZvckVhY2gocj0+e2xldCBhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO2lmKCFhKXJldHVybjtsZXQgaT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO29bYV09YT09PWU/cDE6YlIoaSxuKX0pLG99ZnVuY3Rpb24gbDEoZSl7cmV0dXJue2hlaWdodDpgJHtlLmhlaWdodH1weGAsbGVmdDpgJHtlLmxlZnR9cHhgLHRvcDpgJHtlLnRvcH1weGAsd2lkdGg6YCR7ZS53aWR0aH1weGB9fWZ1bmN0aW9uIGcxKGUsdCl7bGV0W24sb109KDAscHQudXNlU3RhdGUpKG51bGwpLFtyLGFdPSgwLHB0LnVzZVN0YXRlKShudWxsKSxbaSxzXT0oMCxwdC51c2VTdGF0ZSkobnVsbCksW2wsZF09KDAscHQudXNlU3RhdGUpKHt9KSxjPSgwLHB0LnVzZVJlZikobnVsbCksdT0oMCxwdC51c2VSZWYpKG51bGwpLHA9KDAscHQudXNlUmVmKShudWxsKSxmPSgwLHB0LnVzZVJlZikobnVsbCksbT0oMCxwdC51c2VSZWYpKG51bGwpLGc9KDAscHQudXNlQ2FsbGJhY2spKCgpPT57d2luZG93LmNsZWFyVGltZW91dCh1LmN1cnJlbnQpLG0uY3VycmVudD8uY2FuY2VsKCksbS5jdXJyZW50PW51bGx9LFtdKSx3PSgwLHB0LnVzZUNhbGxiYWNrKSgoKT0+e2coKSx3aW5kb3cuY2xlYXJUaW1lb3V0KGMuY3VycmVudCkscC5jdXJyZW50PW51bGwsZi5jdXJyZW50PW51bGwsbyhudWxsKSxhKG51bGwpLHMobnVsbCksZCh7fSl9LFtnXSksdj0oMCxwdC51c2VDYWxsYmFjaykoKCk9PntnKCk7bGV0IHk9cC5jdXJyZW50LGI9VWMocik7aWYoIXJ8fCFpfHwheXx8IWIpe3coKTtyZXR1cm59bGV0IGg9T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5rZXlzKGwpLm1hcCh4PT5beCxwMV0pKSxTPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZChoKSxmLmN1cnJlbnQ9e2Zyb21SZWN0OlMsd2lkZ2V0SWQ6cn0scyhsMSh5KSksYy5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KHcsdTEpfSxbdyxyLGksZyxsXSk7cmV0dXJuKDAscHQudXNlTGF5b3V0RWZmZWN0KSgoKT0+e2xldCB5PWYuY3VycmVudDsheT8uZnJvbVJlY3R8fCFyfHwhaXx8eS53aWRnZXRJZD09PXImJihmLmN1cnJlbnQ9bnVsbCxtLmN1cnJlbnQ/LmNhbmNlbCgpLG0uY3VycmVudD15Uih5LmZyb21SZWN0LFVjKHIpKSl9LFtyLGldKSwoMCxwdC51c2VFZmZlY3QpKCgpPT57bGV0IHk9Yj0+e2lmKHQhPT1FdC5ERUZBVUxUfHxlfHwhVnMoKSlyZXR1cm47bGV0IGg9Yj8uZGV0YWlsPy53aWRnZXRJZDtpZighaClyZXR1cm47aWYoaD09PXIpe3YoKTtyZXR1cm59bGV0IFM9d1IoaCk7IVVjKGgpfHwhU3x8KGQoUyksYShoKSx1LmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9PntsZXQgeD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZGFzaGJvYXJkLWdyaWQiKSxFPVVjKGgpO2lmKCF4fHwhRSlyZXR1cm47bGV0IFQ9RS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtwLmN1cnJlbnQ9VDtsZXQgQT12Uih4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFQsaCk7Zi5jdXJyZW50PXtmcm9tUmVjdDpULHdpZGdldElkOmh9LG8oaCkscyhsMShBKSl9LGdSKSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihnYyx5KSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZ2MseSl9LFt2LGUscix0XSksKDAscHQudXNlRWZmZWN0KSgoKT0+KCk9PntnKCksd2luZG93LmNsZWFyVGltZW91dChjLmN1cnJlbnQpfSxbZ10pLCgwLHB0LnVzZUVmZmVjdCkoKCk9PntyJiYoZXx8dCE9PUV0LkRFRkFVTFR8fCFWcygpKSYmdygpfSxbZSx3LHIsdF0pLCgwLHB0LnVzZUVmZmVjdCkoKCk9PntpZighcilyZXR1cm47bGV0IHk9aD0+e2gua2V5PT09IkVzY2FwZSImJnYoKX0sYj0oKT0+dygpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsYiksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsYil9fSxbdix3LHJdKSx7Y2xlYXJGb2N1c2VkV2lkZ2V0OnYsZXhwYW5kZWRXaWRnZXRJZDpuLGZvY3VzZWRXaWRnZXRJZDpyLGZvY3VzZWRXaWRnZXRTdXJmYWNlU3R5bGU6aSxpc1dpZGdldEZvY3VzTW9kZTohIShyJiZ0PT09RXQuREVGQVVMVCYmIWUpLHdpZGdldEZvY3VzVHJhbnNmb3JtczpsfX12YXIga1I9MCx4Uj0yLGxoPTIsU1I9MSxFUj0zMCxOUj03LFRSPUVSLERSPTkseTE9MjQsQVI9MTAwLHYxPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxiMT02MCxkaD0xZTMsdzE9NjAsQ1I9TlIqeTEqYjEqdzEqZGgsTVI9VFIqeTEqYjEqdzEqZGg7ZnVuY3Rpb24gT1IoZSl7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgZSlmb3IobGV0IG8gb2Ygbi51dWlkcyl0LmFkZChvKTtyZXR1cm4gdH1hc3luYyBmdW5jdGlvbiBJUihlKXtsZXQgdD1SUihuZXcgRGF0ZSk7aygiW0dyYXZleWFyZF0gZmluZE9yQ3JlYXRlR3JhdmV5YXJkTm90ZTogbG9va2luZyBmb3Igbm90ZSBuYW1lZCIsSlNPTi5zdHJpbmdpZnkodCksIndpdGggdGFnIix3ZSk7bGV0IG49YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W3dlXX0pO2lmKGsoIltHcmF2ZXlhcmRdIGZpbmRPckNyZWF0ZUdyYXZleWFyZE5vdGU6IGZpbmROb3RlIHJlc3VsdDoiLG4/YHV1aWQ9JHtuLnV1aWR9YDoibnVsbC91bmRlZmluZWQiKSxuPy51dWlkKXJldHVybiBuO2soIltHcmF2ZXlhcmRdIGZpbmRPckNyZWF0ZUdyYXZleWFyZE5vdGU6IG5vdGUgbm90IGZvdW5kLCBjcmVhdGluZyBuZXcgbm90ZSIpO2xldCBvPWF3YWl0IGUuY3JlYXRlTm90ZSh0LFt3ZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gaygiW0dyYXZleWFyZF0gZmluZE9yQ3JlYXRlR3JhdmV5YXJkTm90ZTogY3JlYXRlZCBub3RlIHdpdGggdXVpZDoiLG8pLGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOm99LGsxKFtdKSkse25hbWU6dCx1dWlkOm99fWZ1bmN0aW9uIGsxKGUpe2xldCB0PWAjIEdyYXZleWFyZCB0YXNrIGNhbmRpZGF0ZXMKCnwgRGF0ZSB8IFRhc2sgVVVJRHMgfCBUYXNrIG5vdGUgbWV0YWRhdGEgfAp8LS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKYCxuPWUubWFwKG89PntsZXQgcj1BcnJheS5pc0FycmF5KG8udGFza0VudHJpZXMpJiZvLnRhc2tFbnRyaWVzLmxlbmd0aD4wP28udGFza0VudHJpZXM6by51dWlkcy5tYXAoaT0+KHtub3RlTmFtZTpudWxsLG5vdGVVVUlEOm51bGwsdXVpZDppfSkpLGE9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHIubWFwKGk9Pih7bm90ZU5hbWU6aS5ub3RlTmFtZXx8bnVsbCxub3RlVVVJRDppLm5vdGVVVUlEfHxudWxsLHV1aWQ6aS51dWlkfSkpKSk7cmV0dXJuYHwgJHtvLmRhdGVLZXl9IHwgJHtvLnV1aWRzLmpvaW4oIiwiKX0gfCAke2F9IHxgfSkuam9pbihgCmApO3JldHVybiB0K24rKG4/YApgOiIiKX1mdW5jdGlvbiBSUihlKXtsZXQgdD1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpO3JldHVybmBUYXNrIGdyYXZleWFyZCBkYXRhOiAke3YxW3QuZ2V0TW9udGgoKV19ICR7dC5nZXRGdWxsWWVhcigpfWB9ZnVuY3Rpb24gUFIoZSl7bGV0IHQ9ZSBpbnN0YW5jZW9mIERhdGU/ZTpuZXcgRGF0ZShlKTtyZXR1cm5gU3VjY2Vzc2Z1bGx5IHJldGlyZWQgdGFza3M6ICR7djFbdC5nZXRNb250aCgpXX0gJHt0LmdldEZ1bGxZZWFyKCl9YH1mdW5jdGlvbiBMUihlKXtsZXQgdD1bXSxuPShlfHwiIikuc3BsaXQoYApgKSxvPTAscj0wLGE9MCxpPTA7Zm9yKGxldCBzIG9mIG4pe2xldCBsPXMudHJpbSgpO2lmKCFsLnN0YXJ0c1dpdGgoInwiKSl7bysrO2NvbnRpbnVlfWxldCBkPWwuc2xpY2UoMSwtMSkuc3BsaXQoInwiKS5tYXAoZj0+Zi50cmltKCkpO2lmKGQubGVuZ3RoPHhSKXthKys7Y29udGludWV9bGV0IGM9ZFtrUl07aWYoYz09PSJEYXRlInx8L14tKyQvLnRlc3QoYykpe3IrKztjb250aW51ZX1sZXQgdT1kW1NSXS5zcGxpdCgiLCIpLm1hcChmPT5mLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLHA9dS5tYXAoZj0+KHtub3RlTmFtZTpudWxsLG5vdGVVVUlEOm51bGwsdXVpZDpmfSkpO2lmKGRbbGhdKXRyeXtsZXQgZj1KU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChkW2xoXSkpO0FycmF5LmlzQXJyYXkoZik/cD1mLmZpbHRlcihtPT5tPy51dWlkKS5tYXAobT0+KHtub3RlTmFtZTptLm5vdGVOYW1lfHxudWxsLG5vdGVVVUlEOm0ubm90ZVVVSUR8fG51bGwsdXVpZDptLnV1aWR9KSk6aygiW0dyYXZleWFyZF0gcm93c0Zyb21HcmF2ZXlhcmRDb250ZW50OiB0YXNrRW50cmllcyBjb2x1bW4gd2FzIG5vdCBhbiBhcnJheSBhZnRlciBwYXJzZSwgdmFsdWU6IixmKX1jYXRjaChmKXtrKCJbR3JhdmV5YXJkXSBmYWlsZWQgdG8gcGFyc2UgY2FjaGVkIHRhc2sgbm90ZSBtZXRhZGF0YToiLGYsIlx1MjAxNCByYXcgY2VsbCB2YWx1ZToiLGRbbGhdPy5zbGljZSgwLDEyMCkpfWVsc2UgayhgW0dyYXZleWFyZF0gcm93c0Zyb21HcmF2ZXlhcmRDb250ZW50OiBubyB0YXNrRW50cmllcyBjb2x1bW4gZm9yIGRhdGVLZXk9JHtKU09OLnN0cmluZ2lmeShjKX0sIGZhbGxpbmcgYmFjayB0byB1dWlkLW9ubHkgZW50cmllc2ApO2MmJnUubGVuZ3RoPjA/dC5wdXNoKHtkYXRlS2V5OmMsdGFza0VudHJpZXM6cCx1dWlkczp1fSk6aSsrfXJldHVybiB0fWFzeW5jIGZ1bmN0aW9uIF9SKGUsdCxuKXtsZXQgbz1hd2FpdCBQcm9taXNlLmFsbFNldHRsZWQobi5tYXAoYT0+ZS5nZXROb3RlVGFza3Moe3V1aWQ6YS51dWlkfSx7aW5jbHVkZURvbmU6ITF9KS50aGVuKGk9Pih7bm90ZUhhbmRsZTphLHRhc2tzOml8fFtdfSkpKSkscj1bXTtmb3IobGV0IGEgb2Ygbyl7aWYoYS5zdGF0dXM9PT0icmVqZWN0ZWQiKXtrKCJbR3JhdmV5YXJkXSBnZXROb3RlVGFza3MgZmFpbGVkOiIsYS5yZWFzb24pO2NvbnRpbnVlfWxldHtub3RlSGFuZGxlOmksdGFza3M6c309YS52YWx1ZSxsPTA7Zm9yKGxldCBkIG9mIHMpIWQ/LnV1aWR8fHQuaGFzKGQudXVpZCl8fGQuY29tcGxldGVkQXR8fGQuZGlzbWlzc2VkQXR8fChyLnB1c2goey4uLmQsbm90ZU5hbWU6ZC5ub3RlTmFtZXx8ZC5ub3RlVGl0bGV8fGQubm90ZT8ubmFtZXx8aS5uYW1lfHxudWxsLG5vdGVVVUlEOmQubm90ZVVVSUR8fGkudXVpZH0pLGwrKyl9cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gVVIoZSx0LG4sbyl7bGV0IHI9bz97dGFza0RvbWFpblVVSUQ6b306e307cj17Li4ucixncm91cDoidGFza0xpc3RzIn07bGV0IGE9W107Zm9yIGF3YWl0KGxldCBkIG9mIGF3YWl0IGUuZmlsdGVyTm90ZXMociwib3BlbmVkIikpYS5wdXNoKGQpO2xldCBpPVsuLi5hXS5yZXZlcnNlKCkuc2xpY2UoMCxBUik7ayhgW0dyYXZleWFyZF0gc2Nhbm5pbmcgJHtpLmxlbmd0aH0gbm90ZXMgZm9yIHRhc2tzYCk7bGV0IHM9YXdhaXQgX1IoZSxuLGkpLGw9eDEodCxzKTtyZXR1cm4gayhgW0dyYXZleWFyZF0gdGFzayBjb3VudHMgXHUyMDE0IHRvdGFsIHNjb3JlZDogJHtzLmxlbmd0aH0sIHNlbGVjdGVkOiAke2wubGVuZ3RofSAobmVlZCAke3R9KWApLGx9ZnVuY3Rpb24gRlIoZSl7bGV0IHQ9TnVtYmVyKGU/LnNjb3JlPz9lPy52aWN0b3J5VmFsdWU/PzApO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDowfWZ1bmN0aW9uIHpSKGUsdCl7bGV0IG49UzEodCksbz1uPT09bnVsbD9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6TWF0aC5hYnMobi1lKS9DUjtyZXR1cm4gRlIodCktTWF0aC5sb2coMStvKX1hc3luYyBmdW5jdGlvbiBXUihlLHQsbil7aWYoaygiW0dyYXZleWFyZF0gaHlkcmF0ZWRUYXNrc0Zyb21VdWlkczogY2FsbGVkIHdpdGggdXVpZENvdW50OiIsbj8ubGVuZ3RoLCJ0YXNrRW50cnlDb3VudDoiLHQ/Lmxlbmd0aCksIW58fG4ubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbz1uZXcgTWFwKCh0fHxbXSkuZmlsdGVyKGQ9PmQ/LnV1aWQpLm1hcChkPT5bZC51dWlkLGRdKSkscj1hd2FpdCBQcm9taXNlLmFsbFNldHRsZWQobi5tYXAoZD0+ZS5nZXRUYXNrKGQpKSksYT0wLGk9MCxzPTAsbD1yLm1hcCgoZCxjKT0+e2xldCB1PW5bY107aWYoZC5zdGF0dXM9PT0icmVqZWN0ZWQifHwhZC52YWx1ZSlyZXR1cm4gYSsrLGsoIltHcmF2ZXlhcmRdIGh5ZHJhdGVkVGFza3NGcm9tVXVpZHM6IHV1aWQgbm90IGZvdW5kOiIsdSksbnVsbDtsZXQgcD1kLnZhbHVlO2lmKHAuY29tcGxldGVkQXR8fHAuZGlzbWlzc2VkQXQpcmV0dXJuIGkrKyxrKCJbR3JhdmV5YXJkXSBoeWRyYXRlZFRhc2tzRnJvbVV1aWRzOiB1dWlkIGZpbHRlcmVkIFx1MjAxNCBjb21wbGV0ZWRBdDoiLHAuY29tcGxldGVkQXQsImRpc21pc3NlZEF0OiIscC5kaXNtaXNzZWRBdCwidXVpZDoiLHUpLG51bGw7cysrO2xldCBmPW8uZ2V0KHUpO3JldHVybnsuLi5wLG5vdGVOYW1lOnAubm90ZU5hbWV8fHAubm90ZVRpdGxlfHxwLm5vdGU/Lm5hbWV8fGY/Lm5vdGVOYW1lfHxudWxsLG5vdGVVVUlEOnAubm90ZVVVSUR8fGY/Lm5vdGVVVUlEfHxudWxsfX0pLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gayhgW0dyYXZleWFyZF0gaHlkcmF0ZWRUYXNrc0Zyb21VdWlkczogcmVzdWx0cyBcdTIwMTQgYWNjZXB0ZWQ9JHtzfSBtaXNzaW5nPSR7YX0gY29tcGxldGVkT3JEaXNtaXNzZWQ9JHtpfSB0b3RhbD0ke2wubGVuZ3RofWApLGx9ZnVuY3Rpb24gQlIoZSx0KXtsZXQgbj1TMSh0KTtyZXR1cm4gbiE9PW51bGwmJm48PWV9ZnVuY3Rpb24geDEoZSx0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IG49bmV3IERhdGUsbz1IUihuKSxyPW4uZ2V0VGltZSgpLU1SLGE9dC5maWx0ZXIocz0+QlIocixzKSk7aWYoYS5sZW5ndGg9PT0wKXJldHVybltdO2xldCBpPWEubWFwKChzLGwpPT4oey4uLnMsZ3JhdmV5YXJkSGV1cmlzdGljUmFua0luZGV4OmwsZ3JhdmV5YXJkSGV1cmlzdGljU2NvcmU6elIobyxzKX0pKTtyZXR1cm4gaS5zb3J0KChzLGwpPT5zLmdyYXZleWFyZEhldXJpc3RpY1Njb3JlIT09bC5ncmF2ZXlhcmRIZXVyaXN0aWNTY29yZT9sLmdyYXZleWFyZEhldXJpc3RpY1Njb3JlPnMuZ3JhdmV5YXJkSGV1cmlzdGljU2NvcmU/MTotMTpzLmdyYXZleWFyZEhldXJpc3RpY1JhbmtJbmRleC1sLmdyYXZleWFyZEhldXJpc3RpY1JhbmtJbmRleCksaS5zbGljZSgwLGUpLm1hcCgoe2dyYXZleWFyZEhldXJpc3RpY1JhbmtJbmRleDpzLC4uLmx9KT0+bCl9ZnVuY3Rpb24gUzEoZSl7bGV0IHQ9TnVtYmVyKGU/LmNyZWF0ZWRBdD8/ZT8uY3JlYXRlZCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gbnVsbDtsZXQgbj10PDFlMTA/dCpkaDp0LG89bmV3IERhdGUobik7cmV0dXJuIE51bWJlci5pc05hTihvLmdldFRpbWUoKSk/bnVsbDpufWZ1bmN0aW9uIEhSKGUpe2xldCB0PW5ldyBEYXRlKGUpO3JldHVybiB0LnNldE1vbnRoKHQuZ2V0TW9udGgoKS1EUiksdC5nZXRUaW1lKCl9YXN5bmMgZnVuY3Rpb24gRTEoZSx0KXtsZXQgbj1QUihuZXcgRGF0ZSksbz1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOm4sdGFnczpbd2VdfSkuY2F0Y2goKCk9Pm51bGwpO2lmKCFvPy51dWlkKXtsZXQgcz1hd2FpdCBlLmNyZWF0ZU5vdGUobixbd2VdLHthcmNoaXZlOiEwfSk7bz17bmFtZTpuLHV1aWQ6c30sYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQobyxgIyBTdWNjZXNzZnVsbHkgcmV0aXJlZCB0YXNrcwoKYCkuY2F0Y2goKCk9Pnt9KX1sZXQgcj10LnRpdGxlfHx0LmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixhPWFlKG5ldyBEYXRlKSxpPWAtIFt4XSAke3J9IDwhLS0geyJyZXRpcmVkQXQiOiIke2F9In0gLS0+CmA7YXdhaXQgZS5pbnNlcnROb3RlQ29udGVudChvLGkse2F0RW5kOiEwfSkuY2F0Y2gocz0+aygiW0dyYXZleWFyZF0gYXBwZW5kVGFza1RvUmV0aXJlZE5vdGUgZmFpbGVkOiIscykpfWFzeW5jIGZ1bmN0aW9uIE4xKGUsdCxuLG89e30pe2xldCByPSEhbz8uZm9yY2VSZWZyZXNoO2soIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBzdGFydCBcdTIwMTQgY291bnQ6Iix0LCJ0YXNrRG9tYWluVVVJRDoiLG4sImZvcmNlUmVmcmVzaDoiLHIpO2xldCBhPWF3YWl0IElSKGUpO2soIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiB1c2luZyBkYXRhIG5vdGU6IixhPy51dWlkLGE/Lm5hbWUpO2xldCBpPSIiO3RyeXtpPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoYSksaygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGZldGNoZWQgbm90ZSBjb250ZW50LCBsZW5ndGg6IixpPy5sZW5ndGg/PyJudWxsL3VuZGVmaW5lZCIpLGk9aXx8IiJ9Y2F0Y2goZil7aygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGdldE5vdGVDb250ZW50IHRocmV3OiIsZiwiXHUyMDE0IHRyZWF0aW5nIGFzIGVtcHR5IiksaT0iIn1sZXQgcz1MUihpKTtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogcGFyc2VkIixzLmxlbmd0aCwicm93cyBmcm9tIG5vdGU7IGRhdGVLZXlzOiIscy5tYXAoZj0+Zi5kYXRlS2V5KSk7bGV0IGw9YWUobmV3IERhdGUpO2soIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiB0b2RheUtleSA9IixsKTtsZXQgZD1zLmZpbmQoZj0+Zi5kYXRlS2V5PT09bCk7aWYoaygiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IHRvZGF5Um93IGZvdW5kOiIsISFkLGQ/YHV1aWRzPSR7ZC51dWlkcy5sZW5ndGh9YDoiIiksIXImJmQ/LnV1aWRzLmxlbmd0aD4wKXtrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogY2FjaGUgaGl0IFx1MjAxNCBoeWRyYXRpbmciLGQudXVpZHMubGVuZ3RoLCJ1dWlkczoiLGQudXVpZHMpO2xldCBmPWF3YWl0IFdSKGUsZC50YXNrRW50cmllcyxkLnV1aWRzKSxtPXgxKHQsZik7aWYoaygiW0dyYXZleWFyZF0gbG9hZGVkIGNhY2hlZCBjYW5kaWRhdGVzOiIsbS5sZW5ndGgpLG0ubGVuZ3RoPjApcmV0dXJue2NhbmRpZGF0ZXM6bSxub3RlSGFuZGxlOmF9O2soIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBjYWNoZWQgVVVJRHMgYWxsIG1pc3NpbmcgZnJvbSBkb21haW4gXHUyMDE0IGRpc2NhcmRpbmcgc3RhbGUgdG9kYXkgcm93IGFuZCByZWRpc2NvdmVyaW5nIil9ZWxzZSByJiZrKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogZm9yY2VSZWZyZXNoIHJlcXVlc3RlZCBcdTIwMTQgYnlwYXNzaW5nIHRvZGF5IGNhY2hlIHJvdyIpO2xldCBjPXI/czpzLmZpbHRlcihmPT5mLmRhdGVLZXkhPT1sKSx1PU9SKGMpLHA9YXdhaXQgVVIoZSx0LHUsbik7aWYocC5sZW5ndGg+MCl7bGV0IGY9cC5tYXAoZz0+KHtub3RlTmFtZTpnLm5vdGVOYW1lfHxnLm5vdGVUaXRsZXx8Zy5ub3RlPy5uYW1lLG5vdGVVVUlEOmcubm90ZVVVSUQsdXVpZDpnLnV1aWR9KSksbT1be2RhdGVLZXk6bCx0YXNrRW50cmllczpmLHV1aWRzOnAubWFwKGc9PmcudXVpZCl9LC4uLnMuZmlsdGVyKGc9PmcuZGF0ZUtleSE9PWwpXTthd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudChhLGsxKG0pKS5jYXRjaChnPT5rKCJbR3JhdmV5YXJkXSBmYWlsZWQgdG8gcGVyc2lzdCBjYW5kaWRhdGVzOiIsZykpfXJldHVybiBrKCJbR3JhdmV5YXJkXSBkaXNjb3ZlcmVkIGZyZXNoIGNhbmRpZGF0ZXM6IixwLmxlbmd0aCkse2NhbmRpZGF0ZXM6cCxub3RlSGFuZGxlOmF9fXZhciBzbj1MKG1lKCkpO3ZhciBjaD1bImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA2OTA1OTI1MzQ2LTIxYmRhNGQzMmRmNCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcwMDcxNDU5NjA0LTNiNWVjM2E3ZmUwNSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTAxNzg1ODg4MDQxLWFmM2VmMjg1YjQ3MCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY0ODIyNzU5MDIzLWZlZDYyMmZmMmMzYiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTE5NjgxMzkzNzg0LWQxMjAyNjc5MzNiYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDc1OTI0MTU2NzM0LTQ5NmY2Y2FjNmVjMSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDkwNzMwMTQxMTAzLTZjYWMyN2FhYWI5NCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDMzMDg2OTY2MzU4LTU0ODU5ZDBlZDcxNiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcyMjE0MTAzNDUxLTkzNzRiZDFjNzk4ZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDE0NjA5MjQ1MjI0LWFmYTAyYmZiM2ZkYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY5NDc0OTY4MDI4LTU2NjIzZjAyZTQyZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDI2NjA0OTY2ODQ4LWQ3YWRhYzQwMmJmZiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY1MTQ2MzQ0NDI1LWYwMGQ1ZjVjOGYwNyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDkxNTUzODk1OTExLTAwNTVlY2E2NDAyZCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcwNzcwODQxMDcyLWY5NzhjZjRkMDE5ZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY0ODIzMDYzNTMwLTA4ZjEwZWQxYTJkZCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDM5ODUzOTQ5MTI3LWZhNjQ3ODIxZWJhMCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcyMzk2OTYxNjkzLTE0MmU2ZTI2OTAyNyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDMxNzk0MDYyMjMyLTJhOTlhNTQzMWM2YyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQ2Nzc2ODExOTUzLWIyM2Q1N2JkMjFhYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA2NzQ0MDM4MTM2LTQ2MjczODM0YjNmYiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTcyMjkzMDcxMjc3LWVmMWIzZTc2MTA0NSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDE4MDY1NDYwNDg3LTNlNDFhNmM4NGRjNSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcwMjQ2OTczOTE4LTI5YTkzMjIxYzQ1NSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDczMTE2NzYzMjQ5LTJmYWFlZjgxY2NkYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDM5NzkyNjc1MTA1LTcwMWU2YTRhYjZmMCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDYzMzIwNzI2MjgxLTY5NmE0ODU5MjhjNyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDk5MDAyMjM4NDQwLWQyNjRlZGQ1OTZlYyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTEwNzk4ODMxOTcxLTY2MWViMDRiMzczOSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA3NTI1NDI4MDM0LWI3MjNjZjk2MWQzZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQxOTc0MjMxNTMxLWM2MjI3ZGI3NmI2ZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDU4NjY4MzgzOTcwLThkZGQzOTI3ZGVlZCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcwNzcwOTAzNjc2LTY5Yjk4MjAxZWExYyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY0MDM3ODY2NTU2LTY4MTJjOWQxYzcyZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDU1MjE4ODczNTA5LTgwOTczMDVlZTM3OCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY1OTE5MjkyMjc1LWM2MGJhNDlkYTZhZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQ4Mzc1MjQwNTg2LTg4MjcwN2RiODg4YiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDUxMTg3NTgwNDU5LTQzNDkwMjc5YzBmYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDY1MTAxMDQ2NTMwLTczMzk4YzdmMjhjYSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDIxNzg5NjY1MjA5LWM5YjJhNDM1ZTNkYyIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDc3NDE0MzQ4NDYzLWMwZWI3ZjEzNTliNiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTAwNTMwODU1Njk3LWI1ODZkODliYTNlZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDU1MTU2MjE4Mzg4LTVlNjFiNTI2ODE4YiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQ3NzUyODc1MjE1LWIyNzYxYWNiM2M1ZCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDQzODkwOTIzNDIyLTc4MTllZDQxMDFjMCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDk0NzgzMzY3MTkzLTE0OTAzNGMwNWU4ZiIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNjA4OTUzMDI5NjAxLTdhNmU1ZTdmZDU0OCIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTAyMDgyNTUzMDQ4LWYwMDljMzcxMjliOSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTE5OTA0OTgxMDYzLWIwY2Y0NDhkNDc5ZSIsImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDc2MjMxNjgyODI4LTM3ZTU3MWJjMTcyZiJdLFQxPVsiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDA1MzQzMTQyMDktYTI1ZGRiMmJkNDI5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDE4NTQxNDA4MDEtNTBkMDE2OTg5NTBiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1NTk4MjcyNjAtZGM2NmQ1MmJlZjE5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MzA5MDgyOTU0MTgtYTEyZTMyNjk2NmJhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1OTIyOTA0MzUzMzgtNjgyYzQwMGNiNmY4IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MjA5NjI4ODAyNDctY2ZhZjU0MWM4NzI0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDQyMTA5NzEwNDgtNjEzMGNmMGM0NmNmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MjgzNjA5ODMyNzctMTNkNDAxY2RjMTg2IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE2MDcxMzYxMDQwODAtNzhiYmZlMmQxMjM0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDAzNDIzNTk3NDMtODRmY2I4YzIxZjIxIl0sRmM9e3NtYWxsOnt3aWR0aDo2MDAsaGVpZ2h0OjYwMH0sbGFyZ2U6e3dpZHRoOjE5MjAsaGVpZ2h0OjEwODB9fSxiaT1jaC5sZW5ndGg7ZnVuY3Rpb24gRDEoZSl7bGV0IHQ9U3RyaW5nKGU/PyJkZWZhdWx0LXNlZWQiKSxuPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKz0xKW49KG48PDUpLW4rdC5jaGFyQ29kZUF0KG8pLG58PTA7cmV0dXJuIE1hdGguYWJzKG4pfWZ1bmN0aW9uIEExKGU9InNtYWxsIix0PSJncmF2ZXlhcmQiKXtsZXQgbj1GY1tlXXx8RmMuc21hbGw7cmV0dXJuYCR7VDFbRDEodCklVDEubGVuZ3RoXX0/dz0ke24ud2lkdGh9Jmg9JHtuLmhlaWdodH0mZml0PWNyb3AmYXV0bz1mb3JtYXRgfWZ1bmN0aW9uIHpjKGU9InNtYWxsIix0PSJkZWZhdWx0IixuPTApe3JldHVybiB1aChlLEQxKGAke3R9OiR7bn1gKSl9ZnVuY3Rpb24gdWgoZT0ic21hbGwiLHQ9MCl7bGV0IG49RmNbZV18fEZjLnNtYWxsLG89Y2gubGVuZ3RoLHI9KE1hdGgudHJ1bmMoTnVtYmVyKHQpfHwwKSVvK28pJW8sYT1gP3c9JHtuLndpZHRofSZoPSR7bi5oZWlnaHR9JmZpdD1jcm9wJmF1dG89Zm9ybWF0YDtyZXR1cm5gJHtjaFtyXX0ke2F9YH12YXIgRmU9TChYKCkpLEtSPTUsR1I9NTAwLG9sPSJncmF2ZXlhcmQiO2Z1bmN0aW9uIFZSKHtoZWFkZXJBY3Rpb25zOmV9KXtyZXR1cm4oMCxGZS5qc3gpKHJlLHtoZWFkZXJBY3Rpb25zOmUsd2lkZ2V0SWQ6b2wsY2hpbGRyZW46KDAsRmUuanN4KSgicCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWVtcHR5IixjaGlsZHJlbjoiTm8gbmVnbGVjdGVkIHRhc2tzIGZvdW5kIFx1MjAxNCBldmVyeXRoaW5nIGxvb2tzIGN1cnJlbnQhIn0pfSl9ZnVuY3Rpb24galIoe2Vycm9yTWVzc2FnZTplLGhlYWRlckFjdGlvbnM6dCxvblJldHJ5Om59KXtyZXR1cm4oMCxGZS5qc3gpKHJlLHtoZWFkZXJBY3Rpb25zOnQsd2lkZ2V0SWQ6b2wsY2hpbGRyZW46KDAsRmUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWVycm9yIixjaGlsZHJlbjpbKDAsRmUuanN4KSgicCIse2NoaWxkcmVuOmV8fCJGYWlsZWQgdG8gbG9hZCB0YXNrcy4ifSksKDAsRmUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtcmV0cnkiLG9uQ2xpY2s6bix0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJSZXRyeSJ9KV19KX0pfWZ1bmN0aW9uIFlSKHtoZWFkZXJBY3Rpb25zOmV9KXtyZXR1cm4oMCxGZS5qc3gpKHJlLHtoZWFkZXJBY3Rpb25zOmUsd2lkZ2V0SWQ6b2wsY2hpbGRyZW46KDAsRmUuanN4KSgicCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWxvYWRpbmciLGNoaWxkcmVuOiJTZWFyY2hpbmcgZm9yIGZvcmdvdHRlbiB0YXNrc1x1MjAyNiJ9KX0pfWZ1bmN0aW9uIHFSKHtpc1JlZnJlc2hpbmc6ZSxvblJlZnJlc2g6dH0pe3JldHVybigwLEZlLmpzeCkoImEiLHsiYXJpYS1kaXNhYmxlZCI6ZT8idHJ1ZSI6ImZhbHNlIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixocmVmOiIjIixvbkNsaWNrOnQsdGFiSW5kZXg6ZT8tMTowLHRpdGxlOmU/IlJlZnJlc2hpbmcgZ3JhdmV5YXJkIGNhbmRpZGF0ZXMiOiJGaW5kIGEgbmV3IHNldCBvZiBncmF2ZXlhcmQgY2FuZGlkYXRlcyIsY2hpbGRyZW46ZT8iXHUyMUJCIFJlZnJlc2hpbmdcdTIwMjYiOiJcdTIxQkIgUmVmcmVzaCJ9KX1mdW5jdGlvbiBDMShlKXtpZighZT8uY3JlYXRlZEF0KXJldHVybiBudWxsO2xldCB0PU51bWJlcihlLmNyZWF0ZWRBdCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gbnVsbDtsZXQgbj10PDFlMTA/dCoxZTM6dCxvPW5ldyBEYXRlKG4pO3JldHVybiBOdW1iZXIuaXNOYU4oby5nZXRUaW1lKCkpP251bGw6b31mdW5jdGlvbiAkUihlLHQpe2xldCBuPUMxKGUpO2lmKCFuKXJldHVybiBudWxsO2xldCBvPW4udG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0Iix5ZWFyOiJudW1lcmljIn0pO3JldHVybiB0P286YENyZWF0ZWQgJHtvfWB9ZnVuY3Rpb24gTTEoZSl7bGV0IHQ9TnVtYmVyKGU/LnNjb3JlPz9lPy52aWN0b3J5VmFsdWU/PzApO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDowfWZ1bmN0aW9uIFhSKGUpe2xldCB0PU0xKGUpO3JldHVybiB0PD0zPyJtdXRlZCI6dDw9NT8iY29vbCI6dDwxMD8id2FybSI6ImhvdCJ9ZnVuY3Rpb24gcGgoZSl7cmV0dXJuYCR7ZT8/IiJ9YC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBKUihlLHQpe2lmKCFOdW1iZXIuaXNGaW5pdGUodCl8fHQ8PTApcmV0dXJuIDA7bGV0IG49bmV3IERhdGUscj1gJHtgJHtuLmdldEZ1bGxZZWFyKCl9OiR7bi5nZXRNb250aCgpfToke24uZ2V0RGF0ZSgpfToke24uZ2V0SG91cnMoKX1gfToke2U/PyIifWAsYT0wO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSs9MSlhPWEqMzErci5jaGFyQ29kZUF0KGkpPj4+MDtyZXR1cm4gYSV0fWZ1bmN0aW9uIFFSKGUpe2xldCB0PUMxKGUpLG49TTEoZSksbz1OdW1iZXIuaXNJbnRlZ2VyKG4pP2Ake259YDpuLnRvRml4ZWQoMikucmVwbGFjZSgvXC4/MCskLywiIikscj1lPy5ub3RlTmFtZXx8ZT8ubm90ZVRpdGxlfHxlPy5ub3RlPy5uYW1lfHwiVW5rbm93biBub3RlIixhPVhSKGUpLGk9dD90LnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse2RhdGVTdHlsZToibWVkaXVtIn0pOiJVbmtub3duIjtyZXR1cm5gCiAgICA8ZGl2IGNsYXNzPSJncmF2ZXlhcmQtdGFzay10b29sdGlwIiByb2xlPSJ0b29sdGlwIj4KICAgICAgPGRpdiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1tZXRhIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1ub3RlIj4ke3BoKHIpfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1jcmVhdGVkIj5DcmVhdGVkICR7cGgoaSl9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcC1jb250ZW50Ij4KICAgICAgICAke2NvKGUuY29udGVudHx8ZS50aXRsZXx8IlVudGl0bGVkIHRhc2siKX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtZm9vdGVyIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stc2NvcmUgZ3JhdmV5YXJkLXRhc2stc2NvcmUtLSR7YX0iPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImdyYXZleWFyZC10YXNrLXNjb3JlLWRvdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KICAgICAgICAgIDxzcGFuPlNjb3JlICR7cGgobyl9PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgfWZ1bmN0aW9uIFpSKGUpe2xldCB0PWUuY3VycmVudFRhcmdldD8uY2xvc2VzdD8uKCIuZ3JhdmV5YXJkLXRhc2staXRlbSIpO2lmKCF0fHx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm47bGV0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTshbi53aWR0aHx8IW4uaGVpZ2h0fHxOYyh7b3JpZ2luOnt4OihuLmxlZnQrbi53aWR0aC8yKS93aW5kb3cuaW5uZXJXaWR0aCx5OihuLnRvcCtuLmhlaWdodC8yKS93aW5kb3cuaW5uZXJIZWlnaHR9LHBhcnRpY2xlQ291bnQ6ODAsc3ByZWFkOjcwLHN0YXJ0VmVsb2NpdHk6Mzh9KX1mdW5jdGlvbiBlMih7aXNEaXNtaXNzaW5nOmUsaXNTaW5nbGVDb2x1bW46dCx0YXNrSW5kZXg6bixvbk9wZW5Ob3RlOm8sb25HcmF2ZXlhcmQ6cixvbktlZXA6YSx0YXNrOml9KXtsZXQgcz1pLnRpdGxlfHxpLmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixsPSRSKGksdCksZD1gZ3JhdmV5YXJkLXRhc2staXRlbSR7ZT8iIGdyYXZleWFyZC10YXNrLWl0ZW0tLWRpc21pc3NpbmciOiIifWAsYz1bIkRpc21pc3MiLCJTZW5kIHRvIGEgZmFybSB1cHN0YXRlIiwiUmV0aXJlIiwiTGV0IGdvIiwiRXhpbGUiLCJCdXJ5IiwiU2VuZCBvZmYiLCJSZWxlYXNlIGludG8gdGhlIHdpbGQiLCJQdXQgb3V0IHRvIHBhc3R1cmUiLCJMYXkgdG8gcmVzdCIsIkRlY29tbWlzc2lvbiIsIlJlbGVhc2UgdG8gdGhlIGdyZWF0IGJleW9uZCIsIlNlbmQgdG8gdGhlIGV0ZXJuYWwgcmVzdCIsIkEgc29sZW1uIGZhcmV3ZWxsIiwiUGF5IGEgZmluYWwgdHJpYnV0ZSIsIlNlbmQgdG8gdGhlIGhlcmVhZnRlciJdLHU9Y1tKUihuLGMubGVuZ3RoKV07cmV0dXJuKDAsRmUuanN4cykoImxpIix7Y2xhc3NOYW1lOmQsY2hpbGRyZW46WygwLEZlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWhlYWRlciIsY2hpbGRyZW46WygwLEZlLmpzeCkoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stdGl0bGUtd3JhcCIsY2hpbGRyZW46KDAsRmUuanN4KShCcyx7Y29udGVudDpRUihpKSxkZWxheTpbR1IsMF0saW50ZXJhY3RpdmU6ITAsbWF4V2lkdGg6dD8yODA6MzQwLG9uU2hvd246cD0+V24ocD8ucG9wcGVyKSxwbGFjZW1lbnQ6ImJvdHRvbS1zdGFydCIsY2hpbGRyZW46KDAsRmUuanN4KSgic3BhbiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stdGl0bGUiLGlkOmBncmF2ZXlhcmQtdGl0bGUtJHtpLnV1aWR9YCx0YWJJbmRleDowLGNoaWxkcmVuOnN9KX0pfSksbD8oMCxGZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hZ2UiLGNoaWxkcmVuOmx9KTpudWxsXX0pLCgwLEZlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWFjdGlvbnMiLGNoaWxkcmVuOlsoMCxGZS5qc3gpKCJhIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hY3Rpb24gZ3JhdmV5YXJkLXRhc2stYWN0aW9uLS1zZW5kIixocmVmOiIjIixvbkNsaWNrOnA9PntwLnByZXZlbnREZWZhdWx0KCkscihwLGkpfSx0aXRsZToiRGlzbWlzcyB0aGlzIHRhc2sgXHUyMDE0IHJlbW92ZXMgaXQgZnJvbSB5b3VyIHRhc2sgZG9tYWluIGFuZCBwbGFjZXMgaXQgaW4gYW4gYXJjaGl2ZWQgbm90ZSB5b3UgY2FuIHJldmlzaXQgbGF0ZXIgaWYgZGVzaXJlZCIsY2hpbGRyZW46YFx1ezFGNUQxfVx1RkUwRiAke3V9YH0pLCgwLEZlLmpzeCkoImEiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWFjdGlvbiBncmF2ZXlhcmQtdGFzay1hY3Rpb24tLWtlZXAiLGhyZWY6IiMiLG9uQ2xpY2s6cD0+e3AucHJldmVudERlZmF1bHQoKSxhKGkpfSx0aXRsZToiUHJlc2VydmUgdGhpcyB0YXNrIFx1MjAxNCByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3Qgd2l0aG91dCBkaXNtaXNzaW5nIGl0IixjaGlsZHJlbjoiXHV7MUY5RjJ9IEtlZXAifSksKDAsRmUuanN4KSgiYSIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stYWN0aW9uIGdyYXZleWFyZC10YXNrLWFjdGlvbi0tbm90ZSIsaHJlZjoiIyIsb25DbGljazpwPT57cC5wcmV2ZW50RGVmYXVsdCgpLG8oaSl9LHRpdGxlOiJPcGVuIHRoZSBub3RlIHdoZXJlIHRoaXMgdGFzayBsaXZlcyIsY2hpbGRyZW46Ilx1ezFGNEQzfSBOb3RlIn0pXX0pXX0pfWZ1bmN0aW9uIHQyKHtkaXNtaXNzaW5nVXVpZHM6ZSxoZWFkZXJBY3Rpb25zOnQsaXNTaW5nbGVDb2x1bW46bixtZWFkb3dPcGFjaXR5Om8sbWVhZG93VXJsOnIsb25PcGVuTm90ZTphLG9uR3JhdmV5YXJkOmksb25LZWVwOnMsdGFza3M6bH0pe3JldHVybigwLEZlLmpzeCkocmUse2hlYWRlckFjdGlvbnM6dCx3aWRnZXRJZDpvbCxjaGlsZHJlbjooMCxGZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtbWVhZG93LXdyYXBwZXIiLGNoaWxkcmVuOlsoMCxGZS5qc3gpKCJpbWciLHthbHQ6IiIsY2xhc3NOYW1lOiJncmF2ZXlhcmQtbWVhZG93LWJnIixzcmM6cixzdHlsZTp7b3BhY2l0eTpvfX0pLCgwLEZlLmpzeCkoInVsIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1saXN0IixjaGlsZHJlbjpsLm1hcCgoZCxjKT0+KDAsRmUuanN4KShlMix7aXNEaXNtaXNzaW5nOmUuaGFzKGQudXVpZCksaXNTaW5nbGVDb2x1bW46bix0YXNrSW5kZXg6Yyxvbk9wZW5Ob3RlOmEsb25HcmF2ZXlhcmQ6aSxvbktlZXA6cyx0YXNrOmR9LGQudXVpZCkpfSldfSl9KX1mdW5jdGlvbiBmaCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLGdyaWRXaWR0aFNpemU6bj0yLHRhc2tEb21haW5VVUlEOm99KXtsZXQgcj0odHx8MSkqS1IsYT1OdW1iZXIobik9PT0xLFtpLHNdPSgwLHNuLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksW2wsZF09KDAsc24udXNlU3RhdGUpKG51bGwpLFtjLHVdPSgwLHNuLnVzZVN0YXRlKSghMCksW3AsZl09KDAsc24udXNlU3RhdGUpKG51bGwpLG09KDAsc24udXNlTWVtbykoKCk9PkExKCJzbWFsbCIsbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSksW10pLGc9aS5zaXplPjA/MTowLHc9KDAsc24udXNlQ2FsbGJhY2spKGFzeW5jKHg9e30pPT57bGV0IEU9ISF4Py5mb3JjZVJlZnJlc2g7aygiW0dyYXZleWFyZF0gbG9hZENhbmRpZGF0ZXMgZmlyZWQsIHRhc2tEb21haW5VVUlEOiIsbywiZm9yY2VSZWZyZXNoOiIsRSksZChudWxsKSxFJiZzKG5ldyBTZXQpLHUoITApO3RyeXtsZXR7Y2FuZGlkYXRlczpUfT1hd2FpdCBOMShlLHIsbyx7Zm9yY2VSZWZyZXNoOkV9KSxBPVQuZmlsdGVyKEM9PiFDLmlzUGFyZW50KS5zbGljZSgwLHIpO2YoQSl9Y2F0Y2goVCl7aygiW0dyYXZleWFyZF0gbG9hZCBmYWlsZWQ6IixUKSxkKFQubWVzc2FnZXx8IkZhaWxlZCB0byBsb2FkIHRhc2tzIil9ZmluYWxseXt1KCExKX19LFtlLHIsb10pOygwLHNuLnVzZUVmZmVjdCkoKCk9Pnt3KCl9LFt3XSk7bGV0IHY9KDAsc24udXNlQ2FsbGJhY2spKHg9Pnt4LnByZXZlbnREZWZhdWx0KCksIWMmJncoe2ZvcmNlUmVmcmVzaDohMH0pfSxbdyxjXSkseT0oMCxzbi51c2VDYWxsYmFjaykoYXN5bmMoeCxFKT0+e1pSKHgpLHMoVD0+e2xldCBBPW5ldyBTZXQoVCk7cmV0dXJuIEEuYWRkKEUudXVpZCksQX0pLGUudXBkYXRlVGFzayhFLnV1aWQse2Rpc21pc3NlZEF0Ok1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpfSkuY2F0Y2goVD0+aygiW0dyYXZleWFyZF0gdXBkYXRlVGFzayBmYWlsZWQ6IixUKSksRTEoZSxFKS5jYXRjaChUPT5rKCJbR3JhdmV5YXJkXSBhcHBlbmRUYXNrVG9SZXRpcmVkTm90ZSBmYWlsZWQ6IixUKSksQmUoImRpc21pc3NHcmF2ZXlhcmRUYXNrIil9LFtlXSksYj0oMCxzbi51c2VDYWxsYmFjaykoeD0+e3MoRT0+e2xldCBUPW5ldyBTZXQoRSk7cmV0dXJuIFQuYWRkKHgudXVpZCksVH0pfSxbXSksaD0oMCxzbi51c2VDYWxsYmFjaykoYXN5bmMgeD0+e3g/Lm5vdGVVVUlEJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7eC5ub3RlVVVJRH1gKX0sW2VdKSxTPSgwLEZlLmpzeCkocVIse2lzUmVmcmVzaGluZzpjLG9uUmVmcmVzaDp2fSk7cmV0dXJuIHV0KG9sLCFjJiYhbCwhIWwpLGM/KDAsRmUuanN4KShZUix7aGVhZGVyQWN0aW9uczpTfSk6bD8oMCxGZS5qc3gpKGpSLHtlcnJvck1lc3NhZ2U6bCxoZWFkZXJBY3Rpb25zOlMsb25SZXRyeTp3fSk6cD09PW51bGx8fHAubGVuZ3RoPT09MCYmaS5zaXplPT09MD8oMCxGZS5qc3gpKFZSLHtoZWFkZXJBY3Rpb25zOlN9KTooMCxGZS5qc3gpKHQyLHtkaXNtaXNzaW5nVXVpZHM6aSxoZWFkZXJBY3Rpb25zOlMsaXNTaW5nbGVDb2x1bW46YSxtZWFkb3dPcGFjaXR5OmcsbWVhZG93VXJsOm0sb25PcGVuTm90ZTpoLG9uR3JhdmV5YXJkOnksb25LZWVwOmIsdGFza3M6cH0pfXZhciBxbj1MKG1lKCkpO3ZhciBtaD03MDAsTzE9ImRhc2hib2FyZC1iYWNrZ3JvdW5kLWZhZGUtaW4iLG4yPTRlMztmdW5jdGlvbiBvMihlKXtpZihiaTw9MSlyZXR1cm4gMDtsZXQgdD1lPj0wP2U6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmJpKSxuPTErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihiaS0xKSk7cmV0dXJuKHQrbiklYml9ZnVuY3Rpb24gcjIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9PntsZXQgbj1uZXcgSW1hZ2Usbz1zZXRUaW1lb3V0KHQsbjIpLHI9KCk9PntjbGVhclRpbWVvdXQobyksdCgpfTtuLm9ubG9hZD1yLG4ub25lcnJvcj1yLG4uc3JjPWV9KX1mdW5jdGlvbiBoaCgpe2xldFtlLHRdPSgwLHFuLnVzZVN0YXRlKShudWxsKSxbbixvXT0oMCxxbi51c2VTdGF0ZSkobnVsbCkscj0oMCxxbi51c2VSZWYpKC0xKSxhPSgwLHFuLnVzZVJlZikoITApLGk9KDAscW4udXNlUmVmKSghMSk7KDAscW4udXNlRWZmZWN0KSgoKT0+KCk9PnthLmN1cnJlbnQ9ITF9LFtdKTtsZXQgcz0oMCxxbi51c2VDYWxsYmFjaykoYXN5bmMoKT0+e2lmKGkuY3VycmVudClyZXR1cm47aS5jdXJyZW50PSEwO2xldCBsPW8yKHIuY3VycmVudCksZD11aCgibGFyZ2UiLGwpO2soYFtiYWNrZ3JvdW5kLXN3YXBdIGZhZGluZyB0byBzcGxhc2ggaW1hZ2UgJHtsfSBvZiAke2JpfWApLGF3YWl0IHIyKGQpLGEuY3VycmVudCYmKHIuY3VycmVudD1sLHQoZCkpfSxbXSk7cmV0dXJuKDAscW4udXNlRWZmZWN0KSgoKT0+e2lmKCFlKXJldHVybjtsZXQgbD1zZXRUaW1lb3V0KCgpPT57byhlKSx0KG51bGwpLGkuY3VycmVudD0hMX0sbWgpO3JldHVybigpPT5jbGVhclRpbWVvdXQobCl9LFtlXSkse2luY29taW5nQmFja2dyb3VuZFVybDplLHN3YXBCYWNrZ3JvdW5kOnMsc3dhcHBlZEJhY2tncm91bmRVcmw6bn19dmFyIGdvPUwobWUoKSk7ZnVuY3Rpb24gYTIoZSl7bGV0IHQ9e307Zm9yKGxldHtkYXRlS2V5Om4sdGFza3M6b31vZiBlKXRbbl09bztyZXR1cm4gdH1mdW5jdGlvbiBnaChlKXtsZXRbdCxuXT0oMCxnby51c2VTdGF0ZSkoe30pLFtvLHJdPSgwLGdvLnVzZVN0YXRlKSghMSksYT0oMCxnby51c2VSZWYpKCExKSxpPSgwLGdvLnVzZVJlZikobnVsbCkscz0oMCxnby51c2VSZWYpKG5ldyBTZXQpLGw9KDAsZ28udXNlUmVmKShudWxsKSxkPSgwLGdvLnVzZVJlZikoe30pLGM9KDAsZ28udXNlQ2FsbGJhY2spKGFzeW5jKHUscCk9PntsLmN1cnJlbnQhPT1wJiYobC5jdXJyZW50PXAscy5jdXJyZW50PW5ldyBTZXQsZC5jdXJyZW50PXt9LHIoITEpKTtsZXR7Ym91bmRhcmllczpmLHdlZWtTdGFydEtleTptfT1Layh1KSxnPWAke219Ojoke3B8fCIifWA7aWYocy5jdXJyZW50LmhhcyhnKSlyZXR1cm4gcighMCksZC5jdXJyZW50O2EuY3VycmVudD0hMCxpLmN1cnJlbnQ9bnVsbDt0cnl7bGV0IHc9YXdhaXQgUHJvbWlzZS5hbGwoZi5tYXAoYXN5bmMoe2Zyb206Yix0bzpoLGRhdGVLZXk6U30pPT57bGV0IHg9YXdhaXQgZS5nZXRDb21wbGV0ZWRUYXNrcyhiLGgpO3JldHVybntkYXRlS2V5OlMsdGFza3M6eHx8W119fSkpLHY9YTIodykseT17Li4uZC5jdXJyZW50LC4uLnZ9O3JldHVybiBuKHkpLGQuY3VycmVudD15LHMuY3VycmVudC5hZGQoZykscighMCkseX1jYXRjaCh3KXtyZXR1cm4gaygidXNlQ29tcGxldGVkVGFza3M6IGZhaWxlZCB0byBmZXRjaCBjb21wbGV0ZWQgdGFza3MiLHcpLGkuY3VycmVudD13LHIoITApLGQuY3VycmVudH1maW5hbGx5e2EuY3VycmVudD0hMX19LFtdKTtyZXR1cm57Y29tcGxldGVkVGFza3NCeURhdGU6dCxjb21wbGV0ZWRUYXNrc0xvYWRlZDpvLGdldCBsb2FkaW5nKCl7cmV0dXJuIGEuY3VycmVudH0sZ2V0IGVycm9yKCl7cmV0dXJuIGkuY3VycmVudH0sZmV0Y2hDb21wbGV0ZWRUYXNrczpjfX12YXIgSTE9TChtZSgpKTtmdW5jdGlvbiB5aCh7Y29uZmlnUGFyYW1zOmV9KXtyZXR1cm57YWN0aXZlQ29tcG9uZW50czooMCxJMS51c2VNZW1vKSgoKT0+e2lmKCFlKXJldHVybltdO2xldCBuPWVbQi5EQVNIQk9BUkRfQ09NUE9ORU5UU107cmV0dXJuIEFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoPjA/bjpZb30sW2VdKX19dmFyIENvPUwobWUoKSk7ZnVuY3Rpb24gV2MoZSl7cmV0dXJuIGUuc3RhcnRBdHx8ZS5kZWFkbGluZX1mdW5jdGlvbiB2aChlLHQsbj0oKT0+ITApe2xldCBvPXt9LHI9MCxhPW5ldyBEYXRlO3JldHVybiBlLmZvckVhY2goaT0+e2lmKHIrPTEsIW4oaSkpcmV0dXJuO2xldCBzPXQoaSk7aWYoIXMpcmV0dXJuO2xldCBsPUduKHMpO29bbF18fChvW2xdPVtdKSxvW2xdLnB1c2goaSl9KSxrKGBBbmFseXplZCAke3J9IHRhc2tzLCBncm91cGVkIGludG8gJHtPYmplY3Qua2V5cyhvKS5sZW5ndGh9IGRhdGUga2V5cyBpbiAke25ldyBEYXRlLWF9bXNgKSxvfWZ1bmN0aW9uIFIxKGUpe3JldHVybiB2aChlLFdjLHQ9PiF0LmNvbXBsZXRlZEF0JiYhdC5kaXNtaXNzZWRBdCl9ZnVuY3Rpb24gUDEoZSl7cmV0dXJuIHZoKGUsdD0+dC5jb21wbGV0ZWRBdCx0PT4hIXQuY29tcGxldGVkQXQpfWZ1bmN0aW9uIGkyKGUsdCl7bGV0IG49ZS5maWx0ZXIocj0+cj50KSxvPWUuZmlsdGVyKHI9PnI8dCk7cmV0dXJue3VwY29taW5nRGF0ZUtleXM6bixvbGRlckRhdGVLZXlzOm99fWZ1bmN0aW9uIHMyKGUsdCl7bGV0IG49e307cmV0dXJuIHQuZm9yRWFjaChvPT57bltvXT1lW29dfHxbXX0pLG59ZnVuY3Rpb24gYmgoKXtsZXRbZSx0XT0oMCxDby51c2VTdGF0ZSkoW10pLFtuLG9dPSgwLENvLnVzZVN0YXRlKShudWxsKSxbcixhXT0oMCxDby51c2VTdGF0ZSkobnVsbCksW2ksc109KDAsQ28udXNlU3RhdGUpKHt9KSxbbCxkXT0oMCxDby51c2VTdGF0ZSkoe30pLGM9bmV3IERhdGUsdT0oMCxDby51c2VDYWxsYmFjaykobT0+e2lmKCFtKXJldHVybjt0KG0udGFza0RvbWFpbnN8fFtdKSxvKG0uYWN0aXZlVGFza0RvbWFpbnx8bnVsbCk7bGV0IGc9bS50YXNrc3x8W107cyhSMShnKSksZChQMShnKSksYShEYXRlLm5vdygpKX0sW10pLHA9KDAsQ28udXNlQ2FsbGJhY2spKChtLGcsdyk9PntpZihtJiZ0KG0pLGcmJm8oZyksdyl7bGV0IHY9dy50YXNrc3x8W107cyhSMSh2KSksZChQMSh2KSksYShEYXRlLm5vdygpKX19LFtdKSxmPSgwLENvLnVzZUNhbGxiYWNrKShtPT57bGV0IGc9bT9uZXcgRGF0ZShtKTpuZXcgRGF0ZSx3PUduKGcpLHY9T2JqZWN0LnZhbHVlcyhpKS5mbGF0KCkseT12LmZpbHRlcihFPT4hIShFLnN0YXJ0QXR8fEUuZGVhZGxpbmUpKS5zb3J0KChFLFQpPT5XYyhFKS1XYyhUKSk7ayhgQWdlbmRhIHdpbGwgcmV2aWV3ZWQgJHt2Lmxlbmd0aH0gb3BlbiB0YXNrc2Asdi5tYXAoRT0+KHtkZWFkbGluZVRleHQ6RS5kZWFkbGluZT9HbihFLmRlYWRsaW5lKToiTi9BIixzdGFydFRleHQ6RS5zdGFydEF0P0duKEUuc3RhcnRBdCk6Ik5vbmUifSkpKSxrKGAke3kubGVuZ3RofSByZWxldmFudCBwZW5kaW5nIHRhc2tzIGZvdW5kICh3aXRoIHN0YXJ0QXQpYCk7bGV0IGI9dmgoeSxXYyksaD1PYmplY3Qua2V5cyhiKS5zb3J0KCkse3VwY29taW5nRGF0ZUtleXM6U309aTIoaCx3KSx4PVt3LC4uLlNdO3JldHVybiBzMihiLHgpfSxbaV0pO3JldHVybiBrKGB1c2VEb21haW5UYXNrcyBpbml0aWFsaXplZCB3aXRoIGFjdGl2ZSBkb21haW4gJHtufSBpbiAke25ldyBEYXRlLWN9bXNgKSx7dGFza0RvbWFpbnM6ZSxhY3RpdmVUYXNrRG9tYWluOm4sdGFza3NGZXRjaGVkQXQ6cixvcGVuVGFza3M6aSxjb21wbGV0ZWRUYXNrczpsLGluaXRpYWxpemVEb21haW5UYXNrczp1LG9uRG9tYWluQ2hhbmdlOnAsYnVpbGRBZ2VuZGFUYXNrc0J5RGF0ZTpmfX12YXIgXzE9TChtZSgpKTt2YXIgdm49TChYKCkpLEwxPSJsYXlvdXQtcGlja2VyIjthc3luYyBmdW5jdGlvbiB3aCh7YXBwOmUsaXNSZXNldDp0LG9uTGF5b3V0UGVyc2lzdDpuLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOm8scHJvZmlsZUlkOnIsc2l6aW5nOmEsd2lkZ2V0SWRzOml9KXthd2FpdCBuKGksdCxhKSxyIT1udWxsPyhlLnNldFNldHRpbmcoQi5TRUxFQ1RFRF9MQVlPVVRfUFJPRklMRSxyKSxvKHIpKTpyPT09bnVsbCYmKGUuc2V0U2V0dGluZyhCLlNFTEVDVEVEX0xBWU9VVF9QUk9GSUxFLCIiKSxvKG51bGwpKX1mdW5jdGlvbiBsMih7cHJvZmlsZTplLG9uQXBwbHk6dCxhcHBseWluZ0lkOm4saXNNYXRjaDpvfSl7bGV0IHI9bj09PWUuaWQsYT0hIW4saT1yPyJBcHBseWluZ1x1MjAyNiI6bz8iQXBwbHkiOiJBcHBseSBcdTIwMTQgcmVwbGFjZXMgYWxsIHdpZGdldHMgXHUyMTkyIixzPWBsYXlvdXQtcGlja2VyLXByb2ZpbGUtYnV0dG9uJHtyPyIgbGF5b3V0LXBpY2tlci1wcm9maWxlLWJ1dHRvbi0tYXBwbHlpbmciOiIifSR7bz8iIGxheW91dC1waWNrZXItcHJvZmlsZS1idXR0b24tLWN1cnJlbnQiOiIifWAsbD1gbGF5b3V0LXBpY2tlci1wcm9maWxlLWFjdGlvbiR7bz8iIGxheW91dC1waWNrZXItcHJvZmlsZS1hY3Rpb24tLWN1cnJlbnQiOiIifWA7cmV0dXJuKDAsdm4uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUiLGNoaWxkcmVuOigwLHZuLmpzeHMpKCJidXR0b24iLHtjbGFzc05hbWU6cyxkaXNhYmxlZDphLG9uQ2xpY2s6KCk9PnQoZSksdHlwZToiYnV0dG9uIixjaGlsZHJlbjpbKDAsdm4uanN4cykoImRpdiIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlLWhlYWRlciIsY2hpbGRyZW46WygwLHZuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6ImxheW91dC1waWNrZXItcHJvZmlsZS1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIixjaGlsZHJlbjplLmljb259KSwoMCx2bi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUtbmFtZSIsY2hpbGRyZW46ZS5uYW1lfSksKDAsdm4uanN4KSgic3BhbiIse2NsYXNzTmFtZTpsLGNoaWxkcmVuOml9KV19KSwoMCx2bi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUtZGVzY3JpcHRpb24iLGNoaWxkcmVuOmUuZGVzY3JpcHRpb259KV19KX0pfWZ1bmN0aW9uIGtoKHthcHA6ZSxjdXJyZW50TGF5b3V0OnQsb25MYXlvdXRBcHBseTpuLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOm99KXtsZXRbcixhXT0oMCxfMS51c2VTdGF0ZSkobnVsbCksaT1aYS5tYXAodT0+V2IodCx1KSkscz1pLnNvbWUoQm9vbGVhbiksbD1hc3luYyB1PT57aWYoIXIpe2EodS5pZCk7dHJ5e2xldCBwPXUud2lkZ2V0cy5tYXAobT0+bS53aWRnZXRJZCksZj1icyh1KTthd2FpdCB3aCh7YXBwOmUsaXNSZXNldDohMCxvbkxheW91dFBlcnNpc3Q6bixvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpvLHByb2ZpbGVJZDp1LmlkLHNpemluZzpmLHdpZGdldElkczpwfSl9ZmluYWxseXthKG51bGwpfX19O3JldHVybigwLHZuLmpzeHMpKHJlLHtoZWFkZXJBY3Rpb25zOigwLHZuLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOigpPT57bGV0IHA9KEFycmF5LmlzQXJyYXkodCk/dDpbXSkuZmlsdGVyKGY9PmYud2lkZ2V0SWQhPT1MMSkubWFwKGY9PmYud2lkZ2V0SWQpO24ocCwhMSxudWxsKX0sY2hpbGRyZW46Ilx1MjcxNSBEaXNtaXNzIn0pLHdpZGdldElkOkwxLGNoaWxkcmVuOltzP251bGw6KDAsdm4uanN4KSgicCIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci13YXJuaW5nIixjaGlsZHJlbjoiXHUyNkEwXHVGRTBGIENsaWNraW5nIGEgcHJvZmlsZSByZW9yZGVycyBhbGwgZGFzaGJvYXJkIHdpZGdldHMuIn0pLCgwLHZuLmpzeCkoImRpdiIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlcyIsY2hpbGRyZW46WmEubWFwKCh1LHApPT4oMCx2bi5qc3gpKGwyLHtwcm9maWxlOnUsb25BcHBseTpsLGFwcGx5aW5nSWQ6cixpc01hdGNoOmlbcF19LHUuaWQpKX0pXX0pfXZhciB3aT1MKG1lKCkpO3ZhciBCYz1MKFgoKSksZDI9IjQwMHB4IDBweCI7ZnVuY3Rpb24gYzIoKXtyZXR1cm4gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPCJ1In1mdW5jdGlvbiB1Mih7cGxhY2Vob2xkZXJSZWY6ZSx3aWRnZXRJZDp0fSl7cmV0dXJuIHprKHQpLCgwLEJjLmpzeCkoImRpdiIse3JlZjplLGNsYXNzTmFtZToibGF6eS13aWRnZXQtcGxhY2Vob2xkZXIiLCJkYXRhLXdpZGdldC1pZCI6dCwiYXJpYS1oaWRkZW4iOiJ0cnVlIixjaGlsZHJlbjooMCxCYy5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Imxhenktd2lkZ2V0LXBsYWNlaG9sZGVyLXNwaW5uZXIifSl9KX1mdW5jdGlvbiB4aCh7Y2hpbGRyZW46ZSx3aWRnZXRJZDp0fSl7bGV0W24sb109KDAsd2kudXNlU3RhdGUpKCgpPT4hYzIoKSkscj0oMCx3aS51c2VSZWYpKG51bGwpO3JldHVybigwLHdpLnVzZUVmZmVjdCkoKCk9PntpZihuKXJldHVybjtsZXQgYT1yLmN1cnJlbnQ7aWYoIWEpcmV0dXJuO2xldCBpPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihzPT57cy5zb21lKGw9PmwuaXNJbnRlcnNlY3RpbmcpJiYobyghMCksaS5kaXNjb25uZWN0KCkpfSx7cm9vdE1hcmdpbjpkMn0pO3JldHVybiBpLm9ic2VydmUoYSksKCk9PmkuZGlzY29ubmVjdCgpfSxbbl0pLG4/ZTooMCxCYy5qc3gpKHUyLHtwbGFjZWhvbGRlclJlZjpyLHdpZGdldElkOnR9KX12YXIgZnQ9TChtZSgpKTt2YXIgUmU9TChYKCkpLHAyPTVlMyxIMT03LGYyPTMsR2U9MjIwLEsxPTE0LEcxPTIsbTI9NCxoMj03OCxnMj00MCxVMT00LHkyPTQ4LHYyPTk1LGIyPTE2LHcyPS4wNCxrMj0xMix4Mj0xMixGMT0uNSxTMj0xLjgsRTI9LTQsTjI9NSx6MT0uNyxUMj0zLjMsRDI9MTgsQTI9MjIsQzI9LTUsTTI9MTEsTzI9MTMsSTI9MjYsUjI9MTAsUDI9MzAsTDI9NDQsXzI9NSxIYz0xLzMsVTI9MS4zLEYyPVtbMCwiIzI3QUU2MDUwIl0sWy41LCIjRjJDOTRDMjAiXSxbMSwiI0U4NDUzQzA4Il1dLHoyPTIsVzI9My41LEIyPTEuMixIMj04LFcxPS4zLEsyPTIsRzI9MSxWMj0xNixqMj0yOCxCMT0uNyxZMj0zLHEyPS0xMSwkMj0xNCxYMj01NixKMj00NixRMj0xNixaMj04LGVQPTMzLHRQPTEyLG5QPS4yNSxvUD0uNzUsclA9MjUsYVA9MTIwMCxpUD0xZTMsVjE9MyxLYz1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYzNX1cdTIwMERcdXsxRjRBQn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUZBRTR9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjQyfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2MDB9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjkyOX0iLGxhYmVsOiJHcmVhdCJ9XSxzUD17Ii0yIjoiI0U4NDUzQyIsIi0xIjoiI0YyOTk0QSIsMDoiI0YyQzk0QyIsMToiIzZGQ0Y5NyIsMjoiIzI3QUU2MCJ9LGxQPU9iamVjdC5mcm9tRW50cmllcyhLYy5tYXAoZT0+W2UudmFsdWUsZS5lbW9qaV0pKTtmdW5jdGlvbiBraShlKXtyZXR1cm4gc1BbTWF0aC5yb3VuZChlKV18fCIjY2NjIn1mdW5jdGlvbiBqMShlKXtyZXR1cm4gbFBbTWF0aC5yb3VuZChlKV18fCJcdTI3NTMifWZ1bmN0aW9uIGRQKGUpe2xldCB0PUtjLmZpbmQobj0+bi52YWx1ZT09PWUpO3JldHVybiB0P3QubGFiZWw6IiJ9ZnVuY3Rpb24gWTEoZSl7aWYoIWUpcmV0dXJuIiI7bGV0e2Z1bGxEYXRlOnQsZW50cmllczpufT1lLG89W2A8ZGl2IGNsYXNzPSJtb29kLXZpei10b29sdGlwLWRhdGUiPiR7dH08L2Rpdj5gXTtmb3IobGV0IHIgb2Ygbil7bGV0IGE9S2MuZmluZChsPT5sLnZhbHVlPT09ci5yYXRpbmcpPy5lbW9qaXx8Ilx1Mjc1MyIsaT1kUChyLnJhdGluZykscz1gPGRpdiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1lbnRyeSI+PHNwYW4gY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtdGltZSI+JHtyLnRpbWV9PC9zcGFuPjxzcGFuIGNsYXNzPSJtb29kLXZpei10b29sdGlwLW1vb2QiPiR7YX0gPHNwYW4gY2xhc3M9Im1vb2Qtdml6LWxhYmVsIj4ke2l9ICgke3IucmF0aW5nPjA/YCske3IucmF0aW5nfWA6ci5yYXRpbmd9KTwvc3Bhbj48L3NwYW4+YDtyLm5vdGVzJiYocys9YDxkaXYgY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtbm90ZSI+JHtyLm5vdGVzfTwvZGl2PmApLHMrPSI8L2Rpdj4iLG8ucHVzaChzKX1yZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBjUChlLHQsbixvKXt0fHxufHxvKGUpfWZ1bmN0aW9uIHVQKGUsdCxuLG8scixhLGkpe3Qua2V5PT09IkVudGVyIiYmKHQuY3RybEtleXx8dC5tZXRhS2V5KSYmKHQucHJldmVudERlZmF1bHQoKSxxMShlLG4sbyxyLGEsaSkpfWFzeW5jIGZ1bmN0aW9uIHExKGUsdCxuLG8scixhKXtvKCEwKSxrKCJSZWNvcmRpbmcgbW9vZCByYXRpbmcgd2l0aCB2YWx1ZToiLHQudmFsdWUpO2xldCBpPWF3YWl0IGUucmVjb3JkTW9vZFJhdGluZyh0LnZhbHVlKTtCZSgic3VibWl0TW9vZFJhdGluZyIse3JhdGluZzp0LnZhbHVlfSk7bGV0IHM9bi50cmltKCk7ayhgTW9vZCByYXRpbmcgdXVpZCAke2l9IHJlY2VpdmVkLCB0cmltbWVkIG5vdGVzIHNpemUgJHtzLmxlbmd0aH0gY2hhcmFjdGVyc2ApLHMmJihhd2FpdCBlLnVwZGF0ZU1vb2RSYXRpbmcoaSx7bm90ZTpzfSksayhgTW9vZCByYXRpbmcgdXVpZCAke2l9IHVwZGF0ZWQgd2l0aCBub3Rlc2ApKSxyKCEwKSxhPyhrKCJSZXRyaWV2ZWQgbW9vZCByYXRpbmcgVVVJRDoiLGksImNhbGxpbmcgb25Nb29kUmVjb3JkZWQiKSxhKHtyYXRpbmc6dC52YWx1ZSx0aW1lc3RhbXA6TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyksbm90ZTpzfHxudWxsfSksaygib25Nb29kUmVjb3JkZWQgY2FsbGJhY2sgY29tcGxldGUiKSk6aygib25Nb29kUmVjb3JkZWQgY2FsbGJhY2sgbm90IHByb3ZpZGVkLCBza2lwcGluZyIpLG8oITEpfWZ1bmN0aW9uIHBQKGUpe2xldCB0PShlfHxbXSkuc2xpY2UoLUgxKTtpZighdC5sZW5ndGgpcmV0dXJue3JlY2VudE1vb2RzOnQsYXZlcmFnZU1vb2Q6Ilx1MjAxNCJ9O2xldCBuPSh0LnJlZHVjZSgobyxyKT0+bytyLnJhdGluZywwKS90Lmxlbmd0aCkudG9GaXhlZCgxKTtyZXR1cm57cmVjZW50TW9vZHM6dCxhdmVyYWdlTW9vZDpufX1mdW5jdGlvbiAkMSgpe2xldCBlPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSx0PW49PmUuZ2V0UHJvcGVydHlWYWx1ZShuKS50cmltKCk7cmV0dXJue2JnQ2FyZDp0KCItLWRhc2hib2FyZC1jb2xvci1iZy1jYXJkIiksYmdQYWdlOnQoIi0tZGFzaGJvYXJkLWNvbG9yLWJnLXBhZ2UiKSxib3JkZXI6dCgiLS1kYXNoYm9hcmQtY29sb3ItYm9yZGVyIiksdGV4dFNlY29uZGFyeTp0KCItLWRhc2hib2FyZC1jb2xvci10ZXh0LXNlY29uZGFyeSIpLHRleHRNdXRlZDp0KCItLWRhc2hib2FyZC1jb2xvci10ZXh0LW11dGVkIil9fWZ1bmN0aW9uIFNoKGUsdCl7cmV0dXJuIGUuc3RhcnRzV2l0aCgiIyIpJiZlLmxlbmd0aD09PTc/ZSt0OmV9ZnVuY3Rpb24gZlAoe21vb2REYXRhOmV9KXtsZXQgdD0oMCxmdC51c2VSZWYpKG51bGwpLG49KDAsZnQudXNlUmVmKShudWxsKSxbbyxyXT0oMCxmdC51c2VTdGF0ZSkoMCksYT1IcygpLGk9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuKDAsZnQudXNlRWZmZWN0KSgoKT0+e3IoMCk7bGV0IGQsYz1udWxsLHU9YVAscD1mPT57Y3x8KGM9Zik7bGV0IG09TWF0aC5taW4oKGYtYykvdSwxKSxnPTEtTWF0aC5wb3coMS1tLFYxKTtyKGcpLG08MSYmKGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHApKX07cmV0dXJuIGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHApLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShkKX0sW2ldKSwoMCxmdC51c2VFZmZlY3QpKCgpPT57bGV0IGQ9dC5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgYz1kLmdldENvbnRleHQoIjJkIiksdT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8RzE7ZC53aWR0aD1HZSp1LGQuaGVpZ2h0PUdlKnUsYy5zY2FsZSh1LHUpLGMuY2xlYXJSZWN0KDAsMCxHZSxHZSk7bGV0IHA9JDEoKSxmPUdlLzIsbT1HZS8yK20yLGc9aDIsdz1nMjtjLmZpbGxTdHlsZT1wLmJnQ2FyZCxjLmJlZ2luUGF0aCgpLGMucm91bmRSZWN0KDAsMCxHZSxHZSxLMSksYy5maWxsKCksYy5zdHJva2VTdHlsZT1TaChwLmJvcmRlciwiMjgiKSxjLmxpbmVXaWR0aD0xO2ZvcihsZXQgUz15MjtTPD12MjtTKz1iMiljLmJlZ2luUGF0aCgpLGMuYXJjKGYsbSxTLDAsTWF0aC5QSSoyKSxjLnN0cm9rZSgpO2xldCB2PWUubWFwKFM9Pih7bGFiZWw6Uy5kYXlMYWJlbCxkYXRlTGFiZWw6Uy5kYXRlTGFiZWwsdmFsOlMucmF0aW5nfSkpLHk9TWF0aC5tYXgodi5sZW5ndGgsMSksYj1NYXRoLlBJKjIveSxoPXYubGVuZ3RoPjE/dzI6MDtpZihuLmN1cnJlbnQ9e2NlbnRlclg6ZixjZW50ZXJZOm0saW5uZXJSYWRpdXM6dyxvdXRlclJhZGl1czpnLHNlZ21lbnRDb3VudDp2Lmxlbmd0aCxzZWdtZW50QW5nbGU6YixnYXBBbmdsZTpofSx2LmZvckVhY2goKHtsYWJlbDpTLGRhdGVMYWJlbDp4LHZhbDpFfSxUKT0+e2xldCBBPS1NYXRoLlBJLzIrVCpiK2gsQz1BKyhiLWgqMikqbyxPPWtpKEUpO2Muc2hhZG93Q29sb3I9TyxjLnNoYWRvd0JsdXI9azIqbyxjLmJlZ2luUGF0aCgpLGMuYXJjKGYsbSxnLEEsQyksYy5hcmMoZixtLHcsQyxBLCEwKSxjLmNsb3NlUGF0aCgpO2xldCBQPWMuY3JlYXRlUmFkaWFsR3JhZGllbnQoZixtLHcsZixtLGcpO2lmKFAuYWRkQ29sb3JTdG9wKDAsTysiOTkiKSxQLmFkZENvbG9yU3RvcCgxLE8rImZmIiksYy5maWxsU3R5bGU9UCxjLmZpbGwoKSxjLnNoYWRvd0JsdXI9MCxvPkYxKXtsZXQgVT1BKyhiLWgqMikvMixJPWcreDIsSD1mK01hdGguY29zKFUpKkksXz1tK01hdGguc2luKFUpKkk7Yy5maWxsU3R5bGU9cC50ZXh0U2Vjb25kYXJ5LGMuZ2xvYmFsQWxwaGE9KG8tRjEpKlMyLGMuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsYy5maWxsVGV4dChTLEgsXytFMiksYy5mb250PSI3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsU3R5bGU9cC50ZXh0TXV0ZWQsYy5maWxsVGV4dCh4LEgsXytOMiksYy5nbG9iYWxBbHBoYT0xfWlmKG8+ejEpe2xldCBVPUErKGItaCoyKS8yLEk9KGcrdykvMixIPWYrTWF0aC5jb3MoVSkqSSxfPW0rTWF0aC5zaW4oVSkqSTtjLmZvbnQ9IjEzcHggc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGMuZ2xvYmFsQWxwaGE9TWF0aC5taW4oKG8tejEpKlQyLDEpLGMuZmlsbFRleHQoajEoRSksSCxfKSxjLmdsb2JhbEFscGhhPTF9fSksYy5iZWdpblBhdGgoKSxjLmFyYyhmLG0sdy1VMSwwLE1hdGguUEkqMiksYy5maWxsU3R5bGU9cC5iZ1BhZ2UsYy5maWxsKCksdi5sZW5ndGg+MCl7bGV0IFM9KHYucmVkdWNlKCh4LEUpPT54K0UudmFsLDApL3YubGVuZ3RoKS50b0ZpeGVkKDEpO2MuZmlsbFN0eWxlPWtpKE1hdGgucm91bmQoTnVtYmVyKFMpKSksYy5mb250PWBib2xkICR7QTJ9cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZmAsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsYy5nbG9iYWxBbHBoYT1vLGMuZmlsbFRleHQoUyxmLG0rQzIpLGMuZmlsbFN0eWxlPXAudGV4dE11dGVkLGMuZm9udD0iYm9sZCA3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsVGV4dCgiNy1EQVkgQVZHIixmLG0rTTIpLGMuZ2xvYmFsQWxwaGE9MX1jLmZpbGxTdHlsZT1wLnRleHRNdXRlZCxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixjLmZpbGxUZXh0KCJXIEUgRSBLICAgUiBJIE4gRyIsZixPMil9LFtpLG9dKSwoMCxSZS5qc3gpKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixsaW5lSGVpZ2h0OjB9LGNoaWxkcmVuOigwLFJlLmpzeCkoImNhbnZhcyIse3JlZjp0LGNsYXNzTmFtZToibW9vZC12aXotY2FudmFzIixvbk1vdXNlTW92ZTpkPT57bGV0IGM9bi5jdXJyZW50LHU9dC5jdXJyZW50O2lmKCFjfHwhYy5zZWdtZW50Q291bnR8fCF1KXthLmhpZGUoKTtyZXR1cm59bGV0IHA9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPShkLmNsaWVudFgtcC5sZWZ0KSooR2UvcC53aWR0aCksbT0oZC5jbGllbnRZLXAudG9wKSooR2UvcC5oZWlnaHQpLGc9Zi1jLmNlbnRlclgsdz1tLWMuY2VudGVyWSx2PU1hdGguc3FydChnKmcrdyp3KTtpZih2PGMuaW5uZXJSYWRpdXMtVTF8fHY+Yy5vdXRlclJhZGl1cytEMil7YS5oaWRlKCk7cmV0dXJufWxldCB5PU1hdGguYXRhbjIodyxnKStNYXRoLlBJLzI7eTwwJiYoeSs9TWF0aC5QSSoyKTtsZXQgYj1NYXRoLmZsb29yKHkvYy5zZWdtZW50QW5nbGUpO2lmKGI+PTAmJmI8Yy5zZWdtZW50Q291bnQpe2xldCBoPWVbYl0sUz1wLmxlZnQrZi9HZSpwLndpZHRoLHg9cC50b3ArbS9HZSpwLmhlaWdodDthLnNob3coWTEoe2Z1bGxEYXRlOmguZnVsbERhdGUsZW50cmllczpoLmVudHJpZXN8fFtoXX0pLFMseCl9ZWxzZSBhLmhpZGUoKX0sb25Nb3VzZUxlYXZlOigpPT5hLmhpZGUoKX0pfSl9ZnVuY3Rpb24gbVAoe21vb2REYXRhOmV9KXtsZXQgdD0oMCxmdC51c2VSZWYpKG51bGwpLG49KDAsZnQudXNlUmVmKShbXSksW28scl09KDAsZnQudXNlU3RhdGUpKDApLGE9SHMoKSxpPUpTT04uc3RyaW5naWZ5KGUpO3JldHVybigwLGZ0LnVzZUVmZmVjdCkoKCk9PntyKDApO2xldCBkLGM9bnVsbCx1PWlQLHA9Zj0+e2N8fChjPWYpO2xldCBtPU1hdGgubWluKChmLWMpL3UsMSk7cigxLU1hdGgucG93KDEtbSxWMSkpLG08MSYmKGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHApKX07cmV0dXJuIGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHApLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShkKX0sW2ldKSwoMCxmdC51c2VFZmZlY3QpKCgpPT57bGV0IGQ9dC5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgYz1kLmdldENvbnRleHQoIjJkIiksdT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8RzE7ZC53aWR0aD1HZSp1LGQuaGVpZ2h0PUdlKnUsYy5zY2FsZSh1LHUpLGMuY2xlYXJSZWN0KDAsMCxHZSxHZSk7bGV0IHA9JDEoKTtjLmJlZ2luUGF0aCgpLGMucm91bmRSZWN0KDAsMCxHZSxHZSxLMSksYy5maWxsU3R5bGU9cC5iZ0NhcmQsYy5maWxsKCk7bGV0IGY9STIsbT1SMixnPVAyLHc9TDIsdj1HZS1mLW0seT1HZS1nLXcsYj1nK3k7Zm9yKGxldCBBPS0yO0E8PTI7QSsrKXtsZXQgQz1nK3ktKEErMikvNCp5O2Muc3Ryb2tlU3R5bGU9U2gocC5ib3JkZXIsIjUwIiksYy5saW5lV2lkdGg9MSxjLmJlZ2luUGF0aCgpLGMubW92ZVRvKGYsQyksYy5saW5lVG8oR2UtbSxDKSxjLnN0cm9rZSgpLGMuZmlsbFN0eWxlPXAudGV4dE11dGVkLGMuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249InJpZ2h0IixjLnRleHRCYXNlbGluZT0ibWlkZGxlIixjLmZpbGxUZXh0KEE+MD9gKyR7QX1gOkEsZi1fMixDKX1sZXQgaD1lLm1hcChBPT4oe2xhYmVsOkEuZGF5TGFiZWwsZGF0ZUxhYmVsOkEuZGF0ZUxhYmVsLHZhbDpBLnJhdGluZ30pKSxTPShBLEMpPT5DPT09MT9mK3YvMjpDPT09Mj9mK3YqKEE9PT0wP25QOm9QKTpmK0EvKEMtMSkqdix4PWgubWFwKChBLEMpPT4oe3g6UyhDLGgubGVuZ3RoKSx5OmcreS0oQS52YWwrMikvNCp5LHZhbDpBLnZhbCxsYWJlbDpBLmxhYmVsLGRhdGVMYWJlbDpBLmRhdGVMYWJlbH0pKTtuLmN1cnJlbnQ9eDtsZXQgRT14Lm1hcChBPT4oey4uLkEseTpnK3ktKEEudmFsKzIpLzQqeSpNYXRoLm1pbihvKlUyLDEpfSkpLFQ9KEEsQyk9PntjLmJlZ2luUGF0aCgpLGMubW92ZVRvKEFbMF0ueCxBWzBdLnkpO2ZvcihsZXQgTz0wO088QS5sZW5ndGgtMTtPKyspe2xldCBQPUFbTysxXS54LUFbT10ueCxVPUFbT10ueCtQKkhjLEk9QVtPKzFdLngtUCpIYztjLmJlemllckN1cnZlVG8oVSxBW09dLnksSSxBW08rMV0ueSxBW08rMV0ueCxBW08rMV0ueSl9QyYmKGMubGluZVRvKEFbQS5sZW5ndGgtMV0ueCxiKSxjLmxpbmVUbyhBWzBdLngsYiksYy5jbG9zZVBhdGgoKSl9O2lmKEUubGVuZ3RoPj0yKXtsZXQgQT1jLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsZywwLGIpO2ZvcihsZXRbQyxPXW9mIEYyKUEuYWRkQ29sb3JTdG9wKEMsTyk7VChFLCEwKSxjLmZpbGxTdHlsZT1BLGMuZmlsbCgpLGMubGluZVdpZHRoPXoyLGMubGluZUNhcD0icm91bmQiO2ZvcihsZXQgQz0wO0M8RS5sZW5ndGgtMTtDKyspe2xldCBPPUVbQ10sUD1FW0MrMV0sVT1jLmNyZWF0ZUxpbmVhckdyYWRpZW50KE8ueCxPLnksUC54LFAueSk7VS5hZGRDb2xvclN0b3AoMCxraShPLnZhbCkpLFUuYWRkQ29sb3JTdG9wKDEsa2koUC52YWwpKSxjLnN0cm9rZVN0eWxlPVUsYy5iZWdpblBhdGgoKTtsZXQgST1QLngtTy54LEg9Ty54K0kqSGMsXz1QLngtSSpIYztjLm1vdmVUbyhPLngsTy55KSxjLmJlemllckN1cnZlVG8oSCxPLnksXyxQLnksUC54LFAueSksYy5zdHJva2UoKX19aWYobz5XMSYmRS5mb3JFYWNoKEE9PntsZXQgQz1NYXRoLm1pbigoby1XMSkqSzIsMSksTz1raShBLnZhbCk7Yy5zaGFkb3dDb2xvcj1PLGMuc2hhZG93Qmx1cj1IMixjLmJlZ2luUGF0aCgpLGMuYXJjKEEueCxBLnksVzIsMCxNYXRoLlBJKjIpLGMuZmlsbFN0eWxlPU8sYy5nbG9iYWxBbHBoYT1DLGMuZmlsbCgpLGMuc2hhZG93Qmx1cj0wLGMuYmVnaW5QYXRoKCksYy5hcmMoQS54LEEueSxCMiwwLE1hdGguUEkqMiksYy5maWxsU3R5bGU9cC5iZ0NhcmQsYy5maWxsKCksYy5nbG9iYWxBbHBoYT0xLGMuZmlsbFN0eWxlPXAudGV4dFNlY29uZGFyeSxjLmdsb2JhbEFscGhhPUMqRzIsYy5mb250PSJib2xkIDEwcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy50ZXh0QWxpZ249ImNlbnRlciIsYy50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGMuZmlsbFRleHQoQS5sYWJlbCxBLngsYitWMiksYy5mb250PSI5cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsYy5maWxsVGV4dChBLmRhdGVMYWJlbCxBLngsYitqMiksYy5nbG9iYWxBbHBoYT0xLG8+QjEmJihjLmdsb2JhbEFscGhhPU1hdGgubWluKChvLUIxKSpZMiwxKSxjLmZvbnQ9IjExcHggc2VyaWYiLGMuZmlsbFRleHQoajEoQS52YWwpLEEueCxBLnkrcTIpLGMuZ2xvYmFsQWxwaGE9MSl9KSxjLmZpbGxTdHlsZT1wLnRleHRNdXRlZCxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixjLmZpbGxUZXh0KCJNIE8gTyBEICAgVyBBIFYgRSIsR2UvMiwkMiksaC5sZW5ndGg+MCl7bGV0IEE9KGgucmVkdWNlKChPLFApPT5PK1AudmFsLDApL2gubGVuZ3RoKS50b0ZpeGVkKDEpLEM9a2koTWF0aC5yb3VuZChOdW1iZXIoQSkpKTtjLmZpbGxTdHlsZT1TaChDLCIyMiIpLGMuYmVnaW5QYXRoKCksYy5yb3VuZFJlY3QoR2UtWDIsNCxKMixRMixaMiksYy5maWxsKCksYy5maWxsU3R5bGU9QyxjLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGMudGV4dEFsaWduPSJjZW50ZXIiLGMudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGMuZmlsbFRleHQoYEF2ZyAke0F9YCxHZS1lUCx0UCl9fSxbaSxvXSksKDAsUmUuanN4KSgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGluZUhlaWdodDowfSxjaGlsZHJlbjooMCxSZS5qc3gpKCJjYW52YXMiLHtyZWY6dCxjbGFzc05hbWU6Im1vb2Qtdml6LWNhbnZhcyIsb25Nb3VzZU1vdmU6ZD0+e2xldCBjPXQuY3VycmVudDtpZighYylyZXR1cm47bGV0IHU9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwPShkLmNsaWVudFgtdS5sZWZ0KSooR2UvdS53aWR0aCksZj0oZC5jbGllbnRZLXUudG9wKSooR2UvdS5oZWlnaHQpLG09bi5jdXJyZW50O2lmKCFtfHwhbS5sZW5ndGgpe2EuaGlkZSgpO3JldHVybn1sZXQgZz0tMSx3PXJQO2ZvcihsZXQgdj0wO3Y8bS5sZW5ndGg7disrKXtsZXQgeT1wLW1bdl0ueCxiPWYtbVt2XS55LGg9TWF0aC5zcXJ0KHkqeStiKmIpO2g8dyYmKHc9aCxnPXYpfWlmKGc+PTApe2xldCB2PW1bZ10seT1lW2ddLGI9dS5sZWZ0K3YueC9HZSp1LndpZHRoLGg9dS50b3Ardi55L0dlKnUuaGVpZ2h0O2Euc2hvdyhZMSh7ZnVsbERhdGU6eS5mdWxsRGF0ZSxlbnRyaWVzOnkuZW50cmllc3x8W3ldfSksYixoKX1lbHNlIGEuaGlkZSgpfSxvbk1vdXNlTGVhdmU6KCk9PmEuaGlkZSgpfSl9KX1mdW5jdGlvbiBoUChlKXtsZXQgdD1bIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG49Wy4uLmV8fFtdXS5zb3J0KChhLGkpPT4oYS50aW1lc3RhbXB8fDApLShpLnRpbWVzdGFtcHx8MCkpO2lmKG4ubGVuZ3RoKWNvbnNvbGUubG9nKCJGb3VuZCBleGlzdGluZyByYXRpbmdzIik7ZWxzZSByZXR1cm4gY29uc29sZS5sb2coIk5vIHJhdGluZ3MgZm91bmQsIHJldHVybmluZyBbXSIpLFtdO2xldCBvPW5ldyBNYXA7Zm9yKGxldCBhIG9mIG4pe2xldCBpPWEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUscz1gJHtpLmdldEZ1bGxZZWFyKCl9LSR7aS5nZXRNb250aCgpKzF9LSR7aS5nZXREYXRlKCl9YDtvLmhhcyhzKXx8by5zZXQocyx7ZGF5TGFiZWw6dFtpLmdldERheSgpXSxkYXRlTGFiZWw6YCR7aS5nZXRNb250aCgpKzF9LyR7aS5nZXREYXRlKCl9YCxkYXRlS2V5OnMsZnVsbERhdGU6aS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToibG9uZyIseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KSxlbnRyaWVzOltdLHJhdGluZ1N1bTowLHJhdGluZ0NvdW50OjB9KTtsZXQgbD1vLmdldChzKTtsLmVudHJpZXMucHVzaCh7cmF0aW5nOmEucmF0aW5nLHRpbWU6KGEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUpLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLHtob3VyOiJudW1lcmljIixtaW51dGU6IjItZGlnaXQifSksbm90ZXM6YS5ub3Rlc3x8YS5ub3RlfHxudWxsLHRpbWVzdGFtcDphLnRpbWVzdGFtcH0pLGwucmF0aW5nU3VtKz1hLnJhdGluZyxsLnJhdGluZ0NvdW50Kz0xfXJldHVyblsuLi5vLnZhbHVlcygpXS5zbGljZSgtSDEpLm1hcChhPT4oe3JhdGluZzphLnJhdGluZ1N1bS9hLnJhdGluZ0NvdW50LGRheUxhYmVsOmEuZGF5TGFiZWwsZGF0ZUxhYmVsOmEuZGF0ZUxhYmVsLGRhdGVLZXk6YS5kYXRlS2V5LGZ1bGxEYXRlOmEuZnVsbERhdGUsdGltZTphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lLHRpbWVzdGFtcDphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lc3RhbXAsbm90ZXM6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0ubm90ZXMsZW50cmllczphLmVudHJpZXN9KSl9ZnVuY3Rpb24gZ1Aoe21vb2RSYXRpbmdzOmUsYXZlcmFnZU1vb2Q6dCx2aXN1YWxpemF0aW9uTW9kZTpuLHZpc3VhbGl6YXRpb25LZXk6byxvbkNvbmZpZ3VyZTpyfSl7aWYoIShlfHxbXSkubGVuZ3RoKXJldHVybigwLFJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC1zdW1tYXJ5IixjaGlsZHJlbjooMCxSZS5qc3gpKCJzcGFuIix7Y2hpbGRyZW46IkF2ZyBtb29kICg3ZCk6ICIrdH0pfSk7bGV0IGE9aFAoZSk7cmV0dXJuKDAsUmUuanN4cykoImRpdiIse2NsYXNzTmFtZToibW9vZC12aXotc2VjdGlvbiIsY2hpbGRyZW46WygwLFJlLmpzeCkoImRpdiIse2NsYXNzTmFtZToibW9vZC12aXotY2FudmFzLXdyYXAiLGNoaWxkcmVuOm49PT0id2F2ZSI/KDAsUmUuanN4KShtUCx7bW9vZERhdGE6YX0sbyk6KDAsUmUuanN4KShmUCx7bW9vZERhdGE6YX0sbyl9KSwoMCxSZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZ3VyZS1saW5rIixvbkNsaWNrOnIsY2hpbGRyZW46Ilx1MjY5OSBDb25maWd1cmUifSldfSl9ZnVuY3Rpb24gRWgoe2FwcDplLG1vb2RSYXRpbmdzOnQsb25Nb29kUmVjb3JkZWQ6bn0pe2xldFtvLHJdPSgwLGZ0LnVzZVN0YXRlKShudWxsKSxbYSxpXT0oMCxmdC51c2VTdGF0ZSkoIiIpLFtzLGxdPSgwLGZ0LnVzZVN0YXRlKSghMSksW2QsY109KDAsZnQudXNlU3RhdGUpKCExKSxwPWVpKF9lKCksIm1vb2QiKVswXXx8InJpbmciLFtmLG1dPSgwLGZ0LnVzZVN0YXRlKShwKSxbZyx3XT0oMCxmdC51c2VTdGF0ZSkocCksW3YseV09KDAsZnQudXNlU3RhdGUpKDApLFtiLGhdPSgwLGZ0LnVzZVN0YXRlKSghMSk7KDAsZnQudXNlRWZmZWN0KSgoKT0+e2lmKCFkKXJldHVybjtrKCJTZXR0aW5nIHRpbWVvdXQgdG8gcmVzZXQgbW9vZCBjb21wb25lbnQgYWZ0ZXIgc3VibWlzc2lvbiIpO2xldCBQPXNldFRpbWVvdXQoKCk9PntjKCExKSxyKG51bGwpLGkoIiIpfSxwMik7cmV0dXJuKCk9PmNsZWFyVGltZW91dChQKX0sW2RdKTtsZXQgUz0oKT0+e3coZiksaCghMCl9LHg9KCk9PnttKGcpLHkoUD0+UCsxKSxoKCExKSxlLnNldFNldHRpbmcoam8oIm1vb2QiKSxKU09OLnN0cmluZ2lmeShbZ10pKX0sRT0oKT0+e3coZiksaCghMSl9LFQ9KCk9PntyKG51bGwpLGkoIiIpfSx7YXZlcmFnZU1vb2Q6QX09cFAodCksQz0oMCxSZS5qc3gpKGdQLHttb29kUmF0aW5nczp0LGF2ZXJhZ2VNb29kOkEsdmlzdWFsaXphdGlvbk1vZGU6Zix2aXN1YWxpemF0aW9uS2V5OnYsb25Db25maWd1cmU6U30pLE89Yj8oMCxSZS5qc3gpKG1vLHt0aXRsZToiTW9vZCBWaXN1YWxpemF0aW9uIixvblN1Ym1pdDp4LG9uQ2FuY2VsOkUsc3VibWl0TGFiZWw6IkFwcGx5IixjaGlsZHJlbjooMCxSZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQiLGNoaWxkcmVuOlsoMCxSZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCIsY2hpbGRyZW46IkRpc3BsYXkgc3R5bGUifSksW1sicmluZyIsIlJpbmciXSxbIndhdmUiLCJXYXZlIl1dLm1hcCgoW1AsVV0pPT4oMCxSZS5qc3hzKSgibGFiZWwiLHtjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZy1vcHRpb24iLGNoaWxkcmVuOlsoMCxSZS5qc3gpKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJtb29kLXZpei1tb2RlIix2YWx1ZTpQLGNoZWNrZWQ6Zz09PVAsb25DaGFuZ2U6KCk9PncoUCl9KSxVXX0sUCkpXX0pfSk6bnVsbDtyZXR1cm4gZD8oMCxSZS5qc3hzKShyZSx7d2lkZ2V0SWQ6Im1vb2QiLGNoaWxkcmVuOltPLCgwLFJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2QtY29uZmlybWF0aW9uIixjaGlsZHJlbjpbKDAsUmUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWNvbmZpcm1hdGlvbi1pY29uIixjaGlsZHJlbjpvLmVtb2ppfSksKDAsUmUuanN4KSgicCIse2NsYXNzTmFtZToibW9vZC1jb25maXJtYXRpb24tdGV4dCIsY2hpbGRyZW46Ik1vb2QgcmF0aW5nIHJlY29yZGVkIn0pXX0pLENdfSk6KDAsUmUuanN4cykocmUse3dpZGdldElkOiJtb29kIixjaGlsZHJlbjpbTywoMCxSZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc2VsZWN0b3IiLGNoaWxkcmVuOktjLm1hcChQPT4oMCxSZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6Im1vb2QtYnRuIisobz8udmFsdWU9PT1QLnZhbHVlPyIgbW9vZC1idG4tLXNlbGVjdGVkIjoiIiksdGl0bGU6UC5sYWJlbCxvbkNsaWNrOigpPT5jUChQLHMsZCxyKSxjaGlsZHJlbjooMCxSZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJtb29kLWVtb2ppIixjaGlsZHJlbjpQLmVtb2ppfSl9LFAudmFsdWUpKX0pLG8hPT1udWxsJiYoMCxSZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWRldGFpbHMiLGNoaWxkcmVuOlsoMCxSZS5qc3gpKCJsYWJlbCIse2NsYXNzTmFtZToibW9vZC1kZXRhaWxzLWxhYmVsIixjaGlsZHJlbjoiTW9yZSBkZXRhaWxzIChvcHRpb25hbCkifSksKDAsUmUuanN4KSgidGV4dGFyZWEiLHtjbGFzc05hbWU6Im1vb2QtZGV0YWlscy10ZXh0YXJlYSIsdmFsdWU6YSxvbkNoYW5nZTpQPT5pKFAudGFyZ2V0LnZhbHVlKSxvbktleURvd246UD0+dVAoZSxQLG8sYSxsLGMsbikscGxhY2Vob2xkZXI6IldoYXQncyBvbiB5b3VyIG1pbmQ/Iixyb3dzOmYyfSldfSksbyE9PW51bGwmJigwLFJlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc3VibWl0LXJvdyIsY2hpbGRyZW46WygwLFJlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1jYW5jZWwtYnRuIixvbkNsaWNrOlQsZGlzYWJsZWQ6cyxjaGlsZHJlbjoiQ2FuY2VsIn0pLCgwLFJlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1zdWJtaXQtYnRuIixvbkNsaWNrOigpPT5xMShlLG8sYSxsLGMsbiksZGlzYWJsZWQ6cyxjaGlsZHJlbjpzPyJSZWNvcmRpbmcuLi4iOiJTdWJtaXQifSldfSksbz09PW51bGwmJkNdfSl9dmFyIGhhPSJub3RlLXBlZWsiO2FzeW5jIGZ1bmN0aW9uIFgxKGUsdCl7bGV0IG49YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSk7dHlwZW9mIG4hPSJzdHJpbmciJiZrKCJbTm90ZVBlZWtdIGdldE5vdGVDb250ZW50IHJldHVybmVkIG5vIG1hcmtkb3duOiIsbik7bGV0IG89dHlwZW9mIG49PSJzdHJpbmciP246IiI7aWYoIW8udHJpbSgpKXJldHVybiIiO2xldCByPWF3YWl0IGUuaHRtbEZyb21Db250ZW50KG8pO2lmKHR5cGVvZiByIT0ic3RyaW5nInx8IXIpdGhyb3cgaygiW05vdGVQZWVrXSBodG1sRnJvbUNvbnRlbnQgcmV0dXJuZWQgbm8gSFRNTDoiLHIpLG5ldyBFcnJvcihyPy5lcnJvcnx8IlRoaXMgbm90ZSdzIGNvbnRlbnQgY291bGQgbm90IGJlIHJlbmRlcmVkIik7cmV0dXJuIHJ9ZnVuY3Rpb24gSjEoZSl7bGV0IHQ9ZWkoZSxoYSksW24sb109QXJyYXkuaXNBcnJheSh0KT90OltdO3JldHVybiFufHx0eXBlb2YgbiE9InN0cmluZyI/bnVsbDp7bm90ZU5hbWU6dHlwZW9mIG89PSJzdHJpbmciP286IiIsbm90ZVVVSUQ6bn19YXN5bmMgZnVuY3Rpb24gUTEoZSx0PW51bGwpe2xldCBuPXQ/YE5vdGUgUGVlayBpcyBjdXJyZW50bHkgc2hvd2luZyAiJHt0fSIuIENob29zZSB0aGUgbm90ZSB0byBzaG93IGluc3RlYWQuYDoiQ2hvb3NlIHRoZSBub3RlIHdob3NlIGNvbnRlbnRzIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhpcyBOb3RlIFBlZWsgd2lkZ2V0LiIsbz1hd2FpdCBlLnByb21wdChuLHtpbnB1dHM6W3tsYWJlbDoiTm90ZSIsdHlwZToibm90ZSJ9XX0pLHI9QXJyYXkuaXNBcnJheShvKT9vWzBdOm87cmV0dXJuIHI/LnV1aWQ/e25vdGVOYW1lOnIubmFtZXx8IiIsbm90ZVVVSUQ6ci51dWlkfTooaygiW05vdGVQZWVrXSBubyBub3RlIGNob3NlbiBmcm9tIHByb21wdDoiLG8pLG51bGwpfWFzeW5jIGZ1bmN0aW9uIFoxKGUse25vdGVOYW1lOnQsbm90ZVVVSUQ6bn0pe2xldCBvPVtuLHR8fCIiXTthd2FpdCBlLnNldFNldHRpbmcoam8oaGEpLEpTT04uc3RyaW5naWZ5KG8pKSx1byhqbyhoYSksbyksaygiW05vdGVQZWVrXSBzdG9yZWQgbm90ZSBzZWxlY3Rpb246IixvKX12YXIgeW89TChtZSgpKTt2YXIgWHQ9TChYKCkpLHlQPSJcdTI2OTkgQ29uZmlndXJlIjtmdW5jdGlvbiBlUyh7YXBwOmUsY2hpbGRyZW46dCxub3RlTmFtZTpuLG5vdGVVVUlEOm99KXtsZXQgcj1EYyhvKTtyZXR1cm4oMCxYdC5qc3gpKCJhIix7Y2xhc3NOYW1lOiJub3RlLXBlZWstdGl0bGUtbGluayIsaHJlZjpyLG9uQ2xpY2s6aT0+e2kucHJldmVudERlZmF1bHQoKSxlLm5hdmlnYXRlKHIpfSx0aXRsZTpgT3BlbiAiJHtufHwiVW50aXRsZWQifSJgLGNoaWxkcmVuOnR9KX1mdW5jdGlvbiB2UCh7YXBwOmUsbm90ZVVVSUQ6dH0pe2xldFtuLG9dPSgwLHlvLnVzZVN0YXRlKShudWxsKSxbcixhXT0oMCx5by51c2VTdGF0ZSkobnVsbCk7cmV0dXJuKDAseW8udXNlRWZmZWN0KSgoKT0+e2lmKG8obnVsbCksYShudWxsKSwhdClyZXR1cm47bGV0IGk9ITA7cmV0dXJuIFgxKGUsdCkudGhlbihzPT57aSYmKGEocyksayhgW05vdGVQZWVrXSByZW5kZXJlZCBub3RlICR7dH0gKCR7cy5sZW5ndGh9IGNoYXJzIG9mIEhUTUwpYCkpfSkuY2F0Y2gocz0+e2kmJihrKCJbTm90ZVBlZWtdIGZhaWxlZCB0byByZW5kZXIgbm90ZToiLHMpLG8ocy5tZXNzYWdlfHwiRmFpbGVkIHRvIGxvYWQgdGhpcyBub3RlIikpfSksKCk9PntpPSExfX0sW2UsdF0pLHtlcnJvcjpuLGh0bWw6cn19ZnVuY3Rpb24gYlAoe29uQ2hvb3NlOmV9KXtyZXR1cm4oMCxYdC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLXBlZWstY2hvb3NlciIsb25DbGljazplLHJvbGU6InByZXNlbnRhdGlvbiIsdGl0bGU6IkNob29zZSBhIG5vdGUiLGNoaWxkcmVuOlsoMCxYdC5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJub3RlLXBlZWstY2hvb3Nlci1pY29uIixjaGlsZHJlbjoiXHV7MUY0QzR9In0pLCgwLFh0LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6Im5vdGUtcGVlay1jaG9vc2VyLWxhYmVsIixjaGlsZHJlbjoiQ2hvb3NlIGEgbm90ZSB0byBkaXNwbGF5IGhlcmUifSksKDAsWHQuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLXBlZWstY2hvb3Nlci1idXR0b24iLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46eVB9KV19KX1mdW5jdGlvbiB3UCh7ZXJyb3I6ZSxodG1sOnQsb25DaG9vc2U6bixzZWxlY3Rpb246b30pe2xldCByPSgwLHlvLnVzZVJlZikobnVsbCk7cmV0dXJuKDAseW8udXNlRWZmZWN0KSgoKT0+e3QmJlduKHIuY3VycmVudCl9LFt0XSksbz9lPygwLFh0LmpzeCkoInAiLHtjbGFzc05hbWU6Im5vdGUtZXJyb3IiLGNoaWxkcmVuOmBFcnJvcjogJHtlfWB9KTp0PT09bnVsbD8oMCxYdC5qc3gpKCJwIix7Y2xhc3NOYW1lOiJub3RlLWxvYWRpbmciLGNoaWxkcmVuOiJMb2FkaW5nXHUyMDI2In0pOnQ9PT0iIj8oMCxYdC5qc3gpKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVtcHR5IixjaGlsZHJlbjoiVGhpcyBub3RlIGhhcyBubyBjb250ZW50IHlldC4ifSk6KDAsWHQuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLXBlZWstY29udGVudCIscmVmOnIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDp0fX0pOigwLFh0LmpzeCkoYlAse29uQ2hvb3NlOm59KX1mdW5jdGlvbiBOaCh7YXBwOmV9KXtsZXRbdCxuXT0oMCx5by51c2VTdGF0ZSkoKCk9PkoxKF9lKCkpKSx7ZXJyb3I6byxodG1sOnJ9PXZQKHthcHA6ZSxub3RlVVVJRDp0Py5ub3RlVVVJRHx8bnVsbH0pLGE9KDAseW8udXNlQ2FsbGJhY2spKGFzeW5jKCk9PntsZXQgbD1hd2FpdCBRMShlLHQ/Lm5vdGVOYW1lfHxudWxsKTtsJiYoYXdhaXQgWjEoZSxsKSxuKGwpKX0sW2UsdF0pO3V0KGhhLCF0fHxyIT09bnVsbCwhIW8pO2xldCBpPXQ/KDAsWHQuanN4KShlUyx7YXBwOmUsbm90ZU5hbWU6dC5ub3RlTmFtZSxub3RlVVVJRDp0Lm5vdGVVVUlELGNoaWxkcmVuOldkKGhhKX0pOnZvaWQgMCxzPXQ/KDAsWHQuanN4KShlUyx7YXBwOmUsbm90ZU5hbWU6dC5ub3RlTmFtZSxub3RlVVVJRDp0Lm5vdGVVVUlELGNoaWxkcmVuOnQubm90ZU5hbWV8fCJVbnRpdGxlZCJ9KTpudWxsO3JldHVybigwLFh0LmpzeCkocmUse2NvbmZpZ3VyYWJsZTohIXQsb25Db25maWd1cmU6YSxzdWJ0aXRsZTpzLHRpdGxlOmksd2lkZ2V0SWQ6aGEsY2hpbGRyZW46KDAsWHQuanN4KSh3UCx7ZXJyb3I6byxodG1sOnIsb25DaG9vc2U6YSxzZWxlY3Rpb246dH0pfSl9dmFyIGd0PUwobWUoKSk7dmFyIENlPUwoWCgpKSxHYz0icGVhay1ob3VycyI7ZnVuY3Rpb24ga1AoZSl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDoyNH0sKHQsbik9PmRpKG4sZSkpfWZ1bmN0aW9uIHRTKGUpe3JldHVybiBlP2UgaW5zdGFuY2VvZiBEYXRlP2U6dHlwZW9mIGU9PSJudW1iZXIiP25ldyBEYXRlKGU8MWUxMj9lKjFlMzplKTpuZXcgRGF0ZShlKTpudWxsfWZ1bmN0aW9uIHhQKGUpe2xldCB0PUllKGUpLG49dC5nZXRGdWxsWWVhcigpLG89dC5nZXRNb250aCgpLHI9bmV3IERhdGUobixvLDEsMCwwLDAsMCksYT1uZXcgRGF0ZShuLG8rMSwxLDAsMCwwLDApO3JldHVybntmcm9tOk1hdGguZmxvb3Ioci5nZXRUaW1lKCkvMWUzKSx0bzpNYXRoLmZsb29yKGEuZ2V0VGltZSgpLzFlMyksbW9udGhLZXk6YCR7bn0tJHtTdHJpbmcobysxKS5wYWRTdGFydCgyLCIwIil9YH19ZnVuY3Rpb24gU1AoZSl7bGV0IHQ9bmV3IEFycmF5KDI0KS5maWxsKDApLG49bmV3IEFycmF5KDI0KS5maWxsKDApLG89MDtmb3IobGV0IGkgb2YgZSl7bGV0IHM9aS52aWN0b3J5VmFsdWV8fDEsbD10UyhpLmNyZWF0ZWRBdHx8aS5zdGFydEF0KTtsJiYhaXNOYU4obCkmJih0W2wuZ2V0SG91cnMoKV0rPXMsbysrKTtsZXQgZD10UyhpLmNvbXBsZXRlZEF0KTtkJiYhaXNOYU4oZCkmJihuW2QuZ2V0SG91cnMoKV0rPXMpfWxldCByPXQuaW5kZXhPZihNYXRoLm1heCguLi50KSksYT1uLmluZGV4T2YoTWF0aC5tYXgoLi4ubikpO3JldHVybntjb21wbGV0ZWRCeUhvdXI6bixjcmVhdGVkQnlIb3VyOnQscGVha0NvbXBsZXRlSG91ckluZGV4OmEscGVha0NyZWF0ZUhvdXJJbmRleDpyLHRvdGFsVGFza3M6b319ZnVuY3Rpb24gRVAoZSl7bGV0IHQ9Z2V0Q29tcHV0ZWRTdHlsZShlKTtyZXR1cm57YmFyQ3JlYXRlZDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWJsdWUiKS50cmltKCl8fCIjNWI3YmJmIixiYXJDb21wbGV0ZWQ6dC5nZXRQcm9wZXJ0eVZhbHVlKCItLWRhc2hib2FyZC1jb2xvci1hY2NlbnQiKS50cmltKCl8fCIjZTg4NTNkIixheGlzVGV4dDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtc2Vjb25kYXJ5IikudHJpbSgpfHwiIzdhODY5OSIsZ3JpZExpbmU6dC5nZXRQcm9wZXJ0eVZhbHVlKCItLWRhc2hib2FyZC1jb2xvci1ib3JkZXIiKS50cmltKCl8fCIjZDhkZGU2In19ZnVuY3Rpb24gblMoZSx0LG4sbyl7bGV0IHI9ZS5nZXRDb250ZXh0KCIyZCIpLGE9d2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsaT1lLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1pLndpZHRoLGw9aS5oZWlnaHQ7aWYoczw9MHx8bDw9MClyZXR1cm47ZS53aWR0aD1zKmEsZS5oZWlnaHQ9bCphLGUuc3R5bGUud2lkdGg9YCR7c31weGAsZS5zdHlsZS5oZWlnaHQ9YCR7bH1weGAsci5zY2FsZShhLGEpO2xldCBkPUVQKGUpLGM9NDgsdT0xMixwPTEyLGY9NDAsbT1zLWMtdSxnPWwtcC1mLHc9TWF0aC5tYXgoLi4udCwuLi5uLDEpLHY9TWF0aC5jZWlsKHcvMTApKjEwfHwxMDtyLmNsZWFyUmVjdCgwLDAscyxsKTtsZXQgeT01O3IuZm9udD0iMTFweCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiIsci50ZXh0QWxpZ249InJpZ2h0IixyLnRleHRCYXNlbGluZT0ibWlkZGxlIjtmb3IobGV0IFQ9MDtUPD15O1QrKyl7bGV0IEE9TWF0aC5yb3VuZCh2L3kqVCksQz1wK2ctZypUL3k7ci5maWxsU3R5bGU9ZC5heGlzVGV4dCxyLmZpbGxUZXh0KGAke0F9YCxjLTgsQyksVD4wJiYoci5zdHJva2VTdHlsZT1kLmdyaWRMaW5lLHIuZ2xvYmFsQWxwaGE9LjQsci5saW5lV2lkdGg9LjUsci5iZWdpblBhdGgoKSxyLm1vdmVUbyhjLEMpLHIubGluZVRvKGMrbSxDKSxyLnN0cm9rZSgpLHIuZ2xvYmFsQWxwaGE9MSl9bGV0IGI9MjQsaD1tL2IsUz1oKi4zMix4PWgqLjA0O2ZvcihsZXQgVD0wO1Q8YjtUKyspe2xldCBBPWMrVCpoKyhoLVMqMi14KS8yLEM9dFtUXS92KmcsTz1uW1RdL3YqZztyLmZpbGxTdHlsZT1kLmJhckNyZWF0ZWQsb1MocixBLHArZy1DLFMsQywyKSxyLmZpbGxTdHlsZT1kLmJhckNvbXBsZXRlZCxvUyhyLEErUyt4LHArZy1PLFMsTywyKX1yLmZpbGxTdHlsZT1kLmF4aXNUZXh0LHIuZm9udD0iMTBweCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiIsci50ZXh0QWxpZ249ImNlbnRlciIsci50ZXh0QmFzZWxpbmU9InRvcCI7bGV0IEU9bTwzMDA/NDoyO2ZvcihsZXQgVD0wO1Q8YjtUKz1FKXtsZXQgQT1jK1QqaCtoLzI7ci5maWxsVGV4dChvW1RdLEEscCtnKzgpfX1mdW5jdGlvbiBvUyhlLHQsbixvLHIsYSl7cjwxfHwoYT1NYXRoLm1pbihhLHIvMixvLzIpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odCthLG4pLGUubGluZVRvKHQrby1hLG4pLGUuYXJjVG8odCtvLG4sdCtvLG4rYSxhKSxlLmxpbmVUbyh0K28sbityKSxlLmxpbmVUbyh0LG4rciksZS5saW5lVG8odCxuK2EpLGUuYXJjVG8odCxuLHQrYSxuLGEpLGUuY2xvc2VQYXRoKCksZS5maWxsKCkpfWZ1bmN0aW9uIE5QKGUsdCl7bGV0IG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPXQuY2xpZW50WC1uLmxlZnQscj1uLndpZHRoLGE9NDgscz1yLWEtMTIsbD1vLWE7cmV0dXJuIGw8MHx8bD5zPy0xOk1hdGguZmxvb3IobC9zKjI0KX1mdW5jdGlvbiBUaCh7bGFiZWw6ZSx2YWx1ZTp0fSl7cmV0dXJuKDAsQ2UuanN4cykoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtY2FyZCIsY2hpbGRyZW46WygwLENlLmpzeCkoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtbGFiZWwiLGNoaWxkcmVuOmV9KSwoMCxDZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbWV0cmljLXZhbHVlIixjaGlsZHJlbjp0fSldfSl9ZnVuY3Rpb24gclMoe21vZGlmaWVyQ2xhc3M6ZSxsYWJlbDp0fSl7cmV0dXJuKDAsQ2UuanN4cykoInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kLWl0ZW0iLGNoaWxkcmVuOlsoMCxDZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOmBwZWFrLWhvdXJzLWxlZ2VuZC1zd2F0Y2ggJHtlfWB9KSx0XX0pfWZ1bmN0aW9uIFRQKHtsYWJlbDplLGZvcndhcmREaXNhYmxlZDp0LG9uTmF2aWdhdGU6bn0pe3JldHVybigwLENlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1vbnRoLW5hdiIsY2hpbGRyZW46WygwLENlLmpzeCkoImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsY2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1vbnRoLW5hdi1hcnJvdyIsImFyaWEtbGFiZWwiOiJQcmV2aW91cyBtb250aCIsb25DbGljazooKT0+bigtMSksY2hpbGRyZW46Ilx1MjAzOSJ9KSwoMCxDZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1vbnRoLW5hdi1sYWJlbCIsY2hpbGRyZW46ZX0pLCgwLENlLmpzeCkoImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsY2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1vbnRoLW5hdi1hcnJvdyIsImFyaWEtbGFiZWwiOiJOZXh0IG1vbnRoIixkaXNhYmxlZDp0LG9uQ2xpY2s6KCk9Pm4oMSksY2hpbGRyZW46Ilx1MjAzQSJ9KV19KX1mdW5jdGlvbiBEaCh7YXBwOmUsY3VycmVudERhdGU6dCxzZWxlY3RlZERhdGU6bix0aW1lRm9ybWF0Om99KXtsZXQgcj0oMCxndC51c2VSZWYpKG51bGwpLFthLGldPSgwLGd0LnVzZVN0YXRlKShudWxsKSxbcyxsXT0oMCxndC51c2VTdGF0ZSkobnVsbCksW2QsY109KDAsZ3QudXNlU3RhdGUpKCEwKSxbdSxwXT0oMCxndC51c2VTdGF0ZSkoW10pLGY9KDAsZ3QudXNlUmVmKShudWxsKSxtPW58fHQsZz1tP3BjKG0pOm51bGwsdz10P3BjKHQpOm51bGwsW3YseV09KDAsZ3QudXNlU3RhdGUpKGcpOygwLGd0LnVzZUVmZmVjdCkoKCk9PntnJiZ5KGcpfSxbZ10pO2xldCBiPSgwLGd0LnVzZU1lbW8pKCgpPT52P2dtKHYpOm51bGwsW3ZdKSxoPSF2fHwhd3x8dj49dyxTPSgwLGd0LnVzZUNhbGxiYWNrKShNPT57eShXPT57bGV0IEQ9V3x8ZztpZighRClyZXR1cm4gVztsZXQgTj1wYyhCayhnbShEKSxNKSk7cmV0dXJuIE0+MCYmdyYmTj53P1c6Tn0pfSxbZyx3XSk7KDAsZ3QudXNlRWZmZWN0KSgoKT0+e2lmKCFifHwhZSlyZXR1cm47bGV0e2Zyb206TSx0bzpXLG1vbnRoS2V5OkR9PXhQKGIpO2lmKGYuY3VycmVudD09PUQpcmV0dXJuO2YuY3VycmVudD1EO2xldCBOPSExO3JldHVybiBsKG51bGwpLGMoITApLGUuZ2V0Q29tcGxldGVkVGFza3MoTSxXKS50aGVuKEY9PntOfHxwKEFycmF5LmlzQXJyYXkoRik/RjpbXSl9KS5jYXRjaChGPT57aygiW3BlYWstaG91cnNdIGZhaWxlZCB0byBmZXRjaCBtb250aCB0YXNrcyIsRiksTnx8KGwoRikscChbXSkpfSkuZmluYWxseSgoKT0+e058fGMoITEpfSksKCk9PntOPSEwfX0sW2UsYl0pO2xldCB4PWtQKG8pLHtjb21wbGV0ZWRCeUhvdXI6RSxjcmVhdGVkQnlIb3VyOlQscGVha0NvbXBsZXRlSG91ckluZGV4OkEscGVha0NyZWF0ZUhvdXJJbmRleDpDLHRvdGFsVGFza3M6T309KDAsZ3QudXNlTWVtbykoKCk9PlNQKHUpLFt1XSksUD14W0NdLFU9eFtBXSxJPSgwLGd0LnVzZU1lbW8pKCgpPT5iP0llKGIpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse21vbnRoOiJsb25nIix5ZWFyOiJudW1lcmljIn0pOm51bGwsW2JdKTsoMCxndC51c2VFZmZlY3QpKCgpPT57aWYoIXIuY3VycmVudClyZXR1cm47blMoci5jdXJyZW50LFQsRSx4KTtsZXQgTT0oKT0+e3IuY3VycmVudCYmblMoci5jdXJyZW50LFQsRSx4KX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLE0pLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixNKX0sW0UsVCx4XSk7bGV0IEg9KDAsZ3QudXNlQ2FsbGJhY2spKE09PntsZXQgVz1OUChyLmN1cnJlbnQsTSk7aWYoVzwwfHxXPjIzKXtpKG51bGwpO3JldHVybn1sZXQgRD1yLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aSh7eDpNLmNsaWVudFgtRC5sZWZ0LHk6TS5jbGllbnRZLUQudG9wLTYwLGhvdXI6eFtXXSxjcmVhdGVkOlRbV10sY29tcGxldGVkOkVbV119KX0sW1QsRV0pLF89KDAsZ3QudXNlQ2FsbGJhY2spKCgpPT5pKG51bGwpLFtdKTt1dChHYywhZCYmIXMsISFzKTtsZXQgSz0oMCxDZS5qc3gpKFRQLHtsYWJlbDpJLGZvcndhcmREaXNhYmxlZDpoLG9uTmF2aWdhdGU6U30pO3JldHVybiBkPygwLENlLmpzeCkocmUse3N1YnRpdGxlOkssd2lkZ2V0SWQ6R2MsY2hpbGRyZW46KDAsQ2UuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWVtcHR5IixjaGlsZHJlbjooMCxDZS5qc3gpKCJwIix7Y2hpbGRyZW46IkxvYWRpbmcgbW9udGhseSB0YXNrIGhpc3RvcnlcdTIwMjYifSl9KX0pOk89PT0wPygwLENlLmpzeCkocmUse3N1YnRpdGxlOkssd2lkZ2V0SWQ6R2MsY2hpbGRyZW46KDAsQ2UuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWVtcHR5IixjaGlsZHJlbjooMCxDZS5qc3gpKCJwIix7Y2hpbGRyZW46Ik5vIGNvbXBsZXRlZCB0YXNrIGRhdGEgYXZhaWxhYmxlIHlldC4ifSl9KX0pOigwLENlLmpzeHMpKHJlLHtzdWJ0aXRsZTpLLHdpZGdldElkOkdjLGNoaWxkcmVuOlsoMCxDZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpY3MtZ3JpZCIsY2hpbGRyZW46WygwLENlLmpzeCkoVGgse2xhYmVsOiJUYXNrcyBhbmFseXplZCIsdmFsdWU6T30pLCgwLENlLmpzeCkoVGgse2xhYmVsOiJQZWFrIGNyZWF0ZSBob3VyIix2YWx1ZTpQfSksKDAsQ2UuanN4KShUaCx7bGFiZWw6IlBlYWsgY29tcGxldGUgaG91ciIsdmFsdWU6VX0pXX0pLCgwLENlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kIixjaGlsZHJlbjpbKDAsQ2UuanN4KShyUyx7bW9kaWZpZXJDbGFzczoicGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoLS1jcmVhdGVkIixsYWJlbDoiQ3JlYXRlZCB2YWx1ZSJ9KSwoMCxDZS5qc3gpKHJTLHttb2RpZmllckNsYXNzOiJwZWFrLWhvdXJzLWxlZ2VuZC1zd2F0Y2gtLWNvbXBsZXRlZCIsbGFiZWw6IkNvbXBsZXRlZCB2YWx1ZSJ9KV19KSwoMCxDZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWNoYXJ0LWNvbnRhaW5lciIsY2hpbGRyZW46WygwLENlLmpzeCkoImNhbnZhcyIse3JlZjpyLGNsYXNzTmFtZToicGVhay1ob3Vycy1jYW52YXMiLG9uTW91c2VNb3ZlOkgsb25Nb3VzZUxlYXZlOl99KSxhJiYoMCxDZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAiLHN0eWxlOntsZWZ0OmEueCx0b3A6YS55LHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSJ9LGNoaWxkcmVuOlsoMCxDZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1oZWFkZXIiLGNoaWxkcmVuOmEuaG91cn0pLCgwLENlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1yb3ciLGNoaWxkcmVuOlsoMCxDZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwgcGVhay1ob3Vycy10b29sdGlwLWxhYmVsLS1jcmVhdGVkIixjaGlsZHJlbjoiQ3JlYXRlZDoifSksYCAke2EuY3JlYXRlZH0gcHRzYF19KSwoMCxDZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtcm93IixjaGlsZHJlbjpbKDAsQ2UuanN4KSgic3BhbiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLWxhYmVsIHBlYWstaG91cnMtdG9vbHRpcC1sYWJlbC0tY29tcGxldGVkIixjaGlsZHJlbjoiQ29tcGxldGVkOiJ9KSxgICR7YS5jb21wbGV0ZWR9IHB0c2BdfSldfSldfSldfSl9dmFyIEp0PXtESVNNSVNTRUQ6ImRpc21pc3NlZCIsUEVORElORzoicGVuZGluZyIsU0NIRURVTEVEOiJzY2hlZHVsZWQifSxEUD0iRGFzaGJvYXJkIFByb3Bvc2VkIFRhc2tzIixBUD03O2Z1bmN0aW9uIGFTKGUsdCl7bGV0IG49ZSBpbnN0YW5jZW9mIERhdGU/ZTpuZXcgRGF0ZShlKTtyZXR1cm5gJHtCbltuLmdldE1vbnRoKCldfSAke24uZ2V0RnVsbFllYXIoKX0gJHt0fSAke0RQfWB9ZnVuY3Rpb24geGkoZSl7cmV0dXJuYCR7ZS5zdGFydE1pbnV0ZXN9Ojoke2UudGFza1V1aWR8fGUudGl0bGV9YH1mdW5jdGlvbiBBaChlLHtkYXRlS2V5OnQsZG9tYWluVXVpZDpuLHByaW9yaXR5S2V5Om8scHJvdmlkZXJFbTpyfSl7cmV0dXJuIGUuZGF0ZUtleT09PXQmJmUucHJpb3JpdHlLZXk9PT1vJiZlLnByb3ZpZGVyRW09PT1yJiZlLmRvbWFpblV1aWQ9PT1ufWZ1bmN0aW9uIENQKGUsdD1udWxsKXtyZXR1cm4gdD9lLmNvbnRleHRGaW5nZXJwcmludD09PW1hKHQpOiEwfWZ1bmN0aW9uIE1QKGUpe3JldHVybntkdXJhdGlvbk1pbnV0ZXM6ZS5kdXJhdGlvbk1pbnV0ZXN8fDAsaXNFeGlzdGluZzohIWUuaXNFeGlzdGluZyxub3RlVXVpZDplLm5vdGVVdWlkfHxudWxsLHJlYXNvbjplLnJlYXNvbnx8IiIsc2NoZWR1bGVkRW06ZS5zY2hlZHVsZWRFbXx8SnQuUEVORElORyxzdGFydE1pbnV0ZXM6ZS5zdGFydE1pbnV0ZXMsdGFyZ2V0TWlkbmlnaHRTZWNvbmRzOmUudGFyZ2V0TWlkbmlnaHRTZWNvbmRzPz9udWxsLHRhc2tVdWlkOmUudGFza1V1aWR8fG51bGwsdGltZTplLnN0YXJ0VGltZSx0aXRsZTplLnRpdGxlfX1mdW5jdGlvbiBPUChlKXtyZXR1cm57ZHVyYXRpb25NaW51dGVzOmUuZHVyYXRpb25NaW51dGVzfHwwLGlzRXhpc3Rpbmc6ISFlLmlzRXhpc3Rpbmcsbm90ZVV1aWQ6ZS5ub3RlVXVpZHx8bnVsbCxyZWFzb246ZS5yZWFzb258fCIiLHNjaGVkdWxlZEVtOmUuc2NoZWR1bGVkRW18fEp0LlBFTkRJTkcsc291cmNlOiJwcm9wb3NlZCIsc3RhcnRNaW51dGVzOmUuc3RhcnRNaW51dGVzLHN0YXJ0VGltZTplLnRpbWUsdGFyZ2V0TWlkbmlnaHRTZWNvbmRzOmUudGFyZ2V0TWlkbmlnaHRTZWNvbmRzPz9udWxsLHRhc2tVdWlkOmUudGFza1V1aWR8fG51bGwsdGl0bGU6ZS50aXRsZX19ZnVuY3Rpb24gaVMoZSl7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm57cmVjb3JkczpbXX07bGV0IHQ9ZS5tYXRjaCgvYGBganNvblxzKihbXHNcU10qPylgYGAvaSksbj10P3RbMV06ZTt0cnl7bGV0IG89SlNPTi5wYXJzZShuKTtyZXR1cm57cmVjb3JkczpBcnJheS5pc0FycmF5KG8/LnJlY29yZHMpP28ucmVjb3JkczpbXX19Y2F0Y2h7cmV0dXJue3JlY29yZHM6W119fX1mdW5jdGlvbiBDaChlLHQsbil7cmV0dXJuW2AjIFByb3Bvc2VkIGFnZW5kYSByZWNvcmRzIGZvciAke2V9IFx1MjAxNCAke3R9YCwiIiwiVGhpcyBhcmNoaXZlZCBub3RlIGlzIG1haW50YWluZWQgYnkgdGhlIGRhc2hib2FyZCBwbHVnaW4uIEVhY2ggcmVjb3JkIGJlbG93IGNhcHR1cmVzIHdoaWNoIHRhc2tzIHRoZSBQcm9wb3NlZCBBZ2VuZGEgd2lkZ2V0IHJlY29tbWVuZGVkIGZvciBhIGdpdmVuIGRhdGUsIHByaW9yaXR5LCBhbmQgQUkgcHJvdmlkZXIgXHUyMDE0IGFuZCB3aGF0IGJlY2FtZSBvZiBlYWNoLiIsIiIsImBgYGpzb24iLEpTT04uc3RyaW5naWZ5KG4sbnVsbCwyKSwiYGBgIiwiIl0uam9pbihgCmApfWFzeW5jIGZ1bmN0aW9uIE1oKGUsdCxuKXtsZXQgbz1hUyh0LG4pLHI9YCR7Qm5bdC5nZXRNb250aCgpXX0gJHt0LmdldEZ1bGxZZWFyKCl9YCxhPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6byx0YWdzOlt3ZV19KS5jYXRjaCgoKT0+bnVsbCk7aWYoYT8udXVpZCl7bGV0IGw9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDphLnV1aWR9KS5jYXRjaCgoKT0+IiIpO3JldHVybnttb250aExhYmVsOnIsbm90ZUhhbmRsZTphLHN0YXRlOmlTKGwpfX1sZXQgaT1hd2FpdCBlLmNyZWF0ZU5vdGUobyxbd2VdLHthcmNoaXZlOiEwfSk7YT17bmFtZTpvLHV1aWQ6dHlwZW9mIGk9PSJvYmplY3QiP2kudXVpZDppfTtsZXQgcz17cmVjb3JkczpbXX07cmV0dXJuIGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KGEsQ2gobixyLHMpKS5jYXRjaChsPT5rKCJbcHJvcG9zZWQtYWdlbmRhLWFyY2hpdmVdIGZhaWxlZCB0byBpbml0aWFsaXplIG5vdGU6IixsKSksayhgW3Byb3Bvc2VkLWFnZW5kYS1hcmNoaXZlXSBjcmVhdGVkIG1vbnRobHkgbm90ZSAiJHtvfSIgdXVpZCAke2EudXVpZH1gKSx7bW9udGhMYWJlbDpyLG5vdGVIYW5kbGU6YSxzdGF0ZTpzfX1hc3luYyBmdW5jdGlvbiBJUChlLHQsbil7bGV0IG89YVModCxuKSxyPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6byx0YWdzOlt3ZV19KS5jYXRjaCgoKT0+bnVsbCk7aWYoIXI/LnV1aWQpcmV0dXJuW107bGV0IGE9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpyLnV1aWR9KS5jYXRjaCgoKT0+IiIpO3JldHVybiBpUyhhKS5yZWNvcmRzfWZ1bmN0aW9uIFJQKGUsdCl7bGV0IG49W10sbz1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLDEpLHI9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSwxKTtmb3IoO288PXI7KW4ucHVzaChuZXcgRGF0ZShvKSksby5zZXRNb250aChvLmdldE1vbnRoKCkrMSk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gc1MoZSx7ZGF0ZTp0LGRvbWFpbk5hbWU6bixkb21haW5VdWlkOm8sd2luZG93RGF5czpyPUFQfSl7bGV0IGE9YWUodCksaT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpLXIsMCwwLDApLHM9YWUoaSksbD1hd2FpdCBQcm9taXNlLmFsbChSUChpLHQpLm1hcChjPT5JUChlLGMsbikuY2F0Y2goKCk9PltdKSkpLGQ9bmV3IE1hcDtmb3IobGV0IGMgb2YgbC5mbGF0KCkpe2xldCB1PWM/LmRhdGVLZXk7aWYoISghdXx8dT49YXx8dTxzfHxjLmRvbWFpblV1aWQhPT1vKSlmb3IobGV0IGYgb2YgQXJyYXkuaXNBcnJheShjLnByb3Bvc2VkVGFza3MpP2MucHJvcG9zZWRUYXNrczpbXSlmPy50YXNrVXVpZCYmKGQuaGFzKGYudGFza1V1aWQpfHxkLnNldChmLnRhc2tVdWlkLG5ldyBTZXQpLGQuZ2V0KGYudGFza1V1aWQpLmFkZCh1KSl9cmV0dXJuIGR9YXN5bmMgZnVuY3Rpb24gbFMoZSx7ZGF0ZTp0LGRvbWFpbk5hbWU6bixkb21haW5VdWlkOm8scHJpb3JpdHlLZXk6cixwcm92aWRlckVtOmEscmVjb21tZW5kYXRpb25Db250ZXh0S2V5Omk9bnVsbH0pe2xldCBzPXtkYXRlS2V5OmFlKHQpLGRvbWFpblV1aWQ6byxwcmlvcml0eUtleTpyLHByb3ZpZGVyRW06YX0se3N0YXRlOmx9PWF3YWl0IE1oKGUsdCxuKSxkPWwucmVjb3Jkcy5maW5kKGY9PkFoKGYscykmJkNQKGYsaSkpO2lmKCFkfHwhQXJyYXkuaXNBcnJheShkLnByb3Bvc2VkVGFza3MpfHxkLnByb3Bvc2VkVGFza3MubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgYz1kLnByb3Bvc2VkVGFza3MubWFwKE9QKSx1PWQucHJvcG9zZWRUYXNrcy5maWx0ZXIoZj0+Zi5zY2hlZHVsZWRFbT09PUp0LlNDSEVEVUxFRCkubWFwKHhpKSxwPWQucHJvcG9zZWRUYXNrcy5maWx0ZXIoZj0+Zi5zY2hlZHVsZWRFbT09PUp0LkRJU01JU1NFRCkubWFwKHhpKTtyZXR1cm4gaygiW3Byb3Bvc2VkLWFnZW5kYS1hcmNoaXZlXSBjYWNoZSBoaXQiLHsuLi5zLHRhc2tDb3VudDpjLmxlbmd0aH0pLHthY3Rpdml0aWVzOmMsZGlzbWlzc2VkS2V5czpwLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmQubGxtQXR0cmlidXRpb25Gb290ZXJ8fG51bGwsc2NoZWR1bGVkS2V5czp1fX1hc3luYyBmdW5jdGlvbiBPaChlLHthY3Rpdml0aWVzOnQsZGF0ZTpuLGRvbWFpbk5hbWU6byxkb21haW5VdWlkOnIsbGxtQXR0cmlidXRpb25Gb290ZXI6YT1udWxsLHByaW9yaXR5S2V5OmkscHJvdmlkZXJFbTpzLHJlY29tbWVuZGF0aW9uQ29udGV4dEtleTpsPW51bGx9KXtsZXQgZD17ZGF0ZUtleTphZShuKSxkb21haW5VdWlkOnIscHJpb3JpdHlLZXk6aSxwcm92aWRlckVtOnN9LHttb250aExhYmVsOmMsbm90ZUhhbmRsZTp1LHN0YXRlOnB9PWF3YWl0IE1oKGUsbixvKSxmPWw/bWEobCk6bnVsbCxtPXsuLi5kLGNvbnRleHRGaW5nZXJwcmludDpmLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmEscHJvcG9zZWRUYXNrczoodHx8W10pLm1hcChNUCl9LGc9W20sLi4ucC5yZWNvcmRzLmZpbHRlcih3PT4hQWgodyxkKSldO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHUsQ2gobyxjLHtyZWNvcmRzOmd9KSksaygiW3Byb3Bvc2VkLWFnZW5kYS1hcmNoaXZlXSBzdG9yZWQgcmVjb3JkIix7Li4uZCx0YXNrQ291bnQ6bS5wcm9wb3NlZFRhc2tzLmxlbmd0aH0pfWFzeW5jIGZ1bmN0aW9uIGRTKGUse2FjdGl2aXR5S2V5czp0LGRhdGU6bixkb21haW5OYW1lOm8sZG9tYWluVXVpZDpyLHByaW9yaXR5S2V5OmEscHJvdmlkZXJFbTppLHNjaGVkdWxlZEVtOnN9KXtsZXQgbD1uZXcgU2V0KHR8fFtdKTtpZihsLnNpemU9PT0wKXJldHVybjtsZXQgZD17ZGF0ZUtleTphZShuKSxkb21haW5VdWlkOnIscHJpb3JpdHlLZXk6YSxwcm92aWRlckVtOml9LHttb250aExhYmVsOmMsbm90ZUhhbmRsZTp1LHN0YXRlOnB9PWF3YWl0IE1oKGUsbixvKSxmPXAucmVjb3Jkcy5maW5kKGc9PkFoKGcsZCkpO2lmKCFmfHwhQXJyYXkuaXNBcnJheShmLnByb3Bvc2VkVGFza3MpKXJldHVybjtsZXQgbT0hMTtmLnByb3Bvc2VkVGFza3M9Zi5wcm9wb3NlZFRhc2tzLm1hcChnPT4hbC5oYXMoeGkoZykpfHxnLnNjaGVkdWxlZEVtPT09cz9nOihtPSEwLHsuLi5nLHNjaGVkdWxlZEVtOnN9KSksbSYmKGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHUsQ2gobyxjLHApKSxrKCJbcHJvcG9zZWQtYWdlbmRhLWFyY2hpdmVdIHVwZGF0ZWQgc3RhdHVzZXMiLHsuLi5kLHNjaGVkdWxlZEVtOnMsY291bnQ6bC5zaXplfSkpfXZhciBybD1be2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHRoYXQgZGlyZWN0bHkgYWR2YW5jZSB0aGUgdXNlcidzIHF1YXJ0ZXJseSBwbGFuIGFuZCBzdGF0ZWQgZ29hbHMuIFNlcXVlbmNlIHRoZSBoaWdoZXN0LWxldmVyYWdlIGdvYWwgd29yayBpbnRvIHRoZSBtb3N0IHByb2R1Y3RpdmUgcGFydHMgb2YgdGhlIGRheSBzbyBtZWFzdXJhYmxlIHByb2dyZXNzIGlzIG1hZGUuIixrZXk6ImdvYWwtcHJvZ3Jlc3MiLGxhYmVsOiJHb2FsIHByb2dyZXNzIn0se2Jhcm5hY2xlOiEwLGluc3RydWN0aW9uOiJQcmlvcml0aXplICdiYXJuYWNsZScgdGFza3MgXHUyMDE0IHRhc2tzIHRoYXQgaGF2ZSBsaW5nZXJlZCBvbiB0aGUgdG8tZG8gbGlzdCBmb3IgYW4gdW51c3VhbGx5IGxvbmcgdGltZS4gU3Ryb25nbHkgcHJlZmVyIHRhc2tzIGRyYXduIGZyb20gbm90ZXMgdGhhdCBjYXJyeSBodW5kcmVkcyBvZiBvcGVuIHRhc2tzLCBiZWNhdXNlIHRob3NlIGxhcmdlIGJhY2tsb2dzIGFyZSB3aGVyZSBiYXJuYWNsZXMgYWNjdW11bGF0ZS4gVGhlIGdvYWwgb2YgdG9kYXkgaXMgdG8gZmluYWxseSBjbGVhciBsb25nLXN0YWxlIG9ibGlnYXRpb25zLiIsa2V5OiJiYXJuYWNsZS1jbGVhbnVwIixsYWJlbDoiQmFybmFjbGUgY2xlYW51cCJ9LHtpbnN0cnVjdGlvbjoiQXNzdW1lIHRoZSB1c2VyIGhhcyBsb3cgZW5lcmd5IHRvZGF5LiBGYXZvciBsaWdodCwgc2hvcnQsIGxvdy1jb2duaXRpdmUtbG9hZCB0YXNrczsgYXZvaWQgZGVtYW5kaW5nIGRlZXAtZm9jdXMgd29yaywgYW5kIGtlZXAgYWN0aXZpdGllcyBicmllZiB3aXRoIGdlbmVyb3VzIHJlY292ZXJ5IGJyZWFrcyBiZXR3ZWVuIHRoZW0uIixrZXk6Imxvdy1lbmVyZ3kiLGxhYmVsOiJMb3cgZW5lcmd5In0se2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHdob3NlIHBheW9mZiBjb21wb3VuZHMgb3ZlciB0aGUgbG9uZyB0ZXJtIFx1MjAxNCBsZWFybmluZywgc3lzdGVtcywgYXV0b21hdGlvbiwgZG9jdW1lbnRhdGlvbiwgYW5kIHJlbGF0aW9uc2hpcHMgXHUyMDE0IGV2ZW4gd2hlbiB0aGV5IGZlZWwgbGVzcyB1cmdlbnQgdGhhbiB0b2RheSdzIG5vaXNlLiIsa2V5OiJsb25nLXRlcm0tYmVuZWZpdCIsbGFiZWw6IkxvbmctdGVybSBiZW5lZml0In0se2luc3RydWN0aW9uOiJQcmlvcml0aXplIHRhc2tzIHRoZSB1c2VyIGlzIG1vc3QgbGlrZWx5IHRvIGZpbmQgZW5lcmdpemluZyBhbmQgZW5qb3lhYmxlLiBTZXF1ZW5jZSB0aGUgZGF5IHRvIHN1c3RhaW4gbW90aXZhdGlvbiBhbmQgcG9zaXRpdmUgbW9tZW50dW0sIGZyb250LWxvYWRpbmcgYSBzYXRpc2Z5aW5nIGVhcmx5IHdpbi4iLGtleToiaGFwcGluZXNzLW1heGltaXplciIsbGFiZWw6IkhhcHBpbmVzcyBtYXhpbWl6ZXIifV0sY1M9cmxbMF0ua2V5O2Z1bmN0aW9uIHVTKGUpe3JldHVybiBybC5maW5kKHQ9PnQua2V5PT09ZSl8fHJsWzBdfXZhciBQUD0yMDAsTFA9MWUzLF9QPTMwLFVQPTIwMCxSaD0xZTEwLFBoPTI0KjYwKjYwKjFlMyxwUz02MCxGUD02MCx6UD00ZTMsaFM9NjAsV1A9MjAwLEJQPTQwMSxIUD00MDMsS1A9MTYsR1A9MTgsZ1M9NjAsVlA9MzAsZlM9IkRhc2hib2FyZCB0cmF2ZWwgcmVjb21tZW5kYXRpb25zIixqUD0wLFlQPTYscVA9NSwkUD0yO2FzeW5jIGZ1bmN0aW9uIHlTKGUse2FpTW9kZWxPdmVycmlkZTp0PW51bGwsY2FsZW5kYXJFdmVudHM6bj1udWxsLGRvbWFpbk5hbWU6bz1udWxsLGRvbWFpblV1aWQ6cj1udWxsLGZvcmNlUmVnZW5lcmF0ZTphPSExLG5vdzppPW51bGwsb2JsaWdhdGlvbnM6cz1bXSxwcmlvcml0eUtleTpsPW51bGwscHJvdmlkZXJFbU92ZXJyaWRlOmQ9bnVsbCx0YXJnZXREYXRlOmM9bnVsbH09e30pe2xldCB1PWl8fG5ldyBEYXRlLHA9Yz9lcihjKTpMaCh1KSxmPXAudG9Mb2NhbGVEYXRlU3RyaW5nKFtdLHt3ZWVrZGF5OiJsb25nIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pLG09WlAocCx1KSxnPSFiUyhwLHUpLHc9Zz9udWxsOnUuZ2V0SG91cnMoKSpnUyt1LmdldE1pbnV0ZXMoKSx2PXVTKGwpLHk9a0woZCksYj1hd2FpdCBwbyhlKSxoPW98fGIuZG9tYWluTmFtZXx8IkFsbCBOb3RlcyIsUz1yfHxiLmRvbWFpblV1aWR8fG51bGwseD1hd2FpdCBNYyhlLHtjYWxlbmRhckV2ZW50czpuLGRvbWFpblV1aWQ6Uyx0YXJnZXREYXRlOnB9KTtpZihrKCJbcHJvcG9zZWQtYWdlbmRhXSBnZW5lcmF0ZVByb3Bvc2VkQWdlbmRhIGVudHJ5Iix7ZGF0ZUxhYmVsOmYsZGF5V29yZDptLGlzRnV0dXJlRGF5Omcsbm93TWludXRlczp3LHByaW9yaXR5OnYua2V5LG9ibGlnYXRpb25Db3VudDpzLmxlbmd0aCxwcm92aWRlckVtOnksZm9yY2VSZWdlbmVyYXRlOmEscmVjb21tZW5kYXRpb25GaW5nZXJwcmludDp4LmZpbmdlcnByaW50fSksIWEpe2xldCBUPWF3YWl0IGxTKGUse2RhdGU6cCxkb21haW5OYW1lOmgsZG9tYWluVXVpZDpTLHByaW9yaXR5S2V5OnYua2V5LHByb3ZpZGVyRW06eSxyZWNvbW1lbmRhdGlvbkNvbnRleHRLZXk6eC5jYWNoZUtleX0pLmNhdGNoKEE9PihrKCJbcHJvcG9zZWQtYWdlbmRhXSBjYWNoZSBsb29rdXAgZmFpbGVkIixBPy5tZXNzYWdlKSxudWxsKSk7aWYoVClyZXR1cm4gWFAoZSx7YWlNb2RlbE92ZXJyaWRlOnQsY2FjaGVkOlQsZGF0ZUxhYmVsOmYsZGF5V29yZDptLGRvbWFpbk5hbWU6aCxkb21haW5VdWlkOlMsaXNGdXR1cmVEYXk6ZyxtaWdyYXRpb25Eb21haW5OYW1lOmIubWlncmF0aW9uRG9tYWluTmFtZSxub3dNaW51dGVzOncsb2JsaWdhdGlvbnM6cyxwcmlvcml0eU9wdGlvbjp2LHByb3ZpZGVyRW06eSxwcm92aWRlckVtT3ZlcnJpZGU6ZCxyZWNvbW1lbmRhdGlvbkNvbnRleHQ6eCx0YXJnZXREYXRlOnB9KX1sZXQgRT1hd2FpdCB2UyhlLHthaU1vZGVsT3ZlcnJpZGU6dCxkYXRlTGFiZWw6ZixkYXlXb3JkOm0sZG9tYWluTmFtZTpoLGRvbWFpblV1aWQ6Uyxpc0Z1dHVyZURheTpnLG1pZ3JhdGlvbkRvbWFpbk5hbWU6Yi5taWdyYXRpb25Eb21haW5OYW1lLG5vd01pbnV0ZXM6dyxvYmxpZ2F0aW9uczpzLHByaW9yaXR5T3B0aW9uOnYscHJvdmlkZXJFbU92ZXJyaWRlOmQscmVjb21tZW5kYXRpb25Db250ZXh0OngsdGFyZ2V0RGF0ZTpwfSk7cmV0dXJuIUUuZXJyb3ImJkFycmF5LmlzQXJyYXkoRS5hY3Rpdml0aWVzKSYmRS5hY3Rpdml0aWVzLmxlbmd0aD4wJiZhd2FpdCBPaChlLHthY3Rpdml0aWVzOkUuYWN0aXZpdGllcyxkYXRlOnAsZG9tYWluTmFtZTpoLGRvbWFpblV1aWQ6UyxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpFLmxsbUF0dHJpYnV0aW9uRm9vdGVyLHByaW9yaXR5S2V5OnYua2V5LHByb3ZpZGVyRW06eSxyZWNvbW1lbmRhdGlvbkNvbnRleHRLZXk6eC5jYWNoZUtleX0pLmNhdGNoKFQ9PmsoIltwcm9wb3NlZC1hZ2VuZGFdIGZhaWxlZCB0byBzdG9yZSByZWNvcmQiLFQ/Lm1lc3NhZ2UpKSx7Li4uRSxkb21haW5OYW1lOmgsZG9tYWluVXVpZDpTLGZyb21DYWNoZTohMSxwcm92aWRlckVtOnl9fWFzeW5jIGZ1bmN0aW9uIHZTKGUse2FpTW9kZWxPdmVycmlkZTp0LGRhdGVMYWJlbDpuLGRheVdvcmQ6byxkb21haW5OYW1lOnIsZG9tYWluVXVpZDphLGlzRnV0dXJlRGF5OmksbWlncmF0aW9uRG9tYWluTmFtZTpzLG5vd01pbnV0ZXM6bCxvYmxpZ2F0aW9uczpkLHByaW9yaXR5T3B0aW9uOmMscHJvdmlkZXJFbU92ZXJyaWRlOnUscmVjb21tZW5kYXRpb25Db250ZXh0OnAsdGFyZ2V0RGF0ZTpmfSl7bGV0IG09YXdhaXQgbkwoZSxjLGYsYSksdz1hd2FpdCBUbyhlLHImJnMmJnI9PT1zLHIsTXIoKS5sYWJlbCksdj1udWxsO2lmKHcpe2xldCB5PWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dy51dWlkfSk7dj15P3kuc3Vic3RyaW5nKDAselApOm51bGx9cmV0dXJuIGsoIltwcm9wb3NlZC1hZ2VuZGFdIGNvbnRleHQgbG9hZGVkIix7dGFza0NvdW50Om0ubGVuZ3RoLHF1YXJ0ZXJseUNoYXJzOnY/Lmxlbmd0aD8/MH0pLG0ubGVuZ3RoPT09MCYmIUljKHApP3thY3Rpdml0aWVzOltdLGVycm9yOiJObyB0YXNrcyBmb3VuZCBhdmFpbGFibGUgdG8gc2NoZWR1bGUgaW4gVGFzayBEb21haW4uIixlcnJvckNvZGU6Im5vX3Rhc2tzIn06ZEwoZSx7YWlNb2RlbE92ZXJyaWRlOnQsZGF0ZUxhYmVsOm4sZGF5V29yZDpvLGRvbWFpbk5hbWU6cixkb21haW5VdWlkOmEsaXNGdXR1cmVEYXk6aSxub3dNaW51dGVzOmwsb2JsaWdhdGlvbnM6ZCxwcmlvcml0eU9wdGlvbjpjLHByb3ZpZGVyRW1PdmVycmlkZTp1LHF1YXJ0ZXJseUNvbnRlbnQ6dixyZWNvbW1lbmRhdGlvbkNvbnRleHQ6cCx0YXJnZXREYXRlOmYsdGFza3M6bX0pfWFzeW5jIGZ1bmN0aW9uIFhQKGUse2FpTW9kZWxPdmVycmlkZTp0LGNhY2hlZDpuLGRhdGVMYWJlbDpvLGRheVdvcmQ6cixkb21haW5OYW1lOmEsZG9tYWluVXVpZDppLGlzRnV0dXJlRGF5OnMsbWlncmF0aW9uRG9tYWluTmFtZTpsLG5vd01pbnV0ZXM6ZCxvYmxpZ2F0aW9uczpjLHByaW9yaXR5T3B0aW9uOnUscHJvdmlkZXJFbTpwLHByb3ZpZGVyRW1PdmVycmlkZTpmLHJlY29tbWVuZGF0aW9uQ29udGV4dDptLHRhcmdldERhdGU6Z30pe2xldCB3PWF3YWl0IEpQKGUsbi5hY3Rpdml0aWVzKTtpZih3LnNpemU9PT0wKXJldHVybnthY3Rpdml0aWVzOm4uYWN0aXZpdGllcyxkYXRlTGFiZWw6byxkYXlXb3JkOnIsZGlzbWlzc2VkS2V5czpuLmRpc21pc3NlZEtleXMsZG9tYWluTmFtZTphLGRvbWFpblV1aWQ6aSxmcm9tQ2FjaGU6ITAsaXNGdXR1cmVEYXk6cyxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpuLmxsbUF0dHJpYnV0aW9uRm9vdGVyLHByb3ZpZGVyRW06cCxzY2hlZHVsZWRLZXlzOm4uc2NoZWR1bGVkS2V5c307bGV0IHY9bi5hY3Rpdml0aWVzLmZpbHRlcihFPT4hKEUudGFza1V1aWQmJncuaGFzKEUudGFza1V1aWQpKSkseT1uLmFjdGl2aXRpZXMuZmlsdGVyKEU9PkUudGFza1V1aWQmJncuaGFzKEUudGFza1V1aWQpKTtrKCJbcHJvcG9zZWQtYWdlbmRhXSByZWNvbmNpbGU6IGRyb3BwaW5nIGNvbXBsZXRlZC9yZW1vdmVkIHN1Z2dlc3Rpb25zLCByZS1xdWVyeWluZyByZXBsYWNlbWVudHMiLHtzdGFsZUNvdW50OnkubGVuZ3RoLGtlcHRDb3VudDp2Lmxlbmd0aH0pO2xldCBiPWF3YWl0IHZTKGUse2FpTW9kZWxPdmVycmlkZTp0LGRhdGVMYWJlbDpvLGRheVdvcmQ6cixkb21haW5OYW1lOmEsZG9tYWluVXVpZDppLGlzRnV0dXJlRGF5OnMsbWlncmF0aW9uRG9tYWluTmFtZTpsLG5vd01pbnV0ZXM6ZCxvYmxpZ2F0aW9uczpjLHByaW9yaXR5T3B0aW9uOnUscHJvdmlkZXJFbU92ZXJyaWRlOmYscmVjb21tZW5kYXRpb25Db250ZXh0Om0sdGFyZ2V0RGF0ZTpnfSksaD1RUChiLHYsdyx5KSxTPVsuLi52LC4uLmhdLnNvcnQoKEUsVCk9PkUuc3RhcnRNaW51dGVzLVQuc3RhcnRNaW51dGVzKSx4PW4ubGxtQXR0cmlidXRpb25Gb290ZXJ8fGIubGxtQXR0cmlidXRpb25Gb290ZXJ8fG51bGw7cmV0dXJuIGF3YWl0IE9oKGUse2FjdGl2aXRpZXM6UyxkYXRlOmcsZG9tYWluTmFtZTphLGRvbWFpblV1aWQ6aSxsbG1BdHRyaWJ1dGlvbkZvb3Rlcjp4LHByaW9yaXR5S2V5OnUua2V5LHByb3ZpZGVyRW06cCxyZWNvbW1lbmRhdGlvbkNvbnRleHRLZXk6bS5jYWNoZUtleX0pLHthY3Rpdml0aWVzOlMsZGF0ZUxhYmVsOm8sZGF5V29yZDpyLGRvbWFpbk5hbWU6YSxkb21haW5VdWlkOmksZnJvbUNhY2hlOiEwLGlzRnV0dXJlRGF5OnMsbGxtQXR0cmlidXRpb25Gb290ZXI6eCxwcm92aWRlckVtOnAsZGlzbWlzc2VkS2V5czpTLmZpbHRlcihFPT5FLnNjaGVkdWxlZEVtPT09SnQuRElTTUlTU0VEKS5tYXAoeGkpLHNjaGVkdWxlZEtleXM6Uy5maWx0ZXIoRT0+RS5zY2hlZHVsZWRFbT09PUp0LlNDSEVEVUxFRCkubWFwKHhpKX19YXN5bmMgZnVuY3Rpb24gSlAoZSx0KXtpZih0eXBlb2YgZS5nZXRUYXNrIT0iZnVuY3Rpb24iKXJldHVybiBuZXcgU2V0O2xldCBuPSh0fHxbXSkuZmlsdGVyKHI9PnIudGFza1V1aWQmJnIuaXNFeGlzdGluZyYmKHIuc2NoZWR1bGVkRW18fEp0LlBFTkRJTkcpPT09SnQuUEVORElORyksbz1hd2FpdCBQcm9taXNlLmFsbChuLm1hcChhc3luYyByPT57bGV0IGE9YXdhaXQgUHJvbWlzZS5yZXNvbHZlKGUuZ2V0VGFzayhyLnRhc2tVdWlkKSk7cmV0dXJuIWF8fCEhYS5jb21wbGV0ZWRBdHx8ISFhLmRpc21pc3NlZEF0P3IudGFza1V1aWQ6bnVsbH0pKTtyZXR1cm4gbmV3IFNldChvLmZpbHRlcihCb29sZWFuKSl9ZnVuY3Rpb24gUVAoZSx0LG4sbyl7aWYoZS5lcnJvcnx8IUFycmF5LmlzQXJyYXkoZS5hY3Rpdml0aWVzKXx8ZS5hY3Rpdml0aWVzLmxlbmd0aD09PTApcmV0dXJuW107bGV0IHI9bmV3IFNldCh0LmZpbHRlcihpPT5pLnRhc2tVdWlkKS5tYXAoaT0+aS50YXNrVXVpZCkpLGE9W107Zm9yKGxldCBpIG9mIG8pe2xldCBzPWUuYWN0aXZpdGllcy5maW5kKGw9PmwudGFza1V1aWQmJiFyLmhhcyhsLnRhc2tVdWlkKSYmIW4uaGFzKGwudGFza1V1aWQpKTtpZighcylicmVhaztyLmFkZChzLnRhc2tVdWlkKSxhLnB1c2goe2R1cmF0aW9uTWludXRlczppLmR1cmF0aW9uTWludXRlc3x8MCxpc0V4aXN0aW5nOiEwLG5vdGVVdWlkOnMubm90ZVV1aWR8fG51bGwscmVhc29uOnMucmVhc29ufHwiIixzY2hlZHVsZWRFbTpKdC5QRU5ESU5HLHNvdXJjZToicHJvcG9zZWQiLHN0YXJ0TWludXRlczppLnN0YXJ0TWludXRlcyxzdGFydFRpbWU6aS5zdGFydFRpbWUsdGFyZ2V0TWlkbmlnaHRTZWNvbmRzOmkudGFyZ2V0TWlkbmlnaHRTZWNvbmRzPz9udWxsLHRhc2tVdWlkOnMudGFza1V1aWQsdGl0bGU6cy50aXRsZX0pfXJldHVybiBhfWZ1bmN0aW9uIFpQKGUsdD1uZXcgRGF0ZSl7bGV0IG49bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSwwLDAsMCksbz1NYXRoLnJvdW5kKChlLmdldFRpbWUoKS1uLmdldFRpbWUoKSkvUGgpO3JldHVybiBvPD0wPyJ0b2RheSI6bz09PTE/InRvbW9ycm93Ijpgb24gJHtlLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToibG9uZyJ9KX1gfWZ1bmN0aW9uIExoKGU9bmV3IERhdGUpe2xldCB0PWUuZ2V0SG91cnMoKT49S1A/MTowLG49bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKSt0LDAsMCwwKTtyZXR1cm4gZUwobil9ZnVuY3Rpb24gZUwoZSl7bGV0IHQ9ZS5nZXREYXkoKSxuPXQ9PT1ZUD8yOnQ9PT1qUD8xOjA7cmV0dXJuIG49PT0wP2U6bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKStuLDAsMCwwKX1mdW5jdGlvbiBiUyhlLHQpe3JldHVybiBlLmdldEZ1bGxZZWFyKCk9PT10LmdldEZ1bGxZZWFyKCkmJmUuZ2V0TW9udGgoKT09PXQuZ2V0TW9udGgoKSYmZS5nZXREYXRlKCk9PT10LmdldERhdGUoKX1mdW5jdGlvbiB0TChlLHQpe2xldCBuPW1TKHQsLTEpLG89W107Zm9yKGxldCBhPTE7YTxxUDthKz0xKW8ucHVzaChtUyh0LC1hKSk7bGV0IHI9bmV3IFNldDtmb3IobGV0W2EsaV1vZiBlKXtpZihpLmhhcyhuKSl7ci5hZGQoYSk7Y29udGludWV9by5maWx0ZXIocz0+aS5oYXMocykpLmxlbmd0aD49JFAmJnIuYWRkKGEpfXJldHVybiByfWZ1bmN0aW9uIG1TKGUsdCl7cmV0dXJuIGFlKG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCkrdCwwLDAsMCkpfWFzeW5jIGZ1bmN0aW9uIG5MKGUsdCxuLG89bnVsbCl7bGV0IHI9YXdhaXQgS24oZSxvKSxhPShBcnJheS5pc0FycmF5KHIpP3I6W10pLmZpbHRlcihtPT5tJiYhbS5jb21wbGV0ZWRBdCYmIW0uZGlzbWlzc2VkQXQpLGk9ckwoYSkscz1hLnNsaWNlKCkuc29ydCgobSxnKT0+VmMoZyktVmMobSkpLGw9TWF0aC5mbG9vcigoRGF0ZS5ub3coKS1fUCpQaCkvMWUzKSxkPXMuZmlsdGVyKG09PlZjKG0pPj1sKSxjPU1hdGgubWluKExQLE1hdGgubWF4KGQubGVuZ3RoLFBQKSksdT10Py5iYXJuYWNsZT9hTChhLGkpOnMscD1zLmZpbHRlcihtPT53UyhtLG4pKSxmPW9MKFsuLi51LnNsaWNlKDAsYyksLi4ucF0pO3JldHVybiBrKCJbcHJvcG9zZWQtYWdlbmRhXSBfc2VsZWN0UmVsZXZhbnRUYXNrcyIse2Jhcm5hY2xlOiEhdD8uYmFybmFjbGUsZG9tYWluVXVpZDpvLG9wZW5UYXNrQ291bnQ6YS5sZW5ndGgscmVjZW50V2luZG93Q291bnQ6ZC5sZW5ndGgsc2NoZWR1bGVkT25UYXJnZXRDb3VudDpwLmxlbmd0aCxzZWxlY3RlZENvdW50OmYubGVuZ3RofSksZi5tYXAobT0+aUwobSxpLG4pKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gb0woZSl7bGV0IHQ9bmV3IFNldDtyZXR1cm4gZS5maWx0ZXIobj0+IW4/LnV1aWR8fHQuaGFzKG4udXVpZCk/ITE6KHQuYWRkKG4udXVpZCksITApKX1mdW5jdGlvbiB3UyhlLHQpe2lmKCFlPy5zdGFydEF0KXJldHVybiExO2xldCBuPWUuc3RhcnRBdDxSaD9lLnN0YXJ0QXQqMWUzOmUuc3RhcnRBdDtyZXR1cm4gYlMobmV3IERhdGUobiksdCl9ZnVuY3Rpb24gckwoZSl7bGV0IHQ9bmV3IE1hcDtmb3IobGV0IG4gb2YgZSl7bGV0IG89bi5ub3RlVVVJRHx8bnVsbDtvJiZ0LnNldChvLCh0LmdldChvKXx8MCkrMSl9cmV0dXJuIHR9ZnVuY3Rpb24gYUwoZSx0KXtsZXQgbj1vPT4odC5nZXQoby5ub3RlVVVJRHx8IiIpfHwwKSoxZTYtVmMobykvMWU0O3JldHVybiBlLnNsaWNlKCkuc29ydCgobyxyKT0+bihyKS1uKG8pKX1mdW5jdGlvbiBpTChlLHQsbil7bGV0IG89U3RyaW5nKGUuY29udGVudHx8IiIpLnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpLnN1YnN0cmluZygwLFVQKTtpZighb3x8IWUudXVpZClyZXR1cm4gbnVsbDtsZXQgcj1lLm5vdGVVVUlEfHxudWxsO3JldHVybnthZ2VEYXlzOnNMKGUpLGR1cmF0aW9uOmUuZHVyYXRpb24/P251bGwsaW1wb3J0YW50OiEhZS5pbXBvcnRhbnQsbm90ZU9wZW5Db3VudDpyJiZ0LmdldChyKXx8MCxub3RlVXVpZDpyLHNjaGVkdWxlZE9uVGFyZ2V0OndTKGUsbiksdGFza1RleHQ6byx0YXNrVXVpZDplLnV1aWR9fWZ1bmN0aW9uIHNMKGUpe2xldCB0PWxMKGU/LmNyZWF0ZWRBdCk7cmV0dXJuIHQ/TWF0aC5tYXgoMCxNYXRoLmZsb29yKChEYXRlLm5vdygpLzFlMy10KS8oUGgvMWUzKSkpOm51bGx9ZnVuY3Rpb24gbEwoZSl7cmV0dXJuIGU/ZTxSaD9lOk1hdGguZmxvb3IoZS8xZTMpOjB9ZnVuY3Rpb24gVmMoZSl7bGV0IHQ9ZT8udXBkYXRlZEF0Pz9lPy5zdGFydEF0Pz9lPy5jcmVhdGVkQXQ/PzA7cmV0dXJuIHQ/dDxSaD90Ok1hdGguZmxvb3IodC8xZTMpOjB9YXN5bmMgZnVuY3Rpb24gZEwoZSx7YWlNb2RlbE92ZXJyaWRlOnQsZGF0ZUxhYmVsOm4sZGF5V29yZDpvLGRvbWFpbk5hbWU6cixkb21haW5VdWlkOmEsaXNGdXR1cmVEYXk6aSxub3dNaW51dGVzOnM9bnVsbCxvYmxpZ2F0aW9uczpsPVtdLHByaW9yaXR5T3B0aW9uOmQscHJvdmlkZXJFbU92ZXJyaWRlOmMscXVhcnRlcmx5Q29udGVudDp1LHJlY29tbWVuZGF0aW9uQ29udGV4dDpwLHRhcmdldERhdGU6Zix0YXNrczptfSl7bGV0IGc9Y3x8X2UoKVtCLkxMTV9QUk9WSURFUl9NT0RFTF07aWYoISghIWcmJmchPT0ibm9uZSIpJiYhYXdhaXQgZS5maW5kTm90ZSh7bmFtZTpBb30pKXJldHVybnthY3Rpdml0aWVzOltdLGVycm9yOiJObyBBSSBwcm92aWRlciBjb25maWd1cmVkLiBQbGVhc2Ugc2VsZWN0IGEgcHJvdmlkZXIgaW4gcGx1Z2luIHNldHRpbmdzLiIsZXJyb3JDb2RlOiJub19wcm92aWRlcl9jb25maWd1cmVkIn07bGV0IHY9bmV3IFNldChbLi4ubC5tYXAoST0+SS50YXNrVXVpZCkuZmlsdGVyKEJvb2xlYW4pLC4uLm0uZmlsdGVyKEk9Pkkuc2NoZWR1bGVkT25UYXJnZXQpLm1hcChJPT5JLnRhc2tVdWlkKV0pLHk9YXdhaXQgc1MoZSx7ZGF0ZTpmLGRvbWFpbk5hbWU6cixkb21haW5VdWlkOmF9KS5jYXRjaChJPT4oaygiW3Byb3Bvc2VkLWFnZW5kYV0gcmVjZW50LWhpc3RvcnkgbG9va3VwIGZhaWxlZCIsST8ubWVzc2FnZSksbmV3IE1hcCkpLGI9dEwoeSxmKSxoPW5ldyBTZXQoWy4uLnYsLi4uYl0pLFM9bS5maWx0ZXIoST0+IWguaGFzKEkudGFza1V1aWQpKTtTLmxlbmd0aD09PTAmJmIuc2l6ZT4wJiYoUz1tLmZpbHRlcihJPT4hdi5oYXMoSS50YXNrVXVpZCkpLGsoIltwcm9wb3NlZC1hZ2VuZGFdIHJlY2VuY3kgZXhjbHVzaW9ucyBlbXB0aWVkIHRoZSBjYW5kaWRhdGUgcG9vbDsgcmVsYXhlZCB0byBzY2hlZHVsZWQtb25seSIpKSxrKCJbcHJvcG9zZWQtYWdlbmRhXSBleGNsdWRlZCBhbHJlYWR5LXNjaGVkdWxlZCArIHJlY2VudGx5LXByb3Bvc2VkIHRhc2tzIGZyb20gY2FuZGlkYXRlcyIse2NhbmRpZGF0ZUNvdW50Om0ubGVuZ3RoLHByb3Bvc2FibGVDb3VudDpTLmxlbmd0aCxhbHJlYWR5U2NoZWR1bGVkQ291bnQ6di5zaXplLHJlY2VudGx5UHJvcG9zZWRDb3VudDpiLnNpemV9KTtsZXQgeD1JYyhwKSxFPWNMKHtkYXRlTGFiZWw6bixpc0Z1dHVyZURheTppLG5vd01pbnV0ZXM6cyxvYmxpZ2F0aW9uczpsLHByaW9yaXR5T3B0aW9uOmQscXVhcnRlcmx5Q29udGVudDp1LHJlY29tbWVuZGF0aW9uQ29udGV4dDpwLHRhcmdldERhdGU6Zix0YXNrczpTLGFsbG93SW52ZW50ZWRUcmF2ZWxBY3Rpdml0aWVzOnh9KSxUPXBlcmZvcm1hbmNlLm5vdygpLEE7dHJ5e2soIltwcm9wb3NlZC1hZ2VuZGFdIHNlbmRpbmcgcHJvbXB0IHRvIExMTSwgbGVuZ3RoOiIsRS5sZW5ndGgpO2xldHthaU1vZGVsOkksYXBpS2V5OkgsanNvblJlc3BvbnNlOl8sdGltZW91dFNlY29uZHM6S309eFMoYyx0KTtBPWF3YWl0IENjKGUsRSx7YWlNb2RlbDpJLGFwaUtleTpILGpzb25SZXNwb25zZTpfLHRpbWVvdXRTZWNvbmRzOkt9KSxrKCJbcHJvcG9zZWQtYWdlbmRhXSBMTE0gcmV0dXJuZWQiLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktVCkudG9GaXhlZCgxKSksYWN0aXZpdHlDb3VudDpBcnJheS5pc0FycmF5KEE/LmFjdGl2aXRpZXMpP0EuYWN0aXZpdGllcy5sZW5ndGg6bnVsbH0pfWNhdGNoKEkpe2soIltwcm9wb3NlZC1hZ2VuZGFdIExMTSBjYWxsIHRocmV3Iix7bWVzc2FnZTpJPy5tZXNzYWdlLHN0YXR1czpJPy5yZXNwb25zZT8uc3RhdHVzfSk7bGV0IEg9SS5yZXNwb25zZT8uc3RhdHVzO3JldHVybiBIPT09QlB8fEg9PT1IUD97YWN0aXZpdGllczpbXSxlcnJvcjoiVGhlIEFQSSBrZXkgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC4iLGVycm9yQ29kZToiaW52YWxpZF9hcGlfa2V5In06e2FjdGl2aXRpZXM6W10sZXJyb3I6YExMTSByZXF1ZXN0IGZhaWxlZCAoJHtJLm1lc3NhZ2V8fCJ1bmtub3duIGVycm9yIn0pLmAsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLGVycm9yRGV0YWlsOkkubWVzc2FnZXx8bnVsbH19aWYoIUF8fCFBcnJheS5pc0FycmF5KEEuYWN0aXZpdGllcykpe2xldCBJPUE/SlNPTi5zdHJpbmdpZnkoQSkuc3Vic3RyaW5nKDAsV1ApOiJlbXB0eSByZXNwb25zZSI7cmV0dXJue2FjdGl2aXRpZXM6W10sZXJyb3I6IlVuYWJsZSB0byBwcm9jZXNzIHRoZSBBSSBwcm92aWRlcidzIHJlc3BvbnNlIGludG8gYSBzY2hlZHVsZS4iLGVycm9yQ29kZToicGFyc2VfZXJyb3IiLGVycm9yRGV0YWlsOkl9fWxldCBDPW5ldyBTZXQoUy5tYXAoST0+SS50YXNrVXVpZCkpLE89bmV3IE1hcChTLm1hcChJPT5bSS50YXNrVXVpZCxJLm5vdGVVdWlkXSkpLFA9dkwocCk7cmV0dXJue2FjdGl2aXRpZXM6dUwoQS5hY3Rpdml0aWVzLEMsTyxmLHthbGxvd0ludmVudGVkVHJhdmVsQWN0aXZpdGllczp4LGludmVudGVkTm90ZVV1aWQ6UCxub3dNaW51dGVzOnMsb2JsaWdhdGlvbnM6bH0pLGRhdGVMYWJlbDpuLGRheVdvcmQ6byxpc0Z1dHVyZURheTppLGxsbUF0dHJpYnV0aW9uRm9vdGVyOnhMKGMpfX1mdW5jdGlvbiBjTCh7YWxsb3dJbnZlbnRlZFRyYXZlbEFjdGl2aXRpZXM6ZT0hMSxkYXRlTGFiZWw6dCxpc0Z1dHVyZURheTpuLG5vd01pbnV0ZXM6bz1udWxsLG9ibGlnYXRpb25zOnI9W10scHJpb3JpdHlPcHRpb246YSxxdWFydGVybHlDb250ZW50OmkscmVjb21tZW5kYXRpb25Db250ZXh0OnMsdGFyZ2V0RGF0ZTpsLHRhc2tzOmR9KXtsZXQgYz1sLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToibG9uZyJ9KSx1PW4/IiBUaGlzIGFnZW5kYSBpcyBmb3IgYW4gdXBjb21pbmcgZGF5IHJhdGhlciB0aGFuIHRvZGF5LCBzbyBwbGFuIGl0IGFzIGEgZnJlc2ggc3RhcnQgdG8gdGhhdCBkYXkuIjoiIixwPWFsKEdQKmdTKSxmPWBZb3UgYXJlIGEgcHJvZHVjdGl2aXR5IGNvYWNoLiBCdWlsZCBhIHJlYWxpc3RpYyBob3VyLWJ5LWhvdXIgc2NoZWR1bGUgZm9yICR7dH0sIHdoaWNoIGlzIGEgJHtjfS4ke3V9CgojIyBUb2RheSdzIHByaW9yaXR5CiR7YT8uaW5zdHJ1Y3Rpb258fCJCdWlsZCBhIGJhbGFuY2VkLCBoaWdoLWxldmVyYWdlIGRheS4ifQoKIyMgU2NoZWR1bGluZyBydWxlcwotIFRha2UgdGhlIGRheSBvZiB0aGUgd2VlayBpbnRvIGFjY291bnQ6ICR7Y30gbWF5IGJlIGEgd2Vla2VuZCBvciBjYXJyeSBkaWZmZXJlbnQgd29ya2luZyBob3VycyBhbmQgZW5lcmd5IHRoYW4gYSB3ZWVrZGF5IFx1MjAxNCBwbGFuIGFjY29yZGluZ2x5LgotIENvbnNpZGVyIHdoZXRoZXIgJHt0fSBpcyBhIHB1YmxpYyBob2xpZGF5IG9yIGEgZGF5IHBlb3BsZSBjb21tb25seSB0YWtlIG9mZjsgaWYgc28sIGxpZ2h0ZW4gdGhlIHNjaGVkdWxlIG9yIHNraXAgd29yay1mb2N1c2VkIGJsb2NrcyBhcyBhcHByb3ByaWF0ZS4KLSBQcm9wb3NlIHNwZWNpZmljIGNsb2NrIHRpbWVzIGluIDI0LWhvdXIgIkhIOk1NIiBmb3JtYXQsIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5IGFjcm9zcyBhIG5vcm1hbCB3b3JraW5nIGRheS4KLSBMZWF2ZSBBVCBMRUFTVCAke2hTfSBtaW51dGVzIG9mIHVuc2NoZWR1bGVkIGJ1ZmZlciBiZXR3ZWVuIHRoZSBlbmQgb2Ygb25lIGFjdGl2aXR5IGFuZCB0aGUgc3RhcnQgb2YgdGhlIG5leHQuCi0gV29yayBBUk9VTkQgdGhlIGFscmVhZHktc2NoZWR1bGVkIG9ibGlnYXRpb25zIGJlbG93OiBuZXZlciBvdmVybGFwIHRoZW0gYW5kIG5ldmVyIHJlLXByb3Bvc2UgdGhlbS4KLSBUaGUgQ2FuZGlkYXRlIHRhc2tzIGJlbG93IGFyZSBOT1QgeWV0IHNjaGVkdWxlZCBmb3IgJHt0fTsgYW55dGhpbmcgYWxyZWFkeSBjb21taXR0ZWQgdG8gdGhlIGRheSBhcHBlYXJzIG9ubHkgaW4gdGhlIG9ibGlnYXRpb25zIHNlY3Rpb24gYW5kIG11c3Qgbm90IGJlIHByb3Bvc2VkIGFnYWluLgotICR7ZT8iVHJhdmVsL3ZhY2F0aW9uL2NvbmZlcmVuY2UgYWxsLWRheSBjb250ZXh0IGlzIGFjdGl2ZTogcHJlZmVyIHVzZWZ1bCB0cmlwLWFwcHJvcHJpYXRlIGFjdGl2aXRpZXMsIGFuZCB5b3UgbWF5IHJldHVybiBudWxsIHRhc2tVdWlkIGZvciBpbnZlbnRlZCBsb2NhbCByZWNvbW1lbmRhdGlvbnMuIjoiT05MWSBwcm9wb3NlIGFjdGl2aXRpZXMgZm9yIHRhc2tzIHRoYXQgYXBwZWFyIGluIHRoZSBDYW5kaWRhdGUgdGFza3MgSlNPTiBiZWxvdy4ifQotICR7ZT8iRm9yIGV4aXN0aW5nIHRhc2tzLCB1c2UgdGhlIGV4YWN0IHRhc2tVdWlkIGZyb20gb25lIGNhbmRpZGF0ZSB0YXNrLiBGb3IgaW52ZW50ZWQgdHJhdmVsIGFjdGl2aXRpZXMsIHNldCB0YXNrVXVpZCB0byBudWxsLiI6J0V2ZXJ5IHJldHVybmVkIGFjdGl2aXR5IE1VU1QgdXNlIHRoZSBleGFjdCAidGFza1V1aWQiIGZyb20gb25lIGNhbmRpZGF0ZSB0YXNrOyBuZXZlciBpbnZlbnQgdGFza3Mgb3IgVVVJRHMuJ30KLSAke2U/IkRvIG5vdCBwcm9wb3NlIGdlbmVyaWMgYnJlYWtzLCBwbGFubmluZywgb3IgcmV2aWV3IGJsb2NrczsgaW52ZW50ZWQgbnVsbC1VVUlEIGl0ZW1zIHNob3VsZCBiZSBjb25jcmV0ZSBsb2NhbC90cmF2ZWwgYWN0aXZpdGllcy4iOiJEbyBub3QgcHJvcG9zZSBicmVha3MsIHBsYW5uaW5nLCByZXZpZXcsIGNhbGVuZGFyIGJsb2Nrcywgb3Igb3RoZXIgc3VwcG9ydGluZyBhY3Rpdml0aWVzIHVubGVzcyB0aGV5IGFyZSBjYW5kaWRhdGUgdGFza3MuIn0KLSBGYXZvciB0aGUgdXNlcidzICJpbXBvcnRhbnQiIHRhc2tzIGFuZCB0YXNrcyB0aGF0IGFkdmFuY2UgdGhlIHF1YXJ0ZXJseSBwbGFuLCB3ZWlnaHRlZCBieSB0b2RheSdzIHByaW9yaXR5LgotIFJlc3BlY3QgZWFjaCB0YXNrJ3MgImR1cmF0aW9uIiAoc2Vjb25kcykgd2hlbiBwcmVzZW50OyBvdGhlcndpc2UgZXN0aW1hdGUgYSBzZW5zaWJsZSBkdXJhdGlvbi4KYDtvIT1udWxsJiYoZis9YC0gVGhlIGN1cnJlbnQgbG9jYWwgdGltZSBpcyAke2FsKG8pfS4gRG8gTk9UIHByb3Bvc2UgYW55IGFjdGl2aXR5IHRoYXQgc3RhcnRzIGJlZm9yZSB0aGlzIHRpbWUgXHUyMDE0IG9ubHkgc2NoZWR1bGUgdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBkYXkuCmAsZis9YC0gVGhlIHdvcmtpbmcgZGF5IGVuZHMgYXQgJHtwfSAoNnBtKS4gS2VlcCBwcm9wb3NlZCBhY3Rpdml0aWVzIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgJHtwfS4gT25seSBwcm9wb3NlIGFjdGl2aXRpZXMgYWZ0ZXIgJHtwfSBpZiB0b2RheSdzIHByaW9yaXR5IGV4cGxpY2l0bHkgY2FsbHMgZm9yIGFjdGl2aXRpZXMgdGhhdCBuYXR1cmFsbHkgaGFwcGVuIG91dHNpZGUgb2Ygd29yayBob3Vycy4KYCk7bGV0IG09Z0wocik7cmV0dXJuIGYrPWAKIyMgQWxyZWFkeSBvY2N1cGllZCB0aW1lcwpgLGYrPWBBbHJlYWR5IG9jY3VwaWVkIHRpbWVzOiBbICR7bS5qb2luKCIsICIpfHwibm9uZSJ9IF0uIEVuc3VyZSB0aGF0IHlvdXIgc3VnZ2VzdGlvbnMgZG8gTk9UIGluY2x1ZGUgYW55IHRhc2sgdGhhdCB3b3VsZCBmYWxsIGluIHRoZXNlIGFscmVhZHktc2NoZWR1bGVkIHRpbWUgc2xvdHMgZm9yIHRoZSBkYXkuIEF0dGVtcHQgdG8gbGVhdmUgYXQgbGVhc3QgYSAke1ZQfSBtaW51dGUgYnVmZmVyIGJldHdlZW4gdGhlIHVzZXIncyBldmVudHMgYW5kIHlvdXIgc3VnZ2VzdGlvbnMuCmAsZis9YAojIyBBbHJlYWR5LXNjaGVkdWxlZCBvYmxpZ2F0aW9ucyAoaW1tb3ZhYmxlOyBkbyBub3QgcmUtcHJvcG9zZSkKYCxmKz1yLmxlbmd0aD4wP3IubWFwKGc9PmAtICR7YWwoZy5zdGFydE1pbnV0ZXMpfSAke2cudGl0bGV9JHtnLmR1cmF0aW9uTWludXRlcz9gICgke2cuZHVyYXRpb25NaW51dGVzfW0pYDoiIn1gKS5qb2luKGAKYCk6Ik5vbmUuIixmKz1gCmAsaT9mKz1gCiMjIFVzZXIncyBRdWFydGVybHkgUGxhbgoke2l9CmA6Zis9YAojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KTm8gcXVhcnRlcmx5IHBsYW4gZm91bmQuCmAsZis9T2Mocyx7YWxsb3dJbnZlbnRlZFRyYXZlbEFjdGl2aXRpZXM6ZSxzY2hlZHVsZU1vZGU6ITB9KSxmKz1gCiMjIENhbmRpZGF0ZSB0YXNrcyAoSlNPTjsgJHtkLmxlbmd0aH0gdG90YWwpCmAsZis9ZC5sZW5ndGg+MD9kLm1hcChnPT5KU09OLnN0cmluZ2lmeShnKSkuam9pbihgCmApOiJObyBjYW5kaWRhdGUgdGFza3MuIixmKz1gCgpSZXR1cm4gT05MWSB2YWxpZCBKU09OIChubyBtYXJrZG93biBmZW5jZXMpIGluIGV4YWN0bHkgdGhpcyBzaGFwZToKeyJhY3Rpdml0aWVzIjpbeyJzdGFydFRpbWUiOiIwOTowMCIsImR1cmF0aW9uTWludXRlcyI6NjAsInRpdGxlIjoiQWN0aXZpdHkgdGl0bGUiLCJ0YXNrVXVpZCI6ImV4aXN0aW5nLXRhc2stdXVpZCIsInJlYXNvbiI6Ik9uZSBzZW50ZW5jZSBvbiB3aHkgdGhpcyBzbG90IG1hdHRlcnMgdG9kYXkifV19Ci0gInN0YXJ0VGltZSI6IDI0LWhvdXIgIkhIOk1NIi4KLSAiZHVyYXRpb25NaW51dGVzIjogaW50ZWdlciBtaW51dGVzLgotICJ0YXNrVXVpZCI6ICR7ZT8ndGhlIGV4YWN0ICJ0YXNrVXVpZCIgZnJvbSBhIGNhbmRpZGF0ZSB0YXNrLCBvciBudWxsIG9ubHkgZm9yIGFuIGludmVudGVkIHRyYXZlbC92YWNhdGlvbi9jb25mZXJlbmNlIGFjdGl2aXR5Lic6J3RoZSBleGFjdCAidGFza1V1aWQiIGZyb20gYSBjYW5kaWRhdGUgdGFzay4gQWN0aXZpdGllcyB3aXRob3V0IGEgY2FuZGlkYXRlIHRhc2tVdWlkIHdpbGwgYmUgZGlzY2FyZGVkLid9Ci0gS2VlcCB0aXRsZXMgY29uY2lzZS4gUHJvdmlkZSBiZXR3ZWVuIDQgYW5kIDEwIGFjdGl2aXRpZXMuYCxmfWZ1bmN0aW9uIHVMKGUsdCxuLG8se2FsbG93SW52ZW50ZWRUcmF2ZWxBY3Rpdml0aWVzOnI9ITEsaW52ZW50ZWROb3RlVXVpZDphPW51bGwsbm93TWludXRlczppPW51bGwsb2JsaWdhdGlvbnM6cz1bXX09e30pe2xldCBsPU1hdGguZmxvb3Ioby5nZXRUaW1lKCkvMWUzKSxkPWUubWFwKGM9PntsZXQgdT1oTChjPy5zdGFydFRpbWUpLHA9U3RyaW5nKGM/LnRpdGxlfHwiIikudHJpbSgpLGY9cEwoYyx0LHthbGxvd0ludmVudGVkVHJhdmVsQWN0aXZpdGllczpyfSk7aWYodT09bnVsbHx8IXB8fGY9PT12b2lkIDApcmV0dXJuIG51bGw7bGV0IG09TWF0aC5tYXgoMCxwYXJzZUludChjPy5kdXJhdGlvbk1pbnV0ZXMsMTApfHwwKSxnPSEhZjtyZXR1cm57ZHVyYXRpb25NaW51dGVzOm0saXNFeGlzdGluZzpnLG5vdGVVdWlkOmc/bi5nZXQoZil8fG51bGw6YSxyZWFzb246U3RyaW5nKGM/LnJlYXNvbnx8IiIpLnRyaW0oKSxzb3VyY2U6InByb3Bvc2VkIixzdGFydE1pbnV0ZXM6dSxzdGFydFRpbWU6YWwodSksdGFyZ2V0TWlkbmlnaHRTZWNvbmRzOmwsdGFza1V1aWQ6Znx8bnVsbCx0aXRsZTpwfX0pLmZpbHRlcihCb29sZWFuKS5zb3J0KChjLHUpPT5jLnN0YXJ0TWludXRlcy11LnN0YXJ0TWludXRlcyk7cmV0dXJuIGZMKGQse2VhcmxpZXN0U3RhcnQ6aXx8MCxvY2N1cGllZEJsb2Nrczp5TChzKX0pfWZ1bmN0aW9uIHBMKGUsdCx7YWxsb3dJbnZlbnRlZFRyYXZlbEFjdGl2aXRpZXM6bj0hMX09e30pe2xldCBvPXR5cGVvZiBlPy50YXNrVXVpZD09InN0cmluZyI/ZS50YXNrVXVpZC50cmltKCk6IiI7aWYobyYmdC5oYXMobykpcmV0dXJuIG87aWYoIW8mJm4pcmV0dXJuIG51bGw7aygiW3Byb3Bvc2VkLWFnZW5kYV0gZGlzY2FyZGluZyBMTE0gYWN0aXZpdHkgd2l0aG91dCBleHRhbnQgdGFza1V1aWQiLHt0YXNrVXVpZDpvfHxudWxsLHRpdGxlOlN0cmluZyhlPy50aXRsZXx8IiIpLnRyaW0oKXx8bnVsbH0pfWZ1bmN0aW9uIGZMKGUse2VhcmxpZXN0U3RhcnQ6dD0wLG9jY3VwaWVkQmxvY2tzOm49W119PXt9KXtsZXQgbz1bXSxyPXQ7Zm9yKGxldCBhIG9mIGUpe2xldCBpPU1hdGgubWF4KGEuc3RhcnRNaW51dGVzLHIpO2lmKGk9bUwoaSxhLmR1cmF0aW9uTWludXRlcyxuKSxpPj0yNCo2MCljb250aW51ZTtsZXQgcz17Li4uYSxzdGFydE1pbnV0ZXM6aSxzdGFydFRpbWU6YWwoaSl9O28ucHVzaChzKSxyPWkrcy5kdXJhdGlvbk1pbnV0ZXMraFN9cmV0dXJuIG99ZnVuY3Rpb24gbUwoZSx0LG4pe2lmKCFuLmxlbmd0aClyZXR1cm4gZTtsZXQgbz1NYXRoLm1heCh0LDEpLHI9ZSxhPSEwO2Zvcig7YTspe2E9ITE7Zm9yKGxldCBpIG9mIG4pcjxpLmVuZE1pbnV0ZXMmJmkuc3RhcnRNaW51dGVzPHIrbyYmKHI9aS5lbmRNaW51dGVzLGE9ITApfXJldHVybiByfWZ1bmN0aW9uIGhMKGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtsZXQgdD1lLnRyaW0oKS5tYXRjaCgvXihcZHsxLDJ9KTooXGR7Mn0pJC8pO2lmKCF0KXJldHVybiBudWxsO2xldCBuPXBhcnNlSW50KHRbMV0sMTApLG89cGFyc2VJbnQodFsyXSwxMCk7cmV0dXJuIG48MHx8bj4yM3x8bzwwfHxvPjU5P251bGw6bio2MCtvfWZ1bmN0aW9uIGFsKGUpe2xldCB0PU1hdGguZmxvb3IoZS82MCksbj1lJTYwO3JldHVybmAke1N0cmluZyh0KS5wYWRTdGFydCgyLCIwIil9OiR7U3RyaW5nKG4pLnBhZFN0YXJ0KDIsIjAiKX1gfWZ1bmN0aW9uIEloKGUpe2xldCB0PU1hdGguZmxvb3IoZS82MCklMjQsbj1lJTYwLG89dDwxMj8iYW0iOiJwbSI7cmV0dXJuYCR7dCUxMj09PTA/MTI6dCUxMn06JHtTdHJpbmcobikucGFkU3RhcnQoMiwiMCIpfSR7b31gfWZ1bmN0aW9uIGdMKGUpe3JldHVybihlfHxbXSkuZmlsdGVyKHQ9PnQmJnR5cGVvZiB0LnN0YXJ0TWludXRlcz09Im51bWJlciIpLnNsaWNlKCkuc29ydCgodCxuKT0+dC5zdGFydE1pbnV0ZXMtbi5zdGFydE1pbnV0ZXMpLm1hcCh0PT50LmR1cmF0aW9uTWludXRlcz9gJHtJaCh0LnN0YXJ0TWludXRlcyl9LSR7SWgodC5zdGFydE1pbnV0ZXMrdC5kdXJhdGlvbk1pbnV0ZXMpfWA6SWgodC5zdGFydE1pbnV0ZXMpKX1mdW5jdGlvbiB5TChlKXtyZXR1cm4oZXx8W10pLmZpbHRlcih0PT50JiZ0eXBlb2YgdC5zdGFydE1pbnV0ZXM9PSJudW1iZXIiKS5tYXAodD0+KHtlbmRNaW51dGVzOnQuc3RhcnRNaW51dGVzKyh0LmR1cmF0aW9uTWludXRlc3x8MCksc3RhcnRNaW51dGVzOnQuc3RhcnRNaW51dGVzfSkpLnNvcnQoKHQsbik9PnQuc3RhcnRNaW51dGVzLW4uc3RhcnRNaW51dGVzKX1mdW5jdGlvbiB2TChlKXtyZXR1cm4oZT8ucmVzZWFyY2hOb3Rlc3x8W10pLmZpbmQobj0+bj8udXVpZCk/LnV1aWR8fG51bGx9ZnVuY3Rpb24gYkwoZSx0PW51bGwpe2lmKHQhPW51bGwpcmV0dXJuIHQrZSpwUztsZXQgbj1lcihuZXcgRGF0ZSk7cmV0dXJuIE1hdGguZmxvb3Iobi5nZXRUaW1lKCkvMWUzKStlKnBTfWFzeW5jIGZ1bmN0aW9uIF9oKGUsdCxuKXtsZXQgbz1iTCh0LnN0YXJ0TWludXRlcyx0LnRhcmdldE1pZG5pZ2h0U2Vjb25kcz8/bnVsbCk7aWYodC5pc0V4aXN0aW5nJiZ0LnRhc2tVdWlkKXJldHVybiBhd2FpdCBlLnVwZGF0ZVRhc2sodC50YXNrVXVpZCx7c3RhcnRBdDpvfSk/e3N0YXJ0QXQ6byx0YXNrVXVpZDp0LnRhc2tVdWlkfTp7cmVhc29uOiJ1cGRhdGVfZmFpbGVkIix0YXNrVXVpZDp0LnRhc2tVdWlkfTtsZXQgcj10Lm5vdGVVdWlkfHxufHxhd2FpdCB3TChlKTtpZighcilyZXR1cm57cmVhc29uOiJtaXNzaW5nX25vdGUifTtsZXQgYT1hd2FpdCBlLmluc2VydFRhc2soe3V1aWQ6cn0se2NvbnRlbnQ6dC50aXRsZSxzdGFydEF0Om99KTtyZXR1cm4gYT97bm90ZVV1aWQ6cixzdGFydEF0Om8sdGFza1V1aWQ6YX06e3JlYXNvbjoiaW5zZXJ0X2ZhaWxlZCJ9fWFzeW5jIGZ1bmN0aW9uIHdMKGUpe2lmKHR5cGVvZiBlLmZpbmROb3RlIT0iZnVuY3Rpb24ifHx0eXBlb2YgZS5jcmVhdGVOb3RlIT0iZnVuY3Rpb24iKXJldHVybiBudWxsO2xldCB0PWF3YWl0IGUuZmluZE5vdGUoe25hbWU6ZlMsdGFnczpbd2VdfSkuY2F0Y2goKCk9Pm51bGwpO2lmKHQ/LnV1aWQpcmV0dXJuIHQudXVpZDtsZXQgbj1hd2FpdCBlLmNyZWF0ZU5vdGUoZlMsW3dlXSx7YXJjaGl2ZTohMX0pLmNhdGNoKCgpPT5udWxsKTtyZXR1cm4gdHlwZW9mIG49PSJvYmplY3QiP24/LnV1aWR8fG51bGw6bnx8bnVsbH1hc3luYyBmdW5jdGlvbiBrUyhlLHQsbil7bGV0IG89MCxyPTA7Zm9yKGxldCBhIG9mIHQpKGF3YWl0IF9oKGUsYSxuKSkudGFza1V1aWQ/cis9MTpvKz0xO3JldHVybiBrKCJbcHJvcG9zZWQtYWdlbmRhXSBhcHByb3ZlUHJvcG9zZWRBZ2VuZGEgY29tcGxldGUiLHtmYWlsZWQ6byxzY2hlZHVsZWQ6cn0pLHtmYWlsZWQ6byxzY2hlZHVsZWQ6cn19ZnVuY3Rpb24ga0woZT1udWxsKXtyZXR1cm4gZXx8X2UoKVtCLkxMTV9QUk9WSURFUl9NT0RFTF18fCJkZWZhdWx0In1mdW5jdGlvbiB4UyhlPW51bGwsdD1udWxsKXtsZXQgbj1fZSgpLG89e2pzb25SZXNwb25zZTohMCx0aW1lb3V0U2Vjb25kczpGUH0scj0oKT0+e3QmJihvLmFpTW9kZWw9dCl9O2lmKGUpe2xldCBsPWhuW2VdfHxudWxsLGQ9JHQoZSksYz1kPyhuPy5bZF18fCIiKS50cmltKCk6IiI7aWYobCYmYylyZXR1cm4gby5haU1vZGVsPWwsby5hcGlLZXk9YyxyKCksb31sZXQgYT1uW0IuTExNX1BST1ZJREVSX01PREVMXSxpPVZvKGEpLHM9emQoaG4pO2lmKHMpby5haU1vZGVsPXMubW9kZWwsby5hcGlLZXk9cy5hcGlLZXksayhgW3Byb3Bvc2VkLWFnZW5kYV0gRGV2IG1vZGU6IHVzaW5nICR7cy5wcm92aWRlcn0gZGV2IHRva2VuIChtb2RlbCAke3MubW9kZWx9KWApO2Vsc2UgaWYoYSYmaG5bYV0pe28uYWlNb2RlbD1oblthXTtsZXQgbD0kdChpKSxkPWw/KG5bbF18fCIiKS50cmltKCk6IiI7ZCYmKG8uYXBpS2V5PWQpfXJldHVybiByKCksb31mdW5jdGlvbiB4TChlPW51bGwpe2xldCB0PXhTKGUpLmFpTW9kZWw7cmV0dXJuIHQ/YFNjaGVkdWxlIHByb3Bvc2VkIGJ5ICR7dH1gOm51bGx9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuYCR7ZS5zdGFydE1pbnV0ZXN9Ojoke2UudGFza1V1aWR8fGUudGl0bGV9YH1hc3luYyBmdW5jdGlvbiBpbChlLHQsbixvKXshdD8uZGF0ZXx8IXQ/LmRvbWFpbk5hbWV8fCF0Py5wcm92aWRlckVtfHwhbj8ubGVuZ3RofHxhd2FpdCBkUyhlLHthY3Rpdml0eUtleXM6bixkYXRlOnQuZGF0ZSxkb21haW5OYW1lOnQuZG9tYWluTmFtZSxkb21haW5VdWlkOnQuZG9tYWluVXVpZCxwcmlvcml0eUtleTp0LnByaW9yaXR5S2V5LHByb3ZpZGVyRW06dC5wcm92aWRlckVtLHNjaGVkdWxlZEVtOm99KS5jYXRjaChyPT5sb2dJZkVuYWJsZWQoIltwcm9wb3NlZC1hZ2VuZGFdIGZhaWxlZCB0byBwZXJzaXN0IHRhc2sgc3RhdHVzIixyPy5tZXNzYWdlKSl9YXN5bmMgZnVuY3Rpb24gU1MoZSx7ZGVmYXVsdE5vdGVVdWlkOnQsZGlzbWlzc2VkS2V5czpuLGxsbURhdGVSZWNvcmQ6byxwcm9wb3NlZDpyLHNjaGVkdWxlZEtleXM6YSxzZXRBcHByb3Zpbmc6aSxzZXRTY2hlZHVsZWRLZXlzOnN9KXtsZXQgbD1yLmZpbHRlcihkPT4hYS5oYXMoUXQoZCkpJiYhbi5oYXMoUXQoZCkpKTtpZihsLmxlbmd0aCE9PTApe2koITApO3RyeXtsZXR7ZmFpbGVkOmQsc2NoZWR1bGVkOmN9PWF3YWl0IGtTKGUsbCx0KTtzKHU9PkFTKHUsbC5tYXAoUXQpKSksYz4wJiZEUygpLGF3YWl0IGlsKGUsbyxsLm1hcChRdCksSnQuU0NIRURVTEVEKSxhd2FpdCBlLmFsZXJ0KGQ+MD9gU2NoZWR1bGVkICR7Y30gYWN0aXZpdGllczsgJHtkfSBjb3VsZCBub3QgYmUgc2NoZWR1bGVkLmA6YFNjaGVkdWxlZCBhbGwgJHtjfSBhY3Rpdml0aWVzLmApfWZpbmFsbHl7aSghMSl9fX1mdW5jdGlvbiBFUyhlLHQsbix7aGlkZVBhc3RCZWZvcmVNaW51dGVzOm89bnVsbH09e30pe2xldCByPShlfHxbXSkubWFwKGk9Pih7Li4uaSxpc09ibGlnYXRpb246ITB9KSksYT0odHx8W10pLmZpbHRlcihpPT4hbi5oYXMoUXQoaSkpKS5maWx0ZXIoaT0+bz09bnVsbHx8aS5zdGFydE1pbnV0ZXM+PW8pLm1hcChpPT4oey4uLmksaXNPYmxpZ2F0aW9uOiExfSkpO3JldHVyblsuLi5yLC4uLmFdLnNvcnQoKGkscyk9Pmkuc3RhcnRNaW51dGVzLXMuc3RhcnRNaW51dGVzKX1mdW5jdGlvbiBVaChlLHQsbil7cmV0dXJuKGV8fFtdKS5maWx0ZXIobz0+IXQuaGFzKFF0KG8pKSYmIW4uaGFzKFF0KG8pKSkubGVuZ3RofWFzeW5jIGZ1bmN0aW9uIE5TKGUse2NhbGVuZGFyRXZlbnRzOnQ9bnVsbCxjdXJyZW50RGF0ZTpuLGRvbWFpbk5hbWU6byxkb21haW5VdWlkOnIsZm9yY2VSZWdlbmVyYXRlOmE9ITEscHJpb3JpdHlLZXk6aSxwcm92aWRlckVtOnMsc2V0QXBwcm92aW5nOmwsc2V0QXR0cmlidXRpb246ZCxzZXREYXRlTGFiZWw6YyxzZXREaXNtaXNzZWRLZXlzOnUsc2V0RXJyb3I6cCxzZXRJc0Z1dHVyZURheTpmLHNldExvYWRpbmc6bSxzZXRPYmxpZ2F0aW9uczpnLHNldFByb3Bvc2VkOncsc2V0UmVjb3JkRG9tYWluTmFtZTp2LHNldFJlY29yZERvbWFpblV1aWQ6eSxzZXRSZWNvcmRQcm92aWRlckVtOmIsc2V0U2NoZWR1bGVkS2V5czpofSl7bSghMCkscChudWxsKSxsKCExKSxoKG5ldyBTZXQpLHUobmV3IFNldCk7dHJ5e2xldCBTPW4/SWUobik6bmV3IERhdGUseD1uZXcgRGF0ZSxFPW4/bmV3IERhdGUoUy5nZXRGdWxsWWVhcigpLFMuZ2V0TW9udGgoKSxTLmdldERhdGUoKSx4LmdldEhvdXJzKCkseC5nZXRNaW51dGVzKCkseC5nZXRTZWNvbmRzKCkpOngsVD1MaChFKSxBPWF3YWl0IGIwKGUse2NhbGVuZGFyRXZlbnRzOnQsY3VycmVudERhdGU6VCxkb21haW5VdWlkOnJ9KTtnKEEpO2xldCBDPWF3YWl0IHlTKGUse2NhbGVuZGFyRXZlbnRzOnQsZG9tYWluTmFtZTpvLGRvbWFpblV1aWQ6cixmb3JjZVJlZ2VuZXJhdGU6YSxvYmxpZ2F0aW9uczpBLHByaW9yaXR5S2V5OmkscHJvdmlkZXJFbU92ZXJyaWRlOnN8fG51bGwsdGFyZ2V0RGF0ZTpUfSk7Qy5lcnJvcj8ocCh7ZXJyb3I6Qy5lcnJvcixlcnJvckNvZGU6Qy5lcnJvckNvZGV8fG51bGx9KSx3KFtdKSk6KHcoQy5hY3Rpdml0aWVzKSxjKEMuZGF0ZUxhYmVsKSxkKEMubGxtQXR0cmlidXRpb25Gb290ZXIpLGYmJmYoQy5pc0Z1dHVyZURheSksdiYmdihDLmRvbWFpbk5hbWUpLHkmJnkoQy5kb21haW5VdWlkKSxiJiZiKEMucHJvdmlkZXJFbXx8bnVsbCksQy5zY2hlZHVsZWRLZXlzPy5sZW5ndGgmJmgobmV3IFNldChDLnNjaGVkdWxlZEtleXMpKSxDLmRpc21pc3NlZEtleXM/Lmxlbmd0aCYmdShuZXcgU2V0KEMuZGlzbWlzc2VkS2V5cykpLEMuZnJvbUNhY2hlfHxCZSgiZ2VuZXJhdGVQcm9wb3NlZEFnZW5kYSIse2NvdW50OkMuYWN0aXZpdGllcz8ubGVuZ3RofHwwfSkpfWZpbmFsbHl7bSghMSl9fWFzeW5jIGZ1bmN0aW9uIFRTKGUsdCxuLG8scj1udWxsKXtsZXQgYT1hd2FpdCBfaChlLHQsbik7aWYoIWEudGFza1V1aWQpe2F3YWl0IGUuYWxlcnQoIkNvdWxkIG5vdCBzY2hlZHVsZSB0aGlzIGFjdGl2aXR5LiBQbGVhc2UgdHJ5IGFnYWluIG9yIHNjaGVkdWxlIGl0IG1hbnVhbGx5LiIpO3JldHVybn1vKGk9PkFTKGksW1F0KHQpXSkpLERTKHtjb250ZW50OnQudGl0bGUsbm90ZVVVSUQ6YS5ub3RlVXVpZHx8dC5ub3RlVXVpZHx8bnVsbCxzdGFydEF0OmEuc3RhcnRBdCx0YXNrVXVpZDphLnRhc2tVdWlkfSksYXdhaXQgaWwoZSxyLFtRdCh0KV0sSnQuU0NIRURVTEVEKX1mdW5jdGlvbiBEUyhlPXt9KXt0eXBlb2Ygd2luZG93PiJ1Inx8IXdpbmRvdy5kaXNwYXRjaEV2ZW50fHx3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQobWkse2RldGFpbDplfSkpfWZ1bmN0aW9uIEFTKGUsdCl7bGV0IG49bmV3IFNldChlKTtyZXR1cm4gdC5mb3JFYWNoKG89Pm4uYWRkKG8pKSxufXZhciBTZT1MKG1lKCkpO3ZhciBjZT1MKFgoKSksc2w9InByb3Bvc2VkLWFnZW5kYSIsU0w9bmV3IFNldChbImludmFsaWRfYXBpX2tleSIsImxsbV9lcnJvciIsIm5vX3Byb3ZpZGVyX2NvbmZpZ3VyZWQiLCJwYXJzZV9lcnJvciJdKSxFTD1be2ljb246Ilx1ezFGNUQzfVx1RkUwRiIsbGFiZWw6IkF1dG8tZHJhZnQgeW91ciBkYXkifSx7aWNvbjoiXHUyNjk2XHVGRTBGIixsYWJlbDoiQmFsYW5jZSB3b3JrIGJ5IHByaW9yaXR5In0se2ljb246Ilx1ezFGM0FGfSIsbGFiZWw6IkFsaWduIHRoZSBkYXkgdG8gZ29hbHMifSx7aWNvbjoiXHUyM0YwIixsYWJlbDoiU2NoZWR1bGUgYXJvdW5kIG9ibGlnYXRpb25zIn0se2ljb246Ilx1ezFGNTA0fSIsbGFiZWw6IlJlc2VlZCB3aXRoIGFueSBtb2RlbCJ9LHtpY29uOiJcdXsxRjlFMH0iLGxhYmVsOiJGcm9udGllciBtb2RlbHMsIG5vIGtleSJ9XTtmdW5jdGlvbiBOTChlKXtyZXR1cm4gaG5bZV18fGV8fCJkZWZhdWx0IG1vZGVsIn1mdW5jdGlvbiBUTCgpe3JldHVybigwLGNlLmpzeCkocmUse3dpZGdldElkOnNsLGNoaWxkcmVuOigwLGNlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1sb2FkaW5nIixjaGlsZHJlbjpbKDAsY2UuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtc3Bpbm5lciJ9KSwoMCxjZS5qc3gpKCJwIix7Y2hpbGRyZW46IkRyYWZ0aW5nIHlvdXIgaG91ci1ieS1ob3VyIHNjaGVkdWxlIFx1MjAyNiJ9KV19KX0pfWZ1bmN0aW9uIENTKHttZXNzYWdlOmUsb25SZXRyeTp0fSl7cmV0dXJuKDAsY2UuanN4KShyZSx7d2lkZ2V0SWQ6c2wsY2hpbGRyZW46KDAsY2UuanN4cykoImRpdiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLW1lc3NhZ2UiLGNoaWxkcmVuOlsoMCxjZS5qc3gpKCJwIix7Y2hpbGRyZW46ZX0pLCgwLGNlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXJldHJ5IixvbkNsaWNrOnQsY2hpbGRyZW46IlRyeSBhZ2FpbiJ9KV19KX0pfWZ1bmN0aW9uIERMKHttb2RlbE5hbWU6ZSxvbkNoYW5nZU1vZGVsOnQsb25Qcmlvcml0eUNoYW5nZTpuLHByaW9yaXR5S2V5Om99KXtyZXR1cm4oMCxjZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtY29udHJvbHMiLGNoaWxkcmVuOlsoMCxjZS5qc3gpKCJsYWJlbCIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXByaW9yaXR5LWxhYmVsIixjaGlsZHJlbjoiVG9kYXkncyBwcmlvcml0eSJ9KSwoMCxjZS5qc3gpKCJzZWxlY3QiLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1wcmlvcml0eS1zZWxlY3QiLHZhbHVlOm8sb25DaGFuZ2U6bixjaGlsZHJlbjpybC5tYXAocj0+KDAsY2UuanN4KSgib3B0aW9uIix7dmFsdWU6ci5rZXksY2hpbGRyZW46ci5sYWJlbH0sci5rZXkpKX0pLCgwLGNlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtbW9kZWwiLHRpdGxlOiJBSSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgYWdlbmRhIixjaGlsZHJlbjpbIlx1ezFGMzEwfSAiLGVdfSksKDAsY2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtbW9kZWwtY2hhbmdlIix0aXRsZToiQ2hhbmdlIEFJIHByb3ZpZGVyIixvbkNsaWNrOnQsY2hpbGRyZW46Ilx1MjFDNSJ9KV19KX1mdW5jdGlvbiBBTCh7b25EaXNtaXNzOmUsb25PcGVuTm90ZTp0LG9uU2NoZWR1bGU6bixyb3c6byxzY2hlZHVsZWRLZXlzOnIsdGltZUZvcm1hdDphfSl7bGV0IGk9by5pc09ibGlnYXRpb258fHIuaGFzKFF0KG8pKSxzPWNvKG8udGl0bGUpfHxvLnRpdGxlLGw9ISEoby5ub3RlVXVpZHx8by50YXNrVXVpZCk7cmV0dXJuKDAsY2UuanN4cykoImRpdiIse2NsYXNzTmFtZTpgcHJvcG9zZWQtYWdlbmRhLWl0ZW0ke2k/IiBwcm9wb3NlZC1hZ2VuZGEtaXRlbS0tc2NoZWR1bGVkIjoiIn1gLGNoaWxkcmVuOlsoMCxjZS5qc3hzKSgic3BhbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXRpbWUtY29sIixjaGlsZHJlbjpbKDAsY2UuanN4KSgic3BhbiIse2NsYXNzTmFtZTpgcHJvcG9zZWQtYWdlbmRhLXRpbWUke2k/IiBwcm9wb3NlZC1hZ2VuZGEtdGltZS0tbXV0ZWQiOiIifWAsY2hpbGRyZW46Vmsoby5zdGFydE1pbnV0ZXMsYSl9KSxsPygwLGNlLmpzeCkoImEiLHtocmVmOiIjIixjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1ub3RlLWxpbmsiLHRpdGxlOiJPcGVuIHRoZSBub3RlIGZvciB0aGlzIHRhc2siLG9uQ2xpY2s6ZD0+dChkLG8pLGNoaWxkcmVuOiJOb3RlIn0pOm51bGxdfSksKDAsY2UuanN4cykoImRpdiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLWNvbnRlbnQiLGNoaWxkcmVuOlsoMCxjZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpzfX0pLCFvLmlzT2JsaWdhdGlvbiYmby5yZWFzb24/KDAsY2UuanN4KSgic3BhbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXJlYXNvbiIsY2hpbGRyZW46by5yZWFzb259KTpudWxsXX0pLG8uZHVyYXRpb25NaW51dGVzPygwLGNlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InByb3Bvc2VkLWFnZW5kYS1kdXJhdGlvbiIsY2hpbGRyZW46YCR7by5kdXJhdGlvbk1pbnV0ZXN9bWB9KTpudWxsLGk/KDAsY2UuanN4KSgic3BhbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLXNjaGVkdWxlZC1iYWRnZSIsdGl0bGU6IkFscmVhZHkgc2NoZWR1bGVkIHRvZGF5IixjaGlsZHJlbjoiU2NoZWR1bGVkIn0pOigwLGNlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYWN0aW9ucyIsY2hpbGRyZW46WygwLGNlLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToicHJvcG9zZWQtYWdlbmRhLWFkZCIsdGl0bGU6YFNjaGVkdWxlIGZvciAke28uc3RhcnRUaW1lfSB0b2RheWAsb25DbGljazpkPT5uKGQsbyksY2hpbGRyZW46Ilx1ezFGNEM1fSBBZGQgdG8gc2NoZWR1bGUifSksKDAsY2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtZGlzbWlzcyIsdGl0bGU6IkRpc21pc3MgdGhpcyBzdWdnZXN0aW9uIixvbkNsaWNrOmQ9PmUoZCxvKSxjaGlsZHJlbjoiXHhENyJ9KV19KV19KX1mdW5jdGlvbiBGaCh7YXBwOmUsY2FsZW5kYXJFdmVudHM6dCxjdXJyZW50RGF0ZTpuLGRlZmF1bHROb3RlVXVpZDpvLHByb3ZpZGVyQXBpS2V5OnIscHJvdmlkZXJFbTphLHRhc2tEb21haW5OYW1lOmksdGFza0RvbWFpblVVSUQ6cyx0aW1lRm9ybWF0Omx9KXtsZXQgZD1fZSgpW0IuUFJPUE9TRURfQUdFTkRBX1BSSU9SSVRZXXx8bnVsbCxjPV9lKClbQi5QUk9QT1NFRF9BR0VOREFfTExNXXx8bnVsbCxbdSxwXT0oMCxTZS51c2VTdGF0ZSkoITEpLFtmLG1dPSgwLFNlLnVzZVN0YXRlKSghMSksW2csd109KDAsU2UudXNlU3RhdGUpKG51bGwpLFt2LHldPSgwLFNlLnVzZVN0YXRlKShudWxsKSxbYixoXT0oMCxTZS51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLFtTLHhdPSgwLFNlLnVzZVN0YXRlKShudWxsKSxbRSxUXT0oMCxTZS51c2VTdGF0ZSkoITEpLFtBLENdPSgwLFNlLnVzZVN0YXRlKSghMCksW08sUF09KDAsU2UudXNlU3RhdGUpKGN8fGF8fG51bGwpLFtVLEldPSgwLFNlLnVzZVN0YXRlKShbXSksW0gsX109KDAsU2UudXNlU3RhdGUpKGR8fGNTKSxbSyxNXT0oMCxTZS51c2VTdGF0ZSkoW10pLFtXLERdPSgwLFNlLnVzZVN0YXRlKSghMSksW04sRl09KDAsU2UudXNlU3RhdGUpKGl8fCJBbGwgTm90ZXMiKSxbWSxqXT0oMCxTZS51c2VTdGF0ZSkoc3x8bnVsbCksW1osb2VdPSgwLFNlLnVzZVN0YXRlKShudWxsKSxbcSx0ZV09KDAsU2UudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxkZT0oMCxTZS51c2VSZWYpKG51bGwpLGxlPSgwLFNlLnVzZU1lbW8pKCgpPT4oe2RhdGU6bixkb21haW5OYW1lOk4sZG9tYWluVXVpZDpZLHByaW9yaXR5S2V5OkgscHJvdmlkZXJFbTpafSksW24sSCxOLFksWl0pLHBlPSgwLFNlLnVzZUNhbGxiYWNrKSgoe2ZvcmNlUmVnZW5lcmF0ZTpoZT0hMX09e30pPT5OUyhlLHtjYWxlbmRhckV2ZW50czp0LGN1cnJlbnREYXRlOm4sZG9tYWluTmFtZTppLGRvbWFpblV1aWQ6cyxmb3JjZVJlZ2VuZXJhdGU6aGUscHJpb3JpdHlLZXk6SCxwcm92aWRlckVtOk8sc2V0QXBwcm92aW5nOnAsc2V0QXR0cmlidXRpb246dyxzZXREYXRlTGFiZWw6eSxzZXREaXNtaXNzZWRLZXlzOmgsc2V0RXJyb3I6eCxzZXRJc0Z1dHVyZURheTpULHNldExvYWRpbmc6QyxzZXRPYmxpZ2F0aW9uczpJLHNldFByb3Bvc2VkOk0sc2V0UmVjb3JkRG9tYWluTmFtZTpGLHNldFJlY29yZERvbWFpblV1aWQ6aixzZXRSZWNvcmRQcm92aWRlckVtOm9lLHNldFNjaGVkdWxlZEtleXM6dGV9KSxbZSx0LG4sTyxILHIsaSxzXSksa2U9KDAsU2UudXNlQ2FsbGJhY2spKCgpPT5EKCEwKSxbXSksUGU9KDAsU2UudXNlQ2FsbGJhY2spKGhlPT57RCghMSksaGUmJmhlIT09TyYmKFAoaGUpLGUuc2V0U2V0dGluZyhCLlBST1BPU0VEX0FHRU5EQV9MTE0saGUpLHVvKEIuUFJPUE9TRURfQUdFTkRBX0xMTSxoZSkpfSxbZSxPXSksdWU9KDAsU2UudXNlQ2FsbGJhY2spKGhlPT57bGV0IGZlPWhlLnRhcmdldC52YWx1ZTtfKGZlKSxlLnNldFNldHRpbmcoQi5QUk9QT1NFRF9BR0VOREFfUFJJT1JJVFksZmUpLHVvKEIuUFJPUE9TRURfQUdFTkRBX1BSSU9SSVRZLGZlKX0sW2VdKSxxZT0oMCxTZS51c2VDYWxsYmFjaykoKGhlLGZlKT0+e2hlLnByZXZlbnREZWZhdWx0KCksaChfdD0+bmV3IFNldChfdCkuYWRkKFF0KGZlKSkpLGlsKGUsbGUsW1F0KGZlKV0sSnQuRElTTUlTU0VEKX0sW2UsbGVdKSxKZT0oMCxTZS51c2VDYWxsYmFjaykoKCk9PntsZXQgaGU9Sy5maWx0ZXIoZmU9PiFxLmhhcyhRdChmZSkpKS5tYXAoUXQpO2goZmU9PntsZXQgX3Q9bmV3IFNldChmZSk7cmV0dXJuIGhlLmZvckVhY2goWG49Pl90LmFkZChYbikpLF90fSksaWwoZSxsZSxoZSxKdC5ESVNNSVNTRUQpfSxbZSxsZSxLLHFdKSxRZT0oMCxTZS51c2VDYWxsYmFjaykoKGhlLGZlKT0+KGhlLnByZXZlbnREZWZhdWx0KCksQmUoInNjaGVkdWxlUHJvcG9zZWRBZ2VuZGFSb3ciLHtoYXNUYXNrOiEhZmUudGFza1V1aWR9KSxUUyhlLGZlLG8sdGUsbGUpKSxbZSxvLGxlXSkseXQ9KDAsU2UudXNlQ2FsbGJhY2spKGFzeW5jKGhlLGZlKT0+e2hlLnByZXZlbnREZWZhdWx0KCk7bGV0IF90PWZlLm5vdGVVdWlkfHwoYXdhaXQgZS5nZXRUYXNrKGZlLnRhc2tVdWlkKSkubm90ZVVVSUQ7YXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke190fWApfSxbZV0pLEx0PSgwLFNlLnVzZUNhbGxiYWNrKSgoKT0+KEJlKCJzY2hlZHVsZUFsbFByb3Bvc2VkQWdlbmRhIix7Y291bnQ6VWgoSyxxLGIpfSksU1MoZSx7ZGVmYXVsdE5vdGVVdWlkOm8sZGlzbWlzc2VkS2V5czpiLGxsbURhdGVSZWNvcmQ6bGUscHJvcG9zZWQ6SyxzY2hlZHVsZWRLZXlzOnEsc2V0QXBwcm92aW5nOnAsc2V0U2NoZWR1bGVkS2V5czp0ZX0pKSxbZSxvLGIsbGUsSyxxXSk7aWYoKDAsU2UudXNlRWZmZWN0KSgoKT0+e3BlKCl9LFtwZV0pLCgwLFNlLnVzZUVmZmVjdCkoKCk9PntXbihkZS5jdXJyZW50KX0sW1UsS10pLCgwLFNlLnVzZUVmZmVjdCkoKCk9PntjfHxhJiZhIT09TyYmUChhKX0sW2EsY10pLCgwLFNlLnVzZUVmZmVjdCkoKCk9PntsZXQgaGU9ITE7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlLmZpbmROb3RlKHtuYW1lOkFvfSkpLnRoZW4oZmU9PntoZXx8bSghIWZlKX0pLCgpPT57aGU9ITB9fSxbZV0pLHV0KHNsLCFBJiYhUywhIVMpLEEpcmV0dXJuKDAsY2UuanN4KShUTCx7fSk7aWYoUylyZXR1cm4hISEodHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLmVudj8uT1BFTl9BSV9BQ0NFU1NfVE9LRU58fCIifHxyKSYmU0wuaGFzKFMuZXJyb3JDb2RlKT8oMCxjZS5qc3gpKFFzLHthcHA6ZSxmZWF0dXJlczpFTCxtb3JlRmVhdHVyZXNMYWJlbDoiKyAxNSBtb3JlIGZlYXR1cmVzIGluY2x1ZGVkIix3aWRnZXRJZDpzbH0pOigwLGNlLmpzeCkoQ1Mse21lc3NhZ2U6Uy5lcnJvcixvblJldHJ5OigpPT5wZSgpfSk7bGV0IEhlPW5ldyBEYXRlLGJlPUU/bnVsbDpIZS5nZXRIb3VycygpKjYwK0hlLmdldE1pbnV0ZXMoKSxvdD1FUyhVLEssYix7aGlkZVBhc3RCZWZvcmVNaW51dGVzOmJlfSk7aWYob3QubGVuZ3RoPT09MClyZXR1cm4oMCxjZS5qc3gpKENTLHttZXNzYWdlOiJObyBzY2hlZHVsZSBjb3VsZCBiZSBwcm9wb3NlZCB5ZXQuIixvblJldHJ5OigpPT5wZSgpfSk7bGV0IHJ0PVVoKEsscSxiKTtyZXR1cm4oMCxjZS5qc3hzKShjZS5GcmFnbWVudCx7Y2hpbGRyZW46WygwLGNlLmpzeHMpKHJlLHtzdWJ0aXRsZTp2LHdpZGdldElkOnNsLGhlYWRlckFjdGlvbnM6KDAsY2UuanN4KSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLHRpdGxlOiJQcm9wb3NlIGEgZnJlc2ggc2NoZWR1bGUgKHJlcGxhY2VzIHRvZGF5J3Mgc2F2ZWQgc2V0KSIsb25DbGljazpoZT0+e2hlLnByZXZlbnREZWZhdWx0KCkscGUoe2ZvcmNlUmVnZW5lcmF0ZTohMH0pfSxjaGlsZHJlbjoiXHV7MUY1MDR9IFJlc2VlZCJ9KSxjaGlsZHJlbjpbKDAsY2UuanN4KShETCx7bW9kZWxOYW1lOk5MKE8pLG9uQ2hhbmdlTW9kZWw6a2Usb25Qcmlvcml0eUNoYW5nZTp1ZSxwcmlvcml0eUtleTpIfSksKDAsY2UuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtbGlzdCIscmVmOmRlLGNoaWxkcmVuOm90Lm1hcChoZT0+KDAsY2UuanN4KShBTCx7b25EaXNtaXNzOnFlLG9uT3Blbk5vdGU6eXQsb25TY2hlZHVsZTpRZSxyb3c6aGUsc2NoZWR1bGVkS2V5czpxLHRpbWVGb3JtYXQ6bH0sUXQoaGUpKSl9KSwoMCxjZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtZm9vdGVyIixjaGlsZHJlbjpbKDAsY2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYXBwcm92ZSIsb25DbGljazpMdCxkaXNhYmxlZDp1fHxydD09PTAsY2hpbGRyZW46dT8iQXBwcm92aW5nIFx1MjAyNiI6IkFwcHJvdmUgc2NoZWR1bGUifSksKDAsY2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtZGlzbWlzcy1hbGwiLG9uQ2xpY2s6SmUsZGlzYWJsZWQ6cnQ9PT0wLGNoaWxkcmVuOiJEaXNtaXNzIGFsbCJ9KV19KSwoMCxjZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtcGVuZGluZyIsY2hpbGRyZW46YCR7cnR9IHBlbmRpbmdgfSksZz8oMCxjZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJwcm9wb3NlZC1hZ2VuZGEtYXR0cmlidXRpb24iLGNoaWxkcmVuOmd9KTpudWxsXX0pLFc/KDAsY2UuanN4KShKcyx7YWxsb3dLZXlsZXNzUHJvdmlkZXJzOmYsY29uZmlndXJlZFByb3ZpZGVyRW1zOkZkKF9lKCkpLGN1cnJlbnRQcm92aWRlckVtOk8sb25DYW5jZWw6KCk9PkQoITEpLG9uU2VsZWN0OlBlLHN1Ym1pdExhYmVsOiJTdWJtaXQiLHRpdGxlOiJHZW5lcmF0ZSB0aGUgYWdlbmRhIHdpdGggd2hpY2ggQUkgcHJvdmlkZXI/In0pOm51bGxdfSl9dmFyIGdhPUwobWUoKSk7dmFyIENMPVt7dGV4dDoiVGhlIHNlY3JldCBvZiBnZXR0aW5nIGFoZWFkIGlzIGdldHRpbmcgc3RhcnRlZC4iLGF1dGhvcjoiTWFyayBUd2FpbiJ9LHt0ZXh0OiJZb3UgZG9uJ3QgaGF2ZSB0byBiZSBncmVhdCB0byBzdGFydCwgYnV0IHlvdSBoYXZlIHRvIHN0YXJ0IHRvIGJlIGdyZWF0LiIsYXV0aG9yOiJaaWcgWmlnbGFyIn0se3RleHQ6IkFjdGlvbiBpcyB0aGUgZm91bmRhdGlvbmFsIGtleSB0byBhbGwgc3VjY2Vzcy4iLGF1dGhvcjoiUGFibG8gUGljYXNzbyJ9LHt0ZXh0OiJEb25lIGlzIGJldHRlciB0aGFuIHBlcmZlY3QuIixhdXRob3I6IlNoZXJ5bCBTYW5kYmVyZyJ9LHt0ZXh0OiJBbWF0ZXVycyBzaXQgYW5kIHdhaXQgZm9yIGluc3BpcmF0aW9uOyB0aGUgcmVzdCBvZiB1cyBqdXN0IGdldCB1cCBhbmQgZ28gdG8gd29yay4iLGF1dGhvcjoiU3RlcGhlbiBLaW5nIn0se3RleHQ6IlRoZSB3YXkgdG8gZ2V0IHN0YXJ0ZWQgaXMgdG8gcXVpdCB0YWxraW5nIGFuZCBiZWdpbiBkb2luZy4iLGF1dGhvcjoiV2FsdCBEaXNuZXkifSx7dGV4dDoiRm9jdXMgb24gYmVpbmcgcHJvZHVjdGl2ZSBpbnN0ZWFkIG9mIGJ1c3kuIixhdXRob3I6IlRpbSBGZXJyaXNzIn0se3RleHQ6Ikl0J3Mgbm90IGFib3V0IGhhdmluZyB0aW1lLiBJdCdzIGFib3V0IG1ha2luZyB0aW1lLiIsYXV0aG9yOiIifSx7dGV4dDoiV29yayBleHBhbmRzIHRvIGZpbGwgdGhlIHRpbWUgYXZhaWxhYmxlIGZvciBpdHMgY29tcGxldGlvbi4iLGF1dGhvcjoiQ3lyaWwgTm9ydGhjb3RlIFBhcmtpbnNvbiJ9LHt0ZXh0OiJTdG9wIHdhaXRpbmcgZm9yIHRoZSByaWdodCB0aW1lLiBUaGUgdGltZSB3aWxsIG5ldmVyIGJlIGp1c3QgcmlnaHQuIixhdXRob3I6Ik5hcG9sZW9uIEhpbGwifSx7dGV4dDoiTW90aXZhdGlvbiBpcyB3aGF0IGdldHMgeW91IHN0YXJ0ZWQuIEhhYml0IGlzIHdoYXQga2VlcHMgeW91IGdvaW5nLiIsYXV0aG9yOiJKaW0gUnl1biJ9LHt0ZXh0OiJJZiB5b3Ugc3BlbmQgdG9vIG11Y2ggdGltZSB0aGlua2luZyBhYm91dCBhIHRoaW5nLCB5b3UnbGwgbmV2ZXIgZ2V0IGl0IGRvbmUuIixhdXRob3I6IkJydWNlIExlZSJ9LHt0ZXh0OiJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yZGluYXJ5IGFuZCBleHRyYW9yZGluYXJ5IGlzIHRoYXQgbGl0dGxlICdleHRyYScuIixhdXRob3I6IiJ9LHt0ZXh0OiJFZmZpY2llbmN5IGlzIGRvaW5nIHRoaW5ncyByaWdodC4gRWZmZWN0aXZlbmVzcyBpcyBkb2luZyB0aGUgcmlnaHQgdGhpbmdzLiIsYXV0aG9yOiJQZXRlciBEcnVja2VyIn0se3RleHQ6IllvdSBhcmUgbmV2ZXIgdG9vIG9sZCB0byBzZXQgYW5vdGhlciBnb2FsIG9yIHRvIGRyZWFtIGEgbmV3IGRyZWFtLiIsYXV0aG9yOiJDLlMuIExld2lzIn0se3RleHQ6IlNtYWxsIGRhaWx5IGltcHJvdmVtZW50cyBhcmUgdGhlIGtleSB0byBzdGFnZ2VyaW5nIGxvbmctdGVybSByZXN1bHRzLiIsYXV0aG9yOiJSb2JpbiBTaGFybWEifSx7dGV4dDoiRHJlYW1zIGRvbid0IHdvcmsgdW5sZXNzIHlvdSBkby4iLGF1dGhvcjoiSm9obiBDLiBNYXh3ZWxsIn0se3RleHQ6IlRoZSBtb3N0IGVmZmVjdGl2ZSB3YXkgdG8gZG8gaXQgaXMgdG8gZG8gaXQuIixhdXRob3I6IkFtZWxpYSBFYXJoYXJ0In0se3RleHQ6IlRha2UgdGltZSB0byBkZWxpYmVyYXRlLCBidXQgd2hlbiB0aGUgdGltZSBmb3IgYWN0aW9uIGFycml2ZXMsIHN0b3AgdGhpbmtpbmcgYW5kIGdvIGluLiIsYXV0aG9yOiJOYXBvbGVvbiBCb25hcGFydGUifSx7dGV4dDoiU3RyaXZpbmcgZm9yIGV4Y2VsbGVuY2UgbW90aXZhdGVzIHlvdTsgc3RyaXZpbmcgZm9yIHBlcmZlY3Rpb24gaXMgZGVtb3JhbGl6aW5nLiIsYXV0aG9yOiJIYXJyaWV0IEJyYWlrZXIifSx7dGV4dDoiVGhlIGpvdXJuZXkgb2YgYSB0aG91c2FuZCBtaWxlcyBiZWdpbnMgd2l0aCBhIHNpbmdsZSBzdGVwLiIsYXV0aG9yOiJMYW8gVHp1In0se3RleHQ6IkEgeWVhciBmcm9tIG5vdyB5b3UgbWF5IHdpc2ggeW91IGhhZCBzdGFydGVkIHRvZGF5LiIsYXV0aG9yOiJLYXJlbiBMYW1iIn0se3RleHQ6IlRoZSBiZWdpbm5pbmcgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhlIHdvcmsuIixhdXRob3I6IlBsYXRvIn0se3RleHQ6IllvdSBkb24ndCBuZWVkIHRvIHNlZSB0aGUgd2hvbGUgc3RhaXJjYXNlLCBqdXN0IHRha2UgdGhlIGZpcnN0IHN0ZXAuIixhdXRob3I6Ik1hcnRpbiBMdXRoZXIgS2luZyBKci4ifSx7dGV4dDoiU3RhcnQgd2hlcmUgeW91IGFyZS4gVXNlIHdoYXQgeW91IGhhdmUuIERvIHdoYXQgeW91IGNhbi4iLGF1dGhvcjoiQXJ0aHVyIEFzaGUifSx7dGV4dDoiVGhlIGZpcnN0IHN0ZXAgaXMgeW91IGhhdmUgdG8gc2F5IHRoYXQgeW91IGNhbi4iLGF1dGhvcjoiV2lsbCBTbWl0aCJ9LHt0ZXh0OiJJbiB0aGUgbWlkZGxlIG9mIGV2ZXJ5IGRpZmZpY3VsdHkgbGllcyBvcHBvcnR1bml0eS4iLGF1dGhvcjoiQWxiZXJ0IEVpbnN0ZWluIn0se3RleHQ6IkV2ZW4gdGhlIGxvbmdlc3Qgam91cm5leSBzdGFydHMgd2l0aCBwdXR0aW5nIG9uZSBmb290IGluIGZyb250IG9mIHRoZSBvdGhlci4iLGF1dGhvcjoiIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIHBlcmZlY3QgdG8gc3RhcnQsIGJ1dCB5b3UgaGF2ZSB0byBzdGFydCB0byBiZSBwZXJmZWN0LiIsYXV0aG9yOiIifSx7dGV4dDoiQ291cmFnZSBpcyBub3QgdGhlIGFic2VuY2Ugb2YgZmVhciwgYnV0IHRoZSBqdWRnbWVudCB0aGF0IHNvbWV0aGluZyBlbHNlIGlzIG1vcmUgaW1wb3J0YW50LiIsYXV0aG9yOiJBbWJyb3NlIFJlZG1vb24ifSx7dGV4dDoiV2hhdGV2ZXIgeW91IGNhbiBkbywgb3IgZHJlYW0geW91IGNhbiBcdTIwMTQgYmVnaW4gaXQuIEJvbGRuZXNzIGhhcyBnZW5pdXMsIHBvd2VyLCBhbmQgbWFnaWMgaW4gaXQuIixhdXRob3I6IkpvaGFubiBXb2xmZ2FuZyB2b24gR29ldGhlIn0se3RleHQ6IlRoZSBoYXJkZXN0IHBhcnQgaXMgc3RhcnRpbmcuIE9uY2UgeW91IGdldCB0aGF0IG91dCBvZiB0aGUgd2F5LCB5b3UnbGwgZmluZCB0aGUgcmVzdCBvZiB0aGUgam91cm5leSBtdWNoIGVhc2llci4iLGF1dGhvcjoiIn0se3RleHQ6IkluYWN0aW9uIGJyZWVkcyBkb3VidCBhbmQgZmVhci4gQWN0aW9uIGJyZWVkcyBjb25maWRlbmNlIGFuZCBjb3VyYWdlLiIsYXV0aG9yOiJEYWxlIENhcm5lZ2llIn0se3RleHQ6IlRoZSBiZXN0IHRpbWUgdG8gcGxhbnQgYSB0cmVlIHdhcyB0d2VudHkgeWVhcnMgYWdvLiBUaGUgc2Vjb25kIGJlc3QgdGltZSBpcyBub3cuIixhdXRob3I6IkNoaW5lc2UgUHJvdmVyYiJ9LHt0ZXh0OiJZb3UgZG9uJ3QgaGF2ZSB0byBiZSBmZWFybGVzcy4gSnVzdCBkb24ndCBsZXQgZmVhciBzdG9wIHlvdS4iLGF1dGhvcjoiIn0se3RleHQ6IlByb2dyZXNzLCBub3QgcGVyZmVjdGlvbiwgaXMgdGhlIGdvYWwuIixhdXRob3I6IiJ9LHt0ZXh0OiJOb3RoaW5nIHdpbGwgd29yayB1bmxlc3MgeW91IGRvLiIsYXV0aG9yOiJNYXlhIEFuZ2Vsb3UifSx7dGV4dDoiTGVhcCBhbmQgdGhlIG5ldCB3aWxsIGFwcGVhci4iLGF1dGhvcjoiSm9obiBCdXJyb3VnaHMifSx7dGV4dDoiVGhlIGZpcnN0IHN0ZXAgYmluZHMgb25lIHRvIHRoZSBzZWNvbmQuIixhdXRob3I6IkZyZW5jaCBQcm92ZXJiIn0se3RleHQ6IlRha2UgdGhlIGZpcnN0IHN0ZXAgaW4gZmFpdGguIFlvdSBkb24ndCBoYXZlIHRvIHNlZSB0aGUgd2hvbGUgc3RhaXJjYXNlLiIsYXV0aG9yOiJNYXJ0aW4gTHV0aGVyIEtpbmcgSnIuIn0se3RleHQ6IlRvZGF5IGlzIGEgbmV3IGRheS4gRG9uJ3QgbGV0IHllc3RlcmRheSdzIGZhaWx1cmVzIGhhdW50IGl0LiIsYXV0aG9yOiIifSx7dGV4dDoiRXZlcnkgbW9ybmluZyB3ZSBhcmUgYm9ybiBhZ2Fpbi4gV2hhdCB3ZSBkbyB0b2RheSBtYXR0ZXJzIG1vc3QuIixhdXRob3I6IkJ1ZGRoYSJ9LHt0ZXh0OiJXaXRoIHRoZSBuZXcgZGF5IGNvbWVzIG5ldyBzdHJlbmd0aCBhbmQgbmV3IHRob3VnaHRzLiIsYXV0aG9yOiJFbGVhbm9yIFJvb3NldmVsdCJ9LHt0ZXh0OiJUb2RheSBpcyBhbm90aGVyIGNoYW5jZSB0byBnZXQgYmV0dGVyLiIsYXV0aG9yOiIifSx7dGV4dDoiWWVzdGVyZGF5IGlzIG5vdCBvdXJzIHRvIHJlY292ZXIsIGJ1dCB0b21vcnJvdyBpcyBvdXJzIHRvIHdpbiBvciBsb3NlLiIsYXV0aG9yOiJMeW5kb24gQi4gSm9obnNvbiJ9LHt0ZXh0OiJUaGUgc3VuIGlzIGEgZGFpbHkgcmVtaW5kZXIgdGhhdCB3ZSB0b28gY2FuIHJpc2UgYWdhaW4gZnJvbSB0aGUgZGFya25lc3MuIixhdXRob3I6IlMuIEFqbmEifSx7dGV4dDoiRXZlcnkgZGF5IGlzIGEgc2Vjb25kIGNoYW5jZS4iLGF1dGhvcjoiIn0se3RleHQ6IlRvZGF5J3MgYWNjb21wbGlzaG1lbnRzIHdlcmUgeWVzdGVyZGF5J3MgaW1wb3NzaWJpbGl0aWVzLiIsYXV0aG9yOiJSb2JlcnQgSC4gU2NodWxsZXIifSx7dGV4dDoiRWFjaCBuZXcgZGF5IGlzIGEgYmxhbmsgcGFnZSBpbiB0aGUgZGlhcnkgb2YgeW91ciBsaWZlLiIsYXV0aG9yOiIifSx7dGV4dDoiQW4gb3B0aW1pc3Qgc2VlcyBhbiBvcHBvcnR1bml0eSBpbiBldmVyeSBjYWxhbWl0eTsgYSBwZXNzaW1pc3Qgc2VlcyBhIGNhbGFtaXR5IGluIGV2ZXJ5IG9wcG9ydHVuaXR5LiIsYXV0aG9yOiJXaW5zdG9uIENodXJjaGlsbCJ9LHt0ZXh0OiJPcHBvcnR1bml0aWVzIGRvbid0IGhhcHBlbi4gWW91IGNyZWF0ZSB0aGVtLiIsYXV0aG9yOiJDaHJpcyBHcm9zc2VyIn0se3RleHQ6IlRoaXMgaXMgYSB3b25kZXJmdWwgZGF5LiBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBvbmUgYmVmb3JlLiIsYXV0aG9yOiJNYXlhIEFuZ2Vsb3UifSx7dGV4dDoiWW91IGhhdmUgZXhhY3RseSBvbmUgbGlmZSBpbiB3aGljaCB0byBkbyBldmVyeXRoaW5nIHlvdSdsbCBldmVyIGRvLiBBY3QgYWNjb3JkaW5nbHkuIixhdXRob3I6IkNvbGluIFdyaWdodCJ9LHt0ZXh0OiJMaWZlIGlzIHdoYXQgaGFwcGVucyB3aGVuIHlvdSdyZSBidXN5IG1ha2luZyBvdGhlciBwbGFucy4iLGF1dGhvcjoiSm9obiBMZW5ub24ifSx7dGV4dDoiWW91ciBsaWZlIGRvZXMgbm90IGdldCBiZXR0ZXIgYnkgY2hhbmNlLCBpdCBnZXRzIGJldHRlciBieSBjaGFuZ2UuIixhdXRob3I6IkppbSBSb2huIn0se3RleHQ6IkRvbid0IHdhdGNoIHRoZSBjbG9jazsgZG8gd2hhdCBpdCBkb2VzLiBLZWVwIGdvaW5nLiIsYXV0aG9yOiJTYW0gTGV2ZW5zb24ifSx7dGV4dDoiQmVsaWV2ZSB5b3UgY2FuIGFuZCB5b3UncmUgaGFsZndheSB0aGVyZS4iLGF1dGhvcjoiVGhlb2RvcmUgUm9vc2V2ZWx0In0se3RleHQ6Ikl0IGRvZXMgbm90IG1hdHRlciBob3cgc2xvd2x5IHlvdSBnbyBhcyBsb25nIGFzIHlvdSBkbyBub3Qgc3RvcC4iLGF1dGhvcjoiQ29uZnVjaXVzIn0se3RleHQ6IlRoZSBvbmx5IGxpbWl0IHRvIG91ciByZWFsaXphdGlvbiBvZiB0b21vcnJvdyB3aWxsIGJlIG91ciBkb3VidHMgb2YgdG9kYXkuIixhdXRob3I6IkZyYW5rbGluIEQuIFJvb3NldmVsdCJ9LHt0ZXh0OiJUaGUgZnV0dXJlIGJlbG9uZ3MgdG8gdGhvc2Ugd2hvIGJlbGlldmUgaW4gdGhlIGJlYXV0eSBvZiB0aGVpciBkcmVhbXMuIixhdXRob3I6IkVsZWFub3IgUm9vc2V2ZWx0In0se3RleHQ6IklmIHlvdSdyZSBnb2luZyB0aHJvdWdoIGhlbGwsIGtlZXAgZ29pbmcuIixhdXRob3I6IldpbnN0b24gQ2h1cmNoaWxsIn0se3RleHQ6IlBlcnNpc3RlbmNlIGd1YXJhbnRlZXMgdGhhdCByZXN1bHRzIGFyZSBpbmV2aXRhYmxlLiIsYXV0aG9yOiJQYXJhbWFoYW5zYSBZb2dhbmFuZGEifSx7dGV4dDoiU3VjY2VzcyBpcyBub3QgZmluYWwsIGZhaWx1cmUgaXMgbm90IGZhdGFsOiBpdCBpcyB0aGUgY291cmFnZSB0byBjb250aW51ZSB0aGF0IGNvdW50cy4iLGF1dGhvcjoiV2luc3RvbiBDaHVyY2hpbGwifSx7dGV4dDoiWW91IG1pc3MgMTAwJSBvZiB0aGUgc2hvdHMgeW91IGRvbid0IHRha2UuIixhdXRob3I6IldheW5lIEdyZXR6a3kifSx7dGV4dDoiSXQgYWx3YXlzIHNlZW1zIGltcG9zc2libGUgdW50aWwgaXQncyBkb25lLiIsYXV0aG9yOiJOZWxzb24gTWFuZGVsYSJ9LHt0ZXh0OiJXZSBtYXkgZW5jb3VudGVyIG1hbnkgZGVmZWF0cywgYnV0IHdlIG11c3Qgbm90IGJlIGRlZmVhdGVkLiIsYXV0aG9yOiJNYXlhIEFuZ2Vsb3UifSx7dGV4dDoiSSBuZXZlciBkcmVhbWVkIGFib3V0IHN1Y2Nlc3MuIEkgd29ya2VkIGZvciBpdC4iLGF1dGhvcjoiRXN0XHhFOWUgTGF1ZGVyIn0se3RleHQ6IlRoZSBvbmx5IHdheSBvdXQgaXMgdGhyb3VnaC4iLGF1dGhvcjoiUm9iZXJ0IEZyb3N0In0se3RleHQ6IkhhcmRzaGlwcyBvZnRlbiBwcmVwYXJlIG9yZGluYXJ5IHBlb3BsZSBmb3IgYW4gZXh0cmFvcmRpbmFyeSBkZXN0aW55LiIsYXV0aG9yOiJDLlMuIExld2lzIn0se3RleHQ6IkFjdCBhcyBpZiB3aGF0IHlvdSBkbyBtYWtlcyBhIGRpZmZlcmVuY2UuIEl0IGRvZXMuIixhdXRob3I6IldpbGxpYW0gSmFtZXMifSx7dGV4dDoiSW4gdGhlIG1pZGRsZSBvZiBkaWZmaWN1bHR5IGxpZXMgb3Bwb3J0dW5pdHkuIixhdXRob3I6IkFsYmVydCBFaW5zdGVpbiJ9LHt0ZXh0OiJZb3UgYXJlIGJyYXZlciB0aGFuIHlvdSBiZWxpZXZlLCBzdHJvbmdlciB0aGFuIHlvdSBzZWVtLCBhbmQgc21hcnRlciB0aGFuIHlvdSB0aGluay4iLGF1dGhvcjoiQS5BLiBNaWxuZSJ9LHt0ZXh0OiJLZWVwIHlvdXIgZXllcyBvbiB0aGUgc3RhcnMgYW5kIHlvdXIgZmVldCBvbiB0aGUgZ3JvdW5kLiIsYXV0aG9yOiJUaGVvZG9yZSBSb29zZXZlbHQifSx7dGV4dDoiV2hhdCB5b3UgZG8gdG9kYXkgY2FuIGltcHJvdmUgYWxsIHlvdXIgdG9tb3Jyb3dzLiIsYXV0aG9yOiJSYWxwaCBNYXJzdG9uIn0se3RleHQ6IkRvbid0IGJlIHB1c2hlZCBhcm91bmQgYnkgdGhlIGZlYXJzIGluIHlvdXIgbWluZC4gQmUgbGVkIGJ5IHRoZSBkcmVhbXMgaW4geW91ciBoZWFydC4iLGF1dGhvcjoiUm95IFQuIEJlbm5ldHQifSx7dGV4dDoiVGhlIG9ubHkgcGVyc29uIHlvdSBzaG91bGQgdHJ5IHRvIGJlIGJldHRlciB0aGFuIGlzIHdobyB5b3Ugd2VyZSB5ZXN0ZXJkYXkuIixhdXRob3I6IiJ9LHt0ZXh0OiJJZiB5b3Ugd2FudCB0byBhY2hpZXZlIGdyZWF0bmVzcywgc3RvcCBhc2tpbmcgZm9yIHBlcm1pc3Npb24uIixhdXRob3I6IiJ9LHt0ZXh0OiJUaGluZ3Mgd29yayBvdXQgYmVzdCBmb3IgdGhvc2Ugd2hvIG1ha2UgdGhlIGJlc3Qgb2YgaG93IHRoaW5ncyB3b3JrIG91dC4iLGF1dGhvcjoiSm9obiBXb29kZW4ifSx7dGV4dDoiVG8gbGl2ZSBhIGNyZWF0aXZlIGxpZmUsIHdlIG11c3QgbG9zZSBvdXIgZmVhciBvZiBiZWluZyB3cm9uZy4iLGF1dGhvcjoiSm9zZXBoIENoaWx0b24gUGVhcmNlIn0se3RleHQ6IklmIHlvdSBhcmUgbm90IHdpbGxpbmcgdG8gcmlzayB0aGUgdXN1YWwsIHlvdSB3aWxsIGhhdmUgdG8gc2V0dGxlIGZvciB0aGUgb3JkaW5hcnkuIixhdXRob3I6IkppbSBSb2huIn0se3RleHQ6IlRydXN0IHlvdXJzZWxmLiBZb3Uga25vdyBtb3JlIHRoYW4geW91IHRoaW5rIHlvdSBkby4iLGF1dGhvcjoiQmVuamFtaW4gU3BvY2sifSx7dGV4dDoiV2hhdCBzZWVtcyB0byB1cyBhcyBiaXR0ZXIgdHJpYWxzIGFyZSBvZnRlbiBibGVzc2luZ3MgaW4gZGlzZ3Vpc2UuIixhdXRob3I6Ik9zY2FyIFdpbGRlIn0se3RleHQ6IlRoZSBvbmx5IHBsYWNlIHdoZXJlIHN1Y2Nlc3MgY29tZXMgYmVmb3JlIHdvcmsgaXMgaW4gdGhlIGRpY3Rpb25hcnkuIixhdXRob3I6IlZpZGFsIFNhc3Nvb24ifSx7dGV4dDoiVG9vIG1hbnkgb2YgdXMgYXJlIG5vdCBsaXZpbmcgb3VyIGRyZWFtcyBiZWNhdXNlIHdlIGFyZSBsaXZpbmcgb3VyIGZlYXJzLiIsYXV0aG9yOiJMZXMgQnJvd24ifSx7dGV4dDoiSSBmaW5kIHRoYXQgdGhlIGhhcmRlciBJIHdvcmssIHRoZSBtb3JlIGx1Y2sgSSBzZWVtIHRvIGhhdmUuIixhdXRob3I6IlRob21hcyBKZWZmZXJzb24ifSx7dGV4dDoiU3VjY2VzcyB1c3VhbGx5IGNvbWVzIHRvIHRob3NlIHdobyBhcmUgdG9vIGJ1c3kgdG8gYmUgbG9va2luZyBmb3IgaXQuIixhdXRob3I6IkhlbnJ5IERhdmlkIFRob3JlYXUifSx7dGV4dDoiSWYgeW91IHJlYWxseSBsb29rIGNsb3NlbHksIG1vc3Qgb3Zlcm5pZ2h0IHN1Y2Nlc3NlcyB0b29rIGEgbG9uZyB0aW1lLiIsYXV0aG9yOiJTdGV2ZSBKb2JzIn0se3RleHQ6Ik5ldmVyIGdpdmUgdXAgb24gYSBkcmVhbSBqdXN0IGJlY2F1c2Ugb2YgdGhlIHRpbWUgaXQgd2lsbCB0YWtlIHRvIGFjY29tcGxpc2ggaXQuIixhdXRob3I6IkVhcmwgTmlnaHRpbmdhbGUifSx7dGV4dDoiWW91J3ZlIGdvdCB0byBnZXQgdXAgZXZlcnkgbW9ybmluZyB3aXRoIGRldGVybWluYXRpb24gaWYgeW91J3JlIGdvaW5nIHRvIGdvIHRvIGJlZCB3aXRoIHNhdGlzZmFjdGlvbi4iLGF1dGhvcjoiR2VvcmdlIExvcmltZXIifSx7dGV4dDoiVGhlIHNlY3JldCBvZiB5b3VyIHN1Y2Nlc3MgaXMgZGV0ZXJtaW5lZCBieSB5b3VyIGRhaWx5IGFnZW5kYS4iLGF1dGhvcjoiSm9obiBDLiBNYXh3ZWxsIn1dO2Z1bmN0aW9uIGxsKGU9Mil7cmV0dXJuWy4uLkNMXS5zb3J0KCgpPT5NYXRoLnJhbmRvbSgpLS41KS5zbGljZSgwLGUpfXZhciBNbz1MKFgoKSk7ZnVuY3Rpb24gemgoe2dyaWRIZWlnaHRTaXplOmUscGxhbkNvbnRlbnQ6dCxxdW90ZXM6bn0pe2xldCBvPShlfHwxKT49Mj80OjIsW3IsYV09KDAsZ2EudXNlU3RhdGUpKG58fCh0P1tdOmxsKG8pKSksW2ksc109KDAsZ2EudXNlU3RhdGUpKCFuJiYhIXQpLFtsXT0oMCxnYS51c2VTdGF0ZSkoKCk9PmAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gKTsoMCxnYS51c2VFZmZlY3QpKCgpPT57bnx8YShsbChvKSl9LFtdKSwoMCxnYS51c2VFZmZlY3QpKCgpPT57IWkmJnIubGVuZ3RoPG8mJmEobGwobykpfSxbb10pO2xldCBjPSgwLE1vLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6KCk9PnthKGxsKG8pKX0sdGl0bGU6IlJlc2VlZCBxdW90ZXMiLGNoaWxkcmVuOiJcdTIxQkIgUmVzZWVkIn0pO3JldHVybiBpPygwLE1vLmpzeCkocmUse3dpZGdldElkOiJxdW90ZXMiLGNoaWxkcmVuOigwLE1vLmpzeCkoImRpdiIse2NsYXNzTmFtZToicXVvdGVzLWxvYWRpbmciLGNoaWxkcmVuOiJHZW5lcmF0aW5nIHF1b3Rlcy4uLiJ9KX0pOigwLE1vLmpzeCkocmUse3dpZGdldElkOiJxdW90ZXMiLGhlYWRlckFjdGlvbnM6YyxjaGlsZHJlbjooMCxNby5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InF1b3Rlcy1ncmlkIixjaGlsZHJlbjpyLnNsaWNlKDAsbykubWFwKCh1LHApPT4oMCxNby5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJxdW90ZS10aWxlIixzdHlsZTp7YmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDAuNikpLCB1cmwoIit6Yygic21hbGwiLGwscCkrIikifSxjaGlsZHJlbjpbKDAsTW8uanN4KSgicCIse2NsYXNzTmFtZToicXVvdGUtdGV4dCIsY2hpbGRyZW46JyInK3UudGV4dCsnIid9KSx1LmF1dGhvcj8oMCxNby5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJxdW90ZS1hdXRob3IiLGNoaWxkcmVuOiJcdTIwMTQgIit1LmF1dGhvcn0pOm51bGxdfSxwKSl9KX0pfXZhciB5YT1MKFgoKSksTUw9e2RhaWx5Sm90OiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzL2pvdHMiLGpvdXJuYWw6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvam90cyIsY2FsZW5kYXI6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvY2FsZW5kYXIiLGxlYXZlRmVlZGJhY2s6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vcGx1Z2lucy9IWFJhN0FEVzg4Ym55ZkE3aER3YlhTTFkifTthc3luYyBmdW5jdGlvbiBPTCh7YWN0aW9uOmUsYXBwOnQsb25Td2FwQmFja2dyb3VuZDpufSl7aWYoZT09PSJyYW5kb21Ob3RlIilyZXR1cm4gUkwodCk7aWYoZT09PSJzd2FwQmFja2dyb3VuZCIpcmV0dXJuIG4/LigpO2xldCBvPU1MW2VdO28mJmF3YWl0IHQubmF2aWdhdGUobyl9ZnVuY3Rpb24gSUwoZSl7bGV0IHQ9W3tsYWJlbDoiRGFpbHkgSm90IixpY29uOiJcdXsxRjRERH0iLGFjdGlvbjoiZGFpbHlKb3QifSx7bGFiZWw6IkpvdXJuYWwiLGljb246Ilx1ezFGNEQzfSIsYWN0aW9uOiJqb3VybmFsIn0se2xhYmVsOiJDYWxlbmRhciIsaWNvbjoiXHV7MUY0QzV9IixhY3Rpb246ImNhbGVuZGFyIn0se2xhYmVsOiJSYW5kb20gTm90ZSIsaWNvbjoiXHV7MUYzQjJ9IixhY3Rpb246InJhbmRvbU5vdGUifV07cmV0dXJuIGUmJnQucHVzaCh7bGFiZWw6IlN3YXAgQmFja2dyb3VuZCIsaWNvbjoiXHV7MUY1QkN9XHVGRTBGIixhY3Rpb246InN3YXBCYWNrZ3JvdW5kIn0pLHQucHVzaCh7bGFiZWw6IkxlYXZlIEZlZWRiYWNrIixpY29uOiJcdXsxRjRBQ30iLGFjdGlvbjoibGVhdmVGZWVkYmFjayJ9KSx0fWFzeW5jIGZ1bmN0aW9uIFJMKGUpe2xldCB0O3RyeXt0PWF3YWl0IGUuZ2V0VGFza0RvbWFpbnMoKX1jYXRjaHtyZXR1cm59bGV0IG49KEFycmF5LmlzQXJyYXkodCk/dDpbXSkuZmlsdGVyKHI9PnIhPW51bGwpLmZsYXRNYXAocj0+ci5ub3Rlc3x8W10pO2lmKCFuLmxlbmd0aClyZXR1cm47bGV0IG89bltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbi5sZW5ndGgpXTtvPy51dWlkJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7by51dWlkfWApfWZ1bmN0aW9uIFdoKHthcHA6ZSxvblN3YXBCYWNrZ3JvdW5kOnR9KXtsZXQgbj1JTCh0eXBlb2YgdD09ImZ1bmN0aW9uIiksbz1yPT5PTCh7YWN0aW9uOnIsYXBwOmUsb25Td2FwQmFja2dyb3VuZDp0fSk7cmV0dXJuKDAseWEuanN4KShyZSx7d2lkZ2V0SWQ6InF1aWNrLWFjdGlvbnMiLGNoaWxkcmVuOigwLHlhLmpzeCkoImRpdiIse2NsYXNzTmFtZToicWEtZ3JpZCIsY2hpbGRyZW46bi5tYXAocj0+KDAseWEuanN4cykoImJ1dHRvbiIse2NsYXNzTmFtZToicWEtYnV0dG9uIixvbkNsaWNrOigpPT5vKHIuYWN0aW9uKSxjaGlsZHJlbjpbKDAseWEuanN4KSgic3BhbiIse2NsYXNzTmFtZToicWEtaWNvbiIsY2hpbGRyZW46ci5pY29ufSksKDAseWEuanN4KSgic3BhbiIse2NsYXNzTmFtZToicWEtbGFiZWwiLGNoaWxkcmVuOnIubGFiZWx9KV19LHIuYWN0aW9uKSl9KX0pfXZhciBfcj1MKG1lKCkpO3ZhciBQTD03KjI0KjYwKjYwKjFlMyxSUz0zLExMPTUsX0w9NSxQUz01MCxVTD0yNTAsQmg9MjUwLExTPTcsRkw9MTtmdW5jdGlvbiBfUyhlKXtyZXR1cm4gekwoYCR7YWUobmV3IERhdGUpfS0ke2V9YCl9YXN5bmMgZnVuY3Rpb24gTVMoZSx0LG49bmV3IFNldCl7bGV0IG89bmV3IFNldCxyPVtdLGE9dD97Z3JvdXA6InRhc2tMaXN0cyIsdGFza0RvbWFpblVVSUQ6dH06e2dyb3VwOiJ0YXNrTGlzdHMifTtmb3IgYXdhaXQobGV0IGkgb2YgYXdhaXQgZS5maWx0ZXJOb3RlcyhhLCJjaGFuZ2VkIikpaWYoIW4uaGFzKGk/LnV1aWQpJiZpPy51dWlkJiYhby5oYXMoaS51dWlkKSYmKG8uYWRkKGkudXVpZCksci5wdXNoKGkpLHIubGVuZ3RoPj1VTCkpcmV0dXJuIHI7cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gVVMoZSx0LG4pe2xldCBvPUllKG4uZGF0ZUtleSkscj1ITChuLHpTKG8pKTthd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh0LHIpfWFzeW5jIGZ1bmN0aW9uIEZTKHthcHA6ZSxtYXhOb3Rlczp0PUxMLHNlZWQ6bix0YXNrRG9tYWluVVVJRDpvPW51bGx9KXtsZXQgcj1hd2FpdCBLTChlKSxhPUJMKHIuc3RhdGUsbyxyLnN0YXRlLmRhdGVLZXkpLGk9YS5zZWxlY3RlZE5vdGVzO2lmKGEuc2VsZWN0aW9uU2VlZD09PW4mJmkubGVuZ3RoPj1NYXRoLm1pbihSUyx0KSlyZXR1cm4gT1MoZSxpLnNsaWNlKDAsdCkpO2xldCBzPWF3YWl0IFlMKGUsYSxvKSxsPWpjKFsuLi5hLnN0YWxlQ2FuZGlkYXRlcywuLi5zLnN0YWxlQ2FuZGlkYXRlc10pLGQ9YS5oaXN0b3J5QnlEYXksYz1sLmZpbHRlcihnPT4hSFMoZCkuaGFzKGcudXVpZCkpO2wubGVuZ3RoPjAmJmMubGVuZ3RoPT09MCYmKGQ9e30sYz1sKTtsZXQgdT1WTChjLHQsbikscD1hd2FpdCBPUyhlLHUpLGY9akwocCksbT1mLm1hcChnPT5nLnV1aWQpLmZpbHRlcihCb29sZWFuKTthPVNpKHsuLi5hLGhpc3RvcnlCeURheTpJUyhkLGEuZGF0ZUtleSxtLEJoKSxzZWxlY3Rpb25TZWVkOm4sc2VsZWN0ZWROb3RlczpmLHN0YWxlQ2FuZGlkYXRlczpsLHRhc2tEb21haW5VVUlEOm8sdmlzaXRlZEJ5RGF5OklTKGEudmlzaXRlZEJ5RGF5LGEuZGF0ZUtleSxzLnZpc2l0ZWRVdWlkcyxCaCl9LGEuZGF0ZUtleSk7dHJ5e2F3YWl0IFVTKGUsci5ub3RlSGFuZGxlLGEpfWNhdGNoKGcpe2soIltSZWNlbnROb3Rlc10gRmFpbGVkIHRvIHBlcnNpc3QgcmVjZW50LW5vdGUgc3RhdGU6IixnKX1yZXR1cm4gcH1mdW5jdGlvbiB6TChlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQ9KHQrZS5jaGFyQ29kZUF0KG4pKihuKzEpKSUxMDAwMDAzO3JldHVybiB0fWFzeW5jIGZ1bmN0aW9uIE9TKGUsdCl7bGV0IG49QXJyYXkuaXNBcnJheSh0KT90OltdO3JldHVybiBQcm9taXNlLmFsbChuLm1hcChvPT5lLmZpbmROb3RlKHt1dWlkOm8udXVpZH0pLnRoZW4ocj0+KHtsYXRlc3RUYXNrVGltZXN0YW1wOm8ubGF0ZXN0VGFza1RpbWVzdGFtcCxub3RlSGFuZGxlOnJ8fHtuYW1lOm8ubmFtZSx1dWlkOm8udXVpZH0sdGFza0NvdW50Om8udGFza0NvdW50fSkpLmNhdGNoKCgpPT4oe2xhdGVzdFRhc2tUaW1lc3RhbXA6by5sYXRlc3RUYXNrVGltZXN0YW1wLG5vdGVIYW5kbGU6e25hbWU6by5uYW1lLHV1aWQ6by51dWlkfSx0YXNrQ291bnQ6by50YXNrQ291bnR9KSkpKX1mdW5jdGlvbiBXTChlKXtsZXQgdD1OdW1iZXIuaXNGaW5pdGUoZSk/TWF0aC5hYnMoTWF0aC5mbG9vcihlKSk6MTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD0odCo5MzAxKzQ5Mjk3KSUyMzMyODAsdC8yMzMyODB9fWZ1bmN0aW9uIElTKGUsdCxuLG8pe2xldCByPVljKGUsdCksYT1yW3RdfHxbXSxpPShBcnJheS5pc0FycmF5KG4pP246W10pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApLHM9Wy4uLm5ldyBTZXQoWy4uLmEsLi4uaV0pXS5zbGljZSgtbyk7cmV0dXJuIFljKHsuLi5yLFt0XTpzfSx0KX1mdW5jdGlvbiBqYyhlKXtsZXQgdD1uZXcgU2V0LG49W107Zm9yKGxldCBvIG9mIEFycmF5LmlzQXJyYXkoZSk/ZTpbXSl7bGV0IHI9bz8udXVpZHx8bz8ubm90ZUhhbmRsZT8udXVpZDtpZighKCFyfHx0LmhhcyhyKSkmJih0LmFkZChyKSxuLnB1c2goe2xhdGVzdFRhc2tUaW1lc3RhbXA6TnVtYmVyKG8ubGF0ZXN0VGFza1RpbWVzdGFtcCl8fDAsbmFtZTpvLm5hbWV8fG8ubm90ZUhhbmRsZT8ubmFtZXx8IlVudGl0bGVkIix0YXNrQ291bnQ6TnVtYmVyKG8udGFza0NvdW50KXx8MCx1dWlkOnJ9KSxuLmxlbmd0aD49UFMpKWJyZWFrfXJldHVybiBufWZ1bmN0aW9uIFljKGUsdCl7aWYoIWV8fHR5cGVvZiBlIT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm57fTtsZXQgbj1JZSh0KTtuLnNldERhdGUobi5nZXREYXRlKCktTFMrMSk7bGV0IG89YWUobikscj17fTtmb3IobGV0W2EsaV1vZiBPYmplY3QuZW50cmllcyhlKSl7aWYoIS9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGEpfHxhPG8pY29udGludWU7bGV0IHM9QXJyYXkuaXNBcnJheShpKT9pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApOltdO3JbYV09Wy4uLm5ldyBTZXQocyldLnNsaWNlKC1CaCl9cmV0dXJuIHJ9ZnVuY3Rpb24gU2koZSx0KXtsZXQgbj1lJiZ0eXBlb2YgZT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUpP2U6e307cmV0dXJue2RhdGVLZXk6dCxoaXN0b3J5QnlEYXk6WWMobi5oaXN0b3J5QnlEYXksdCksc2NoZW1hVmVyc2lvbjpGTCxzZWxlY3Rpb25TZWVkOk51bWJlci5pc0Zpbml0ZShuLnNlbGVjdGlvblNlZWQpP24uc2VsZWN0aW9uU2VlZDpudWxsLHNlbGVjdGVkTm90ZXM6amMobi5zZWxlY3RlZE5vdGVzKSxzdGFsZUNhbmRpZGF0ZXM6amMobi5zdGFsZUNhbmRpZGF0ZXMpLHRhc2tEb21haW5VVUlEOnR5cGVvZiBuLnRhc2tEb21haW5VVUlEPT0ic3RyaW5nIiYmbi50YXNrRG9tYWluVVVJRC5sZW5ndGg+MD9uLnRhc2tEb21haW5VVUlEOm51bGwsdmlzaXRlZEJ5RGF5OlljKG4udmlzaXRlZEJ5RGF5LHQpfX1mdW5jdGlvbiBCTChlLHQsbil7cmV0dXJuKGU/LnRhc2tEb21haW5VVUlEfHxudWxsKT09PSh0fHxudWxsKT9lOlNpKHtzZWxlY3Rpb25TZWVkOm51bGwsdGFza0RvbWFpblVVSUQ6dH0sbil9ZnVuY3Rpb24gelMoZSl7cmV0dXJuIGUudG9Mb2NhbGVTdHJpbmcoW10se2RheToibnVtZXJpYyIsbW9udGg6ImxvbmciLHllYXI6Im51bWVyaWMifSl9ZnVuY3Rpb24gSEwoZSx0KXtyZXR1cm5bYCMgUmVjZW50IE5vdGVzIGRhdGEgZm9yICR7dH1gLCIiLCJUaGlzIGFyY2hpdmVkIG5vdGUgaXMgbWFpbnRhaW5lZCBieSB0aGUgZGFzaGJvYXJkIHBsdWdpbi4iLCIiLCJgYGBqc29uIixKU09OLnN0cmluZ2lmeShlLG51bGwsMiksImBgYCIsIiJdLmpvaW4oYApgKX1mdW5jdGlvbiBXUyhlKXtyZXR1cm5gRGFzaGJvYXJkIHJlY2VudCBub3RlcyBmb3IgJHt6UyhlKX1gfWZ1bmN0aW9uIEJTKGUsdCl7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gU2koe30sdCk7bGV0IG49ZS5tYXRjaCgvYGBganNvblxzKihbXHNcU10qPylgYGAvaSksbz1uP25bMV06ZTt0cnl7cmV0dXJuIFNpKEpTT04ucGFyc2UobyksdCl9Y2F0Y2h7cmV0dXJuIFNpKHt9LHQpfX1hc3luYyBmdW5jdGlvbiBLTChlKXtsZXQgdD1uZXcgRGF0ZSxuPWFlKHQpLG89V1ModCkscj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOm8sdGFnczpbd2VdfSk7aWYocj8udXVpZCl7bGV0IGw9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpyLnV1aWR9KTtyZXR1cm57bm90ZUhhbmRsZTpyLHN0YXRlOkJTKGwsbil9fWxldCBhPWF3YWl0IEdMKGUsdCksaT1TaSh7Li4uYSxzZWxlY3RlZE5vdGVzOltdfSxuKSxzPWF3YWl0IGUuY3JlYXRlTm90ZShvLFt3ZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gcj17dXVpZDp0eXBlb2Ygcz09Im9iamVjdCI/cy51dWlkOnN9LGF3YWl0IFVTKGUscixpKSxrKGBbUmVjZW50Tm90ZXNdIENyZWF0ZWQgZGFpbHkgbm90ZSAiJHtvfSIgd2l0aCB1dWlkICR7ci51dWlkfWApLHtub3RlSGFuZGxlOnIsc3RhdGU6aX19YXN5bmMgZnVuY3Rpb24gR0woZSx0KXtmb3IobGV0IG49MTtuPD1MUztuKyspe2xldCBvPW5ldyBEYXRlKHQpO28uc2V0RGF0ZShvLmdldERhdGUoKS1uKTtsZXQgcj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOldTKG8pLHRhZ3M6W3dlXX0pO2lmKCFyPy51dWlkKWNvbnRpbnVlO2xldCBhPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6ci51dWlkfSk7cmV0dXJuIEJTKGEsYWUodCkpfXJldHVybnt9fWZ1bmN0aW9uIFZMKGUsdCxuKXtsZXQgbz1XTChuKSxyPVtdLGE9W107Zm9yKGxldCBpIG9mIGUpe2lmKHIubGVuZ3RoPj10KWJyZWFrO2EubGVuZ3RoPF9MJiZvKCk8LjU/YS5wdXNoKGkpOnIucHVzaChpKX1yZXR1cm4gci5sZW5ndGg+PVJTP3I6Wy4uLnIsLi4uYV0uc2xpY2UoMCx0KX1mdW5jdGlvbiBqTChlKXtyZXR1cm4gamMoKEFycmF5LmlzQXJyYXkoZSk/ZTpbXSkubWFwKHQ9Pih7bGF0ZXN0VGFza1RpbWVzdGFtcDp0LmxhdGVzdFRhc2tUaW1lc3RhbXAsbmFtZTp0Lm5vdGVIYW5kbGU/Lm5hbWV8fCJVbnRpdGxlZCIsdGFza0NvdW50OnQudGFza0NvdW50LHV1aWQ6dC5ub3RlSGFuZGxlPy51dWlkfSkpKX1hc3luYyBmdW5jdGlvbiBZTChlLHQsbil7bGV0IG89SFModC52aXNpdGVkQnlEYXkpLHI9YXdhaXQgTVMoZSxuLG8pLGE9bztyLmxlbmd0aD09PTAmJnQuc3RhbGVDYW5kaWRhdGVzLmxlbmd0aD09PTAmJihhPW5ldyBTZXQscj1hd2FpdCBNUyhlLG4sYSkpO2xldCBpPVtdLHM9W10sbD1uZXcgU2V0KHQuc3RhbGVDYW5kaWRhdGVzLm1hcChkPT5kLnV1aWQpKTtmb3IobGV0IGQgb2YgcilpZighKCFkPy51dWlkfHxhLmhhcyhkLnV1aWQpKSl0cnl7bGV0IGM9YXdhaXQgZS5nZXROb3RlVGFza3Moe3V1aWQ6ZC51dWlkfSx7aW5jbHVkZURvbmU6ITF9KTtpZihzLnB1c2goZC51dWlkKSwhQXJyYXkuaXNBcnJheShjKXx8Yy5sZW5ndGg9PT0wKWNvbnRpbnVlO2xldCB1PWMucmVkdWNlKChwLGYpPT57bGV0IG09Zi5zdGFydEF0P2Yuc3RhcnRBdCoxZTM6MDtyZXR1cm4gTWF0aC5tYXgocCxtKX0sMCk7aWYodSE9PTAmJnU+PURhdGUubm93KCktUEwpY29udGludWU7aWYobC5oYXMoZC51dWlkKXx8KGkucHVzaCh7bGF0ZXN0VGFza1RpbWVzdGFtcDp1LG5hbWU6ZC5uYW1lLHRhc2tDb3VudDpjLmxlbmd0aCx1dWlkOmQudXVpZH0pLGwuYWRkKGQudXVpZCkpLHQuc3RhbGVDYW5kaWRhdGVzLmxlbmd0aCtpLmxlbmd0aD49UFMpYnJlYWt9Y2F0Y2goYyl7ayhgW1JlY2VudE5vdGVzXSBGYWlsZWQgdG8gZmV0Y2ggdGFza3MgZm9yIG5vdGUgJHtkLnV1aWR9OmAsYyl9cmV0dXJue3N0YWxlQ2FuZGlkYXRlczppLHZpc2l0ZWRVdWlkczpzfX1mdW5jdGlvbiBIUyhlKXtsZXQgdD1uZXcgU2V0O2ZvcihsZXQgbiBvZiBPYmplY3QudmFsdWVzKGV8fHt9KSlBcnJheS5pc0FycmF5KG4pJiZuLmZvckVhY2gobz0+dC5hZGQobykpO3JldHVybiB0fXZhciBEbj1MKFgoKSkscUw9MywkTD01O2Z1bmN0aW9uIEhoKHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTp0PTEsdGFza0RvbWFpblVVSUQ6bj1udWxsfSl7bGV0W28scl09KDAsX3IudXNlU3RhdGUpKDApLFthLGldPSgwLF9yLnVzZVN0YXRlKShudWxsKSxbcyxsXT0oMCxfci51c2VTdGF0ZSkobnVsbCksZD10Pj0yPzEwOiRMLGM9KDAsX3IudXNlTWVtbykoKCk9Pl9TKG8pLFtvXSk7KDAsX3IudXNlRWZmZWN0KSgoKT0+e2xldCBtPSEwO3JldHVybiBpKG51bGwpLGwobnVsbCksRlMoe2FwcDplLG1heE5vdGVzOmQsc2VlZDpjLHRhc2tEb21haW5VVUlEOm59KS50aGVuKGc9PnttJiYoaShnKSxrKCJbUmVjZW50Tm90ZXNdIHN0YWxlTm90ZXM6IixnLCJzZWVkOiIsYywicmVzZWVkQ291bnQ6IixvKSl9KS5jYXRjaChnPT57bSYmKGsoIltSZWNlbnROb3Rlc10gZmV0Y2ggZXJyb3I6IixnKSxsKGcubWVzc2FnZXx8IkZhaWxlZCB0byBsb2FkIG5vdGVzIikpfSksKCk9PnttPSExfX0sW2UsZCxvLGMsbl0pO2xldCB1PSgpPT5yKG09Pm0rMSk7cmV0dXJuIHV0KCJyZWNlbnQtbm90ZXMiLGEhPT1udWxsJiYhcywhIXMpLCgwLERuLmpzeCkocmUse2hlYWRlckFjdGlvbnM6KDAsRG4uanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOnUsdGl0bGU6IlNob3cgYSBkaWZmZXJlbnQgc2V0IG9mIG5vdGVzIixjaGlsZHJlbjoiXHUyMUJCIFJlc2VlZCJ9KSx3aWRnZXRJZDoicmVjZW50LW5vdGVzIixjaGlsZHJlbjpzPygwLERuLmpzeCkoInAiLHtjbGFzc05hbWU6Im5vdGUtZXJyb3IiLGNoaWxkcmVuOmBFcnJvcjogJHtzfWB9KTphPT09bnVsbD8oMCxEbi5qc3gpKCJwIix7Y2xhc3NOYW1lOiJub3RlLWxvYWRpbmciLGNoaWxkcmVuOiJMb2FkaW5nXHUyMDI2In0pOmEubGVuZ3RoPHFMPygwLERuLmpzeCkoInAiLHtjbGFzc05hbWU6Im5vdGUtZW1wdHkiLGNoaWxkcmVuOiJObyBub3RlcyB3aXRoIHN0YWxlIHRhc2tzIGZvdW5kLiJ9KTooMCxEbi5qc3gpKCJ1bCIse2NsYXNzTmFtZToibm90ZS1saXN0IixjaGlsZHJlbjphLm1hcCgoe25vdGVIYW5kbGU6bSx0YXNrQ291bnQ6Z30pPT4oMCxEbi5qc3hzKSgibGkiLHtjbGFzc05hbWU6Im5vdGUtaXRlbSIsY2hpbGRyZW46WygwLERuLmpzeHMpKCJidXR0b24iLHtjbGFzc05hbWU6Im5vdGUtbGluayIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5lLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7bS51dWlkfWApLHRpdGxlOmBPcGVuICIke20ubmFtZXx8IlVudGl0bGVkIn0iYCxjaGlsZHJlbjpbKDAsRG4uanN4KSgic3BhbiIse2NsYXNzTmFtZToibm90ZS1uYW1lIixjaGlsZHJlbjptLm5hbWV8fCJVbnRpdGxlZCJ9KSwoMCxEbi5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJub3RlLWNvdW50IixjaGlsZHJlbjpgJHtnfSBvcGVuIHRhc2ske2chPT0xPyJzIjoiIn1gfSldfSksKDAsRG4uanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLW1ldGFkYXRhIixjaGlsZHJlbjptLmNoYW5nZWQ/YExhc3QgdXBkYXRlZDogJHtuZXcgRGF0ZShtLmNoYW5nZWQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfWA6Ik5vIHVwZGF0ZSBkYXRlIn0pXX0sbS51dWlkKSl9KX0pfXZhciBibj1MKG1lKCkpO3ZhciBLaD02MCoxZTMsR2g9NjAqS2gsZGw9MjQqR2gsWEw9MzY1KmRsO2Z1bmN0aW9uIEpMKGUpe3JldHVybiBlPyJ0YXNrTGlzdHMiOiIifWZ1bmN0aW9uIEVpKGUpe2lmKGU9PW51bGwpcmV0dXJuIDA7aWYodHlwZW9mIGU9PSJudW1iZXIiKXJldHVybiBOdW1iZXIuaXNGaW5pdGUoZSk/ZTowO2xldCB0PW5ldyBEYXRlKGUpLmdldFRpbWUoKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpP3Q6MH1mdW5jdGlvbiBRTChlKXtsZXQgdD1FaShlLnVwZGF0ZWQpLG49RWkoZS5jaGFuZ2VkKSxvPUVpKGUuYWN0aXZlKTtyZXR1cm4gdD5ufHx0Pm99ZnVuY3Rpb24gWkwoZSl7bGV0IHQ9bmV3IE1hcDtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZSl7bGV0IG89bj8uc2hhcmluZz8ubm90ZXM7aWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHIgb2Ygbyl7aWYoIXIpY29udGludWU7bGV0IGE9dC5nZXQocik7YT9hLnNvbWUoaT0+aS51dWlkPT09bi51dWlkKXx8YS5wdXNoKG4pOnQuc2V0KHIsW25dKX19cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gZV8oZSl7bGV0IHQ9RGF0ZS5ub3coKSxuPWF3YWl0IGUuZ2V0UGVvcGxlKCksbz1aTChuKSxyPUFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6MCxhPUFycmF5LmlzQXJyYXkobik/bi5maWx0ZXIoaT0+QXJyYXkuaXNBcnJheShpPy5zaGFyaW5nPy5ub3RlcykmJmkuc2hhcmluZy5ub3Rlcy5sZW5ndGg+MCkubGVuZ3RoOjA7cmV0dXJuIGNvbnNvbGUubG9nKGBbU2hhcmVkTm90ZXNdIEJ1aWx0IG5vdGU8PnBlcnNvbiBpbmRleCBmcm9tICR7cn0gcGVvcGxlICgke2F9IHdpdGggYSBub3RlcyBhcnJheSkgYWNyb3NzICR7by5zaXplfSBub3RlcyBpbiAke0RhdGUubm93KCktdH1tc2ApLG99ZnVuY3Rpb24gS1MoZSl7bGV0IHQ9U3RyaW5nKGV8fCIiKS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gdC5sZW5ndGg9PT0wPyI/Ijp0Lmxlbmd0aD09PTE/dFswXS5zbGljZSgwLDIpLnRvVXBwZXJDYXNlKCk6KHRbMF1bMF0rdFt0Lmxlbmd0aC0xXVswXSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBHUyhlKXtsZXQgdD1uZXcgTWFwO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2ZvcihsZXQgciBvZiBlKWZvcihsZXQgYSBvZiByLmNvbGxhYm9yYXRvcnN8fFtdKXtsZXQgaT1hPy5uYW1lO2kmJnQuc2V0KGksKHQuZ2V0KGkpfHwwKSsxKX1yZXR1cm5bLi4udC5lbnRyaWVzKCldLm1hcCgoW3IsYV0pPT4oe2NvdW50OmEsbmFtZTpyfSkpLnNvcnQoKHIsYSk9PmEuY291bnQtci5jb3VudHx8ci5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKSl9ZnVuY3Rpb24gdF8oe25vdGVIYW5kbGU6ZSxwZW9wbGVJbmRleDp0fSl7bGV0IG49dD8uZ2V0Py4oZS51dWlkKTtyZXR1cm4gQXJyYXkuaXNBcnJheShuKT9uLm1hcChvPT4oe2F2YXRhcjpvLmF2YXRhcnx8bnVsbCxuYW1lOm8ubmFtZXx8by51dWlkfSkpOltdfWZ1bmN0aW9uIFZoKGUsdCl7aWYoIWUpcmV0dXJuIiI7bGV0IG49dC1lO3JldHVybiBuPEtoPyJqdXN0IG5vdyI6bjxHaD9gJHtNYXRoLmZsb29yKG4vS2gpfW0gYWdvYDpuPGRsP2Ake01hdGguZmxvb3Iobi9HaCl9aCBhZ29gOm48NypkbD9gJHtNYXRoLmZsb29yKG4vZGwpfWQgYWdvYDpuPDMwKmRsP25ldyBEYXRlKGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KTpuZXcgRGF0ZShlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KX1hc3luYyBmdW5jdGlvbiBuXyhlLHQpe2xldCBuPUpMKCEwKSxvPXQ/e2dyb3VwOm4sdGFza0RvbWFpblVVSUQ6dH06e2dyb3VwOm59LHI9bmV3IFNldDtmb3IgYXdhaXQobGV0IGEgb2YgYXdhaXQgZS5maWx0ZXJOb3RlcyhvLCJ1cGRhdGVkIikpYT8udXVpZCYmci5hZGQoYS51dWlkKTtyZXR1cm4gcn1hc3luYyBmdW5jdGlvbiBWUyh7YXBwOmUsbWF4Tm90ZXM6dD0xLzAsdGFza0RvbWFpblVVSUQ6bj1udWxsLG9ubHlXaXRoVGFza3M6bz0hMX0pe2xldCByPURhdGUubm93KCksW2EsaV09YXdhaXQgUHJvbWlzZS5hbGwoW2VfKGUpLG8/bl8oZSxuKTpQcm9taXNlLnJlc29sdmUobnVsbCldKSxzPVsuLi5hLmtleXMoKV0sbD1hd2FpdCBQcm9taXNlLmFsbChzLm1hcChtPT5lLmZpbmROb3RlKHt1dWlkOm19KS5jYXRjaCgoKT0+bnVsbCkpKSxkPVtdLGM9W10sdT0wO2ZvcihsZXQgbT0wO208bC5sZW5ndGg7bSsrKXtsZXQgZz1sW21dO2lmKCFnPy51dWlkKXtkLnB1c2goc1ttXSk7Y29udGludWV9aWYoaSYmIWkuaGFzKGcudXVpZCkpY29udGludWU7bGV0IHc9dF8oe25vdGVIYW5kbGU6ZyxwZW9wbGVJbmRleDphfSksdj1RTChnKTt2JiZ1KyssYy5wdXNoKHsuLi5nLGFjdGl2ZU1zOkVpKGcuYWN0aXZlKSxjb2xsYWJvcmF0b3JzOncsb3BlbmVkQXQ6Zy5hY3RpdmV8fG51bGwsdXBkYXRlZE1zOkVpKGcudXBkYXRlZCksdXBkYXRlZFNpbmNlU2Vlbjp2fSl9Yy5zb3J0KChtLGcpPT5nLnVwZGF0ZWRNcy1tLnVwZGF0ZWRNcyk7bGV0IHA9TnVtYmVyLmlzRmluaXRlKHQpP2Muc2xpY2UoMCx0KTpjLGY9cl8ocCxyLVhMKTtpZihjb25zb2xlLmxvZyhgW1NoYXJlZE5vdGVzXSBzaGFyZWQ6JHtzLmxlbmd0aH0gcmVzb2x2ZWQ6JHtsLmxlbmd0aC1kLmxlbmd0aH0gdW5yZXNvbHZlZDoke2QubGVuZ3RofSB1cGRhdGVkU2luY2VTZWVuOiR7dX0gcmV0dXJuZWQ6JHtwLmxlbmd0aH0gc2hhcmVyczoke2YubGVuZ3RofSBvbmx5V2l0aFRhc2tzOiR7b30gaW4gJHtEYXRlLm5vdygpLXJ9bXNgKSxkLmxlbmd0aD4wKXtrKGBbU2hhcmVkTm90ZXNdICR7ZC5sZW5ndGh9IHNoYXJlZCBub3RlKHMpIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBieSBmaW5kTm90ZTpgLGQpO2xldCBtPW9fKGEpLm1hcCgoe2NvdW50OmcsbmFtZTp3fSk9Pih7Y291bnQ6ZyxuYW1lOnd9KSk7aygiW1NoYXJlZE5vdGVzXSBrbm93biBub3RlcyBwZXIgcGVyc29uIChmcm9tIGdldFBlb3BsZSk6IixtKX1yZXR1cm57bm90ZXM6cCxzaGFyZXJOYW1lczpmfX1mdW5jdGlvbiBvXyhlKXtsZXQgdD1uZXcgTWFwO2lmKGUmJnR5cGVvZiBlLmVudHJpZXM9PSJmdW5jdGlvbiIpZm9yKGxldFtuLG9db2YgZS5lbnRyaWVzKCkpZm9yKGxldCByIG9mIG8pe2xldCBhPXI/Lm5hbWV8fHI/LnV1aWR8fCIodW5rbm93bikiO3QuaGFzKGEpfHx0LnNldChhLFtdKSx0LmdldChhKS5wdXNoKG4pfXJldHVyblsuLi50LmVudHJpZXMoKV0ubWFwKChbbixvXSk9Pih7bmFtZTpuLGNvdW50Om8ubGVuZ3RoLG5vdGVVdWlkczpvfSkpLnNvcnQoKG4sbyk9Pm8uY291bnQtbi5jb3VudCl9ZnVuY3Rpb24gcl8oZSx0PTApe2xldCBuPW5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuW107Zm9yKGxldCBvIG9mIGUpaWYoISh0JiZFaShvLnVwZGF0ZWRNcz8/by51cGRhdGVkKTx0KSlmb3IobGV0IHIgb2Ygby5jb2xsYWJvcmF0b3JzfHxbXSlyLm5hbWUmJm4uYWRkKHIubmFtZSk7cmV0dXJuWy4uLm5dLnNvcnQoKG8scik9Pm8ubG9jYWxlQ29tcGFyZShyLHZvaWQgMCx7c2Vuc2l0aXZpdHk6ImJhc2UifSkpfWZ1bmN0aW9uIGpoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP1suLi5uZXcgU2V0KGUuZmlsdGVyKHQ9PnR5cGVvZiB0PT0ic3RyaW5nIiYmdCkpXTpbXX1mdW5jdGlvbiBqUyhlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2xldCBuPXQgaW5zdGFuY2VvZiBTZXQ/dDpuZXcgU2V0KHR8fFtdKSxvPVtdLHI9W107Zm9yKGxldCBhIG9mIGUpKG4uaGFzKGEudXVpZCk/bzpyKS5wdXNoKGEpO3JldHVyblsuLi5vLC4uLnJdfXZhciBjbD0iRGFzaGJvYXJkIFNoYXJlZCBOb3RlcyBQaW5zIjtmdW5jdGlvbiBZUyhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybltdO2xldCB0PWUubWF0Y2goL2BgYGpzb25ccyooW1xzXFNdKj8pYGBgL2kpLG49dD90WzFdOmUsbz1KU09OLnBhcnNlKG4pO3JldHVybiBvJiZqaChvLnBpbm5lZFV1aWRzKX1mdW5jdGlvbiBxUyhlKXtyZXR1cm5bIiMgU2hhcmVkIE5vdGVzIHBpbnMiLCIiLCJUaGlzIGFyY2hpdmVkIG5vdGUgaXMgbWFpbnRhaW5lZCBieSB0aGUgZGFzaGJvYXJkIHBsdWdpbi4gSXQgcmVjb3JkcyB3aGljaCBub3RlcyB5b3UgaGF2ZSBwaW5uZWQgdG8gdGhlIHRvcCBvZiB0aGUgU2hhcmVkIE5vdGVzIHdpZGdldC4iLCIiLCJgYGBqc29uIixKU09OLnN0cmluZ2lmeSh7cGlubmVkVXVpZHM6ZX0sbnVsbCwyKSwiYGBgIiwiIl0uam9pbihgCmApfWFzeW5jIGZ1bmN0aW9uIGFfKGUpe2xldCB0PWF3YWl0IGUuZmluZE5vdGUoe25hbWU6Y2wsdGFnczpbd2VdfSkuY2F0Y2goKCk9Pm51bGwpO2lmKHQ/LnV1aWQpe2xldCBvPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dC51dWlkfSkuY2F0Y2goKCk9PiIiKTtyZXR1cm57bm90ZUhhbmRsZTp0LHBpbm5lZFV1aWRzOllTKG8pfX1sZXQgbj1hd2FpdCBlLmNyZWF0ZU5vdGUoY2wsW3dlXSx7YXJjaGl2ZTohMH0pO3JldHVybiB0PXtuYW1lOmNsLHV1aWQ6dHlwZW9mIG49PSJvYmplY3QiP24udXVpZDpufSxhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh0LHFTKFtdKSkuY2F0Y2gobz0+aygiW3NoYXJlZC1ub3Rlcy1hcmNoaXZlXSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwaW5zIG5vdGU6IixvKSksayhgW3NoYXJlZC1ub3Rlcy1hcmNoaXZlXSBjcmVhdGVkIHBpbnMgbm90ZSAiJHtjbH0iIHV1aWQgJHt0LnV1aWR9YCkse25vdGVIYW5kbGU6dCxwaW5uZWRVdWlkczpbXX19YXN5bmMgZnVuY3Rpb24gJFMoZSl7bGV0IHQ9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpjbCx0YWdzOlt3ZV19KTtpZighdD8udXVpZClyZXR1cm5bXTtsZXQgbj1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnQudXVpZH0pO3JldHVybiBZUyhuKX1hc3luYyBmdW5jdGlvbiBYUyhlLHQpe2xldCBuPWpoKHQpLHtub3RlSGFuZGxlOm99PWF3YWl0IGFfKGUpO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KG8scVMobikpLGsoIltzaGFyZWQtbm90ZXMtYXJjaGl2ZV0gc3RvcmVkIHBpbnMiLHtjb3VudDpuLmxlbmd0aH0pfXZhciBnZT1MKFgoKSksWWg9IiIsaV89NCxzXz05LGxfPTQsZF89NTtmdW5jdGlvbiBjXyh7Y29sbGFib3JhdG9yOmV9KXtsZXR7YXZhdGFyOnQsbmFtZTpufT1lO3JldHVybiB0Py5pbWFnZT8oMCxnZS5qc3gpKCJpbWciLHtjbGFzc05hbWU6ImNvbGxhYm9yYXRvci1hdmF0YXIiLHNyYzp0LmltYWdlLGFsdDpuLHRpdGxlOm59KTooMCxnZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJjb2xsYWJvcmF0b3ItYXZhdGFyIGNvbGxhYm9yYXRvci1hdmF0YXItdGV4dCIsdGl0bGU6bixjaGlsZHJlbjp0Py50ZXh0fHxLUyhuKX0pfWZ1bmN0aW9uIHVfKHthcHA6ZSxvbmx5V2l0aFRhc2tzOnQsdGFza0RvbWFpblVVSUQ6bn0pe2xldFtvLHJdPSgwLGJuLnVzZVN0YXRlKShudWxsKSxbYSxpXT0oMCxibi51c2VTdGF0ZSkobnVsbCksW3MsbF09KDAsYm4udXNlU3RhdGUpKFtdKTtyZXR1cm4oMCxibi51c2VFZmZlY3QpKCgpPT57bGV0IGQ9ITA7cmV0dXJuIHIobnVsbCksaShudWxsKSxWUyh7YXBwOmUsb25seVdpdGhUYXNrczp0LHRhc2tEb21haW5VVUlEOm59KS50aGVuKCh7bm90ZXM6YyxzaGFyZXJOYW1lczp1fSk9PntkJiYoaShjKSxsKHUpLGsoIltTaGFyZWROb3Rlc10gbm90ZXM6IixjLmxlbmd0aCwiY29sbGFib3JhdG9yczoiLEdTKGMpLCJvbmx5V2l0aFRhc2tzOiIsdCkpfSkuY2F0Y2goYz0+e2QmJihrKCJbU2hhcmVkTm90ZXNdIGZldGNoIGZhaWxlZDoiLGMpLHIoYyksaShbXSksbChbXSkpfSksKCk9PntkPSExfX0sW2UsdCxuXSkse2Vycm9yOm8sbm90ZXM6YSxzaGFyZXJOYW1lczpzfX1mdW5jdGlvbiBwXyhlKXtsZXRbdCxuXT0oMCxibi51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpOygwLGJuLnVzZUVmZmVjdCkoKCk9PntsZXQgcj0hMDtyZXR1cm4gJFMoZSkudGhlbihhPT57ciYmbihuZXcgU2V0KGEpKX0pLCgpPT57cj0hMX19LFtlXSk7bGV0IG89KDAsYm4udXNlQ2FsbGJhY2spKHI9PntuKGE9PntsZXQgaT1uZXcgU2V0KGEpO3JldHVybiBpLmhhcyhyKT9pLmRlbGV0ZShyKTppLmFkZChyKSxYUyhlLFsuLi5pXSkuY2F0Y2gocz0+aygiW1NoYXJlZE5vdGVzXSBwZXJzaXN0IHBpbnMgZmFpbGVkOiIscykpLGl9KX0sW2VdKTtyZXR1cm57cGlubmVkVXVpZHM6dCx0b2dnbGVQaW46b319ZnVuY3Rpb24gZl8oe25vdGVzOmUscGFnZTp0LHBhZ2VTaXplOm4scGlubmVkVXVpZHM6byxzZWxlY3RlZFNoYXJlcjpyfSl7bGV0IGE9ZT09PW51bGw/bnVsbDpyPT09WWg/ZS5maWx0ZXIoYz0+Yy51cGRhdGVkU2luY2VTZWVuKTplLmZpbHRlcigoe2NvbGxhYm9yYXRvcnM6Y30pPT5jLnNvbWUodT0+dS5uYW1lPT09cikpLGk9YT09PW51bGw/bnVsbDpqUyhhLG8pLHM9aT09PW51bGw/MTpNYXRoLm1pbihkXyxNYXRoLm1heCgxLE1hdGguY2VpbChpLmxlbmd0aC9uKSkpLGw9TWF0aC5taW4odCxzLTEpLGQ9aT09PW51bGw/bnVsbDppLnNsaWNlKGwqbiwobCsxKSpuKTtyZXR1cm57Y3VycmVudFBhZ2U6bCx0b3RhbFBhZ2VzOnMsdmlzaWJsZU5vdGVzOmR9fWZ1bmN0aW9uIG1fKHtpbkhlYWRlcjplLG9uQ2hhbmdlOnQsb25seVdpdGhUYXNrczpufSl7cmV0dXJuKDAsZ2UuanN4cykoImxhYmVsIix7Y2xhc3NOYW1lOmBzaGFyZWQtbm90ZXMtdG9nZ2xlJHtlPyIgd2lkZ2V0LWhlYWRlci1hY3Rpb24iOiIifWAsdGl0bGU6Ik9ubHkgc2hvdyBzaGFyZWQgbm90ZXMgdGhhdCBoYXZlIHRhc2tzIixjaGlsZHJlbjpbKDAsZ2UuanN4KSgiaW5wdXQiLHt0eXBlOiJjaGVja2JveCIsY2hlY2tlZDpuLG9uQ2hhbmdlOm89PnQoby50YXJnZXQuY2hlY2tlZCl9KSwiSGFzIHRhc2tzIl19KX1mdW5jdGlvbiBoXyh7b25TZWxlY3RTaGFyZXI6ZSxzZWxlY3RlZFNoYXJlcjp0LHNoYXJlck5hbWVzOm4sdGFza3NUb2dnbGU6b30pe3JldHVybigwLGdlLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1maWx0ZXIiLGNoaWxkcmVuOlsoMCxnZS5qc3hzKSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZXMtc2hhcmVyLXNlbGVjdCIsdmFsdWU6dCxvbkNoYW5nZTpyPT5lKHIudGFyZ2V0LnZhbHVlKSxjaGlsZHJlbjpbKDAsZ2UuanN4KSgib3B0aW9uIix7dmFsdWU6WWgsY2hpbGRyZW46IkFsbCBjb2xsYWJvcmF0b3JzIn0pLG4ubWFwKHI9PigwLGdlLmpzeCkoIm9wdGlvbiIse3ZhbHVlOnIsY2hpbGRyZW46cn0scikpXX0pLG8oITEpXX0pfWZ1bmN0aW9uIGdfKHtjdXJyZW50UGFnZTplLG9uUGFnZUNoYW5nZTp0LHRvdGFsUGFnZXM6bn0pe3JldHVybiBuPD0xP251bGw6KDAsZ2UuanN4cykoImRpdiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGVzLXBhZ2luYXRpb24iLGNoaWxkcmVuOlsoMCxnZS5qc3gpKCJidXR0b24iLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1wYWdlLWFycm93Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PnQobz0+TWF0aC5tYXgoMCxvLTEpKSxkaXNhYmxlZDplPT09MCxjaGlsZHJlbjoiXHUyNUMwIn0pLCgwLGdlLmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InNoYXJlZC1ub3Rlcy1wYWdlLWluZGljYXRvciIsY2hpbGRyZW46YCR7ZSsxfSAvICR7bn1gfSksKDAsZ2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZXMtcGFnZS1hcnJvdyIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT50KG89Pk1hdGgubWluKG4tMSxvKzEpKSxkaXNhYmxlZDplPj1uLTEsY2hpbGRyZW46Ilx1MjVCNiJ9KV19KX1mdW5jdGlvbiB5Xyh7aXNQaW5uZWQ6ZSxub3RlOnQsbm93TXM6bixvbk5hdmlnYXRlOm8sb25Ub2dnbGVQaW46cn0pe2xldHthY3RpdmVNczphLGNvbGxhYm9yYXRvcnM6aSxuYW1lOnMsb3BlbmVkQXQ6bCx1cGRhdGVkTXM6ZCx1dWlkOmN9PXQ7cmV0dXJuKDAsZ2UuanN4cykoImxpIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1pdGVtIixjaGlsZHJlbjpbKDAsZ2UuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOmBzaGFyZWQtbm90ZS1waW4ke2U/IiBzaGFyZWQtbm90ZS1waW4tYWN0aXZlIjoiIn1gLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+cihjKSx0aXRsZTplPyJVbnBpbiB0aGlzIG5vdGUiOiJQaW4gdGhpcyBub3RlIHRvIHRoZSB0b3AiLCJhcmlhLXByZXNzZWQiOmUsY2hpbGRyZW46Ilx1ezFGNENDfSJ9KSwoMCxnZS5qc3hzKSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1saW5rIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9Pm8oYyksdGl0bGU6YE9wZW4gIiR7c3x8IlVudGl0bGVkIn0iYCxjaGlsZHJlbjpbKDAsZ2UuanN4KSgic3BhbiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGUtdGl0bGUiLGNoaWxkcmVuOnN8fCJVbnRpdGxlZCJ9KSwoMCxnZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1tZXRhIixjaGlsZHJlbjpbaS5sZW5ndGg+MCYmKDAsZ2UuanN4KSgic3BhbiIse2NsYXNzTmFtZToic2hhcmVkLW5vdGUtYXZhdGFycyIsY2hpbGRyZW46aS5zbGljZSgwLGxfKS5tYXAoKHUscCk9PigwLGdlLmpzeCkoY18se2NvbGxhYm9yYXRvcjp1fSxwKSl9KSwoMCxnZS5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1jb2xsYWJvcmF0b3JzIixjaGlsZHJlbjppLmxlbmd0aD4wP2kubWFwKHU9PnUubmFtZSkuam9pbigiLCAiKToiU2hhcmVkIHdpdGggY29sbGFib3JhdG9ycyJ9KV19KSwoMCxnZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1kYXRlcyIsY2hpbGRyZW46WygwLGdlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS11cGRhdGVkIix0aXRsZToiV2hlbiBhIGNvbGxhYm9yYXRvciBsYXN0IHVwZGF0ZWQgdGhpcyBub3RlIixjaGlsZHJlbjpbIlVwZGF0ZWQgIixWaChkLG4pXX0pLCgwLGdlLmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1vcGVuZWQiLHRpdGxlOmBZb3UgbGFzdCBvcGVuZWQgdGhpcyBub3RlICR7bH1gLGNoaWxkcmVuOlsiWW91IGxhc3Qgb3BlbmVkICIsVmgoYSxuKXx8Ilx1MjAxNCJdfSldfSldfSldfSl9ZnVuY3Rpb24gdl8oe2N1cnJlbnRQYWdlOmUsb25OYXZpZ2F0ZTp0LG9uUGFnZUNoYW5nZTpuLG9uVG9nZ2xlUGluOm8scGlubmVkVXVpZHM6cixzaGFyZXJGaWx0ZXI6YSx0b3RhbFBhZ2VzOmksdmlzaWJsZU5vdGVzOnN9KXtpZihzPT09bnVsbClyZXR1cm4oMCxnZS5qc3hzKShnZS5GcmFnbWVudCx7Y2hpbGRyZW46W2EsKDAsZ2UuanN4KSgicCIse2NsYXNzTmFtZToibm90ZS1sb2FkaW5nIixjaGlsZHJlbjoiTG9hZGluZ1x1MjAyNiJ9KV19KTtpZihzLmxlbmd0aD09PTApcmV0dXJuKDAsZ2UuanN4cykoZ2UuRnJhZ21lbnQse2NoaWxkcmVuOlthLCgwLGdlLmpzeCkoInAiLHtjbGFzc05hbWU6Im5vdGUtZW1wdHkiLGNoaWxkcmVuOiJObyBub3RlcyByZWNlbnRseSB1cGRhdGVkIGJ5IGNvbGxhYm9yYXRvcnMuIn0pXX0pO2xldCBsPURhdGUubm93KCk7cmV0dXJuKDAsZ2UuanN4cykoZ2UuRnJhZ21lbnQse2NoaWxkcmVuOlthLCgwLGdlLmpzeCkoInVsIix7Y2xhc3NOYW1lOiJzaGFyZWQtbm90ZS1saXN0IixjaGlsZHJlbjpzLm1hcChkPT4oMCxnZS5qc3gpKHlfLHtub3RlOmQsbm93TXM6bCxvblRvZ2dsZVBpbjpvLG9uTmF2aWdhdGU6dCxpc1Bpbm5lZDpyLmhhcyhkLnV1aWQpfSxkLnV1aWQpKX0pLCgwLGdlLmpzeCkoZ18se2N1cnJlbnRQYWdlOmUsdG90YWxQYWdlczppLG9uUGFnZUNoYW5nZTpufSldfSl9ZnVuY3Rpb24gcWgoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQ9MSx0YXNrRG9tYWluVVVJRDpuPW51bGx9KXtsZXRbbyxyXT0oMCxibi51c2VTdGF0ZSkoITEpLFthLGldPSgwLGJuLnVzZVN0YXRlKShZaCksW3MsbF09KDAsYm4udXNlU3RhdGUpKDApLGQ9dD49Mj9zXzppXyx7ZXJyb3I6Yyxub3Rlczp1LHNoYXJlck5hbWVzOnB9PXVfKHthcHA6ZSxvbmx5V2l0aFRhc2tzOm8sdGFza0RvbWFpblVVSUQ6bn0pLHtwaW5uZWRVdWlkczpmLHRvZ2dsZVBpbjptfT1wXyhlKSx7Y3VycmVudFBhZ2U6Zyx0b3RhbFBhZ2VzOncsdmlzaWJsZU5vdGVzOnZ9PWZfKHtub3Rlczp1LHBhZ2U6cyxwYWdlU2l6ZTpkLHBpbm5lZFV1aWRzOmYsc2VsZWN0ZWRTaGFyZXI6YX0pOygwLGJuLnVzZUVmZmVjdCkoKCk9PntsKDApfSxbYSxvLG5dKTtsZXQgeT1wLmxlbmd0aD49Mjt1dCgic2hhcmVkLW5vdGVzIix1IT09bnVsbCYmIWMsISFjKTtsZXQgYj1TPT4oMCxnZS5qc3gpKG1fLHtpbkhlYWRlcjpTLG9uQ2hhbmdlOnIsb25seVdpdGhUYXNrczpvfSksaD15PygwLGdlLmpzeCkoaF8se29uU2VsZWN0U2hhcmVyOmksc2VsZWN0ZWRTaGFyZXI6YSxzaGFyZXJOYW1lczpwLHRhc2tzVG9nZ2xlOmJ9KTpudWxsO3JldHVybigwLGdlLmpzeCkocmUse2hlYWRlckFjdGlvbnM6eT9udWxsOmIoITApLHdpZGdldElkOiJzaGFyZWQtbm90ZXMiLGNoaWxkcmVuOigwLGdlLmpzeCkodl8se2N1cnJlbnRQYWdlOmcscGlubmVkVXVpZHM6ZixzaGFyZXJGaWx0ZXI6aCx0b3RhbFBhZ2VzOncsdmlzaWJsZU5vdGVzOnYsb25OYXZpZ2F0ZTpTPT5lLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7U31gKSxvblBhZ2VDaGFuZ2U6bCxvblRvZ2dsZVBpbjptfSl9KX12YXIgJGg9TChtZSgpKTt2YXIgUnQ9TChYKCkpO2Z1bmN0aW9uIEpTKHtsYWJlbDplLG9uUmVmcmVzaDp0LHJlZnJlc2hpbmc6bn0pe3JldHVybigwLFJ0LmpzeHMpKCJidXR0b24iLHsiYXJpYS1sYWJlbCI6IlJlZnJlc2ggdGFzayBkb21haW5zIixjbGFzc05hbWU6InRhc2stZG9tYWlucy1yZWZyZXNoIixkaXNhYmxlZDpuLG9uQ2xpY2s6dCx0aXRsZToiUmVmcmVzaCB0YXNrIGRvbWFpbnMiLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46WygwLFJ0LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1yZWZyZXNoLWxhYmVsIixjaGlsZHJlbjpuPyJSZWZyZXNoaW5nLi4uIjplfSksKDAsUnQuanN4KSgic3BhbiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLXJlZnJlc2gtaWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsY2hpbGRyZW46Ilx1MjFCQiJ9KV19KX1mdW5jdGlvbiBYaCh7YWN0aXZlVGFza0RvbWFpbjplLGFwcDp0LGRvbWFpbnM6bixvbkRvbWFpbkNoYW5nZTpvfSl7bGV0W3IsYV09KDAsJGgudXNlU3RhdGUpKCExKSxbaSxzXT0oMCwkaC51c2VTdGF0ZSkoITEpLGw9YXN5bmMoKT0+e2soIltUYXNrRG9tYWluc10gUmVmcmVzaCB0cmlnZ2VyZWQiKSxzKCEwKTt0cnl7bGV0IGY9YXdhaXQgUWsodCk7aygiW1Rhc2tEb21haW5zXSBSZWZyZXNoIHJlc3VsdCIsZiksZiYmbyYmbyhmLmRvbWFpbnMsZi5hY3RpdmVUYXNrRG9tYWluKX1jYXRjaChmKXt0aHJvdyBrKCJbVGFza0RvbWFpbnNdIFJlZnJlc2ggZmFpbGVkIixmKSxmfWZpbmFsbHl7cyghMSl9fSxkPWFzeW5jIGY9PntpZihhKCExKSxmPT09ZSlyZXR1cm47bGV0IG09YXdhaXQgSmsodCxmKTttJiZvJiZvKG51bGwsZixtKX07aWYoIW58fG4ubGVuZ3RoPT09MClyZXR1cm4oMCxSdC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMgdGFzay1kb21haW5zLS1lbXB0eSIsY2hpbGRyZW46WygwLFJ0LmpzeCkoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLWxpc3QiLGNoaWxkcmVuOigwLFJ0LmpzeCkoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW4taXRlbSB0YXNrLWRvbWFpbi1lbnRyeSBhY3RpdmUiLHRpdGxlOiJObyB0YXNrIGRvbWFpbiBmb3VuZCBcXHUyMDE0IHNob3dpbmcgdGFza3MgZnJvbSBhbGwgbm90ZXMiLGNoaWxkcmVuOigwLFJ0LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InRhc2stZG9tYWluLW5hbWUiLGNoaWxkcmVuOiJBbGwgTm90ZXMifSl9KX0pLCgwLFJ0LmpzeCkoImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLWVtcHR5IHRhc2stZG9tYWluLWVudHJ5IixjaGlsZHJlbjonVGFzayBEb21haW5zIGluICJTZXR0aW5ncyInfSksKDAsUnQuanN4KShKUyx7bGFiZWw6Ilx1MjFCQiBSZWZyZXNoIixvblJlZnJlc2g6bCxyZWZyZXNoaW5nOml9KV19KTtsZXQgdT0obi5maW5kKGY9PmYudXVpZD09PWUpfHxuWzBdKS51dWlkLHA9InRhc2stZG9tYWlucyIrKHI/IiB0YXNrLWRvbWFpbnMtLWV4cGFuZGVkIjoiIik7cmV0dXJuKDAsUnQuanN4cykoImRpdiIse2NsYXNzTmFtZTpwLGNoaWxkcmVuOlsoMCxSdC5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1saXN0IixjaGlsZHJlbjpuLm1hcChmPT57bGV0IG09InRhc2stZG9tYWluLWl0ZW0iKyhmLnV1aWQ9PT1lPyIgYWN0aXZlIjoiIikrKGYudXVpZD09PXU/IiB0YXNrLWRvbWFpbi1pdGVtLS1tb2JpbGUtdmlzaWJsZSI6IiIpO3JldHVybigwLFJ0LmpzeCkoImRpdiIse2NsYXNzTmFtZTptLG9uQ2xpY2s6KCk9PmQoZi51dWlkKSxjaGlsZHJlbjooMCxSdC5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbi1uYW1lIixjaGlsZHJlbjpmLm5hbWV9KX0sZi51dWlkKX0pfSksbi5sZW5ndGg+MT8oMCxSdC5qc3gpKCJidXR0b24iLHsiYXJpYS1leHBhbmRlZCI6ciwiYXJpYS1sYWJlbCI6cj8iSGlkZSBvdGhlciB0YXNrIGRvbWFpbnMiOiJTaG93IG90aGVyIHRhc2sgZG9tYWlucyIsY2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtZXhwYW5kIixvbkNsaWNrOigpPT5hKCFyKSx0aXRsZTpyPyJIaWRlIG90aGVyIHRhc2sgZG9tYWlucyI6IlNob3cgb3RoZXIgdGFzayBkb21haW5zIix0eXBlOiJidXR0b24iLGNoaWxkcmVuOigwLFJ0LmpzeCkoInNwYW4iLHsiYXJpYS1oaWRkZW4iOiJ0cnVlIixjaGlsZHJlbjpyPyJcdTI1QjIiOiJcdTI1QkMifSl9KTpudWxsLCgwLFJ0LmpzeCkoSlMse2xhYmVsOiJcdTIxQkIgUmVmcmVzaCBUYXNrIERvbWFpbnMiLG9uUmVmcmVzaDpsLHJlZnJlc2hpbmc6aX0pXX0pfXZhciBxYz1MKG1lKCkpO2Z1bmN0aW9uIFFTKGUpe2xldCB0PSgwLHFjLnVzZVJlZikobnVsbCk7dC5jdXJyZW50PT09bnVsbCYmKHQuY3VycmVudD1wZXJmb3JtYW5jZS5ub3coKSksKDAscWMudXNlRWZmZWN0KSgoKT0+e3QuY3VycmVudCE9PW51bGwmJihrKGBbZGFzaGJvYXJkXSBXaWRnZXQgIiR7ZX0iIGZpbmlzaGVkIGxvYWRpbmcgaW4gJHsocGVyZm9ybWFuY2Uubm93KCktdC5jdXJyZW50KS50b0ZpeGVkKDEpfW1zYCksdC5jdXJyZW50PW51bGwpfSxbXSl9dmFyIEt0PUwobWUoKSksZUU9TChMZCgpKTt2YXIgSmg9MTAyNCoxMDI0O2Z1bmN0aW9uIHVsKCl7aWYodHlwZW9mIHBlcmZvcm1hbmNlPiJ1IilyZXR1cm4gbnVsbDtsZXQgZT1wZXJmb3JtYW5jZS5tZW1vcnk7aWYoIWV8fHR5cGVvZiBlLnVzZWRKU0hlYXBTaXplIT0ibnVtYmVyIilyZXR1cm4gbnVsbDtsZXQgdD1lLnVzZWRKU0hlYXBTaXplL0poLG49ZS50b3RhbEpTSGVhcFNpemUvSmgsbz1lLmpzSGVhcFNpemVMaW1pdC9KaCxyPW8+MD90L286MDtyZXR1cm57bGltaXRNYjokYyhvKSx0b3RhbE1iOiRjKG4pLHVzZWRNYjokYyh0KSx1c2VkUmF0aW86JGMociwzKX19ZnVuY3Rpb24gUWgoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZ2MhPSJmdW5jdGlvbiI/ITE6KHdpbmRvdy5nYygpLCEwKX1mdW5jdGlvbiBaaChlPTNlMyx0PTI1MCl7cmV0dXJuIXVsKCl8fHR5cGVvZiBzZXRJbnRlcnZhbD4idSI/UHJvbWlzZS5yZXNvbHZlKG51bGwpOm5ldyBQcm9taXNlKG49PntsZXQgbz11bCgpLHI9KCk9PntsZXQgaT11bCgpO2kmJighb3x8aS51c2VkTWI8by51c2VkTWIpJiYobz1pKX0sYT1zZXRJbnRlcnZhbChyLHQpO3NldFRpbWVvdXQoKCk9PntyKCksY2xlYXJJbnRlcnZhbChhKSxuKG8pfSxlKX0pfWZ1bmN0aW9uIGJfKGUpe3JldHVybiBlPj0uOT8iY3JpdGljYWwiOmU+PS43NT8iaGlnaCI6ZT49LjU/Im1vZGVyYXRlIjoibG93In1mdW5jdGlvbiBwbChlKXtsZXQgdD11bCgpO3JldHVybiB0PyhrKGBbbWVtb3J5XSAke2V9OiB1c2VkICR7dC51c2VkTWJ9TUIgLyBsaW1pdCAke3QubGltaXRNYn1NQiAoJHtNYXRoLnJvdW5kKHQudXNlZFJhdGlvKjEwMCl9JSwgJHtiXyh0LnVzZWRSYXRpbyl9KWApLHQpOm51bGx9ZnVuY3Rpb24gWlMoZT0xNWUzKXtpZighdWwoKXx8dHlwZW9mIHNldEludGVydmFsPiJ1IilyZXR1cm4oKT0+e307cGwoInNhbXBsaW5nLXN0YXJ0Iik7bGV0IHQ9c2V0SW50ZXJ2YWwoKCk9PnBsKCJpbnRlcnZhbCIpLGUpO3JldHVybigpPT5jbGVhckludGVydmFsKHQpfWZ1bmN0aW9uICRjKGUsdD0xKXtsZXQgbj0xMCoqdDtyZXR1cm4gTWF0aC5yb3VuZChlKm4pL259dmFyIHd0PUwoWCgpKSxlZz0zZTM7ZnVuY3Rpb24gdGcoe29uQ2xvc2U6ZSxyZW5kZXJXaWRnZXQ6dH0pe2xldCBuPU10LFtvLHJdPSgwLEt0LnVzZVN0YXRlKShudWxsKSxbYSxpXT0oMCxLdC51c2VTdGF0ZSkoITEpLFtzLGxdPSgwLEt0LnVzZVN0YXRlKShudWxsKSxbZCxjXT0oMCxLdC51c2VTdGF0ZSkobnVsbCksW3UscF09KDAsS3QudXNlU3RhdGUpKG5bMF0/LndpZGdldElkfHwiIiksW2YsbV09KDAsS3QudXNlU3RhdGUpKCJpZGxlIiksZz0oMCxLdC51c2VSZWYpKG51bGwpLHc9KDAsS3QudXNlUmVmKShudWxsKSx2PSgwLEt0LnVzZVJlZikoMCk7dy5jdXJyZW50PW87bGV0IHk9dWMoZD9bZF06W10se29uU2V0dGxlOih7ZXJyb3JDb3VudDpUfSk9PntUPjA/KGcuY3VycmVudD1udWxsLG0oImVycm9yIikpOm0oIndhaXRpbmdGb3JMb2FkZWRFdmVudCIpfX0pLGI9KDAsS3QudXNlQ2FsbGJhY2spKFQ9PnttKCJzYW1wbGluZyIpLGkoUWgoKSksWmgoZWcpLnRoZW4oQT0+e2xldCBDPXcuY3VycmVudDtpZihUPT09di5jdXJyZW50KXtpZighQXx8IUMpe20oInVuc3VwcG9ydGVkIik7cmV0dXJufWwoe2FmdGVyU2FtcGxlOkEsZGVsdGFNYjpBLnVzZWRNYi1DLnVzZWRNYn0pLG0oImNvbXBsZXRlIil9fSl9LFtdKTsoMCxLdC51c2VFZmZlY3QpKCgpPT57bGV0IFQ9QT0+e2xldCBDPUEuZGV0YWlsfHx7fTtpZighZy5jdXJyZW50fHxDLndpZGdldElkIT09Zy5jdXJyZW50KXJldHVybjtsZXQgTz12LmN1cnJlbnQ7aWYoZy5jdXJyZW50PW51bGwsQy5vdXRjb21lPT09ImVycm9yIil7bSgiZXJyb3IiKTtyZXR1cm59YihPKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGNjLFQpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihjYyxUKX0sW2JdKTtsZXQgaD0oMCxLdC51c2VDYWxsYmFjaykoKCk9Pnt2LmN1cnJlbnQrPTE7bGV0IFQ9di5jdXJyZW50O3IobnVsbCksbChudWxsKSxjKG51bGwpLG0oImNsZWFyaW5nIiksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xldCBBPVFoKCk7WmgoZWcpLnRoZW4oQz0+e2lmKFQ9PT12LmN1cnJlbnQpe2lmKCFDKXttKCJ1bnN1cHBvcnRlZCIpO3JldHVybn0oMCxlRS5mbHVzaFN5bmMpKCgpPT57cihDKSxpKEEpLG0oImJhc2VsaW5lUmVhZHkiKX0pLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57VD09PXYuY3VycmVudCYmKGcuY3VycmVudD11LG0oIm1vdW50aW5nIiksYyh1KSl9KX0pfX0pfSl9LFt1XSksUz0oMCxLdC51c2VDYWxsYmFjaykoKCk9Pnt2LmN1cnJlbnQrPTEsZy5jdXJyZW50PW51bGwsYyhudWxsKSxtKCJpZGxlIil9LFtdKSx4PW4uZmluZChUPT5ULndpZGdldElkPT09dSksRT1zP2Ake3MuZGVsdGFNYj49MD8iKyI6IiJ9JHtzLmRlbHRhTWIudG9GaXhlZCgxKX0gTUJgOiJcdTIwMTQiO3JldHVybigwLHd0LmpzeCkobW8se3RpdGxlOiJcdXsxRjlFMH0gV2lkZ2V0IE1lbW9yeSBNZWFzdXJlbWVudCIsb25DYW5jZWw6ZSxvblN1Ym1pdDplLHN1Ym1pdExhYmVsOiJDbG9zZSIsY2hpbGRyZW46KDAsd3QuanN4cykoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LW1lbW9yeS1tZWFzdXJlbWVudCIsY2hpbGRyZW46WygwLHd0LmpzeCkoInAiLHtjbGFzc05hbWU6IndpZGdldC1tZW1vcnktbWVhc3VyZW1lbnQtZGVzY3JpcHRpb24iLGNoaWxkcmVuOiJNZWFzdXJlcyB0aGUgc2VsZWN0ZWQgd2lkZ2V0IG9uIHRvcCBvZiB0aGUgZGFzaGJvYXJkJ3MgYWxyZWFkeS1sb2FkZWQgc2hhcmVkIGRhdGEuIn0pLCgwLHd0LmpzeCkoImxhYmVsIix7Y2xhc3NOYW1lOiJ3aWRnZXQtbWVtb3J5LW1lYXN1cmVtZW50LWxhYmVsIixodG1sRm9yOiJ3aWRnZXQtbWVtb3J5LXNlbGVjdG9yIixjaGlsZHJlbjoiV2lkZ2V0In0pLCgwLHd0LmpzeCkoInNlbGVjdCIse2NsYXNzTmFtZToid2lkZ2V0LW1lbW9yeS1tZWFzdXJlbWVudC1zZWxlY3QiLGlkOiJ3aWRnZXQtbWVtb3J5LXNlbGVjdG9yIix2YWx1ZTp1LG9uQ2hhbmdlOlQ9PnAoVC50YXJnZXQudmFsdWUpLGRpc2FibGVkOiEhZCxjaGlsZHJlbjpuLm1hcChUPT4oMCx3dC5qc3hzKSgib3B0aW9uIix7dmFsdWU6VC53aWRnZXRJZCxjaGlsZHJlbjpbVC5pY29uLCIgIixULnZpc2libGVUaXRsZXx8VC5uYW1lXX0sVC53aWRnZXRJZCkpfSksKDAsd3QuanN4cykoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LW1lbW9yeS1tZWFzdXJlbWVudC1hY3Rpb25zIixjaGlsZHJlbjpbKDAsd3QuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtbWVtb3J5LW1lYXN1cmVtZW50LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOmgsY2hpbGRyZW46ZD8iUmVtb3VudCBhbmQgbWVhc3VyZSI6Ik1vdW50IGFuZCBtZWFzdXJlIn0pLCgwLHd0LmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LW1lbW9yeS1tZWFzdXJlbWVudC1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazpTLGRpc2FibGVkOiFkLGNoaWxkcmVuOiJVbm1vdW50In0pXX0pLCgwLHd0LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6IndpZGdldC1tZW1vcnktbWVhc3VyZW1lbnQtcmVzdWx0cyIsImFyaWEtbGl2ZSI6InBvbGl0ZSIsY2hpbGRyZW46WygwLHd0LmpzeHMpKCJzcGFuIix7Y2hpbGRyZW46WyJCYXNlbGluZTogIixvP2Ake28udXNlZE1ifSBNQmA6Ilx1MjAxNCJdfSksKDAsd3QuanN4cykoInNwYW4iLHtjaGlsZHJlbjpbIkFmdGVyIGxvYWQ6ICIscz9gJHtzLmFmdGVyU2FtcGxlLnVzZWRNYn0gTUJgOiJcdTIwMTQiXX0pLCgwLHd0LmpzeHMpKCJzdHJvbmciLHtjaGlsZHJlbjpbIkluY3JlbWVudGFsIGZvb3RwcmludDogIixFXX0pLCgwLHd0LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC1tZW1vcnktbWVhc3VyZW1lbnQtc3RhdHVzIixjaGlsZHJlbjpmPT09ImNvbXBsZXRlIj9gU2FtcGxlZCBmb3IgJHtlZy8xZTN9IHNlY29uZHMgYWZ0ZXIgbW91bnQuYDpmPT09ImVycm9yIj8iVGhlIHdpZGdldCBmYWlsZWQgdG8gbW91bnQ7IG5vIG1lYXN1cmVtZW50IHdhcyByZWNvcmRlZC4iOmY9PT0idW5zdXBwb3J0ZWQiPyJUaGlzIHJ1bnRpbWUgZG9lcyBub3QgZXhwb3NlIHBlcmZvcm1hbmNlLm1lbW9yeS4iOmY9PT0ic2FtcGxpbmciPyJXaWRnZXQgbG9hZGVkOyBzYW1wbGluZyBpdHMgaGVhcCBmb290cHJpbnRcdTIwMjYiOmY9PT0iY2xlYXJpbmciPyJXaWRnZXQgZ3JpZCBpcyBjbGVhcmVkOyBzYW1wbGluZyB0aGUgemVyby13aWRnZXQgYmFzZWxpbmVcdTIwMjYiOmY9PT0iYmFzZWxpbmVSZWFkeSI/IkJhc2VsaW5lIGNhcHR1cmVkIGJlZm9yZSB3aWRnZXQgbW91bnQuIjpmPT09Im1vdW50aW5nIj8iTW91bnRpbmcgc2VsZWN0ZWQgd2lkZ2V0XHUyMDI2IjpmPT09IndhaXRpbmdGb3JMb2FkZWRFdmVudCI/IldpZGdldCBtb3VudGVkOyB3YWl0aW5nIGZvciBpdHMgbG9hZGVkIGV2ZW50XHUyMDI2IjoiQ2hvb3NlIGEgd2lkZ2V0LCB0aGVuIG1vdW50IGl0IHRvIG1lYXN1cmUuIn0pXX0pLCgwLHd0LmpzeCkoInAiLHtjbGFzc05hbWU6IndpZGdldC1tZW1vcnktbWVhc3VyZW1lbnQtbm90ZSIsY2hpbGRyZW46YT8id2luZG93LmdjKCkgd2FzIHJlcXVlc3RlZCBiZWZvcmUgc2FtcGxpbmcuIjoid2luZG93LmdjKCkgaXMgdW5hdmFpbGFibGU7IGxhdW5jaCBDaHJvbWl1bSB3aXRoIC0tanMtZmxhZ3M9LS1leHBvc2UtZ2MgdG8gZW5hYmxlIGl0LiJ9KSxkPygwLHd0LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6IndpZGdldC1tZW1vcnktbWVhc3VyZW1lbnQtd2lkZ2V0IixjaGlsZHJlbjpbKDAsd3QuanN4cykoImg0Iix7Y2hpbGRyZW46W3g/Lmljb24sIiAiLHg/LnZpc2libGVUaXRsZXx8eD8ubmFtZV19KSwoMCx3dC5qc3gpKGNhLlByb3ZpZGVyLHt2YWx1ZTp5LGNoaWxkcmVuOnQoZCl9KV19KTpudWxsXX0pfSl9dmFyICRuPUwobWUoKSk7dmFyIG50PUwoWCgpKSx3Xz1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYyMn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUY2MUZ9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjEwfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2NDJ9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjYwNH0iLGxhYmVsOiJHcmVhdCJ9XTtmdW5jdGlvbiBrXyhlKXtpZighZXx8ZS5sZW5ndGg8NylyZXR1cm4iIjtsZXQgdD1JZShlWzBdLmRhdGUpLG49SWUoZVs2XS5kYXRlKSxvPXI9PnIudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7cmV0dXJuYCR7byh0KX0gXHUyMDEzICR7byhuKX1gfWZ1bmN0aW9uIHRFKGUsdCl7bGV0IG49SWUoZSk7cmV0dXJuIG4uc2V0RGF0ZShuLmdldERhdGUoKSt0KjcpLGFlKG4pfWZ1bmN0aW9uIHhfKGUsdCl7bGV0IG49bW4oZSx0KSxvPW1uKG5ldyBEYXRlLHQpO3JldHVybiBuPj1vfWZ1bmN0aW9uIFNfKGUsdCl7cmV0dXJuIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MD9bXTohdHx8dHlwZW9mIHQhPSJvYmplY3QiP2U6ZS5tYXAobj0+e2xldCBvPWFlKG4uZGF0ZSkscj1BcnJheS5pc0FycmF5KHRbb10pP3Rbb106W10sYT1yLnJlZHVjZSgoaSxzKT0+aSsocy52aWN0b3J5VmFsdWV8fDApLDApO3JldHVybnsuLi5uLHZhbHVlOmEsdGFza0NvdW50OnIubGVuZ3RofX0pfWZ1bmN0aW9uIEVfKGUsdCxuLG8pe2xldCByPUdrKGUsbyk7cmV0dXJuIW58fHR5cGVvZiBuIT0ib2JqZWN0Ij9TXyh0LG4pOnIubWFwKGE9PntsZXQgaT1BcnJheS5pc0FycmF5KG5bYS5kYXRlS2V5XSk/blthLmRhdGVLZXldOltdLHM9aS5yZWR1Y2UoKGwsZCk9PmwrKGQudmljdG9yeVZhbHVlfHwwKSwwKTtyZXR1cm57ZGF5OmEuZGF5LGRhdGU6YS5kYXRlLHZhbHVlOnMsdGFza0NvdW50OmkubGVuZ3RofX0pfWFzeW5jIGZ1bmN0aW9uIE5fKGUsdCxuLG8pe2xldCByPVt0LFN0cmluZyhuKV07YXdhaXQgZS5zZXRTZXR0aW5nKGpvKCJ2aWN0b3J5LXZhbHVlIiksSlNPTi5zdHJpbmdpZnkocikpLG8oITEpfWZ1bmN0aW9uIG5FKGUpe3JldHVybiBlPT1udWxsPyEwOmU9PT0idHJ1ZSJ8fGU9PT0hMH1mdW5jdGlvbiBUXyhlLHQsbixvKXt0KGVbMF18fCJ3ZWVrIiksbihuRShlWzFdKSksbyghMSl9ZnVuY3Rpb24gRF8oZSx0LG4pe2xldCBvPWUuY3VycmVudDtpZighbylyZXR1cm47bGV0IHI9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPW4uY2xpZW50WC1yLmxlZnQscz0oci53aWR0aC04MCkvNztmb3IobGV0IGw9MDtsPDc7bCsrKXtsZXQgZD00MCtsKnMsYz1kK3M7aWYoYT49ZCYmYTxjKXt0KGwpO3JldHVybn19dChudWxsKX1mdW5jdGlvbiBBXyhlLHQpe2xldCBuPWUuY3VycmVudDtpZighbilyZXR1cm4gMDtsZXQgcj0obi5vZmZzZXRXaWR0aC04MCkvNztyZXR1cm4gNDArdCpyK3IqLjV9ZnVuY3Rpb24gQ18oZSx0LG4sbyl7bGV0IHI9ZS5jdXJyZW50O2lmKCFyKXJldHVybiAwO2xldCBhPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1yLm9mZnNldEhlaWdodC01MCxkPShuW3RdPy52YWx1ZXx8MCkvbypzKi44NTtyZXR1cm4gYS50b3Arcy1kKzEwfWZ1bmN0aW9uIE1fKGUsdCxuKXtpZighbnx8IXRbZV0pcmV0dXJuW107bGV0IG89YWUodFtlXS5kYXRlKTtyZXR1cm4obltvXXx8W10pLnNsaWNlKCkuc29ydCgocixhKT0+KGEudmljdG9yeVZhbHVlfHwwKS0oci52aWN0b3J5VmFsdWV8fDApKX1mdW5jdGlvbiBPXyhlLHQpe2lmKCFlfHwhQXJyYXkuaXNBcnJheShlKXx8IXQpcmV0dXJuW107bGV0IG49e307Zm9yKGxldCBvIG9mIGUpe2lmKCFvfHxvLnRpbWVzdGFtcD09bnVsbCljb250aW51ZTtsZXQgcj1uZXcgRGF0ZShvLnRpbWVzdGFtcCoxZTMpLGE9YWUocik7KCFuW2FdfHxvLnRpbWVzdGFtcD5uW2FdLnRpbWVzdGFtcCkmJihuW2FdPW8pfXJldHVybiB0Lm1hcChvPT57bGV0IHI9YWUoby5kYXRlKTtyZXR1cm4gbltyXXx8bnVsbH0pfWZ1bmN0aW9uIElfKGUsdCxuKXtpZighdHx8IXRbZV0pcmV0dXJuIG51bGw7aWYobiYmbltlXSl7bGV0IHI9bmV3IERhdGU7aWYoci5zZXRIb3VycygyMyw1OSw1OSw5OTkpLEllKG5bZV0uZGF0ZSk+cilyZXR1cm4gbnVsbH1sZXQgbz10W2VdLnJhdGluZztyZXR1cm4gd18uZmluZChyPT5yLnZhbHVlPT09byl8fG51bGx9ZnVuY3Rpb24gUl8oZSx0LG4sbyxyLGEpe3QuZm9yRWFjaCgoaSxzKT0+e2xldCBsPWkudmFsdWUvbipyKi44NSxkPTQwK3MqbytvKi4xNSxjPXItbCsxMDtlLmZpbGxTdHlsZT1pLnZhbHVlPjA/IiM2MzY2ZjEiOiIjZTVlN2ViIixlLmJlZ2luUGF0aCgpLGUucm91bmRSZWN0KGQsYyxvKi43LGwsWzQsNCwwLDBdKSxlLmZpbGwoKSxlLmZpbGxTdHlsZT0iIzZiNzI4MCIsZS5mb250PSIxMXB4IHN5c3RlbS11aSIsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5maWxsVGV4dChpLmRheSxkK28qLjM1LGEtMTUpO2xldCBwPUllKGkuZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7ZS5maWxsU3R5bGU9IiM5Y2EzYWYiLGUuZm9udD0iOXB4IHN5c3RlbS11aSIsZS5maWxsVGV4dChwLGQrbyouMzUsYS0zKSxpLnZhbHVlPjAmJihlLmZpbGxTdHlsZT0iI2ZmZmZmZiIsZS5mb250PSJib2xkIDEwcHggc3lzdGVtLXVpIixlLmZpbGxUZXh0KFBfKGkudmFsdWUpLGQrbyouMzUsYysxNCkpfSl9ZnVuY3Rpb24gUF8oZSl7cmV0dXJuKE1hdGgucm91bmQoKGV8fDApKjEwKS8xMCkudG9GaXhlZCgxKX1mdW5jdGlvbiBMXyhlLHQsbixvLHIpe2xldCBhPW5ldyBEYXRlO2Euc2V0SG91cnMoMjMsNTksNTksOTk5KTtsZXQgaT1bXTtpZih0LmZvckVhY2goKHMsbCk9PntpZighc3x8IW5bbF18fEllKG5bbF0uZGF0ZSk+YSlyZXR1cm47bGV0IGM9ci0ocy5yYXRpbmcrMikvNCpyKzEwLHU9NDArbCpvK28qLjU7aS5wdXNoKHtpbmRleDpsLHg6dSx5OmN9KX0pLGkubGVuZ3RoIT09MCl7ZS5zdHJva2VTdHlsZT0iI2Y1OWUwYiIsZS5saW5lV2lkdGg9Mjtmb3IobGV0IHM9MTtzPGkubGVuZ3RoO3MrKyl7bGV0IGw9aVtzLTFdLGQ9aVtzXTtlLnNldExpbmVEYXNoKGQuaW5kZXg9PT1sLmluZGV4KzE/W106WzMsNF0pLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8obC54LGwueSksZS5saW5lVG8oZC54LGQueSksZS5zdHJva2UoKX1lLnNldExpbmVEYXNoKFtdKSxpLmZvckVhY2goKHt4OnMseTpsfSk9PntlLmZpbGxTdHlsZT0iI2Y1OWUwYiIsZS5iZWdpblBhdGgoKSxlLmFyYyhzLGwsMywwLE1hdGguUEkqMiksZS5maWxsKCl9KX19ZnVuY3Rpb24gX18oZSx0LG4sbyxyKXtsZXQgYT1lLmN1cnJlbnQ7aWYoIWEpcmV0dXJuO2xldCBpPWEuZ2V0Q29udGV4dCgiMmQiKSxzPWEud2lkdGg9YS5vZmZzZXRXaWR0aCoyLGw9YS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQqMjtpLnNjYWxlKDIsMik7bGV0IGQ9cy8yLGM9bC8yLHU9KGQtODApLzcscD1jLTUwO2kuY2xlYXJSZWN0KDAsMCxkLGMpLFJfKGksdCxuLHUscCxjKSxyJiZvJiZvLnNvbWUoZj0+ZiE9PW51bGwpJiZMXyhpLG8sdCx1LHApfWZ1bmN0aW9uIFVfKGUsdCxuLG8pe2xldCByPU1fKGUsdCxuKSxhPUlfKGUsbyx0KSxzPVtgPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtaGVhZGVyIj4ke3RbZV0/amsodFtlXS5kYXRlKToiIn08L2Rpdj5gXTtpZihhJiZzLnB1c2goYDxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXNlY3Rpb24iPiR7YS5lbW9qaX0gJHthLmxhYmVsfTwvZGl2PmApLHIubGVuZ3RoPjApZm9yKGxldCBsIG9mIHIpcy5wdXNoKGA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ciPjxzcGFuIGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ctbGFiZWwiPiR7THMobC5jb250ZW50KX08L3NwYW4+PHNwYW4gY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdy12YWx1ZSI+JHtsLnZpY3RvcnlWYWx1ZXx8MH0gcHRzPC9zcGFuPjwvZGl2PmApO2Vsc2Ugcy5wdXNoKCc8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1lbXB0eSI+Tm8gY29tcGxldGVkIHRhc2tzPC9kaXY+Jyk7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24gRl8oe3RpbWVSYW5nZTplLHNldFRpbWVSYW5nZTp0fSl7cmV0dXJuKDAsbnQuanN4KShudC5GcmFnbWVudCx7Y2hpbGRyZW46WyJ3ZWVrIiwibW9udGgiLCIzMGRheXMiXS5tYXAobj0+KDAsbnQuanN4cykoImxhYmVsIix7Y2hpbGRyZW46WygwLG50LmpzeCkoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InZ2LXRpbWUtcmFuZ2UiLHZhbHVlOm4sY2hlY2tlZDplPT09bixvbkNoYW5nZTp0LmJpbmQobnVsbCxuKX0pLG49PT0id2VlayI/IlRoaXMgd2VlayI6bj09PSJtb250aCI/IlRoaXMgbW9udGgiOiJMYXN0IDMwIGRheXMiXX0sbikpfSl9ZnVuY3Rpb24gbmcoe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZGFpbHlWYWx1ZXM6bixtb29kUmF0aW5nczpvLG9uUmVmZXJlbmNlRGF0ZUNoYW5nZTpyLHJlZmVyZW5jZURhdGU6YSx3ZWVrRm9ybWF0Omksd2Vla2x5VG90YWw6c30pe2xldCBsPSgwLCRuLnVzZVJlZikobnVsbCksZD0oMCwkbi51c2VSZWYpKG51bGwpLGM9ZmMoaSksdT1FXyhhLG4sdCxjKSxwPU1hdGgubWF4KC4uLnUubWFwKF89Pl8udmFsdWUpLDEpLGY9dS5yZWR1Y2UoKF8sSyk9Pl8rKEsudmFsdWV8fDApLDApLG09TWF0aC5yb3VuZChmfHxzfHwwKSxnPU9fKG8sdSksW3csdl09KDAsJG4udXNlU3RhdGUpKCExKSxbeSxiXT0oMCwkbi51c2VTdGF0ZSkobnVsbCksaD1laShfZSgpLCJ2aWN0b3J5LXZhbHVlIiksW1MseF09KDAsJG4udXNlU3RhdGUpKGhbMF18fCJ3ZWVrIiksW0UsVF09KDAsJG4udXNlU3RhdGUpKG5FKGhbMV0pKSxBPXYuYmluZChudWxsLCEwKSxDPU5fLmJpbmQobnVsbCxlLFMsRSx2KSxPPVRfLmJpbmQobnVsbCxoLHgsVCx2KSxQPWtfKHUpLFU9SHMoe2ludGVyYWN0aXZlOiEwfSksST1fPT57VS5jYW5jZWxTY2hlZHVsZWRIaWRlKCksRF8obCxiLF8pfSxIPSgpPT5VLnNjaGVkdWxlSGlkZSgzMDAsKCk9PmIobnVsbCkpO3JldHVybigwLCRuLnVzZUVmZmVjdCkoKCk9PntkLmN1cnJlbnQ9KCk9Pl9fKGwsdSxwLGcsRSksZC5jdXJyZW50KCl9LFt1LHAsZyxFXSksKDAsJG4udXNlRWZmZWN0KSgoKT0+e2xldCBfPWwuY3VycmVudDtpZighX3x8dHlwZW9mIFJlc2l6ZU9ic2VydmVyPiJ1IilyZXR1cm47bGV0IEs9bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT5kLmN1cnJlbnQ/LigpKTtyZXR1cm4gSy5vYnNlcnZlKF8pLCgpPT5LLmRpc2Nvbm5lY3QoKX0sW10pLCgwLCRuLnVzZUVmZmVjdCkoKCk9PntpZih5PT09bnVsbCl7VS5oaWRlKCk7cmV0dXJufWxldCBfPWwuY3VycmVudDtpZighXylyZXR1cm47bGV0IEs9Xy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxNPUFfKGwseSksVz1LLmxlZnQrTSxEPUNfKGwseSx1LHApLE49RCxGPXdpbmRvdy5pbm5lckhlaWdodC1LLmJvdHRvbSxZPVVfKHksdSx0LGcpO0Y+Tj9VLnNob3coWSxXLEsuYm90dG9tLHtwbGFjZW1lbnQ6ImJvdHRvbSIsYmVsb3dDaGFydDohMH0pOlUuc2hvdyhZLFcsRCx7cGxhY2VtZW50OiJ0b3AifSl9LFt5XSksKDAsbnQuanN4cykocmUse2NvbmZpZ3VyYWJsZTohMCxvbkNvbmZpZ3VyZTpBLHdpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixjaGlsZHJlbjpbdz8oMCxudC5qc3hzKShtbyx7dGl0bGU6IkNvbmZpZ3VyZSBWaWN0b3J5IFZhbHVlIixvblN1Ym1pdDpDLG9uQ2FuY2VsOk8sY2hpbGRyZW46WygwLG50LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCIsY2hpbGRyZW46WygwLG50LmpzeCkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIixjaGlsZHJlbjoiVGltZSByYW5nZSJ9KSwoMCxudC5qc3gpKEZfLHt0aW1lUmFuZ2U6UyxzZXRUaW1lUmFuZ2U6eH0pXX0pLCgwLG50LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCIsY2hpbGRyZW46WygwLG50LmpzeCkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIixjaGlsZHJlbjoiTW9vZCBvdmVybGF5In0pLCgwLG50LmpzeHMpKCJsYWJlbCIse2NoaWxkcmVuOlsoMCxudC5qc3gpKCJpbnB1dCIse3R5cGU6ImNoZWNrYm94IixjaGVja2VkOkUsb25DaGFuZ2U6Xz0+VChfLnRhcmdldC5jaGVja2VkKX0pLCJTaG93IG1vb2Qgb3ZlcmxheSJdfSldfSldfSk6bnVsbCwoMCxudC5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJ2di1oZWFkZXIiLGNoaWxkcmVuOlsoMCxudC5qc3gpKCJzcGFuIix7Y2xhc3NOYW1lOiJ2di10b3RhbCIsY2hpbGRyZW46bX0pLCgwLG50LmpzeCkoInNwYW4iLHtjbGFzc05hbWU6InZ2LWxhYmVsIixjaGlsZHJlbjpgcG9pbnRzICR7UH1gfSldfSksKDAsbnQuanN4cykoImRpdiIse2NsYXNzTmFtZToidnYtY2hhcnQtY29udGFpbmVyIixjaGlsZHJlbjpbKDAsbnQuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ2di1uYXYtYXJyb3ciLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+ciYmcih0RShhLC0xKSksdGl0bGU6IlByZXZpb3VzIHdlZWsiLCJhcmlhLWxhYmVsIjoiUHJldmlvdXMgd2VlayIsY2hpbGRyZW46Ilx1MjAzOSJ9KSwoMCxudC5qc3gpKCJkaXYiLHtjbGFzc05hbWU6InZ2LWNoYXJ0LXdyYXAiLGNoaWxkcmVuOigwLG50LmpzeCkoImNhbnZhcyIse3JlZjpsLGNsYXNzTmFtZToidnYtY2hhcnQiLG9uTW91c2VNb3ZlOkksb25Nb3VzZUxlYXZlOkh9KX0pLCgwLG50LmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToidnYtbmF2LWFycm93Iix0eXBlOiJidXR0b24iLGRpc2FibGVkOnhfKGEsYyksb25DbGljazooKT0+ciYmcih0RShhLDEpKSx0aXRsZToiTmV4dCB3ZWVrIiwiYXJpYS1sYWJlbCI6Ik5leHQgd2VlayIsY2hpbGRyZW46Ilx1MjAzQSJ9KV19KV19KX12YXIgeWU9TChYKCksMSksb0U9M2U0O2Z1bmN0aW9uIHJFKGUsdCl7aWYoIWUpcmV0dXJuO2xldCBuPXQuc3RhcnRzV2l0aCgicmVwZWF0Iik7cmV0dXJue2JhY2tncm91bmRBdHRhY2htZW50OiJmaXhlZCIsYmFja2dyb3VuZEltYWdlOmB1cmwoJHtlfSlgLGJhY2tncm91bmRQb3NpdGlvbjoiY2VudGVyIixiYWNrZ3JvdW5kUmVwZWF0Om4/dDoibm8tcmVwZWF0IixiYWNrZ3JvdW5kU2l6ZTpuPyJhdXRvIjp0fX1mdW5jdGlvbiB6XyhlKXtsZXQgdD1OdW1iZXIoZT8uZ3JpZFdpZHRoU2l6ZSk+MD9OdW1iZXIoZS5ncmlkV2lkdGhTaXplKToxLG49TnVtYmVyKGU/LmdyaWRIZWlnaHRTaXplKT4wP051bWJlcihlLmdyaWRIZWlnaHRTaXplKToxO3JldHVybmBncmlkLWNlbGwgaG9yaXpvbnRhbC0ke3R9LWNlbGwgdmVydGljYWwtJHtufS1jZWxsYH1mdW5jdGlvbiBXXyhlLHQsbixvKXtsZXQgcj1lPy53aWRnZXRJZCx7Y2xhc3NOYW1lczphLHN0eWxlOml9PWYxKG4sbyxyKTtyZXR1cm57Y2xhc3NOYW1lOlt6XyhlKSx0PyJncmlkLWNlbGwtLWRyYWctYWN0aXZlIjoiIix0JiZ0PT09cj8iZ3JpZC1jZWxsLS1kcmFnZ2luZy1yZWFkeSI6IiIsdCYmdCE9PXI/ImdyaWQtY2VsbC0tZHJhZy1zaGlmdCI6IiIsLi4uYV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKSwiZGF0YS13aWRnZXQtaWQiOnIsc3R5bGU6aX19dmFyIG9nPWNsYXNzIGV4dGVuZHMgdmUuQ29tcG9uZW50e3N0YXRpYyBjb250ZXh0VHlwZT1jYTtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnN0YXRlPXtoYXNFcnJvcjohMSxlcnJvcjpudWxsfX1zdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHQpe3JldHVybntoYXNFcnJvcjohMCxlcnJvcjp0fX1jb21wb25lbnREaWRDYXRjaCh0LG4pe2soYFtXaWRnZXRFcnJvckJvdW5kYXJ5XSBXaWRnZXQgIiR7dGhpcy5wcm9wcy53aWRnZXRJZH0iIGNyYXNoZWQ6YCx0LG4pLFdzKHQse2NvbXBvbmVudFN0YWNrOm4/LmNvbXBvbmVudFN0YWNrLHNvdXJjZToid2lkZ2V0LWJvdW5kYXJ5Iix3aWRnZXRJZDp0aGlzLnByb3BzLndpZGdldElkfSksdGhpcy5jb250ZXh0Py5yZXBvcnRFcnJvcih0aGlzLnByb3BzLndpZGdldElkKX1yZW5kZXIoKXtyZXR1cm4gdGhpcy5zdGF0ZS5oYXNFcnJvcj8oMCx5ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2siLGNoaWxkcmVuOlsoMCx5ZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stdGl0bGUiLGNoaWxkcmVuOmBcdTI2QTAgJHt0aGlzLnByb3BzLndpZGdldElkfWB9KSwoMCx5ZS5qc3gpKCJwIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stbWVzc2FnZSIsY2hpbGRyZW46dGhpcy5zdGF0ZS5lcnJvcj8ubWVzc2FnZXx8IkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQifSksKDAseWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stcmV0cnkiLG9uQ2xpY2s6KCk9PnRoaXMuc2V0U3RhdGUoe2hhc0Vycm9yOiExLGVycm9yOm51bGx9KSxjaGlsZHJlbjoiUmV0cnkifSldfSk6dGhpcy5wcm9wcy5jaGlsZHJlbn19O2Z1bmN0aW9uIEJfKHt3aWRnZXRJZDplfSl7cmV0dXJuIEZrKGUpLG51bGx9ZnVuY3Rpb24gSF8oe2hhc0Vycm9yOmU9ITEsaXNSZWFkeTp0LHdpZGdldElkOm59KXtyZXR1cm4gdXQobix0LGUpLG51bGx9ZnVuY3Rpb24gUHQoZSx0LG4pe3JldHVybigwLHZlLm1lbW8pKGZ1bmN0aW9uKHIpe1FTKGUpO2xldHtjb25maWc6YSxkcmFnZ2luZ1dpZGdldElkOmksZm9jdXNlZFdpZGdldElkOnMsZm9jdXNlZFdpZGdldFN1cmZhY2VTdHlsZTpsLGxheW91dENvbmZpZzpkLGxvYWRlZEV2ZW50RXJyb3I6Yyxsb2FkZWRFdmVudFJlYWR5OnUsbW91bnRJbW1lZGlhdGVseTpwLHdpZGdldEZvY3VzVHJhbnNmb3JtOmZ9PXIsbT17Z3JpZEhlaWdodFNpemU6TnVtYmVyKGE/LmdyaWRIZWlnaHRTaXplKT4wP051bWJlcihhLmdyaWRIZWlnaHRTaXplKToxLGdyaWRXaWR0aFNpemU6TnVtYmVyKGE/LmdyaWRXaWR0aFNpemUpPjA/TnVtYmVyKGEuZ3JpZFdpZHRoU2l6ZSk6MX0sZz1XXyhkfHxhLGkscyxmKTtsJiYoZy5jbGFzc05hbWUrPSIgZ3JpZC1jZWxsLS1mb2N1cy1vdmVybGF5LWhvc3QiKTtsZXQgdz1sPyJncmlkLWNlbGwtc3VyZmFjZSBncmlkLWNlbGwtc3VyZmFjZS0tZm9jdXNlZCI6ImdyaWQtY2VsbC1zdXJmYWNlIix2PSgwLHllLmpzeHMpKHllLkZyYWdtZW50LHtjaGlsZHJlbjpbKDAseWUuanN4KShCXyx7d2lkZ2V0SWQ6ZX0pLHUhPT12b2lkIDB8fGM/KDAseWUuanN4KShIXyx7aGFzRXJyb3I6ISFjLGlzUmVhZHk6ISF1LHdpZGdldElkOmV9KTpudWxsLCgwLHllLmpzeCkodCx7Li4ubihyKX0pXX0pO3JldHVybigwLHllLmpzeCkoImRpdiIsey4uLmcsY2hpbGRyZW46KDAseWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOncsc3R5bGU6bHx8dm9pZCAwLGNoaWxkcmVuOigwLHllLmpzeCkob2cse3dpZGdldElkOmUsY2hpbGRyZW46KDAseWUuanN4KShTbS5Qcm92aWRlcix7dmFsdWU6bSxjaGlsZHJlbjpwP3Y6KDAseWUuanN4KSh4aCx7d2lkZ2V0SWQ6ZSxjaGlsZHJlbjp2fSl9KX0pfSl9KX0pfWZ1bmN0aW9uIHZhKC4uLmUpe3JldHVybiB0PT57bGV0IG49e307Zm9yKGxldCBvIG9mIGUpbltvXT10W29dO3JldHVybiBufX12YXIgS189UHQoImFnZW5kYSIsTW0sKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY2FsZW5kYXJFdmVudHNMb2FkZWQ6byxjdXJyZW50RGF0ZTpyLHNlbGVjdGVkRGF0ZTphLHRpbWVGb3JtYXQ6aX0pPT4oe2FwcDp0LGNhbGVuZGFyRXZlbnRzOm8/bjpudWxsLGN1cnJlbnREYXRlOnIsc2VsZWN0ZWREYXRlOmEsdGFza3M6ZSx0aW1lRm9ybWF0Oml9KSksR189UHQoImRheS1za2V0Y2giLHptLCh7YWdlbmRhVGFza3M6ZSxhcHA6dCxjYWxlbmRhckV2ZW50czpuLGNhbGVuZGFyRXZlbnRzTG9hZGVkOm8sY3VycmVudERhdGU6cix0aW1lRm9ybWF0OmF9KT0+KHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm8/bjpudWxsLGN1cnJlbnREYXRlOnIsdGltZUZvcm1hdDphfSkpLFZfPVB0KCJjYWxlbmRhciIsT20sKHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGNvbmZpZzpuLGN1cnJlbnREYXRlOm8sb25EYXRlU2VsZWN0OnIsb25PcGVuU2V0dGluZ3M6YSxvcGVuVGFza3M6aSxzZWxlY3RlZERhdGU6cyx3ZWVrRm9ybWF0Omx9KT0+KHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGN1cnJlbnREYXRlOm8sZ3JpZEhlaWdodFNpemU6bj8uZ3JpZEhlaWdodFNpemUsZ3JpZFdpZHRoU2l6ZTpuPy5ncmlkV2lkdGhTaXplLG9uRGF0ZVNlbGVjdDpyLG9uT3BlblNldHRpbmdzOmEsb3BlblRhc2tzOmksc2VsZWN0ZWREYXRlOnMsd2Vla0Zvcm1hdDpsfSkpLGpfPVB0KCJkZWJ1Zy1jb25zb2xlIixXbSwoKT0+KHt9KSksWV89UHQoImVuZXJneS1wZXItaGFiaXQiLHNoLHZhKCJhcHAiKSkscV89UHQoImRyZWFtLXRhc2siLFFtLCh7YXBwOmUsY29uZmlnOnQsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpvLHByb3ZpZGVyRW06cix0YXNrRG9tYWluTmFtZTphLHRhc2tEb21haW5VVUlEOml9KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLGdyaWRXaWR0aFNpemU6TnVtYmVyKHQ/LmdyaWRXaWR0aFNpemUpfHwyLG9uT3BlblNldHRpbmdzOm4scHJvdmlkZXJBcGlLZXk6byxwcm92aWRlckVtOnIsdGFza0RvbWFpbk5hbWU6YSx0YXNrRG9tYWluVVVJRDppfSkpLCRfPVB0KCJtb29kIixFaCx2YSgiYXBwIiwibW9vZFJhdGluZ3MiLCJvbk1vb2RSZWNvcmRlZCIpKSxYXz1QdCgibm90ZS1wZWVrIixOaCx2YSgiYXBwIikpLEpfPVB0KCJwZWFrLWhvdXJzIixEaCx2YSgiYXBwIiwiY3VycmVudERhdGUiLCJzZWxlY3RlZERhdGUiLCJ0aW1lRm9ybWF0IikpLFFfPVB0KCJwcm9wb3NlZC1hZ2VuZGEiLEZoLCh7YXBwOmUsY2FsZW5kYXJFdmVudHM6dCxjYWxlbmRhckV2ZW50c0xvYWRlZDpuLGN1cnJlbnREYXRlOm8scHJvdmlkZXJBcGlLZXk6cixwcm92aWRlckVtOmEsdGFza0RvbWFpbk5hbWU6aSx0YXNrRG9tYWluVVVJRDpzLHRpbWVGb3JtYXQ6bH0pPT4oe2FwcDplLGNhbGVuZGFyRXZlbnRzOm4/dDpudWxsLGN1cnJlbnREYXRlOm8sZGVmYXVsdE5vdGVVdWlkOm51bGwscHJvdmlkZXJBcGlLZXk6cixwcm92aWRlckVtOmEsdGFza0RvbWFpbk5hbWU6aSx0YXNrRG9tYWluVVVJRDpzLHRpbWVGb3JtYXQ6bH0pKSxaXz1QdCgicGxhbm5pbmciLEVtLCh7YXBwOmUsY29uZmlnOnQscXVhcnRlcmx5UGxhbnM6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEscXVhcnRlcmx5UGxhbnM6bn0pKSxlVT1QdCgicXVpY2stYWN0aW9ucyIsV2gsdmEoImFwcCIsIm9uU3dhcEJhY2tncm91bmQiKSksdFU9UHQoInF1b3RlcyIsemgsKHthcHA6ZSxjb25maWc6dH0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEscGxhbkNvbnRlbnQ6bnVsbCxxdW90ZXM6bnVsbH0pKSxuVT1QdCgicmVjZW50LW5vdGVzIixIaCwoe2FwcDplLGNvbmZpZzp0LHRhc2tEb21haW5VVUlEOm59KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLHRhc2tEb21haW5VVUlEOm59KSksb1U9UHQoInNoYXJlZC1ub3RlcyIscWgsKHthcHA6ZSxjb25maWc6dCx0YXNrRG9tYWluVVVJRDpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSx0YXNrRG9tYWluVVVJRDpufSkpLHJVPVB0KCJncmF2ZXlhcmQiLGZoLCh7YXBwOmUsY29uZmlnOnQsdGFza0RvbWFpblVVSUQ6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsZ3JpZFdpZHRoU2l6ZTpOdW1iZXIodD8uZ3JpZFdpZHRoU2l6ZSl8fDIsdGFza0RvbWFpblVVSUQ6bn0pKSxhVT1QdCgidmljdG9yeS12YWx1ZSIsbmcsdmEoImFwcCIsImNvbXBsZXRlZFRhc2tzQnlEYXRlIiwiZGFpbHlWYWx1ZXMiLCJtb29kUmF0aW5ncyIsIm9uUmVmZXJlbmNlRGF0ZUNoYW5nZSIsInJlZmVyZW5jZURhdGUiLCJ3ZWVrRm9ybWF0Iiwid2Vla2x5VG90YWwiKSksaVU9UHQoImxheW91dC1waWNrZXIiLGtoLHZhKCJhcHAiLCJjdXJyZW50TGF5b3V0Iiwib25MYXlvdXRBcHBseSIsIm9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlIikpLFhjPXthZ2VuZGE6S18sY2FsZW5kYXI6Vl8sImRheS1za2V0Y2giOkdfLCJkZWJ1Zy1jb25zb2xlIjpqXywiZHJlYW0tdGFzayI6cV8sImVuZXJneS1wZXItaGFiaXQiOllfLGdyYXZleWFyZDpyVSwibGF5b3V0LXBpY2tlciI6aVUsbW9vZDokXywibm90ZS1wZWVrIjpYXywicGVhay1ob3VycyI6Sl8scGxhbm5pbmc6Wl8sInByb3Bvc2VkLWFnZW5kYSI6UV8sInF1aWNrLWFjdGlvbnMiOmVVLHF1b3Rlczp0VSwicmVjZW50LW5vdGVzIjpuVSwic2hhcmVkLW5vdGVzIjpvVSwidmljdG9yeS12YWx1ZSI6YVV9O2Z1bmN0aW9uIHNVKGUpe2xldCB0PWU/LltCLkRBU0hCT0FSRF9DT01QT05FTlRTXSxuPXQ7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXRyeXtuPUpTT04ucGFyc2UodCl9Y2F0Y2h7bj1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KG4pfHwobj1Zbyksbi5tYXAobz0+bz8ud2lkZ2V0SWQpLmZpbHRlcihvPT5YY1tvXSl9ZnVuY3Rpb24gbFUoZSx7aW5pdERhdGFGcmVzaFJlZjp0LGluaXRpYWxpemVEb21haW5UYXNrczpuLHNldENvbmZpZ1BhcmFtczpvLHNldEN1cnJlbnREYXRlOnIsc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmEsc2V0TW9vZFJhdGluZ3M6aSxzZXRQbHVnaW5Ob3RlVVVJRDpzLHNldFF1YXJ0ZXJseVBsYW5zOmwsc2V0V2Vla2x5VmljdG9yeVZhbHVlOmR9KXtybShlLnNldHRpbmdzPy5bQi5DT05TT0xFX0xPR0dJTkddKSxNaygpLGsoYFtkYXNoYm9hcmRdIGFwcGx5RGFzaGJvYXJkRGF0YSBcdTIwMTQgdGFza3M6JHtlLnRhc2tzPy5sZW5ndGg/PzB9IG1vb2RSYXRpbmdzOiAke2UubW9vZFJhdGluZ3M/Lmxlbmd0aD8/MH1gKSx3aW5kb3cuX19kYXNoYm9hcmRWaWV3cG9ydERpYWcmJmsoYFt2aWV3cG9ydF0gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3cuX19kYXNoYm9hcmRWaWV3cG9ydERpYWcpfWApLG4oZSksaShlLm1vb2RSYXRpbmdzKSxsKGUucXVhcnRlcmx5UGxhbnMpLG8oZS5zZXR0aW5ncyksYShlLmRhaWx5VmljdG9yeVZhbHVlcyksZChlLndlZWtseVZpY3RvcnlWYWx1ZSkscihlLmN1cnJlbnREYXRlKSxlLnBsdWdpbk5vdGVVVUlEJiZzKGUucGx1Z2luTm90ZVVVSUQpLHQuY3VycmVudD0hMH1mdW5jdGlvbiBhRShlKXtsZXQgdD1uZXcgRGF0ZSxuPW1uKHQsZSk7cmV0dXJuIHQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpPDMqMjQqNjAqNjAqMWUzfWZ1bmN0aW9uIGRVKGUsdCl7bGV0IG49bmV3IE1hcDtmb3IobGV0IG8gb2ZbLi4uZXx8W10sLi4udHx8W11dKXtpZighb3x8by50aW1lc3RhbXA9PW51bGwpY29udGludWU7bGV0IHI9by51dWlkfHxgJHtvLnRpbWVzdGFtcH06JHtvLnJhdGluZ306JHtvLm5vdGV8fCIifWA7bi5zZXQocixvKX1yZXR1cm4gQXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChvLHIpPT4oby50aW1lc3RhbXB8fDApLShyLnRpbWVzdGFtcHx8MCkpfWFzeW5jIGZ1bmN0aW9uIGNVKGUsdCxuLG8pe2xldCByPW1uKHQsbyk7YUUobykmJihyPW5ldyBEYXRlKHIpLHIuc2V0RGF0ZShyLmdldERhdGUoKS03KSk7bGV0IGE9TWF0aC5mbG9vcihyLmdldFRpbWUoKS8xZTMpO3RyeXtsZXQgaT1hd2FpdCBlLmdldE1vb2RSYXRpbmdzKGEpO0FycmF5LmlzQXJyYXkoaSkmJm4ocz0+ZFUocyxpKSl9Y2F0Y2goaSl7aygiZmV0Y2hNb29kUmF0aW5nczogZmFpbGVkIHRvIGxvYWQgbW9vZCByYXRpbmdzIixpKX19ZnVuY3Rpb24gdVUoZSx0LG4sbyxyLGEsaSl7ZShyLGEsaSksaSYmKHQoaS5kYWlseVZpY3RvcnlWYWx1ZXMpLG8oaS53ZWVrbHlWaWN0b3J5VmFsdWUpLGkucXVhcnRlcmx5UGxhbnMmJm4oaS5xdWFydGVybHlQbGFucykpfWFzeW5jIGZ1bmN0aW9uIHBVKGUsdCxuLG8scj0hMSxhPW51bGwpe2xldCBpPUFycmF5LmlzQXJyYXkodD8uW0IuREFTSEJPQVJEX0NPTVBPTkVOVFNdKT90W0IuREFTSEJPQVJEX0NPTVBPTkVOVFNdOllvLHM9e307cnx8aS5mb3JFYWNoKGQ9PntzW2Qud2lkZ2V0SWRdPWR9KTtsZXQgbD1vLm1hcChkPT57bGV0IGM9c1tkXSx1PU10LmZpbmQoZj0+Zi53aWRnZXRJZD09PWQpLHA9YT8uW2RdO3JldHVybnt3aWRnZXRJZDpkLGdyaWRXaWR0aFNpemU6cD8uZ3JpZFdpZHRoU2l6ZT8/Yz8uZ3JpZFdpZHRoU2l6ZT8/dT8uZGVmYXVsdEdyaWRXaWR0aFNpemU/PzEsZ3JpZEhlaWdodFNpemU6cD8uZ3JpZEhlaWdodFNpemU/P2M/LmdyaWRIZWlnaHRTaXplPz8xLHNldHRpbmdzOmM/LnNldHRpbmdzfHx7fX19KTthd2FpdCBlLnNldFNldHRpbmcoQi5EQVNIQk9BUkRfQ09NUE9ORU5UUyxKU09OLnN0cmluZ2lmeShsKSksdW8oQi5EQVNIQk9BUkRfQ09NUE9ORU5UUyxsKSxuKGQ9Pih7Li4uZCxbQi5EQVNIQk9BUkRfQ09NUE9ORU5UU106bH0pKX1hc3luYyBmdW5jdGlvbiBmVShlLHQsbixvLHIsYSx7YXBpS2V5OmksYXBpS2V5UHJvdmlkZXI6cyxiYWNrZ3JvdW5kSW1hZ2VVcmw6bCxiYWNrZ3JvdW5kTW9kZTpkLGxsbVByb3ZpZGVyOmMsdGltZUZvcm1hdDp1LHdlZWtGb3JtYXQ6cH0pe2soIltkYXNoYm9hcmRdIGhhbmRsZVNldHRpbmdzU2F2ZSBjYWxsZWQgd2l0aDoiLHtsbG1Qcm92aWRlcjpjLGFwaUtleVByb3ZpZGVyOnMsYmFja2dyb3VuZE1vZGU6ZCxiYWNrZ3JvdW5kSW1hZ2VVcmw6bCE9bnVsbD8iKHNldCkiOiIodW5jaGFuZ2VkKSIsdGltZUZvcm1hdDp1LHdlZWtGb3JtYXQ6cH0pO2xldCBmPSR0KHN8fGMpLG09W2Uuc2V0U2V0dGluZyhCLkxMTV9QUk9WSURFUl9NT0RFTCxjKSxlLnNldFNldHRpbmcoQi5CQUNLR1JPVU5EX0lNQUdFX1VSTCxsfHwiIildO2YmJmkmJm0ucHVzaChlLnNldFNldHRpbmcoZixpKSksbCYmZCYmbS5wdXNoKGUuc2V0U2V0dGluZyhCLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERSxkKSksdC5jdXJyZW50JiYodXx8cCkmJm0ucHVzaCh0LmN1cnJlbnQuc2F2ZSh7dGltZUZvcm1hdDp1LHdlZWtGb3JtYXQ6cH0pKTt0cnl7YXdhaXQgUHJvbWlzZS5hbGwobSksaygiW2Rhc2hib2FyZF0gc2V0dGluZ3Mgc2F2ZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Iil9Y2F0Y2godyl7aygiW2Rhc2hib2FyZF0gc2V0dGluZ3Mgc2F2ZSBGQUlMRUQ6Iix3KX11byhCLkxMTV9QUk9WSURFUl9NT0RFTCxjKSxmJiZ1byhmLGkpO2xldCBnPXtbQi5MTE1fUFJPVklERVJfTU9ERUxdOmMsW0IuQkFDS0dST1VORF9JTUFHRV9VUkxdOmx8fCIiLFtCLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV06bD9kfHwiY292ZXIiOiIifTtmJiYoZ1tmXT1pKSxuKHc9Pih7Li4udywuLi5nfSkpLHUmJnIodSkscCYmYShwKSxvKEV0LkRFRkFVTFQpfWZ1bmN0aW9uIG1VKGUsdCl7ZShuPT5bLi4ubnx8W10sdF0pfWZ1bmN0aW9uIHJnKHthcHA6ZSxpbml0UHJvbWlzZTp0fSl7bGV0e2FjdGl2ZVRhc2tEb21haW46bixidWlsZEFnZW5kYVRhc2tzQnlEYXRlOm8saW5pdGlhbGl6ZURvbWFpblRhc2tzOnIsb25Eb21haW5DaGFuZ2U6YSxvcGVuVGFza3M6aSx0YXNrRG9tYWluczpzfT1iaCgpLGw9cy5maW5kKHNlPT5zZS51dWlkPT09bik/Lm5hbWV8fCJBbGwgTm90ZXMiLHtjb21wbGV0ZWRUYXNrc0J5RGF0ZTpkLGNvbXBsZXRlZFRhc2tzTG9hZGVkOmMsZmV0Y2hDb21wbGV0ZWRUYXNrczp1fT1naChlKSx7Y2FsZW5kYXJFdmVudHM6cCxjYWxlbmRhckV2ZW50c0xvYWRlZDpmfT1ObShlLG4pLFttLGddPSgwLHZlLnVzZVN0YXRlKShudWxsKSxbdyx2XT0oMCx2ZS51c2VTdGF0ZSkobnVsbCksW3ksYl09KDAsdmUudXNlU3RhdGUpKG51bGwpLFtoLFNdPSgwLHZlLnVzZVN0YXRlKShudWxsKSxbeCxFXT0oMCx2ZS51c2VTdGF0ZSkoRXQuREVGQVVMVCksW1QsQV09KDAsdmUudXNlU3RhdGUpKG51bGwpLFtDLE9dPSgwLHZlLnVzZVN0YXRlKShudWxsKSxbUCxVXT0oMCx2ZS51c2VTdGF0ZSkobnVsbCksW0ksSF09KDAsdmUudXNlU3RhdGUpKG51bGwpLFtfLEtdPSgwLHZlLnVzZVN0YXRlKSgibWVyaWRpYW4iKSxbTSxXXT0oMCx2ZS51c2VTdGF0ZSkoInN1bmRheSIpLFtELE5dPSgwLHZlLnVzZVN0YXRlKShudWxsKSxGPSgwLHZlLnVzZVJlZikobnVsbCksWT0oMCx2ZS51c2VSZWYpKCExKSxqPSgwLHZlLnVzZVJlZikobnVsbCk7ai5jdXJyZW50PT09bnVsbCYmKGouY3VycmVudD1jbSgpKTtsZXQgWj0oMCx2ZS51c2VSZWYpKERhdGUubm93KCkpLG9lPSgwLHZlLnVzZVJlZikobnVsbCkscT0oMCx2ZS51c2VSZWYpKCExKSx0ZT1mYyhNKTsoMCx2ZS51c2VFZmZlY3QpKCgpPT57bGV0IHNlPURhdGUubm93KCk7aygiW2Rhc2hib2FyZF0gYXdhaXRpbmcgaW5pdCBkYXRhIik7bGV0IFplPXNldFRpbWVvdXQoKCk9PntwbShgRGFzaGJvYXJkIGluaXQgaGFzIG5vdCBzZXR0bGVkIGFmdGVyICR7b0UvMWUzfXNgLHthY3Rpb246ImluaXQiLGxldmVsOiJ3YXJuaW5nIixtb2JpbGU6ISFqLmN1cnJlbnQ/Lm1vYmlsZSxzb3VyY2U6ImluaXQtd2F0Y2hkb2ciLHRpZXI6ai5jdXJyZW50Py50aWVyfSksQmUoImRhc2hib2FyZEluaXRTdGFsbGVkIix7dGllcjpqLmN1cnJlbnQ/LnRpZXI/PyJ1bmtub3duIn0pfSxvRSk7cmV0dXJuIHQudGhlbihhc3luYyBUZT0+e2lmKGNsZWFyVGltZW91dChaZSksayhgW2Rhc2hib2FyZF0gaW5pdCBkYXRhIHJlY2VpdmVkIGluICR7RGF0ZS5ub3coKS1zZX1tc2ApLFRlPy5lcnJvcil7bGV0IEFuPVN0cmluZyhUZS5lcnJvcik7aWMoVGUse2FjdGlvbjpUZS5lcnJvckFjdGlvbnx8ImluaXQiLHNvdXJjZToiaW5pdC1wYXlsb2FkLWVycm9yIn0pLEJlKCJkYXNoYm9hcmRJbml0RXJyb3IiLHtwYXRoOiJwYXlsb2FkIn0pLFMoQW4pO3JldHVybn1pZighVGV8fHR5cGVvZiBUZSE9Im9iamVjdCIpe2xldCBBbj0iRGFzaGJvYXJkIGluaXQgcmV0dXJuZWQgbm8gZGF0YSI7cG0oQW4se2FjdGlvbjoiaW5pdCIsc291cmNlOiJpbml0LWVtcHR5In0pLEJlKCJkYXNoYm9hcmRJbml0RXJyb3IiLHtwYXRoOiJlbXB0eSJ9KSxTKEFuKTtyZXR1cm59V2soVGUpO2ZvcihsZXQgQW4gb2YgQXJyYXkuaXNBcnJheShUZS5pbml0RmFpbHVyZXMpP1RlLmluaXRGYWlsdXJlczpbXSlpYyhBbix7YWN0aW9uOkFuPy5zb3VyY2V8fCJpbml0Iixzb3VyY2U6ImluaXQtc29mdC1mYWlsIn0pO3gwKFRlLnNldHRpbmdzKSxwbCgiaW5pdCIpLHhrKCkmJihvZS5jdXJyZW50PVMwKGUse2RldmljZVByb2ZpbGU6ai5jdXJyZW50LHN0YXJ0ZWRBdDpaLmN1cnJlbnQsd2lkZ2V0SWRzOnNVKFRlLnNldHRpbmdzKX0pKSxsVShUZSx7aW5pdERhdGFGcmVzaFJlZjpZLGluaXRpYWxpemVEb21haW5UYXNrczpyLHNldENvbmZpZ1BhcmFtczpnLHNldEN1cnJlbnREYXRlOnYsc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmIsc2V0TW9vZFJhdGluZ3M6QSxzZXRQbHVnaW5Ob3RlVVVJRDpPLHNldFF1YXJ0ZXJseVBsYW5zOlUsc2V0V2Vla2x5VmljdG9yeVZhbHVlOk59KSxGLmN1cnJlbnQ9bmV3IFlzKGUpO2xldCBsbj1EYXRlLm5vdygpO2soIltkYXNoYm9hcmRdIGxvYWRpbmcgRGFzaGJvYXJkU2V0dGluZ05vdGUiKTtsZXR7dGltZUZvcm1hdDpJbyx3ZWVrRm9ybWF0OlJvfT1hd2FpdCBGLmN1cnJlbnQubG9hZCgpO2soYFtkYXNoYm9hcmRdIERhc2hib2FyZFNldHRpbmdOb3RlIGxvYWRlZCBpbiAke0RhdGUubm93KCktbG59bXNgKSxJbyYmSyhJbyksUm8mJlcoUm8pfSkuY2F0Y2goVGU9PntjbGVhclRpbWVvdXQoWmUpLFdzKFRlLHthY3Rpb246ImluaXQiLHNvdXJjZToiaW5pdC1wcm9taXNlLXJlamVjdCJ9KSxCZSgiZGFzaGJvYXJkSW5pdEVycm9yIix7cGF0aDoicmVqZWN0In0pLFMoVGU/Lm1lc3NhZ2V8fFN0cmluZyhUZSkpfSksKCk9PmNsZWFyVGltZW91dChaZSl9LFtdKSwoMCx2ZS51c2VFZmZlY3QpKCgpPT57aWYoWyJ0cnVlIiwieWVzIiwiMSIsIm9uIiwiZW5hYmxlZCJdLmluY2x1ZGVzKFN0cmluZyhtPy5bQi5DT05TT0xFX0xPR0dJTkddfHwiIikudHJpbSgpLnRvTG93ZXJDYXNlKCkpKXJldHVybiBaUygpfSxbbV0pO2xldCBkZT0oMCx2ZS51c2VNZW1vKSgoKT0+e2lmKEkpcmV0dXJuIEk7aWYoIXcpcmV0dXJuIG51bGw7aWYoYUUodGUpKXtsZXQgc2U9bW4odyx0ZSksWmU9bmV3IERhdGUoc2UpO3JldHVybiBaZS5zZXREYXRlKFplLmdldERhdGUoKS0xKSxhZShaZSl9cmV0dXJuIHd9LFt3LEksdGVdKSxsZT0oMCx2ZS51c2VDYWxsYmFjaykoc2U9PmNVKGUsc2UsQSx0ZSksW2UsdGVdKTsoMCx2ZS51c2VFZmZlY3QpKCgpPT57bGV0IHNlPUl8fHc7c2UmJihZLmN1cnJlbnQ/WS5jdXJyZW50PSExOmxlKHNlKSx1KHNlLG4pLGRlJiZkZSE9PXNlJiZ1KGRlLG4pKX0sW24sdyx1LGxlLEksZGVdKTtsZXQgcGU9KDAsdmUudXNlQ2FsbGJhY2spKChzZSxaZSxUZSk9PnVVKGEsYixVLE4sc2UsWmUsVGUpLFthXSksa2U9KDAsdmUudXNlQ2FsbGJhY2spKChzZSxaZT0hMSxUZT1udWxsKT0+cFUoZSxtLGcsc2UsWmUsVGUpLFtlLG1dKSxQZT0oMCx2ZS51c2VDYWxsYmFjaykoc2U9PmcoWmU9Pih7Li4uWmUsW0IuU0VMRUNURURfTEFZT1VUX1BST0ZJTEVdOnNlfSkpLFtdKSx1ZT0oMCx2ZS51c2VDYWxsYmFjaykoYXN5bmMoc2UsWmU9ITEsVGU9bnVsbCxsbj12b2lkIDApPT57YXdhaXQgd2goe2FwcDplLGlzUmVzZXQ6WmUsb25MYXlvdXRQZXJzaXN0OmtlLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOlBlLHByb2ZpbGVJZDpsbixzaXppbmc6VGUsd2lkZ2V0SWRzOnNlfSksRShFdC5ERUZBVUxUKX0sW2Usa2UsUGVdKSxxZT0oMCx2ZS51c2VDYWxsYmFjaykoc2U9PmZVKGUsRixnLEUsSyxXLHNlKSxbZV0pLEplPSgwLHZlLnVzZUNhbGxiYWNrKShzZT0+bVUoQSxzZSksW10pLFFlPSgwLHZlLnVzZUNhbGxiYWNrKSgoKT0+e3EuY3VycmVudHx8IW9lLmN1cnJlbnR8fChxLmN1cnJlbnQ9ITAscGwoImxvYWQtc2V0dGxlIiksb2UuY3VycmVudC50aGVuKHNlPT57c2UmJkUwKGUse2RldmljZVByb2ZpbGU6ai5jdXJyZW50LHNldHRsZWRBdDpEYXRlLm5vdygpLHN0YXJ0ZWRBdDpaLmN1cnJlbnQsd2lkZ2V0SWRzOnNlLndpZGdldElkc30pfSkpfSxbZV0pO0ptKHthY3RpdmVUYXNrRG9tYWluOm4sYXBwOmUsb25Eb21haW5DaGFuZ2U6YSxvcGVuVGFza3M6aX0pO2xldCB5dD0oMCx2ZS51c2VNZW1vKSgoKT0+dz9vKHcpOnt9LFtvLHddKSx7YWN0aXZlQ29tcG9uZW50czpMdH09eWgoe2NvbmZpZ1BhcmFtczptfSkse2RyYWdnaW5nV2lkZ2V0SWQ6SGUsZGlzcGxheWVkQ29tcG9uZW50czpiZX09bDAoTHQsa2UpLHtjbGVhckZvY3VzZWRXaWRnZXQ6b3QsZXhwYW5kZWRXaWRnZXRJZDpydCxmb2N1c2VkV2lkZ2V0SWQ6a3QsZm9jdXNlZFdpZGdldFN1cmZhY2VTdHlsZTpoZSxpc1dpZGdldEZvY3VzTW9kZTpmZSx3aWRnZXRGb2N1c1RyYW5zZm9ybXM6X3R9PWcxKEhlLHgpLHtpbmNvbWluZ0JhY2tncm91bmRVcmw6WG4sc3dhcEJhY2tncm91bmQ6YmEsc3dhcHBlZEJhY2tncm91bmRVcmw6d2F9PWhoKCksYXI9KDAsdmUudXNlQ2FsbGJhY2spKCgpPT5FKEV0LlNFVFRJTkdTX0NPTkZJRyksW10pLGthPXNlPT57c3dpdGNoKHNlKXtjYXNlImFnZW5kYSI6cmV0dXJuIGY7Y2FzZSJjYWxlbmRhciI6cmV0dXJuIGM7Y2FzZSJkZWJ1Zy1jb25zb2xlIjpyZXR1cm4hMDtjYXNlImxheW91dC1waWNrZXIiOnJldHVybiEwO2Nhc2UibW9vZCI6cmV0dXJuIFQhPT1udWxsO2Nhc2UicXVpY2stYWN0aW9ucyI6cmV0dXJuITA7Y2FzZSJxdW90ZXMiOnJldHVybiEwO2Nhc2UidmljdG9yeS12YWx1ZSI6cmV0dXJuIGMmJnkhPT1udWxsJiZUIT09bnVsbDtkZWZhdWx0OnJldHVybn19LE5pPXNlPT57bGV0IFplPVhjW3NlXSxUZT1NdC5maW5kKGV1PT5ldS53aWRnZXRJZD09PXNlKTtpZighWmV8fCFUZSlyZXR1cm4gbnVsbDtsZXQgbG49bT8uW0IuTExNX1BST1ZJREVSX01PREVMXSxJbz1WbyhsbiksUm89SW8/JHQoSW8pOm51bGwsQW49Um8mJm0/LltSb118fCIiLFFjPUlvfHxsbnx8bnVsbCxaYz17Z3JpZEhlaWdodFNpemU6MSxncmlkV2lkdGhTaXplOlRlLmRlZmF1bHRHcmlkV2lkdGhTaXplfHwxLHNldHRpbmdzOnt9LHdpZGdldElkOnNlfTtyZXR1cm4oMCx5ZS5qc3gpKFplLHthZ2VuZGFUYXNrczp5dCxhcHA6ZSxjYWxlbmRhckV2ZW50czpwLGNhbGVuZGFyRXZlbnRzTG9hZGVkOmYsY29tcGxldGVkVGFza3NCeURhdGU6ZCxjb25maWc6WmMsY3VycmVudERhdGU6dyxjdXJyZW50TGF5b3V0OmlyLGRhaWx5VmFsdWVzOnksbG9hZGVkRXZlbnRSZWFkeTprYShzZSksbW91bnRJbW1lZGlhdGVseTohMCxtb29kUmF0aW5nczpULG9uRGF0ZVNlbGVjdDpILG9uTGF5b3V0QXBwbHk6a2Usb25Nb29kUmVjb3JkZWQ6SmUsb25PcGVuU2V0dGluZ3M6YXIsb25SZWZlcmVuY2VEYXRlQ2hhbmdlOkgsb25TZWxlY3RlZFByb2ZpbGVDaGFuZ2U6UGUsb3BlblRhc2tzOmkscHJvdmlkZXJBcGlLZXk6QW4scHJvdmlkZXJFbTpRYyxxdWFydGVybHlQbGFuczpQLHJlZmVyZW5jZURhdGU6ZGUsc2VsZWN0ZWREYXRlOkksdGFza0RvbWFpbk5hbWU6bCx0YXNrRG9tYWluVVVJRDpuLHRpbWVGb3JtYXQ6Xyx3ZWVrRm9ybWF0Ok0sd2Vla2x5VG90YWw6RH0pfSxSPWJlLm1hcCgoc2UsWmUpPT5zZT8ud2lkZ2V0SWR8fFlvW1plXT8ud2lkZ2V0SWQpLmZpbHRlcihzZT0+WGNbc2VdKSxRPXVjKFIse29uU2V0dGxlOlFlfSk7aWYoaClyZXR1cm4oMCx5ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtZXJyb3IiLGNoaWxkcmVuOlsoMCx5ZS5qc3gpKCJoMiIse2NoaWxkcmVuOiJEYXNoYm9hcmQgRXJyb3IifSksKDAseWUuanN4KSgicCIse2NoaWxkcmVuOmh9KV19KTtpZighbSlyZXR1cm4oMCx5ZS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1vdXRlci1jb250YWluZXIiLGNoaWxkcmVuOigwLHllLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sb2FkaW5nIixjaGlsZHJlbjpbKDAseWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJzcGlubmVyIn0pLCgwLHllLmpzeCkoInAiLHtjaGlsZHJlbjoiTG9hZGluZyBkYXNoYm9hcmQuLi4ifSldfSl9KTtsZXQgaWU9bT8uW0IuQkFDS0dST1VORF9JTUFHRV9VUkxdLE1lPW0/LltCLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV18fCJjb3ZlciIsTmU9aWV8fHpjKCJsYXJnZSIsYWUod3x8bmV3IERhdGUpKTtpZSYmaygiW2Rhc2hib2FyZF0gYmFja2dyb3VuZCBpbWFnZSBVUkwgZnJvbSBzZXR0aW5nczoiLGllLCJtb2RlOiIsTWUpO2xldCBVdD1yRSh3YXx8TmUsTWUpLFp0PVhuP3suLi5yRShYbixNZSksYW5pbWF0aW9uOmAke08xfSAke21ofW1zIGVhc2UtaW4tb3V0IGZvcndhcmRzYH06bnVsbCx4YT1TdHJpbmcobVtCLkRFQlVHX0NPTlNPTEVdfHwiIikudHJpbSgpPT09InRydWUifHxfbnx8R3MoKS5wbHVnaW5VVUlEPT09IjZkYTAzNTc0LTBmNGItMTFmMS1iYTllLTExYmE5YzcxNmY1OSIsT289eGE7eGE/ayhgW2Rhc2hib2FyZF0gRGVidWcgY29uc29sZSBlbmFibGVkIChjb25maWdQYXJhbXMgIiR7bVtCLkRFQlVHX0NPTlNPTEVdfHwiKGVtcHR5KSJ9IiBhcHAgc2V0dGluZyBrZXlzICIke09iamVjdC5rZXlzKGUuc2V0dGluZ3MpfHwiKGVtcHR5KSJ9IiwgJHtHcygpLnBsdWdpblVVSUR9KSwgaW5jbHVkaW5nIGluIGxheW91dCBwb3B1cGApOmsoYFtkYXNoYm9hcmRdIERlYnVnIGNvbnNvbGUgZGlzYWJsZWQgKCR7Qi5ERUJVR19DT05TT0xFfSBpcyAnJHttPy5bQi5ERUJVR19DT05TT0xFXX0nLCBwbHVnaW5VVUlEICR7R3MoKS5wbHVnaW5VVUlEfSwgY29udGV4dCAke0pTT04uc3RyaW5naWZ5KEdzKCkpfSksIGV4Y2x1ZGluZyBmcm9tIGxheW91dCBwb3B1cGApO2xldCBUaT14YT9bXTpbImRlYnVnLWNvbnNvbGUiXSxpcj1BcnJheS5pc0FycmF5KG0/LltCLkRBU0hCT0FSRF9DT01QT05FTlRTXSk/bVtCLkRBU0hCT0FSRF9DT01QT05FTlRTXTpZbztyZXR1cm4oMCx5ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtb3V0ZXItY29udGFpbmVyIixzdHlsZTpVdCxjaGlsZHJlbjpbWnQ/KDAseWUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtYmFja2dyb3VuZC1mYWRlIixzdHlsZTpadH0pOm51bGwseD09PUV0LkxBWU9VVF9DT05GSUc/KDAseWUuanN4KShSbSx7Y3VycmVudExheW91dDppcixleGNsdWRlV2lkZ2V0SWRzOlRpLG9uU2F2ZTp1ZSxvbkNhbmNlbDooKT0+RShFdC5ERUZBVUxUKSxzZWxlY3RlZExheW91dFByb2ZpbGU6bT8uW0IuU0VMRUNURURfTEFZT1VUX1BST0ZJTEVdfHxudWxsfSk6bnVsbCx4PT09RXQuU0VUVElOR1NfQ09ORklHPyhrKCJbZGFzaGJvYXJkXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgYmdVcmw6IixtPy5bQi5CQUNLR1JPVU5EX0lNQUdFX1VSTF0pLCgwLHllLmpzeCkoVW0se2FwcDplLGNvbmZpZ1BhcmFtczptLG9uQ2FuY2VsOigpPT5FKEV0LkRFRkFVTFQpLG9uT3Blbk1lbW9yeU1lYXN1cmVtZW50Ok9vPygpPT5FKEV0Lk1FTU9SWV9NRUFTVVJFTUVOVCk6bnVsbCxvblNhdmU6cWUscGx1Z2luTm90ZVVVSUQ6Qyx0aW1lRm9ybWF0Ol8sd2Vla0Zvcm1hdDpNfSkpOm51bGwseD09PUV0Lk1FTU9SWV9NRUFTVVJFTUVOVD8oMCx5ZS5qc3gpKHRnLHtvbkNsb3NlOigpPT5FKEV0LlNFVFRJTkdTX0NPTkZJRykscmVuZGVyV2lkZ2V0Ok5pfSk6bnVsbCx4IT09RXQuTUVNT1JZX01FQVNVUkVNRU5UPygwLHllLmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6YGRhc2hib2FyZC1jb250ZW50JHtmZT8iIGRhc2hib2FyZC1jb250ZW50LS13aWRnZXQtZm9jdXNlZCI6IiJ9YCxjaGlsZHJlbjpbKDAseWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXRvb2xiYXIiLGNoaWxkcmVuOlsoMCx5ZS5qc3gpKFhoLHthY3RpdmVUYXNrRG9tYWluOm4sYXBwOmUsZG9tYWluczpzLG9uRG9tYWluQ2hhbmdlOnBlfSksKDAseWUuanN4cykoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXRvb2xiYXItYWN0aW9ucyIsY2hpbGRyZW46WygwLHllLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbmZpZ3VyZS1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+e2soIltkYXNoYm9hcmRdIG9wZW5pbmcgU2V0dGluZ3MgcG9wdXAiKSxFKEV0LlNFVFRJTkdTX0NPTkZJRyl9LHRpdGxlOiJDb25maWd1cmUgTExNIHByb3ZpZGVyIGFuZCBBUEkga2V5IGZvciBBSS1wb3dlcmVkIGZlYXR1cmVzIixjaGlsZHJlbjoiXHUyNjk5XHVGRTBGIFNldHRpbmdzIn0pLCgwLHllLmpzeCkoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbmZpZ3VyZS1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+RShFdC5MQVlPVVRfQ09ORklHKSx0aXRsZToiQ29uZmlndXJlIHdoaWNoIHdpZGdldHMgYXJlIHNob3duIGFuZCBpbiB3aGF0IG9yZGVyIixjaGlsZHJlbjoiXHUyNjMwIExheW91dCJ9KV19KV19KSwoMCx5ZS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtZ3JpZC1zaGVsbCR7ZmU/IiBkYXNoYm9hcmQtZ3JpZC1zaGVsbC0tZm9jdXNlZCI6IiJ9YCxjaGlsZHJlbjpbZmU/KDAseWUuanN4KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtZ3JpZC1mb2N1cy1iYWNrZHJvcCIsdHlwZToiYnV0dG9uIix0aXRsZToiUmV0dXJuIGFsbCB3aWRnZXRzIHRvIHRoZSBkYXNoYm9hcmQgZ3JpZCIsImFyaWEtbGFiZWwiOiJSZXR1cm4gYWxsIHdpZGdldHMgdG8gdGhlIGRhc2hib2FyZCBncmlkIixvbkNsaWNrOm90fSk6bnVsbCwoMCx5ZS5qc3gpKGNhLlByb3ZpZGVyLHt2YWx1ZTpRLGNoaWxkcmVuOigwLHllLmpzeCkoImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLWdyaWQke0hlPyIgZGFzaGJvYXJkLWdyaWQtLWRyYWdnaW5nIjoiIn0ke2ZlPyIgZGFzaGJvYXJkLWdyaWQtLWZvY3VzZWQiOiIifWAsY2hpbGRyZW46YmUubWFwKChzZSxaZSk9PntsZXQgVGU9c2U/LndpZGdldElkfHxZb1taZV0/LndpZGdldElkLGxuPVhjW1RlXTtpZighbG4pcmV0dXJuIG51bGw7bGV0IElvPW0/LltCLkxMTV9QUk9WSURFUl9NT0RFTF0sUm89Vm8oSW8pLEFuPVJvPyR0KFJvKTpudWxsLFFjPUFuJiZtPy5bQW5dfHwiIixaYz1Sb3x8SW98fG51bGwsZXU9aDEoc2UscnQpO3JldHVybigwLHllLmpzeCkobG4se2FnZW5kYVRhc2tzOnl0LGFwcDplLGNhbGVuZGFyRXZlbnRzOnAsY2FsZW5kYXJFdmVudHNMb2FkZWQ6Zixjb21wbGV0ZWRUYXNrc0J5RGF0ZTpkLGNvbmZpZzpldSxjdXJyZW50RGF0ZTp3LGRhaWx5VmFsdWVzOnksZHJhZ2dpbmdXaWRnZXRJZDpIZSxmb2N1c2VkV2lkZ2V0SWQ6a3QsZm9jdXNlZFdpZGdldFN1cmZhY2VTdHlsZTprdD09PVRlP2hlOm51bGwsbGF5b3V0Q29uZmlnOnNlLGxvYWRlZEV2ZW50UmVhZHk6a2EoVGUpLG1vb2RSYXRpbmdzOlQsb25EYXRlU2VsZWN0OkgsY3VycmVudExheW91dDppcixvbkxheW91dEFwcGx5OmtlLG9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlOlBlLG9uTW9vZFJlY29yZGVkOkplLG9uT3BlblNldHRpbmdzOmFyLG9uUmVmZXJlbmNlRGF0ZUNoYW5nZTpILG9uU3dhcEJhY2tncm91bmQ6YmEsb3BlblRhc2tzOmkscHJvdmlkZXJBcGlLZXk6UWMscHJvdmlkZXJFbTpaYyxxdWFydGVybHlQbGFuczpQLHJlZmVyZW5jZURhdGU6ZGUsc2VsZWN0ZWREYXRlOkksdGFza0RvbWFpbk5hbWU6bCx0YXNrRG9tYWluVVVJRDpuLHRpbWVGb3JtYXQ6Xyx3ZWVrRm9ybWF0Ok0sd2Vla2x5VG90YWw6RCx3aWRnZXRGb2N1c1RyYW5zZm9ybTpfdFtUZV18fG51bGx9LFRlKX0pLmZpbHRlcihCb29sZWFuKX0pfSldfSldfSk6bnVsbF19KX12YXIgc0U9TChYKCksMSk7QWsoKTtTaygpO3ZhciBoVT00MzAsZ1U9ImRhc2hib2FyZC1sYXJnZS1waG9uZS12aWV3cG9ydCI7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2xldCBuPU1hdGgubWluKHNjcmVlbi53aWR0aCxzY3JlZW4uaGVpZ2h0KSxvPXdpbmRvdy5tYXRjaE1lZGlhKCIob3JpZW50YXRpb246IGxhbmRzY2FwZSkiKS5tYXRjaGVzP01hdGgubWF4KHNjcmVlbi53aWR0aCxzY3JlZW4uaGVpZ2h0KTpuO2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGdVLG88PWhVKSxvPj13aW5kb3cuaW5uZXJXaWR0aCl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1heFdpZHRoPSIiLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1g9IiIsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWRhc2hib2FyZC12aWV3cG9ydC13aWR0aCIpLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1g9IiI7cmV0dXJufWxldCByPW8rInB4Ijtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9cixkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSJoaWRkZW4iLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1kYXNoYm9hcmQtdmlld3BvcnQtd2lkdGgiLHIpLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9cixkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIn10KCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdCl9KSgpO3ZhciBKYyxhZztfbj8oSmM9bG0oKSxhZz1KYy5pbml0KCkpOihKYz1uZXcgUHJveHkoe30se2dldChlLHQpe2lmKHR5cGVvZiB0IT0ic3ltYm9sIilyZXR1cm4oLi4ubik9PkRrKHQsd2luZG93LmNhbGxBbXBsZW5vdGVQbHVnaW4odCwuLi5uKSl9fSksYWc9d2luZG93LmNhbGxBbXBsZW5vdGVQbHVnaW4oImluaXQiKSk7KDAsaUUuY3JlYXRlUm9vdCkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhc2hib2FyZC1yb290IikpLnJlbmRlcigoMCxzRS5qc3gpKHJnLHthcHA6SmMsaW5pdFByb21pc2U6YWd9KSk7fSkoKTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCnJlYWN0L2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnNjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnJlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCnJlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzCiAgICoKICAgKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKKi8K";
 
// css-content:css-content
var compiledCSS = `.rich-footnote-wrap{display:inline}.rich-footnote-indicator{cursor:default;display:inline-block;font-size:.65em;margin-left:2px;opacity:.65;vertical-align:super}.rich-footnote-indicator:hover{opacity:1}.tippy-box[data-theme~=rich-footnote]{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;box-shadow:0 4px 16px var(--dashboard-color-overlay-shadow);color:var(--dashboard-color-text);font-size:.85rem;line-height:1.5;max-width:420px;min-width:200px}.tippy-box[data-theme~=rich-footnote]>.tippy-arrow{color:var(--dashboard-color-bg-card)}.tippy-box[data-theme~=rich-footnote]>.tippy-content{padding:12px}.rich-footnote-popup{display:flex;flex-direction:column;gap:8px}.rich-footnote-popup-url{align-items:center;display:flex;gap:4px}.rich-footnote-popup-url svg{color:var(--dashboard-color-accent);flex-shrink:0}.rich-footnote-popup-url a{color:var(--dashboard-color-link);overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rich-footnote-popup-url a:hover{text-decoration:underline}.rich-footnote-popup-text{color:var(--dashboard-color-text)}.rich-footnote-popup-media{border-radius:6px;overflow:hidden}.rich-footnote-popup-media img,.rich-footnote-popup-media video,.rich-footnote-popup-media iframe{display:block;max-width:100%;width:100%}.rich-footnote-popup-media iframe{aspect-ratio:16/9;border:0}.rich-footnote-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;justify-content:flex-end;padding-top:8px}.rich-footnote-popup-close{background:none;border:none;color:var(--dashboard-color-accent);cursor:pointer;font-size:.8rem;font-weight:600;letter-spacing:.5px;padding:4px 8px}.rich-footnote-popup-close:hover{opacity:.8}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{border-radius:6px;font-size:.75rem;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-content{padding:8px 12px;position:relative;z-index:1}.tippy-arrow{color:var(--dashboard-color-tooltip-bg);height:16px;width:16px}.tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-theme~=dashboard]{background:var(--dashboard-color-tooltip-bg);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);max-width:260px;min-width:180px}.tippy-box[data-theme~=dashboard]>.tippy-arrow{color:var(--dashboard-color-tooltip-bg)}.tippy-box[data-theme~=dashboard].below-chart>.tippy-content{max-height:40vh;overflow-y:auto}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label p{display:inline;margin:0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-date{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-entry{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 6px;padding:2px 0}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-time{color:var(--dashboard-color-tooltip-text-muted);font-size:.7rem;min-width:52px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-mood .mood-viz-label{color:var(--dashboard-color-tooltip-text-muted)}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-note{color:var(--dashboard-color-tooltip-text);flex-basis:100%;font-size:.7rem;font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-word}.widget .widget-body{overflow-y:auto}.widget .widget-heading-bar,.widget .widget-title{align-items:center;display:flex}.widget .widget-title__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget .widget-header-action{text-decoration:none;white-space:nowrap}.widget .widget-header-action:hover{text-decoration:underline}.widget-planning .planning-quarters{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1 1 140px;flex-direction:column;gap:4px;min-width:0;padding:12px 16px;transition:background .15s,border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card--has-plan{background:var(--dashboard-color-plan-created-bg);border-color:var(--dashboard-color-plan-created-border);border-style:solid}.widget-planning .quarter-card--has-plan:hover{border-color:var(--dashboard-color-plan-created-border);filter:brightness(.97)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .quarter-card .quarter-plan-indicator{cursor:default;flex-shrink:0;font-size:.85rem;line-height:1}.widget-planning .month-tabs{display:flex;flex-wrap:wrap;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .month-content-area{border:1px solid var(--dashboard-color-border);border-radius:6px;margin-top:12px;overflow:hidden;padding:12px 16px}.widget-planning .month-content-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .month-content-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .month-content-text{color:var(--dashboard-color-text);font-size:13px;line-height:1.4}.widget-planning .month-content-text p{margin:0 0 4px}.widget-planning .month-content-text ol,.widget-planning .month-content-text ul{margin:0 0 4px;padding-left:16px}.widget-planning .month-content-text li{margin:0;padding:0}.widget-planning .month-content-text strong{color:var(--dashboard-color-navy)}.widget-planning .month-content-text>:last-child{margin-bottom:0}.widget-planning .month-content-empty{text-align:center}.widget-planning .create-month-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s}.widget-planning .create-month-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .planning-empty{color:var(--dashboard-color-text-muted);font-size:.85rem;font-style:italic;padding:16px 0;text-align:center}.widget-planning .weekly-plan-section{border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:12px}.widget-planning .weekly-plan-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .weekly-plan-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .create-week-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s;width:100%}.widget-planning .create-week-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .note-editor{display:flex;flex-direction:column;gap:8px;height:100%}.widget-planning .note-editor-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px}.widget-planning .note-editor-toolbar{display:flex;gap:8px}.widget-planning .note-editor-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;padding:4px 12px;transition:background .15s}.widget-planning .note-editor-btn:hover{background:var(--dashboard-color-blue-light)}.widget-planning .note-editor-btn--save{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .note-editor-btn--save:hover{filter:brightness(.92)}.widget-planning .note-editor-btn--save:disabled{cursor:default;opacity:.6}.widget-planning .note-editor-textarea{border:1px solid var(--dashboard-color-border);border-radius:6px;flex:1;line-height:1.5;min-height:180px;padding:12px;resize:vertical}.widget-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-agenda .agenda-list{display:flex;flex:1;flex-direction:column;gap:12px;min-height:0;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:13px;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:#0000;border:0;color:var(--dashboard-color-link);cursor:pointer;font-size:12px;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-calendar.vertical-2-cell .cal-arrow{font-size:.9rem}.widget-calendar.vertical-2-cell .cal-month{font-size:1.1rem}.widget-calendar.vertical-2-cell .cal-header{font-size:.85rem}.widget-calendar.vertical-2-cell .cal-cell{padding-top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-day{font-size:16px;top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-dot{bottom:18%;height:6px;width:6px}.widget-calendar.horizontal-2-cell.vertical-1-cell .widget-body{display:flex;flex-direction:column;padding:8px 16px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-nav{margin-bottom:8px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-grid{flex:1}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-header{padding:2px 0}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-cell{aspect-ratio:auto;border-radius:12px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}@media (max-width: 430px){.widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}}.dashboard-large-phone-viewport .widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.dashboard-large-phone-viewport .widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}.dashboard-layout-popup{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,var(--dashboard-viewport-width, 100vw) - 32px);min-width:0;width:100%}.dashboard-layout-popup .dashboard-layout-popup-tabs{display:flex;gap:4px;margin-top:12px}.dashboard-layout-popup .dashboard-layout-popup-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease}.dashboard-layout-popup .dashboard-layout-popup-tab:hover{background:var(--dashboard-color-blue-light)}.dashboard-layout-popup .dashboard-layout-popup-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.dashboard-layout-popup .dashboard-layout-popup-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-layout-popup .dashboard-layout-popup-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-layout-popup .dashboard-layout-popup-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-layout-popup .dashboard-layout-popup-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-layout-popup .dashboard-layout-popup-list{display:flex;flex-direction:column;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;-webkit-user-select:none;user-select:none}.dashboard-layout-popup .dashboard-layout-popup-item:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item--dragging{opacity:.35}.dashboard-layout-popup .dashboard-layout-popup-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-handle:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-layout-popup .dashboard-layout-popup-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-layout-popup .dashboard-layout-popup-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-layout-popup .dashboard-layout-popup-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-layout-popup .dashboard-layout-popup-sizing{display:flex;flex-direction:column;gap:8px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;align-items:center;gap:12px;padding:8px 12px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-header{align-items:center;display:flex;gap:8px;flex:1;min-width:0}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-controls{display:flex;flex-shrink:0;gap:16px}.dashboard-layout-popup .dashboard-layout-popup-profile-select{margin-left:8px;padding:3px 6px}.dashboard-layout-popup .dashboard-layout-popup-sizing-field{align-items:center;display:flex;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-sizing-label{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-sizing-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:4px 8px}.dashboard-layout-popup .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-layout-popup .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:stretch;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0;padding:5px 8px}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:13px;font-weight:500;padding:4px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);bottom:0;display:flex;justify-content:center;left:0;position:fixed;top:0;width:var(--dashboard-viewport-width, 100vw);z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:90%;min-width:320px;width:650px}.config-popup-container .explanation-paragraph{font-size:14px;margin:12px 0 20px}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field .config-line{margin-bottom:10px;margin-top:10px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:#0000;color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column}.dashboard-settings-container .dashboard-settings-section.section:not(:first-child){border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:16px}.dashboard-settings-container .dashboard-settings-section-header{display:flex;flex-direction:column;gap:4px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{-webkit-appearance:none;appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:#00000008;border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-hint{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0 0 4px}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-link);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-settings-container .dashboard-settings-debug-button{align-self:flex-start;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;margin-top:12px;padding:8px 12px}.dashboard-settings-container .dashboard-settings-debug-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-day-sketch .widget-body{display:flex;flex-direction:column;overflow:hidden;padding:0}.widget-day-sketch .day-sketch-notebook{background-color:#fffef5;background-image:repeating-linear-gradient(transparent,transparent 33px,#b8d4e8 33px,#b8d4e8 34px);background-attachment:local;background-position:0 0;background-size:100% 34px;border-left:3px solid #e88e8e;flex:1;margin-left:0;min-height:0;overflow-y:auto;padding:0 8px 0 0}.widget-day-sketch .day-sketch-line{align-items:center;display:flex;height:34px;padding-left:4px;position:relative}.widget-day-sketch .day-sketch-hour-label{color:#a0a0a0;flex-shrink:0;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.78rem;font-weight:700;letter-spacing:.02em;text-align:right;text-transform:lowercase;-webkit-user-select:none;user-select:none;width:64px;padding-right:8px}.widget-day-sketch .day-sketch-input{background:#0000;border:none;color:#333;flex:1;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.88rem;height:100%;line-height:34px;outline:none;padding:0 4px}.widget-day-sketch .day-sketch-input::placeholder{color:#0000}.widget-day-sketch .day-sketch-input:focus{background:#b8d4e81f}.widget-day-sketch .day-sketch-loading{align-items:center;color:var(--dashboard-color-text-muted);display:flex;font-size:.85rem;height:100%;justify-content:center;padding:24px}.widget-day-sketch .day-sketch-save-btn{background:none;border:1px solid var(--dashboard-color-blue);border-radius:6px;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;font-weight:600;padding:2px 8px;transition:background .15s ease,color .15s ease}.widget-day-sketch .day-sketch-save-btn:hover:not(:disabled){background:var(--dashboard-color-blue);color:var(--dashboard-color-text-on-accent)}.widget-day-sketch .day-sketch-save-btn--disabled{border-color:var(--dashboard-color-text-muted);color:var(--dashboard-color-text-muted);cursor:default;opacity:.5}@media (prefers-color-scheme: dark){.widget-day-sketch .day-sketch-notebook{background-color:#2a2923;background-image:repeating-linear-gradient(transparent,transparent 33px,#4a5568 33px,#4a5568 34px);border-left-color:#7c4444}.widget-day-sketch .day-sketch-hour-label{color:#6b7280}.widget-day-sketch .day-sketch-input{color:#e2e0d8}.widget-day-sketch .day-sketch-input:focus{background:#4a556826}}.widget-debug-console .widget-body{max-height:2000px;overflow-y:auto;padding:0}.widget-debug-console .debug-console{font-family:Courier New,Courier,monospace;font-size:11px;height:100%;max-height:100%;overflow-y:auto;padding:6px 8px}.widget-debug-console .debug-console__empty{color:var(--color-text-muted, #888);font-family:inherit;font-size:12px;padding:12px 4px}.widget-debug-console .debug-console__entry{align-items:baseline;border-bottom:1px solid var(--color-border, rgba(0, 0, 0, .06));display:flex;gap:8px;line-height:1.4;padding:2px 0}.widget-debug-console .debug-console__entry:last-child{border-bottom:none}.widget-debug-console .debug-console__timestamp{color:var(--color-text-secondary, #888);flex-shrink:0;font-size:10px;opacity:.75;-webkit-user-select:none;user-select:none}.widget-debug-console .debug-console__message{color:var(--color-text, #222);overflow-wrap:break-word;word-break:break-all}.widget-debug-console .debug-console__clear-button{background:none;border:1px solid var(--color-border, rgba(0, 0, 0, .2));border-radius:3px;color:var(--color-text-muted, #888);cursor:pointer;font-size:11px;line-height:1;padding:2px 6px}.widget-debug-console .debug-console__clear-button:hover{background:var(--color-hover, rgba(0, 0, 0, .06));color:var(--color-text, #222)}.config-popup-container .config-popup-body .llm-provider-options{display:flex;flex-direction:column;gap:4px}.config-popup-container .config-popup-body .llm-provider-option{align-items:flex-start;gap:8px;padding:8px 4px}.config-popup-container .config-popup-body .llm-provider-option input[type=radio]{margin-top:3px}.config-popup-container .config-popup-body .llm-provider-option-text{display:flex;flex-direction:column;gap:2px}.config-popup-container .config-popup-body .llm-provider-option-name{color:var(--dashboard-color-text);font-weight:700}.config-popup-container .config-popup-body .llm-provider-option-desc{color:var(--dashboard-color-text-secondary);font-size:.78rem;line-height:1.35}.dashboard-outer-container .no-config-upsell{align-items:center;display:flex;flex-direction:column;gap:8px;padding:4px 12px 12px;text-align:center}.dashboard-outer-container .no-config-upsell-badges{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.dashboard-outer-container .no-config-upsell-badge{border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.04em;padding:4px 12px;text-transform:uppercase;white-space:nowrap}.dashboard-outer-container .no-config-upsell-badge--brand{background:#4a9eff1f;color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-badge--price{border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);text-transform:none}.dashboard-outer-container .no-config-upsell-headline{color:var(--dashboard-color-navy);font-size:1.05rem;font-weight:700;line-height:1.25;margin:4px 0 0}.dashboard-outer-container .no-config-upsell-subhead{color:var(--dashboard-color-text-secondary);font-size:.85rem;line-height:1.45;margin:0;max-width:26rem}.dashboard-outer-container .no-config-upsell-features{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));justify-content:center;width:100%}@media (max-width: 430px){.dashboard-outer-container .no-config-upsell-features{grid-template-columns:minmax(0,1fr)}}.dashboard-large-phone-viewport .dashboard-outer-container .no-config-upsell-features{grid-template-columns:minmax(0,1fr)}.dashboard-outer-container .no-config-upsell-feature{align-items:center;border:1px solid var(--dashboard-color-border);border-radius:999px;color:var(--dashboard-color-navy);display:flex;font-size:.8rem;font-weight:600;gap:4px;justify-content:center;padding:4px 12px}.dashboard-outer-container .no-config-upsell-feature-icon{font-size:.85rem;line-height:1}.dashboard-outer-container .no-config-upsell-more{color:var(--dashboard-color-text-muted);font-size:.8rem;margin:0}.dashboard-outer-container .no-config-upsell-actions{align-items:stretch;border-top:1px solid var(--dashboard-color-border);display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:4px;padding-top:12px;width:100%}.dashboard-outer-container .no-config-upsell-button{align-items:center;border:1px solid var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-navy);display:inline-flex;font-size:.85rem;font-weight:600;gap:4px;justify-content:center;line-height:1.2;padding:8px 16px;text-decoration:none;transition:border-color .15s ease,background .15s ease,color .15s ease}.dashboard-outer-container .no-config-upsell-button--primary:hover{background:#4a9eff1f;border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-button--secondary:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.dashboard-outer-container .no-config-upsell-footnote{color:var(--dashboard-color-success);font-size:.78rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-header-actions{align-items:center;display:flex;gap:8px}.dashboard-outer-container .widget-dream-task .dream-task-list{display:flex;flex-direction:column;gap:12px}.dashboard-outer-container .widget-dream-task .dream-task-llm-attribution{color:var(--dashboard-color-text-secondary);font-size:.7rem;line-height:1.4;padding-top:8px}.dashboard-outer-container .widget-dream-task .widget-title{align-items:center;display:flex}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}.dashboard-outer-container .widget-dream-task .dream-task-goals-summary{border-bottom:1px solid var(--dashboard-color-border);margin-bottom:8px;padding-bottom:12px}.dashboard-outer-container .widget-dream-task .dream-task-goals-text{color:var(--dashboard-color-text-secondary);font-size:.8rem;font-style:italic;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-card{border:1px solid var(--dashboard-color-border);border-radius:10px;opacity:1;padding:12px 16px;transition:border-color .15s ease,opacity .28s ease,transform .28s ease}.dashboard-outer-container .widget-dream-task .dream-task-card:hover{border-color:var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-card--dismissing{opacity:0;pointer-events:none;transform:translateY(6px) scale(.98)}.dashboard-outer-container .widget-dream-task .dream-task-card-header{align-items:flex-start;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-title{color:var(--dashboard-color-navy);font-size:14px;font-weight:500;line-height:1.3}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable{cursor:pointer}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable:hover{color:var(--dashboard-color-blue);text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-rating{border-radius:6px;flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-rating--high{background:#22c55e1f;color:var(--dashboard-color-success)}.dashboard-outer-container .widget-dream-task .dream-task-rating--medium{background:#eab3081f;color:var(--dashboard-color-warning)}.dashboard-outer-container .widget-dream-task .dream-task-rating--low{background:#ef44441f;color:var(--dashboard-color-danger)}.dashboard-outer-container .widget-dream-task .dream-task-card--invented{border-left:2px solid var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-new-badge{background:#4a9eff1f;border-radius:6px;color:var(--dashboard-color-blue);flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge{background:#7c3aed1a;border-radius:6px;color:var(--dashboard-color-navy);flex-shrink:0;font-size:11px;font-weight:600;max-width:11rem;overflow:hidden;padding:2px 4px;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{font-size:11px;font-weight:700;padding:2px 4px;text-transform:uppercase;white-space:nowrap}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation{color:var(--dashboard-color-text-secondary);cursor:pointer;display:-webkit-box;font-size:12px;line-height:1.5;margin:0;overflow:hidden;text-overflow:ellipsis;line-clamp:3;-webkit-box-orient:vertical;-webkit-line-clamp:3}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation--expanded{display:block;overflow:visible;text-overflow:clip;line-clamp:initial;-webkit-box-orient:initial;-webkit-line-clamp:initial}.dashboard-outer-container .widget-dream-task .dream-task-card-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-action{color:var(--dashboard-color-link);cursor:pointer;font-size:.75rem;font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-card-action:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-settings-link{color:var(--dashboard-color-link);font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-settings-link:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-loading{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-loading p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:24px;width:24px}.dashboard-outer-container .widget-dream-task .dream-task-error{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-error p{color:var(--dashboard-color-danger);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-empty{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.widget-energy-per-habit .habit-header{margin-bottom:16px}.widget-energy-per-habit .habit-eyebrow{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase}.widget-energy-per-habit .habit-title{color:var(--dashboard-color-text);font-size:1.6rem;font-weight:600;line-height:1.15;margin-top:4px}.widget-energy-per-habit .habit-chart{position:relative}.widget-energy-per-habit .habit-zero-line{border-left:1px solid var(--dashboard-color-border);bottom:0;left:calc(46% + (54% - 3.6rem)/2);position:absolute;top:18px}.widget-energy-per-habit .habit-zero-label{color:var(--dashboard-color-text-muted);font-size:.65rem;left:-3px;position:absolute;top:-14px}.widget-energy-per-habit .habit-rows{display:flex;flex-direction:column;gap:14px}.widget-energy-per-habit .habit-row{align-items:center;display:grid;grid-template-columns:46% 1fr 1fr 3.6rem;gap:0}.widget-energy-per-habit .habit-row-lead{align-items:center;display:flex;gap:8px;min-width:0;padding-right:12px}.widget-energy-per-habit .habit-row-icon{flex:0 0 auto;font-size:1rem;opacity:.85;width:20px}.widget-energy-per-habit .habit-row-text{min-width:0}.widget-energy-per-habit .habit-row-label{color:var(--dashboard-color-text);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-energy-per-habit .habit-row-label--link{cursor:pointer}.widget-energy-per-habit .habit-row-label--link:hover,.widget-energy-per-habit .habit-row-label--link:focus-visible{color:var(--dashboard-color-accent);text-decoration:underline}.widget-energy-per-habit .habit-row-meta{color:var(--dashboard-color-text-muted);font-size:12px;margin-top:1px}.widget-energy-per-habit .streak-label{align-items:center;display:flex;gap:4px}.widget-energy-per-habit .streak-label:before{background-color:#8a8f98;border-radius:3px;content:"";flex:0 0 auto;height:11px;width:11px}.widget-energy-per-habit .streak-label.streak-week:before{background-color:#8a8f98}.widget-energy-per-habit .streak-label.streak-alive:before{background-color:#5b7bbf}.widget-energy-per-habit .streak-label.streak-month:before{background-color:#e2c541}.widget-energy-per-habit .streak-label.streak-quarter:before{background-color:#e08a2f}.widget-energy-per-habit .streak-label.streak-half-year:before{background-color:#cf3b2e}.widget-energy-per-habit .habit-row-track{display:contents}.widget-energy-per-habit .habit-row-axis{display:none}.widget-energy-per-habit .habit-row-bar-half{align-items:center;display:flex;height:18px}.widget-energy-per-habit .habit-row-bar-half--negative{justify-content:flex-end;border-right:1px solid var(--dashboard-color-border);padding-right:1px}.widget-energy-per-habit .habit-row-bar-half--positive{justify-content:flex-start;padding-left:1px}.widget-energy-per-habit .habit-row-bar{border-radius:3px;height:100%}.widget-energy-per-habit .habit-row-bar--positive{background:#a4b431}.widget-energy-per-habit .habit-row-bar--negative{background:#b0468a}.widget-energy-per-habit .habit-row-value{font-size:.95rem;font-variant-numeric:tabular-nums;font-weight:600;padding-left:12px;text-align:right;white-space:nowrap}.widget-energy-per-habit .habit-row-value--positive{color:#a4b431}.widget-energy-per-habit .habit-row-value--negative{color:#b0468a}.widget-energy-per-habit .habit-footnote{background:var(--dashboard-color-bg-page);border-radius:10px;color:var(--dashboard-color-text-secondary);font-size:.78rem;line-height:1.5;margin-top:16px;padding:12px 16px}.widget-energy-per-habit .habit-footnote strong{color:var(--dashboard-color-text)}.widget-energy-per-habit .habit-empty{color:var(--dashboard-color-text-secondary);padding:24px 12px;text-align:center}.widget-energy-per-habit .habit-empty-hint{color:var(--dashboard-color-text-muted);font-size:.82rem;margin-top:8px}.widget-graveyard .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-graveyard.horizontal-1-cell .widget-title__subtitle{display:none}.widget-graveyard .graveyard-meadow-wrapper{flex:1;min-height:0;overflow:hidden;position:relative}.widget-graveyard .graveyard-meadow-bg{border-radius:6px;height:100%;inset:0;object-fit:cover;position:absolute;transition:opacity .6s ease;width:100%}.widget-graveyard .graveyard-task-list{display:flex;flex-direction:column;gap:4px;list-style:none;max-height:100%;overflow-y:auto;padding:0;position:relative;z-index:1}.widget-graveyard .graveyard-task-item{background:var(--dashboard-color-bg-card);border-bottom:1px solid var(--dashboard-color-border);display:flex;flex-direction:column;gap:4px;padding:8px 12px}.widget-graveyard .graveyard-task-item:last-child{border-bottom:none}.widget-graveyard .graveyard-task-item--dismissing{pointer-events:none;visibility:hidden}.widget-graveyard .graveyard-task-header{align-items:baseline;display:flex;gap:8px;justify-content:space-between}.widget-graveyard .graveyard-task-title-wrap{flex:1;min-width:0}.widget-graveyard .graveyard-task-title{color:var(--dashboard-color-text);display:block;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-title:focus{outline:1px solid var(--dashboard-color-link);outline-offset:2px}.widget-graveyard .graveyard-task-title-wrap:hover .graveyard-task-title,.widget-graveyard .graveyard-task-title-wrap:focus-within .graveyard-task-title{text-decoration:underline dotted}.widget-graveyard .graveyard-task-tooltip{display:flex;flex-direction:column;gap:8px;max-height:280px;overflow-y:auto;padding:12px}.widget-graveyard .graveyard-task-tooltip-meta{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 12px;justify-content:space-between}.widget-graveyard .graveyard-task-tooltip-note{color:var(--dashboard-color-tooltip-accent);font-size:.76rem;font-weight:600}.widget-graveyard .graveyard-task-tooltip-created{color:var(--dashboard-color-tooltip-text-muted);font-size:.72rem}.widget-graveyard .graveyard-task-tooltip-content{color:var(--dashboard-color-tooltip-text);font-size:.78rem;line-height:1.4}.widget-graveyard .graveyard-task-tooltip-content code{background:#ffffff14;border-radius:4px;padding:1px 4px}.widget-graveyard .graveyard-task-tooltip-footer{border-top:1px solid var(--dashboard-color-tooltip-border);padding-top:8px}.widget-graveyard .graveyard-task-score--muted{color:var(--dashboard-color-tooltip-text-muted)}.widget-graveyard .graveyard-task-score--cool{color:var(--dashboard-color-blue-light)}.widget-graveyard .graveyard-task-score--warm{color:var(--dashboard-color-warning)}.widget-graveyard .graveyard-task-score--hot{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-score-dot{background:currentColor;border-radius:999px;display:inline-block;height:9px;width:9px}.widget-graveyard .graveyard-task-age{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-graveyard .graveyard-task-actions{display:flex;gap:12px}.widget-graveyard .graveyard-task-actions>a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-action{color:var(--dashboard-color-text-secondary);font-size:.75rem;text-decoration:none}.widget-graveyard .graveyard-task-action:hover{text-decoration:underline}.widget-graveyard .graveyard-task-action--send:hover{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-action--keep:hover{color:var(--dashboard-color-link)}.widget-graveyard .graveyard-task-action--note:hover{color:var(--dashboard-color-blue)}.widget-graveyard.vertical-1-cell .graveyard-task-tooltip{max-height:220px}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-header{align-items:flex-start}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-age{font-size:.7rem}.widget-graveyard .graveyard-loading,.widget-graveyard .graveyard-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-graveyard .graveyard-error{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 0}.widget-graveyard .graveyard-error p{color:var(--dashboard-color-danger);font-size:.85rem;text-align:center}.widget-graveyard .graveyard-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 8px}.widget-graveyard .graveyard-retry:hover{border-color:var(--dashboard-color-border);color:var(--dashboard-color-text)}.widget-layout-picker .layout-picker-warning{background:color-mix(in srgb,var(--dashboard-color-warning) 15%,transparent);border:1px solid color-mix(in srgb,var(--dashboard-color-warning) 40%,transparent);border-radius:6px;color:var(--dashboard-color-text);font-size:.8rem;font-weight:600;margin-bottom:12px;padding:8px 12px}.widget-layout-picker .layout-picker-profiles{display:flex;flex-direction:column;gap:8px}.widget-layout-picker .layout-picker-profile-button{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-text);cursor:pointer;padding:12px;text-align:left;transition:background .15s ease,border-color .15s ease;width:100%}.widget-layout-picker .layout-picker-profile-button:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button:disabled{cursor:not-allowed;opacity:.6}.widget-layout-picker .layout-picker-profile-button--applying{border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button--current{border-color:color-mix(in srgb,var(--dashboard-color-accent) 50%,transparent)}.widget-layout-picker .layout-picker-profile-header{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 8px;margin-bottom:8px}.widget-layout-picker .layout-picker-profile-icon{flex-shrink:0;font-size:1.1rem;line-height:1}.widget-layout-picker .layout-picker-profile-name{flex:1;font-size:.95rem;font-weight:700;min-width:0}.widget-layout-picker .layout-picker-profile-action{color:var(--dashboard-color-accent);font-size:.72rem;font-weight:600}.widget-layout-picker .layout-picker-profile-action--current{color:var(--dashboard-color-text-muted)}.widget-layout-picker .layout-picker-profile-description{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0}@keyframes mood-fadeout{0%{opacity:1}to{opacity:0}}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn--selected{border-color:var(--dashboard-color-blue);background:var(--dashboard-color-blue-light);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-details{margin-bottom:12px}.widget-mood .mood-details-label{color:var(--dashboard-color-text-secondary);display:block;font-size:.8rem;margin-bottom:4px}.widget-mood .mood-details-textarea{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-size:.85rem;padding:8px;resize:vertical;width:100%}.widget-mood .mood-details-textarea:focus{border-color:var(--dashboard-color-blue);outline:none}.widget-mood .mood-details-textarea::placeholder{color:var(--dashboard-color-text-muted)}.widget-mood .mood-submit-row{display:flex;gap:8px;margin-bottom:16px}.widget-mood .mood-submit-btn{background:var(--dashboard-color-blue);border:none;border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;flex:1;font-size:.85rem;font-weight:600;padding:8px 16px;transition:opacity .15s}.widget-mood .mood-submit-btn:hover:not(:disabled){opacity:.9}.widget-mood .mood-submit-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-cancel-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.85rem;font-weight:600;padding:8px 16px;transition:border-color .15s,color .15s}.widget-mood .mood-cancel-btn:hover:not(:disabled){border-color:var(--dashboard-color-text-secondary);color:var(--dashboard-color-text)}.widget-mood .mood-cancel-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-confirmation{align-items:center;animation:mood-fadeout 1s ease-out 4s forwards;display:flex;flex-direction:column;gap:8px;margin-bottom:16px;padding:16px 0}.widget-mood .mood-confirmation-icon{font-size:2.5rem}.widget-mood .mood-confirmation-text{color:var(--dashboard-color-success);font-size:.9rem;font-weight:600}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-mood .mood-viz-section{align-items:center;display:flex;flex-direction:column;gap:4px;margin-top:8px}.widget-mood .mood-viz-canvas-wrap{border-radius:10px;line-height:0;overflow:visible;position:relative}.widget-mood .mood-viz-canvas{border-radius:10px;display:block;height:220px;width:220px}.widget-mood .mood-viz-configure-link{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:color .15s}.widget-mood .mood-viz-configure-link:hover{color:var(--dashboard-color-text-secondary)}.widget-mood .mood-viz-config-option{align-items:center;cursor:pointer;display:flex;font-size:.9rem;gap:8px;padding:4px 0}.widget-mood .mood-viz-config-option input[type=radio]{accent-color:var(--dashboard-color-blue);cursor:pointer}.widget-note-peek .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-note-peek.horizontal-1-cell .widget-title__subtitle{display:none}@media (max-width: 800px){.widget-note-peek.vertical-1-cell{max-height:420px;min-height:320px}.widget-note-peek.vertical-2-cell{max-height:800px;min-height:600px}}.dashboard-large-phone-viewport .widget-note-peek.vertical-1-cell{max-height:420px;min-height:320px}.dashboard-large-phone-viewport .widget-note-peek.vertical-2-cell{max-height:800px;min-height:600px}.widget-note-peek.widget .widget-configure{font-size:14px}.widget-note-peek .note-peek-chooser{align-items:center;background:none;border:1px dashed var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:flex;flex:1;flex-direction:column;gap:8px;justify-content:center;padding:16px;transition:border-color .15s ease,color .15s ease;width:100%}.widget-note-peek .note-peek-chooser:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}.widget-note-peek .note-peek-chooser-button{background:var(--dashboard-color-accent);border:1px solid var(--dashboard-color-accent);border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;font-size:14px;font-weight:600;padding:4px 12px}.widget-note-peek .note-peek-chooser-button:hover{opacity:.9}.widget-note-peek .note-peek-chooser-icon{font-size:1.6rem}.widget-note-peek .note-peek-chooser-label{font-size:.85rem;text-align:center}.widget-note-peek .note-peek-title-link{color:inherit;cursor:pointer;text-decoration:none}.widget-note-peek .note-peek-title-link:hover{color:var(--dashboard-color-link);text-decoration:underline}.note-peek-content{color:var(--dashboard-color-text);flex:1;font-size:13px;line-height:1.45;min-height:0;overflow:hidden}.note-peek-content .heading-anchor,.note-peek-content .link>.icon{display:none}.note-peek-content h1,.note-peek-content h2,.note-peek-content h3,.note-peek-content h4,.note-peek-content h5,.note-peek-content h6,.note-peek-content .heading{color:var(--dashboard-color-navy);line-height:1.25;margin:0 0 4px;position:relative}.note-peek-content h1,.note-peek-content h1.heading{font-size:1.25rem}.note-peek-content h2,.note-peek-content h2.heading{font-size:1.1rem}.note-peek-content h3,.note-peek-content h3.heading{font-size:1rem}.note-peek-content h4,.note-peek-content h5,.note-peek-content h6{font-size:.9rem}.note-peek-content .heading>a:not(.link):not(.heading-anchor){color:inherit;text-decoration:none}.note-peek-content p,.note-peek-content blockquote,.note-peek-content pre,.note-peek-content table{margin:0 0 8px}.note-peek-content ol,.note-peek-content ul{margin:0 0 8px;padding-left:16px}.note-peek-content li{margin:0;padding:0}.note-peek-content a{color:var(--dashboard-color-link)}.note-peek-content strong{color:var(--dashboard-color-navy)}.note-peek-content blockquote{border-left:3px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);padding-left:8px}.note-peek-content code,.note-peek-content pre{background:var(--dashboard-color-bg-page);border-radius:6px;font-size:12px}.note-peek-content code{padding:1px 4px}.note-peek-content pre{overflow:hidden;padding:8px;white-space:pre}.note-peek-content img{max-width:100%}.note-peek-content table{border-collapse:collapse;max-width:100%}.note-peek-content table td,.note-peek-content table th{border:1px solid var(--dashboard-color-border);padding:4px 8px;text-align:left}.note-peek-content hr{border:none;border-top:1px solid var(--dashboard-color-border);margin:8px 0}.note-peek-content .bullet-list-item,.note-peek-content .number-list-item{margin:0 0 4px;position:relative}.note-peek-content .bullet-list-item.indent-0,.note-peek-content .number-list-item.indent-0{padding-left:21px}.note-peek-content .bullet-list-item.indent-1,.note-peek-content .number-list-item.indent-1{padding-left:37px}.note-peek-content .bullet-list-item.indent-2,.note-peek-content .number-list-item.indent-2{padding-left:53px}.note-peek-content .bullet-list-item.indent-3,.note-peek-content .number-list-item.indent-3{padding-left:69px}.note-peek-content .bullet-list-item.indent-4,.note-peek-content .number-list-item.indent-4{padding-left:85px}.note-peek-content .bullet-list-item.indent-5,.note-peek-content .number-list-item.indent-5{padding-left:101px}.note-peek-content .bullet-list-item.indent-6,.note-peek-content .number-list-item.indent-6{padding-left:117px}.note-peek-content .bullet-list-item.indent-7,.note-peek-content .number-list-item.indent-7{padding-left:133px}.note-peek-content .bullet-list-item.indent-8,.note-peek-content .number-list-item.indent-8{padding-left:149px}.note-peek-content .bullet-list-item.indent-9,.note-peek-content .number-list-item.indent-9{padding-left:165px}.note-peek-content .bullet-list-item .visible-list-item,.note-peek-content .number-list-item .visible-list-item{display:block;position:relative}.note-peek-content .bullet-list-item .visible-list-item p,.note-peek-content .number-list-item .visible-list-item p{margin:0}.note-peek-content .bullet-list-item .visible-list-item:before,.note-peek-content .number-list-item .visible-list-item:before{left:-21px;position:absolute;text-align:center;width:21px}.note-peek-content .bullet-list-item.indent-0 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-2 .visible-list-item:before{content:"\\2022";font-size:1.35em;line-height:1;top:-.15em}.note-peek-content .bullet-list-item.indent-1 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-3 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-4 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-5 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-6 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-7 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-8 .visible-list-item:before,.note-peek-content .bullet-list-item.indent-9 .visible-list-item:before{content:"\\26ac";font-size:.9em;line-height:1;top:.1em}.note-peek-content .bullet-list-item[data-crossed-out-at] .visible-list-item{opacity:.55;text-decoration:line-through}.note-peek-content .number-list-item.indent-0 .visible-list-item{counter-increment:number-list-items-0}.note-peek-content .number-list-item.indent-1 .visible-list-item{counter-increment:number-list-items-1}.note-peek-content .number-list-item.indent-2 .visible-list-item{counter-increment:number-list-items-2}.note-peek-content .number-list-item.indent-3 .visible-list-item{counter-increment:number-list-items-3}.note-peek-content .number-list-item.indent-4 .visible-list-item{counter-increment:number-list-items-4}.note-peek-content .number-list-item.indent-5 .visible-list-item{counter-increment:number-list-items-5}.note-peek-content .number-list-item.indent-6 .visible-list-item{counter-increment:number-list-items-6}.note-peek-content .number-list-item.indent-7 .visible-list-item{counter-increment:number-list-items-7}.note-peek-content .number-list-item.indent-8 .visible-list-item{counter-increment:number-list-items-8}.note-peek-content .number-list-item.indent-9 .visible-list-item{counter-increment:number-list-items-9}.note-peek-content .number-list-item.indent-0 .visible-list-item:before{content:counter(number-list-items-0) ". "}.note-peek-content .number-list-item.indent-1 .visible-list-item:before{content:counter(number-list-items-1,lower-alpha) ". "}.note-peek-content .number-list-item.indent-2 .visible-list-item:before{content:counter(number-list-items-2,lower-roman) ". "}.note-peek-content .number-list-item.indent-3 .visible-list-item:before{content:counter(number-list-items-3,upper-alpha) ". "}.note-peek-content .number-list-item.indent-4 .visible-list-item:before{content:counter(number-list-items-4,upper-roman) ". "}.note-peek-content .number-list-item.indent-5 .visible-list-item:before{content:counter(number-list-items-5) ". "}.note-peek-content .number-list-item.indent-6 .visible-list-item:before{content:counter(number-list-items-6,lower-alpha) ". "}.note-peek-content .number-list-item.indent-7 .visible-list-item:before{content:counter(number-list-items-7,lower-roman) ". "}.note-peek-content .number-list-item.indent-8 .visible-list-item:before{content:counter(number-list-items-8,upper-alpha) ". "}.note-peek-content .number-list-item.indent-9 .visible-list-item:before{content:counter(number-list-items-9,upper-roman) ". "}.note-peek-content .number-list-item .visible-list-item:before{text-align:right}.note-peek-content :not(.number-list-item)+.number-list-item,.note-peek-content .number-list-item:first-child{counter-reset:number-list-items-0 number-list-items-1 number-list-items-2 number-list-items-3 number-list-items-4 number-list-items-5 number-list-items-6 number-list-items-7 number-list-items-8 number-list-items-9}.note-peek-content .check-list-item,.note-peek-content li:has(input[type=checkbox]){align-items:center;background:var(--dashboard-color-bg-page);border-left:4px solid var(--dashboard-color-border);border-radius:4px;margin:0 0 6px;min-height:44px;position:relative}.note-peek-content ul:has(>li input[type=checkbox]){list-style:none;padding-left:0}.note-peek-content li:has(input[type=checkbox]){column-gap:7px;display:flex;padding:0 8px 0 10px}.note-peek-content li:has(input[type=checkbox])>p{align-items:center;column-gap:10px;display:grid;grid-template-columns:16px minmax(0,1fr);line-height:20px;margin:0;padding:10px 0;width:100%}.note-peek-content .check-list-item{display:block}.note-peek-content .check-list-item.indent-1{margin-left:20px}.note-peek-content .check-list-item.indent-2{margin-left:40px}.note-peek-content .check-list-item.indent-3{margin-left:60px}.note-peek-content .check-list-item.indent-4{margin-left:80px}.note-peek-content .check-list-item.indent-5{margin-left:100px}.note-peek-content .check-list-item.indent-6{margin-left:120px}.note-peek-content .check-list-item.indent-7{margin-left:140px}.note-peek-content .check-list-item.indent-8{margin-left:160px}.note-peek-content .check-list-item.indent-9{margin-left:180px}.note-peek-content .check-list-item.task-score-bucket-1{border-left-color:var(--dashboard-color-blue)}.note-peek-content .check-list-item.task-score-bucket-2{border-left-color:var(--dashboard-color-warning)}.note-peek-content .check-list-item.task-score-bucket-3{border-left-color:var(--dashboard-color-agenda-priority-urgent)}.note-peek-content .check-list-item>.row-wrapper{align-items:center;display:flex;min-height:44px;width:100%}.note-peek-content .check-list-item>.row-wrapper>.input-container{flex:0 0 16px;height:16px;margin:0 10px;position:relative}.note-peek-content .check-list-item>.row-wrapper>.input-container>input[type=checkbox]{height:16px;margin:0;opacity:0;position:absolute;width:16px}.note-peek-content .check-list-item>.row-wrapper>.input-container>.checkbox{border:2px solid var(--dashboard-color-text-muted);border-radius:2px;box-sizing:border-box;display:block;font-size:0;height:16px;position:relative;width:16px}.note-peek-content .check-list-item>.row-wrapper>.input-container>input[type=checkbox]:checked+.checkbox{background:var(--dashboard-color-success);border-color:var(--dashboard-color-success)}.note-peek-content .check-list-item>.row-wrapper>.input-container>input[type=checkbox]:checked+.checkbox:after{border:solid var(--dashboard-color-text-on-accent);border-width:0 2px 2px 0;content:"";height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg);width:4px}.note-peek-content .check-list-item>.row-wrapper>.content-container{flex:1;line-height:20px;min-width:0;padding:10px 0;word-break:break-word}.note-peek-content .check-list-item>.row-wrapper>.content-container p{margin:0}.note-peek-content .check-list-item>.row-wrapper>.expander,.note-peek-content .check-list-item>.row-wrapper>.inline-details,.note-peek-content .check-list-item>.row-wrapper>.task-expander-container,.note-peek-content .check-list-item>.row-wrapper>.widget-popup-container,.note-peek-content .check-list-item>.row-wrapper>.widgets-bar-container{display:none}.note-peek-content .check-list-item>.details-container{display:none}.note-peek-content .check-list-item:not(:has(>.row-wrapper)){column-gap:10px;display:grid;grid-template-columns:16px minmax(0,1fr);padding:0 8px 0 10px}.note-peek-content .check-list-item:not(:has(>.row-wrapper))>input[type=checkbox],.note-peek-content .check-list-item:not(:has(>.row-wrapper))>p>input[type=checkbox],.note-peek-content li:has(input[type=checkbox])>input[type=checkbox],.note-peek-content li:has(input[type=checkbox])>p>input[type=checkbox]{-webkit-appearance:none;appearance:none;background:#0000;border:2px solid var(--dashboard-color-text-muted);border-radius:2px;box-sizing:border-box;flex-shrink:0;grid-column:1;grid-row:1;height:16px;margin:0;pointer-events:none;position:relative;width:16px}.note-peek-content .check-list-item:not(:has(>.row-wrapper))>input[type=checkbox]:checked,.note-peek-content .check-list-item:not(:has(>.row-wrapper))>p>input[type=checkbox]:checked,.note-peek-content li:has(input[type=checkbox])>input[type=checkbox]:checked,.note-peek-content li:has(input[type=checkbox])>p>input[type=checkbox]:checked{background:var(--dashboard-color-success);border-color:var(--dashboard-color-success)}.note-peek-content .check-list-item:not(:has(>.row-wrapper))>input[type=checkbox]:checked:after,.note-peek-content .check-list-item:not(:has(>.row-wrapper))>p>input[type=checkbox]:checked:after,.note-peek-content li:has(input[type=checkbox])>input[type=checkbox]:checked:after,.note-peek-content li:has(input[type=checkbox])>p>input[type=checkbox]:checked:after{border:solid var(--dashboard-color-text-on-accent);border-width:0 2px 2px 0;content:"";height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg);width:4px}.note-peek-content .check-list-item:not(:has(>.row-wrapper))>.content-container,.note-peek-content .check-list-item:not(:has(>.row-wrapper))>p{flex:1;grid-column:2;grid-row:1;line-height:20px;margin:0;min-width:0;padding:10px 0;word-break:break-word}.note-peek-content .check-list-item:not(:has(>.row-wrapper))>.content-container p{margin:0}.note-peek-content .check-list-item.done,.note-peek-content .check-list-item[data-completedat],.note-peek-content .check-list-item[data-dismissedat]{opacity:.65}.note-peek-content .check-list-item.done>.content-container,.note-peek-content .check-list-item.done>p,.note-peek-content .check-list-item.done>.row-wrapper>.content-container,.note-peek-content .check-list-item[data-completedat]>.content-container,.note-peek-content .check-list-item[data-completedat]>p,.note-peek-content .check-list-item[data-completedat]>.row-wrapper>.content-container,.note-peek-content .check-list-item[data-dismissedat]>.content-container,.note-peek-content .check-list-item[data-dismissedat]>p,.note-peek-content .check-list-item[data-dismissedat]>.row-wrapper>.content-container{text-decoration:line-through}.note-peek-content>:last-child{margin-bottom:0}.widget-peak-hours .peak-hours-month-nav{align-items:center;display:inline-flex;gap:4px}.widget-peak-hours .peak-hours-month-nav-label{text-align:center;white-space:nowrap}.widget-peak-hours .peak-hours-month-nav-arrow{align-items:center;background:#0000;border:none;border-radius:6px;color:inherit;cursor:pointer;display:inline-flex;font-size:1.05em;justify-content:center;line-height:1;padding:4px 8px}.widget-peak-hours .peak-hours-month-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-peak-hours .peak-hours-month-nav-arrow:disabled{cursor:default;opacity:.3}.widget-peak-hours .peak-hours-metrics-grid{display:grid;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:16px}.widget-peak-hours .peak-hours-metric-card{background:var(--dashboard-color-bg-page);border-radius:10px;padding:12px 16px}.widget-peak-hours .peak-hours-metric-label{color:var(--dashboard-color-text-secondary);font-size:.8rem;margin-bottom:4px}.widget-peak-hours .peak-hours-metric-value{color:var(--dashboard-color-navy);font-size:1.25rem;font-weight:600}.widget-peak-hours .peak-hours-legend{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.75rem;gap:16px;margin-bottom:8px}.widget-peak-hours .peak-hours-legend-item{align-items:center;display:flex;gap:4px}.widget-peak-hours .peak-hours-legend-swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.widget-peak-hours .peak-hours-legend-swatch--created{background:var(--dashboard-color-blue)}.widget-peak-hours .peak-hours-legend-swatch--completed{background:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-chart-container{height:220px;position:relative;width:100%}.widget-peak-hours .peak-hours-canvas{display:block;height:100%;width:100%}.widget-peak-hours .peak-hours-tooltip{background:var(--dashboard-color-tooltip-bg);border:1px solid var(--dashboard-color-tooltip-border);border-radius:6px;box-shadow:0 2px 8px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;padding:8px 12px;pointer-events:none;position:absolute;white-space:nowrap;z-index:10}.widget-peak-hours .peak-hours-tooltip-header{font-weight:600;margin-bottom:4px}.widget-peak-hours .peak-hours-tooltip-label--created{color:var(--dashboard-color-tooltip-accent)}.widget-peak-hours .peak-hours-tooltip-label--completed{color:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-empty{padding:24px;text-align:center}.widget-peak-hours .peak-hours-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.vertical-1-cell .widget-peak-hours .peak-hours-metrics-grid{gap:8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-card{padding:4px 8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-label{font-size:.7rem;margin-bottom:0}.vertical-1-cell .widget-peak-hours .peak-hours-metric-value{font-size:1rem}.vertical-1-cell .widget-peak-hours .peak-hours-legend{margin-bottom:4px}.vertical-1-cell .widget-peak-hours .peak-hours-chart-container{height:160px}.horizontal-2-cell .widget-peak-hours .peak-hours-chart-container{height:220px}.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:380px}.horizontal-2-cell.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:440px}.widget-proposed-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-proposed-agenda a:hover{text-decoration:underline}.widget-proposed-agenda .proposed-agenda-controls{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding-bottom:10px}.widget-proposed-agenda .proposed-agenda-priority-label{color:var(--dashboard-color-text-muted);flex:0 0 auto;font-size:14px}.widget-proposed-agenda .proposed-agenda-priority-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1 1 auto;font-size:14px;font-weight:600;min-width:0;padding:7px 10px}.widget-proposed-agenda .proposed-agenda-model{border:1px solid var(--dashboard-color-border);border-radius:999px;color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.78em;padding:4px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-model-change{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:0 0 auto;font-size:.95em;padding:4px 8px}.widget-proposed-agenda .proposed-agenda-model-change:hover{color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-list{display:flex;flex-direction:column;font-size:14px;margin-top:4px}.widget-proposed-agenda .proposed-agenda-item{align-items:flex-start;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:10px;padding:10px 2px;transition:opacity .12s ease}.widget-proposed-agenda .proposed-agenda-item--scheduled{opacity:.6}.widget-proposed-agenda .proposed-agenda-time-col{display:flex;flex:0 0 auto;flex-direction:column;gap:2px;min-width:52px}.widget-proposed-agenda .proposed-agenda-time{color:var(--dashboard-color-link);font-variant-numeric:tabular-nums;font-weight:600}.widget-proposed-agenda .proposed-agenda-time--muted{color:var(--dashboard-color-text-secondary);font-weight:500}.widget-proposed-agenda .proposed-agenda-note-link{color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75em;text-decoration:none}.widget-proposed-agenda .proposed-agenda-note-link:hover{color:var(--dashboard-color-link);text-decoration:underline}.widget-proposed-agenda .proposed-agenda-content{display:flex;flex:1 1 auto;flex-direction:column;gap:3px;min-width:0}.widget-proposed-agenda .proposed-agenda-text{color:var(--dashboard-color-text);font-weight:600;overflow:hidden;text-overflow:ellipsis}.widget-proposed-agenda .proposed-agenda-reason{color:var(--dashboard-color-text-muted);font-size:12px;line-height:1.35}.widget-proposed-agenda .proposed-agenda-duration{color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.8em;padding-top:8px}.widget-proposed-agenda .proposed-agenda-actions{align-items:center;display:flex;flex:0 0 auto;gap:6px}.widget-proposed-agenda .proposed-agenda-add{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8em;padding:5px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-add:hover{border-color:var(--dashboard-color-link);color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-dismiss{background:#0000;border:2px rgba(0,0,0,0) solid;border-radius:50%;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:1em;line-height:1;padding:4px 6px}.widget-proposed-agenda .proposed-agenda-dismiss:hover{background-color:var(--dashboard-color-bg-warning);border-color:var(--dashboard-color-danger);color:var(--dashboard-color-danger)}.widget-proposed-agenda .proposed-agenda-scheduled-badge{color:var(--dashboard-color-text-secondary);flex:0 0 auto;font-size:.76em;padding:5px 10px;white-space:nowrap}.widget-proposed-agenda .proposed-agenda-footer{display:flex;gap:10px;margin-top:12px}.widget-proposed-agenda .proposed-agenda-approve{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;flex:1 1 auto;font-weight:600;padding:10px 18px;transition:opacity .12s ease}.widget-proposed-agenda .proposed-agenda-approve:hover:not(:disabled){border-color:var(--dashboard-color-link);color:var(--dashboard-color-link)}.widget-proposed-agenda .proposed-agenda-approve:disabled{cursor:default;opacity:.5}.widget-proposed-agenda .proposed-agenda-dismiss-all{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:0 0 auto;padding:10px 16px}.widget-proposed-agenda .proposed-agenda-dismiss-all:hover:not(:disabled){border-color:var(--dashboard-color-danger);color:var(--dashboard-color-danger)}.widget-proposed-agenda .proposed-agenda-dismiss-all:disabled{cursor:default;opacity:.5}.widget-proposed-agenda .proposed-agenda-pending{color:var(--dashboard-color-text-muted);font-size:.78em;margin:8px 0 0;text-align:center}.widget-proposed-agenda .proposed-agenda-attribution{color:var(--dashboard-color-text-muted);font-size:.75em;margin:4px 0 0;text-align:center}.widget-proposed-agenda .proposed-agenda-message,.widget-proposed-agenda .proposed-agenda-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:10px;padding:18px 12px;text-align:center}.widget-proposed-agenda .proposed-agenda-retry{background:#0000;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;padding:5px 14px}.widget-proposed-agenda .proposed-agenda-spinner{animation:proposed-agenda-spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-link);height:28px;width:28px}@keyframes proposed-agenda-spin{to{transform:rotate(360deg)}}.widget-quotes .widget-body{display:flex;flex-direction:column}.widget-quotes .quotes-grid{display:grid;flex:1;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-size:15px;font-style:italic;line-height:1.5;margin:0 0 8px}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-recent-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-recent-notes .note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-recent-notes .note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-recent-notes .note-link{align-items:center;background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;gap:8px;justify-content:space-between;padding:8px 12px;text-align:left;width:100%}.widget-recent-notes .note-name{color:var(--dashboard-color-text);flex:1;font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-recent-notes .note-count,.widget-recent-notes .note-metadata{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-recent-notes .note-loading,.widget-recent-notes .note-empty,.widget-recent-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-recent-notes .note-error{color:var(--dashboard-color-danger)}.widget-shared-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-shared-notes .shared-notes-toggle{align-items:center;cursor:pointer;display:inline-flex;font-size:13px;gap:4px}.widget-shared-notes .shared-notes-filter{align-items:center;display:flex;flex-shrink:0;gap:8px;margin-bottom:10px;padding:0 12px 4px}.widget-shared-notes .shared-notes-filter .shared-notes-toggle{margin-left:auto}.widget-shared-notes .shared-notes-sharer-select{background-color:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-size:13px;min-width:0;padding:2px 4px}.widget-shared-notes .shared-note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-shared-notes .shared-notes-pagination{align-items:center;display:flex;flex-shrink:0;gap:8px;justify-content:center;padding:4px 0 0}.widget-shared-notes .shared-notes-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:0 4px}.widget-shared-notes .shared-notes-page-arrow:disabled{cursor:default;opacity:.35}.widget-shared-notes .shared-notes-page-indicator{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-shared-notes .shared-note-item{align-items:stretch;display:flex}.widget-shared-notes .shared-note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-shared-notes .shared-note-pin{background:none;border:none;cursor:pointer;filter:grayscale(1);flex-shrink:0;font-size:.85rem;line-height:1;opacity:.4;padding:8px 0 8px 12px}.widget-shared-notes .shared-note-pin:hover{opacity:.75}.widget-shared-notes .shared-note-pin.shared-note-pin-active{filter:none;opacity:1}.widget-shared-notes .shared-note-link{background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;flex:1;flex-direction:column;gap:2px;min-width:0;padding:4px 12px 4px 8px;text-align:left}.widget-shared-notes .shared-note-title{color:var(--dashboard-color-text);font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-shared-notes .shared-note-meta{align-items:center;color:var(--dashboard-color-text);display:flex;font-size:12px;gap:8px}.widget-shared-notes .shared-note-avatars{align-items:center;display:inline-flex;flex-shrink:0}.widget-shared-notes .shared-note-avatars .collaborator-avatar{align-items:center;background-color:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-bg-card);border-radius:50%;box-sizing:border-box;display:inline-flex;font-size:11px;font-weight:600;height:1.25rem;justify-content:center;line-height:1;object-fit:cover;overflow:hidden;text-transform:uppercase;width:1.25rem}.widget-shared-notes .shared-note-avatars .collaborator-avatar:not(:first-child){margin-left:-.4rem}.widget-shared-notes .shared-note-avatars .collaborator-avatar-text{color:var(--dashboard-color-text-secondary)}.widget-shared-notes .shared-note-collaborators{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-shared-notes .shared-note-dates{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.7rem;gap:4px 8px;white-space:nowrap}.widget-shared-notes .shared-note-updated:before{color:var(--dashboard-color-text-muted);content:"\\b7"}.widget-shared-notes .note-loading,.widget-shared-notes .note-empty,.widget-shared-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-shared-notes .note-error{color:var(--dashboard-color-danger)}.dashboard-toolbar .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;gap:12px;padding:8px 12px}.dashboard-toolbar .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard-toolbar .task-domain-entry{white-space:nowrap}.dashboard-toolbar .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard-toolbar .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard-toolbar .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard-toolbar .task-domain-name{-webkit-user-select:none;user-select:none}.dashboard-toolbar .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:13px;line-height:1;padding:0}.dashboard-toolbar .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}.dashboard-toolbar .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard-toolbar .task-domains-refresh-icon{display:none}.dashboard-toolbar .task-domains-expand{align-items:center;background:var(--dashboard-color-blue-light);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-navy);cursor:pointer;display:none;font-size:.8rem;justify-content:center;min-width:34px;padding:4px 8px}.dashboard-toolbar .task-domains-expand:hover{background:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-toolbar .task-domains--empty .task-domains-empty{flex:1 1 100%;font-weight:500}@media (max-width: 800px){.dashboard-toolbar .task-domains{gap:4px}.dashboard-toolbar .task-domains-list{flex-wrap:wrap}.dashboard-toolbar .task-domains:not(.task-domains--expanded) .task-domain-item:not(.task-domain-item--mobile-visible){display:none}.dashboard-toolbar .task-domains-expand{display:inline-flex}.dashboard-toolbar .task-domains-refresh{font-size:.85rem;opacity:.55;padding:4px}.dashboard-toolbar .task-domains-refresh-label{display:none}.dashboard-toolbar .task-domains-refresh-icon{display:inline}}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains{gap:4px}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains-list{flex-wrap:wrap}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains:not(.task-domains--expanded) .task-domain-item:not(.task-domain-item--mobile-visible){display:none}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains-expand{display:inline-flex}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains-refresh{font-size:.85rem;opacity:.55;padding:4px}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains-refresh-label{display:none}.dashboard-large-phone-viewport .dashboard-toolbar .task-domains-refresh-icon{display:inline}.widget-memory-measurement{display:flex;flex-direction:column;gap:8px}.widget-memory-measurement .widget-memory-measurement-description,.widget-memory-measurement .widget-memory-measurement-note{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0}.widget-memory-measurement .widget-memory-measurement-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.widget-memory-measurement .widget-memory-measurement-select{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-size:.85rem;padding:8px}.widget-memory-measurement .widget-memory-measurement-actions{display:flex;gap:8px}.widget-memory-measurement .widget-memory-measurement-button{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:8px 12px}.widget-memory-measurement .widget-memory-measurement-button:disabled{cursor:default;opacity:.5}.widget-memory-measurement .widget-memory-measurement-results{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;flex-direction:column;font-size:.8rem;gap:4px;padding:12px}.widget-memory-measurement .widget-memory-measurement-status{color:var(--dashboard-color-text-secondary)}.widget-memory-measurement .widget-memory-measurement-widget{border-top:1px solid var(--dashboard-color-border);max-height:30vh;margin-top:8px;overflow-y:auto;padding-top:12px}.widget-memory-measurement .widget-memory-measurement-widget h4{color:var(--dashboard-color-navy);font-size:.85rem;margin:0 0 8px}.widget-victory-value .widget-body{display:flex;flex-direction:column;justify-content:space-between}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:12px}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:400}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.vertical-1-cell .widget-victory-value .vv-chart{height:180px}.horizontal-2-cell .widget-victory-value .vv-chart{height:260px}.vertical-2-cell .widget-victory-value .vv-chart{height:380px}.horizontal-2-cell.vertical-2-cell .widget-victory-value .vv-chart{height:460px}:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-bg-warning: #ffd7d7;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-link: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #90999f;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #e8853d;--dashboard-color-plan-created-bg: rgba(76, 175, 128, .08);--dashboard-color-plan-created-border: #4caf80}@media (prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-bg-warning: #6c3333;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-link: #60a5fa;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #ffb36b;--dashboard-color-plan-created-bg: rgba(115, 212, 163, .1);--dashboard-color-plan-created-border: #73d4a3}}@font-face{font-family:Roboto;font-style:normal;font-weight:100 900;font-display:swap;src:url(data:font/woff2;base64,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) format("woff2")}html{overflow-y:scroll}html *,html *:before,html *:after{box-sizing:border-box;margin:0;padding:0}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}html body button{font-family:inherit}.dashboard-outer-container{min-height:100vh;overflow-x:hidden;position:relative;width:100%}.dashboard-outer-container .dashboard-background-fade{inset:0;opacity:0;pointer-events:none;position:absolute;z-index:0}@media (prefers-reduced-motion: reduce){.dashboard-outer-container .dashboard-background-fade{animation:none!important}}.dashboard-outer-container .dashboard-content{margin:0 auto;max-width:1200px;padding:24px;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell{isolation:isolate;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell--focused{z-index:2}.dashboard-outer-container .dashboard-content .dashboard-grid-focus-backdrop{background:rgba(var(--dashboard-color-bg-page),.18);border:none;cursor:zoom-out;inset:0;position:fixed;z-index:2}.dashboard-outer-container .dashboard-content .dashboard-toolbar{transition:opacity .32s ease,transform .32s ease}.dashboard-outer-container .dashboard-content--widget-focused .dashboard-toolbar{opacity:0;pointer-events:none;transform:translateY(-16px)}.dashboard-outer-container .dashboard-content .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4,1fr);position:relative}.dashboard-outer-container .dashboard-content .grid-cell{--drag-scale: 1;--flip-x: 0px;--flip-y: 0px;--focus-blur: 0px;--focus-opacity: 1;--focus-scale-x: 1;--focus-scale-y: 1;--focus-x: 0px;--focus-y: 0px;--grid-cell-base-opacity: .95;filter:blur(var(--focus-blur));min-width:0;opacity:calc(var(--grid-cell-base-opacity)*var(--focus-opacity));position:relative;transform:translate(var(--flip-x),var(--flip-y)) translate(var(--focus-x),var(--focus-y)) scale(var(--drag-scale)) scale(var(--focus-scale-x),var(--focus-scale-y));transition:filter .32s ease,opacity .32s ease,transform .32s ease;will-change:transform}.dashboard-outer-container .dashboard-content .grid-cell:hover{--grid-cell-base-opacity: 1}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell{grid-column:span 2}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell{grid-column:span 3}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 4}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell{max-height:420px;min-height:320px}.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 2;max-height:800px;min-height:600px}.dashboard-outer-container .dashboard-content .grid-cell .grid-cell-surface{height:100%;width:100%}.dashboard-outer-container .dashboard-content .grid-cell .grid-cell-surface--focused{pointer-events:auto;position:fixed;z-index:5}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-active{cursor:grabbing}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--dragging-ready{animation:widget-wobble .35s ease-in-out infinite alternate;opacity:1;z-index:3}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-shift{--drag-scale: .985}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-mode{pointer-events:none}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focused{--grid-cell-base-opacity: 1;pointer-events:auto;z-index:4}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-overlay-host{filter:none;pointer-events:none;transform:none;transition:none;will-change:auto}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-hidden{z-index:1}@media (max-width: 800px){.dashboard-outer-container .dashboard-content{padding:12px}.dashboard-outer-container .dashboard-content .dashboard-grid{grid-template-columns:1fr}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 1}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell,.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 1;max-height:none;min-height:auto}}.dashboard-outer-container .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%;max-width:100%;overflow:hidden}.dashboard-outer-container .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard-outer-container .widget-heading-bar{-webkit-user-select:none;user-select:none}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--drag-ready{cursor:grabbing}.dashboard-outer-container .widget-icon{font-size:1rem}.dashboard-outer-container .widget-icon-button{background:rgba(var(--dashboard-color-bg-page),.6);border:1px solid rgba(0,0,0,0);border-radius:999px;cursor:pointer;line-height:1;padding:4px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.dashboard-outer-container .widget-icon-button:hover{background:rgba(var(--dashboard-color-blue),.12);border-color:rgba(var(--dashboard-color-blue),.28)}.dashboard-outer-container .widget-title{color:var(--dashboard-color-navy);display:flex;flex:1;font-size:.85rem;font-weight:700;gap:8px;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard-outer-container .widget-title__subtitle{color:var(--dashboard-color-text-muted);font-size:.75rem;font-weight:400;letter-spacing:.01em;text-transform:none}.dashboard-outer-container .widget-configure,.dashboard-outer-container .widget-header-action{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard-outer-container .widget-configure:hover,.dashboard-outer-container .widget-header-action:hover{color:var(--dashboard-color-navy)}.dashboard-outer-container .widget-body{flex:1;padding:16px}.dashboard-outer-container .dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center;width:100%}.dashboard-outer-container .dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}.dashboard-outer-container .dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-outer-container .dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}.dashboard-outer-container .widget-error-fallback{align-items:center;background:var(--dashboard-color-bg-card);border:1px dashed var(--dashboard-color-danger);border-radius:10px;display:flex;flex-direction:column;gap:8px;height:100%;justify-content:center;padding:24px;text-align:center}.dashboard-outer-container .widget-error-fallback-title{color:var(--dashboard-color-danger);font-size:.9rem;font-weight:700}.dashboard-outer-container .widget-error-fallback-message{color:var(--dashboard-color-text-muted);font-size:.8rem;max-width:280px;word-break:break-word}.dashboard-outer-container .widget-error-fallback-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;margin-top:4px;padding:4px 12px;transition:color .15s ease,border-color .15s ease}.dashboard-outer-container .widget-error-fallback-retry:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}.dashboard-outer-container .lazy-widget-placeholder{align-items:center;background:var(--dashboard-color-bg-card);border-radius:10px;display:flex;height:100%;justify-content:center;min-height:240px;opacity:.6;width:100%}.dashboard-outer-container .lazy-widget-placeholder .lazy-widget-placeholder-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;opacity:.7;width:32px}@keyframes dashboard-background-fade-in{0%{opacity:0}to{opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes widget-wobble{0%{transform:rotate(-1.5deg)}to{transform:rotate(1.5deg)}}
`;
 
// lib/util/sentry-loader.js
var MAX_QUEUED_SENTRY_EVENTS = 20;
var SENTRY_CDN_URL = "https://browser.sentry-cdn.com/8.55.0/bundle.min.js";
function buildSentryLoaderScripts({ dsn, environment }) {
if (!dsn)
return "";
return `
<!-- Embed-side Sentry, separate from the host app's, for visibility into exceptions inside the plugin iframe. -->
<script>
(function () {
window.__dashboardSentryQueue = [];
// Milestone record for the diagnostics the bundle cannot collect itself: everything here happens before the
// client bundle evaluates, and logIfEnabled's flag is not set until the init payload resolves later still. The
// bundle reads this snapshot (and subscribes via __dashboardSentryStatusChanged) once logging is switchable.
window.__dashboardSentryStatus = { environment: ${JSON.stringify(environment)}, state: "loading",
startedAt: Date.now(), cdnUrl: ${JSON.stringify(SENTRY_CDN_URL)} };
function setStatus(state, detail) {
var status = window.__dashboardSentryStatus;
status.state = state;
status.settledAt = Date.now();
status.elapsedMs = status.settledAt - status.startedAt;
if (detail) status.detail = detail;
if (typeof window.__dashboardSentryStatusChanged === "function") window.__dashboardSentryStatusChanged(status);
}
window.__dashboardSentryFailed = function (detail) { setStatus("cdn-failed", detail); };
function queueEvent(entry) {
if (!Array.isArray(window.__dashboardSentryQueue)) return;
if (window.__dashboardSentryQueue.length < ${MAX_QUEUED_SENTRY_EVENTS}) window.__dashboardSentryQueue.push(entry);
}
function sendEvent(entry) {
if (!window.Sentry || typeof window.Sentry.withScope !== "function") return;
window.Sentry.withScope(function (scope) {
var tags = entry.tags || {};
for (var tagName in tags) { if (tags[tagName] != null) scope.setTag(tagName, String(tags[tagName])); }
if (entry.level) scope.setLevel(entry.level);
if (entry.error) window.Sentry.captureException(entry.error);
else if (entry.message) window.Sentry.captureMessage(String(entry.message));
});
}
function reportEvent(errorLike, source) {
var error = errorLike instanceof Error ? errorLike : new Error(String(errorLike));
var entry = { error: error, tags: { "dashboard.source": source } };
if (window.__dashboardSentryReady === true) sendEvent(entry); else queueEvent(entry);
}
window.addEventListener("error", function (event) { reportEvent(event.error || event.message, "window-error"); });
window.addEventListener("unhandledrejection", function (event) { reportEvent(event.reason, "unhandledrejection"); });
window.__initDashboardSentry = function () {
if (!window.Sentry || typeof window.Sentry.init !== "function") {
console.error("[sentry] SDK loaded without an init(); dashboard exceptions will not be reported");
setStatus("sdk-without-init");
return;
}
try {
window.Sentry.init({ defaultIntegrations: false, dsn: ${JSON.stringify(dsn)}, environment: ${JSON.stringify(environment)}, integrations: [] });
} catch (initError) {
console.error("[sentry] init() threw; dashboard exceptions will not be reported", initError);
setStatus("init-threw", String(initError && initError.message || initError));
return;
}
window.__dashboardSentryReady = true;
setStatus("ready");
if (typeof window.__dashboardDrainSentryQueue === "function") { window.__dashboardDrainSentryQueue(); return; }
var queued = window.__dashboardSentryQueue || [];
window.__dashboardSentryQueue = null;
for (var index = 0; index < queued.length; index += 1) sendEvent(queued[index]);
};
})();
<\/script>
<script async crossorigin="anonymous" src="${SENTRY_CDN_URL}"
onload="window.__initDashboardSentry()"
onerror="console.error('[sentry] CDN SDK failed to load (404/CSP/network); dashboard exceptions will not be reported'); window.__dashboardSentryFailed('CDN script failed to load')"><\/script>`;
}
 
// lib/embed-html.js
var SENTRY_DSN = typeof process !== "undefined" && "https://b1dd823d244c16072367ab0370c32add@o8640.ingest.us.sentry.io/4511870555521024" || "";
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
<!-- autoCapturePageviews is disabled because location.href inside the embed is a junk data: URL. -->
<!-- data-api / endpoint must be pinned to the proxy path: the script otherwise auto-derives the event -->
<!-- endpoint as origin + /api/event, hitting amplenote.com's 404 page (no CORS headers) instead of the proxy. -->
<script defer data-domain="amplenote.com" data-api="https://www.amplenote.com/plausible-proxy/api/event" src="https://www.amplenote.com/plausible-proxy/js/script.js"><\/script>
<script>
window.plausible = window.plausible || function () { (window.plausible.q = window.plausible.q || []).push(arguments); };
window.plausible.init = window.plausible.init || function (options) { window.plausible.o = options || {}; };
window.plausible.init({ autoCapturePageviews: false, endpoint: "https://www.amplenote.com/plausible-proxy/api/event" });
<\/script>
<!-- [Claude claude-opus-4-8] Task: surface Plausible tracker load failures (otherwise events queue silently forever) -->
<script>
(function () {
var scriptEl = document.querySelector('script[src="https://www.amplenote.com/plausible-proxy/js/script.js"]');
if (!scriptEl) return;
scriptEl.addEventListener("error", function (event) {
console.error("[plausible] failed to load (404/CSP/network); Dashboard Action events will not be delivered", event);
});
})();
<\/script>${buildSentryLoaderScripts({ dsn: SENTRY_DSN, environment: "dashboard-embed" })}
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"><\/script>
</body>
</html>`;
}
 
// lib/plugin.js
var plugin = {
// --------------------------------------------------------------------------------------
// Constants
// --------------------------------------------------------------------------------------
constants: {},
// --------------------------------------------------------------------------------------
// App Options — Quick Open menu entries
// --------------------------------------------------------------------------------------
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
// --------------------------------------------------------------------------------------
// Embed Rendering
// --------------------------------------------------------------------------------------
async renderEmbed(app) {
console.debug("Rendering Dashboard plugin embed");
try {
return buildEmbedHTML();
} catch (error) {
console.error("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
// --------------------------------------------------------------------------------------
// Embed Communication Bridge
// --------------------------------------------------------------------------------------
// [Claude] Task: generic onEmbedCall — forwards all Amplenote API calls directly to app
// Prompt: "simplify onEmbedCall to generic pass-through, remove manual argument mapping"
// Date: 2026-03-16 | Model: claude-4.6-opus-high-thinking
/**
* Central message-passing bridge between the dashboard React embed and the
* Amplenote host app. Every method call on the `app` Proxy in the embed
* resolves here via `window.callAmplenotePlugin(method, ...args)`.
*
* Custom actions (configure, init) run plugin-specific logic. All other
* calls are forwarded directly to the Amplenote app interface — callers
* must pass arguments matching the real Amplenote API signatures.
*
* @param {object} app - Amplenote app interface
* @param {string} actionType - Method name or custom action identifier
* @param {...*} args - Positional arguments from the embed call
* @returns {Promise<*>} Resolves to the action result, or to an `{ embedCallFailed, error, errorAction, errorStack }`
* envelope on failure — never rejects, because mobile hosts do not reliably propagate a rejection to the embed.
*/
async onEmbedCall(app, actionType, ...args) {
try {
setLoggingEnabled(app.settings?.[SETTING_KEYS.CONSOLE_LOGGING]);
switch (actionType) {
case "attachNoteMedia":
const noteHandle = { uuid: app.context.noteUUID };
logIfEnabled(`[plugin] attachNoteMedia called \u2014 uploading to plugin note ${noteHandle.uuid}`);
const result = await app.attachNoteMedia(noteHandle, args[1]);
logIfEnabled(`[plugin] attachNoteMedia result:`, result ? "(URL received)" : "(no URL)");
return result;
case "configure":
return await this._handleConfigure(app, args[0]);
case "init":
return await fetchDashboardData(app);
default:
if (typeof app[actionType] === "function") {
return await app[actionType](...args);
}
logIfEnabled(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
logIfEnabled(`onEmbedCall error (${actionType}):`, error);
return {
embedCallFailed: true,
error: error?.message || String(error) || `onEmbedCall(${actionType}) failed`,
errorAction: actionType,
errorStack: error?.stack || null
};
}
},
// --------------------------------------------------------------------------------------
// Private Methods
// --------------------------------------------------------------------------------------
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(widgetConfigKey(widgetId), JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
return plugin;
})()